Skip to content

fix(opencode-go): streaming completes when provider ends responses#93965

Merged
openclaw-clownfish[bot] merged 10 commits into
openclaw:mainfrom
zhangguiping-xydt:fix/issue-93610-stalled-stream
Jun 22, 2026
Merged

fix(opencode-go): streaming completes when provider ends responses#93965
openclaw-clownfish[bot] merged 10 commits into
openclaw:mainfrom
zhangguiping-xydt:fix/issue-93610-stalled-stream

Conversation

@zhangguiping-xydt

@zhangguiping-xydt zhangguiping-xydt commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Summary

What problem does this PR solve?

  • Fixes opencode-go streams that stop before a first upstream SSE event or between real provider progress events so cron jobs no longer wait for the late stuck-session abort path.
  • Keeps the watchdog scoped to model.provider === "opencode-go" and to the provider-owned stream wrapper, rather than changing global runtime timeout behavior.
  • Preserves the longer first-event window after the openai-completions transport emits its synthetic start event; only real provider progress switches the wrapper to the shorter idle timer.
  • Ensures aborting the provider wrapper also releases the upstream async iterator and cleans fallback abort listeners.

Fix classification

  • Root-cause fix at the opencode-go provider-owned raw SSE boundary. The source of truth for timer state is whether the wrapped provider stream has produced real provider progress, not whether the OpenAI-compatible transport has emitted its synthetic start event.

Root cause

  • The failing source path is the raw opencode-go SSE boundary: the upstream provider call can remain open without delivering a first real chunk or terminal event, while cron-triggered runs may not have the shared runtime idle watchdog enabled.
  • openai-completions emits start before processing real SSE chunks. Treating that synthetic event as provider progress caused the wrapper to replace the intended 300s first-event window with the 120s idle window, so a slow but valid first token could be aborted before real upstream progress arrived.

Why this is root-cause fix

  • The fix changes the wrapper's timer lifecycle invariant at the source boundary: synthetic preamble events such as start, text_start, thinking_start, and toolcall_start are forwarded downstream but do not switch timer state; the idle timer begins only after real provider delta events.
  • This preserves the provider-owned cancellation path for true stalls while removing the false-positive abort path introduced by counting synthetic transport bookkeeping as upstream provider progress.

Why does this matter now?

What is the intended outcome?

  • This is a root-cause fix at the opencode-go provider-owned raw SSE boundary: a truly stalled opencode-go stream now produces a terminal provider error promptly at that boundary instead of leaving the gateway session open until stuck-session recovery.
  • The source of truth for timer state is real provider progress, not the OpenAI-compatible transport's synthetic preamble events, so start/block-start events no longer shorten the first real provider-event window.
  • Normal completions that continue to emit real progress, including delayed usage-only completion, still finish naturally.

What is intentionally out of scope?

  • No changes to provider catalog, model routing, fallback policy, global agent timeout defaults, config schema, migrations, or non-opencode-go providers.
  • No new retry/fallback path is introduced; the wrapper only terminates a hung opencode-go stream and lets existing caller error handling decide what happens next.
  • No schema or config change is needed because existing models.providers.opencode-go.timeoutSeconds already reaches the model as requestTimeoutMs and is respected by this wrapper.

What does success look like?

  • The wrapper aborts a pending stream-creation/TTFB stall.
  • The wrapper gives first real provider-event delivery a longer window than inter-event idle gaps.
  • The wrapper respects an explicit models.providers.opencode-go.timeoutSeconds value carried as model.requestTimeoutMs.
  • The wrapper aborts and releases a stream that produced real progress and then stalls.
  • The wrapper forwards natural done events without aborting.
  • The fallback AbortSignal combiner removes listeners after completion and still propagates wrapper aborts.

What should reviewers focus on?

  • Architecture / source-of-truth check: extensions/opencode-go/stream-termination.ts owns only the opencode-go raw provider stream watchdog contract; openai-completions transport events are downstream stream protocol events and are not the source of truth for upstream SSE progress.
  • The timer lifecycle in extensions/opencode-go/stream-termination.ts: it starts before the upstream stream exists, keeps the first-event timer through synthetic preamble events, switches to the idle timer only after real provider delta progress, clears on terminal events, aborts the injected provider signal, calls return() on the upstream iterator, and removes fallback listeners.
  • The public API/config/schema/provider-routing boundary is unchanged; this is not a canonical default, migration, or model-routing contract change.
Summary guidance

This PR description is the contributor's durable explanation of the change. Write it for human maintainers first; ClawSweeper and Barnacle use the same text to understand intent, proof, risk, and current review state.

Describe the intent and outcome in 2-5 bullets. Avoid restating the diff; reviewers and bots can read the changed files.

If this PR fixes a plugin beta-release blocker, title it fix(<plugin-id>): beta blocker - <summary> and link the matching Beta blocker: <plugin-name> - <summary> issue labeled beta-blocker. Contributors cannot label PRs, so the title is the PR-side signal for maintainers and automation.

Linked context

Which issue does this close?

Closes #93610

Which issues, PRs, or discussions are related?

Related #93965

Was this requested by a maintainer or owner?

No explicit maintainer request; this updates the existing PR after review identified that the previous timer could shorten the first-token window after an openai-completions synthetic start event.

Linked context guidance

Link the issue, PR, discussion, maintainer request, or owner request that explains why this PR should exist. Maintainer context helps reviewers and automation distinguish intended work from drive-by churn.

Real behavior proof (required for external PRs)

  • Behavior or issue addressed: opencode-go stream stalls before the first upstream SSE event now terminate at the provider wrapper, while a synthetic start followed by a slow first real delta no longer triggers the shorter idle abort.

  • Real environment tested: Linux OpenClaw checkout executing the patched opencode-go provider stream wrapper and plugin SDK stream contract with a live Node process.

  • Exact steps or command run after this patch: ran a Node/tsx proof script that imports extensions/opencode-go/stream-termination.ts, wraps controlled opencode-go upstream streams, and exercises both no-first-event stall and synthetic-start/slow-first-delta behavior.

  • Evidence after fix (screenshot, recording, terminal capture, console output, redacted runtime log, linked artifact, or copied live output):

    OpenClaw opencode-go provider stream proof
    scenario=first-upstream-event-never-arrives
    provider_signal_aborted=true
    provider_abort_reason=opencode-go stream stalled
    upstream_iterator_return_calls=1
    downstream_terminal_event_type=error
    downstream_terminal_reason=aborted
    downstream_event_count=1
    scenario=synthetic-start-then-slow-first-delta
    provider_signal_aborted=false
    first_delta_arrived_after_idle_window=true
    downstream_saw_text_delta=true
    downstream_terminal_event_type=done
    downstream_event_count=3
    
  • Observed result after fix: before any upstream SSE event arrived, the opencode-go wrapper aborted the signal passed to the provider stream, called return() on the upstream iterator once, and emitted one terminal downstream error event with reason aborted; after a synthetic start, a first real text_delta arriving after the idle window still completed normally with no provider abort.

  • What was not tested: a live opencode-go provider outage was not forced against the public provider service.

  • Proof limitations or environment constraints: the reported failure is intermittent and provider-side; this proof executes the real patched wrapper boundary in-process with controlled async upstream streams so the two timing cases are deterministic without relying on a flaky external provider.

  • Before evidence (optional but encouraged): the new synthetic-start regression failed before the fix with expected true to be false at the abortCalled assertion after advancing past the idle timeout.

Real behavior proof guidance

External contributors must show after-fix evidence from a real OpenClaw setup. Unit tests, mocks, lint, typechecks, snapshots, and CI are supplemental only.

Screenshots are encouraged even for CLI, console, text, or log changes. Terminal screenshots, copied live output, redacted runtime logs, recordings, and linked artifacts count.

If your environment cannot produce the ideal proof, explain that under Proof limitations or environment constraints so reviewers and ClawSweeper can direct the next step properly.

Be mindful of private information like IP addresses, API keys, phone numbers, non-public endpoints, or other private details when providing evidence.

Tests and validation

Which commands did you run?

  • npx tsx <proof script> against extensions/opencode-go/stream-termination.ts for no-first-event stall and synthetic-start/slow-first-delta behavior.
  • node scripts/run-vitest.mjs extensions/opencode-go/stream-termination.test.ts
  • node scripts/run-vitest.mjs src/agents/embedded-agent-runner/run/llm-idle-timeout.test.ts
  • git diff --check

Focused test output:

OpenClaw opencode-go provider stream proof
scenario=first-upstream-event-never-arrives
provider_signal_aborted=true
provider_abort_reason=opencode-go stream stalled
upstream_iterator_return_calls=1
downstream_terminal_event_type=error
downstream_terminal_reason=aborted
downstream_event_count=1
scenario=synthetic-start-then-slow-first-delta
provider_signal_aborted=false
first_delta_arrived_after_idle_window=true
downstream_saw_text_delta=true
downstream_terminal_event_type=done
downstream_event_count=3

[test] starting test/vitest/vitest.extension-misc.config.ts

 RUN  v4.1.8 [local path redacted]

 Test Files  1 passed (1)
      Tests  11 passed (11)
   Start at  23:44:34
   Duration  3.67s (transform 3.37s, setup 1.57s, import 937ms, tests 658ms, environment 0ms)

[test] passed 1 Vitest shard in 18.01s

[test] starting test/vitest/vitest.agents.config.ts

 RUN  v4.1.8 [local path redacted]

 Test Files  1 passed (1)
      Tests  76 passed (76)
   Start at  23:44:53
   Duration  3.68s (transform 3.39s, setup 1.45s, import 1.12s, tests 682ms, environment 0ms)

[test] passed 1 Vitest shard in 16.30s

git diff --check: pass

What regression coverage was added or updated?

  • No-first-event stream aborts and releases the upstream iterator.
  • First real provider-event delivery uses a longer timeout than the inter-event idle window.
  • Synthetic openai-completions preamble events (start and block-start events) do not switch to the shorter idle timer before the first real delta.
  • Explicit opencode-go provider requestTimeoutMs is honored above and below the wrapper defaults.
  • Pending upstream stream promise aborts during stream creation.
  • Post-progress stall still aborts at the raw provider boundary.
  • Fallback AbortSignal listeners are removed after natural completion.
  • Fallback combined signal still propagates wrapper abort.
  • Normal delayed usage-only completion remains non-aborted.

What failed before this fix, if known?

  • The synthetic preamble regression failed because the wrapper treated text_start as progress and aborted after the shorter idle timeout before the first real text_delta arrived.
  • The explicit-timeout regression failed because a shorter requestTimeoutMs was widened to the wrapper default instead of preserving the operator ceiling.
  • Earlier regressions covered by this PR failed for no-first-event abort, fallback listener cleanup, and fallback abort propagation.

If no test was added, why not?

N/A.

Testing guidance

List focused commands, not every incidental check. CI is useful support, but external PRs still need real behavior proof above when behavior changes.

Risk checklist

Did user-visible behavior change? (Yes/No)

Yes.

Did config, environment, or migration behavior change? (Yes/No)

No.

Did security, auth, secrets, network, or tool execution behavior change? (Yes/No)

Yes, network request cancellation timing changes for opencode-go streams only.

What is the highest-risk area?

Aborting an opencode-go request that is slow but still valid.

How is that risk mitigated?

