openclaw - 💡(How to fix) Fix [Feature]: Signal channel: add live tool-call progress (edit-free pattern) [4 comments, 2 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#77202Fetched 2026-05-05 05:51:12
View on GitHub
Comments
4
Participants
2
Timeline
5
Reactions
2
Timeline (top)
commented ×4labeled ×1

Add live tool-call progress visibility to the Signal channel using an edit-free send-and-delete pattern, closing the silence gap that affects all tool-heavy agent turns on Signal.

Error Message

The pipeline already accommodates channel-side injection: the Signal monitor builds replyOptions before dispatchInboundMessage and can substitute its own on* callbacks without any shared-code changes. The onBlockReplyQueued hook plus a finally block on dispatch covers all turn outcomes (success, error, no-reply turns). Progress messages are capped at 200 chars in the reference implementation. A channels.signal.toolProgress: "on" | "off" config knob is recommended to let users manage notification noise.

Root Cause

Full proposal document (TL;DR, root cause, complete reference implementation, edge cases, validation traces, idempotent reapply script): see attachment in Additional information.

Fix Action

Fix / Workaround

On Telegram, users see live tool-call progress during long agent turns (commands running, patches applied, plans updated) via edits to a single "Working…" preview message. On Signal, the same agent is silent until the final reply arrives — sometimes minutes later — with no indication it is alive or making progress.

  • Option A (channel-side opt-in): Add the pattern as a Signal extension feature gated behind channels.signal.toolProgress: "on". Self-contained; no shared pipeline changes. A deleteMessageSignal helper (wrapping signalRpcRequest("remoteDelete", ...)) plus six replyOptions callbacks injected in the Signal monitor's runDispatch are the only new surfaces. Shippable in days.

Affected: All Signal channel users who trigger tool-heavy agent turns (coding sessions, multi-step research, anything using bash/browser/patch tools) Severity: High for affected workflows — the agent appears unresponsive for the full duration of long turns Frequency: Every turn that involves tool calls on Signal Consequence: Users lose trust in the agent, migrate to Telegram for real work, or stop using tool-heavy tasks entirely — directly undermining OpenClaw's "your AI in the app you use" value proposition for privacy-focused users who chose Signal

Code Example

const previewToolProgressEnabled = Boolean(draftStream) &&
  resolveChannelStreamingPreviewToolProgress(account.config);
RAW_BUFFERClick to expand / collapse

Summary

Add live tool-call progress visibility to the Signal channel using an edit-free send-and-delete pattern, closing the silence gap that affects all tool-heavy agent turns on Signal.

Problem to solve

On Telegram, users see live tool-call progress during long agent turns (commands running, patches applied, plans updated) via edits to a single "Working…" preview message. On Signal, the same agent is silent until the final reply arrives — sometimes minutes later — with no indication it is alive or making progress.

The gap is structural. previewToolProgressEnabled in pipeline.runtime is gated on two conjuncts:

const previewToolProgressEnabled = Boolean(draftStream) &&
  resolveChannelStreamingPreviewToolProgress(account.config);

The config flag is not the problem. The problem is draftStream: it requires an editable-message primitive that Signal's protocol does not have. signal-cli exposes no edit RPC. The gate short-circuits to false for Signal in every case, making the entire pushPreviewToolProgress code path a no-op. This is a protocol-level constraint, not an extension oversight.

Proposed solution

An edit-free progress pattern that delivers the same user-facing value without requiring a message-edit API:

  1. Send each progress event as its own Signal message.
  2. Capture the timestamp returned by signal-cli's send RPC.
  3. When the real reply is queued (onBlockReplyQueued), bulk-delete all tracked messages via signal-cli's remoteDelete JSON-RPC method.

For the user, progress appears during the turn and scaffolding disappears when the reply lands — approaching Telegram's visual effect. The trade-off is multiple notifications instead of in-place edits, but that is acceptable compared to total silence.

Two implementation paths:

  • Option A (channel-side opt-in): Add the pattern as a Signal extension feature gated behind channels.signal.toolProgress: "on". Self-contained; no shared pipeline changes. A deleteMessageSignal helper (wrapping signalRpcRequest("remoteDelete", ...)) plus six replyOptions callbacks injected in the Signal monitor's runDispatch are the only new surfaces. Shippable in days.

  • Option B (pipeline abstraction): Refactor draftStream to support an "edit mode" (current) and a "tombstone mode" (send + bulk-delete). Channels declare supportsMessageEdit: boolean; the pipeline picks the right implementation. More invasive but benefits any future edit-free protocol (SMS gateways, Matrix without edits). Quarter-scale effort.

A working implementation has been validated against signal-cli's remoteDelete JSON-RPC method and OpenClaw 2026.5.2. Full proposal with reference implementation available (see Additional information).

Alternatives considered

  • Enable blockStreaming on Signal: Setting channels.signal.blockStreaming = true fixes assistant-text streaming (final reply arrives in chunks) but does not address tool-call visibility — the draftStream gate is upstream of streaming chunking.
  • Suppress the gap silently: The current behavior. Unacceptable for tool-heavy workflows; makes the agent feel broken or stuck.

Impact

Affected: All Signal channel users who trigger tool-heavy agent turns (coding sessions, multi-step research, anything using bash/browser/patch tools) Severity: High for affected workflows — the agent appears unresponsive for the full duration of long turns Frequency: Every turn that involves tool calls on Signal Consequence: Users lose trust in the agent, migrate to Telegram for real work, or stop using tool-heavy tasks entirely — directly undermining OpenClaw's "your AI in the app you use" value proposition for privacy-focused users who chose Signal

<img width="450" height="505" alt="Image" src="https://github.com/user-attachments/assets/ebdc2416-f095-4f01-8e2d-664dfb511e97" />

Evidence/examples

Validated against: OpenClaw 2026.5.2 (8b2a6e5), signal-cli installed at /usr/local/bin/signal-cli. Bundle files patched: send-CfzfoBbG.js, monitor-BYoaNI4k.js. Gateway started clean with no load errors post-patch.

Full proposal document (TL;DR, root cause, complete reference implementation, edge cases, validation traces, idempotent reapply script): see attachment in Additional information.

<img width="396" height="273" alt="Image" src="https://github.com/user-attachments/assets/00dc25df-3908-40be-ac27-02b3c1734652" /> <img width="468" height="467" alt="Image" src="https://github.com/user-attachments/assets/22d1cfa7-f51f-4c86-8009-503677bd5dba" />

Additional information

The pipeline already accommodates channel-side injection: the Signal monitor builds replyOptions before dispatchInboundMessage and can substitute its own on* callbacks without any shared-code changes. The onBlockReplyQueued hook plus a finally block on dispatch covers all turn outcomes (success, error, no-reply turns). Progress messages are capped at 200 chars in the reference implementation. A channels.signal.toolProgress: "on" | "off" config knob is recommended to let users manage notification noise.

Full proposal with reference implementation, edge-case analysis, and idempotent patch script available on request (authored from a working production patch against OpenClaw 2026.5.2).

openclaw_signal_tool_progress_proposal.docx

Signal Show Tool Calling Custom Patch.zip

extent analysis

TL;DR

Implement an edit-free progress pattern by sending each progress event as a separate Signal message and bulk-deleting them when the final reply is queued.

Guidance

  • Identify the implementation path: Choose between Option A (channel-side opt-in), which adds the pattern as a Signal extension feature, or Option B (pipeline abstraction), which refactors draftStream to support an "edit mode" and a "tombstone mode".
  • Implement the deleteMessageSignal helper function to wrap signalRpcRequest("remoteDelete", ...).
  • Inject replyOptions callbacks in the Signal monitor's runDispatch to track progress messages and delete them when the final reply is queued.
  • Consider adding a channels.signal.toolProgress: "on" | "off" config knob to let users manage notification noise.

Example

// Example deleteMessageSignal helper function
function deleteMessageSignal(messageId) {
  return signalRpcRequest("remoteDelete", { message_id: messageId });
}

Notes

The proposed solution has been validated against signal-cli's remoteDelete JSON-RPC method and OpenClaw 2026.5.2. However, the implementation details may vary depending on the chosen implementation path.

Recommendation

Apply the workaround by implementing the edit-free progress pattern, as it provides a viable solution to the problem of live tool-call progress visibility on Signal. This approach allows for a more responsive user experience, even if it requires multiple notifications instead of in-place edits.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

openclaw - 💡(How to fix) Fix [Feature]: Signal channel: add live tool-call progress (edit-free pattern) [4 comments, 2 participants]