mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-08 15:43:55 +00:00
Live on-off finding: the collapse path was inconsistent. Edit-in-place worked in off-off/stream-off, but in on-off (tool-progress-only window, reasoning durable) finalizeToPreview returned undefined and the caller fell into a bare clear() -> deleteMessage -> Telegram focus-jump; a sibling sub-branch dropped the bar entirely. Two divergent outcomes from one fallback. Root cause: a throttled tool-progress preview could still be pending (coalesced, never sent) when the turn ended, so the window had no message id even though it had "rendered". finalizeToPreview gave up and the dispatch fallback deleted the (late-landing) window. Fixes: - draft-stream finalizeToPreview: settle the stream, then MATERIALIZE a still- pending preview (send it, as a final flush would) so the window message exists and can be edited in place. Only when no message could be established does it return undefined. (draft-stream.ts:597) - dispatch collapse: one deterministic path returning "edited" | "posted" | "none". A bar is ALWAYS surfaced when one exists — edited in place, or posted durably with ZERO deleteMessage. clear()/delete now runs ONLY for the "none" case (error final or nothing to summarize), never when a bar exists, so no collapse path can focus-jump. Split into resolveProgressCollapseSummaryLine / collapseProgressWindowIntoSummary / resetAnswerLaneAfterCollapse / teardownProgressWindow for a readable branch. (bot-message-dispatch.ts:1949) Tests: added on-off dispatch repro (tool-progress-only + durable reasoning + mid-turn rotation + final -> edits into bar, no clear, exactly one bar), the no-live-message durable-bar-without-delete case, and three draft-stream finalizeToPreview cases (edit-in-place, pending-materialize, no-window). 225 green across bot-message-dispatch, draft-stream, progress-summary; extensions/telegram typechecks clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>