The behavior is scoped to opencode-go, keeps the 120s window for inter-event idle gaps after real provider progress, gives first real provider-event delivery a longer 300s window even after synthetic preamble events, respects explicit models.providers.opencode-go.timeoutSeconds values, refreshes on forwarded real progress events, preserves natural done completion, and does not change local/global timeout contracts.

Patch quality notes

  • Patch-quality warnings about timeout behavior are intentional: the change is the timer contract under review, and the regression suite now locks the false-abort case plus no-first-event abort, post-progress abort, explicit timeout, natural done, and fallback AbortSignal behavior.
  • Test-only type escapes are limited to constructing plugin SDK ProviderWrapStreamFnContext inputs and synthetic stream events inside extensions/opencode-go/stream-termination.test.ts; production code does not add any escapes.
  • The fallback AbortSignal tests are not a runtime fallback path for users; they cover the platform compatibility branch used only when AbortSignal.any is unavailable, so it does not mask provider errors or alter routing.
Risk guidance

Use this for author judgment that is not obvious from the diff. ClawSweeper can see touched files, but it cannot know which behavior you think is risky, why the risk is acceptable, or what mitigation reviewers should verify.

Current review state

What is the next action?

Ready for maintainer/bot review after the updated branch and remote checks settle.

What is still waiting on author, maintainer, CI, or external proof?

  • Normal remote PR checks after this branch update.
  • The existing status: ⏳ waiting on author label should be re-evaluated after this update because the timer semantics and explicit-timeout findings now have focused regressions, passing focused tests, and behavior proof.

Which bot or reviewer comments were addressed?

  • RF-001: the status: ⏳ waiting on author label remains page-visible until maintainers/bot update it; this branch update addresses the current author-side code, test, and proof work.
  • RF-002: added regression coverage for explicit opencode-go timeout values below and above the wrapper defaults.
  • RF-003/RF-006: opencode-go requestTimeoutMs is now honored directly, so shorter provider timeouts are no longer widened to the 120s/300s wrapper defaults.
  • RF-004: the availability/compatibility risk is covered by focused tests for no-first-event abort, synthetic preamble before slow first delta, short/long explicit timeouts, post-progress stalls, natural completion, and fallback AbortSignal cleanup/abort propagation.
  • RF-005: kept the existing provider-scoped approach and made the narrow mechanical repair at the timer source-of-truth boundary without changing global timeout behavior.
  • RF-007: node scripts/run-vitest.mjs extensions/opencode-go/stream-termination.test.ts passed with 11 tests.
  • RF-008: node scripts/run-vitest.mjs src/agents/embedded-agent-runner/run/llm-idle-timeout.test.ts passed with 76 tests.
  • RF-009: git diff --check passed.
  • Behavior proof: refreshed the opencode-go stream proof for no-first-event stall and synthetic-start/slow-first-delta behavior on the current head.
Review state guidance

Keep this as the durable state for review progress. If useful information appears in comments, fold the current next action or blocker back here so maintainers and ClawSweeper do not need to reconstruct state from comment history.

@openclaw-barnacle openclaw-barnacle Bot added extensions: opencode-go size: L proof: supplied External PR includes structured after-fix real behavior proof. labels Jun 17, 2026
@clawsweeper

clawsweeper Bot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 21, 2026, 11:12 PM ET / 03:12 UTC.

Summary
The PR adds an opencode-go provider stream watchdog with first-event and idle abort windows, wires it into the opencode-go wrapper chain, and adds focused stream termination tests.

PR surface: Source +388, Tests +712. Total +1100 across 3 files.

Reproducibility: yes. at source/proof level, but not by forcing a live provider outage. The linked issue logs show opencode-go cron runs stuck in stream progress, current main lacks the provider guard, and the PR proof/tests exercise missing first-event and post-progress stall paths.

Review metrics: 2 noteworthy metrics.

  • Provider Abort Windows: 2 added defaults: 300s first event, 120s idle. These become opencode-go request cancellation windows for existing users without an explicit provider timeout.
  • Timeout Override Path: 1 existing setting consumed: model.requestTimeoutMs. The wrapper relies on the current models.providers.opencode-go.timeoutSeconds path for users who need a different cancellation ceiling.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #93610
Summary: The canonical user problem is the opencode-go cron stream-stall issue; this PR is the strongest provider-boundary candidate, while other open items overlap on provider guard or downstream recovery classification.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster
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:

  • Maintainer should confirm whether the 300s first-event and 120s idle windows are the intended default opencode-go behavior.

Risk before merge

  • [P2] Maintainers still need to choose the canonical opencode-go timeout contract because this changes existing cron/provider stream cancellation behavior for users without explicit provider timeoutSeconds.
  • [P0] The live third-party opencode-go outage was not forced in this read-only review; proof is strong at the wrapper boundary but not an external-service outage replay.
  • [P1] The same user incident has overlapping open work, so maintainers should avoid landing competing provider-boundary implementations.

Maintainer options:

  1. Confirm Defaults And Land This Provider Guard (recommended)
    A maintainer should confirm the 300s first-event and 120s idle windows are the intended default opencode-go behavior, then treat this as the canonical provider-boundary fix.
  2. Revise Timeout Contract Before Merge
    If those defaults are too aggressive for existing cron users, update the wrapper to preserve current behavior unless an explicit provider timeout or documented opt-in applies.
  3. Pause The Competing Provider PR
    If this PR is selected as canonical, the overlapping provider-boundary alternative should be closed or narrowed so two opencode-go stall guards do not compete.

Next step before merge

  • [P2] There is no narrow automation repair left; the remaining action is maintainer selection of the canonical provider-boundary fix and timeout contract.

Security
Cleared: The diff adds provider-local TypeScript stream logic and tests only; it does not change dependencies, workflows, secrets, permissions, publishing, or downloaded code paths.

Review details

Best possible solution:

Land one provider-owned opencode-go stream termination guard at the plugin boundary, then decide separately whether downstream stuck-recovery classification should also land.

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

Yes at source/proof level, but not by forcing a live provider outage. The linked issue logs show opencode-go cron runs stuck in stream progress, current main lacks the provider guard, and the PR proof/tests exercise missing first-event and post-progress stall paths.

Is this the best way to solve the issue?

Yes, this appears to be the best current provider-boundary fix layer. The plugin hook is provider-owned and avoids changing shared OpenAI-completions behavior, while the downstream recovery PR remains complementary rather than a replacement.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against a1828110704f.

Label changes

Label changes:

  • add rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • remove rating: 🦞 diamond lobster: Current PR rating is rating: 🐚 platinum hermit, so this older rating label is no longer current.

Label justifications:

  • P1: The PR targets a reported opencode-go cron/provider streaming failure that blocks scheduled agent workflows for real users.
  • merge-risk: 🚨 compatibility: The diff intentionally changes default opencode-go stream timeout/cancellation behavior for existing users without a new config surface.
  • merge-risk: 🚨 availability: The wrapper changes when provider streams are aborted, which can affect whether runs hang, complete, or surface an error.
  • 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 (live_output): The PR body includes after-fix copied live output from a Node/tsx proof script that imports the patched wrapper and demonstrates stalled-stream abort plus synthetic-start/slow-first-delta success; no private live provider outage was forced.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix copied live output from a Node/tsx proof script that imports the patched wrapper and demonstrates stalled-stream abort plus synthetic-start/slow-first-delta success; no private live provider outage was forced.
Evidence reviewed

PR surface:

Source +388, Tests +712. Total +1100 across 3 files.

View PR surface stats
Area Files Added Removed Net
Source 2 389 1 +388
Tests 1 712 0 +712
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 3 1101 1 +1100

Acceptance criteria:

  • [P1] node scripts/run-vitest.mjs extensions/opencode-go/stream-termination.test.ts.
  • [P2] node scripts/run-vitest.mjs src/agents/embedded-agent-runner/run/llm-idle-timeout.test.ts.
  • [P1] git diff --check.

What I checked:

  • Repository policy favors provider boundary: Root policy keeps core plugin-agnostic and says owner-specific provider behavior belongs in the owner plugin; extension policy also says vendor-only provider behavior should stay local to the plugin. (AGENTS.md:56, a1828110704f)
  • Current main has the opencode-go wrapper seam but no stream termination guard: Current main's createOpencodeGoWrapper composes Kimi reasoning stripping and DeepSeek V4 thinking behavior only; the opencode-go directory has no stream-termination.ts file. (extensions/opencode-go/stream.ts:45, a1828110704f)
  • PR applies the guard at the opencode-go plugin wrapper: The PR head wraps the opencode-go stream chain with createOpencodeGoStalledStreamWrapper and keeps the provider check local to opencode-go. (extensions/opencode-go/stream.ts:50, 8025cc7cab9d)
  • PR timeout and abort behavior is explicit and provider-scoped: The new wrapper defines 120s idle and 300s first-event defaults, honors model.requestTimeoutMs, injects an AbortSignal, releases the base iterator on stall, and only arms the idle timer after real provider delta events. (extensions/opencode-go/stream-termination.ts:36, 8025cc7cab9d)
  • OpenAI-compatible transport emits a synthetic start before real stream processing: Current main pushes a start event after the SDK stream is created and before processOpenAICompletionsStream emits text/thinking/tool deltas, matching the PR's synthetic-preamble distinction. (src/agents/openai-transport-stream.ts:2686, a1828110704f)
  • Cron idle watchdog gap is current behavior: Current main documents and implements that cron-triggered runs with no explicit model or agent timeout disable the shared model idle watchdog and rely on outer timeout/stuck recovery. (src/agents/embedded-agent-runner/run/llm-idle-timeout.ts:185, a1828110704f)

