Skip to content

feat(cli): emit commentary progress events from Claude CLI parser#89834

Merged
obviyus merged 8 commits into
openclaw:mainfrom
anagnorisis2peripeteia:feat/claude-cli-commentary-progress
Jun 8, 2026
Merged

feat(cli): emit commentary progress events from Claude CLI parser#89834
obviyus merged 8 commits into
openclaw:mainfrom
anagnorisis2peripeteia:feat/claude-cli-commentary-progress

Conversation

@anagnorisis2peripeteia

@anagnorisis2peripeteia anagnorisis2peripeteia commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Summary

This is the claude-cli parser producer for inter-tool commentary — the first producer on the CLI-runtime dispatch path served by the delivery bridge in #90883.

The claude-cli streaming parser (cli-output.ts) accumulates assistant text. When that text precedes a tool call (the model's "Let me check X…" / "now reading Y…" narration), it is now emitted as a stream:"item", kind:"preamble" commentary event so the channel can render it as live progress.

Key details:

  • Emit only the new segmentassistantText.slice(lastFlushedCommentaryLength).trim() — not the full cumulative blob, so each inter-tool narration appears once (covered by a text→tool→text→tool regression test).
  • Backend output transforms applied to the commentary text before emit (applyPluginTextReplacements), so it matches the rest of the rendered output.

How it fits with #90883

This is the producer; #90883 is the delivery bridge (the missing subscriber in the shared CLI-runtime dispatch) and the channel render hook is already on main. The full path is:

claude-cli parser (this PR) → item/preamble event → delivery bridge (#90883) → pushCommentaryProgress render

Neither half is user-visible alone: a producer with no subscriber is dropped on the bus; a subscriber with no producer has nothing to deliver. Together they restore claude-cli inter-tool commentary in channel progress.

Stacking: this branch is currently rebased on #90883, so its diff includes the bridge commit; once #90883 merges, this reduces to the parser emission. Merge #90883 first.

Tests

  • cli-output.test.ts — 30 passing, including the text→tool→text→tool regression that pins the "new segment only" behavior
  • tsgo clean

Proof (combined stack: this producer + #90883 bridge)

Captured via a local recreation of the Mantis (telegram-desktop-proof) flow on crabbox — Telegram Desktop + user-driver + screen capture, run against this + #90883 on upstream/main. Commentary is transient (no persist), so the proof is the during-turn recording.

The live progress draft renders the inter-tool commentary (claude-cli's "I'll read each file and summarize it." appearing as live progress before the tool calls):

claude-cli inter-tool commentary in the live Telegram progress draft

Animated (progress draft building → final answer): motion capture

The observed draft text:

Tidepooling
I'll read each file and summarize it.

i.e. claude-cli commentary now appears in the channel progress draft (this producer → #90883 bridge → render), instead of being dropped.

Issues

Closes #87326 (with the #90883 delivery bridge).
Related: #84486.

Real behavior proof

Behavior addressed: Claude CLI pre-tool commentary is emitted as progress when commentary progress is enabled, without leaking into the final assistant stream when commentary is disabled.
Real environment tested: Local OpenClaw CLI runner invoking the installed Claude Code CLI.
Exact steps or command run after this patch: Ran the real Claude CLI directly with stream-json output, then invoked the OpenClaw CLI runner with a Claude tool-use prompt in commentary-enabled and commentary-disabled modes.
Evidence after fix: With commentary enabled, OpenClaw emitted a preamble item, tool start, tool result, then final assistant answer. With commentary disabled, the pre-tool text was classified and suppressed; OpenClaw emitted only tool start, tool result, then final assistant answer.
Observed result after fix: Claude commentary is wired through the shared progress path, and queued followups forward commentary even when verbose tool progress is off.
What was not tested: A fresh native Telegram Desktop recording after the final landing fixes; the existing rendered proof covers the same producer/bridge path, and the final code was verified through the real Claude CLI runner plus focused regression tests.

@openclaw-barnacle openclaw-barnacle Bot added agents Agent runtime and tooling size: S triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 3, 2026
@clawsweeper

clawsweeper Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 8, 2026, 10:36 AM ET / 14:36 UTC.

Summary
Adds Claude CLI stream-json commentary classification and emission, then gates Telegram and Discord progress-mode rendering through the existing channel progress callbacks.

PR surface: Source +123, Tests +311. Total +434 across 13 files.

Reproducibility: yes. by source inspection: current main has the commentary bridge but no Claude CLI producer, while the PR proof shows the new producer's visible Telegram progress behavior; I did not run a local live reproduction in this read-only review.

Review metrics: 1 noteworthy metric.

  • Progress-routing gates: 1 reply option plus 2 CLI run flags added. These gates decide when Claude text is diverted from answer deltas into transient progress, so maintainers should review the message-delivery semantics before merge.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster ✨ media proof bonus
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • Run the focused parser and auto-reply dispatch tests on the final rebased head.
  • Confirm the Telegram-visible proof still shows commentary once and preserves later tool-progress behavior.

Mantis proof suggestion
A fresh Mantis run would give maintainer-owned Telegram Desktop proof for the exact final merge head and the one-render/no-duplication behavior. A maintainer can ask Mantis to capture proof by posting a new PR comment that starts with the OpenClaw Mantis account mention, followed by:

telegram desktop proof: verify Claude CLI pre-tool commentary appears once in Telegram progress mode and does not duplicate in the answer lane.

Risk before merge

Maintainer options:

  1. Merge after focused message-flow validation (recommended)
    Run the focused parser and auto-reply dispatch tests on the final head and confirm the Telegram-visible progress proof still shows Claude commentary once without answer-lane duplication.
  2. Pause for Telegram interleave sequencing
    Pause only if maintainers want Telegram: inter-tool commentary clobbers tool progress in non-persist progress mode (diverges from other streaming channels) #90962 resolved before adding another Claude commentary producer to Telegram progress mode.

Next step before merge

  • No automated repair is queued; the remaining work is maintainer merge review and final-head message-flow proof for the Claude commentary producer semantics.

Security
Cleared: The diff changes TypeScript parser, runner, and channel callback wiring only; it does not add dependencies, workflows, package scripts, secret handling, or supply-chain execution paths.

Review details

Best possible solution:

Land this as the producer-side complement to the already-merged bridge after focused final-head parser and channel-progress validation, while keeping #90962 as the separate Telegram interleave follow-up.

Do we have a high-confidence way to reproduce the issue?

Yes, by source inspection: current main has the commentary bridge but no Claude CLI producer, while the PR proof shows the new producer's visible Telegram progress behavior; I did not run a local live reproduction in this read-only review.

Is this the best way to solve the issue?

Yes, the existing item/preamble progress callback is the right owner boundary, and diverting classified pre-tool text before channel rendering avoids the double-render risk that would come from copying the same text into both answer and progress lanes.

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 355a9cbf354c.

Label changes

Label justifications:

  • P2: This is a normal-priority user-visible channel progress improvement with limited blast radius to Claude CLI progress commentary paths.
  • merge-risk: 🚨 message-delivery: The branch changes whether Claude pre-tool text is delivered as answer partials or transient commentary, which can affect visible ordering, duplication, or suppression in Telegram and Discord progress mode.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (recording): The PR supplies after-fix Telegram Desktop proof showing Claude CLI commentary visible in the transient progress draft, which directly demonstrates the changed user-visible behavior.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR supplies after-fix Telegram Desktop proof showing Claude CLI commentary visible in the transient progress draft, which directly demonstrates the changed user-visible behavior.
  • proof: 🎥 video: Contributor real behavior proof includes video or recording evidence. The PR supplies after-fix Telegram Desktop proof showing Claude CLI commentary visible in the transient progress draft, which directly demonstrates the changed user-visible behavior.
  • mantis: telegram-visible-proof: Mantis should capture Telegram visible proof. The PR changes user-visible Telegram progress draft text, so Telegram Desktop proof is the right evidence lane and the supplied proof addresses it.
Evidence reviewed

PR surface:

Source +123, Tests +311. Total +434 across 13 files.

View PR surface stats
Area Files Added Removed Net
Source 10 155 32 +123
Tests 3 406 95 +311
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 13 561 127 +434

Acceptance criteria:

  • [P1] node scripts/run-vitest.mjs src/agents/cli-output.test.ts src/auto-reply/reply/agent-runner-execution.test.ts src/auto-reply/reply/followup-runner.test.ts.
  • [P1] node scripts/run-vitest.mjs extensions/telegram/src/bot-message-dispatch.test.ts extensions/discord/src/monitor/message-handler.process.test.ts.
  • [P1] Telegram Desktop proof for Claude CLI progress commentary on the final merge head.

What I checked:

  • Current main lacks the Claude commentary producer: The current CLI JSONL streaming parser exposes assistant/tool callbacks but no commentary classification or onCommentaryText callback, so fix(cli): bridge inter-tool commentary events to channel progress #90883's bridge has no Claude CLI producer to consume on main. (src/agents/cli-output.ts:629, 355a9cbf354c)
  • Shared commentary bridge is already on main: The merged bridge path now accepts onCommentaryText and forwards CLI item/preamble commentary into the channel progress callback path, so the earlier landing-order blocker is resolved. (src/auto-reply/reply/agent-runner-cli-dispatch.ts:224, 2858c629bd0f)
  • PR adds producer-side classification: The PR head adds classifyCommentaryText/onCommentaryText buffering so Claude text before tool-use can be diverted to commentary instead of answer deltas, while non-tool text still flushes as assistant output. (src/agents/cli-output.ts:635, f2f2b663d796)
  • PR emits commentary as item/preamble events: The PR head emits transformed Claude commentary through the CLI runner as stream=item, kind=preamble events, matching the already-merged bridge's expected event family. (src/agents/cli-runner/execute.ts:497, f2f2b663d796)
  • Channel gating matches documented progress commentary: Telegram and Discord docs describe streaming.progress.commentary as an opt-in for assistant commentary/preamble in temporary progress drafts, and the PR only enables the new producer when progress commentary is enabled for those channels. Public docs: docs/channels/telegram.md. (docs/channels/telegram.md:318, 355a9cbf354c)
  • Real behavior proof is visible and relevant: The PR body includes Telegram Desktop proof showing Claude CLI commentary rendered in the transient progress draft, which directly demonstrates the user-visible behavior this branch adds when combined with the now-merged bridge. (f2f2b663d796)

Likely related people:

  • anagnorisis2peripeteia: Authored the merged fix(cli): bridge inter-tool commentary events to channel progress #90883 bridge work that current main uses for CLI commentary delivery, so they are tied to the commentary event path beyond only opening this PR. (role: feature-history contributor; confidence: high; commits: d7b9b21fb80a; files: src/auto-reply/reply/agent-runner-cli-dispatch.ts, src/auto-reply/reply/agent-runner-execution.ts, src/auto-reply/reply/followup-runner.ts)
  • obviyus: Merged the shared commentary bridge and authored/reworked commits on the producer branch that suppress duplicate answer partials, making them a likely reviewer for the final semantics. (role: recent area contributor and merger; confidence: medium; commits: 2858c629bd0f, f2f2b663d796; files: src/agents/cli-output.ts, src/auto-reply/reply/agent-runner-cli-dispatch.ts, extensions/telegram/src/bot-message-dispatch.ts)
  • brokemac79: Recent blame/history on the CLI parser and Telegram streaming surfaces points to broad adjacent maintenance, though the trail is less specific than the commentary PR history. (role: adjacent recent contributor; confidence: low; commits: 3b6bcbfb504; files: src/agents/cli-output.ts, extensions/telegram/src/bot-message-dispatch.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. mantis: telegram-visible-proof Mantis should capture Telegram visible proof. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. labels Jun 3, 2026
@anagnorisis2peripeteia

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@anagnorisis2peripeteia anagnorisis2peripeteia force-pushed the feat/claude-cli-commentary-progress branch from 8e50f36 to 46763ed Compare June 6, 2026 08:40
@anagnorisis2peripeteia anagnorisis2peripeteia marked this pull request as ready for review June 6, 2026 08:51
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 🎥 video Contributor real behavior proof includes video or recording evidence. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 6, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. label Jun 6, 2026
@anagnorisis2peripeteia anagnorisis2peripeteia force-pushed the feat/claude-cli-commentary-progress branch from 46763ed to 424db57 Compare June 6, 2026 11:51
@openclaw-barnacle openclaw-barnacle Bot added triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. labels Jun 6, 2026
@anagnorisis2peripeteia

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@anagnorisis2peripeteia

Copy link
Copy Markdown
Contributor Author

Heads-up: possible double-render once this rebases onto #88682 (now merged)

#88682 ("Preserve Telegram streamed text blocks between tool calls") preserves answer-lane blocks across tool-call boundaries instead of letting a later block overwrite the draft. That interacts with the producer here.

Right now the pre-tool flush is additive: on a tool_use content_block_start, the accumulated segment is emitted via onCommentaryText, but the same text has already streamed through onAssistantDelta (and keeps doing so). The test makes this explicit:

expect(commentaryTexts).toEqual(["Let me check that for you."]);
// Assistant deltas should still have been emitted normally
expect(deltas).toHaveLength(2);
expect(deltas[1]?.text).toBe("Let me check that for you.");

Pre-#88682 this was harmless: the answer-lane copy of the pre-tool text was overwritten/reset at the tool boundary, so only the commentary copy survived. #88682 stops discarding answer-lane blocks — so after a rebase the same inter-tool text could render twice: once preserved in the answer lane (by #88682) and once in the commentary/progress lane (via this producer).

Suggested change (for the #88682 rebase): make the producer divert rather than copy — withhold the pre-tool segment from onAssistantDelta and emit it only as commentary, so the answer lane never receives it and #88682 has nothing to preserve. That likely means buffering assistant deltas and deciding at the tool_use/turn boundary whether a segment is commentary (a tool follows) or final answer (none does). The "assistant deltas should still have been emitted normally" expectation would invert for the pre-tool case.

Flagging as a suggestion, not a blocker — and open to the dedup living either in the producer (divert here) or on the answer-lane/compositor side. Happy to hold for a steer on the preferred shape.

@obviyus obviyus force-pushed the feat/claude-cli-commentary-progress branch from 424db57 to f2f2b66 Compare June 8, 2026 14:25
@openclaw-barnacle openclaw-barnacle Bot added channel: discord Channel integration: discord channel: telegram Channel integration: telegram size: L and removed size: M triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 8, 2026
@obviyus

obviyus commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Manual proof after the latest push:

  • Direct Claude CLI stream-json auth works.
  • OpenClaw CLI runner invoked the real Claude CLI with a tool-use prompt.
  • With commentary enabled: emitted preamble item -> tool start/result -> final assistant answer.
  • With commentary disabled: pre-tool text was classified/dropped and did not leak; emitted only tool start/result -> final assistant answer.

Also re-ran focused parser/runner/channel tests and autoreview; no actionable findings.

anagnorisis2peripeteia and others added 8 commits June 8, 2026 21:05
Commentary lines carry noCompact so the progress-draft renderer does not compact
them like tool lines — assistant prose renders in full, spilling to a new message
at the channel limit rather than truncating mid-sentence.
Detect text accumulated before tool_use blocks in the Claude CLI
streaming parser and emit it as commentary via a new onCommentaryText
callback. This enables the same commentary progress display that the
Codex backend already provides through preamble item events.

- Add onCommentaryText optional callback to createCliJsonlStreamingParser
- Flush accumulated assistantText as commentary when content_block_start
  with tool_use type is encountered
- Track last flushed position to avoid duplicate emissions on consecutive
  tool_use blocks without intervening text
- Wire the callback in both execute.ts (regular CLI spawn + live session)
  and claude-live-session.ts, emitting AgentItemEventData with
  kind=preamble and progressText
- Add 3 test cases covering: text before tool_use, empty text before
  tool_use, and consecutive tool_use dedup
@obviyus obviyus force-pushed the feat/claude-cli-commentary-progress branch from f2f2b66 to f876e1c Compare June 8, 2026 15:37
@openclaw-barnacle openclaw-barnacle Bot added triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. proof: supplied External PR includes structured after-fix real behavior proof. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 8, 2026
@obviyus obviyus merged commit 7a602c7 into openclaw:main Jun 8, 2026
184 of 191 checks passed
@obviyus

obviyus commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

Landed via rebase onto main.

  • Scoped tests: node scripts/run-tsgo.mjs -p tsconfig.core.json --incremental false; node scripts/run-vitest.mjs src/agents/cli-output.test.ts src/agents/cli-runner/execute.supervisor-capture.test.ts src/agents/cli-runner.spawn.test.ts src/auto-reply/reply/agent-runner-execution.test.ts src/auto-reply/reply/followup-runner.test.ts extensions/telegram/src/bot-message-dispatch.test.ts extensions/discord/src/monitor/message-handler.process.test.ts; node scripts/check-extension-package-tsc-boundary.mjs --mode=compile; .agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main
  • Manual proof: real Claude Code CLI stream-json run, then OpenClaw CLI runner with commentary enabled/disabled. Enabled emitted preamble -> tool start/result -> final answer; disabled suppressed pre-tool text and emitted tool start/result -> final answer.
  • Changelog: not updated; release-note context is in the PR body.
  • Land commits: 66c9feb41d, 7a602c7385
  • Merge commit: 7a602c7385

Thanks @anagnorisis2peripeteia!

eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Jun 12, 2026
…26.6.6) (#1040)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/openclaw/openclaw](https://openclaw.ai) ([source](https://github.com/openclaw/openclaw)) | patch | `2026.6.5` → `2026.6.6` |

---

### Release Notes

<details>
<summary>openclaw/openclaw (ghcr.io/openclaw/openclaw)</summary>

### [`v2026.6.6`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#202666)

[Compare Source](openclaw/openclaw@v2026.6.5...v2026.6.6)

##### Highlights

- Security boundaries are substantially tighter across transcripts, sandbox binds, host environment inheritance, MCP stdio, Codex HTTP access, native search policy, elevated sender checks, deleted-agent ACP bypasses, loopback tools, Discord moderation, and Teams group actions; exec approvals now fail closed on timeout. ([#&#8203;91529](openclaw/openclaw#91529), [#&#8203;91618](openclaw/openclaw#91618), [#&#8203;91615](openclaw/openclaw#91615), [#&#8203;91619](openclaw/openclaw#91619), [#&#8203;91741](openclaw/openclaw#91741), [#&#8203;91745](openclaw/openclaw#91745), [#&#8203;91746](openclaw/openclaw#91746), [#&#8203;91748](openclaw/openclaw#91748), [#&#8203;91749](openclaw/openclaw#91749), [#&#8203;91750](openclaw/openclaw#91750), [#&#8203;91751](openclaw/openclaw#91751), [#&#8203;91752](openclaw/openclaw#91752), [#&#8203;91763](openclaw/openclaw#91763), [#&#8203;89938](openclaw/openclaw#89938)) Thanks [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;pgondhi987](https://github.com/pgondhi987), [@&#8203;mmaps](https://github.com/mmaps), [@&#8203;eleqtrizit](https://github.com/eleqtrizit), [@&#8203;shakkernerd](https://github.com/shakkernerd), and [@&#8203;drobison00](https://github.com/drobison00).
- Telegram delivery is safer and more coherent: account-scoped topics route to the right agent, streamed text survives tool calls, `/compact` works on generic ingress, callback handling uses concrete APIs, draft chunking is shared, durable dispatch dedupe moved into the SDK, and unauthorized DM text stays out of cache and prompt context. ([#&#8203;91189](openclaw/openclaw#91189), [#&#8203;88682](openclaw/openclaw#88682), [#&#8203;89588](openclaw/openclaw#89588), [#&#8203;90212](openclaw/openclaw#90212), [#&#8203;91876](openclaw/openclaw#91876), [#&#8203;91874](openclaw/openclaw#91874), [#&#8203;91904](openclaw/openclaw#91904), [#&#8203;91478](openclaw/openclaw#91478), [#&#8203;91915](openclaw/openclaw#91915)) Thanks [@&#8203;codysai001](https://github.com/codysai001), [@&#8203;alexzhu0](https://github.com/alexzhu0), [@&#8203;joelnishanth](https://github.com/joelnishanth), [@&#8203;snowzlm](https://github.com/snowzlm), [@&#8203;obviyus](https://github.com/obviyus), and [@&#8203;sallyom](https://github.com/sallyom).
- iMessage recovery and delivery now cover always-on inbound restart, durable echo markers, block streaming, idle approval discovery, hardened outbound transport, and actionable inbound startup diagnostics. ([#&#8203;91335](openclaw/openclaw#91335), [#&#8203;91449](openclaw/openclaw#91449), [#&#8203;88969](openclaw/openclaw#88969), [#&#8203;88530](openclaw/openclaw#88530), [#&#8203;91783](openclaw/openclaw#91783), [#&#8203;91785](openclaw/openclaw#91785)) Thanks [@&#8203;omarshahine](https://github.com/omarshahine), [@&#8203;jmissig](https://github.com/jmissig), and [@&#8203;colmbrogan](https://github.com/colmbrogan).
- Browser and MCP connectivity gained existing-session CDP support, discovered WebSocket validation, default-profile `cdpUrl` handling, safer browser-output boundaries, Streamable HTTP loopback transport, corrected OAuth/SSE authorization handling, and broader schema compatibility. ([#&#8203;91422](openclaw/openclaw#91422), [#&#8203;89851](openclaw/openclaw#89851), [#&#8203;91736](openclaw/openclaw#91736), [#&#8203;91747](openclaw/openclaw#91747), [#&#8203;91451](openclaw/openclaw#91451), [#&#8203;80143](openclaw/openclaw#80143)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987), [@&#8203;anagnorisis2peripeteia](https://github.com/anagnorisis2peripeteia), [@&#8203;lifuyue](https://github.com/lifuyue), [@&#8203;eleqtrizit](https://github.com/eleqtrizit), [@&#8203;LiuwqGit](https://github.com/LiuwqGit), and [@&#8203;HemantSudarshan](https://github.com/HemantSudarshan).
- Control UI startup and first-reply latency are lower through cached model metadata, removal of the startup catalog wait, lazy slash-command loading, and first-event tracing with slow-reply diagnostics. ([#&#8203;91531](openclaw/openclaw#91531), [#&#8203;91538](openclaw/openclaw#91538), [#&#8203;91568](openclaw/openclaw#91568), [#&#8203;91583](openclaw/openclaw#91583), [#&#8203;91598](openclaw/openclaw#91598))
- Provider support expands with OpenRouter OAuth onboarding and Claude Fable 5 adaptive thinking, while Codex sessions keep correct compaction ownership, local models skip guardian review, dynamic tool progress normalizes cleanly, and Gemma 4 reasoning replay is preserved. ([#&#8203;91830](openclaw/openclaw#91830), [#&#8203;91882](openclaw/openclaw#91882), [#&#8203;91590](openclaw/openclaw#91590), [#&#8203;88630](openclaw/openclaw#88630), [#&#8203;88768](openclaw/openclaw#88768), [#&#8203;91696](openclaw/openclaw#91696)) Thanks [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen), [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;bdjben](https://github.com/bdjben), and [@&#8203;Coder-Wangyankun](https://github.com/Coder-Wangyankun).

##### Changes

- CLI progress: emit Claude CLI commentary progress events and bridge inter-tool commentary into channel progress without exposing internal protocol scaffolding. ([#&#8203;89834](openclaw/openclaw#89834), [#&#8203;90883](openclaw/openclaw#90883)) Thanks [@&#8203;anagnorisis2peripeteia](https://github.com/anagnorisis2peripeteia).
- Observability: allow trusted diagnostics channels to capture tool input/output content, add first-assistant-event traces, and warn on slow initial replies. ([#&#8203;91256](openclaw/openclaw#91256), [#&#8203;91568](openclaw/openclaw#91568), [#&#8203;91583](openclaw/openclaw#91583)) Thanks [@&#8203;amknight](https://github.com/amknight).
- Plugins/ClawHub: dogfood reusable package publishing, let dry runs skip publish approval, allow declared installed trusted hooks, report managed plugin version drift, and warn instead of failing on retired Skill Workshop configuration. ([#&#8203;91574](openclaw/openclaw#91574), [#&#8203;91591](openclaw/openclaw#91591), [#&#8203;90004](openclaw/openclaw#90004), [#&#8203;90927](openclaw/openclaw#90927), [#&#8203;90838](openclaw/openclaw#90838)) Thanks [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen), [@&#8203;brokemac79](https://github.com/brokemac79), and [@&#8203;lonexreb](https://github.com/lonexreb).
- Memory/providers: move the local llama.cpp runtime into its provider plugin, batch embeddings across files, persist the agent model catalog cache, and keep QMD JSON search one-shot while filtering stale REM recall previews. ([#&#8203;91324](openclaw/openclaw#91324), [#&#8203;89138](openclaw/openclaw#89138), [#&#8203;90457](openclaw/openclaw#90457), [#&#8203;91837](openclaw/openclaw#91837), [#&#8203;91851](openclaw/openclaw#91851)) Thanks [@&#8203;osolmaz](https://github.com/osolmaz), [@&#8203;mushuiyu886](https://github.com/mushuiyu886), [@&#8203;ai-hpc](https://github.com/ai-hpc), and [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Channels/mobile: add the QQBot group mention toggle, improve iPad and iPhone control surfaces, and expose the active connection host in the TUI footer. ([#&#8203;91423](openclaw/openclaw#91423), [#&#8203;91557](openclaw/openclaw#91557), [#&#8203;89909](openclaw/openclaw#89909)) Thanks [@&#8203;cxyhhhhh](https://github.com/cxyhhhhh), [@&#8203;Solvely-Colin](https://github.com/Solvely-Colin), and [@&#8203;baskduf](https://github.com/baskduf).
- Performance: prewarm TUI runtime plugins, deduplicate plugin auto-enable fanout, trim dense text-delta snapshots, and reuse prepared startup model metadata. ([#&#8203;90782](openclaw/openclaw#90782), [#&#8203;89978](openclaw/openclaw#89978), [#&#8203;91580](openclaw/openclaw#91580), [#&#8203;91531](openclaw/openclaw#91531)) Thanks [@&#8203;RomneyDa](https://github.com/RomneyDa) and [@&#8203;ai-hpc](https://github.com/ai-hpc).

##### Fixes

- Agent/session recovery: drop stale approval follow-ups after session rebind, remove drained reply-queue items by identity, recover stale main and visible replies, preserve Codex context-engine compaction ownership, lower the default compaction timeout to 180 seconds while respecting explicit configuration, and keep provider-failure terminal lifecycle state correct. ([#&#8203;85679](openclaw/openclaw#85679), [#&#8203;91450](openclaw/openclaw#91450), [#&#8203;91566](openclaw/openclaw#91566), [#&#8203;91840](openclaw/openclaw#91840), [#&#8203;91590](openclaw/openclaw#91590), [#&#8203;91361](openclaw/openclaw#91361), [#&#8203;91895](openclaw/openclaw#91895)) Thanks [@&#8203;openperf](https://github.com/openperf), [@&#8203;yetval](https://github.com/yetval), [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;wangmiao0668000666](https://github.com/wangmiao0668000666), and [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- User-visible content boundaries: suppress Codex/Harmony protocol artifacts, neutralize browser and LanceDB memory media directives, redact transcript images, and preserve native `/compact` replies through source suppression. ([#&#8203;89151](openclaw/openclaw#89151), [#&#8203;91422](openclaw/openclaw#91422), [#&#8203;91425](openclaw/openclaw#91425), [#&#8203;91529](openclaw/openclaw#91529), [#&#8203;90212](openclaw/openclaw#90212)) Thanks [@&#8203;joelnishanth](https://github.com/joelnishanth), [@&#8203;pgondhi987](https://github.com/pgondhi987), [@&#8203;joshavant](https://github.com/joshavant), and [@&#8203;snowzlm](https://github.com/snowzlm).
- Channel delivery: keep WhatsApp captured replies attached to the successor controller after restart, retry Feishu rate limits, preserve Mattermost thread replies, canonicalize LINE webhook paths, restore Discord reply hydration and runtime timeout exports, and show OpenAI Realtime WebRTC assistant transcripts. ([#&#8203;85823](openclaw/openclaw#85823), [#&#8203;89659](openclaw/openclaw#89659), [#&#8203;91684](openclaw/openclaw#91684), [#&#8203;91649](openclaw/openclaw#91649), [#&#8203;90263](openclaw/openclaw#90263), [#&#8203;91686](openclaw/openclaw#91686), [#&#8203;90426](openclaw/openclaw#90426)) Thanks [@&#8203;itsuzef](https://github.com/itsuzef), [@&#8203;ladygege](https://github.com/ladygege), [@&#8203;jacobtomlinson](https://github.com/jacobtomlinson), [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev), and [@&#8203;shushushv](https://github.com/shushushv).
- Cron: cancel active task runs cleanly, preserve terminal timeout/cancel state, and recover no-deliver tool warnings instead of silently losing the outcome. ([#&#8203;90666](openclaw/openclaw#90666), [#&#8203;90678](openclaw/openclaw#90678)) Thanks [@&#8203;ai-hpc](https://github.com/ai-hpc).
- Gateway/config/auth: share the approval runtime socket token, replace arrays explicitly in `config.patch`, skip the deleted-agent guard only for valid ACP harness sessions, surface headless LaunchAgent state, verify SQLite auth migration before cleanup, and arm QMD startup maintenance. ([#&#8203;87105](openclaw/openclaw#87105), [#&#8203;91551](openclaw/openclaw#91551), [#&#8203;91219](openclaw/openclaw#91219), [#&#8203;91614](openclaw/openclaw#91614), [#&#8203;91740](openclaw/openclaw#91740), [#&#8203;91978](openclaw/openclaw#91978)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev) and [@&#8203;scotthuang](https://github.com/scotthuang).
- Providers/Codex: clarify quota errors, restore the Codex synthetic usage line, canonicalize Codex protocol assets, require API-key auth for realtime voice, normalize ACP model refs, preserve Gemma 4 `reasoning_content`, and avoid guardian review for local models. ([#&#8203;91390](openclaw/openclaw#91390), [#&#8203;91709](openclaw/openclaw#91709), [#&#8203;91507](openclaw/openclaw#91507), [#&#8203;91567](openclaw/openclaw#91567), [#&#8203;88630](openclaw/openclaw#88630), [#&#8203;91696](openclaw/openclaw#91696)) Thanks [@&#8203;hxy91819](https://github.com/hxy91819), [@&#8203;brokemac79](https://github.com/brokemac79), [@&#8203;RomneyDa](https://github.com/RomneyDa), [@&#8203;joshavant](https://github.com/joshavant), and [@&#8203;Coder-Wangyankun](https://github.com/Coder-Wangyankun).
- Updates/builds: recover package Gateway restarts after refresh failure, expose plugin convergence repair, fall back to Corepack in PATH-less pnpm environments, seed the correct Docker store packages, and keep ClawHub dry-run and publish paths reusable. ([#&#8203;91581](openclaw/openclaw#91581), [#&#8203;91599](openclaw/openclaw#91599), [#&#8203;91547](openclaw/openclaw#91547), [#&#8203;91591](openclaw/openclaw#91591)) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev), [@&#8203;sallyom](https://github.com/sallyom), and [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen).
- UI: require explicit user intent before opening chat sessions and drain restored chat queues after session switches. ([#&#8203;91480](openclaw/openclaw#91480)) Thanks [@&#8203;TurboTheTurtle](https://github.com/TurboTheTurtle).
- Android: avoid the `dataSync` foreground-service type for persistent nodes. ([#&#8203;80082](openclaw/openclaw#80082)) Thanks [@&#8203;davelutztx](https://github.com/davelutztx).
- Native hooks: bound relay lifetimes so abandoned native hook connections cannot linger indefinitely. ([#&#8203;91550](openclaw/openclaw#91550)) Thanks [@&#8203;joshavant](https://github.com/joshavant).

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL3BhdGNoIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/1040
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling channel: discord Channel integration: discord channel: telegram Channel integration: telegram mantis: telegram-visible-proof Mantis should capture Telegram visible proof. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. P2 Normal backlog priority with limited blast radius. proof: supplied External PR includes structured after-fix real behavior proof. proof: 🎥 video Contributor real behavior proof includes video or recording evidence. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: L status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Telegram streaming: intermediate text blocks between tool calls are silently lost (overwritten by final block)

2 participants