mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-22 12:51:11 +00:00
* fix(channels): time-gate progress drafts and defer narration until visible Progress drafts started immediately on the second work event, so the 5s initial delay never filtered small fast tasks and Discord showed narrated status for turns that finish in seconds. The gate is now purely time-based (explicit startNow paths like approvals/patches are unchanged), and the progress narrator no longer spends utility-model completions before the channel draft is visible - notes buffer so the first visible narration has full context. Surface: src/channels/streaming.ts gate, src/auto-reply/reply/progress-narrator.ts, Discord draft-preview wiring; test updates across discord/matrix/msteams/slack. Refs #105872 * feat(channels): model-preamble status headline for progress drafts In progress mode the draft's status line is now the model's own typed pre-tool preamble whenever it is fresh (always on, no new config); utility-model narration fills the slot only when the model has been quiet for ~20s or emits no preamble. Preambles never start the draft early - the time gate still owns the small-vs-big decision - and narration generation is suppressed while a fresh preamble exists, saving utility calls. Discord and Telegram render the headline; the opt-in streaming.progress.commentary lane and its receipt counters are unchanged. Refs #105872 * refactor(channels): split status-text and telegram preview helpers to honor the LOC ratchet The LOC ratchet forbids raising baseline entries, so the headline feature's growth is paid for with clean splits: reasoning/commentary text normalization moves to src/channels/progress-draft-status-text.ts, Telegram progress preview rendering to extensions/telegram/src/progress-draft-preview.ts, and small ownership moves (formatCompactionModelRef, resolveFollowupAbortSignal, shared CLI preamble gate, Discord preamble item-event handling) shrink the runners back under their pins. Baseline entries lowered to exact new counts; the compositor entry is removed (424 lines, under the 500 ceiling). Refs #105872 * test(auto-reply): add resolveFollowupAbortSignal to the queue mock factory The explicit ./queue.js vi.mock factory must export every binding prod touches; the relocated resolveFollowupAbortSignal was missing and failed the whole followup-runner suite. Refs #105872 * fix(channels): sanitize preamble headlines and retry skipped narration Review findings: preamble headlines now strip inline delivery directives and reject silent-control tokens (NO_REPLY) before rendering, sharing the commentary sanitizer; rejected input keeps the previous valid headline. The narrator schedules cancellation-aware retries when a run is skipped for draft invisibility or preamble freshness, so single long tool calls still narrate and the ~20s utility filler fires without needing another event. Silent preambles no longer stamp freshness or add narration notes. Refs #105872 * fix(channels): bound narrator visibility polling and gate Telegram headline mode on accepted preambles Visibility retries stop after 30 one-second attempts (turn completion has no narrator disposal signal) and re-arm on new activity; Telegram derives its headline-rendering state from the compositor's sanitized headline instead of raw payload text, so directive-only or NO_REPLY preambles keep structured tool-line rendering. Docs scope the preamble headline to Discord and Telegram. Refs #105872 * fix(telegram): read headline state from the compositor at render time The progressHeadlineActive mirror flag was set after pushPreambleHeadline had already rendered, so the first valid preamble arriving after the draft opened rendered through the structured-line path and the headline never appeared until the next event. The renderer and formatLine now read the compositor's sanitized hasStatusHeadline directly and the mirror flag is deleted; adds an ordering regression test. LOC baseline lowered to the exact new count. Refs #105872 * fix(channels): let the opt-in commentary lane own preambles and scope narration docs to Discord With streaming.progress.commentary enabled, the status headline would replace the documented interleaved 💬 lines for any turn with a preamble (the exact event the lane consumes). The compositor headline now declines when the commentary lane is enabled, preserving that lane's shipped shape, and docs state the utility-model filler is Discord-only today (Telegram's headline is preamble-only; it has no narrator wiring). Refs #105872 * fix(msteams): cancel the pending progress gate at finalize With the purely time-based gate, every fast Teams progress turn leaves a pending 5s start timer; the SDK resets its stream id on close, so a late timer fired renderInformativeUpdate against the closed stream and posted a stale working card below the final answer. finalize() now cancels the gate and the informative renderer refuses to run once final text is queued. Refs #105872 * docs(channels): record the headline-vs-commentary ownership decision inline Refs #105872 * style: oxfmt the late review-fix rounds Four files from the final review-fix commits were never oxfmt-formatted and failed the shared CI formatting step; baseline lowered for the one-line telegram shrink. Refs #105872 * fix(channels): harden progress draft lifecycle * fix(channels): refresh repeated preamble items * fix(plugin-sdk): expose progress lifecycle options * style(auto-reply): simplify narrator reset * docs(channels): refresh progress draft docs map * fix(auto-reply): clear queued narrator request context * fix(discord): cancel delayed progress gate at final * docs: refresh plugin sdk api baseline