Likely related people:

  • vincentkoc: Recent history shows repeated opencode/provider-hook work, and the related PR discussion records his requested provider-scoped abortable raw SSE boundary shape. (role: recent area contributor and reviewer; confidence: high; commits: 66701d5a1e16, 4c15f1310bd5, 3f9e93fd28ef; files: extensions/opencode-go/index.ts, extensions/opencode-go/stream.ts, src/plugin-sdk/provider-stream-shared.ts)
  • steipete: History shows extensive provider/plugin boundary and opencode-go extension work, including the bundled provider hook migration that defines the owner boundary used here. (role: feature owner by history; confidence: high; commits: 8e2a1d0941c7, 4ca07559abe4, fe7059696b1b; files: extensions/opencode-go/index.ts, extensions/opencode-go/stream.ts, src/plugins/types.ts)
  • jalehman: Provider replay runtime ownership history moved related provider behavior into plugin-owned hooks near this stream-wrapper decision. (role: adjacent provider-runtime contributor; confidence: medium; commits: 799c6f40aa69; files: extensions/opencode-go/index.ts, extensions/opencode-go/stream.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. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. labels Jun 17, 2026
zhangguiping-xydt added a commit to zhangguiping-xydt/openclaw that referenced this pull request Jun 17, 2026
The wrapper armed the idle timer before the first upstream event, which
would mis-abort slow time-to-first-byte requests — including the
opencode-go cron runs that the runtime deliberately leaves uncapped via
resolveLlmIdleTimeoutMs. Arm only after the first forwarded event, and
add regression coverage for the slow-first-event path.

Addresses the ClawSweeper P1 finding on PR openclaw#93965.
@zhangguiping-xydt
zhangguiping-xydt force-pushed the fix/issue-93610-stalled-stream branch from 8782b9a to d4fb2d8 Compare June 17, 2026 17:29
@zhangguiping-xydt

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 17, 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:

@clawsweeper clawsweeper Bot 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 17, 2026
@zhangguiping-xydt
zhangguiping-xydt marked this pull request as draft June 18, 2026 03:20
@zhangguiping-xydt
zhangguiping-xydt marked this pull request as ready for review June 18, 2026 06:47
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 18, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 18, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 18, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 18, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Jun 18, 2026
@zhangguiping-xydt
zhangguiping-xydt force-pushed the fix/issue-93610-stalled-stream branch from 68f52b4 to 8025cc7 Compare June 18, 2026 16:09
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 18, 2026
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. and removed rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. labels Jun 22, 2026
@zhangguiping-xydt zhangguiping-xydt changed the title [Bug]: opencode-go provider streaming — API calls complete on provider side but gateway never receives stream termination signal fix(opencode-go): streaming completes when provider ends responses Jun 22, 2026
…ndary

opencode-go routes through the shared OpenAI-compatible completions provider,
where a stalled SSE socket (provider emits tokens then never closes the stream)
hangs the gateway until stuckSessionAbortMs (~622s) and surfaces as
'LLM request failed' / 'Request was aborted'. Issue openclaw#93610 reports ~90% of
opencode-go cron jobs failing intermittently this way.

Add a provider-owned stream wrapper at the opencode-go raw SSE boundary that
injects an AbortController into the underlying OpenAI SDK request and aborts
it after a configurable idle window (default 30s, far below 622s) elapses
without any forward-progress event. The wrapper is:

- Provider-scoped: only applies when model.provider === 'opencode-go'; the
  shared openai-completions.ts path is untouched.
- Abortable: calls controller.abort() on the injected AbortSignal, which
  propagates through OpenAI SDK requestOptions.signal and genuinely
  interrupts the underlying fetch/stream (not just iterator return()).
- Idle-based: every event (text/tool/thinking delta, including delayed
  usage-only chunks) refreshes the timer; natural completion (done/error)
  cancels it. Normal delayed usage-only completion is preserved.
- Boundary-terminal: pushes a terminal { type: 'error', reason: 'aborted' }
  event downstream so consumers do not hang.

TDD: stream-termination.test.ts covers (a) stalled stream after first
progress is aborted within the idle window with a downstream 'aborted'
terminal event, and (b) normal delayed completion within the idle window
is not aborted and the done event is forwarded unchanged.
Match the runtime's shared `DEFAULT_LLM_IDLE_TIMEOUT_MS` (120s) so
non-cron interactive opencode-go runs see no behavior change versus the
existing watchdog. Cron runs — for which the runtime disables its idle
watchdog entirely (`resolveLlmIdleTimeoutMs` returns 0 when trigger is
cron and no explicit timeout is set) — still get provider-owned
termination well before the ~622s stuck-session recovery.

Refs openclaw#93610
- Remove unnecessary `?? {}` fallback in spread (oxlint
  no-useless-fallback-in-spread).
- Drop non-narrowing `!` on the wrapper return type; use
  `await Promise.resolve(...)` to collapse the
  `StreamLike | Promise<StreamLike>` union before `for await`.

Refs openclaw#93610
The wrapper armed the idle timer before the first upstream event, which
would mis-abort slow time-to-first-byte requests — including the
opencode-go cron runs that the runtime deliberately leaves uncapped via
resolveLlmIdleTimeoutMs. Arm only after the first forwarded event, and
add regression coverage for the slow-first-event path.
@zhangguiping-xydt
zhangguiping-xydt force-pushed the fix/issue-93610-stalled-stream branch from 8025cc7 to 3a8faee Compare June 22, 2026 14:39
@openclaw-barnacle openclaw-barnacle Bot added the agents Agent runtime and tooling label Jun 22, 2026
@openclaw-clownfish
openclaw-clownfish Bot merged commit 769579b into openclaw:main Jun 22, 2026
101 of 102 checks passed
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 23, 2026
…penclaw#93965)

* fix(opencode-go): abort stalled SSE streams at provider-owned raw boundary

opencode-go routes through the shared OpenAI-compatible completions provider,
where a stalled SSE socket (provider emits tokens then never closes the stream)
hangs the gateway until stuckSessionAbortMs (~622s) and surfaces as
'LLM request failed' / 'Request was aborted'. Issue openclaw#93610 reports ~90% of
opencode-go cron jobs failing intermittently this way.

Add a provider-owned stream wrapper at the opencode-go raw SSE boundary that
injects an AbortController into the underlying OpenAI SDK request and aborts
it after a configurable idle window (default 30s, far below 622s) elapses
without any forward-progress event. The wrapper is:

- Provider-scoped: only applies when model.provider === 'opencode-go'; the
  shared openai-completions.ts path is untouched.
- Abortable: calls controller.abort() on the injected AbortSignal, which
  propagates through OpenAI SDK requestOptions.signal and genuinely
  interrupts the underlying fetch/stream (not just iterator return()).
- Idle-based: every event (text/tool/thinking delta, including delayed
  usage-only chunks) refreshes the timer; natural completion (done/error)
  cancels it. Normal delayed usage-only completion is preserved.
- Boundary-terminal: pushes a terminal { type: 'error', reason: 'aborted' }
  event downstream so consumers do not hang.

TDD: stream-termination.test.ts covers (a) stalled stream after first
progress is aborted within the idle window with a downstream 'aborted'
terminal event, and (b) normal delayed completion within the idle window
is not aborted and the done event is forwarded unchanged.

* fix(opencode-go): align stalled-stream idle default with runtime (120s)

Match the runtime's shared `DEFAULT_LLM_IDLE_TIMEOUT_MS` (120s) so
non-cron interactive opencode-go runs see no behavior change versus the
existing watchdog. Cron runs — for which the runtime disables its idle
watchdog entirely (`resolveLlmIdleTimeoutMs` returns 0 when trigger is
cron and no explicit timeout is set) — still get provider-owned
termination well before the ~622s stuck-session recovery.

Refs openclaw#93610

* fix(opencode-go): satisfy CI lint and test type checks

- Remove unnecessary `?? {}` fallback in spread (oxlint
  no-useless-fallback-in-spread).
- Drop non-narrowing `!` on the wrapper return type; use
  `await Promise.resolve(...)` to collapse the
  `StreamLike | Promise<StreamLike>` union before `for await`.

Refs openclaw#93610

* fix(opencode-go): arm stalled-stream idle timer only after first event

The wrapper armed the idle timer before the first upstream event, which
would mis-abort slow time-to-first-byte requests — including the
opencode-go cron runs that the runtime deliberately leaves uncapped via
resolveLlmIdleTimeoutMs. Arm only after the first forwarded event, and
add regression coverage for the slow-first-event path.

* fix(opencode-go): cover stalled stream first event

* fix(opencode-go): respect explicit stream timeout

* fix(opencode-go): preserve first-event timer after synthetic start

* fix(opencode-go): satisfy stream termination test lint

* fix(opencode-go): distinguish synthetic stream preambles

* fix(opencode-go): route stalled streams through failover
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request Jul 1, 2026
…026.6.11) (#1344)

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.10` → `2026.6.11` |

---

### Release Notes

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

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

[Compare Source](https://github.com/openclaw/openclaw/compare/v2026.6.10...v2026.6.11)

We heard the feedback. v2026.6.11 focuses on the rough edges that make OpenClaw feel less dependable, with fixes for misplaced replies, stuck sends, reconnects, model setup failures, and safer admin defaults.

[Full release notes](https://docs.openclaw.ai/releases/2026.6.11)

##### Highlights

##### Channel delivery reliability

Delivery and reconnect fixes span [Telegram](https://docs.openclaw.ai/channels/telegram), [WhatsApp](https://docs.openclaw.ai/channels/whatsapp), [Matrix](https://docs.openclaw.ai/channels/matrix), [Google Chat](https://docs.openclaw.ai/channels/googlechat), [iMessage](https://docs.openclaw.ai/channels/imessage), [Feishu](https://docs.openclaw.ai/channels/feishu), [Mattermost](https://docs.openclaw.ai/channels/mattermost), [WebChat](https://docs.openclaw.ai/web/webchat), the [Control UI](https://docs.openclaw.ai/web/control-ui), and the [terminal UI](https://docs.openclaw.ai/cli/tui).

- Fixes newer Google Chat direct messages sometimes being treated like group conversations, so they reach the correct one-to-one chat while Space and group-chat messages keep their existing routing. [#&#8203;58993](https://github.com/openclaw/openclaw/pull/58993) Thanks [@&#8203;starhappysh](https://github.com/starhappysh), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Feishu voice replies from OpenClaw now show their duration in the chat bubble, so recipients can see how long the audio is before playing it. [#&#8203;89172](https://github.com/openclaw/openclaw/pull/89172) Related [#&#8203;53798](https://github.com/openclaw/openclaw/issues/53798). Thanks [@&#8203;areslp](https://github.com/areslp), [@&#8203;fxz26284407](https://github.com/fxz26284407), [@&#8203;kinrocw](https://github.com/kinrocw).
- Discord and Telegram replies and mirrored chat history stay tied to the intended conversation more consistently, including across repeated Telegram replies and session changes. [#&#8203;89911](https://github.com/openclaw/openclaw/pull/89911) Thanks [@&#8203;jalehman](https://github.com/jalehman).
- Background image, video, and music results now return to the chat that requested them when the task starts without a full conversation target, instead of appearing to fail after creation or being sent to the wrong peer as the session moves. [#&#8203;89949](https://github.com/openclaw/openclaw/pull/89949) Related [#&#8203;86034](https://github.com/openclaw/openclaw/issues/86034). Thanks [@&#8203;tianxiaochannel-oss88](https://github.com/tianxiaochannel-oss88), [@&#8203;wangwllu](https://github.com/wangwllu).
- Telegram answers now stay attached to the user's current question when they quote an earlier bot message, while quotes of other people's messages still reply to the selected quote. [#&#8203;90475](https://github.com/openclaw/openclaw/pull/90475) Thanks [@&#8203;moeedahmed](https://github.com/moeedahmed).
- QQBot group admins can choose how broadly slash commands are available, and private-only commands now direct users to a private chat instead of being exposed or silently ignored in groups. [#&#8203;92154](https://github.com/openclaw/openclaw/pull/92154) Thanks [@&#8203;sliverp](https://github.com/sliverp).
- Heartbeat checks using reasoning-capable models now show the assistant's intended reply instead of exposing internal reasoning in Telegram, WhatsApp, and other channels, while opt-in Thinking messages still work. [#&#8203;92356](https://github.com/openclaw/openclaw/pull/92356) Related [#&#8203;92260](https://github.com/openclaw/openclaw/issues/92260). Thanks [@&#8203;jmpei](https://github.com/jmpei), [@&#8203;tangtaizong666](https://github.com/tangtaizong666), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Telegram progress-mode chats now clear an old progress bubble before newer tool output or artifacts appear, keeping the conversation in a clean, readable order. [#&#8203;93002](https://github.com/openclaw/openclaw/pull/93002) Related [#&#8203;90753](https://github.com/openclaw/openclaw/issues/90753). Thanks [@&#8203;shadow-enthusiast](https://github.com/shadow-enthusiast), [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt).
- iMessage command-and-link messages now stay together as one OpenClaw turn when delayed link previews arrive, while unrelated quick messages remain separate for users who enabled same-sender DM coalescing. [#&#8203;93143](https://github.com/openclaw/openclaw/pull/93143) Thanks [@&#8203;omarshahine](https://github.com/omarshahine).
- Successful Discord replies sent through the message tool no longer trigger a misleading failure warning in affected `message_tool_only` source-channel turns. [#&#8203;94072](https://github.com/openclaw/openclaw/pull/94072) Related [#&#8203;93875](https://github.com/openclaw/openclaw/issues/93875). Thanks [@&#8203;chenyangjun-xy](https://github.com/chenyangjun-xy), [@&#8203;hoyanhan](https://github.com/hoyanhan), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- WhatsApp group conversations now preserve the right message and group context more reliably during retries, reconnects, and group changes. [#&#8203;94338](https://github.com/openclaw/openclaw/pull/94338) Related [#&#8203;7433](https://github.com/openclaw/openclaw/issues/7433). Thanks [@&#8203;mcaxtr](https://github.com/mcaxtr), [@&#8203;octopuslabs-fl](https://github.com/octopuslabs-fl), [@&#8203;xialonglee](https://github.com/xialonglee).
- Fixes OpenClaw sometimes replying to its own delayed iMessage echoes when stray leading characters keep the sent message from being recognized. [#&#8203;94442](https://github.com/openclaw/openclaw/pull/94442) Thanks [@&#8203;ly-wang19](https://github.com/ly-wang19).
- Telegram webhook users can keep receiving DMs and group messages through brief channel restarts, configuration reloads, and recovery cycles without temporary message blackouts. [#&#8203;94506](https://github.com/openclaw/openclaw/pull/94506) Related [#&#8203;90254](https://github.com/openclaw/openclaw/issues/90254). Thanks [@&#8203;obviyus](https://github.com/obviyus), [@&#8203;travellingsoldier85](https://github.com/travellingsoldier85), [@&#8203;xialonglee](https://github.com/xialonglee).
- Matrix E2EE gateways can stay online during long-running use instead of gradually consuming memory until a crash takes channels and in-flight work down. [#&#8203;94942](https://github.com/openclaw/openclaw/pull/94942) Related [#&#8203;90455](https://github.com/openclaw/openclaw/issues/90455). Thanks [@&#8203;xzh-icenter](https://github.com/xzh-icenter), [@&#8203;yar-sh](https://github.com/yar-sh).
- Telegram users now see the intended native reaction instead of leaked instructions or a dropped reaction-only reply, with success recorded only after Telegram accepts it. [#&#8203;94977](https://github.com/openclaw/openclaw/pull/94977) Related [#&#8203;71140](https://github.com/openclaw/openclaw/issues/71140). Thanks [@&#8203;cuttingwater](https://github.com/cuttingwater), [@&#8203;hugenshen](https://github.com/hugenshen).
- Telegram progress updates for commands, searches, updates, and API activity now stay readable instead of exposing noisy HTML or code-style rows, with plain-text fallback when Telegram cannot parse the formatting. [#&#8203;95007](https://github.com/openclaw/openclaw/pull/95007) Related [#&#8203;95002](https://github.com/openclaw/openclaw/issues/95002).
- Telegram conversations continued in WebChat now show one assistant reply per turn and keep later replies with the active conversation instead of duplicating answers or sending them back to Telegram. [#&#8203;95069](https://github.com/openclaw/openclaw/pull/95069) Related [#&#8203;94930](https://github.com/openclaw/openclaw/issues/94930). Thanks [@&#8203;heichaowo](https://github.com/heichaowo).
- Google Chat now hides misleading internal failure banners when a tool result is harmless, leaving users with the completed answer while normal assistant text remains unchanged. [#&#8203;95084](https://github.com/openclaw/openclaw/pull/95084) Related [#&#8203;90684](https://github.com/openclaw/openclaw/issues/90684). Thanks [@&#8203;jailbirt](https://github.com/jailbirt), [@&#8203;studentzhou-svg](https://github.com/studentzhou-svg).
- Bound multi-agent channel conversations now load the workspace files for the configured agent instead of the default agent, though previously misfiled conversations may start fresh in the corrected agent store. [#&#8203;95118](https://github.com/openclaw/openclaw/pull/95118) Related [#&#8203;92903](https://github.com/openclaw/openclaw/issues/92903). Thanks [@&#8203;849261680](https://github.com/849261680), [@&#8203;axjing](https://github.com/axjing).
- People sharing an OpenClaw gateway can now assign different models to individual direct-message contacts across supported chat channels, while existing group and wildcard model choices keep working as before. [#&#8203;95120](https://github.com/openclaw/openclaw/pull/95120) Related [#&#8203;53638](https://github.com/openclaw/openclaw/issues/53638). Thanks [@&#8203;gandalf-at-lerian](https://github.com/gandalf-at-lerian), [@&#8203;thomaszta](https://github.com/thomaszta), [@&#8203;xydigit-zt](https://github.com/xydigit-zt).
- Telegram now shows that OpenClaw is still working during short initial previews or progress-mode replies instead of leaving the chat silent until the final message arrives. [#&#8203;95183](https://github.com/openclaw/openclaw/pull/95183) Related [#&#8203;95004](https://github.com/openclaw/openclaw/issues/95004). Thanks [@&#8203;obviyus](https://github.com/obviyus).
- Matrix users and operators now get a clear failure when a homeserver sends an oversized or stalled response, instead of OpenClaw continuing to buffer it and risking unbounded memory use. [#&#8203;95240](https://github.com/openclaw/openclaw/pull/95240) Thanks [@&#8203;alix-007](https://github.com/alix-007).
- Fixes delayed or missing Telegram and other queued channel replies in Kubernetes-style deployments with many injected environment variables, where opening the queue database could stall the gateway. [#&#8203;95278](https://github.com/openclaw/openclaw/pull/95278) Related [#&#8203;94571](https://github.com/openclaw/openclaw/issues/94571). Thanks [@&#8203;kaka-srp](https://github.com/kaka-srp).
- Telegram chats recover after one stuck message times out, allowing later messages in the same chat or topic to reach the agent without restarting the gateway. [#&#8203;95299](https://github.com/openclaw/openclaw/pull/95299) Related [#&#8203;95248](https://github.com/openclaw/openclaw/issues/95248). Thanks [@&#8203;kriegerbangerz-ship-it](https://github.com/kriegerbangerz-ship-it), [@&#8203;mikasa0818](https://github.com/mikasa0818), [@&#8203;obviyus](https://github.com/obviyus).
- When people switch between Telegram and another OpenClaw client in a shared direct conversation, short Telegram replies now follow the latest conversation instead of responding to an older, unrelated Telegram proposal. [#&#8203;95390](https://github.com/openclaw/openclaw/pull/95390) Related [#&#8203;95378](https://github.com/openclaw/openclaw/issues/95378). Thanks [@&#8203;maiduy708](https://github.com/maiduy708), [@&#8203;mikasa0818](https://github.com/mikasa0818), [@&#8203;obviyus](https://github.com/obviyus).
- Fixes completed assistant messages appearing twice in Telegram, Discord, Slack, and other streamed chats after a multi-message reply. [#&#8203;95432](https://github.com/openclaw/openclaw/pull/95432) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc), [@&#8203;yetval](https://github.com/yetval).
- WhatsApp replies now stay attached to the direct or group message being answered instead of appearing as a separate message that loses the conversation context. [#&#8203;95483](https://github.com/openclaw/openclaw/pull/95483) Thanks [@&#8203;mcaxtr](https://github.com/mcaxtr).
- Telegram rich-message replies now keep paragraphs, bullets, and status lines separated instead of collapsing multi-line content into one run-on block, with no configuration change required. [#&#8203;95532](https://github.com/openclaw/openclaw/pull/95532) Related [#&#8203;95409](https://github.com/openclaw/openclaw/issues/95409). Thanks [@&#8203;amknight](https://github.com/amknight).
- Mattermost operators who enable native slash commands can now use `/oc_queue` directly in Mattermost to tune active-run queuing, including its mode, debounce timing, cap, and drop handling. [#&#8203;95546](https://github.com/openclaw/openclaw/pull/95546) Thanks [@&#8203;amknight](https://github.com/amknight).
- Previously allowed messages keep reaching named accounts after legacy multi-account channel upgrades, with inherited DM and group access rules preserved across Mattermost, Discord, Slack, Telegram, Signal, WhatsApp, iMessage, and IRC. [#&#8203;95550](https://github.com/openclaw/openclaw/pull/95550) Thanks [@&#8203;amknight](https://github.com/amknight).
- Mattermost users can keep talking in a thread without mentioning the bot again after it replies, and that participation survives gateway restarts until the thread has been idle for seven days. [#&#8203;95552](https://github.com/openclaw/openclaw/pull/95552) Thanks [@&#8203;amknight](https://github.com/amknight).
- Inbound Telegram messages now reach the configured OpenClaw session promptly instead of sitting unanswered until the next polling interval, a gateway restart, or manual intervention. [#&#8203;95577](https://github.com/openclaw/openclaw/pull/95577) Related [#&#8203;86957](https://github.com/openclaw/openclaw/issues/86957). Thanks [@&#8203;freidrich-goldenflow](https://github.com/freidrich-goldenflow), [@&#8203;liuwqgit](https://github.com/liuwqgit).
- QQBot users now receive complete markdown tables when valid separators use one or two dashes per column, instead of losing the header and all but the final row. [#&#8203;95637](https://github.com/openclaw/openclaw/pull/95637) Thanks [@&#8203;ly-wang19](https://github.com/ly-wang19).
- Synology Chat users can now receive agent replies that take more than 120 seconds when the configured core timeout allows it, instead of having the channel reject them early. [#&#8203;95707](https://github.com/openclaw/openclaw/pull/95707) Thanks [@&#8203;sahibzada-allahyar](https://github.com/sahibzada-allahyar), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Telegram forum-topic cron jobs now keep separately configured failure alerts going to their intended destination, even when the main announcement uses a topic in the same chat. [#&#8203;95794](https://github.com/openclaw/openclaw/pull/95794) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Fixes WhatsApp group replies that could quote an older OpenClaw message instead of the user's triggering message, so final answers stay attached to the intended message when a reply target is available and avoid pointing back to stale bot context when it is not. [#&#8203;95914](https://github.com/openclaw/openclaw/pull/95914) Thanks [@&#8203;mcaxtr](https://github.com/mcaxtr).
- WhatsApp users can approve or deny prompts by reaction without the prompt staying stuck when WhatsApp identifies the same direct chat differently, while group approvals remain tied to the correct group and person. [#&#8203;95935](https://github.com/openclaw/openclaw/pull/95935) Thanks [@&#8203;mcaxtr](https://github.com/mcaxtr).
- Final reply processing now uses less CPU when OpenClaw checks whether block text was already sent, without changing which reply reaches the chat or how duplicate text is suppressed. [#&#8203;96087](https://github.com/openclaw/openclaw/pull/96087) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Exec approval results from external channel plugins now return to the channel or DM where the command started instead of falling back to WebChat or seeming to disappear after approval. [#&#8203;96140](https://github.com/openclaw/openclaw/pull/96140) Related [#&#8203;96103](https://github.com/openclaw/openclaw/issues/96103). Thanks [@&#8203;lansenger-pm](https://github.com/lansenger-pm), [@&#8203;vincentkoc](https://github.com/vincentkoc), [@&#8203;yetval](https://github.com/yetval).
- WhatsApp's final answer now stays quoted to the follow-up message a user just sent when replying to an older OpenClaw message, instead of arriving unquoted or pointing back to the older bot reply. [#&#8203;96220](https://github.com/openclaw/openclaw/pull/96220) Thanks [@&#8203;mcaxtr](https://github.com/mcaxtr).
- Nextcloud Talk bots now ignore ordinary file-share and lifecycle events without logging them as bot errors or risking disabled delivery, while malformed chat payloads still return an error. [#&#8203;96243](https://github.com/openclaw/openclaw/pull/96243) Related [#&#8203;81566](https://github.com/openclaw/openclaw/issues/81566). Thanks [@&#8203;arkyu2077](https://github.com/arkyu2077), [@&#8203;rafaelmgbh](https://github.com/rafaelmgbh), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Replies and message-tool delivery in Mattermost channels now use channel and thread guidance because the agent identifies those conversations as channels rather than group chats, while existing group-chat behavior remains unchanged. [#&#8203;96244](https://github.com/openclaw/openclaw/pull/96244) Related [#&#8203;95645](https://github.com/openclaw/openclaw/issues/95645). Thanks [@&#8203;arkyu2077](https://github.com/arkyu2077), [@&#8203;iloveleon19](https://github.com/iloveleon19), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- MCP channel integrations now keep conversation lists, message reads, event polls, and waits within predictable bounds even when a client requests excessive limits or timeouts. [a39e548](https://github.com/openclaw/openclaw/commit/a39e548ede228aa1978bf9d509613cbed6db0c99) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Long-running streamed auto-replies are less likely to stop early or abort inconsistently when an unusually large timeout is configured. [6c85b90](https://github.com/openclaw/openclaw/commit/6c85b90469f94955ef00c1609e1f1d6fd2cf4ca8) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Channel progress now shows a repeated status when work genuinely returns to it after another update, instead of hiding useful context as a duplicate. [8a75c4d](https://github.com/openclaw/openclaw/commit/8a75c4dd5f3e625a22a7a08c6e1f368798c48111)
- Completed channel replies no longer gain late progress notices, preventing stale status text from appearing after the answer is finished. [a594d2c](https://github.com/openclaw/openclaw/commit/a594d2ce73257326b7ab78adb3c4643245ec9431) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- During streaming channel replies, progress messages now keep showing the latest state instead of getting stuck on an older update. [e114001](https://github.com/openclaw/openclaw/commit/e114001ccafa83b8b366e095a9d7748dfc50c082) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Matrix forced resets now handle unavailable secret storage without a runtime error, treating recovery access as unavailable so the reset path can continue safely. [5c5a8a4](https://github.com/openclaw/openclaw/commit/5c5a8a49d76954b53fefc2463bc7b1d6b960e8fc) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Configured channels now remain visible in `openclaw channels status --json`, while scheduled announcements reject stale entries that have no active plugin to deliver them. [a641c0d](https://github.com/openclaw/openclaw/commit/a641c0d560fd15373e462829facf15fd6a466aeb)
- Discord voice conversations now keep back-to-back assistant responses moving, so a queued reply plays after the previous audio stream closes instead of remaining stuck. [88b64e4](https://github.com/openclaw/openclaw/commit/88b64e4b869e696d99de7417fb52425e9ed67cbf) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Discord progress previews are less likely to stop before the final edits when an agent response has already started arriving. [86ea382](https://github.com/openclaw/openclaw/commit/86ea382121b00e73af4b4c329d0a2447592e4071)
- Chats no longer show stray `NO_REPLY` text when the assistant means to stay silent, while legitimate media responses still arrive without the placeholder. [96c6f80](https://github.com/openclaw/openclaw/commit/96c6f8022c2420826830b11f4353ce855ab2ac5c)
- Telegram streaming replies now show each progress heading once, keeping tool and search updates easier to scan. [013e33c](https://github.com/openclaw/openclaw/commit/013e33c6d3672a980550912442bb1ac5505918aa) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Telegram messages that get stuck after a long-running task, crash, or gateway restart now resume processing automatically, so later messages no longer wait silently or require operators to repair the queue by hand. [#&#8203;97543](https://github.com/openclaw/openclaw/pull/97543) Thanks [@&#8203;romneyda](https://github.com/romneyda), [@&#8203;vincentkoc](https://github.com/vincentkoc).

##### Provider and model recovery

[Model setup](https://docs.openclaw.ai/providers/models), [OpenAI](https://docs.openclaw.ai/providers/openai), [OpenRouter](https://docs.openclaw.ai/providers/openrouter), [opencode-go](https://docs.openclaw.ai/providers/opencode-go), and [fast-mode](https://docs.openclaw.ai/tools/thinking#fast-mode-fast) follow-up behavior now recover more clearly in affected configurations.

- MiniMax text-to-speech and voice notes are less likely to fail because OpenClaw now explicitly requests the audio format it can decode instead of relying on provider defaults. [#&#8203;73079](https://github.com/openclaw/openclaw/pull/73079) Thanks [@&#8203;efe-arv](https://github.com/efe-arv).
- Gateway operators can again see provider, model, request status, and timing details in normal logs, making model-routing and transport problems easier to diagnose without enabling extra debug logging. [#&#8203;89648](https://github.com/openclaw/openclaw/pull/89648) Related [#&#8203;89300](https://github.com/openclaw/openclaw/issues/89300). Thanks [@&#8203;enominera](https://github.com/enominera), [@&#8203;xiaobao-k8s](https://github.com/xiaobao-k8s).
- Models reached through Google, Mistral, OpenAI Responses, Azure OpenAI Responses, and ChatGPT/Codex Responses now receive clean system instructions without OpenClaw's internal cache-boundary marker leaking into the prompt. [#&#8203;89716](https://github.com/openclaw/openclaw/pull/89716) Thanks [@&#8203;enominera](https://github.com/enominera), [@&#8203;masatohoshino](https://github.com/masatohoshino).
- Cron tool calls using Gemini models through OpenAI-compatible providers now run without nullable fields triggering provider schema rejections. [#&#8203;91559](https://github.com/openclaw/openclaw/pull/91559) Related [#&#8203;91542](https://github.com/openclaw/openclaw/issues/91542). Thanks [@&#8203;pick-cat](https://github.com/pick-cat), [@&#8203;qiukui666](https://github.com/qiukui666).
- Provider-qualified model IDs now honor their configured agent runtime policies and CLI aliases instead of unexpectedly falling back to OpenClaw's default runtime. [#&#8203;91724](https://github.com/openclaw/openclaw/pull/91724) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc), [@&#8203;yu-xin-c](https://github.com/yu-xin-c).
- The chat `/models` list and other plugin-aware model or provider selection paths now respond quickly instead of stalling for seconds and consuming a CPU core through repeated setup scans, while plugin changes still refresh normally. [#&#8203;93356](https://github.com/openclaw/openclaw/pull/93356) Thanks [@&#8203;obuchowski](https://github.com/obuchowski).
- Hosted Ollama Cloud users can keep only the models they explicitly configured after a restart, without the full shared catalog being added back, while automatic discovery continues for local and self-hosted Ollama servers. [#&#8203;93956](https://github.com/openclaw/openclaw/pull/93956) Thanks [@&#8203;jason-allen-oneal](https://github.com/jason-allen-oneal).
- Cron jobs can now retry or switch to a configured fallback model when a local provider returns the generic `LLM request failed.` error, instead of failing with the fallback unused. [#&#8203;94062](https://github.com/openclaw/openclaw/pull/94062) Related [#&#8203;93931](https://github.com/openclaw/openclaw/issues/93931). Thanks [@&#8203;hugenshen](https://github.com/hugenshen).
- Expired provider tokens no longer bury useful operator logs under repeated fallback warnings, while the first warning and later duplicate summaries remain available for diagnosis. [#&#8203;94233](https://github.com/openclaw/openclaw/pull/94233) Related [#&#8203;56979](https://github.com/openclaw/openclaw/issues/56979). Thanks [@&#8203;goutamadwant](https://github.com/goutamadwant), [@&#8203;yanan1991](https://github.com/yanan1991).
- Google Gemini 3.5 Flash can now be selected with its full 1,048,576-token context window, avoiding missing-model errors and needless prompt-size rejections. [#&#8203;94726](https://github.com/openclaw/openclaw/pull/94726) Related [#&#8203;94723](https://github.com/openclaw/openclaw/issues/94723). Thanks [@&#8203;ajwan8998](https://github.com/ajwan8998), [@&#8203;anguslogan01](https://github.com/anguslogan01), [@&#8203;kevinat](https://github.com/kevinat).
- Dashboard child sessions now handle allowed provider-qualified model choices consistently and give accurate recovery guidance when saved model state is stale. [#&#8203;94752](https://github.com/openclaw/openclaw/pull/94752) Related [#&#8203;94713](https://github.com/openclaw/openclaw/issues/94713). Thanks [@&#8203;gr4via](https://github.com/gr4via).
- Claude CLI users no longer get promises of completion updates that may never arrive, because OpenClaw now blocks unsupported native background work before it can strand progress. [#&#8203;95008](https://github.com/openclaw/openclaw/pull/95008) Thanks [@&#8203;anagnorisis2peripeteia](https://github.com/anagnorisis2peripeteia).
- OpenClaw now rejects oversized provider catalog or JSON responses with a clear error before buffering the entire response in memory. [#&#8203;95218](https://github.com/openclaw/openclaw/pull/95218) Thanks [@&#8203;alix-007](https://github.com/alix-007).
- OpenRouter users can now select and run the advertised short DeepSeek V4 model IDs without requests failing with `model_not_found` because OpenClaw sent a duplicated provider prefix. [#&#8203;95268](https://github.com/openclaw/openclaw/pull/95268) Related [#&#8203;95198](https://github.com/openclaw/openclaw/issues/95198). Thanks [@&#8203;daniel-alejandro-t](https://github.com/daniel-alejandro-t), [@&#8203;darren2030](https://github.com/darren2030).
- With `/reasoning on`, DeepSeek-style OpenAI-compatible models now show the final answer separately from their reasoning instead of folding it into the reasoning block, with no configuration change required. [#&#8203;95283](https://github.com/openclaw/openclaw/pull/95283) Related [#&#8203;95280](https://github.com/openclaw/openclaw/issues/95280). Thanks [@&#8203;marvinthebored](https://github.com/marvinthebored), [@&#8203;vincentkoc](https://github.com/vincentkoc), [@&#8203;zengwen-dt](https://github.com/zengwen-dt).
- When a Codex subscription reaches its usage limit, OpenClaw now moves to configured fallback models instead of stopping on the failed result, and it does not retry runs that already produced visible output. [#&#8203;95400](https://github.com/openclaw/openclaw/pull/95400) Thanks [@&#8203;jason-allen-oneal](https://github.com/jason-allen-oneal), [@&#8203;sallyom](https://github.com/sallyom).
- LM Studio users can now run quantized or multi-variant local models without false assistant-turn failures or phantom suffixed model entries caused by mismatched model keys. [#&#8203;95401](https://github.com/openclaw/openclaw/pull/95401) Thanks [@&#8203;monkeyleet](https://github.com/monkeyleet).
- Google-backed embedded-agent runs now stop reading oversized or never-ending prompt-cache responses before they can exhaust memory or leave the run stalled. [#&#8203;95417](https://github.com/openclaw/openclaw/pull/95417) Thanks [@&#8203;alix-007](https://github.com/alix-007).
- OpenRouter model scans fail safely on oversized or malformed catalogs instead of risking excessive memory use that can destabilize OpenClaw. [#&#8203;95418](https://github.com/openclaw/openclaw/pull/95418) Thanks [@&#8203;alix-007](https://github.com/alix-007).
- OpenRouter setups now reject oversized model catalogs before they can exhaust OpenClaw's memory, without caching or immediately refetching the failed response. [#&#8203;95420](https://github.com/openclaw/openclaw/pull/95420) Thanks [@&#8203;alix-007](https://github.com/alix-007), [@&#8203;sallyom](https://github.com/sallyom).
- Configured fallback models can now answer when Claude CLI runs out of credits or hits a generic runner failure, instead of leaving users with the failure message as the final response. [#&#8203;95508](https://github.com/openclaw/openclaw/pull/95508) Related [#&#8203;95489](https://github.com/openclaw/openclaw/issues/95489). Thanks [@&#8203;mikasa0818](https://github.com/mikasa0818), [@&#8203;riazrahaman](https://github.com/riazrahaman), [@&#8203;sallyom](https://github.com/sallyom).
- Gemini-backed web searches using `freshness: "day"` or `pd` now complete instead of failing with a provider 400 error, while broader freshness choices and explicit date ranges retain stricter filtering. [#&#8203;95682](https://github.com/openclaw/openclaw/pull/95682) Thanks [@&#8203;sunjae-k](https://github.com/sunjae-k), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Follow-up answers from xAI reasoning models such as Grok Composer now preserve earlier reasoning context more reliably, even when configurable reasoning effort is unsupported. [#&#8203;95686](https://github.com/openclaw/openclaw/pull/95686) Thanks [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev), [@&#8203;geraint0923](https://github.com/geraint0923).
- Vercel AI Gateway users can now run models chosen from the live catalog, including live-only model IDs that are absent from OpenClaw's bundled list. [#&#8203;95710](https://github.com/openclaw/openclaw/pull/95710) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Fixes manifest-defined providers turning valid model IDs into broken ones when `stripPrefixes` entries have stray spaces or different casing, so operators and plugin authors get the intended provider model. [#&#8203;95744](https://github.com/openclaw/openclaw/pull/95744) Related [#&#8203;95743](https://github.com/openclaw/openclaw/issues/95743). Thanks [@&#8203;parveshsaini](https://github.com/parveshsaini).
- First-run setup now opens the credential prompt for a newly installed external provider instead of appearing to loop and leaving OpenAI selected. [#&#8203;95792](https://github.com/openclaw/openclaw/pull/95792) Related [#&#8203;95765](https://github.com/openclaw/openclaw/issues/95765).
- Oversized or stalled provider catalogs now fail quickly with a clear error instead of hanging OpenClaw or consuming unbounded memory, while normal catalogs continue to load. [#&#8203;95827](https://github.com/openclaw/openclaw/pull/95827) Thanks [@&#8203;alix-007](https://github.com/alix-007).
- Xiaomi Token Plan users can now use up to 128K output tokens with `mimo-v2.5` and `mimo-v2.5-pro` instead of being stopped at the outdated 32,000-token limit. [#&#8203;95934](https://github.com/openclaw/openclaw/pull/95934) Thanks [@&#8203;idootop](https://github.com/idootop).
- Tool-heavy model responses can stream with less overhead while repeated tool-call IDs and encrypted reasoning details stay matched to the correct call across Google and OpenAI-compatible providers. [#&#8203;95957](https://github.com/openclaw/openclaw/pull/95957) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Token-usage accounting is more reliable for bundled ACPX users because OpenClaw now includes ACPX 0.11.2's persistence fix by default, without a separate package override or manual client update. [#&#8203;96124](https://github.com/openclaw/openclaw/pull/96124) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Ollama Cloud users can now find and select `glm-5.2:cloud` with its 1,000,000-token context window, reasoning, and tool support even when it is absent from the public model list. [11484f8](https://github.com/openclaw/openclaw/commit/11484f8a1483b7c42aa2971de2d88289fcef7046)
- MiniMax image-understanding requests no longer fail before reaching the provider when a timeout is zero, negative, or extremely large; invalid values now use a normal or safe maximum wait. [4b6182e](https://github.com/openclaw/openclaw/commit/4b6182ee2a250005e0c25edfeae4db6ec59b7cb8) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Codex runs now follow the current fast-mode choice instead of carrying over an old speed tier, and the status line clearly shows when fast mode is automatic. [77012f9](https://github.com/openclaw/openclaw/commit/77012f9807851c662e064d05097497a25ab13505) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Codex-backed conversations now return to normal routing after automatic fast mode is cleared, preventing later turns or model changes from reusing a stale priority tier. [8afc1f7](https://github.com/openclaw/openclaw/commit/8afc1f770bbef30a4d2d9957ef26a685c508448c)
- Fallback agent runs now honor each model's configured automatic fast-mode cutoff even when fast mode is overridden for the run, keeping fallback behavior aligned with the selected model policy. [efd3172](https://github.com/openclaw/openclaw/commit/efd3172662ce023eb8d6568b689361536edf06dd)
- Live model-switch retries now preserve the original fast-mode cutoff for long-running sessions, while explicit fast mode avoids misleading automatic-cutoff progress messages. [d990115](https://github.com/openclaw/openclaw/commit/d990115d1972fdf4361884a29bbf8396f33e5cba) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Embedded agent runs now keep automatic fast mode working consistently through retries and progress updates without confusing it with a manually selected fast-mode setting. [cf1b6fe](https://github.com/openclaw/openclaw/commit/cf1b6fef4403bee7c206299efc4385a7fcb74375) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Fast-mode runs now keep their speed setting through model fallback retries and show the configured automatic threshold in status, avoiding inconsistent retry behavior and an unhelpful generic label. [aa3797c](https://github.com/openclaw/openclaw/commit/aa3797c8d0d74b4502d24852ce6baa70286f2f06) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Agent replies and scheduled cron runs now handle fast-mode fallback retries more reliably, keeping the state needed for the final attempt to finish or report progress correctly. [14e448e](https://github.com/openclaw/openclaw/commit/14e448e0e13db9f194ea16bb98e0f846a67769fd) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Users no longer see a fast-mode reset notice while model fallback attempts are still running; it appears only when the run reaches its final fallback attempt. [6eb72a8](https://github.com/openclaw/openclaw/commit/6eb72a830ece3e2b4c6c85e5a9c2b72b59e0dae9)
- Users and operators now get clearer handling when a configured live model becomes unavailable because OpenClaw recognizes the provider's "selected model was not found" response as a model-not-found failure instead of a generic error. [2405d02](https://github.com/openclaw/openclaw/commit/2405d029d437ee58ab94da800a5b213bc6bf4628) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Qwen and vLLM now preserve existing chat-template settings consistently when thinking is switched on or off, and provider plugins can use the same tested helper. [2ba9d6e](https://github.com/openclaw/openclaw/commit/2ba9d6eabef9427a950bacc47f077200446cb865) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- OpenAI-compatible proxy providers can handle thinking levels and legacy `reasoning_effort` fields more consistently, with plugin developers and provider maintainers using one documented normalization helper across OpenRouter, Kilocode, and the SDK. [35bafea](https://github.com/openclaw/openclaw/commit/35bafea757fab0386292951a3dc2a2d3514f370e)
- Browser and Vite builds can now load the OpenAI ChatGPT Responses provider without a server-only dependency breaking the bundle, while WebSocket failures still appear normally. [8c8eb86](https://github.com/openclaw/openclaw/commit/8c8eb86fff6e843bd391808ceee249ac8c7f5fa5) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- OpenRouter model scans now accept the same larger valid catalogs as runtime discovery while still rejecting oversized responses before they can consume unbounded memory. [ad3b2f4](https://github.com/openclaw/openclaw/commit/ad3b2f4b8827cd73b4c1a6c8288569c0966276fe) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- OpenAI Responses users, including affected Bedrock Mantle GPT-5.x reasoning setups, now get one clean final answer with aligned saved transcripts and replay context instead of dozens of repeated cumulative copies. [#&#8203;92399](https://github.com/openclaw/openclaw/pull/92399) Related [#&#8203;91959](https://github.com/openclaw/openclaw/issues/91959). Thanks [@&#8203;amersheeny](https://github.com/amersheeny), [@&#8203;daimingnj](https://github.com/daimingnj), [@&#8203;phoenixyy](https://github.com/phoenixyy), [@&#8203;pigfoot](https://github.com/pigfoot).
- Scheduled jobs and isolated sessions using opencode-go models now move stalled requests into configured timeout or fallback handling instead of hanging for minutes before ending with a generic `LLM request failed` error. [#&#8203;93965](https://github.com/openclaw/openclaw/pull/93965) Related [#&#8203;93610](https://github.com/openclaw/openclaw/issues/93610). Thanks [@&#8203;forceconstant](https://github.com/forceconstant), [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt).

##### Session, memory, and trust continuity

[Sessions](https://docs.openclaw.ai/concepts/session), [compaction](https://docs.openclaw.ai/concepts/compaction), [memory](https://docs.openclaw.ai/concepts/memory), [QMD-backed memory](https://docs.openclaw.ai/concepts/memory-qmd), and [Tool Search](https://docs.openclaw.ai/tools/tool-search) retain useful state more consistently, while [Matrix](https://docs.openclaw.ai/channels/matrix) recovery, [tool policies](https://docs.openclaw.ai/gateway/sandbox-vs-tool-policy-vs-elevated), and [approvals](https://docs.openclaw.ai/cli/approvals) stay attached to the intended trust boundary.

- Affected agent conversations using OpenAI Responses can now recover and keep replying after a visible channel response leaves their saved history incomplete, instead of every later turn failing before a reply appears. [#&#8203;84708](https://github.com/openclaw/openclaw/pull/84708) Thanks [@&#8203;anyech](https://github.com/anyech).
- When a Codex-backed agent produces unusually large tool output, saved and replayed conversations now keep its text within the usual size limit while leaving non-text content unchanged. [#&#8203;87912](https://github.com/openclaw/openclaw/pull/87912) Thanks [@&#8203;adrianip0204](https://github.com/adrianip0204).
- Control UI conversations now stay visible and continue in the same session after a sleep, network drop, or Gateway reconnect instead of disappearing when the next message is sent. [#&#8203;89017](https://github.com/openclaw/openclaw/pull/89017) Related [#&#8203;87700](https://github.com/openclaw/openclaw/issues/87700). Thanks [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt), [@&#8203;asicoe](https://github.com/asicoe).
- Bundled Codex and Copilot integrations now keep mirrored chat history and transcript updates tied to the correct OpenClaw session as storage evolves, while existing file-backed active transcripts continue working during the migration. [#&#8203;89518](https://github.com/openclaw/openclaw/pull/89518) Thanks [@&#8203;jalehman](https://github.com/jalehman).
- WebChat's current-session status now matches the conversation you are actually using, so the session identity, thinking level, token context, and cost details no longer come from the fallback `main` session. [#&#8203;89800](https://github.com/openclaw/openclaw/pull/89800) Related [#&#8203;89773](https://github.com/openclaw/openclaw/issues/89773). Thanks [@&#8203;killo3967](https://github.com/killo3967), [@&#8203;sweetcornna](https://github.com/sweetcornna).
- Your conversation is less likely to lose its context after you press stop during automatic compaction because the compaction request is now cancelled too. [#&#8203;89886](https://github.com/openclaw/openclaw/pull/89886) Related [#&#8203;89868](https://github.com/openclaw/openclaw/issues/89868). Thanks [@&#8203;lykeion-dev](https://github.com/lykeion-dev), [@&#8203;openperf](https://github.com/openperf), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- When cross-agent session access is blocked, OpenClaw now lists all required visibility, agent-to-agent, and allow-list settings, helping operators correct policy configuration instead of chasing a nonexistent agent failure. [#&#8203;90489](https://github.com/openclaw/openclaw/pull/90489) Related [#&#8203;90443](https://github.com/openclaw/openclaw/issues/90443). Thanks [@&#8203;ramitrkar-hash](https://github.com/ramitrkar-hash), [@&#8203;sahibzada-allahyar](https://github.com/sahibzada-allahyar), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- `openclaw memory status` now shows an active light or REM dreaming phase instead of incorrectly reporting `Dreaming: off`, so operators can see that valid memory configurations are enabled. [#&#8203;93113](https://github.com/openclaw/openclaw/pull/93113) Related [#&#8203;67868](https://github.com/openclaw/openclaw/issues/67868). Thanks [@&#8203;agentarclab](https://github.com/agentarclab), [@&#8203;mrossit](https://github.com/mrossit).
- Timed-out QMD memory searches now stop their background work when the agent moves on, preventing abandoned processes from continuing to consume CPU and memory. [#&#8203;93394](https://github.com/openclaw/openclaw/pull/93394) Thanks [@&#8203;alix-007](https://github.com/alix-007).
- Repeated instructions sent after compaction now remain in the conversation, preventing lost turns, orphaned replies, and malformed history that some providers reject. [#&#8203;94328](https://github.com/openclaw/openclaw/pull/94328) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc), [@&#8203;yetval](https://github.com/yetval).
- Memory Wiki's Stale Pages report now leaves durable concept and synthesis pages out of freshness warnings, keeping attention on source and entity pages that may actually need review. [#&#8203;94369](https://github.com/openclaw/openclaw/pull/94369) Thanks [@&#8203;sunnyshu0925](https://github.com/sunnyshu0925), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Long embedded runs with recent progress are now less likely to be interrupted by stale-session recovery, while genuinely stalled runs can still be cleared so queued work continues. [#&#8203;94701](https://github.com/openclaw/openclaw/pull/94701) Thanks [@&#8203;imadal1n](https://github.com/imadal1n), [@&#8203;mrclawfield](https://github.com/mrclawfield).
- Ollama memory search now respects a configured smaller embedding dimension and keeps indexes for different dimensions separate, avoiding incompatible vectors being mixed together. [#&#8203;94811](https://github.com/openclaw/openclaw/pull/94811) Thanks [@&#8203;mushuiyu886](https://github.com/mushuiyu886).
- Memory searches and targeted refreshes now stay connected to the correct OpenClaw session even when transcript filenames change or QMD exports use a different name. [#&#8203;95087](https://github.com/openclaw/openclaw/pull/95087) Thanks [@&#8203;jalehman](https://github.com/jalehman).
- Long-running conversations with screenshots or other images now keep their continuity more consistently when OpenClaw makes room for new messages, instead of repeatedly filling up without moving the retained conversation forward. [#&#8203;95128](https://github.com/openclaw/openclaw/pull/95128) Thanks [@&#8203;yetval](https://github.com/yetval).
- Windows users can now run QMD-backed memory indexing and search through configured absolute `memory.qmd.command` paths, including drive-letter and UNC locations, without OpenClaw stripping the path separators before launch. [#&#8203;95274](https://github.com/openclaw/openclaw/pull/95274) Related [#&#8203;92302](https://github.com/openclaw/openclaw/issues/92302). Thanks [@&#8203;ardooken](https://github.com/ardooken), [@&#8203;ly85206559](https://github.com/ly85206559).
- Usage footers selected with `/usage full` or `/usage tokens` now remain visible after daily or idle session rollover, so users do not have to turn them on again. [#&#8203;95322](https://github.com/openclaw/openclaw/pull/95322) Thanks [@&#8203;litang9](https://github.com/litang9).
- Follow-up replies, reactions, threaded messages, and status checks stay with the chat they belong to after webchat or system activity, while real channel switches still clear outdated routing details. [#&#8203;95467](https://github.com/openclaw/openclaw/pull/95467) Thanks [@&#8203;yetval](https://github.com/yetval).
- Long-running main conversations now keep their prior context when users return after an overnight or delayed follow-up, rather than silently starting over after an otherwise normal completion. [#&#8203;95472](https://github.com/openclaw/openclaw/pull/95472) Thanks [@&#8203;xydt-tanshanshan](https://github.com/xydt-tanshanshan).
- People with large session histories can list, preview, and find sessions without multi-second freezes, while older mixed-case session keys are still migrated at startup. [#&#8203;95699](https://github.com/openclaw/openclaw/pull/95699) Thanks [@&#8203;jalehman](https://github.com/jalehman), [@&#8203;jzakirov](https://github.com/jzakirov).
- Fixes delivered replies sometimes being saved to the wrong conversation history, or omitted from it, when operators use a custom or per-agent `session.store`, improving continuity and auditability for the intended session. [#&#8203;95782](https://github.com/openclaw/openclaw/pull/95782) Related [#&#8203;95781](https://github.com/openclaw/openclaw/issues/95781). Thanks [@&#8203;youngting520](https://github.com/youngting520).
- Saved session-memory summaries now leave out raw model tokens, tool-call blocks, media placeholders, role tags, and stale `NO_REPLY` markers so future conversations keep useful context. [#&#8203;95791](https://github.com/openclaw/openclaw/pull/95791) Thanks [@&#8203;sweetsophia](https://github.com/sweetsophia), [@&#8203;vincentkoc](https://github.com/vincentkoc), [@&#8203;yb0y](https://github.com/yb0y).
- Long-running OpenAI sessions using Codex/ChatGPT OAuth can now compact without a separate API key, whether `/compact` is run manually or triggered automatically. [#&#8203;95831](https://github.com/openclaw/openclaw/pull/95831) Related [#&#8203;95693](https://github.com/openclaw/openclaw/issues/95693). Thanks [@&#8203;sallyom](https://github.com/sallyom), [@&#8203;yui-tien](https://github.com/yui-tien).
- Long, tool-heavy sessions now compact oversized conversations instead of getting stuck when a large tool result appears at the end. [#&#8203;95860](https://github.com/openclaw/openclaw/pull/95860) Related [#&#8203;78478](https://github.com/openclaw/openclaw/issues/78478). Thanks [@&#8203;jw8957](https://github.com/jw8957), [@&#8203;wzhgba](https://github.com/wzhgba), [@&#8203;yetval](https://github.com/yetval).
- When `memory_search` is unavailable because the Node runtime lacks `node:sqlite`, OpenClaw now points users to a compatible runtime instead of sending them through unrelated embedding-provider troubleshooting. [#&#8203;95916](https://github.com/openclaw/openclaw/pull/95916) Thanks [@&#8203;rrrrrredy](https://github.com/rrrrrredy), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Developers and operators inspecting a compacted Copilot session now get its summary, before-and-after token counts, and session details instead of an incomplete result. [#&#8203;96049](https://github.com/openclaw/openclaw/pull/96049) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- The `/stop` and abort commands now keep stopping active runs, clearing queued followups, and ending related subagents promptly even when session keys need canonicalizing or abort metadata cannot be saved. [#&#8203;96201](https://github.com/openclaw/openclaw/pull/96201) Thanks [@&#8203;jalehman](https://github.com/jalehman).
- Voice Wake upgrades now keep existing trigger phrases and routing rules working as OpenClaw moves them from retired settings files into the shared state database. [bdf81a8](https://github.com/openclaw/openclaw/commit/bdf81a825fa3ef66ad2c535c1eeb0bb4e31b6d1b)
- Upgrades from older OpenClaw state layouts now preserve update notifications, check throttling, available-version records, and automatic-update attempt history as that state moves into SQLite. [eb00d49](https://github.com/openclaw/openclaw/commit/eb00d499d16feea600fceef92d575fa30f005649) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Plugin-channel conversations keep their intended session more reliably through startup, doctor checks, and state repairs, with older binding records migrated into OpenClaw's shared database. [9f888d9](https://github.com/openclaw/openclaw/commit/9f888d95e082d50380a66db18ee2e32683e688e0)
- Windows memory-backed session syncing now keeps using the intended transcript file even when path formatting differs. [b3b5b08](https://github.com/openclaw/openclaw/commit/b3b5b08e67a26efd648c7c7d879e5487223cd796) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Embedded agent runs with a missing or blank session key now stay attached to the intended session instead of being sent through inconsistent session routing. [911f853](https://github.com/openclaw/openclaw/commit/911f853b7fc4d819e2175b001662a01eba30453d) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- When a model guesses the wrong tool name, Tool Search and Code Mode now show how to find and retry the correct tool, reducing the risk that long-running sessions get stuck or lose durable memory during compaction. [#&#8203;93374](https://github.com/openclaw/openclaw/pull/93374) Related [#&#8203;92273](https://github.com/openclaw/openclaw/issues/92273). Thanks [@&#8203;mushuiyu886](https://github.com/mushuiyu886), [@&#8203;poison](https://github.com/poison), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Fixes assistant replies disappearing from webchat, Control UI, Feishu, and other embedded conversations after compaction, keeping refreshed chats readable and follow-up requests separate. [#&#8203;95484](https://github.com/openclaw/openclaw/pull/95484) Related [#&#8203;76729](https://github.com/openclaw/openclaw/issues/76729). Thanks [@&#8203;maweibin](https://github.com/maweibin), [@&#8203;njuboy11](https://github.com/njuboy11), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- OpenClaw memory features now keep active, reset, and deleted transcript coverage aligned with configured session stores and agent ownership, making dreaming, QMD exports, indexing, and sync less likely to miss or misattribute conversation history. [#&#8203;96162](https://github.com/openclaw/openclaw/pull/96162) Thanks [@&#8203;jalehman](https://github.com/jalehman).
- Gateway TLS setup now rejects blank certificate or key paths clearly or uses OpenClaw's defaults, avoiding confusing startup and certificate-generation failures while preserving valid paths. [#&#8203;94054](https://github.com/openclaw/openclaw/pull/94054) Thanks [@&#8203;miorbnli](https://github.com/miorbnli).
- Configured plugin policies keep blocking or rewriting sensitive tool calls after Gateway registry changes, reloads, or later hook initialization instead of being silently skipped. [#&#8203;94545](https://github.com/openclaw/openclaw/pull/94545) Thanks [@&#8203;jesse-merhi](https://github.com/jesse-merhi).
- Mobile operators with `operator.approvals` can now see and resolve chat-triggered exec approvals on the iOS device that started the request, including while the app is open, without relying only on push notifications. [#&#8203;95175](https://github.com/openclaw/openclaw/pull/95175) Thanks [@&#8203;joshavant](https://github.com/joshavant).
- Control UI users now get the patched DOMPurify release, reducing exposure to the GHSA-cmwh-pvxp-8882 sanitizer vulnerability without changing how the interface behaves. [#&#8203;95691](https://github.com/openclaw/openclaw/pull/95691) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- "Always allow" approvals for plugin conversation bindings now carry over from the old settings file and are less likely to be lost or overwritten when multiple OpenClaw processes are running. [ae41b00](https://github.com/openclaw/openclaw/commit/ae41b009224b0a8e3a990912503258d4478fb4d0) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Matrix users now see that the active recovery key is required before a forced cross-signing reset can proceed, preventing a second reset from leaving encryption recovery and room-key backups unusable. [#&#8203;95720](https://github.com/openclaw/openclaw/pull/95720) Related [#&#8203;78396](https://github.com/openclaw/openclaw/issues/78396). Thanks [@&#8203;jteddy](https://github.com/jteddy), [@&#8203;vincentkoc](https://github.com/vincentkoc), [@&#8203;xialonglee](https://github.com/xialonglee).

##### Slack router relay mode

[Slack router relay mode](https://docs.openclaw.ai/channels/slack) gives managed and multi-gateway deployments a supported way to centralize incoming Slack traffic while preserving gateway ownership of mentions, threads, and replies.

- Managed Slack deployments can now use a central router to send mentions and ongoing threads to the right OpenClaw gateway while replies still appear through Slack. [#&#8203;94707](https://github.com/openclaw/openclaw/pull/94707) Thanks [@&#8203;pash-openai](https://github.com/pash-openai), [@&#8203;sjf-oa](https://github.com/sjf-oa).

##### Raft External Agent wake bridge

The [Raft channel](https://docs.openclaw.ai/channels/raft) and [Raft plugin](https://docs.openclaw.ai/plugins/reference/raft) now support the local CLI wake path for External Agents.

- Raft External Agent operators can now wake an OpenClaw agent when a workspace has pending work through the supported local CLI bridge, with named profiles and checks for missing CLI prerequisites. [#&#8203;95497](https://github.com/openclaw/openclaw/pull/95497) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).

##### Official plugin installation and repair

[Plugin management](https://docs.openclaw.ai/plugins/manage-plugins) and the [plugin inventory](https://docs.openclaw.ai/plugins/plugin-inventory) now cover more official integrations through normal installation, update, and repair workflows.

- When `plugins.allow` uses a channel or package name instead of the real plugin id, startup guidance now identifies the unmatched entry and shows the discovered plugin ids needed to correct the configuration. [#&#8203;68389](https://github.com/openclaw/openclaw/pull/68389) Related [#&#8203;68352](https://github.com/openclaw/openclaw/issues/68352). Thanks [@&#8203;aym9999](https://github.com/aym9999), [@&#8203;jirboy](https://github.com/jirboy), [@&#8203;lyfuci](https://github.com/lyfuci), [@&#8203;pahuchi-joe](https://github.com/pahuchi-joe), [@&#8203;zmxccxy](https://github.com/zmxccxy).
- Plugin trust warnings for first-time or fresh installs now include a ready-to-copy `plugins.allow` example and commands to list or inspect plugin ids, so users can resolve the warning before trusting or reinstalling plugin code. [#&#8203;78105](https://github.com/openclaw/openclaw/pull/78105) Related [#&#8203;68780](https://github.com/openclaw/openclaw/issues/68780). Thanks [@&#8203;jirboy](https://github.com/jirboy), [@&#8203;pahuchi-joe](https://github.com/pahuchi-joe).
- Codex migrations now work with standard global plugin installs because `openclaw migrate` can find the installed provider instead of failing with `Unknown migration provider`. [#&#8203;89612](https://github.com/openclaw/openclaw/pull/89612) Related [#&#8203;89609](https://github.com/openclaw/openclaw/issues/89609). Thanks [@&#8203;mugabuga](https://github.com/mugabuga), [@&#8203;zerone0x](https://github.com/zerone0x).
- Plugin installs and updates recover from stale OpenClaw-managed dependency pins instead of failing with `npm EOVERRIDE`, without later synchronization downgrading or removing packages users installed explicitly. [#&#8203;91786](https://github.com/openclaw/openclaw/pull/91786) Related [#&#8203;91772](https://github.com/openclaw/openclaw/issues/91772). Thanks [@&#8203;amknight](https://github.com/amknight), [@&#8203;mkdelta221](https://github.com/mkdelta221).
- Channel plugin developers can now carry native sender and conversation identifiers through hooks and selected exec workflows, giving integrations more precise routing without breaking existing sender and chat fields. [#&#8203;91903](https://github.com/openclaw/openclaw/pull/91903) Thanks [@&#8203;lanzhi-lee](https://github.com/lanzhi-lee), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Plugin discovery now repeats fewer blocking filesystem checks during startup, reducing avoidable cold-start work for bundled plugin trees, especially on slower Windows filesystems, without changing bundle discovery behavior. [#&#8203;93919](https://github.com/openclaw/openclaw/pull/93919) Related [#&#8203;76209](https://github.com/openclaw/openclaw/issues/76209). Thanks [@&#8203;ml12580](https://github.com/ml12580), [@&#8203;shenhonglong456-ai](https://github.com/shenhonglong456-ai).
- Plugin Gateway methods now work through `openclaw gateway call` after registration, so plugin authors can use them from scripts and cron jobs instead of hitting an `unknown method` error. [#&#8203;94154](https://github.com/openclaw/openclaw/pull/94154) Related [#&#8203;94127](https://github.com/openclaw/openclaw/issues/94127). Thanks [@&#8203;brycemurray](https://github.com/brycemurray), [@&#8203;pick-cat](https://github.com/pick-cat), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- ClawHub skill discovery and install checks are less likely to stall or crash OpenClaw because oversized or stalled marketplace responses are now stopped before they can exhaust memory. [#&#8203;95226](https://github.com/openclaw/openclaw/pull/95226) Thanks [@&#8203;alix-007](https://github.com/alix-007).
- Pinned official plugins no longer stay on an old release when operators follow the repair advice from `openclaw doctor` or deep gateway status after an upgrade. [#&#8203;95541](https://github.com/openclaw/openclaw/pull/95541) Thanks [@&#8203;ooiuuii](https://github.com/ooiuuii), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Managed npm plugin updates are less likely to break work on a running gateway with missing-module errors, because the older plugin files remain available until a later gateway start cleans them up. [#&#8203;95589](https://github.com/openclaw/openclaw/pull/95589) Thanks [@&#8203;ooiuuii](https://github.com/ooiuuii), [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Official plugin cards for supported brands now show recognizable icons in ClawHub and other catalogs, and plugin authors can provide marketplace artwork through the documented manifest field. [#&#8203;95845](https://github.com/openclaw/openclaw/pull/95845) Thanks [@&#8203;patrick-erichsen](https://github.com/patrick-erichsen).
- Official plugin icons in ClawHub and other catalogs are no longer forced into the same hard-coded color, allowing Simple Icons to use its default artwork instead. [#&#8203;95987](https://github.com/openclaw/openclaw/pull/95987) Thanks [@&#8203;patrick-erichsen](https://github.com/patrick-erichsen).
- Docker users now have an official `openclaw/openclaw` Docker Hub mirror alongside GHCR, with versioned beta releases kept from moving the stable `latest` and `main` aliases. [#&#8203;97122](https://github.com/openclaw/openclaw/pull/97122) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Git-based OpenClaw installs now use the repository's pinned pnpm version even when another global pnpm or surrounding project package manager is present, so setup commands no longer run against the wrong package-manager environment. [bd74a62](https://github.com/openclaw/openclaw/commit/bd74a62118aa4774706359d9494116ded8c1f6e3) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- ClawHub skill-card and update requests now complete or time out predictably even when they receive an unusually large timeout value. [8cd0c11](https://github.com/openclaw/openclaw/commit/8cd0c11227f6f4096d089cd6108d6f2ae31252b7) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Windows users can complete source installs without a llama.cpp setup step blocking or slowing them, and the installer restores their existing shell setting afterward. [ea9065b](https://github.com/openclaw/openclaw/commit/ea9065bc68dd4ff94495b85a7dcb4491cf41b67a) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- More official channel, provider, and web-search plugins can now be installed or repaired through normal external package catalogs while still being recognized from their existing credentials. [#&#8203;95683](https://github.com/openclaw/openclaw/pull/95683) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).

##### Channels and Messaging

##### Additional channel fixes

Additional [Telegram](https://docs.openclaw.ai/channels/telegram) and channel configuration fixes cover narrower delivery and setup problems.

- Telegram reply chains keep cached replies attached after context changes instead of failing when those cached replies are reused. [#&#8203;82909](https://github.com/openclaw/openclaw/pull/82909) Thanks [@&#8203;lidge-jun](https://github.com/lidge-jun).
- Fixes Discord dropping an entire long reply with fenced code blocks when a closing code fence lands near the 2,000-character message limit. [#&#8203;95661](https://github.com/openclaw/openclaw/pull/95661) Thanks [@&#8203;ly-wang19](https://github.com/ly-wang19).
- Slack operators can now store tokens and signing secrets as supported SecretRef inputs, while reads, writes, allowlist and target lookups, and setup checks use the resolved credentials instead of rejecting or misreading the references. [7da955f](https://github.com/openclaw/openclaw/commit/7da955fae4ca2083599aa33a1f93dbfff53cb187) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Channel capability checks now return a clear timeout when an integration stops responding, keeping troubleshooting from hanging in a terminal or automation run. [8ecdb97](https://github.com/openclaw/openclaw/commit/8ecdb97b636e4c3fcc6d142d217327404ae06581) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc).

##### Providers and Models

##### Additional provider and model fixes

Additional [model configuration](https://docs.openclaw.ai/providers/models) fixes improve selection, usage reporting, status output, and streaming.

- After changing the default model, starting a fresh channel session with `/new` or `/reset` now uses the new default instead of silently reusing the previous cached model, while explicit `/model` overrides remain unchanged. [#&#8203;77339](https://github.com/openclaw/openclaw/pull/77339) Related [#&#8203;77322](https://github.com/openclaw/openclaw/issues/77322). Thanks [@&#8203;mjamiv](https://github.com/mjamiv), [@&#8203;zaynl](https://github.com/zaynl).
- Behind HTTP or HTTPS proxies, Codex/OpenAI usage and quota checks in `openclaw status --usage --json` and the Control UI now retrieve usage windows instead of failing when chatgpt.com is unreachable directly. [#&#8203;93943](https://github.com/openclaw/openclaw/pull/93943) Related [#&#8203;78714](https://github.com/openclaw/openclaw/issues/78714). Thanks [@&#8203;tnzgit](https://github.com/tnzgit), [@&#8203;turbotheturtle](https://github.com/turbotheturtle).
- `/status` now keeps the active model and how to clear a pinned choice on one compact line, so Discord and other chat users can scan model status without a multi-line explanation. [#&#8203;95797](https://github.com/openclaw/openclaw/pull/95797) Thanks [@&#8203;solvely-colin](https://github.com/solvely-colin).
- Anthropic streaming responses now keep interleaved text, thinking, and tool-call updates …
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling extensions: opencode-go merge-risk: 🚨 availability 🚨 May cause crashes, hangs, restart loops, stalls, or process outages. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P1 High-priority user-facing bug, regression, or broken workflow. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: XL 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.

[Bug]: opencode-go provider streaming — API calls complete on provider side but gateway never receives stream termination signal

1 participant