# Changelog Docs: https://docs.openclaw.ai ## Unreleased ### Changes - **Release validation:** defer beta candidate Parallels smoke to postpublish `release:beta-smoke` by default, keep stable/full prepublish coverage, and bound nested release workflow monitors with explicit job timeouts. - **macOS app profiles:** isolate named app instances across state, preferences, Keychain, Gateway services, and duplicate-instance ownership while keeping host-global login and node services untouched. - **Developer workflow:** remove the obsolete scoped-commit helper and use standard Git commands in isolated worktrees. - **Plugin uninstall cleanup:** remove exact recorded install paths from `plugins.load.paths` for marketplace, npm, and other managed installs while preserving parent, child, prefix, and unrelated paths. - Fixed Crabbox hydration on unprivileged cloud sandboxes by falling back to a user-writable pnpm store when the shared `/var/cache/crabbox` cache is unavailable, preserving the hardlink import mode after hydration, and making Docker an explicit routed capability instead of an implicit install requirement. - **Browser extension relay CDP compat:** answer `Target.getBrowserContexts` so Puppeteer-based clients (chrome-devtools-mcp) can drive the paired Chrome without the remote-debugging permission prompt, serve DevTools-style `/json/list` target descriptors, and add `openclaw browser extension cdp` to print the relay endpoint plus auth header for external CDP clients. - **Local model setup:** advertise provider-owned Ollama, llama.cpp, and LM Studio setup choices to Control UI and macOS, retry unavailable LM Studio services in place, and verify the exact prepared model before showing success. - **Control UI first-run setup:** continue verified model setup into Custodian, explain that the web app is ready without a channel, and offer an optional dismissible path to Channels. - **Fish Audio speech:** add hosted S2.1 synthesis with streaming, voice notes, voice discovery, and telephony, plus local Fish S2 Pro reference-voice streaming in native macOS Talk. Thanks @Conan-Scott for the earlier community-plugin implementation. - **Control UI cloud workspace conflicts:** surface staged-ref guidance, bounded conflicted paths, structured transcript events, and sidebar attention for cloud worker results that kept local versions. - **Control UI update recovery:** the "A new version is available" Reload button now waits out the gateway restart that stranded the chunk and reloads as soon as it answers, instead of silently doing nothing and leaving a manual hard reload as the only way out. - **Control UI sender identity polish:** attributed user messages show the author's real avatar in an always-visible gutter on identity-resolving gateways, sender labels drop the opaque profile-UUID suffix (new and historical transcripts), and profile-id senders resolve avatars through the canonical gateway route. - **Control UI who's-online roster:** click the sidebar footer facepile to open a scrollable roster of everyone online, showing each person's avatar, name, and email with your own entry pinned first. - **Discord and Slack native login:** register `/login` in native command menus while keeping pairing-code issuance limited to private chats and the Web UI. - **Control UI user profiles:** let trusted-proxy users manage their own display name and avatar, resolve attributed chat and presence identities through uploaded avatars or a private cached Gravatar proxy, and keep other users' profiles admin-only. - **Trusted-proxy browser pairing:** optionally auto-approve new Control UI and WebChat devices from allowlisted proxy identities with non-admin scope caps, while keeping existing-device upgrades manual. - **Channel plugin ingress monitors:** add a shared plugin SDK monitor for durable admission, polling, pruning, claim identity validation, adoption handoff, and shutdown, and migrate IRC, Synology Chat, and Google Chat to the shared lifecycle. - **Dashboard MCP apps:** pin originating-session MCP app views as living dashboard widgets, renew their sandboxed view leases, and keep tool interactivity behind revision-bound grants with graceful stale-state recovery. - **External gateway supervision:** add `OPENCLAW_SUPERVISOR_MODE=external` for lifecycle owners such as OCM, preserving verified restart and deferral behavior without exposing native service authority, blocking native service mutation and self-update, and providing a versioned atomic restart-handoff consume contract. Thanks @shakkernerd. - **Buzz message fidelity:** preserve Markdown output and accept Buzz normal, rich-content, and structured-diff room messages through the existing authorized inbound path. Thanks @shakkernerd. - **Buzz typing indicators:** show room- and thread-scoped typing during agent replies and heartbeat deliveries, refresh through the active authenticated connection without waiting for relay acknowledgement, and drop ephemeral updates safely during disconnects or shutdown. Thanks @shakkernerd. - **Buzz sender directory:** expose current bot, member, room, and room-member directory entries from bounded relay state; use current Buzz profile and room names in inbound context while preserving public keys and UUIDs as stable authorization and routing identities. Thanks @shakkernerd. - **Buzz native mentions:** resolve unique current room-member names and explicit NIP-27 identities into native `p` tags for replies, proactive sends, and bounded standalone delivery; reject out-of-room identities and unresolved labels without an explicit identity, and preserve Buzz reply-thread session parsing during maintenance and heartbeat runs. Thanks @shakkernerd. - **ClickClack guided setup:** configure ClickClack from `openclaw onboard` or `openclaw channels add clickclack` with URL, token, and workspace prompts, default-account env fallback, nonfatal live connection validation, and gateway-aware next steps that connect automatically when OpenClaw is already running. Thanks @shakkernerd. - **ClickClack command menus:** publish each bot's native OpenClaw commands to ClickClack composer autocomplete at gateway startup, with per-account opt-out and nonfatal compatibility handling for older tokens and servers. Thanks @shakkernerd. - **ClickClack bot collaboration:** add opt-in bot-authored inbound dispatch with explicit sender authorization, mention gating, retry-safe loop protection, and independent thread budgets while keeping bot traffic denied by default. Thanks @jjjhenriksen and @shakkernerd. - **Skill Workshop approvals:** run agent-initiated apply, reject, and quarantine actions without an additional approval prompt by default while preserving `skills.workshop.approvalPolicy: "pending"` as an opt-in approval gate. Thanks @shakkernerd. - **TUI fuzzy selectors:** delegate list matching to pi-tui, adding slash-token and alpha-number matching while removing the local matcher fork. - **macOS paired-node terminals:** advertise duplex Codex and Claude terminal resume commands from the embedded node host and forward interactive input and cancellation through the native app bridge. (#107335) - **Control UI catalog terminals:** open eligible Codex and Claude Code sessions in the native CLI on their Gateway or paired-node host, with viewer-versus-terminal preferences, validated resume commands, and an interactive PTY relay. (#107086) - **Control UI coding catalogs:** show provider brand icons beside Claude Code and Codex session catalog headings in the sidebar. - **Skill Workshop history review:** add a manual, newest-first session scan that progressively searches older substantial work for conservative skill ideas, stores only SQLite cursor metadata, and leaves up to three results as pending proposals even when autonomous self-learning is disabled. (#106182) - **SQLite snapshots:** add `openclaw backup sqlite create|list|verify|restore` for compact, verified global and per-agent database artifacts with fresh-target-only restore. (#94805) Thanks @giodl73-repo. - **GPT-5.6 Ultra and runtime switching:** support Sol, Terra, and Luna across OpenClaw and Codex engines; keep model, runtime, and thinking selection atomic through `/model` and fallback; and add live matrix coverage for both harnesses. (#98021) Thanks @anyech. - **OpenAI GPT-5.6 defaults:** use `openai/gpt-5.6` (Sol alias) for fresh API-key setup and exact `openai/gpt-5.6-sol` for fresh Codex/OAuth setup, default Sol to medium reasoning across both runtimes, and preserve existing primaries, fallbacks, aliases, and explicit GPT-5.5 selections. (#103234) - **Meta provider:** add bundled `muse-spark-1.1` model support with Responses API streaming, tool calls, encrypted reasoning replay, onboarding, and standalone npm/ClawHub distribution. (#102873) Thanks @HamidShojanazeri. - **Android chat agent selector:** switch the active agent directly from the live chat screen while keeping chat, Talk mode, and home canvas on the same canonical session. (#80422) Thanks @bcperry. - **Gateway host status:** show the connected Gateway's host, network address, OS, runtime, uptime, CPU, memory, and disk details in Control UI Settings. (#100478) - **iOS offline chat:** pre-paint recent sessions and canonical transcripts from a protected, bounded per-gateway cache, keep sending disabled offline, and purge cached conversation text when pairing is reset. (#100194) - **Slack progress indicators:** use Slack's native assistant thread status and rotating loading messages by default while keeping acknowledgement reactions static; lifecycle reaction updates now require `messages.statusReactions.enabled: true`. - **Control UI Talk controls:** keep voice, model, sensitivity, and other realtime defaults in Settings → Communications → Talk, and use the composer microphone caret to select any browser audio input. (#101046) - **Control UI session workspace shortcut:** expand or collapse the active Chat pane's session workspace rail with ⇧⌘B without changing the main app sidebar or the separate detail and Canvas preview panel. Thanks @shakkernerd. - **Control UI Settings shortcut:** open Settings with ⇧⌘, while leaving the browser-owned ⌘, shortcut unchanged. Thanks @shakkernerd. - **Control UI chat layout:** center the transcript on the composer axis, keep assistant and tool output left and user bubbles right within the same readable frame, and preserve custom message-width overrides. (#104474) Thanks @shakkernerd. - **Control UI composer footer:** center the chat settings chip and model controls between the divider and the card edge instead of pinning them to the divider. (#105866) - **Control UI assistant actions:** keep assistant name and time first while placing hover actions beside them on the left instead of at the far edge. Thanks @shakkernerd. - **Cron model selection:** choose an agent-turn model in Control UI Quick Create and show configured or default models in cron job rows and details. (#95341) Thanks @ly85206559. - **Control UI GitHub previews:** show issue and pull request state, title, author, activity, comments, and change statistics in hover and keyboard-focus cards. (#100434) - **Logbook work journal:** add a disabled-by-default bundled plugin that turns paired-node screen snapshots into a private timeline, daily standup, and timeline-grounded Q&A in a plugin-contributed Control UI tab. (#99930) - **Control UI message context:** reveal per-message token, context, and model details from the timestamp on hover or activation instead of showing a separate Context button. - **Control UI session titles:** reveal truncated recent-session names with a reduced-motion-safe hover animation. - **Control UI sidebar navigation:** show a small customizable pinned destination set, keep the remaining pages under More, move Settings to the footer, and persist sidebar customization in the browser. (#100296) - **Control UI sidebar usage:** remove the provider usage quota row from the expanded sidebar while keeping usage details available in the chat composer and Usage page. Thanks @shakkernerd. - **Android chat code highlighting:** render fenced Kotlin, Swift, TypeScript, JavaScript, Python, Bash, and JSON blocks with bounded, theme-aware syntax colors while preserving plain rendering for unknown, partial, or oversized blocks. (#100217) - **Gateway TTS playback:** add an operator-scoped `tts.speak` RPC that returns configured-provider speech as inline whole-clip audio for remote clients. (#100708, #100770) - **Workboard dispatch cap:** add a request-scoped `--max-starts` override while preserving the default cap, sequential starts, and one-card-per-owner guard. (#100174) Thanks @souvikDevloper. - **Plugin install provenance warnings:** require explicit `--force` acknowledgement for arbitrary executable plugin sources in CLI and chat installs, keep trusted ClawHub, bundled, official-catalog, and tracked-update flows frictionless, and restrict Crestodian installs to trusted sources. (#102197) Thanks @jesse-merhi. - **Custodian rich setup controls:** render the Gateway's sanitized wizard steps as native selects, multiselects, text fields, and masked secret inputs while preserving text-only chat compatibility. (#114631) Thanks @jesse-merhi. ### Fixes - **Control UI session companion:** load bounded visible session context before answering, keep unavailable questions retryable, and prevent private companion reference wrappers from appearing as answers. Fixes #120746. Thanks @shakkernerd. - **Telegram live locations:** expose initial, moving, and stopped live-location updates through the channel-neutral `message_received` hook without starting agent turns for edits. - **Updater plugin convergence:** keep pre-plugin doctor passes from installing configured plugins before the updater's plugin sweep, while preserving the final post-plugin migration pass and preventing ambient update-phase state from leaking into fresh doctor processes. - **Control UI browser tab identity:** keep selected tab styling, accessibility, focus, address, and page snapshot aligned across in-place navigation and tab reordering. Fixes #120745. Thanks @shakkernerd. - **Control UI staged attachments:** preserve unsent images, files, pasted images, and large pasted text across same-tab route and narrow split-pane remounts while keeping pane close, mismatched pane/session/Gateway remounts, application shutdown, and hard reload as cleanup boundaries. Fixes #121519. Thanks @shakkernerd. - **Control UI browser annotations:** keep marked screenshots and generated page context together in structured composer cards, preserve user-written drafts when annotations are removed or replaced, retain complete unsent annotation packages across same-tab route and active split-pane remounts, and offer bounded Undo without restoring removed context into another session. Fixes #120744. Thanks @shakkernerd. - **Control UI profile avatar refreshes:** carry canonical content revisions through mutation responses and live presence so rapid replacements refresh every connected browser without stale cache rollback. Thanks @shakkernerd. - **Control UI appearance accessibility:** keep the unavailable custom-theme card announced as an Import command while preserving selected-state semantics for selectable themes and text sizes. Thanks @shakkernerd. - **Control UI dashboard index refresh:** keep an open Dashboards page current after session changes, agent-scope updates, and Gateway reconnects while preserving the last safe list until replacement hydration completes. Fixes #120602. Thanks @shakkernerd. - **Browser extension relay security:** require canonical 64-character relay secrets and safe WebSocket pairing URLs, and recheck OpenClaw tab-group consent at the extension edge before every authority-bearing existing-tab command. - **Control UI debug diagnostics:** keep last-good status, health, model, and heartbeat snapshots visible when refreshes fail, show the failure inside Snapshots, isolate it from Manual RPC state, and prevent older manual calls from overwriting newer ones. Thanks @shakkernerd. - **Control UI read-only preferences:** keep personal preference edits browser-local without attempting unauthorized config writes or claiming server sync, preserve offline intent for a later authorized reconnect, and restore the current server value on local reset. Thanks @shakkernerd. - **Control UI owner handoff:** give browsers opened by host-issued dashboard and graphical onboarding links durable administrator access, including same-browser recovery from a limited credential, while keeping generic, Telegram, mobile, and ordinary scope-upgrade paths bounded. Thanks @shakkernerd. - **Control UI agent and skill permissions:** gate Agents, Skills, Skill Workshop, and delayed mutation dispatches by the current Gateway method catalog and operator scopes while preserving read-only browsing and legacy Gateway compatibility. Fixes #119176. Thanks @shakkernerd. - **Guided onboarding skip-UI routing:** keep `openclaw onboard --skip-ui` and `openclaw setup --skip-ui` on guided onboarding while skipping both browser and terminal handoffs, instead of silently switching to the classic wizard. Thanks @shakkernerd. - **Telegram durable ingress:** preserve pre-identity control-lane ownership during replay and attempt each drain snapshot row only once per pass, preventing targeted commands from spinning the spool and blocking polling shutdown. - **Control UI operator session permissions:** honor Gateway-advertised operator scopes for new-thread creation, thread management, checkpoints, and sharing controls while preserving read-only navigation and legacy Gateway compatibility. Fixes #117786. Thanks @shakkernerd. - **Control UI delayed session commands:** bind slash-command mutations and confirmed resets to their originating Gateway, recheck current operator scopes after asynchronous work, and retain reset authorization through queued delivery so reconnects cannot target a replacement connection. Thanks @shakkernerd. - **Control UI archived session deletion:** send archive-gated delete requests from Sessions-page row and mixed-selection actions so write-scoped operators can remove archived threads while active-session deletion remains admin-only. Thanks @shakkernerd. - **Control UI command recovery:** keep delayed detached and immediate command failures scoped to their submitting session, preserving failed drafts and attachments for that pane without overwriting the active session. Fixes #116846. Thanks @shakkernerd. - **Microsoft Teams message-tool replies:** keep automatic live previews from duplicating a message already delivered to the current Teams conversation, while preserving distinct follow-up text and cross-conversation sends. Fixes #116397. (#116398) Thanks @a-tokyo. - **Buzz plugin packaging:** keep the live QA runner on the shipped QA runner SDK surface and remove the obsolete package shrinkwrap so standalone npm and ClawHub package builds use current host exports and dependency resolutions. Thanks @shakkernerd. - **Control UI sharing connection isolation:** discard stale visibility and membership mutation results after switching gateways or accounts so previous-connection refreshes and errors cannot update the replacement connection. Fixes #116800. Thanks @shakkernerd. - **Control UI session refreshes:** preserve explicitly queued list filters and background hydration across later Gateway event invalidation, while keeping append pagination followed by a canonical refresh. Fixes #116697. Thanks @shakkernerd. - **Gateway device clock skew:** sign device proofs with the Gateway-issued challenge timestamp across TypeScript, Control UI, browser extension, Android, Apple, Linux, and watchOS clients so incorrect local clocks no longer block authentication, while retaining no-challenge compatibility for pre-challenge Control UI servers and older watch-node HTTP endpoints and keeping nonce binding and freshness checks enforced. Fixes #103455. - **Control UI dynamic deep links:** reuse the initial route loader result when publishing real agent, session, dashboard, Workboard, Memory, and Plugins paths, avoiding redundant route-loader work during startup. Thanks @shakkernerd. - **Linux gateway service ownership:** refuse user-scope systemd publication and activation when the same gateway unit name is already owned or cannot be verified in the system scope, including `--force`, with actionable recovery guidance instead of creating restart-looping dual managers. Fixes #116129. - **macOS remote tunnel lifecycle:** prevent cancelled or superseded restart backoffs from recreating SSH tunnels, and join a tunnel create that another caller started while the actor was suspended. - **macOS location permission requests:** coalesce concurrent prompts so every caller resumes, and stop cancelled timeouts from opening Settings or completing a newer request. - **macOS Voice Wake cancellation:** stop superseded silence, capture, and recognizer-restart timers immediately so cancelled work cannot restart the microphone pipeline or keep stale monitor loops alive. - **Meeting node audio retention:** bound captured audio and terminal retention for Google Meet, Teams, and Zoom node-host sessions, make close idempotent, and force stalled bridge processes down after the graceful shutdown window. - **Control UI update reconciliation:** preserve an unresolved managed-update request across disconnects, accept the replacement Gateway version when it proves success, and otherwise show explicit recovery guidance instead of trusting an unrelated cached update result or failing silently. Fixes #116075. Thanks @shakkernerd. - **Control UI model readiness:** put AI setup first when no model is selectable, distinguish signed-in credentials from ready providers, and route accounts with no exposed models directly to provider recovery instead of leading with disabled default controls. - **Control UI Talk session isolation:** stop active realtime Talk media and retire its callbacks before chat session changes, Gateway disconnects, or pane disposal so previous-session audio, transcript, camera, and status updates cannot leak into the next view. Thanks @shakkernerd. - **Control UI Realtime tool calls:** execute OpenAI WebRTC tools only from completed responses, bound retained call identities and UTF-8 arguments, and ignore provisional or late duplicate events so long Talk sessions cannot grow tool state without limit. - **Gateway reconnect event ordering:** reset the shared TypeScript client's outer event-sequence baseline for each replacement WebSocket, preventing gap recovery from comparing unrelated connection generations across Control UI, TUI, SDK, and browser extension clients. Thanks @shakkernerd. - **Skill Workshop offline apply:** preserve configless local proposal apply after upgrades under exclusive Gateway startup ownership, while keeping running Gateway snapshot invalidation fail-closed when CLI credentials are unavailable. - **macOS and Control UI keyboard navigation:** let Tab traverse links and controls inside embedded Dashboard, browser, and Canvas web views, and keep shortcuts working on non-Latin keyboard layouts without firing during IME composition. - **Control UI session diffs:** hide unchanged checkout modifications and untracked files that already existed when a thread started, so the diff panel attributes only files touched by that session. Fixes #115628. - **Code Mode small-model repair:** give malformed pre-dispatch `exec` calls one bounded correction turn, expose typed failure-phase and bridge-dispatch evidence, and stop retries after nested tools begin. Fixes #115311. - **Shared state corruption recovery:** evict only the exact cached SQLite owner after proven read or write corruption so a repaired database recovers without a Gateway restart while caller-injected handles remain untouched. Fixes #114269. Thanks @rizquuula. - **Dev-channel updates:** finish package-to-git switches in a fresh CLI process even when source SHA and version metadata are unchanged, preventing stale hashed chunks from loading after the global package root changes. - **Parallels release smoke:** preserve Windows installer reboot results across Parallels, wait for WSL MSI/default-version readiness, force explicit test-owned gateway stops, and reset Linux package, config, and cache state before install lanes, preventing false prerequisite, safety-gate, and stale-config failures. - **OpenAI Realtime Talk auth:** remove the non-public Codex OAuth realtime fallback and require an OpenAI Platform API key for Talk, Voice Call, and Discord realtime voice, preventing OAuth-only gateways from advertising a browser session that the live service rejects. Fixes #115021. - **Codex native subagent handoff:** tell Codex harness turns to use `sessions_yield` for later-turn child completion delivery, reserve `wait_agent` for immediately blocked same-turn steps, and omit the guidance when yielding is unavailable. Fixes #115443. Thanks @shakkernerd. - **Codex native controls:** stop misclassifying valid thinking/fast runtime controls as provider overrides so Codex routes keep their native controls, while provider-native objects and invalid values stay fail-closed. Thanks @VACInc. (#107588) - **State snapshot verification:** run SQLite snapshot verification in a separate process so worker-thread file closes no longer drop the Gateway's POSIX WAL locks, eliminating spurious WAL misses and I/O errors. Thanks @VACInc. (#114016) - **Reply latency with model policies:** reuse one immutable plugin-metadata snapshot per model-selection run instead of repeating plugin discovery, cutting reply delay when a model policy is configured. Thanks @VACInc. (#114117) - **Claude cache after stalls:** recover stalled Claude CLI sessions by forking from the last pre-turn checkpoint so native cache continuity survives without duplicating the pending prompt, with a cold reseed fallback for CLIs without checkpoint support. Thanks @VACInc. (#113866) - **Control UI initial prompts:** keep accepted first messages visible across Gateway transport reconnects by binding the process-local handoff to the logical browser client instead of the per-handshake hello snapshot. - **Gateway exec deny fallback:** fail closed immediately when shell-expanded arguments prevent an allowlisted command from producing an enforceable execution plan and effective policy is `ask=off` with `askFallback=deny`, instead of registering an approval that can only time out. Fixes #113191. Thanks @shakkernerd. - **Cron local-provider preflight:** report the guarded-fetch deadline as a bounded preflight timeout, preserve concrete nested non-timeout errors, and carry the failure reason into fallback warnings. Thanks @shakkernerd. - **Buzz lifecycle recovery:** isolate relay and room-role failures to the Buzz account reconnect loop, prevent subscription cleanup from terminating the Gateway, and clear stale channel errors after successful reconnects. Thanks @shakkernerd. - **Buzz standalone sends:** let `openclaw message send` and other non-Gateway processes open a bounded authenticated relay connection, publish the message, and close cleanly while running Gateways continue to reuse their active connection. Thanks @shakkernerd. - **Buzz presence:** publish nonblocking online presence when the Gateway connects, refresh it without overlapping heartbeat writes, and let Buzz's final-connection cleanup provide accurate offline state across reconnects and multiple Gateway instances. Thanks @shakkernerd. - **Buzz bot profiles:** persist optional Buzz account names, publish them as bot display names without delaying Gateway startup, preserve existing profile metadata, and include configured owner attestations so Buzz can show verified provenance. Thanks @shakkernerd. - **Buzz agent identity:** register connected bots in Buzz's agent directory without overwriting existing profile policy, so later room invitations retain the Bot role instead of downgrading the identity to a normal member. Thanks @shakkernerd. - **Buzz guided setup:** reuse or generate the bot identity automatically, wait for Bot-role approval before falling back to identity-preserving Retry/Back controls, select single-room defaults, preserve advanced access settings, accept normal room messages by default without relying on composer mentions, verify setup without posting test messages, finish targeted channel setup directly, derive new bot profiles from the routed agent identity, and authorize fresh setups from Buzz's live room roster without per-message relay queries. Thanks @shakkernerd. - **Buzz resumable setup:** persist paused bot identities, resume disabled setup in place, retry authenticated room discovery without rotating keys, require verified **Bot**-role room membership instead of accepting unverified room UUIDs, and give accurate CLI authorization guidance for generated identities that Buzz desktop cannot discover. Thanks @shakkernerd. - **Buzz inbound authorization:** apply shared room sender and command authorization before agent dispatch, allow authorized control commands to bypass mention gating, and preserve Buzz thread/reply identifiers through delivery. Thanks @shakkernerd. - **ClickClack split-origin setup codes:** consume versioned exact claim endpoints without appending a second claim path, validate the returned canonical API base, preserve private API transport overrides, and keep legacy setup URLs working. Fixes #111919. Thanks @shakkernerd. - **Standalone plugin files:** let manifestless files explicitly listed in `plugins.load.paths` pass config validation and load independently when several files share a directory. - **Control UI terminal error messages:** preserve message-only assistant output beginning with `Error:` or a warning marker instead of treating text prefixes as synthetic failures. Thanks @shakkernerd. - **Channel outbound echo suppression:** drop recently emitted platform message and source identities at shared inbound admission and migrate Discord thread unbinds off channel-local expiry state, preventing delayed webhook copies from re-entering agents. - **Reef startup reconciliation:** contain retryable relay failures during startup without supervisor restart loops, while preserving definitive-error and cancellation handling. Thanks @Yigtwxx. - **Codex stale-session replies:** stop model fallback after another gateway supersedes a Codex session generation and deliver a safe retry notice instead of abandoning the message silently. - **Bounded input and provider responses:** cap pasted auth/config input and enforce wall-clock deadlines across generated-media downloads, polling JSON, and failed response details so oversized or slow-drip streams cannot exceed resource budgets (thanks @Pick-cat). - **LINE durable inbound media:** retry transient content preparation, network, and response-stream failures through durable ingress so media-only messages are not acknowledged before their attachment is saved. (#110921) Thanks @edenfunf. - **Cloud worker derived workspace caches:** exclude Python caches, dependency trees, and macOS metadata symmetrically from outbound sync and inbound reconciliation so local cache rewrites cannot fence later cloud results or worker reclaim. - **Codex model status diagnostics:** report a configured Codex route as unavailable when its harness plugin is disabled, missing, or quarantined, while preserving the separate credential result and making `models status --check` fail instead of silently treating fallback execution as healthy. Thanks @shakkernerd. - **Gateway control-plane rate limiting:** use per-method buckets with a 30-per-minute budget so interactive admin writes remain responsive while retaining runaway-loop protection. - **External supervisor restart health:** accept device-identity policy closes only when the replacement gateway lock and listener PID agree, preventing OCM-managed restarts from timing out after a successful handoff. Thanks @shakkernerd. - **ACPX cleanup process inspection:** bound host process-table reads so stalled `ps` calls cannot hang gateway startup or session cleanup while retaining fail-closed ownership checks. Thanks @Alix-007. - **Cron lifecycle conflict retries:** preserve execution-phase retry decisions across scheduled, manual, and startup-recovered runs so post-execution claim conflicts cannot replay completed messages or tools. Fixes #108428. Thanks @yetval. - **Discord gateway metadata deadline:** carry the existing lookup deadline through DNS and proxy preflight, request headers, and response bodies so stalled gateway startup aborts cleanly. (#104580) Thanks @hugenshen. - **Control UI cloud session thinking:** expose reasoning level in the New Session model picker and persist the selected level before cloud dispatch. - **iOS fresh-install setup:** atomically redact spent setup credentials before Keychain cleanup so a deferred item deletion no longer disconnects a successfully paired device. Fixes #107591. Thanks @dagmarjeeves-lab. - **Tlon SSE connect cleanup:** disarm opening deadlines after failed HTTP responses and rejected stream opens so reconnect attempts cannot leave stale timers behind. (#104585) Thanks @hugenshen. - **LINE reply-token media kinds:** honor video and audio metadata on inbound replies, share the canonical media builder with proactive sends, and fail visibly instead of recording empty media-only deliveries. (#106515) Thanks @edenfunf. - **Mattermost websocket connection deadlines:** bound opening handshakes so stalled TCP peers cannot hang channel startup indefinitely and reconnect control resumes after timeout. (#105553) Thanks @hugenshen. - **Queued TTS retries:** copy local outbound media into queue-owned storage before enqueueing so voice replies survive producer temp cleanup and restart recovery, retain referenced artifacts through retry backoff, and prune unreferenced spool files after one day. Fixes #108501. (#108502) Thanks @masatohoshino. - **Feishu app registration deadlines:** bound OAuth device-registration requests to 10 seconds through the guarded fetch boundary so setup cannot hang indefinitely on stalled response headers. (#105549) Thanks @hugenshen. - **LINE control-command mentions:** detect authorized slash commands before mention stripping so inline group and direct-message controls preserve the original ingress metadata. (#107230) Thanks @edenfunf. - **Feishu document image reads:** bound remote document-image headers and stalled bodies with the selected account timeout, parse document Markdown through the plugin's MDAST pipeline, preserve image/block alignment, and reject failed upload input before creating empty image blocks. Thanks @Alix-007. - **ClawHub registry reads:** retry bounded HTTP 500 responses alongside other transient gateway failures so multi-package release scans survive isolated registry errors. - **Slack Socket Mode health:** report connected Socket Mode transports as degraded when `auth.test` fails or the configured bot token resolves to a user without `bot_id`, while preserving healthy enterprise-org installs. Thanks @zw-xysk. - **Synology Chat response limits:** bound user-list response reads, stop oversized streams immediately, and retain stale cached identities when a NAS exceeds the supported envelope. Thanks @zw-xysk. - **Usage date ranges:** exclude legacy transcript rows without timestamps from finite session ranges while preserving them in all-time totals, and rebuild older usage caches before serving the new semantics. Fixes #89709. Thanks @TurboTheTurtle. - **LINE group history races:** retain ambient group messages received during an active mention turn for the next turn while consuming the pre-turn snapshot exactly once. (#107367) Thanks @edenfunf. - **Mattermost progress command details:** accept the documented `streaming.preview.commandText` and `streaming.progress.commandText` modes in channel config validation and bundled metadata. Thanks @shakkernerd. - **1Password authorization handoff:** persist nonce-bound pending approvals in shared plugin state so hook and tool execution across broker instances remain single-use and fail closed. - **Control UI chat transcripts:** preserve loaded history across session and pane returns, bound automatic backscroll loading, virtualize long transcripts, retain hidden native run boundaries, and keep prepends, streaming, and responsive layouts from flickering or jumping. Thanks @shakkernerd. - **Codex dynamic tool outcomes:** use the shared tool-result failure contract for arbitrary lifecycle metadata, preventing successful Skill Workshop results from being displayed and persisted as failed calls. Fixes #107684. Thanks @shakkernerd. - **Codex `/status` context freshness:** consume exact per-response usage from Codex app servers that emit `rawResponse/completed`; when exact usage is unavailable or omitted, keep context unknown instead of reusing cumulative lifetime totals. (#107813) Thanks @wuqxuan. - **Codex resumed permissions:** apply stored per-session approval and sandbox overrides to primary resumed harness turns so `/codex permissions` survives later messages and gateway restarts. - **Nested resource ignores:** honor slash-free patterns and escaped literal exclamation marks in nested ignore files during skill and resource discovery. Thanks @moguangyu5-design. - **Proxy bypass precedence:** honor blank lower-case `no_proxy` values shadowing upper-case `NO_PROXY` consistently with Undici, and reuse the canonical matcher for Telegram fallback selection. - **Tokenjuice exec compaction:** avoid retaining raw command output inside compacted middleware metadata, preventing large successful compactions from failing the middleware details-size guard. - **Agent git package identities:** strip refs before hosted-repository parsing and reject traversal segments so GitLab branch refs resolve to the canonical managed install path. - **Tlon custom S3 uploads:** pass storage endpoints through the AWS SDK's native parser so custom S3-compatible uploads no longer fail before presigning. - **Signal active-run controls:** keep authorized stop, status, approval, and queue-read controls responsive during active turns while preserving ordinary and stateful turns in canonical session admission, and cancel every pending group sender lane on stop. (#107422) Thanks @arduano. - **Agent auth storage locks:** surface normal release failures while avoiding redundant release attempts after `proper-lockfile` reports a compromised lock. - **Paired-node session catalogs:** authorize bundled Anthropic and Codex catalog requests to invoke their read-only node commands from Control UI read flows, restoring remote Claude/Codex rows and terminal resume availability. Fixes #107406. - **Sandbox recreate confirmation:** treat Clack cancellation as a decline so Ctrl-C cannot proceed with container removal. - **Microsoft Teams HTML text:** decode HTML5 entities consistently in quoted and Graph-fetched messages while preserving literal escaped entity text. - **ClawHub plugin API ranges:** delegate each supported comparator to `semver` so tilde, partial-wildcard, and prerelease caret bounds are correct while preserving OpenClaw version normalization and the existing restricted range grammar. (#106877) - **Web Readability relative links:** seed parsed documents with the request URL so article links resolve correctly while removing the plugin's duplicate lazy-loader facade. (#106860) - **Browser auto-routing:** fall back to the Gateway host when an implicitly selected browser node reports that its control host is unreachable, while preserving explicit node pins and ambiguous action failures. - **Discord voice participant context:** maintain the live Gateway voice-state roster and include current channel participants in authorized voice agent turns so agents can answer who is present. - **OC Path JSONC insertion:** patch object and array insertions through `jsonc-parser` so comments, trailing commas, and CRLF formatting survive. (#106847) - **Windows winget installs:** continue in the current PowerShell session when winget installs Node.js before the machine PATH update becomes visible, avoiding a false `Node.js not found` failure. (#106862) - **Control UI realtime Talk feedback:** request browser echo cancellation, noise suppression, and automatic gain control for every microphone transport, and keep PCM capture processors connected through zero-gain sinks so microphone input cannot play locally. - **Agent source-reply recovery:** preserve current-chat delivery evidence for message sends executed through Code Mode, preventing successful replies from triggering a redundant retry and misleading delivery-failure diagnostic. - **Gateway in-process restarts:** clear stale SIGUSR1 restart state and resume prepared host suspensions before rebuilding runtime admission, preventing restart cooldowns or paused scheduling from leaking into the next lifecycle. - **ClickClack durable media delivery:** route media replies through required delivery, reuse owner-scoped upload and message nonces across retries, repair persisted attachment state without rereading source media, fail closed when an older ClickClack server cannot prove an unknown send, and use the selected provider and model's runtime output budget instead of a channel-level token cap. Thanks @jjjhenriksen and @shakkernerd. - **Deepgram realtime custom endpoints:** validate Voice Call streaming base URLs with secret-safe errors, preserve explicit `ws://` and `wss://` endpoints, and map HTTP schemes to their matching WebSocket transport for dedicated and self-hosted deployments. (#105334) Thanks @dwc1997. - **Control UI New Session reconnects:** rediscover agents, nodes, repository branches, and folder-browser state, refresh derived workspaces, gate unvalidated devices, and block ambiguous retries after Gateway client replacement while preserving the typed task and explicit choices. Fixes #106372. - **macOS remote node readiness:** take the main-session key from the node hello snapshot instead of opening an operator connection during node admission, preventing remote tunnel recovery from leaving Computer Use and node exec stuck in lifecycle transition. - **Claude CLI context budgets:** honor Anthropic model and per-agent `contextTokens` limits by passing the effective limit to Claude Code's native auto-compactor and persisting the same prepared budget in OpenClaw session state. Fixes #80933. (#93198) Thanks @mushuiyu886. - **Transcript read failures:** propagate permission and I/O failures from streaming JSONL session reads instead of treating unreadable transcripts as empty. (#106412) Thanks @zenglingbiao. - **Restart sentinel diagnostics:** report SQLite read/write and legacy-file cleanup failures while preserving best-effort restart recovery behavior. (#106385) Thanks @zenglingbiao and @wendy-chsy. - **Native app connection and relay reliability:** keep Android disconnects stopped across Activity recreation, fail remote camera commands without opening permission prompts, refresh mobile node registration after capability changes, surface iOS onboarding connection failures, cancel stale Talk owners on session switches, reject invalid Watch acknowledgments, preserve Watch events received during startup, and prevent older agent overview requests from replacing newer gateway state. - **Gateway source watch:** hand the configured port off from the installed service before starting the tmux watcher, preserve failed panes for attach/capture, and keep explicit alternate-port watches side by side with the managed Gateway. - **Claude CLI max-turn diagnostics:** preserve terminal max-turn results with OpenClaw and Claude session context, warn when tool actions may already have run, and stop unsafe auth-profile or model replay for potentially side-effecting turns. (#94130) Thanks @zhangguiping-xydt. - **Provider network retries:** align provider read/poll/download and agent-wait recovery for transient connection errors, retry bounded provider `ENOTFOUND` failures while leaving gateway `ENOTFOUND` and non-idempotent create operations fail-fast. (#101496) Thanks @xialonglee. - **Session retry classification:** stop permanent provider errors whose identifiers or payload details merely contain 429/5xx digit sequences from re-sending full context, and share bounded rate-limit-window parsing across retry paths. (#105258) Thanks @destire-mio. - **LINE directive templates:** suppress confirms and buttons with blank required fields or unlabeled actions while preserving valid titleless buttons and surrounding reply text. (#105520) Thanks @edenfunf. - **SQLite maintenance schema validation:** reject current-version global and agent databases with missing or drifted canonical tables, constraints, indexes, triggers, or table options before compaction, while accepting supported additive-migration layouts. - **Matrix bootstrap diagnostics:** preserve complete UTF-8 code points in bounded stdout and stderr tails so crypto dependency failures do not show replacement characters at retention boundaries. (#105475) Thanks @qingminlong. - **iOS Watch relay commands:** allow paired iPhone nodes to advertise and invoke `watch.status` and `watch.notify` through the default Gateway policy while preserving the direct watchOS node's fixed minimal command surface. - **Swabble status config:** honor the global `--config` path when reading service status instead of silently using the default configuration. - **Gradium TTS credential egress:** reject non-HTTPS, foreign-host, and hostname-lookalike base URLs before dispatching API keys, and pin guarded transport to Gradium's documented API hostname. (#101280) Thanks @zhangguiping-xydt. - **ClawHub retry timing:** reject fractional delay-seconds and calendar-normalized invalid Retry-After dates so runtime and release reads stay on their bounded fallback schedule. (#105479) Thanks @qingminlong. - **Gateway command SecretRefs:** preserve authoritative active-snapshot values when another command secret remains unresolved, falling back locally only for missing paths instead of emitting a per-turn `secrets.resolve` failure. (#96661) Thanks @SunnyShu0925. - **Cron delivery status:** keep successful isolated agent turns at `status=ok` when downstream delivery fails, while preserving the send failure separately in delivery state and run logs. (#95419) Thanks @Alix-007. - **Channel ingress recovery:** tombstone and scrub malformed durable ingress payloads without letting corrupt rows hide or starve later valid messages. (#98402) Thanks @Pick-cat. - **Discord thread archive defaults:** inherit each parent channel's configured auto-archive duration for binding-created threads instead of forcing 60 minutes, while preserving explicit overrides. (#103413) Thanks @wings1029. - **Installed plugin loading:** make native-module fallback use jiti's transform path instead of retrying the same synchronous ESM load, preventing Node 24 startup races when official plugins import SDK contract modules. - **QA profile channel execution:** partition mixed Crabline channel scenarios into one aggregate host suite so taxonomy-backed profile commands and evidence workflows no longer abort before execution. - **Plugin SDK API baseline:** cover every public entrypoint, preserve complete declaration shapes without source-line churn, and run baseline and export-surface guards from changed-file validation. - **Official plugin beta compatibility:** keep the exact beta.5 session-store helper imports working over SQLite through the documented deprecation window, preventing installed Codex and Feishu plugins from failing during package acceptance and upgrades. (#105287) Thanks @vincentkoc. - **SQLite terminal session recovery:** track physical transcript mutation time in the agent database so killed or timed-out main sessions rotate when transcript writes outlive the registry update, while preserving legacy transcript mtimes during doctor import. - **Gateway chat typecheck:** import chat event types from their owning protocol schema after the retired aggregate type module was removed, restoring full project typechecks. - **Packaged Crabbox commands:** include the lease-freshness helper imported by the published wrapper so `crabbox:*` commands do not fail with `ERR_MODULE_NOT_FOUND` in npm installs. - **Plugin session catalogs:** reject unknown catalog filters, report catalogs as plugin capabilities, and preserve them in SDK registration captures instead of silently returning empty results or classifying catalog-only plugins as capability-free. - **Gateway service audit:** treat POSIX shell `-c` wrappers as opaque for the gateway-subcommand check, avoiding false missing-command warnings for shell-wrapped macOS LaunchAgents without parsing inner commands or ports. Fixes #81751. (#81778) Thanks @liaoandi. - **Memory filename search:** index paths separately from chunk bodies so exact full-path, basename, and stem queries rank the intended memory file first without changing body BM25 scores, snippets, or embeddings. (#96052, #94102) Thanks @Pick-cat. - **Outbound channel bootstrap:** suppress repeated failed plugin activation for the same channel, config, and registry generation while retrying after config or registry reloads. (#100377) Thanks @xialonglee. - **OpenAI Realtime client-secret deadlines:** bound voice and transcription secret acquisition to 30 seconds through the guarded fetch boundary while preserving authentication and bounded response parsing. (#102860) Thanks @Alix-007. - **Gateway client watchdog:** keep transport-stall detection active for unbounded and mixed pending requests so dead sockets reject pending requests, reconnect, and never replay rejected requests. (#103407) Thanks @NianJiuZst. - **iOS Share Extension drafts:** preserve legitimate shared text beginning with scaffold-like prefixes, remove only exact legacy scaffold lines, avoid treating scheme-like prose as a URL, and deduplicate host-mirrored content. (#103453) Thanks @lin-hongkuan. - **Telegram reasoning previews:** reposition split reasoning previews through deferred deletion so prior preview messages do not remain stale while preserving client scroll position. (#97828) Thanks @ly-wang19. - **Feishu native-card threading:** normalize whitespace reply targets once and reuse the shared reply mode for card and media parts so native-card topic replies stay in their thread. (#102804) Thanks @sunlit-deng. - **Plain-text XML tool calls:** repair zero-argument calls and keep byte/character-bounded stream normalization from leaking incomplete or oversized tool syntax while preserving visible suffix text. (#98984, #102240, #102933, #102975, #103220, #103585) Thanks @wangyan2026, @qingminglong, @wuqxuan, and @ZOOWH. - **QQBot token requests:** bound token acquisition with the shared 30-second guarded-fetch deadline so stalled singleflight callers fail together, clean up, and can retry. (#102897) Thanks @maweibin. - **Canvas A2UI validation:** reject malformed or unsupported JSONL at CLI, agent-tool, and final node-invoke boundaries while preserving native v0.8 dispatch. (#103713) Thanks @qingminglong. - **Twilio RCS inbound routing:** normalize RCS consumer addresses only after signed webhook validation so sender matching and sessions work without changing outbound RCS semantics. (#102373) Thanks @clawSean. - **ClickClack output sanitization:** strip internal tool and XML scaffolding at the sender boundary, suppress scaffold-only sends, and preserve optional modern delivery IDs. (#103142) Thanks @masatohoshino. - **CLI installer cleanup:** remove Node staging directories and pnpm workspace-rewrite temporary files on failure. (#103725) Thanks @SebTardif. - **Agent-core truncation:** avoid empty-output crashes when head truncation receives negative line or byte ceilings. (#103425) Thanks @qingminglong. - **Windows Node resolution:** preserve the current executable when resolving bare case-insensitive `node.exe` entries under hostile `PATH` values. (#103907) Thanks @soldforaloss. - **Codex runtime switching:** accept the bundled Codex runtime for both `codex/*` and `openai/*` model routes while keeping unsupported provider/runtime pairs rejected. (#103762) - **Agent abort cleanup:** serialize prompt lock reacquisition with terminal cleanup so canceled embedded runs do not self-contend on session locks for up to 60 seconds. - **Chutes OAuth deadlines:** bound token exchange, profile lookup, and refresh requests, and keep issued tokens when optional userinfo enrichment stalls. (#102026) Thanks @Alix-007. - **Control UI workspace avatars:** inline validated agent avatar files in bootstrap and identity responses so Personal card images render without unauthenticated avatar-route requests, while preserving configured emoji precedence. (#102892, #97602) Thanks @LZY3538. - **Exec safe-bin flags:** auto-approve curated read-only boolean flags for default stdin-only filters while keeping unknown flags, tail follow/retry modes, file operands, and custom profiles fail-closed. (#88953) Thanks @yetval. - **iOS session mutations:** scope rename, archive, pin, delete, and fork requests to the selected agent, preserving the parent agent for forked sessions so multi-agent chat actions cannot mutate or create sessions under the wrong agent. (#103366, #103415) Thanks @lin-hongkuan and @harjothkhara. - **Model pin hot reload and fallback:** keep explicit `/model` selections authoritative across Telegram config reloads and model fallback, capture one live config snapshot per assembled turn, and leave fallback candidates turn-local instead of persisting them over the user's pin. (#103324, #103417) Thanks @obviyus. - **Swift protocol initializers:** default every schema-optional generated initializer parameter to `nil` so additive protocol fields no longer break SDK construction call sites. - **Telegram DM conversation context:** correlate rendered outbound messages with stable transcript identities across chunked, rich-fallback, media, and streamed delivery, preventing Markdown replies from appearing twice while retaining the full transcript when a cached multipart projection is incomplete. (#100333, #102257, #102259, #102469) Thanks @crabkun, @consoleaf, and @chenyangjun-xy. - **OpenCode Go MiMo catalog:** stop exposing the deprecated `mimo-v2-omni` and `mimo-v2-pro` aliases that reject agent requests, and keep release validation on the active MiMo V2.5 routes. (#103311, #103329) Thanks @krissding. - **Audit time filters:** reject impossible calendar dates for `openclaw audit --after` and `--before` instead of rolling them into unintended intervals, while preserving timezone-less timestamp semantics. (#103433) Thanks @qingminglong. - **OpenAI-compatible streamed tool calls:** execute complete native tool calls from streams that end with SSE `data: [DONE]` but omit `finish_reason`, while keeping transport EOF and visible-text cases fail-closed. (#98124, #97994) Thanks @SunnyShu0925. - **xAI provider aliases:** preserve Grok 4.3 and Grok 4.5 thinking profiles, fast-model routing, and encrypted reasoning replay when models use the shipped `x-ai` provider alias instead of clamping valid thinking requests to `minimal`. (#103315) - **Doctor state isolation:** prevent automated update and Gateway watch repair from importing and archiving default-home exec or plugin-binding approvals when `OPENCLAW_STATE_DIR` points elsewhere, keep implicit CLI preflight notice-only, and reserve cross-state imports for direct operator doctor runs. (#103247, #103317) - **Doctor clean-state guidance:** stop suggesting `openclaw doctor --fix` after a clean run with no config changes while preserving targeted repair hints. (#103233) - **Google music generation:** retry one unblocked Lyria response that omits its contractually required audio while keeping prompt blocks and terminal generation stops non-retryable. (#103318) - **OpenCode Zen model catalog:** refresh the provider-owned static seed for Claude Sonnet 5, Grok 4.5, Hy3 Free, Kimi K2.7 Code, and MiniMax M3 with verified routing, pricing, limits, and input capabilities, remove retired free-tier rows, and expose the same catalog through unauthenticated model listing. (#103184) - **Managed browser launch:** surface asynchronous Chrome bootstrap and runtime spawn failures as browser errors while keeping Gateway alive, and retain process error handling through later lifecycle failures. - **Browser node-proxy downloads:** transfer every action-produced download to the Gateway media store, align a 10 MiB per-file and 16 MiB aggregate transport budget, and rewrite plural download paths to Gateway-local files without traversing page-controlled result data. - **Gateway startup migrations:** release the shared migration lease before exiting when the selected config changes during startup, allowing immediate retries instead of blocking readiness until the five-minute lease expires. (#103145) - **Apple timeout recovery:** return promptly from shared operation deadlines and caller cancellation even when platform work ignores cancellation, while isolating late Gateway handshakes and cleaning up location and permission waiters. (#103066) Thanks @NianJiuZst. - **Claude CLI warm sessions:** preserve managed stdio continuity when Claude writes no native transcript, fall back to bounded OpenClaw history only when the exact live child disappears or changes, and keep stateless runs from persisting CLI bindings. (#96841) Thanks @bradreaves. - **CLI plugin listing:** skip state-migration runtime loading when no legacy inputs exist, reducing packaged cold-start memory while preserving migrations for legacy plugin indexes and configured session stores. - **Unicode-safe bounded text:** preserve complete UTF-16 surrogate pairs when shortening previews, prompts, diagnostics, labels, session keys, link metadata, and identity values across Control UI, CLI, Gateway, plugins, QA, memory, and Android surfaces. (#102625, #102626, #102627, #102656, #102816, #102823, #102833, #102877, #102949, #102963, #102969, #102988, #103010, #103034, #103210, #103341, #103487, #103543, #103580, #103646) Thanks @zhangguiping-xydt, @wings1029, @wangyan2026, @Pandah97, @MoerAI, @SunnyShu0925, @zhangqueping, @zw-xysk, @cxbAsDev, @lzyyzznl, @coder-master-0915, @LeonidasLux, @mushuiyu886, @ly85206559, @Simon-XYDT, and @lsr911. - **Cron list table:** sanitize and size bounded cells by terminal display width so CJK, emoji, combining marks, and terminal-control input cannot corrupt alignment or output. (#103616) Thanks @mushuiyu886. - **CLI model tables:** sanitize, truncate, and pad model-list cells by rendered terminal width so emoji, CJK, and other wide graphemes keep columns aligned. (#102819) Thanks @Kevin23-design and @vincentkoc. - **Skills prompt compaction:** preserve every included skill identity before using the remaining prompt budget for shortened, UTF-16-safe descriptions, retaining trigger guidance without exceeding the hard limit. (#88426) Thanks @abel-zer0. - **Channel Markdown code tables:** size columns by rendered display width so CJK, emoji, and mixed-width cells stay aligned across shared Telegram and Discord output. (#55596, #55512) Thanks @sparkyrider. - **QQ Bot approval previews:** wrap long sanitized commands and metadata at grapheme boundaries with visible continuation markers and safe fences, keeping desktop QQ reviews readable without changing command content. (#102119, #101979) Thanks @Bartok9. - **Codex computer control:** publish fixed-length coordinate pairs as homogeneous array schemas so Codex app-server can start threads with the `computer` tool instead of rejecting tuple-valued `items`. - **Google Chat request deadlines:** bound control calls to 30 seconds while giving media transfers size-aware total budgets and a separate 30-second stalled-body guard, preventing hung Chat API requests without breaking large attachment uploads. (#102227) Thanks @hugenshen. - **Google Gemini prefixed model IDs:** recognize `google/gemini-*` and `models/gemini-*` when selecting multimodal function-response behavior, preserving the Gemini 2 image fallback without regressing Gemini 3 inline image responses. (#102382) Thanks @LiLan0125. - **Generated provider model catalogs:** keep MiniMax and NVIDIA catalog rows when they advertise audio or video metadata while projecting runtime model inputs to text/image, preventing configured multimodal primaries from being dropped and falling back. (#97858, #97048) Thanks @ly-wang19 and @zackchiutw. - **DeepSeek catalog metadata:** align V4 Flash and Pro pricing with DeepSeek's current cache-hit, cache-miss, and output rates; refresh exact catalog metadata written by older onboarding flows; and document the July 24 retirement of the legacy `deepseek-chat` and `deepseek-reasoner` compatibility names. (#103192) - **CLI audio transcript files:** treat inferred Whisper and Parakeet text files as authoritative so empty or missing output cannot expose progress/status stdout as user speech. (#87393, #87384) Thanks @kesslerio. - **Browser actions on Node 24:** keep browser request cancellation bound to the client and response lifetime instead of Node 24.16+'s prematurely aborted body-stream signal, preventing valid POST actions from failing after JSON parsing. Thanks @obviyus and @vincentkoc. - **SecretRef model credentials:** keep resolved provider secrets behind process-local sentinels through auth storage, stream setup, SDK configuration, and managed local-provider probing, then inject plaintext only at the final network or provider-plugin boundary while retaining exact-value log redaction. (#102008, #102009) - **Lean local model shell access:** keep `exec` directly visible beside the default structured Tool Search controls so coding-tuned local models can use their shell fallback instead of searching for missing domain tools. (#87587) Thanks @vincentkoc. - **OAuth refresh contention diagnostics:** keep local lock paths out of user-facing refresh failures and avoid duplicate failure prefixes while preserving structured provider and profile classification. (#83383) Thanks @vincentkoc. - **Exec approval prompts:** keep background-disabled fallback warnings out of pending gateway/node approvals and show them only after a command actually runs in the foreground. (#78184) Thanks @vincentkoc. - **Direct poll delivery:** route direct and hybrid channel polls through the owning outbound adapter while preserving gateway-mode routing and channel option checks. (#99950) Thanks @NianJiuZst. - **Agent wait hard-timeout snapshots:** preserve canonical hard-timeout phase and timestamps when the outer `agent.wait` timer wins the retry-grace race, while leaving queue, draining, and restart-cancelled waits correctable. (#89367) Thanks @Pick-cat. - **Control UI typed approvals:** send `/approve` commands immediately through the authorized Gateway command path while an agent run is blocked instead of queueing the command behind that run. (#77672) Thanks @vincentkoc. - **Microsoft Teams Graph response bounds:** cap successful file-upload and chat JSON reads so oversized Microsoft Graph responses cannot be buffered without limit. (#97784) Thanks @Alix-007. - **Packaged speech runtime:** stop treating package-backed `speech-core` as a bundled plugin sidecar, restoring TTS startup in npm installs while release checks keep true activation-bypassing facades package-complete. (#89899, #89425) Thanks @zhangguiping-xydt. - **Codex app-server protocol:** require app-server 0.142 or newer, remove pre-0.142 wire-shape compatibility, and teach Codex to retrieve deferred native `spawn_agent` through `tool_search` so native subagent task mirroring works on search-capable models. (#101221) - **Android hardware keyboard chat:** send with unmodified Enter on physical keyboards while preserving Shift+Enter and other modified Enter combinations for multiline input. (#101239) Thanks @3ninyt3nin-creator. - **CJK Markdown emphasis:** render adjacent Chinese, Japanese, and Korean emphasis punctuation through the shared Markdown pipeline instead of leaking literal markers across channels. (#101230, #101120) Thanks @nicknmorty. - **Backup retry cleanup:** close partial archive output handles and isolate each retry path after live-write failures, preventing Windows `EBUSY` locks from cascading across attempts or leaving stale temp archives. (#101397, #101449) Thanks @ZOOWH and @LiLan0125. - **Codex yielded native subagents:** keep the parent app-server subscription and shared client alive until yielded native subagent completion delivery settles, preventing lost wakeups and leaked one-shot cleanup. - **Delivery recovery pacing:** pace eligible outbound and restart-continuation replays after gateway startup so outage backlogs do not burst into channel rate limits, while preserving the wall-clock recovery budget. (#101118, #101058) Thanks @ZengWen-DT. - **Outbound pre-connect recovery:** clear stale platform-send evidence atomically when a connect or DNS failure proves no request was sent, allowing queued Discord and other channel messages to replay after connectivity returns without weakening the unknown-send duplicate guard. (#101024, #100979) Thanks @SunnyShu0925. - **Discord streamed finals:** send completion replies as fresh messages so inactive channels become unread, while preserving targeted mentions without escalating `@everyone` or `@here`. (#99711, #99662) Thanks @davelutztx. - **OpenAI-compatible SSE parsing:** recognize event streams mislabeled as JSON without prepending a second `data:` prefix, preserving valid streamed responses from non-conforming providers. (#96503) Thanks @ZengWen-DT. - **LM Studio embedding preload:** honor model- and provider-level context-window limits when preloading embedding models, preventing avoidable GPU out-of-memory failures. (#100750) Thanks @zak-li, @ZOOWH, and @hxz398. - **Provider overload messaging:** keep rate-limited responses classified for retry and fallback behavior while using overload wording when the provider supplies no explicit retry detail. (#98165) Thanks @SunnyShu0925. - **Microsoft Teams attachment metadata:** bound Bot Framework `attachmentInfo` JSON reads and cancel oversized streams before they can exhaust Gateway memory. (#99125) Thanks @ly85206559. - **Agent auth copy order:** preserve the source agent's portable auth-profile precedence when copying credentials to a new agent while excluding skipped profiles and transient auth state. (#100833) Thanks @machine3at. - **Memory session repair:** keep daily dreaming ingestion bookkeeping outside session-corpus audit and repair so `memory status --fix` preserves healthy daily state. (#93389) Thanks @Alix-007 and @vincentkoc. - **Remote browser CDP policy:** allow the configured CDP control host through an existing hostname allowlist without widening page navigation policy, while keeping strict-policy discovery bound to the configured control authority. (#100986, #100819) Thanks @NianJiuZst. - **Config unset diagnostics:** explain when an inherited or default configuration value cannot be unset instead of reporting a misleading successful deletion. (#96557) Thanks @moeghashim. - **Crestodian command probes:** contain stdout and stderr stream failures while keeping child-process close and spawn errors authoritative, preventing unhandled probe crashes. (#100741) Thanks @lsr911. - **Feishu mention forwarding:** fail closed when the bot Open ID is unavailable so group messages cannot be misclassified as explicit bot mentions. (#100891) Thanks @zhangguiping-xydt. - **Cron edit delivery:** preserve each job's implicit delivery mode when applying partial delivery updates, so disabling best-effort delivery no longer turns detached job announcements off. (#100846) Thanks @machine3at. - **Control UI session creation:** keep newly created sessions at the front of the stable sidebar order after selecting another session. Thanks @shakkernerd. - **Control UI file previews:** keep large Skill Workshop files responsive with cached, offscreen-contained text chunks while preserving wrapped content, stable file switching, full-file copy, and clean focus behavior. (#101319) Thanks @xianshishan and @shakkernerd. - **FTS-only memory startup:** skip plugin capability discovery when `memorySearch.provider` is explicitly `none`, avoiding an unnecessary cold-start scan. - **Control UI agent model labels:** show each selected agent's effective model in the Default picker option instead of the global model. (#100719, #77690, #77440) Thanks @hyspacex. - **Control UI inbound image previews:** render canonical inbound media references through the authenticated ticket route after chat-history reloads. (#100725, #90172, #89591) Thanks @sweetcornna. - **Small-context compaction:** cap the effective reserve against the known model context window so small local models do not enter compaction from the first token. (#100621) Thanks @vincentkoc. - **Detail-less provider failures:** keep opaque upstream failures from cooling API-key auth profiles while preserving WHAM-backed OpenAI OAuth health checks and configured model fallback. (#100600, #100617) Thanks @fengjikui. - **Plugin install diagnostics:** suppress the misleading hook-pack fallback after plugin install failures only when the hook manifest is absent, while preserving actionable malformed hook-pack errors. (#100554) Thanks @vincentkoc. - **Config validation diagnostics:** emit each unchanged sanitized validation-warning payload once per config path, reset deduplication after a clean validation, and preserve the warning fingerprint across transient invalid reads and failed refreshes. (#100569, #25574) Thanks @vincentkoc. - **Config size-drop guard:** compare writes against canonical bytes for parseable object configs instead of raw BOM and indentation overhead, while preserving raw audit telemetry and the conservative malformed-input fallback. (#100591, #71865) Thanks @vincentkoc. - **Control UI coalesced updates:** show a clear queued-restart completion banner when an update joins an already-running Gateway restart. (#93082) Thanks @goutamadwant. - **Control UI connection errors:** preserve structured pairing and authentication failures for pending RPC callers while keeping generic disconnect behavior unchanged. (#54758) Thanks @ruanrrn. - **iOS embedded terminal:** open the terminal-only Control surface directly while native Gateway authentication connects instead of exposing the Web UI login screen. - **TUI startup status:** show `starting up` during post-connect initialization without overwriting active-run or reconnect state. (#93999) Thanks @ml12580. - **Control UI restart recovery:** recover stale bundle pages through a bounded whole-document refresh after Gateway updates or restarts. (#99111) Thanks @ZengWen-DT. - **TUI active Gateway ports:** follow the verified active local Gateway port when no explicit URL, port, or remote target is configured. (#73338, #42461) Thanks @haishmg and @vincentkoc. - **Apple chat run recovery:** restore active responses from canonical Gateway history after reconnects, foreground resumes, and event gaps, while preserving gateway user-turn identity across Codex and Copilot transcript mirrors to prevent duplicate rows. (#100277) - **Claude CLI streamed replies:** preserve assistant text already received from Claude CLI when its terminal result envelope is empty, preventing false empty-response failover after a complete streamed answer. (#90450) Thanks @totobusnello. - **Phone identity normalization:** canonicalize stray plus signs, preserve non-phone iMessage handles, and reject digit-free Signal identities across shared channel routing. (#100467) Thanks @morluto. - **Tlon scry response bounds:** cap successful Urbit scry JSON reads and cancel oversized streams instead of buffering unbounded peer responses. (#100376) Thanks @hugenshen. - **Source build portability:** keep tsdown configuration self-contained so builds do not depend on resolving the tsdown package from unrun's temporary module directory. - **Agent tool-call decoding:** preserve surrogate-range numeric HTML entities as literal text while still decoding valid supplementary-plane values, preventing malformed model output from injecting lone UTF-16 surrogates into tool arguments. (#99564) Thanks @mikasa0818. - **Gateway event dispatch:** catch and log lazy subscriber setup and handler failures instead of leaking unhandled promise rejections. (#100401) Thanks @cxbAsDev. - **Ollama fallback routing:** classify incomplete native streams through the Ollama provider hook so configured model fallbacks can advance. (#100482) Thanks @TurboTheTurtle. - **Diffs rendering:** render viewer and image output from one SSR preload, preserve language-pack highlighting through hydration, normalize language hints case-insensitively, skip identical before/after inputs with an explicit `changed` result, report truthful file-render and input errors, cache hash-pinned viewer runtimes, and prefer canonical file settings over stale aliases. (#100487) - **Remote browser reliability:** bound persistent Playwright tab enumeration by the existing remote CDP timeout budget and retire timed-out connection attempts so late completions cannot restore a stuck connection. (#80147, #58968) Thanks @HemantSudarshan and @KeaneYan. - **Browser tab adoption:** preserve the prior implicit tab and stable aliases when new MCP, Playwright, or CDP targets fail final safety validation, abort after creation, or cannot be rediscovered; validate labels before creating tabs and limit managed cleanup to adopted targets. (#105301) Thanks @hugenshen. - **Browser attachment downloads:** return managed URL, filename, and path metadata when direct Playwright navigation starts an attachment download, while validating final URLs before saving bytes and preserving single-owner explicit downloads. (#48045, #89416) Thanks @zhangguiping-xydt. - **Browser action downloads:** return managed URL, filename, and path metadata when agent actions trigger downloads, while preserving explicit ownership, validating final URLs before saving bytes, and quarantining policy-denied tabs without closing them. (#93250, #93307) Thanks @sunlit-deng. - **Managed browser cookie persistence:** initialize new isolated macOS headless profiles with a non-interactive encryption key while preserving existing profile keys, and close Chromium through CDP before bounded signal fallback so persistent logins survive graceful browser and Gateway restarts. (#96704, #98284) Thanks @TurboTheTurtle. - **MCP OAuth response bounds:** reject body-less foreign error bodies without calling their inherently unbounded `text()` fallback, while preserving HTTP status and headers for safe SDK diagnostics. (#98143) Thanks @Pick-cat. - **Tlon image upload bounds:** cap remote image fetches before upload and fail closed on oversized or stalled responses instead of buffering them without a limit. (#100374) Thanks @hugenshen. - **Mattermost block streaming:** preserve complete, non-duplicated text and tool blocks in draft preview mode, and honor normal block streaming when preview streaming is disabled. (#87449) Thanks @yetval. - **Control UI approval prompts:** keep stale resolve failures and busy-state cleanup from leaking across newer approvals or Gateway reconnects. (#98394) Thanks @haruaiclone-droid. - **macOS service SecretRefs:** preserve generated env-file values for SecretRefs that remain in config when stale Gateway LaunchAgents are repaired or reinstalled without those variables in the invoking shell. (#99124) Thanks @mushuiyu886. - **Anthropic OAuth callbacks:** keep the provider-required `localhost` redirect URI stable while allowing the local callback listener to bind an explicit loopback host. (#96917) Thanks @xialonglee. - **Prompt-release media delivery:** accept active-leaf-preserving side appends while an embedded run temporarily releases its session lock, so successive message-tool media replies merge without a false session-takeover failure. (#100033, #100490) Thanks @scotthuang. - **Control UI Skills filters:** align agent and search controls, use translated labels, and preserve native checkbox and radio sizing. (#100526, #99996) Thanks @evan-YM. - **Control UI completed-run state:** bind active and completed updates to run identities so stale completions keep Send available while newer runs remain active. (#100527, #91680) Thanks @tiffanychum. - **Control UI context usage:** keep stale cached totals visible as approximate without triggering warning styling or Compact actions. (#89772) Thanks @bladin. - **Control UI file previews:** remove the duplicate Escape header hint while retaining the Close-button shortcut hint and Escape behavior. (#100528, #99029) Thanks @xianshishan. - **Control UI autonomous tool failures:** preserve an earlier Tool error outcome across later autonomous recovery turns. (#100514, #98888) Thanks @qingminglong. - **Agent empty replies:** surface a visible failure when a completed interactive turn has no deliverable reply, including queued follow-ups, while preserving explicit silence, pending continuations, and committed side effects, honoring queued send policies, and treating compaction notices as progress. (#100456) Thanks @mushuiyu886. - **Child process output safety:** prevent stdout/stderr pipe failures from crashing agent exec sessions, local TUI shell commands, and bounded process execution. (#100407, #100406, #100410) Thanks @cxbAsDev. - **Docker sandbox command output:** fail and terminate Docker sandbox operations when stdout/stderr capture breaks instead of returning success with incomplete output. (#100523) Thanks @cxbAsDev. - **Background refresh isolation:** keep remote skill-bin refreshes running when one node fails, and contain periodic subagent-sweeper failures without hiding errors from direct callers. (#100393, #100390) Thanks @cxbAsDev. - **Skill scan diagnostics:** report directory enumeration failures through the existing resource diagnostics instead of silently dropping affected skills. (#100380) Thanks @wendy-chsy. - **Exec output sanitization:** remove complete ANSI sequences and render residual C0/C1 controls as visible escapes instead of silently discarding output bytes. (#100327) Thanks @LavyaTandel. - **Assistant visible text:** unwrap leaked standalone `` tags while preserving their content and literal code/XML examples. (#100302) Thanks @nankingjing. - **Android microphone capture:** treat negative `AudioRecord.read` results as fatal shared-session errors so both transcription and Talk capture stop cleanly after device loss. (#100028) Thanks @NianJiuZst. - **Android push-to-talk lifecycle:** serialize gateway PTT preparation with app foreground and Manual Mic ownership so stale background or retry work cannot restart, replace, or tear down a newer capture. (#99840) Thanks @xialonglee. - **Lean local-model tools:** trim media generation, TTS, and PDF tools from lean agent surfaces while preserving explicit config and runtime opt-ins. (#88881) Thanks @vincentkoc. - **iOS development app identity:** keep the development app labeled OpenClaw while using its distinct debug icon to differentiate it from release builds. - **Android chat recovery:** preserve optimistic user messages and locally owned runs while reconnect and sequence-gap history snapshots catch up, preventing sent messages from disappearing or stale runs from taking ownership. (#100197) - **iOS QR gateway handoff:** stop VisionKit before delivering scanned setup codes, and keep deferred auth, approval, Watch, and foreground-node work bound to its originating gateway across reconnects. (#99572) Thanks @PollyBot13. - **Agent terminal failures:** surface a safe interactive reply when an agent run ends without visible output, while preserving completed message-tool delivery and heartbeat-specific guidance. (#99304) Thanks @moeedahmed. - **MCP loopback tool results:** preserve schema-valid text, image, and embedded-resource content through HTTP tool calls while rendering malformed or protocol-incompatible blocks as safe text. (#100336) Thanks @tzy-17. - **Control UI tool-result images:** render direct image content blocks from Gateway history and make the delayed-send scroll E2E setup deterministic. (#100295) Thanks @lzyyzznl. - **Control UI live tool ordering:** keep assistant stream text before its matching tool card when browser and Gateway timestamps disagree. (#93184) Thanks @Pick-cat. - **Plugin approval diagnostics:** distinguish request validation rejections, expired wait decisions, and unavailable Gateways while keeping approval failures fail-closed. (#100337) Thanks @tzy-17. - **IRC Unicode messages:** split outbound PRIVMSG payloads on UTF-16 code-point boundaries so emoji cannot be cut into lone surrogates. (#96572) Thanks @llagy009. - **OpenAI realtime voice greetings:** prevent server VAD from creating a second outbound greeting while an explicit greeting response owns the turn, without disabling caller interruption. (#86285) Thanks @giodl73-repo. - **Realtime voice tools:** filter malformed tool names at each OpenAI, Azure, and Google realtime payload boundary while preserving provider-specific valid names. (#89175) Thanks @vincentkoc. - **Discord voice status:** treat Discord error 10065 as a normal disconnected state while preserving unrelated REST failures. (#90969) Thanks @asock. - **Discord voice accounts:** isolate `@discordjs/voice` connections by Discord account and recover auto-join when gateway readiness predates listener registration. (#87530) Thanks @geekhuashan. - **iOS Voice Wake cleanup:** avoid initializing the microphone audio pipeline while disabling inactive Voice Wake, preventing simulator launch aborts and unnecessary audio setup. - **Cron duration validation:** reject positive durations that truncate below one millisecond instead of silently scheduling a zero-duration interval. (#100311) Thanks @qingminglong. - **Skill workshop proposals:** preserve the terminal newline in generated proposal Markdown while still rejecting blank raw content. (#100293) Thanks @anyech. - **Agent tool inputs and LSP startup:** treat blank optional integer arguments as absent, and fail embedded LSP startup immediately when its child process cannot spawn. (#100273, #99922) Thanks @snotty and @cxbAsDev. - **Gateway and memory diagnostics:** report failed start-session persistence and close-time memory work instead of silently discarding those failures. (#100313, #100308) Thanks @masatohoshino and @lin-hongkuan. - **Unicode and plugin package verification:** match native slice semantics for reversed UTF-16 bounds, and reject published plugin packages that omit `openclaw.plugin.json`. (#100014, #99904) Thanks @Simon-XYDT and @849261680. - **Android invoke cancellation:** preserve coroutine cancellation through camera handlers and the Gateway invoke boundary so cancelled work cannot emit a stale result. (#99916) Thanks @xialonglee. - **Codex native hook relay diagnostics:** avoid bridge registry writes before the local relay server begins listening. (#100300) Thanks @nankingjing. - **Voice Call completed status:** resolve finalized calls from the full retained event store across Gateway, tool, and CLI status paths while preserving active-call lookup performance. (#99797) Thanks @Darren2030. - **Agent stop recovery:** prevent late-aborting prompts from reacquiring orphaned session locks after teardown, so `/stop` leaves the conversation ready for the next turn. - **Message delivery status:** report failed and partially failed best-effort channel delivery instead of returning a success-shaped message-tool result. (#99928) Thanks @masatohoshino. - **WhatsApp credential recovery:** restore malformed primary auth state from a valid backup during startup. (#99070) Thanks @LeonidasLux. - **WhatsApp quoted replies:** preserve bot-authored outbound quote metadata so replies to those messages keep their reply bubble in WhatsApp Desktop. (#94879) Thanks @Bartok9. - **WhatsApp reconnect catch-up:** admit recently missed Baileys `append` messages during a bounded reconnect window while preserving startup stale-history guards. (#80642) Thanks @VishalJ99. - **WhatsApp restart recovery:** stop automatic restart loops after logged-out or connection-replaced disconnects until the account reconnects. (#78511) Thanks @openperf. - **Local Gateway CLI auth:** keep loopback CLI token/password calls off durable device scopes so read probes cannot block later write/admin commands behind a stale pairing baseline. (#95997) Thanks @vincentkoc. - **Plugin module identity:** keep OpenClaw package chunks on Node's native module graph when jiti transforms plugin entries, preventing duplicate evaluation and class identity drift. (#88384) Thanks @vincentkoc. - **Shell completion repair:** generate core-only caches during doctor and update repair while preserving full plugin command completion for onboarding and explicit user rebuilds. (#76235) - **MCP schema diagnostics:** attribute draft-2020-12 compiler failures to the external MCP schema so malformed patterns produce actionable setup errors. Thanks @vincentkoc. - **Windows Scheduled Task recovery:** keep clean early exits inside the existing bounded launch poll, falling back only when neither the task process nor Gateway listener becomes observable. (#76245) - **iMessage group warnings:** suppress the false drop-all startup warning when an effective group sender allowlist can admit groups, and point true empty-allowlist configurations at the correct remedy. (#100046) - **Control UI mobile login:** keep Gateway recovery guidance visible after connection failures, make the disconnected gate scroll safely on constrained screens, and improve mobile keyboard and tap-target behavior. (#100208) - **TUI streaming:** render delta-only assistant events in live Gateway and embedded TUI sessions instead of waiting for the final response. (#83000) Thanks @flashosophy. - **Model aliases:** resolve provider-qualified aliases during session and chat-command model switches without collisions when providers share a display alias. (#100209) Thanks @sahilsatralkar. - **TUI new-session hooks:** create `/new` sessions through the shared Gateway lifecycle so command and session hooks receive the completed parent transcript in both Gateway and embedded modes, while preventing rollover during an active turn. (#100241, #49918) Thanks @BingqingLyu. - **TUI abort diagnostics:** show sanitized tool argument-validation summaries for aborted runs in both Gateway and local TUI modes without exposing raw model arguments. (#91002) Thanks @wsyjh8. - **iOS Watch replies:** persist queued quick replies in the gateway-scoped chat outbox and submit them through idempotent chat delivery, preventing losses, duplicates, and cross-gateway sends after reconnects. (#100031) Thanks @NianJiuZst. - **iOS Gateway auth retry:** restrict stored device-token retry to parsed loopback hosts and reject wildcard bind addresses, preventing remote lookalike hostnames from receiving trusted retry credentials. (#99859) Thanks @ly85206559. - **Amazon Bedrock control-plane deadlines:** bound model discovery and application inference-profile lookups, preserve caller cancellation, and close short-lived SDK clients after each request path. Thanks @Alix-007. - **Bedrock Mantle discovery:** bound model-catalog fetch time and response size, and release rejected response bodies so stalled, oversized, or failed provider responses fall back safely. (#99961) Thanks @zhangguiping-xydt. - **Discord thread-title prompts:** truncate generated-title message and channel context on UTF-16 boundaries so emoji cannot leave malformed model prompt text. (#101551) Thanks @Alix-007. - **Task state migration:** canonicalize legacy `not-requested` delivery statuses during sidecar import and existing shared-database open so upgraded task registries and linked TaskFlows recover without manual SQL, and surface rejected persisted values in compact console diagnostics. (#103946) Thanks @bek91. - **Reply pre-delivery recovery:** bound each pre-delivery callback with an owner-overridable deadline, release serialized reply lanes after hung plugin work, and preserve durable final-delivery retry state only when transport never started. (#104256) Thanks @NianJiuZst. - **Signal native quote replies:** preserve the active inbound message as a native quote across agent, explicit, durable, and chunked sends while keeping reply-mode policy inside the Signal plugin. (#105347) Thanks @jesse-merhi. - **Media-store remote downloads:** bound response-header waits and stalled bodies, close abandoned redirect and error responses, and remove partial temp files so hung sources cannot pin callers. (#104624) Thanks @hugenshen. - **Cron llama.cpp tool schemas:** keep the model-facing cron declaration schema compatible with llama.cpp while retaining gateway and runtime nonblank validation. Fixes #107449. (#108360) Thanks @lee-xydt. - **System-agent recovery guidance:** direct browser and app users to Settings or the OpenClaw host instead of terminal-only exit guidance while preserving the required stop, onboard, and restart lifecycle. (#114633) Thanks @jesse-merhi. ## 2026.7.1 OpenClaw v2026.7.1 brings major Control UI and onboarding overhauls, major updates to the official iOS, Android, and macOS apps, expanded model and provider support including GPT-5.6 compatibility, Tencent Hy3, and Meta Muse Spark 1.1, and stronger Codex and connected coding-agent workflows. Telegram, Slack, Discord, and Apple Messages each receive substantial updates, while Gateway crash loops, scheduled work, remote browser control, workspace terminals, sessions, and goals also improve. There are also many general fixes and refinements throughout OpenClaw. [Full release notes](https://docs.openclaw.ai/releases/2026.7.1) ### Highlights #### Control UI The [Control UI](https://docs.openclaw.ai/web/control-ui) now works more like one browser workspace for conversations and parallel work. Chats receive clearer titles, recent sessions are easier to find, pin, group, rename, fork, archive, and mark read, and multiple sessions can sit in resizable panes that return after a reload. Drag-and-drop placement, a denser Sessions page, and a live Tasks view make it easier to move between active work without juggling browser tabs. Chat controls are clearer while work is in progress. The composer keeps attachments, model choice, voice, reasoning, send and stop state, and message actions usable across screen sizes; Talk users can choose or refresh a microphone from settings and get readable permission guidance on narrow screens; quoted replies preserve the point being answered; and compact tool rows keep inputs, results, images, progress, errors, approvals, and steering available without overwhelming the conversation. Usage information is easier to understand from both [status views](https://docs.openclaw.ai/cli/status) and the browser. The Usage page compares recent estimated spend and daily values without repeated reloads or hovering, shows each provider, model, agent, or channel's share, and can include provider-reported plans, quotas, balances, budgets, and Anthropic or OpenAI billing details. Seven-, thirty-, and ninety-day charts now keep zero-activity days visible, large all-agent reports limit concurrent work to reduce slowdowns and memory pressure, and chat-level context panels and completed-message details show the active model, tokens, cache use, context pressure, and estimated cost. Mobile pairing, Gateway health, desktop-node approvals, linked GitHub work, workspace files, scheduled jobs, worktrees, Workboard items, and background tasks are now available closer to the conversation. Their status, permissions, and next steps are also clearer. The rework also strengthens the paths underneath those controls. Dashboard connects and reconnects use less temporary Gateway memory, reducing false pressure warnings, while temporary Gateway restarts and stale assets recover more cleanly. Path-routed Gateways keep the right destination and credentials, saved choices survive refreshes, and authentication, protocol, update, and pairing failures show more useful next steps instead of leaving the page stuck or ambiguous. Responsive layouts keep chat history and controls usable on phones, tablets, short landscape screens, and large desktops. Keyboard and focus behavior, contrast, assistive labels, copying, scrolling, and touch targets are more consistent, while navigation, pairing, voice, schedule, and status text reaches more supported languages. - New Control UI chats now receive concise sidebar titles from their first message, and operators can route dashboard, Telegram topic, and Discord thread title generation through a smaller `utilityModel`. [#87643](https://github.com/openclaw/openclaw/pull/87643) Thanks @juliangsm, @zhangguiping-xydt. - Paired administrators can now create a mobile setup QR or copyable code from Control UI Nodes and use it to connect an official iOS or Android app. [#94672](https://github.com/openclaw/openclaw/pull/94672) Thanks @bkudiess, @douhualili. - Control UI now makes conversations easier to create, find, and switch from a populated session sidebar, while keeping context pressure and provider quota information close at hand. [#99289](https://github.com/openclaw/openclaw/pull/99289) Related [#99288](https://github.com/openclaw/openclaw/issues/99288). - The Control UI sidebar now focuses on sessions and a few default destinations while letting users pin their preferred pages and keep those choices across reloads. [#100296](https://github.com/openclaw/openclaw/pull/100296) - The redesigned Control UI composer keeps attachments, provider and model selection, voice, run state, and message actions clearer and more stable across mobile and desktop layouts. [#100461](https://github.com/openclaw/openclaw/pull/100461) Thanks @fuller-stack-dev. - Control UI Talk users can choose and refresh a microphone on narrow screens and read clear permission guidance when browser access is blocked. [#101377](https://github.com/openclaw/openclaw/pull/101377) Thanks @fuller-stack-dev. - Control UI chat can now show multiple resizable sessions side by side or stacked, preserve the pane layout across reloads, and keep the active pane usable on narrow screens. [#100754](https://github.com/openclaw/openclaw/pull/100754) - The Control UI now has a live Tasks page where operators can inspect active and recent background work, open its session, refresh details, and cancel queued or running tasks when authorized. [#100789](https://github.com/openclaw/openclaw/pull/100789) - Session lists across web and mobile now support pinned and custom groups, shared read and unread status, background-output indicators, transcript forking, and in-place rename, archive, move, and delete actions. [#100814](https://github.com/openclaw/openclaw/pull/100814) - The Control UI Sessions page now fits more useful status and actions on a typical screen, with row details opening to reveal labels, tuning controls, and checkpoint history instead of forcing routine sideways scrolling. [#100943](https://github.com/openclaw/openclaw/pull/100943) - Control UI users can drag a session directly into the current pane or onto any side to create a split, with a preview showing where it will land. [#101191](https://github.com/openclaw/openclaw/pull/101191) - Operators can configure token or full per-reply usage footers once with `messages.responseUsage`, while users can turn them off or reset a session to the inherited default. [#89762](https://github.com/openclaw/openclaw/pull/89762) Thanks @marvinthebored, @obviyus, @peetiegonzalez. - The Control UI Usage page now makes recent estimated costs, daily values, and each provider, model, agent, or channel's share easier to compare without repeated reloads or hovering. [#100432](https://github.com/openclaw/openclaw/pull/100432) - The Usage page now shows provider-reported plans, quotas, reset times, balances, spending, and budgets alongside OpenClaw session analysis, including OpenRouter and Venice coverage. [#100520](https://github.com/openclaw/openclaw/pull/100520) - Control UI Usage can now show Anthropic and OpenAI daily spend, tokens, requests, top models, and billing categories for today, seven days, and thirty days when admin credentials are configured. [#100672](https://github.com/openclaw/openclaw/pull/100672) - Daily token and cost charts now include zero-activity days across bounded date ranges, so 7-day, 30-day, and 90-day views show the full calendar period instead of shrinking around active days. [#81467](https://github.com/openclaw/openclaw/pull/81467) Thanks @adapepper. - All-agent cost reports on large installations now limit concurrent Gateway work so the dashboard is less likely to slow down, time out, or add memory pressure. [#101589](https://github.com/openclaw/openclaw/pull/101589) Thanks @vincentkoc, @zw-xysk. - Hovering or keyboard-focusing a public GitHub issue or pull request in Control UI chat now previews its status, title, author, activity, comments, and change size without leaving the conversation. [#100434](https://github.com/openclaw/openclaw/pull/100434) - File paths in Control UI chats are now clickable, opening a searchable syntax-highlighted preview at the cited line with options to reveal, copy, or open the file in a supported editor. [#100679](https://github.com/openclaw/openclaw/pull/100679) - Control UI connection failures now show actionable messages such as "Pairing required" instead of replacing them with a generic gateway disconnect. [#54758](https://github.com/openclaw/openclaw/pull/54758) Thanks @ruanrrn. - Control UI sessions using full verbose output now open tool inputs and results by default, reducing repeated clicks during debugging and review. [#74398](https://github.com/openclaw/openclaw/pull/74398) Thanks @samrusani. - The Control UI context indicator now remains visible with an approximate cached total while a response is active, without using stale data for urgent warnings or the Compact action. [#89772](https://github.com/openclaw/openclaw/pull/89772) Thanks @bladin. - Control UI and WebChat no longer let a non-terminal internal tool failure dominate the transcript with a red error banner after the assistant has already produced a normal final answer. [#90122](https://github.com/openclaw/openclaw/pull/90122) Thanks @harjothkhara. - A default agent selected in the Control UI now remains selected after refresh without saving unrelated unfinished settings. [#91457](https://github.com/openclaw/openclaw/pull/91457) Thanks @zengwen-dt. - Segmented streaming replies in Control UI WebChat now stay under one assistant avatar and footer instead of appearing as several separate responses. [#92063](https://github.com/openclaw/openclaw/pull/92063) Related [#63956](https://github.com/openclaw/openclaw/issues/63956). Thanks @contentfree, @harjothkhara. - Dashboard WebChat users can right-click a completed message and reply with visible quote context instead of manually copying and formatting it. [#92654](https://github.com/openclaw/openclaw/pull/92654) Thanks @programmingwtf, @vincentkoc. - After an update installs, the Control UI now says when a Gateway restart is already in progress instead of making the Update button appear unresponsive. [#93082](https://github.com/openclaw/openclaw/pull/93082) Thanks @goutamadwant. - Live tool-using replies in Control UI WebChat now keep the assistant's introduction ahead of the tool card, even when browser and Gateway clocks differ. [#93184](https://github.com/openclaw/openclaw/pull/93184) Thanks @pick-cat. - Control UI Quick Create now lets users choose a model for an agent-turn cron job and shows whether existing jobs use that model or the default. [#95341](https://github.com/openclaw/openclaw/pull/95341) Thanks @ly85206559. - Control UI WebChat can now show Codex preamble and commentary while tools are running, with a choice to hide or retain that progress after the final answer. [#95708](https://github.com/openclaw/openclaw/pull/95708) Thanks @obviyus, @ragesaq. - Long reply IDs containing emoji or other supplementary characters now remain valid when shortened for WebChat and Gateway reply directives instead of being cut into malformed text. [#96938](https://github.com/openclaw/openclaw/pull/96938) Thanks @ly-wang19. - Long tool activity details now remain readable when shortened for chat, UI, or logs, even when an emoji or other supplementary character falls at the cutoff. [#96958](https://github.com/openclaw/openclaw/pull/96958) Thanks @bartok9, @ly-wang19, @vincentkoc. - WebChat now shows long provider and model names together with the selected reasoning level in the composer, while narrow screens retain a sensible overflow limit. [#96990](https://github.com/openclaw/openclaw/pull/96990) Thanks @maweibin, @xiayingren123. - Agents can use targetless `message.send` for progress or intermediate updates in the current WebChat without an explicit destination. [#97167](https://github.com/openclaw/openclaw/pull/97167) Related [#96840](https://github.com/openclaw/openclaw/issues/96840). Thanks @mantiscartography, @zhangguiping-xydt. - New Control UI chats now use the selected model's current context window instead of inheriting an outdated, smaller limit from a parent session. [#97332](https://github.com/openclaw/openclaw/pull/97332) Thanks @galiniliev. - WebChat stays on the newest reply when assistant audio or video finishes loading, while respecting readers who intentionally scrolled upward. [#97575](https://github.com/openclaw/openclaw/pull/97575) Thanks @turbotheturtle. - Control UI pages for multiple Gateways on one domain now stay connected to the Gateway named by their path instead of reusing a sibling page's saved destination. [#97665](https://github.com/openclaw/openclaw/pull/97665) Thanks @alix-007. - `/pair qr` now delivers a scannable code in Telegram and Control UI or a readable code in the TUI without storing the one-time setup secret in chat history. [#97933](https://github.com/openclaw/openclaw/pull/97933) Thanks @joshavant. - Expired `/pair qr` cards in Control UI now clearly say the code is unusable and direct users to generate a fresh one. [#98049](https://github.com/openclaw/openclaw/pull/98049) Related [#98039](https://github.com/openclaw/openclaw/issues/98039). Thanks @ooiuuii. - Expired mobile-pairing codes now explain how to run `/pair qr` again in the selected language. Sources: [bb4afe4](https://github.com/openclaw/openclaw/commit/bb4afe40ae6dbd1c711d22cdaee0b36cf404e5f8), [da9308d](https://github.com/openclaw/openclaw/commit/da9308ddb73113b54c860eafe8d8c2a81b860e41), [dfaec18](https://github.com/openclaw/openclaw/commit/dfaec1888d7ab3f5464ddd5a4a0b6f9fa9cfdb68), [6b7986e](https://github.com/openclaw/openclaw/commit/6b7986e14e00978e4a0b30faf324b3a21f35c717), [21af6e7](https://github.com/openclaw/openclaw/commit/21af6e7b19bfcea5da47316bac973eeb2d211ce8), [4e62124](https://github.com/openclaw/openclaw/commit/4e621240e8da1783657b87ea0c53a750274ea377), [6cd0106](https://github.com/openclaw/openclaw/commit/6cd0106bbc20b9d42a3d714f09e3ced3607fb208), [a72a641](https://github.com/openclaw/openclaw/commit/a72a64136ea047a05a0558f41760b57480ae5e5e), [a143ae4](https://github.com/openclaw/openclaw/commit/a143ae4e7dfea84b209948cd26044b8d8aec77e3), [cd30b1c](https://github.com/openclaw/openclaw/commit/cd30b1c3eeef9eb1b20b858aebb805698cded6f2), [f69e27a](https://github.com/openclaw/openclaw/commit/f69e27afa2b4fb99e169c51a49f39c3fb7e09c21), [ccddbee](https://github.com/openclaw/openclaw/commit/ccddbeea6a104fdf292a9d6ba2e8cca60dd21631), [9ed03df](https://github.com/openclaw/openclaw/commit/9ed03df44d812ccb14b2e69897be7e3209b65770), [f84243f](https://github.com/openclaw/openclaw/commit/f84243fe3fb4d83adb97e88baf607329ab9e9aa2), [3d06ee9](https://github.com/openclaw/openclaw/commit/3d06ee9ed78e946cc02d5b7af9e974c331e60e96), [9bd071e](https://github.com/openclaw/openclaw/commit/9bd071ead3d14e533e619acac075dba2c40bc9ec), [405b7a5](https://github.com/openclaw/openclaw/commit/405b7a52c159f996fc9a7dfc3bc899e2f3411ba0), [1a160ce](https://github.com/openclaw/openclaw/commit/1a160cec093e48141912e8b2f92a5c5ea007e6b5). - Control UI now shows channel-triggered agent runs as in progress, so users can tell that messages from channels such as Weixin are actively being handled. [#98257](https://github.com/openclaw/openclaw/pull/98257) Thanks @scotthuang. - The Control UI workspace rail now gives long Project files lists their own scrollbar so files remain browsable without spilling off screen. [#98646](https://github.com/openclaw/openclaw/pull/98646) Related [#98566](https://github.com/openclaw/openclaw/issues/98566). Thanks @645648406-max, @wuqxuan. - Session Workspace file paths can now be copied from Chat even when the Control UI runs over plain HTTP or another context without the standard Clipboard API. [#98764](https://github.com/openclaw/openclaw/pull/98764) Related [#98759](https://github.com/openclaw/openclaw/issues/98759). Thanks @adinballew, @zengwen-dt. - Tool-heavy Control UI chats now use compact expandable activity rows, so commands and results take less space while full details stay one click away. [#99763](https://github.com/openclaw/openclaw/pull/99763) - The Control UI now stays fixed during trackpad overscroll on Mac and desktop browsers while chat threads and lists continue scrolling normally. [#99830](https://github.com/openclaw/openclaw/pull/99830) - Control UI chat is easier to scan with quieter composer controls, a Faster-to-Smarter reasoning slider, and connection status that no longer competes with persistent version text. [#99838](https://github.com/openclaw/openclaw/pull/99838) Related [#99837](https://github.com/openclaw/openclaw/issues/99837). - Mounted deep links, Set Default, authenticated avatars, cron alerts, and Workboard scrolling now behave correctly again across the Control UI. [#100106](https://github.com/openclaw/openclaw/pull/100106) - Administrators can now open mobile pairing from any Control UI page or Quick Settings, while non-admin operators continue to see the action disabled with an access explanation. [#100157](https://github.com/openclaw/openclaw/pull/100157) - The Control UI now shows a ready mobile-pairing QR code immediately even when the pending-device list is slow, then adds approval requests when they arrive. [#100179](https://github.com/openclaw/openclaw/pull/100179) - Control UI users can select and copy tool activity without toggling its row, and failed tools no longer repeat redundant error indicators. [#100199](https://github.com/openclaw/openclaw/pull/100199) Thanks @steipete-oai. - The Gateway Dashboard login now fits and behaves better on phones and short windows, with larger touch targets, easier URL entry, and reachable recovery help. [#100208](https://github.com/openclaw/openclaw/pull/100208) - Control UI users can organize large session lists by custom group, channel, kind, agent, or date, with persistent assignments and drag-and-drop management. [#100262](https://github.com/openclaw/openclaw/pull/100262) - Users can open the Control UI context ring to inspect exact context use, the latest input and output token counts, and the active model without leaving chat. [#100264](https://github.com/openclaw/openclaw/pull/100264) - Images returned by tools such as `read` now appear directly in the Control UI conversation instead of only being mentioned in text. [#100295](https://github.com/openclaw/openclaw/pull/100295) Thanks @lzyyzznl, @pandah97, @rquinones84. - Control UI tool activity now combines matching calls and results into one consistent row, removes repeated labels and categories, and keeps inputs, outputs, previews, and real errors accessible. [#100318](https://github.com/openclaw/openclaw/pull/100318) - The Control UI context panel now shows the latest run's estimated total cost and available input, output, cache-read, and cache-write breakdowns beside the provider and model. [#100379](https://github.com/openclaw/openclaw/pull/100379) - The Control UI sidebar now keeps all pinned chats visible alongside nine ordinary recent chats in a more compact, conversation-focused desktop and tablet layout. [#100386](https://github.com/openclaw/openclaw/pull/100386) - The Control UI composer now shows reasoning level clearly, keeps Talk and its settings together, and preserves usable model controls on phone and landscape layouts. [#100445](https://github.com/openclaw/openclaw/pull/100445) - Control UI Talk now starts from a simpler composer while administrators can set durable provider, transport, timing, and reasoning defaults in Settings. [#100453](https://github.com/openclaw/openclaw/pull/100453) - Temporary Gateway disconnects no longer replace an authenticated Control UI page with the login screen, preserving dashboard context while automatic reconnection continues. [#100479](https://github.com/openclaw/openclaw/pull/100479) - The Control UI Cron Jobs page now uses compact summaries, clear status cues, expandable details, and an overflow menu so large job lists are faster to review. [#100646](https://github.com/openclaw/openclaw/pull/100646) - The Control UI sidebar now keeps recent chats in place while switching, combines search entry points, supports touch session actions, and reduces unnecessary chrome. [#100648](https://github.com/openclaw/openclaw/pull/100648) - Images received through Telegram, iMessage, and other channels now reappear inline when users revisit Control UI chat history after a reload. [#100725](https://github.com/openclaw/openclaw/pull/100725) Thanks @sweetcornna, @vergissberlin. - The Control UI goal pill now supports pause, resume, clear, inspection, and edit preparation with live timing and token details, while command and TUI users can reword a goal without resetting its budget. [#100736](https://github.com/openclaw/openclaw/pull/100736) - The Control UI keeps Overview, Workboard, Agents, and More visible while allowing the session list to use available height and scroll independently. [#100742](https://github.com/openclaw/openclaw/pull/100742) - Assistant documents downloaded from the Control UI now keep recognizable original filenames instead of exposing UUID-suffixed staging names. [#100743](https://github.com/openclaw/openclaw/pull/100743) - Copying code from a long Control UI reply now keeps the chat at the same reading position instead of jumping upward. [#100807](https://github.com/openclaw/openclaw/pull/100807) Thanks @jvlegod. - Desktop Control UI users can choose whether Enter sends or inserts a new line, with Command+Enter or Ctrl+Enter available as the send shortcut and the choice retained for that Gateway. [#100810](https://github.com/openclaw/openclaw/pull/100810) Thanks @moomx, @vincentkoc. - Switching Control UI chats no longer unexpectedly moves the selected session to the top, and users can choose stable creation order or recently updated order for the sidebar. [#100927](https://github.com/openclaw/openclaw/pull/100927) Thanks @shakkernerd, @vyctorbrzezowski. - Control UI Settings now use consistent `/settings/...` paths while old bookmarks continue to work, making reloads and links more reliable on hosted or reverse-proxied installations. [#100928](https://github.com/openclaw/openclaw/pull/100928) Thanks @vyctorbrzezowski. - Control UI navigation now places branding, search, and sidebar controls where desktop and mobile users expect them, with clearer active sessions, compact timestamps, and easier terminal access. [#101017](https://github.com/openclaw/openclaw/pull/101017) Thanks @shakkernerd, @vyctorbrzezowski. - The Control UI sidebar collapse control now sits in the sidebar it affects instead of looking like an unrelated topbar or terminal button. [#101038](https://github.com/openclaw/openclaw/pull/101038) - Control UI Talk users can choose the system default or any browser-visible microphone beside the Talk button and receive a clear message when a saved device is unavailable. [#101100](https://github.com/openclaw/openclaw/pull/101100) - Sidebar session groups can now be renamed, removed without deleting sessions, created while empty, or disabled to restore one flat recent-session list. [#101117](https://github.com/openclaw/openclaw/pull/101117) - The Control UI now shows Workboard navigation only when Workboard is enabled and presents a cleaner collapsed sidebar with clearer icons and status spacing. [#101123](https://github.com/openclaw/openclaw/pull/101123) - The Control UI now puts search, sidebar access, theme choice, and macOS branding in clearer, more predictable locations with accurate screen-reader labels. [#101497](https://github.com/openclaw/openclaw/pull/101497) - Temporary Gateway drops no longer push Control UI content down with a full-width banner, so the dashboard stays in place while a compact Retry notice appears. [#101812](https://github.com/openclaw/openclaw/pull/101812) - Temporary Gateway disconnects now use a calmer, dashboard-native reconnect pill with the same Retry and accessibility behavior. [#101844](https://github.com/openclaw/openclaw/pull/101844) - Control UI commentary settings now use the selected language across the supported translations in this release. Sources: [34badde](https://github.com/openclaw/openclaw/commit/34badde1d983c247cd6b16ad8f5b4e1f9891c0f1), [a9cb866](https://github.com/openclaw/openclaw/commit/a9cb866f62fe9c2f7c8f9a8c3ef1a23cae556781), [ce9166d](https://github.com/openclaw/openclaw/commit/ce9166d1cd8404db51004bbdd5edc95d229788c8), [6b67ada](https://github.com/openclaw/openclaw/commit/6b67ada87ad934f6dd8afbda95830381b3767247), [006c2f7](https://github.com/openclaw/openclaw/commit/006c2f7a2b28433753521f2f9f729ba0032b51ff), [6bdffa5](https://github.com/openclaw/openclaw/commit/6bdffa501bcf8eb1b3b13122b6e2e76149693f07), [b4476ab](https://github.com/openclaw/openclaw/commit/b4476ab72f9d74a946ef0cc963e4d26dab280e45), [5b5c623](https://github.com/openclaw/openclaw/commit/5b5c6237c236b79a894c6d2c1dd4d3bd7e5188f3), [1520d09](https://github.com/openclaw/openclaw/commit/1520d0980741c85407c4e2037dfd5fb9d8f9d1c4), [6140326](https://github.com/openclaw/openclaw/commit/614032676d16bf2dd98030e7925f14ad52f5618e), [75bd44a](https://github.com/openclaw/openclaw/commit/75bd44a94bfb096010273ae14935b9cd90ccc2d3), [c1aeaf9](https://github.com/openclaw/openclaw/commit/c1aeaf9287ec25428ed1e673d869e193e930ba6b), [49edc0a](https://github.com/openclaw/openclaw/commit/49edc0a8af2f06cca21cd6df2abd81a7d99a574c), [cb69ce7](https://github.com/openclaw/openclaw/commit/cb69ce7ba84f7252acd3b87653a0a91b7442f41d), [bb0af61](https://github.com/openclaw/openclaw/commit/bb0af61d20277cf91205e6fe561dc7cccfc8e969), [0dcfbb0](https://github.com/openclaw/openclaw/commit/0dcfbb09d807800585219a4363eb67438b006f40), [db73ece](https://github.com/openclaw/openclaw/commit/db73ece2de77053433a767bcc587348d5a77fef1), [21e6fc9](https://github.com/openclaw/openclaw/commit/21e6fc948b1977b5702ab4c981dacf4d0b3b6de6). - The All Sessions sidebar label now uses the selected language across the supported Control UI translations in this release. Sources: [b2c3dc2](https://github.com/openclaw/openclaw/commit/b2c3dc2d55f8bef05f2c8107b9c9b867653aec20), [61347a5](https://github.com/openclaw/openclaw/commit/61347a5054e6c4fce8dee39509c104521b087c7e), [a2674b6](https://github.com/openclaw/openclaw/commit/a2674b6aa4333a6c37ddb3cf7a4c7f52924c37c6), [bbabad4](https://github.com/openclaw/openclaw/commit/bbabad4031c3cab4f0e685fb0fcab183520291ab), [8909289](https://github.com/openclaw/openclaw/commit/89092893fea34eefecca09076d643a5b08f62498), [22552d6](https://github.com/openclaw/openclaw/commit/22552d6e667fa8c35ff236f85d3d3e1aa66872fb), [96e3615](https://github.com/openclaw/openclaw/commit/96e361558e7367f452a2b400fc8120c3a4f6fc72), [452351c](https://github.com/openclaw/openclaw/commit/452351cc7152abdd765445a2109726e5278b153f), [5e9a62c](https://github.com/openclaw/openclaw/commit/5e9a62cc1945850b72d7944e937fef969c9f8ed1), [0a9648b](https://github.com/openclaw/openclaw/commit/0a9648ba4766e0c5da87866d6c7299bb07ede4fa), [a803589](https://github.com/openclaw/openclaw/commit/a8035892b1f04b20f1b8e687094e6e7a18dee45c), [7c30ff8](https://github.com/openclaw/openclaw/commit/7c30ff8a60896a290de07af45d0176d2e30069e5), [e3d2878](https://github.com/openclaw/openclaw/commit/e3d2878af44f7095436d6754f73431b9add676b1), [620f2e3](https://github.com/openclaw/openclaw/commit/620f2e3112016622c59350e4aaf71a0e448d0c1a), [aa0f36c](https://github.com/openclaw/openclaw/commit/aa0f36cb0632ae283493f9d01f3d9819548b5107), [c336256](https://github.com/openclaw/openclaw/commit/c336256309956b18ff4c211ab62481c6dcd59d8b), [64dd688](https://github.com/openclaw/openclaw/commit/64dd68899e6b9f8b15c9a3c533e470ba6e36d7a5), [e2ecbc8](https://github.com/openclaw/openclaw/commit/e2ecbc85b7fe30b3096f86ba9cb189fb43807850). - The Control UI mobile-pairing flow now appears in the selected language across 18 supported locales instead of mixing localized screens with English setup text. [c78b0d5](https://github.com/openclaw/openclaw/commit/c78b0d59f5a2becf7e3e0f0bb5d470f72e8526ed) - A failed Control UI login or Gateway connection now immediately shows the error, recovery steps, and relevant documentation link instead of hiding them in a collapsed panel. [f9e194e](https://github.com/openclaw/openclaw/commit/f9e194e4a122f0c142c23f1bc9603466add7eb03) - The web sidebar now reliably fills pinned and overflow navigation routes, keeping destinations such as Worktrees available. [55a0012](https://github.com/openclaw/openclaw/commit/55a0012c44b52af2f22982cc85568e6e5d0df5c7) Thanks @vincentkoc. - Non-English Control UI users now see translated cron overflow-menu and "run if due" labels, including the assistive label for more actions. [2585d6b](https://github.com/openclaw/openclaw/commit/2585d6b2e8202149576f643259c932406a6f8294) - The Control UI microphone-access warning for realtime voice input now appears in the user's selected language. [68c85ef](https://github.com/openclaw/openclaw/commit/68c85effcd1e0a1c65673397a206e53bf7d672ac) - The Control UI sidebar now builds cleanly with session grouping and drag-to-split behavior intact after stray merge-conflict text was removed. [0e3ce24](https://github.com/openclaw/openclaw/commit/0e3ce24cc8cd16faa78d87b12b114fcf24a42d87) - Hindi and Russian users can now receive matching Control UI translations, and documentation operators can generate those language editions through the existing locale workflow. [689baa5](https://github.com/openclaw/openclaw/commit/689baa5c1e48be2aa31564fd5c3fd21bf4dfb754) Thanks @vincentkoc. - During device pairing, `/ pair qr` now follows the same authorized pairing flow as `/pair qr` without starting an agent turn or disrupting the existing Control UI route. [#98262](https://github.com/openclaw/openclaw/pull/98262) Thanks @brokemac79. - Opening or reconnecting the Control UI dashboard now uses much less temporary Gateway memory, reducing false `rss_growth` warnings while preserving requested usage totals. [#100054](https://github.com/openclaw/openclaw/pull/100054) Thanks @nianjiuzst. - Control UI Settings now shows a remote Gateway's host identity, address, operating system, runtime, uptime, CPU load, memory, and free disk space without requiring SSH. [#100478](https://github.com/openclaw/openclaw/pull/100478) - The Control UI now shows execution approvals for supported desktop nodes and rejects pending, unsupported, or policy-blocked requests before they reach the node. [#100505](https://github.com/openclaw/openclaw/pull/100505) Thanks @vincentkoc. - A configured `ui.seamColor` now changes Control UI buttons, highlights, selections, and focus rings, while invalid values fall back cleanly. [#93699](https://github.com/openclaw/openclaw/pull/93699) Thanks @dennis-lynch, @goutamadwant. - QR codes and other half-block text art in the Control UI now preserve spacing, scroll when needed, and copy with enough padding to remain usable. [#93869](https://github.com/openclaw/openclaw/pull/93869) Thanks @emg110, @vincentkoc. - Open Control UI tabs now switch to the active build after a service-worker update, reducing stale JavaScript, CSS, and protocol mismatch errors after upgrades. [#96141](https://github.com/openclaw/openclaw/pull/96141) Thanks @andrewccctechlink, @brokemac79. - Chat clients can now match each pending user message to its exact Gateway-confirmed message, reducing duplicate or mismatched bubbles during interleaved turns. [#96273](https://github.com/openclaw/openclaw/pull/96273) Thanks @datus1982, @wyf027. - Clicking a cron job's History button now gives immediate feedback and scrolls directly to that job's updated run history. [#96281](https://github.com/openclaw/openclaw/pull/96281) Thanks @wyf027, @yzhong52. - Control UI token totals near one million now display as `1.0M` instead of the confusing `1000k`. [#96298](https://github.com/openclaw/openclaw/pull/96298) Thanks @ly-wang19. - Usage Mosaic and usage summaries now show near-million token totals as `1.0M` instead of `1000.0K`. [#96450](https://github.com/openclaw/openclaw/pull/96450) Thanks @ly-wang19. - The Voice, Model, and Sensitivity controls in Control UI Talk settings now align consistently in one row without duplicate selected-value text disturbing the layout. [#96925](https://github.com/openclaw/openclaw/pull/96925) Thanks @evan-ym. - Control UI approval prompts no longer inherit failures from older requests or re-enable controls while the current decision is still being processed. [#98394](https://github.com/openclaw/openclaw/pull/98394) Thanks @haruaiclone-droid. - Control UI now stops retrying after detecting an incompatible Gateway protocol and shows the update or reload guidance needed to reconnect. [#98414](https://github.com/openclaw/openclaw/pull/98414) Thanks @haruaiclone-droid. - On phones and other short landscape screens, the Control UI composer now scrolls within a bounded area so chat history and all composing controls remain accessible. [#98683](https://github.com/openclaw/openclaw/pull/98683) Related [#98615](https://github.com/openclaw/openclaw/issues/98615). Thanks @jin-li, @qingminglong. - The Control UI now retries after a temporary failed load during a Gateway restart or stale-asset transition instead of remaining stuck until the page is refreshed manually. [#99111](https://github.com/openclaw/openclaw/pull/99111) Thanks @zengwen-dt. - Large pasted PNG screenshots can now be sent through Control UI webchat without failing during attachment processing. [#99213](https://github.com/openclaw/openclaw/pull/99213) Thanks @jincheng-xydt, @vincentkoc. - The Control UI mobile-pairing flow is now fully localized for Hindi and Russian users, from setup-code creation through pending-device management. [#100040](https://github.com/openclaw/openclaw/pull/100040) - The Control UI workspace rail now sits flush with the window and uses less space when collapsed, removing the empty strip without overlapping chat. [#100088](https://github.com/openclaw/openclaw/pull/100088) - Control UI chat history now hides only exact duplicate final delivery mirrors, leaving legitimate repeated sends, forwards, and distinct replies visible. [#100136](https://github.com/openclaw/openclaw/pull/100136) - Control UI chats now leave consistent space above the first message across phones, standard desktops, and tall windows. [#100144](https://github.com/openclaw/openclaw/pull/100144) Thanks @steipete-oai. - Control UI Settings now offers a persistent Simple/Advanced switch, cleaner Appearance controls, and a Pending label only when a Context Profile change is actually staged. [#100147](https://github.com/openclaw/openclaw/pull/100147) - Control UI tool-call bubbles and error badges now share clean right-edge alignment, so failed activity is easier to scan on phone-sized and desktop chats. [#100163](https://github.com/openclaw/openclaw/pull/100163) Thanks @steipete-oai. - OpenAI users now see only the supported Standard and Fast choices in the Control UI speed picker, with inherited Fast mode shown correctly. [#100190](https://github.com/openclaw/openclaw/pull/100190) - Short drafts in the Control UI composer no longer show an unnecessary scrollbar gutter, while long drafts still scroll when needed. [#100252](https://github.com/openclaw/openclaw/pull/100252) - Clearing a session label now removes the old name promptly from other subscribed Control UI clients without requiring a full refresh. [#100266](https://github.com/openclaw/openclaw/pull/100266) - Desktop Control UI users can hover a shortened recent-session name to reveal its hidden tail and distinguish similar conversations without opening each one. [#100276](https://github.com/openclaw/openclaw/pull/100276) - The expanded Control UI sidebar no longer repeats provider quota information already available in chat, Overview, and Usage views. [#100356](https://github.com/openclaw/openclaw/pull/100356) Thanks @shakkernerd. - Completed Control UI messages now use the timestamp to open token, cache, context, cost, and model details instead of adding a separate Context control to every footer. [#100391](https://github.com/openclaw/openclaw/pull/100391) Thanks @steipete-oai. - Autonomous session history now keeps an earlier failed cron or scheduled turn marked as an error even after a later turn succeeds or the page reloads. [#100514](https://github.com/openclaw/openclaw/pull/100514) Thanks @qingminglong. - The Control UI Skills page now shows readable Agent and Search labels with aligned filters and correctly sized selection controls. [#100526](https://github.com/openclaw/openclaw/pull/100526) Thanks @evan-ym. - After a Control UI reply finishes, the composer now stays on Send despite delayed completed-run state, while a real new run still switches it to Stop. [#100527](https://github.com/openclaw/openclaw/pull/100527) Thanks @tiffanychum. - Control UI and Skill Workshop file previews now show a single Escape shortcut hint while retaining Escape-to-close behavior. [#100528](https://github.com/openclaw/openclaw/pull/100528) Thanks @xianshishan. - Expanded Control UI tool activity no longer repeats the tool name and icon, making completed and in-progress calls quicker to scan. [#100606](https://github.com/openclaw/openclaw/pull/100606) - Clearing a Control UI session model override now shows the selected agent's own default model rather than the unrelated global default. [#100719](https://github.com/openclaw/openclaw/pull/100719) Thanks @hyspacex. - Assistant-sent documents in WebChat now download with their original server-provided filename, including Unicode names, instead of opening as an unnamed browser document. [#100728](https://github.com/openclaw/openclaw/pull/100728) Thanks @lptrichor. - The Control UI now accepts `/steer` guidance during an active run instead of incorrectly replying `No active run`. [#100803](https://github.com/openclaw/openclaw/pull/100803) Thanks @hackerismydream. - New Control UI sessions now stay visible at the front of the sidebar after users switch to another chat, without requiring a page refresh. [#100981](https://github.com/openclaw/openclaw/pull/100981) Thanks @shakkernerd. - Worktrees management now lives under Control UI Settings instead of occupying a top-level sidebar item, while existing deep links remain valid. [#100995](https://github.com/openclaw/openclaw/pull/100995) - Long `/btw` answers in the desktop Control UI now stay within the browser window and scroll inside the result card, while mobile retains full-card scrolling. [#101169](https://github.com/openclaw/openclaw/pull/101169) Thanks @snoutfirst. - Finished chats no longer remain stuck with a busy spinner in the Control UI sidebar, even when an older Gateway update arrives afterward. [#101293](https://github.com/openclaw/openclaw/pull/101293) Thanks @fuller-stack-dev. - Large Skill Workshop support files now scroll, switch, filter, wrap, and copy without freezing or severely slowing the Control UI. [#101319](https://github.com/openclaw/openclaw/pull/101319) Thanks @shakkernerd, @xianshishan. - Users can stay signed in to multiple path- or query-routed Control UI gateways on one HTTPS origin without one gateway overwriting another's device token. [#101352](https://github.com/openclaw/openclaw/pull/101352) Thanks @fuller-stack-dev. - Control UI users can type `/approve` to release a waiting exec prompt without the decision getting queued behind the blocked chat run. [#101532](https://github.com/openclaw/openclaw/pull/101532) Thanks @vincentkoc. - Control UI build errors now keep emoji and other supplementary characters intact when command output is shortened for display. [#101591](https://github.com/openclaw/openclaw/pull/101591) Thanks @maweibin. - Workboard cards can now be edited, moved, archived, stopped, opened, or deleted directly from the detail drawer, while read-only viewers still see no mutation controls. [#101658](https://github.com/openclaw/openclaw/pull/101658) Thanks @momothemage, @princebansal. - The Control UI microphone button is now visually quieter while idle and more distinct while recording, making the current voice state easier to recognize. [#101843](https://github.com/openclaw/openclaw/pull/101843) - Users with saved working dashboard credentials no longer see the login screen flash briefly while Control UI reconnects. [#101849](https://github.com/openclaw/openclaw/pull/101849) - Typing anywhere in the active Control UI chat now places the first character in the message composer without stealing input from the command palette. [#102210](https://github.com/openclaw/openclaw/pull/102210) Thanks @shakkernerd. #### Setup and onboarding [Onboarding](https://docs.openclaw.ai/cli/onboard) now offers clearer paths to a usable first chat. Fresh CLI installs enter guided setup, configured installs open the TUI, and conversational Crestodian setup remains optional. Android and macOS guide users through [pairing](https://docs.openclaw.ai/channels/pairing), permissions, local or remote setup, and recovery; macOS can also test detected Claude Code, Codex, Gemini CLI, API-key, and supported provider-catalog choices before saving them. Interrupted authentication or channel setup retains earlier choices, while users without a working model are guided through credential and model selection instead of being sent into an unusable chat. Owners and administrators can also renew an expired Codex or OpenAI login through private Telegram, Web UI, Discord, or Slack commands without SSH access. Existing installations receive safeguards before their working state is changed. [Doctor](https://docs.openclaw.ai/cli/doctor) and updates refuse to replace an unreadable configuration, Doctor preserves model tuning while merging retired entries, and [extended-stable updates](https://docs.openclaw.ai/install/updating) retain the selected release channel. Container upgrades complete migrations and plugin repairs before reporting readiness, and unsafe runtimes are stopped before they can open OpenClaw state databases. - `openclaw doctor` and updates now refuse to replace an unreadable `openclaw.json`, preserving existing Gateway, agent, channel, and plugin settings instead of breaking the installation. [#96469](https://github.com/openclaw/openclaw/pull/96469) Thanks @obviyus, @yetval. - `openclaw doctor --fix` now preserves aliases, parameters, streaming choices, runtime settings, and other model tuning when several retired model names merge into one current model, and reports any merge conflicts accurately. [#96544](https://github.com/openclaw/openclaw/pull/96544) Thanks @vincentkoc, @yetval. - Owners and admins can now restore an expired Codex or OpenAI login from a browser through private Telegram, Web UI, Discord, or Slack commands without SSH access. [#98006](https://github.com/openclaw/openclaw/pull/98006) Thanks @100yenadmin, @jalehman, @obviyus. - The CLI now guides fresh installs through setup, opens configured installs directly in the TUI, preserves existing choices on reruns, and finishes onboarding in a usable terminal chat. [#98218](https://github.com/openclaw/openclaw/pull/98218) Thanks @fuller-stack-dev. - Package installs can now select and retain `openclaw update --channel extended-stable`, inspect its availability, and fail safely if its npm metadata is incomplete. [#99811](https://github.com/openclaw/openclaw/pull/99811) Thanks @kevinslin. - Fresh installs can now complete conversational Crestodian setup, approve the proposed plan once, connect channels, and continue into the normal agent while classic and scripted onboarding remain available. [#99935](https://github.com/openclaw/openclaw/pull/99935) - First-time onboarding now preserves earlier choices after authentication or pairing trouble and gives users an actionable model-configuration next step instead of opening an unusable first chat. [#100632](https://github.com/openclaw/openclaw/pull/100632) - Container upgrades now finish required migrations and plugin repairs before reporting the Gateway ready, and failed repairs stop with actionable guidance instead of leaving a false-green service. [#101881](https://github.com/openclaw/openclaw/pull/101881) Thanks @sallyom. - Crestodian setup now guides users who lack a usable model provider through masked credential entry and model selection, while deterministic setup and repair commands remain available until inference is configured. [#101887](https://github.com/openclaw/openclaw/pull/101887) Thanks @fuller-stack-dev. - OpenClaw now blocks unsafe runtimes before they can open SQLite-backed state, guides legacy Bun services to Node, and selects a WAL-safe Node runtime during setup and repair. [#106065](https://github.com/openclaw/openclaw/pull/106065) Thanks @vincentkoc. #### Official apps The official [iOS](https://docs.openclaw.ai/platforms/ios), [Android](https://docs.openclaw.ai/platforms/android), and [macOS](https://docs.openclaw.ai/platforms/macos) apps received substantial updates across setup, navigation, chat, voice, permissions, localization, files, scheduled work, native session controls, and Gateway recovery. Recent conversations remain useful through temporary disconnects: cached sessions and transcripts stay available for reading, supported text sends can wait for reconnection in the correct chat, and long conversations are easier to resume without losing the current place or mistaking an offline view for live history. These improvements also bring the native clients closer together. Mobile queues survive app restarts, the [macOS](https://docs.openclaw.ai/platforms/macos) app gains fuller session and transcript tools, and each client refreshes the same conversation when the Gateway returns. ##### iOS and Android - iOS and Android chats now preserve the reader's scroll position as new messages and tool activity arrive, with a clear way to return to the latest reply. [#98258](https://github.com/openclaw/openclaw/pull/98258) Related [#98255](https://github.com/openclaw/openclaw/issues/98255). Thanks @christopheraaronhogg. ##### iOS and iPadOS - iPhone and iPad chat now opens with the last known conversation and lets users browse recent cached sessions while the Gateway is unavailable. [#100219](https://github.com/openclaw/openclaw/pull/100219) - iOS users can queue chat messages while disconnected, keep them through app restarts, and send them in order after reconnection with clear retry and delete controls. [#100331](https://github.com/openclaw/openclaw/pull/100331) ##### Android - Android chat now shows the last known transcript immediately and keeps recent cached conversations readable during a Gateway outage, then refreshes them after reconnection. [#100227](https://github.com/openclaw/openclaw/pull/100227) - Android users can queue text while the Gateway is offline, keep it through an app restart, and send it in order after reconnection with Retry and Delete controls for failures. [#100290](https://github.com/openclaw/openclaw/pull/100290) ##### macOS - Mac chat now restores recent sessions and transcripts immediately, remains browsable while disconnected, and queues offline sends for the correct Gateway identity. [#100275](https://github.com/openclaw/openclaw/pull/100275) - The native macOS chat window now provides a full session sidebar, real new-session creation, slash-command completion, context and cost visibility, message copying, transcript export, and compact or clear-history actions. [#101103](https://github.com/openclaw/openclaw/pull/101103) #### Models and providers OpenClaw [model selection](https://docs.openclaw.ai/concepts/models) expands across major hosted, managed, and local choices. Each supported [provider route](https://docs.openclaw.ai/concepts/model-providers) retains its own authentication, model limits, reasoning controls, tool behavior, image support, and usage reporting. ##### GPT-5.6 and Codex Organizations with GPT-5.6 preview access can select Sol, Terra, or Luna through supported OpenAI and Codex routes with the expected context metadata, text and image input, reasoning levels, and cache-write accounting when OpenAI supplies it. Fresh OpenAI API-key and ChatGPT/Codex setups choose their intended GPT-5.6 defaults without replacing an explicit model choice. Supported Ultra choices remain aligned across OpenClaw and native Codex, and [Codex supervision](https://docs.openclaw.ai/plugins/codex-supervision) records native Codex child agents as tasks and returns their results to the parent. - GPT-5.6 users can now select supported Ultra modes consistently, keep model and thinking choices aligned across OpenClaw surfaces, and receive native Codex child-agent results as tracked tasks. [#98021](https://github.com/openclaw/openclaw/pull/98021) Thanks @anyech. - Organizations with GPT-5.6 preview access can select Sol, Terra, or Luna across supported OpenAI and Codex paths with correct reasoning controls, context metadata, and cache-write accounting. [#98333](https://github.com/openclaw/openclaw/pull/98333) Related [#98296](https://github.com/openclaw/openclaw/issues/98296). Thanks @steipete-oai. - Legacy-state upgrades no longer stall repeatedly, while fresh OpenAI and ChatGPT/Codex setups select the intended GPT-5.6 defaults and use supported temperature and tool-call behavior. [#104656](https://github.com/openclaw/openclaw/pull/104656) Thanks @bdjben, @obviyus, @sallyom. ##### Tencent Hy3 Tencent Hunyuan Hy3 now has a complete setup path through TokenHub or TokenPlan, including first-class authentication choices, CLI onboarding, model discovery, and configuration validation. Existing TokenHub configurations retain access to `hy3-preview` alongside the stable `hy3` model. - Tencent Hunyuan Hy3 now has a complete supported OpenClaw setup path through TokenHub or TokenPlan, including first-class authentication, model discovery, configuration validation, CLI onboarding, and compatibility for existing `hy3-preview` setups. [#99076](https://github.com/openclaw/openclaw/pull/99076) Thanks @moncac. ##### Meta Model API and Muse Spark 1.1 Operators can configure Meta Model API with `MODEL_API_KEY` or the onboarding authentication choice, select `meta-model-api/muse-spark-1.1`, and use supported streaming, tool calling, image input, and reasoning-effort controls. - OpenClaw now supports Meta Model API setup and the Muse Spark 1.1 model, including streaming, tool calling, image input, and supported reasoning controls. [#102873](https://github.com/openclaw/openclaw/pull/102873) Thanks @davemorin, @hamidshojanazeri, @jalehman, @solvely-colin. ##### Claude models Claude Sonnet 5 is selectable through direct Anthropic, Claude CLI, supported Vertex regions, Bedrock inference profiles, and Bedrock Mantle with its documented context, output, image, thinking, and pricing behavior. Users with Claude Mythos 5 access can select it through supported Anthropic-family routes with its required context, output, adaptive-thinking, caching, and replay behavior. - Claude Sonnet 5 is now selectable across Anthropic, Claude CLI, supported Vertex regions, Bedrock inference profiles, and Bedrock Mantle with its documented context, output, image, thinking, and pricing behavior. [#98254](https://github.com/openclaw/openclaw/pull/98254) Thanks @vortexopenclaw. - Users with Claude Mythos 5 access can select it through Anthropic, Anthropic Vertex, Amazon Bedrock, or Bedrock Mantle with its required context, output, thinking, caching, and replay behavior. [#101238](https://github.com/openclaw/openclaw/pull/101238) Thanks @vincentkoc. ##### More provider options Copilot sessions can explicitly use supported custom OpenAI, Azure OpenAI, Ollama-compatible, or Anthropic providers and start a compatible session when connection or credential settings change. Paired computers can run short tasks on eligible local Ollama models, while ClawRouter can expose the models granted to one managed key and report their usage and budget. Users can also claim active promotional models without replacing existing defaults, install LongCat-2.0 through its official provider, and continue Gemini latest tool-calling conversations across both supported Google transports. - Copilot sessions can now use explicitly selected custom OpenAI, Azure OpenAI, Ollama-compatible, or Anthropic providers and restart cleanly when model, endpoint, credentials, headers, or token limits change. [#96345](https://github.com/openclaw/openclaw/pull/96345) Thanks @vincentkoc. - OpenClaw agents can now run short tasks on chat-capable Ollama models installed on paired macOS, Linux, or Windows nodes, with a separate control for disabling node inference. [#99234](https://github.com/openclaw/openclaw/pull/99234) Related [#99228](https://github.com/openclaw/openclaw/issues/99228). - A single `CLAWROUTER_API_KEY` can now expose only its granted models across supported transports and show managed requests, tokens, spend, and monthly budget in normal status views. [#99658](https://github.com/openclaw/openclaw/pull/99658) Related [#99657](https://github.com/openclaw/openclaw/issues/99657). - Users can discover active promotional models and claim them with `openclaw promos claim <slug>` without rerunning onboarding or unexpectedly replacing existing defaults and credentials. [#100236](https://github.com/openclaw/openclaw/pull/100236) Thanks @fuller-stack-dev. - Hosted LongCat-2.0 can now be installed through the official LongCat plugin, configured with `LONGCAT_API_KEY` during onboarding, and selected as `longcat/LongCat-2.0` for multi-turn tool use. [#100501](https://github.com/openclaw/openclaw/pull/100501) Thanks @vincentkoc. - Gemini latest aliases now continue tool-calling conversations across both supported Google transports instead of stopping with a missing-thought-signature HTTP 400. [#100605](https://github.com/openclaw/openclaw/pull/100605) Thanks @chenxiaoyu209, @guarismo. #### Coding agents OpenClaw now works more cleanly with coding agents that live outside the current chat. `openclaw attach` can open Claude Code against the main or a selected Gateway session with temporary, revocable access instead of process-wide credentials. Codex app-server sessions can resume, delegate to native subagents, and return their results as tracked work, while Copilot sessions can use explicitly selected custom providers and restart when their connection settings change. The surrounding session workflow is more durable too. Important conversations can be pinned, renamed, archived, restored, and monitored as ongoing work, while active goals remain part of working memory across later turns, compaction, queues, and interruptions. - External tools can now receive session-scoped Gateway access without process-wide credentials or permission to impersonate another session, forming the secure base for `openclaw attach`. [#96351](https://github.com/openclaw/openclaw/pull/96351) Thanks @anagnorisis2peripeteia, @obviyus. - `openclaw attach` now launches Claude Code with temporary access to the main or selected Gateway session, keeps credentials out of arguments, and revokes the grant when the session ends. [#96454](https://github.com/openclaw/openclaw/pull/96454) Thanks @anagnorisis2peripeteia, @obviyus. - GPT-5.6 users can now select supported Ultra modes consistently, keep model and thinking choices aligned across OpenClaw surfaces, and receive native Codex child-agent results as tracked tasks. [#98021](https://github.com/openclaw/openclaw/pull/98021) Thanks @anyech. - Codex app-server agents can again list allowed agents, spawn OpenClaw or connected subagents, and yield during delegated work without resumed heartbeats hitting incompatible tool definitions. [#99561](https://github.com/openclaw/openclaw/pull/99561) Related [#99464](https://github.com/openclaw/openclaw/issues/99464). Thanks @100yenadmin, @joshavant. - Codex-native delegation from OpenClaw threads now creates native task records again, while unsupported custom Codex app-server versions fail startup with a clear minimum-version error. [#101221](https://github.com/openclaw/openclaw/pull/101221) - Copilot sessions can now use explicitly selected custom OpenAI, Azure OpenAI, Ollama-compatible, or Anthropic providers and restart cleanly when model, endpoint, credentials, headers, or token limits change. [#96345](https://github.com/openclaw/openclaw/pull/96345) Thanks @vincentkoc. - Sessions can now be pinned, archived without losing transcripts, restored, renamed from chat surfaces, and monitored for active runs as durable conversation threads. [#98510](https://github.com/openclaw/openclaw/pull/98510) Thanks @maziyang2. - An active `/goal` now keeps guiding later turns and survives compaction, queues, and interruptions until the goal is paused, completed, blocked, or limited. [#100468](https://github.com/openclaw/openclaw/pull/100468) #### Telegram [Telegram](https://docs.openclaw.ai/channels/telegram) received broad work across live progress, media, documents, topics, commands, retries, account routing, setup, and delivery. Albums reach the model with every available image, long replies remain easier to follow while they run, and temporary conflicts or network failures are less likely to block later messages or create duplicates. Messages and actions also stay with the intended bot, topic, and conversation more consistently, while setup and account-health problems provide clearer ways to recover. - Telegram photo albums now give the model every successfully downloaded image in order instead of only one photo and unusable file references, while failed items are omitted. [#97045](https://github.com/openclaw/openclaw/pull/97045) Thanks @nianjiuzst, @obviyus. - Telegram's live progress view now keeps reasoning, commentary, formatting, and tool activity readable and stable, then leaves a concise completion summary instead of disappearing. [#98907](https://github.com/openclaw/openclaw/pull/98907) Thanks @marvinthebored, @peetiegonzalez. - Telegram users should see fewer failed final replies or bot delivery sends during flaky network handshakes, without increasing duplicate-message risk for failures that may have happened after a request was sent. [#101258](https://github.com/openclaw/openclaw/pull/101258) Thanks @lzw112. - Telegram PDFs and other documents now provide agents with a usable local path so normal runner tools can open the attachment. [#97647](https://github.com/openclaw/openclaw/pull/97647) Thanks @gallup007, @joshavant. - Telegram timeout logs now hide bot tokens embedded in Bot API paths, including custom and proxy roots, while retaining useful endpoint context. [#99428](https://github.com/openclaw/openclaw/pull/99428) Related [#96982](https://github.com/openclaw/openclaw/issues/96982). Thanks @liuhaiyang14, @xialonglee. - Telegram bot tokens now remain masked even when they cross internal boundaries inside very large logs or tool-error messages. [#103861](https://github.com/openclaw/openclaw/pull/103861) Thanks @vincentkoc. - When a Telegram plugin approval cannot be routed, operators now receive practical Web UI, terminal UI, and configuration guidance instead of a generic failure or timeout. [#95973](https://github.com/openclaw/openclaw/pull/95973) Related [#95800](https://github.com/openclaw/openclaw/issues/95800). Thanks @chrisbot2026, @monkeyleet. - Scheduled deliveries to numeric threads such as Telegram forum topics now return to the configured thread after Gateway restarts instead of falling back to the general chat. [#98699](https://github.com/openclaw/openclaw/pull/98699) Thanks @yetval. #### Slack [Slack](https://docs.openclaw.ai/channels/slack) threads retain their conversation history more consistently, interactive cards and progress stay in the right place, and accepted replies are less likely to be repeated after an uncertain confirmation. Long-running conversations also avoid more unnecessary waits before reaching the agent. - Slack replies stay attached to the root thread's session history instead of accumulating separate, nearly empty child sessions. [#97168](https://github.com/openclaw/openclaw/pull/97168) Related [#96535](https://github.com/openclaw/openclaw/issues/96535). Thanks @gorkem2020, @liuwqgit. - When Slack accepts a reply but the confirmation is lost, OpenClaw can verify the existing post and avoid sending a duplicate. [#97480](https://github.com/openclaw/openclaw/pull/97480) Thanks @joeyfrasier. - Slack and similar channel turns with context-injecting plugins now send each inbound system label to the model once instead of duplicating it. [#95349](https://github.com/openclaw/openclaw/pull/95349) Thanks @gorkem2020, @openperf, @vincentkoc. - Slack rooms that require a mention no longer wake OpenClaw for ordinary messages when the bot identity is missing or untrusted, and setup warnings point operators to a Bot User OAuth Token when needed. [#91584](https://github.com/openclaw/openclaw/pull/91584) Thanks @hiragram. #### Discord [Discord](https://docs.openclaw.ai/channels/discord) improves reply visibility, attachments, voice sessions, progress, reconnects, and multi-account behavior. Completed replies produce more useful unread cues, brief Gateway reconnects are less likely to lose outbound messages, and repeated session-resume failures can recover without taking the whole Gateway down. - Completed partial-stream Discord replies now arrive as fresh messages that can trigger normal unread cues after a user leaves the channel. [#99711](https://github.com/openclaw/openclaw/pull/99711) Thanks @davelutztx. - Discord replies, cron reports, and other outbound messages are less likely to disappear during a brief Gateway reconnect, without replaying chunks or media Discord already accepted. [#100896](https://github.com/openclaw/openclaw/pull/100896) Thanks @tiffanychum. - Discord bots can now recover in place after repeated session-resume rejection, reducing prolonged outages, lost replies, and full Gateway restarts. [#103596](https://github.com/openclaw/openclaw/pull/103596) - Discord Code Mode progress no longer fills with repetitive Wait rows from background polling, while ordinary custom and plugin tools remain visible. [#100164](https://github.com/openclaw/openclaw/pull/100164) - Long Discord approval previews now preserve complete emoji and flags when shortened, avoiding broken replacement characters. [#99539](https://github.com/openclaw/openclaw/pull/99539) Thanks @zhangguiping-xydt. - Discord read allowlists now block guild metadata, channel details, and thread listings before any provider request when those resources are outside the configured scope. [#98966](https://github.com/openclaw/openclaw/pull/98966) Thanks @pgondhi987. - Discord users can complete approved Codex Computer Use actions such as `get_app_state` and receive the native tool result instead of getting a false timeout while the tool is still running. [#96818](https://github.com/openclaw/openclaw/pull/96818) Thanks @pollybot13, @zhangguiping-xydt. #### Apple Messages [Apple Messages](https://docs.openclaw.ai/channels/imessage) receives broader improvements to replies, typing, media, routing, setup guidance, and chat continuity. Remote Mac attachments can reach the active conversation through a usable local path, replies work in more bridge setups, and ordinary message text is less likely to be mistaken for internal role markers. - Photos bridged from a remote iMessage Mac to a separate Gateway host now arrive in Codex conversations through a readable local path rather than a Mac-only filename. [#91803](https://github.com/openclaw/openclaw/pull/91803) Thanks @turbotheturtle. - AppleScript-only and bot-user or SSH iMessage setups now deliver replies even when threading is unavailable, and database changes no longer leave inbound messages hidden behind stale recovery state. [#100446](https://github.com/openclaw/openclaw/pull/100446) Thanks @omarshahine. - Direct iMessage chats using the `imsg` private API bridge now show typing as soon as a slow turn is accepted, without waiting for a read receipt. [#95621](https://github.com/openclaw/openclaw/pull/95621) Thanks @omarshahine. - iMessage replies no longer lose ordinary sentence text that happens to end with `user:`, `system:`, or `assistant:`. [#96392](https://github.com/openclaw/openclaw/pull/96392) Thanks @ly-wang19. - Hidden MiniMax reasoning no longer appears as a new iMessage or feeds back into the conversation as an echo-triggering inbound message. [#93820](https://github.com/openclaw/openclaw/pull/93820) Thanks @alix-007. - Renaming iMessage groups, changing icons or membership, and leaving groups now require verified owner or administrator authority. [#97961](https://github.com/openclaw/openclaw/pull/97961) Thanks @eleqtrizit. - Mac users setting up iMessage can install or update `imsg` from the setup flow, receive clearer probe guidance, and recover sessions that still reference the old skill location. [#101407](https://github.com/openclaw/openclaw/pull/101407) Thanks @omarshahine. #### Gateway restart recovery A supervised Gateway that repeatedly fails during startup now leaves operators a stable [restart and recovery](https://docs.openclaw.ai/gateway/restart-recovery) process to inspect and repair. Instead of relaunching forever, the control path remains available while automatic channel and provider restarts pause until the underlying problem is fixed. - A repeatedly crashing supervised Gateway now leaves a stable control process available for inspection and repair instead of trapping operators in a restart loop. [a18708c](https://github.com/openclaw/openclaw/commit/a18708c5c12d93f14eb753b543a6747e8baa8c47) Thanks @obviyus. #### Automation, browser control, and terminals Scheduled work can wake when a command finishes or a watched condition changes, remote browser control can pair selected signed-in tabs and save completed downloads safely, and guarded workspace terminals are available across web and mobile. ##### Scheduled work [Scheduled jobs](https://docs.openclaw.ai/automation/cron-jobs) can react when an external command finishes or a watched condition changes, so the full agent runs only when there is something new to handle. Reapplying the same declaration updates the intended job in place, preserving identity and history instead of creating duplicate schedules. - A cron job can now watch a build, deploy, script, or other command and resume the originating workflow with its exit code and recent output when it finishes. [#92037](https://github.com/openclaw/openclaw/pull/92037) Thanks @anagnorisis2peripeteia. - Cron declarations can now be safely reapplied without duplicate jobs or lost history, while ownership, next run, latest result, delivery, and failure notifications are easier to inspect. [#100480](https://github.com/openclaw/openclaw/pull/100480) - Cron jobs can now watch an outside condition and run their real payload only when that state changes, avoiding full agent wakeups on unchanged polls. [#101195](https://github.com/openclaw/openclaw/pull/101195) ##### Remote browser control [Browser control](https://docs.openclaw.ai/tools/browser-control) is easier to use across machines: operators can pair the bundled Chrome extension with a remote Gateway, share only selected signed-in tabs, diagnose Windows and WSL2 connection details, and revoke access by removing a tab from the OpenClaw group. Agents can also wait for delayed downloads and save the finished file to a guarded local path with its final URL and suggested name. - Windows and WSL2 users now get IPv4 and IPv6 checks plus the matching portproxy guidance needed to restore Chrome browser control without broadening CDP exposure. [#100590](https://github.com/openclaw/openclaw/pull/100590) Thanks @owlock, @zengwen-dt. - The bundled Chrome extension now lets users control selected signed-in tabs from a phone or another channel without someone approving remote debugging at the desktop, and removing a tab revokes access. [#100619](https://github.com/openclaw/openclaw/pull/100619) - Remote Gateway users can pair the bundled Chrome extension from another browser machine with `openclaw browser extension pair --gateway-url wss://...`, without installing OpenClaw or Node.js there or opening an inbound port. [#101127](https://github.com/openclaw/openclaw/pull/101127) - Agents can now save a browser download to a chosen guarded path or wait for a delayed export, receiving the final URL, filename, and local path. [#101369](https://github.com/openclaw/openclaw/pull/101369) Thanks @grd-chang. ##### Workspace terminals Authenticated operators can open a guarded workspace terminal from the [Control UI](https://docs.openclaw.ai/web/control-ui), iOS, or Android without leaving the current workspace. Sessions use the selected agent's workspace and configured shell, can be disabled by policy, and follow the [Gateway protocol](https://docs.openclaw.ai/gateway/protocol) controls for ownership and connection state. Browser terminals can dock, resize, and run side by side, while iOS and Android provide focused entry points with clear connection guidance. Same-release browser hardening completes the capability: terminals can reattach after reloads, sleep, or brief network drops and replay recent output; newly enabled support appears without a manual refresh; and closing, reopening, theming, cursor focus, prompt glyphs, and new-tab controls remain usable through repeated sessions. - Authenticated admins can open an interactive terminal in an agent workspace from Gateway-backed controls, while fully sandboxed agents remain blocked and the feature can be disabled with `gateway.terminal.enabled`. [f083f35](https://github.com/openclaw/openclaw/commit/f083f35ddb467fa5ed7077244525913673bc7aa0) - Control UI admins can now keep chat, session controls, and live shells together by opening multiple dockable, resizable terminal tabs inside the browser workspace. [ec72de4](https://github.com/openclaw/openclaw/commit/ec72de41faa71b71d0e479eaa31d791e3b6afe58) - Opt-in Control UI terminal sessions can now survive page reloads, sleep, and brief network drops, letting operators reattach and replay recent output instead of losing running commands. [#100089](https://github.com/openclaw/openclaw/pull/100089) - Opening a new Control UI terminal after closing the final tab now starts with a blank fresh shell instead of restoring the closed terminal output. [#100665](https://github.com/openclaw/openclaw/pull/100665) - Control UI terminal tabs now close cleanly while opening, follow theme changes, and reopen at a usable size instead of leaving hidden sessions, stale colors, or unreachable controls. [2399ce7](https://github.com/openclaw/openclaw/commit/2399ce7c854d278276e65c9ed75f273a3c972e39) - An already-open Control UI page now notices when terminal support is enabled and makes the terminal available without requiring a manual refresh. [3f976f9](https://github.com/openclaw/openclaw/commit/3f976f9f8624ded5af6fc48abf43c25a79661a32) - Opening a new Control UI terminal tab after closing another no longer inherits an old exited state. [3c03389](https://github.com/openclaw/openclaw/commit/3c033899257210cb46d3c87468bb1a613e4fc831) - The Control UI terminal no longer crashes when its web component is loaded more than once in a shared browser registry. [f2e5159](https://github.com/openclaw/openclaw/commit/f2e5159f53248800416c15cc3aef50e505968317) - Control UI terminals now use installed Nerd Font fallbacks so supported prompt and listing icons render as glyphs instead of placeholder boxes. [#100128](https://github.com/openclaw/openclaw/pull/100128) - The Control UI integrated terminal now shows one cursor instead of overlapping Chrome and terminal carets, making focus and typing state clearer. [#100240](https://github.com/openclaw/openclaw/pull/100240) - The Control UI terminal's new-session button now aligns with the surrounding tabs for a cleaner, easier-to-scan tab bar. [#100256](https://github.com/openclaw/openclaw/pull/100256) ### Channels and Messaging Replies and media now stay attached to the intended conversation more consistently across workspace, mobile, and community channels. [Signal](https://docs.openclaw.ai/channels/signal) can quote the triggering message and use friendly destination aliases, while [Telegram](https://docs.openclaw.ai/channels/telegram) handles albums, progress, retries, topics, routing, and delivery with fewer dropped, duplicated, stale, or hard-to-read results. Discord, Slack, WhatsApp, Apple Messages, and other supported channels also receive clearer command, thread, attachment, proxy, and recovery behavior. The [Apple Messages](https://docs.openclaw.ai/channels/imessage) setup and delivery paths in this group preserve the chat context readers expect rather than exposing the routing work underneath. #### Telegram - Telegram automations can now tell from platform metadata whether a sender is a bot, making routing and classification less dependent on usernames or naming conventions. [#96810](https://github.com/openclaw/openclaw/pull/96810) Thanks @lin-hongkuan, @ohyeah521. - Telegram sends and message actions that omit an account now consistently use the configured default bot instead of a stale identity that can misroute or reject the action. [#98789](https://github.com/openclaw/openclaw/pull/98789) Thanks @yetval. - Telegram destinations genuinely named `current`, `self`, `this`, or `me` can now be reached through configured entries, while accidental bare session words fail closed. [#94107](https://github.com/openclaw/openclaw/pull/94107) Thanks @obviyus, @silver-state, @zhangguiping-xydt. - Telegram sends to an `username` now use the account's configured proxy or custom Bot API endpoint for both target resolution and message delivery. [#100868](https://github.com/openclaw/openclaw/pull/100868) Thanks @machine3at. - Telegram webhook startup now releases its listener, bot, and network resources after a fatal registration error such as invalid or revoked credentials. [#100863](https://github.com/openclaw/openclaw/pull/100863) Thanks @machine3at. - Telegram photo albums now give the model every successfully downloaded image in order instead of only one photo and unusable file references, while failed items are omitted. [#97045](https://github.com/openclaw/openclaw/pull/97045) Thanks @nianjiuzst, @obviyus. - Telegram replies now omit internal tool-execution failure lines and deliver only the intended assistant answer. [#95774](https://github.com/openclaw/openclaw/pull/95774) Thanks @mushuiyu886. - Telegram replies retain literal wording such as `<think>` when it is part of the answer, while genuinely marked reasoning remains hidden. [#97286](https://github.com/openclaw/openclaw/pull/97286) Thanks @drickon, @obviyus. - Telegram heartbeat fallbacks now hide the `notify=false` control marker and deliver silently as requested, including suppressing marker-only replies. [#100735](https://github.com/openclaw/openclaw/pull/100735) Thanks @hackerismydream, @vincentkoc. - Telegram stickers and other plugin message actions now stay in the active forum topic or thread when sent to the matching conversation, including through Gateway dispatch. [#80293](https://github.com/openclaw/openclaw/pull/80293) Thanks @artdaal. - Telegram messages can now be sent proactively through the `message` tool or `openclaw message send` instead of failing as an unsupported channel. [#92107](https://github.com/openclaw/openclaw/pull/92107) Thanks @bladin, @obviyus. - `sessions_send` now rejects Telegram topic child sessions before dispatch and directs callers to the parent group, reducing misrouted agent work. [#99845](https://github.com/openclaw/openclaw/pull/99845) Thanks @nianjiuzst, @qingminglong. - Polls now follow the selected direct or hybrid channel instead of being misrouted through the Gateway, with clear errors for unsupported duration or anonymity options. [#99950](https://github.com/openclaw/openclaw/pull/99950) Thanks @nianjiuzst. - Established Telegram direct-message sessions now avoid resending recent messages already stored in the transcript, reducing token use and repetitive or confused replies. [#89855](https://github.com/openclaw/openclaw/pull/89855) Thanks @sweetcornna. - Telegram direct-message follow-ups now include one copy of the previous assistant reply in recent context instead of duplicating it and wasting tokens. [#98769](https://github.com/openclaw/openclaw/pull/98769) Related [#98767](https://github.com/openclaw/openclaw/issues/98767). Thanks @rabsef-bicrym. - Telegram bots in ambient group mode now see recent room context before deciding whether to speak, reducing replies to isolated fragments that were not directed at the bot. [#99143](https://github.com/openclaw/openclaw/pull/99143) Related [#99142](https://github.com/openclaw/openclaw/issues/99142). Thanks @obviyus. - Telegram group agents now receive one chronological copy of recent messages instead of duplicated history and repeated delivery details consuming context. [#99256](https://github.com/openclaw/openclaw/pull/99256) Related [#99218](https://github.com/openclaw/openclaw/issues/99218). Thanks @obviyus. - Telegram ambient group conversations can now retain unmentioned room context across later turns, restarts, and compaction without repeatedly replaying the same window. [#99306](https://github.com/openclaw/openclaw/pull/99306) Related [#99257](https://github.com/openclaw/openclaw/issues/99257). Thanks @obviyus. - Telegram ambient group sessions now restore the relevant older chat context after a reset instead of silently treating archived messages as already visible. [#99385](https://github.com/openclaw/openclaw/pull/99385) Related [#99373](https://github.com/openclaw/openclaw/issues/99373). Thanks @obviyus. - Telegram group agents now post visible replies when directly mentioned or replied to, while continuing to ignore unaddressed background chatter. [#99866](https://github.com/openclaw/openclaw/pull/99866) Related [#99854](https://github.com/openclaw/openclaw/issues/99854). Thanks @obviyus. - Telegram direct-message follow-ups now include one accurate copy of each earlier assistant reply instead of duplicating a hidden-instruction version. [#100573](https://github.com/openclaw/openclaw/pull/100573) Thanks @momothemage, @mooresoftware. - Telegram's live progress view now keeps reasoning, commentary, formatting, and tool activity readable and stable, then leaves a concise completion summary instead of disappearing. [#98907](https://github.com/openclaw/openclaw/pull/98907) Thanks @marvinthebored, @peetiegonzalez. - Telegram rich replies and progress messages containing OAuth email addresses now arrive instead of being rejected by Telegram validation. [#95900](https://github.com/openclaw/openclaw/pull/95900) Thanks @obviyus. - Telegram progress updates now truncate safely around emoji and other multi-unit characters, preventing broken glyphs and rejected Bot API payloads. [#96456](https://github.com/openclaw/openclaw/pull/96456) Thanks @he-yufeng. - Telegram streaming draft previews no longer break or show garbled text when an emoji falls at the size boundary, so long previews can keep updating normally. [#96504](https://github.com/openclaw/openclaw/pull/96504) Thanks @mushuiyu886, @obviyus. - Telegram replies now keep typing visible through more temporary API failures and fall back to plain text when valid rich content cannot be delivered. [#99745](https://github.com/openclaw/openclaw/pull/99745) Thanks @obviyus, @veda-openclaw. - Telegram typing indicators now retry after transient network failures, restoring status feedback without adding duplicate-message risk to normal sends. [#100762](https://github.com/openclaw/openclaw/pull/100762) Thanks @lzw112, @vincentkoc. - Telegram's final collapsed progress summary now includes Claude CLI thinking activity that was shown during the run instead of making that work appear to vanish. [4212de9](https://github.com/openclaw/openclaw/commit/4212de9e08d6e69357d937e399db3df63c1b66d7) Thanks @vincentkoc. - Telegram users with `/reasoning on` now receive the model's saved reasoning messages alongside the final answer. [#97875](https://github.com/openclaw/openclaw/pull/97875) Thanks @fuller-stack-dev, @marvinthebored. - Telegram groups and forum topics now show a typing indicator as soon as an addressed message is accepted, without signaling activity for ignored chatter. [#99965](https://github.com/openclaw/openclaw/pull/99965) Thanks @moeedahmed. - Telegram configurations with legacy `capabilities: []` now inherit the normal inline-button policy, restoring clickable buttons without overriding intentional opt-outs. [#96468](https://github.com/openclaw/openclaw/pull/96468) Thanks @vincentkoc, @zhangguiping-xydt. - Telegram users still receive a plain-text reply when rich formatting for an email, URL, mention, hashtag, command, phone number, bank card, or similar entity is rejected, instead of the bot going silent. [#96642](https://github.com/openclaw/openclaw/pull/96642) Thanks @moguangyu5-design. - Telegram inline buttons supplied by plugins now run their intended actions and cleanup instead of posting raw callback data into chat. [#97174](https://github.com/openclaw/openclaw/pull/97174) Thanks @goldmar. - Telegram rich-text replies now render math formulas more reliably instead of exposing raw LaTeX-style markers. [#97197](https://github.com/openclaw/openclaw/pull/97197) Thanks @vincentkoc, @wangwllu. - Telegram final replies and media sends now fall back to readable plain text when formatting, captions, or quotes are rejected, and routine flood waits up to 60 seconds are honored instead of dropping the message. [#98786](https://github.com/openclaw/openclaw/pull/98786) Related [#98778](https://github.com/openclaw/openclaw/issues/98778). Thanks @obviyus. - Telegram plugins can now turn a button tap into a normal user reply to the agent, while failed or skipped submissions leave the button available for another attempt. [#98922](https://github.com/openclaw/openclaw/pull/98922) Thanks @goldmar. - Telegram tables, rankings, and literal line breaks now remain readable, with explicit logs when rich content must fall back to plain text. [#99861](https://github.com/openclaw/openclaw/pull/99861) Related [#99833](https://github.com/openclaw/openclaw/issues/99833). Thanks @obviyus. - Telegram rich messages using `richMessages: true` and Markdown table mode `block` now display bordered, striped tables with the source column alignment. [#95822](https://github.com/openclaw/openclaw/pull/95822) Thanks @obviyus, @zhangguiping-xydt. - Telegram fallback messages now replace invalid numeric Unicode surrogate entities safely instead of emitting malformed text, while valid numeric emoji entities still render. [#96581](https://github.com/openclaw/openclaw/pull/96581) Thanks @llagy007, @weeli-009. - Telegram documents received through a containerized local Bot API now arrive with their actual contents when its mounted data path differs between containers. [#91984](https://github.com/openclaw/openclaw/pull/91984) Thanks @ailucasdz, @dizesales. - Telegram documents sent near a Gateway restart now retry after recovery instead of disappearing silently, while permanent failures still request a resend. [#98102](https://github.com/openclaw/openclaw/pull/98102) Related [#98076](https://github.com/openclaw/openclaw/issues/98076). Thanks @davearcher18, @luoyanglang, @obviyus. - Telegram rich messages and text-bearing forwards without a normal caption now reach the agent as readable conversation content instead of an unsupported-message placeholder. [#98735](https://github.com/openclaw/openclaw/pull/98735) Thanks @obviyus. - Telegram now tells users when an attachment cannot be downloaded, reports the actual size limit for oversized files, and still retries transient failures such as rate limits. [#100051](https://github.com/openclaw/openclaw/pull/100051) Thanks @batyaro777. - Telegram replies and forwards now preserve visible text from rich details, lists, math, captions, and credits so the agent receives the context users actually saw. [#100570](https://github.com/openclaw/openclaw/pull/100570) Thanks @veda-openclaw, @wangwllu. - MP3 speech from Piper, Kokoro, and other OpenAI-compatible TTS endpoints now arrives in Telegram as a native voice note rather than a filename-style audio attachment. [#100715](https://github.com/openclaw/openclaw/pull/100715) Thanks @hemantsudarshan. - Telegram no longer follows a successfully delivered final answer with a contradictory generic error when a later dispatch step fails, while partial-only failures still receive the existing fallback. [#90152](https://github.com/openclaw/openclaw/pull/90152) Thanks @zhangguiping-xydt. - A temporary Telegram reply-session conflict no longer traps a DM or forum topic in constant retries that block later messages; retries are paced, conversation order is retained, and unrelated chats continue processing. [#96550](https://github.com/openclaw/openclaw/pull/96550) Thanks @cnbarrier404, @vacinc. - Telegram reactions and message deletions now retry brief socket or Undici network failures, reducing unnecessary action failures without adding duplicate risk to ordinary message sends. [#96612](https://github.com/openclaw/openclaw/pull/96612) Thanks @miorbnli. - Telegram messages entering through isolated ingress now proceed to the agent reply instead of replaying the same message in a loop. [#96847](https://github.com/openclaw/openclaw/pull/96847) Thanks @obviyus. - Long-running Telegram turns can finish without being reclaimed and processed again midway, reducing stalled or duplicate delivery while giving operators a clearer unhealthy status when the backlog stops draining. [#96962](https://github.com/openclaw/openclaw/pull/96962) Thanks @joshavant. - Telegram bots using isolated polling can resume ordered message processing after a stalled drain or Gateway restart without manual database repair. [#97118](https://github.com/openclaw/openclaw/pull/97118) Thanks @romneyda, @vincentkoc. - Long non-streamed Telegram group replies now keep every chunk visible, including the beginning, while delivery receipts cover all generated text chunks. [#97304](https://github.com/openclaw/openclaw/pull/97304) Thanks @aliseturtle-lu, @obviyus. - Long streamed Telegram replies now deliver their middle sections under the default configuration instead of silently omitting part of the answer. [#97312](https://github.com/openclaw/openclaw/pull/97312) Thanks @brycemurray, @obviyus. - Telegram polling now recovers from temporary rate limits, server failures, and malformed error responses without disabling the account, while busy bots avoid cache writes that could trigger false stall restarts. [#98775](https://github.com/openclaw/openclaw/pull/98775) Related [#98772](https://github.com/openclaw/openclaw/issues/98772), [#98773](https://github.com/openclaw/openclaw/issues/98773). Thanks @obviyus. - A repeatedly failing Telegram update no longer blocks later messages in the same chat or topic, and replayed updates are retried safely without duplicate commands or apology spam. [#98776](https://github.com/openclaw/openclaw/pull/98776) Related [#98774](https://github.com/openclaw/openclaw/issues/98774). Thanks @obviyus. - Telegram webhook messages now survive Gateway restarts and temporary processing failures, while accounts recover from brief startup errors and repeated restarts stop leaking network connections. [#98806](https://github.com/openclaw/openclaw/pull/98806) Related [#98777](https://github.com/openclaw/openclaw/issues/98777). Thanks @obviyus. - Queued Telegram updates now remain replayable until restart recovery is safely recorded, reducing message loss during a crash at processing startup. [#104032](https://github.com/openclaw/openclaw/pull/104032) Thanks @obviyus, @vincentkoc. - Telegram sends now retry a safe TCP or TLS connection timeout, reducing lost final replies during flaky handshakes without retrying failures that may already have reached Telegram. [#101258](https://github.com/openclaw/openclaw/pull/101258) Thanks @lzw112. - Telegram startup logs now show local socket failures such as `EADDRNOTAVAIL` instead of incorrectly steering operators toward DNS troubleshooting. [#97130](https://github.com/openclaw/openclaw/pull/97130) Thanks @zhangguiping-xydt. - Telegram bot probes, webhook checks, membership audits, and polling now reject oversized Bot API success bodies before they can exhaust Gateway memory. [#97271](https://github.com/openclaw/openclaw/pull/97271) Thanks @hugenshen. - Telegram chat-ID lookup now fails safely on oversized `getChat` responses instead of risking excessive Gateway memory use during onboarding or routing. [#97274](https://github.com/openclaw/openclaw/pull/97274) Thanks @hugenshen. - Telegram onboarding now offers both the classic BotFather chat flow and the official web interface for creating a bot and copying its token into OpenClaw. [#100540](https://github.com/openclaw/openclaw/pull/100540) - After `/login codex` succeeds in Telegram, retrying the request now uses the newly authenticated OpenAI profile instead of the previous account. [fca0c81](https://github.com/openclaw/openclaw/commit/fca0c81791a5040536d4907913ed975bfcde1642) Thanks @100yenadmin. - Telegram `/steer` and `/tell` commands can redirect an active Codex task during streaming or tool work instead of arriving late or becoming follow-up messages. [#98126](https://github.com/openclaw/openclaw/pull/98126) Related [#81594](https://github.com/openclaw/openclaw/issues/81594). Thanks @100yenadmin, @kyzcreig. - Saying `wait` in a Telegram group conversation no longer cancels active OpenClaw work, while explicit stop commands still take effect immediately. [#98639](https://github.com/openclaw/openclaw/pull/98639) Thanks @ianchen08. - Telegram messages that cannot be steered into an active Codex turn are now retained for handling afterward instead of disappearing without a reply. [#103916](https://github.com/openclaw/openclaw/pull/103916) Thanks @jalehman. - When Telegram requests overlap, the newest authorized message now wins without an outdated reply being sent or replaced queued work being started. [#103965](https://github.com/openclaw/openclaw/pull/103965) - A Telegram reply that has already started is no longer unexpectedly cancelled when another authorized command arrives. [52a3314](https://github.com/openclaw/openclaw/commit/52a331466882ca0b6befa56c883355c758305813) Thanks @vincentkoc. #### Signal - Signal auto-replies now quote the message that triggered them, making responses easier to follow in groups and busy conversations. [#95718](https://github.com/openclaw/openclaw/pull/95718) Thanks @jesse-merhi. - Signal reaction shortcuts now apply only to the intended structured exec or plugin approval, including forwarded monitor and chunked prompts, while ordinary messages that merely quote approval commands no longer gain controls; older delivered prompts may still require `/approve` once after upgrade. [#96880](https://github.com/openclaw/openclaw/pull/96880) Thanks @joshavant. - Signal users who enable status reactions can now see when OpenClaw accepts a message, works, uses tools, compacts, stalls, or finishes in direct and group chats. [#98791](https://github.com/openclaw/openclaw/pull/98791) Thanks @jesse-merhi. - Signal QuickStart now shows one clear `signal-cli` installation failure and proceeds directly to the custom-path prompt instead of repeating the missing-binary message. [#96932](https://github.com/openclaw/openclaw/pull/96932) Thanks @romneyda. - Signal plugin setup now handles slow, malformed, or oversized GitHub release metadata without risking process memory exhaustion. [#97536](https://github.com/openclaw/openclaw/pull/97536) Thanks @hugenshen. - Signal container mode now stops oversized or runaway `signal-cli-rest-api` responses from threatening the entire OpenClaw process. [#97539](https://github.com/openclaw/openclaw/pull/97539) Thanks @alix-007. - Invalid JSON from the Signal REST container now produces a clear Signal-specific failure instead of exposing a raw parser error. [#98073](https://github.com/openclaw/openclaw/pull/98073) Thanks @lsr911, @vincentkoc. - Signal QuickStart on macOS now installs `signal-cli` through Homebrew instead of downloading an incompatible Linux package, and gives platform-specific guidance when Homebrew is unavailable. [#96909](https://github.com/openclaw/openclaw/pull/96909) Thanks @romneyda. - Signal container receives now reject oversized JSON frames before buffering them, limiting memory pressure without affecting normal messages or separately fetched attachments. [#99992](https://github.com/openclaw/openclaw/pull/99992) Thanks @sunlit-deng. - Signal users can assign stable names such as `signal:me` or `signal:ops` to repeat contacts and groups instead of reusing raw phone numbers, UUIDs, or IDs. [#95738](https://github.com/openclaw/openclaw/pull/95738) Thanks @jesse-merhi. - Signal users now receive clean assistant replies without internal tool status, reasoning tags, or tool-call markup. [#97360](https://github.com/openclaw/openclaw/pull/97360) Thanks @masatohoshino. - Signal local-file attachments that are oversized or use suspicious paths now fail quickly with a clear error before consuming excessive Gateway memory. [#101391](https://github.com/openclaw/openclaw/pull/101391) Thanks @cxbasdev. #### Slack - Slack channels can keep ambient OpenClaw participation while the opt-in `ignoreOtherMentions` setting prevents replies to conversations aimed at another person or group and retains that conversation as context for a later bot mention. [#53467](https://github.com/openclaw/openclaw/pull/53467) Thanks @hanamizuki. - Slack operators can now choose `off`, `first`, `all`, or `batched` reply threading per channel, with automatic replies and message tools following the same effective choice. [#82253](https://github.com/openclaw/openclaw/pull/82253) - Slack button and select interactions now remain in the correct assistant thread and show a working status there until the follow-up turn finishes. [#82895](https://github.com/openclaw/openclaw/pull/82895) Thanks @wukongai-cmu. - The first Slack reply after a daily or idle reset can reuse recent thread history, so the conversation does not suddenly start from scratch. [#97100](https://github.com/openclaw/openclaw/pull/97100) Thanks @bek91. - Slack replies stay attached to the root thread's session history instead of accumulating separate, nearly empty child sessions. [#97168](https://github.com/openclaw/openclaw/pull/97168) Related [#96535](https://github.com/openclaw/openclaw/issues/96535). Thanks @gorkem2020, @liuwqgit. - Ordinary Slack thread replies no longer download and process the opening message attachments again, while new or reset sessions still receive those files once. [#100516](https://github.com/openclaw/openclaw/pull/100516) - Session history now identifies Slack replies that were generated but intentionally superseded before delivery, so operators do not mistake them for messages the user received. [#100607](https://github.com/openclaw/openclaw/pull/100607) Thanks @bek91. - Slack replies in very long threads and on busy Gateways now avoid several unnecessary waits, reducing stalls before thread and direct-message events reach the agent. [#101888](https://github.com/openclaw/openclaw/pull/101888) Thanks @obviyus. - Slack agents can now read thread messages whose visible content exists only in attachments or blocks, including alerts with empty top-level text. [#97727](https://github.com/openclaw/openclaw/pull/97727) Thanks @chthtlo. - Slack Codex conversations now retain one final assistant reply in history instead of duplicating it through both the app-server transcript and delivery fallback. [#100160](https://github.com/openclaw/openclaw/pull/100160) Thanks @steipete-oai. - Scheduled and heartbeat-driven Slack messages now use the configured agent name and icon, with graceful fallback to the app identity when Slack rejects customization. [#84335](https://github.com/openclaw/openclaw/pull/84335) Thanks @rohang2005. - Longer Slack assistant-thread replies now show changing progress notes so users can tell OpenClaw is still working. [#85507](https://github.com/openclaw/openclaw/pull/85507) Thanks @emergentash. - Slack presentation messages now arrive as native Block Kit cards with working headers, controls, and receipts instead of flattened plain text. [#95463](https://github.com/openclaw/openclaw/pull/95463) Thanks @zoowh. - Slack rich-text block actions can now include emoji near the preview limit without producing malformed interaction text or downstream encoding failures. [#96577](https://github.com/openclaw/openclaw/pull/96577) Thanks @llagy007, @weeli-009. - Slack buttons and menus now preserve time labels such as `9:00` and return the intended action value when selected. [#99877](https://github.com/openclaw/openclaw/pull/99877) Thanks @qingminglong, @rodja. - Slack message reactions now accept common emoji or shortcode names, can target the current message without repeating its ID, and provide clearer member-lookup guidance. [#100375](https://github.com/openclaw/openclaw/pull/100375) Thanks @gorkem2020. - Slack now uses one static acknowledgement reaction alongside its native assistant loading status by default, avoiding two competing progress displays for the same reply. [#100462](https://github.com/openclaw/openclaw/pull/100462) Thanks @steipete-oai. - Slack messages and Block Kit labels now truncate without splitting emoji into broken replacement characters or invalid payload text. [#96382](https://github.com/openclaw/openclaw/pull/96382) Thanks @ly-wang19. - Long Slack command and plugin approval previews now keep emoji intact at the length boundary, avoiding malformed approval text or payloads. [#96576](https://github.com/openclaw/openclaw/pull/96576) Thanks @llagy007, @weeli-009. - Slack slash-command choice menus now shorten long labels without splitting emoji at the 75-character limit. [#97923](https://github.com/openclaw/openclaw/pull/97923) Thanks @lexes7. - Slack replies now keep each agent's custom name and avatar through streaming or fallback delivery instead of reverting to the app identity. [#100084](https://github.com/openclaw/openclaw/pull/100084) Thanks @moerai. - Slack operators running multiple Gateways through one Socket Mode app now receive a startup warning explaining why events may reach another connection and how to choose a safer deployment setup. [#79938](https://github.com/openclaw/openclaw/pull/79938) Thanks @jeffvsutherland. - Slack replies no longer expose internal tool-failure banners, reasoning scaffolding, or tool-call markup to users. [#97367](https://github.com/openclaw/openclaw/pull/97367) Thanks @masatohoshino. - When Slack accepts a reply but the confirmation is lost, OpenClaw can verify the existing post and avoid sending a duplicate. [#97480](https://github.com/openclaw/openclaw/pull/97480) Thanks @joeyfrasier. - Slack replies now retry after a temporary session-start conflict instead of stopping before the expected message is delivered. [#99647](https://github.com/openclaw/openclaw/pull/99647) Thanks @steipete-oai. - Slack read actions can again access intentionally allowlisted channel names when Slack supplies an ID and `dangerouslyAllowNameMatching` is enabled. [#95313](https://github.com/openclaw/openclaw/pull/95313) Thanks @jontsai. - Slack message and attachment text is no longer copied into verbose or debug logs during inbound processing. [#96312](https://github.com/openclaw/openclaw/pull/96312) Thanks @steipete-oai. - OpenClaw can use a trusted override for a compatible Slack API endpoint, while normal workspaces continue using Slack's public API and untrusted project .env files cannot redirect bearer-token requests. [#97154](https://github.com/openclaw/openclaw/pull/97154) Thanks @romneyda. - Slack agents can now identify admitted bot-authored messages through `is_bot: true`, making it easier to prevent unwanted bot-to-bot replies. [#97822](https://github.com/openclaw/openclaw/pull/97822) Thanks @masatohoshino, @vincentkoc. - Slack Socket Mode relay diagnostics now distinguish malformed WebSocket frames from transport failures, making channel problems easier to identify. [#98587](https://github.com/openclaw/openclaw/pull/98587) Thanks @lsr911, @vincentkoc. - Slack startup and account checks now warn when a user OAuth credential is configured as the bot token, before identity confusion affects mentions or replies. [#99931](https://github.com/openclaw/openclaw/pull/99931) Thanks @ooiuuii. - Long-running Slack integrations now keep conversation metadata caching within a fixed limit, preventing memory use from growing indefinitely as more channels and workspaces are encountered. [#101562](https://github.com/openclaw/openclaw/pull/101562) Thanks @vincentkoc, @zhangguiping-xydt. #### Discord - Discord tool-only replies no longer leave overlapping typing refreshes that suggest another answer is still coming, while explicitly configured typing behavior remains intact. [#84288](https://github.com/openclaw/openclaw/pull/84288) Thanks @dr00-eth. - When a Discord voice-note reply fails, users now receive the assistant's answer as a threaded text fallback without duplicating text that was already delivered. [#89962](https://github.com/openclaw/openclaw/pull/89962) Thanks @danhayman. - Discord's clear-all reactions action now returns a real error if any bot reaction remains instead of claiming complete success. [#90038](https://github.com/openclaw/openclaw/pull/90038) Thanks @masatohoshino. - Discord now shows enabled Anthropic reasoning, notes, and tool activity in the right order with accurate counters and nonblank summaries. [#96106](https://github.com/openclaw/openclaw/pull/96106) Thanks @marvinthebored, @obviyus, @peetiegonzalez. - Discord users now receive the reply text and a clear notice when an attachment is too large instead of seeing the completed response disappear. [#99577](https://github.com/openclaw/openclaw/pull/99577) Thanks @lin-hongkuan. - Completed partial-stream Discord replies now arrive as fresh messages that can trigger normal unread cues after a user leaves the channel. [#99711](https://github.com/openclaw/openclaw/pull/99711) Thanks @davelutztx. - Discord completion and error reactions now remain visible for the configured `doneHoldMs` and `errorHoldMs` durations instead of fixed default delays. [#94736](https://github.com/openclaw/openclaw/pull/94736) Thanks @liuwqgit. - Discord voice replies now keep their accompanying text and extra media attached to the original message even when single-use reply mode is enabled. [#95978](https://github.com/openclaw/openclaw/pull/95978) Thanks @nxmxbbd. - Discord attachments queued while OpenClaw is busy now remain available when the message finally runs instead of disappearing after temporary download links expire. [#96183](https://github.com/openclaw/openclaw/pull/96183) Thanks @judsonnudson, @zacharyyw. - Generated Discord thread names now preserve multiple Markdown emphasis spans without dropping or stranding formatting markers. [#96394](https://github.com/openclaw/openclaw/pull/96394) Thanks @ly-wang19. - Discord's recent-model buttons now shorten long names without breaking emoji or producing invalid picker payloads. [#97600](https://github.com/openclaw/openclaw/pull/97600) Thanks @llagy007, @weeli-009. - Long or media-rich implicit Discord replies now quote and notify the referenced user once in `first` or `batched` mode, while explicit and `all` replies retain every intended reference. [#100784](https://github.com/openclaw/openclaw/pull/100784) Thanks @qingminglong, @revision-co-ltd. - Discord replies, cron reports, and other outbound messages are less likely to disappear during a brief Gateway reconnect, without replaying chunks or media Discord already accepted. [#100896](https://github.com/openclaw/openclaw/pull/100896) Thanks @tiffanychum. - Discord automatic thread titles now handle long messages and channel details containing emoji without building malformed prompt text. [#101551](https://github.com/openclaw/openclaw/pull/101551) Thanks @alix-007. - Discord voice playback failures now produce a readable error within the 8,192-byte limit, including when ffmpeg output contains non-English text or emoji. [#104230](https://github.com/openclaw/openclaw/pull/104230) Thanks @qingminglong. - Multiple Discord bot accounts in one server now keep independent voice sessions, and configured voice auto-join works even when Discord becomes ready before voice startup completes. [#87530](https://github.com/openclaw/openclaw/pull/87530) Thanks @geekhuashan. - Checking a Discord member who is not in voice now reports them as disconnected instead of raising a misleading command or gateway failure. [#90969](https://github.com/openclaw/openclaw/pull/90969) Thanks @asock. - Adding a named Discord account no longer knocks a SecretRef-backed default account offline or into a restart loop. [#96401](https://github.com/openclaw/openclaw/pull/96401) Thanks @849261680. - Discord voice conversations in `stt-tts` mode now retain earlier spoken context across turns instead of starting over after each reply. [#97746](https://github.com/openclaw/openclaw/pull/97746) Thanks @karabaralex, @sanjays2402. - Discord voice playback now turns broken ffmpeg output pipes into a normal playback error instead of an uncaught Gateway-level exception. [#101088](https://github.com/openclaw/openclaw/pull/101088) Thanks @masatohoshino. - Discord bots can now recover in place after repeated session-resume rejection, reducing prolonged outages, lost replies, and full Gateway restarts. [#103596](https://github.com/openclaw/openclaw/pull/103596) - Discord voice playback now cleans up ffmpeg after output-pipe failures, reducing both Gateway crashes and leftover transcoder processes. [#101124](https://github.com/openclaw/openclaw/pull/101124) - The configured primary Discord account now starts first in multi-account setups, so the main bot is not delayed behind secondary or invalid entries after a restart. [#101292](https://github.com/openclaw/openclaw/pull/101292) Thanks @turbotheturtle. - Discord message reads and searches now decode raw compressed responses correctly and return clear errors for unexpected data instead of garbled output or opaque failures. [#80788](https://github.com/openclaw/openclaw/pull/80788) Thanks @jbetala7. - Discord REST calls now fail with a clear error when a response is oversized or stalls instead of risking unbounded memory use and process instability. [#95412](https://github.com/openclaw/openclaw/pull/95412) Thanks @alix-007. - Discord account health checks now fail safely on oversized identity responses instead of risking a Gateway crash or out-of-memory failure. [#97278](https://github.com/openclaw/openclaw/pull/97278) Thanks @hugenshen. - Discord message, thread-history, and attachment requests now reject oversized successful responses before they can drive excessive Gateway memory growth. [#97693](https://github.com/openclaw/openclaw/pull/97693) Thanks @alix-007. - Discord PluralKit lookups and voice-upload setup now stop unexpectedly large JSON responses before they can exhaust memory. [#97706](https://github.com/openclaw/openclaw/pull/97706) Thanks @cxbasdev. - Malformed successful Discord responses now fail with endpoint-specific context instead of surfacing a raw parser error or crashing OpenClaw. [#97889](https://github.com/openclaw/openclaw/pull/97889) Thanks @lsr911. - An oversized Discord gateway metadata response now logs a bounded error and falls back to Discord's default gateway URL instead of risking a Gateway crash. [#98682](https://github.com/openclaw/openclaw/pull/98682) Thanks @wings1029. - Discord deployments in restricted networks can now route Gateway and REST traffic through an explicitly configured DNS or private HTTP(S) proxy without opening broad direct HTTPS egress. [#99126](https://github.com/openclaw/openclaw/pull/99126) Related [#98266](https://github.com/openclaw/openclaw/issues/98266). Thanks @joshavant, @sallyom, @svuppala2006. - Discord Gateway connections now cap incoming frames at 16 MiB, preserving tested large member events while rejecting extreme traffic before it pressures memory. [#99998](https://github.com/openclaw/openclaw/pull/99998) Thanks @sunlit-deng. - Discord agents now receive `is_bot: true` for admitted bot messages while human and PluralKit sender behavior stays unchanged. [#97824](https://github.com/openclaw/openclaw/pull/97824) Thanks @masatohoshino, @vincentkoc. #### WhatsApp - Logged-out or replaced WhatsApp accounts now stay stopped until reconnection instead of entering repeated restart loops that can consume resources and slow other accounts. [#78511](https://github.com/openclaw/openclaw/pull/78511) Thanks @openperf. - Eligible WhatsApp messages received during a brief reconnect now reach OpenClaw for an automatic reply instead of being marked read and silently skipped. [#80642](https://github.com/openclaw/openclaw/pull/80642) Thanks @vishalj99. - Concurrent WhatsApp Web replies, media, reactions, and queued messages now send one at a time per account, reducing interference and unpredictable delivery order. [#99050](https://github.com/openclaw/openclaw/pull/99050) Thanks @ooiuuii. - Completed WhatsApp replies now continue delivering when another message arrives mid-delivery, so overlapping conversations are less likely to go unexpectedly silent. [#100205](https://github.com/openclaw/openclaw/pull/100205) - Invalid `OPENCLAW_WHATSAPP_WEB_SOCKET_URL` values now fail immediately with a clear configuration error instead of breaking later during socket startup. [#97697](https://github.com/openclaw/openclaw/pull/97697) Thanks @romneyda. - WhatsApp can now restore a saved linked-device session from a valid credential backup when the primary file is interrupted or corrupted, avoiding an unnecessary QR re-pair. [#99070](https://github.com/openclaw/openclaw/pull/99070) Thanks @leonidaslux. - `openclaw channels login --channel whatsapp` now replaces expired QR codes in place so interactive terminals show one current, scannable code. [#100159](https://github.com/openclaw/openclaw/pull/100159) - A WhatsApp message interrupted by a temporary reply-session conflict can now be retried instead of being marked delivered and silently ignored on redelivery. [#101106](https://github.com/openclaw/openclaw/pull/101106) Thanks @andersonjeccel. - OpenClaw can use a trusted override to point the normal Baileys socket at a compatible local WebSocket endpoint, while normal WhatsApp connections continue using the default path unless explicitly overridden. [#97155](https://github.com/openclaw/openclaw/pull/97155) Thanks @romneyda. - WhatsApp group owners can reliably use `/new`, `/stop`, `/status`, and similar commands even when their sender identity arrives as an internal LID. [#93379](https://github.com/openclaw/openclaw/pull/93379) Related [#77755](https://github.com/openclaw/openclaw/issues/77755). Thanks @jiveshkalra, @xialonglee. - Direct WhatsApp polls now honor the same outreach timelock as other sends instead of reaching recipients during a blocked window. [1d128b4](https://github.com/openclaw/openclaw/commit/1d128b4dd23297ee3553142954e4ce0542ba83e6) Thanks @vincentkoc. - Replies to OpenClaw-authored WhatsApp group messages now remain visible on WhatsApp Desktop and other multi-device clients with their quote context intact. [#94879](https://github.com/openclaw/openclaw/pull/94879) Thanks @bartok9. - WhatsApp direct sends and automatic replies now render combined bold-and-italic Markdown without stray asterisks, including when the formatted text contains emoji. [#96570](https://github.com/openclaw/openclaw/pull/96570) Thanks @llagy007, @weeli-009. - Long WhatsApp auto-reply and inbound-message previews now preserve emoji and report the truncated character count accurately, making affected diagnostics readable without changing delivery. [#96580](https://github.com/openclaw/openclaw/pull/96580) Thanks @llagy007, @weeli-009. - WhatsApp direct messages blocked by a reachout timelock now fail immediately with an explicit explanation instead of appearing accepted before a later delivery error. [#101264](https://github.com/openclaw/openclaw/pull/101264) Thanks @mcaxtr. - With `channels.whatsapp.actions.calls`, MeowCaller, and telephony TTS configured, a WhatsApp agent can now call the requester and speak a short task-completion or urgent message. [#99635](https://github.com/openclaw/openclaw/pull/99635) #### Weixin - Configured Weixin accounts with opaque IDs containing characters such as an at sign or `.` now start normally and preserve their account-specific routing. [#93686](https://github.com/openclaw/openclaw/pull/93686) Related [#93556](https://github.com/openclaw/openclaw/issues/93556). Thanks @htkillermax-gif, @zhangguiping-xydt. - Official Weixin installs and core-upgrade reconciliation now target plugin version 2.4.6 with its correct compatibility requirement instead of unexpectedly returning users to 2.4.3. [#96801](https://github.com/openclaw/openclaw/pull/96801) Thanks @lin-hongkuan. #### Apple Messages - Compatible iMessage bridge users can create, read, and vote on native Apple Messages polls, with upgrade guidance for unsupported `imsg` installations. [#98421](https://github.com/openclaw/openclaw/pull/98421) Thanks @lobster, @omarshahine. - Photos bridged from a remote iMessage Mac to a separate Gateway host now arrive in Codex conversations through a readable local path rather than a Mac-only filename. [#91803](https://github.com/openclaw/openclaw/pull/91803) Thanks @turbotheturtle. - Voting for an emoji-labeled iMessage poll option no longer sends an extra one-word message that repeats the selected answer. [#98691](https://github.com/openclaw/openclaw/pull/98691) Thanks @omarshahine. - Agents now answer iMessage polls, including polls with comments, with one native vote instead of an ordinary text answer, a repeated selection, or a separate reply to the comment. [#98781](https://github.com/openclaw/openclaw/pull/98781) Thanks @omarshahine. - AppleScript-only and bot-user or SSH iMessage setups now deliver replies even when threading is unavailable, and database changes no longer leave inbound messages hidden behind stale recovery state. [#100446](https://github.com/openclaw/openclaw/pull/100446) Thanks @omarshahine. - Direct iMessage chats using the `imsg` private API bridge now show typing as soon as a slow turn is accepted, without waiting for a read receipt. [#95621](https://github.com/openclaw/openclaw/pull/95621) Thanks @omarshahine. - iMessage replies no longer lose ordinary sentence text that happens to end with `user:`, `system:`, or `assistant:`. [#96392](https://github.com/openclaw/openclaw/pull/96392) Thanks @ly-wang19. - Bursts of long iMessage messages can now be combined without cutting an emoji in half and sending broken text to the agent. [#97598](https://github.com/openclaw/openclaw/pull/97598) Thanks @weeli-009. - iMessage startup warnings now distinguish working sender-allowlisted group setups from truly blocked configurations and point blocked operators to the correct fix. [#100046](https://github.com/openclaw/openclaw/pull/100046) - Bare 32-character iMessage group IDs from `imsg` now route scheduled and direct sends to the intended conversation instead of a nonexistent phone number. [#99525](https://github.com/openclaw/openclaw/pull/99525) Related [#89235](https://github.com/openclaw/openclaw/issues/89235). Thanks @matthewdelprado. - An iMessage helper pipe failure now ends pending work predictably and lets the monitor recover or stop cleanly instead of crashing the Gateway or hanging requests. [#101084](https://github.com/openclaw/openclaw/pull/101084) Thanks @masatohoshino. - iMessage CLI send and action failures caused by broken output pipes now return a controlled error instead of risking a Gateway worker crash. [#101401](https://github.com/openclaw/openclaw/pull/101401) Thanks @cxbasdev. #### LINE - Default and named LINE bots configured under `channels.line.accounts` now receive working webhook routes unless explicitly disabled, preventing valid inbound messages from ending in 404 responses. [#81471](https://github.com/openclaw/openclaw/pull/81471) Thanks @edenfunf, @honorlin. - LINE file uploads now retain recognizable audio extensions such as `.m4a`, allowing valid recordings to reach transcription instead of being treated as unknown files. [#96403](https://github.com/openclaw/openclaw/pull/96403) Thanks @tancolo, @zaidazmi. - LINE template titles, fallback text, and alt text now keep emoji intact at field limits, preventing broken previews and rejected payloads. [#97428](https://github.com/openclaw/openclaw/pull/97428) Thanks @ly-wang19, @vincentkoc. - Long LINE button labels, quick replies, postback data, and media controls now preserve emoji at field limits instead of producing malformed text. [#97470](https://github.com/openclaw/openclaw/pull/97470) Thanks @ly-wang19, @vincentkoc. - LINE messages, cards, menus, locations, and code blocks now preserve emoji and other multi-unit characters at field limits instead of producing broken text or rejected payloads. [#98994](https://github.com/openclaw/openclaw/pull/98994) Thanks @lexes7, @vincentkoc. - LINE replies that combine text with an image, card, or location now report a failed rich-media portion accurately while delivering the text once and avoiding duplicate retries. [#100996](https://github.com/openclaw/openclaw/pull/100996) Thanks @masatohoshino. #### Feishu - Feishu replies now arrive as completed blocks when block streaming is enabled without streaming cards, rather than disappearing entirely. [#94250](https://github.com/openclaw/openclaw/pull/94250) Related [#55027](https://github.com/openclaw/openclaw/issues/55027). Thanks @vincentkoc, @xialonglee, @zichaolong. - When an interactive command button falls back to text, users now receive the command they can copy, with Feishu document comments explaining the manual step. [#94385](https://github.com/openclaw/openclaw/pull/94385) Related [#69754](https://github.com/openclaw/openclaw/issues/69754). Thanks @1yihui, @xialonglee. - `openclaw channels login --channel feishu` now prints a compact QR code that stays scannable in a normal terminal window. [#97087](https://github.com/openclaw/openclaw/pull/97087) Thanks @nianjiuzst. - Long Feishu streaming-card summaries now keep emoji and other non-BMP characters intact at the truncation boundary. [#97462](https://github.com/openclaw/openclaw/pull/97462) Thanks @ly-wang19. - Long Feishu comments containing emoji at the cutoff now reach the agent as valid text instead of being split into malformed characters. [#97595](https://github.com/openclaw/openclaw/pull/97595) Thanks @llagy007, @weeli-009. - Feishu and Lark registration and streaming-card requests now reject oversized provider JSON before it can place unbounded pressure on memory. [#97782](https://github.com/openclaw/openclaw/pull/97782) Thanks @alix-007. - Supported interactive-card JSON sent through Feishu messages, thread replies, or text payloads now renders as a card instead of appearing as raw JSON. [#100883](https://github.com/openclaw/openclaw/pull/100883) Thanks @martingarramon, @vincentkoc, @zenorewn. - Stalled Feishu tenant-token or streaming-card requests now time out with a clear error and release the processing lane so other Gateway messages can continue. [#102948](https://github.com/openclaw/openclaw/pull/102948) Thanks @hugenshen, @sallyom. - Feishu setups that could send bot pushes but silently lost user replies now pass incoming messages into OpenClaw instead of failing during monitor startup. [#94013](https://github.com/openclaw/openclaw/pull/94013) Thanks @xydt-tanshanshan. - Feishu one-to-one chats can receive text, media, card, and fallback replies again instead of losing the response after the incoming message was processed. [#94760](https://github.com/openclaw/openclaw/pull/94760) Thanks @obviyus, @xydigit-zt. - Feishu card headers now show a clean agent emoji and name instead of descriptive text from `identity.emoji`, while flags, skin-tone variants, family emoji, and other valid sequences remain intact. [#96587](https://github.com/openclaw/openclaw/pull/96587) Thanks @harjothkhara, @leedongyu1128. - Feishu video messages now show the duration of local and remotely loaded MP4 clips when duration detection is available. [#98235](https://github.com/openclaw/openclaw/pull/98235) Thanks @areslp. - Temporary Feishu streaming-card refresh failures are now contained and logged for diagnosis instead of surfacing as unhandled errors. [#99301](https://github.com/openclaw/openclaw/pull/99301) Thanks @lwy-2. - Feishu direct messages received while the bot identity is temporarily unavailable no longer turn ordinary user mentions into accidental forwarding targets. [#100891](https://github.com/openclaw/openclaw/pull/100891) Thanks @zhangguiping-xydt. - Feishu error logs now shorten emoji-containing text at a valid character boundary, making card-action and WebSocket cleanup failures easier to read. [#101364](https://github.com/openclaw/openclaw/pull/101364) Thanks @zengwen-dt. - Feishu Drive can now list files beyond the first page of a large shared folder by accepting its returned `next_page_token`, with invalid page sizes rejected clearly before the request. [#101572](https://github.com/openclaw/openclaw/pull/101572) Thanks @zhangguiping-xydt. - A Feishu connection that stops receiving messages is less likely to remain falsely marked healthy because transport activity now updates channel health. [#90966](https://github.com/openclaw/openclaw/pull/90966) Thanks @acache, @richardataxai-lab, @vincentkoc. - Canceling a Feishu reconnect, startup, or bot-identity retry wait now ends cleanly instead of risking a `ReferenceError` during cleanup. [#98137](https://github.com/openclaw/openclaw/pull/98137) Thanks @zhanglei99586. - Feishu bot replies no longer expose internal tool or runtime failure banners alongside the intended response. [#98705](https://github.com/openclaw/openclaw/pull/98705) Thanks @zengwen-dt. - Multi-account Feishu setups can now start the default channel with an environment-backed top-level SecretRef and separate inline secrets for named accounts, without replacing the protected secret with plaintext. [#96965](https://github.com/openclaw/openclaw/pull/96965) Thanks @zw-xysk. #### Google Chat - Google Chat sends and request verification now bound oversized API, certificate, and error responses, allowing normal traffic through while broken or hostile bodies fail or truncate without exhausting memory. [#96772](https://github.com/openclaw/openclaw/pull/96772) Thanks @vincentkoc, @wangmiao0668000666. - Google Chat agents can now distinguish allowed bot messages through `is_bot: true` and handle automated senders differently from people. [#97825](https://github.com/openclaw/openclaw/pull/97825) Thanks @masatohoshino, @vincentkoc. - Long Google Chat approval cards now preserve emoji at the text limit, preventing corrupted approval text or malformed card payloads. [#96573](https://github.com/openclaw/openclaw/pull/96573) Thanks @llagy007, @weeli-009. #### Google Meet - Google Meet join, creation, talk-back, transcription, and related automation now work across browser and account languages by using English in OpenClaw-controlled Meet tabs. [#89671](https://github.com/openclaw/openclaw/pull/89671) Thanks @unayung. - Google Meet sessions launched through a paired macOS Chrome node now open the intended URL with the configured Chrome profile and audio tools, while unsupported actions and executable overrides are rejected before reaching the node. [#96908](https://github.com/openclaw/openclaw/pull/96908) Thanks @joshavant. - When Google Meet's local OAuth callback port is occupied, `openclaw meet auth login` now offers the manual redirect-paste flow instead of stopping sign-in. [#96492](https://github.com/openclaw/openclaw/pull/96492) Thanks @jinduwang1001-max, @yetval. #### Microsoft Teams - Microsoft Teams replies to long parent messages now keep emoji and similar characters intact in the agent's parent-message context instead of inserting malformed text. [#96569](https://github.com/openclaw/openclaw/pull/96569) Thanks @llagy007, @weeli-009. - Microsoft Teams Adaptive Card button clicks now deliver the submitted value to the agent instead of arriving as empty messages. [#97546](https://github.com/openclaw/openclaw/pull/97546) Thanks @jimmypuckett. - Microsoft Teams file delivery and chat lookup now cap large Microsoft Graph responses and return a labeled error instead of risking a process crash. [#97784](https://github.com/openclaw/openclaw/pull/97784) Thanks @alix-007. - Microsoft Teams attachment recovery now declines oversized Graph metadata with diagnostics instead of buffering it into Gateway memory, while normal hosted media still downloads within configured limits. [#101082](https://github.com/openclaw/openclaw/pull/101082) Thanks @cxbasdev. - The Microsoft Teams personal-chat welcome card now displays its greeting with the intended bold, medium emphasis. [#96290](https://github.com/openclaw/openclaw/pull/96290) Thanks @ly-wang19, @vincentkoc. - Microsoft Teams thread history now preserves literal entity text such as `<APIKEY>` instead of turning it into different markup before the agent sees it. [#96342](https://github.com/openclaw/openclaw/pull/96342) Thanks @ly-wang19. - Microsoft Teams feedback on long responses now carries intact emoji into reflection processing, preventing a cutoff from corrupting prompts, logs, or encoding. [#96578](https://github.com/openclaw/openclaw/pull/96578) Thanks @llagy007, @weeli-009. - Oversized or malformed Microsoft Teams personal-chat attachment metadata now fails safely with a warning instead of consuming unbounded Gateway memory. [#99125](https://github.com/openclaw/openclaw/pull/99125) Thanks @ly85206559. #### Matrix - Long Matrix thread starters keep emoji and other special characters intact when OpenClaw shortens them for agent context. [#97121](https://github.com/openclaw/openclaw/pull/97121) Thanks @bartok9, @ly-wang19. - Matrix operators now receive a structured warning when token rotations leave multiple populated storage roots, with details for identifying and carefully archiving stale folders. [#97353](https://github.com/openclaw/openclaw/pull/97353) Thanks @eldron81-r2d2, @outdog-hwh. - Long Matrix reply quotes sent to agents now truncate emoji and other multi-unit characters without leaving broken text. [#97471](https://github.com/openclaw/openclaw/pull/97471) Thanks @ly-wang19. - Matrix media downloads now enforce size and idle-timeout limits before buffering, including for encrypted media. [#97662](https://github.com/openclaw/openclaw/pull/97662) Thanks @alix-007. - Malformed successful Matrix responses now produce a controlled homeserver error instead of an opaque unhandled JSON parsing failure. [#97973](https://github.com/openclaw/openclaw/pull/97973) Thanks @lsr911. - Matrix dependency setup now stops its child process predictably and reports the failure when a local command's output pipe breaks. [#101597](https://github.com/openclaw/openclaw/pull/101597) Thanks @alix-007. - Matrix replies now deliver the intended answer without leaking internal tool diagnostics, reasoning tags, or assistant-only scaffolding. [#97372](https://github.com/openclaw/openclaw/pull/97372) Thanks @masatohoshino. #### Mattermost - Mattermost streaming draft previews now shorten long text containing emoji without showing a malformed replacement character. [#97472](https://github.com/openclaw/openclaw/pull/97472) Thanks @ly-wang19. - Mattermost channel monitoring now rejects inbound events above 16 MiB and reconnects, limiting memory exposure while continuing to accept normal large messages. [#99366](https://github.com/openclaw/openclaw/pull/99366) Thanks @sunlit-deng. - Mattermost API calls now stop oversized or endless successful responses before they can consume unbounded memory, while normal requests and uploads continue unchanged. [#96033](https://github.com/openclaw/openclaw/pull/96033) Thanks @alix-007. - Mattermost API failures with an empty JSON body now produce a clear status-based error instead of an `Unexpected end of JSON input` crash. [#97851](https://github.com/openclaw/openclaw/pull/97851) Thanks @pick-cat. - Mattermost installations repaired after an upgrade now load and reconnect on Gateway restart without requiring a manual plugin-enable setting, including restrictive allowlist setups. [#98608](https://github.com/openclaw/openclaw/pull/98608) Related [#98564](https://github.com/openclaw/openclaw/issues/98564). Thanks @jacobtomlinson, @shakkernerd. - Mattermost teams with more than 200 members can now discover and address valid peers beyond the first page of the team directory. [#98877](https://github.com/openclaw/openclaw/pull/98877) Related [#98871](https://github.com/openclaw/openclaw/issues/98871). Thanks @qingminglong. - Mattermost replies now show the intended assistant response without exposing internal tool-failure diagnostics. [#98693](https://github.com/openclaw/openclaw/pull/98693) Thanks @zengwen-dt. - Native `/oc_*` Mattermost commands work again in packaged installs using `openclaw/mattermost`, without allowing disabled or denied plugins to bypass Gateway checks. [#98819](https://github.com/openclaw/openclaw/pull/98819) Related [#98740](https://github.com/openclaw/openclaw/issues/98740). Thanks @amknight, @keltech-services. #### Nextcloud - Nextcloud Talk sends and reactions now bound server response sizes, protecting OpenClaw from hangs or runaway memory use while preserving normal delivery. [#96031](https://github.com/openclaw/openclaw/pull/96031) Thanks @alix-007. - Nextcloud Talk startup checks now show a concise bot-admin API failure without buffering an arbitrarily large error body. [#97811](https://github.com/openclaw/openclaw/pull/97811) Thanks @pick-cat. #### IRC - Long IRC messages now keep emoji and other supplementary characters intact when split into delivery chunks, including with unusually small configured chunk limits. [#96572](https://github.com/openclaw/openclaw/pull/96572) Thanks @llagy007, @weeli-009. - IRC reconnects now rotate fallback nicknames after a 433 conflict instead of repeatedly retrying the same occupied name. [#96108](https://github.com/openclaw/openclaw/pull/96108) Thanks @wendy-chsy. - IRC outbound text now preserves escaped emoji and keeps invalid surrogate escapes literal instead of silently replacing them with corrupted characters. [#97683](https://github.com/openclaw/openclaw/pull/97683) Thanks @llagy007, @weeli-009. - Long IRC replies now arrive complete when they contain Chinese, Cyrillic, emoji, or other non-ASCII text, while respecting `messageChunkMaxChars`. [#99138](https://github.com/openclaw/openclaw/pull/99138) Thanks @yetval. - IRC bots now reconnect and rejoin configured channels after a temporary server or network disconnect instead of staying silent until OpenClaw is restarted. [#100799](https://github.com/openclaw/openclaw/pull/100799) Thanks @zhangguiping-xydt. - IRC users now receive the intended answer without internal tool-failure banners or assistant-only scaffolding appearing in channel messages. [#97214](https://github.com/openclaw/openclaw/pull/97214) Thanks @masatohoshino, @studentzhou-svg, @vincentkoc. - IRC allowlists now reject host-less `nick!user` entries by default and guide operators toward verified full host masks, reducing impersonation risk. [#98339](https://github.com/openclaw/openclaw/pull/98339) Thanks @yetval. #### SMS - Twilio SMS account checks now handle malformed successful JSON with safe phone-number listing or a clear Messaging Service error. [#97999](https://github.com/openclaw/openclaw/pull/97999) Thanks @lsr911. - SMS replies now hide internal tool-trace failure banners and show only the intended assistant response. [#97989](https://github.com/openclaw/openclaw/pull/97989) Thanks @zengwen-dt. #### Synology - Long Synology Chat messages and diagnostic previews now truncate without cutting an emoji or other supplementary character in half, keeping downstream text valid. [#96574](https://github.com/openclaw/openclaw/pull/96574) Thanks @weeli-009. #### Zalo - Zalo setup, polling, sending, and health checks now reject abnormally large successful replies before they can push the Gateway into severe memory pressure. [#97277](https://github.com/openclaw/openclaw/pull/97277) Thanks @hugenshen. - Zalo operators can point Bot API calls at a compatible alternate endpoint without patching code, while ordinary workspace environment files cannot silently redirect traffic and millisecond message times remain accurate. [#98768](https://github.com/openclaw/openclaw/pull/98768) Thanks @romneyda. - Zalo gateway startup output now shows the connected bot account name when the Bot Platform supplies it. [#99274](https://github.com/openclaw/openclaw/pull/99274) Thanks @romneyda. - Zalo operators can send proactive CLI or scripted messages to valid nonnumeric `chat_id` values without an `Unknown target` rejection. [#101548](https://github.com/openclaw/openclaw/pull/101548) Thanks @goutamadwant. #### QQBot - QQBot upgrades now migrate recoverable credential backups into SQLite without deleting source files when import fails, while disposable caches rebuild separately. [#89597](https://github.com/openclaw/openclaw/pull/89597) - QQBot can now deliver documents and media created by sandboxed agents from authorized workspace paths while continuing to block path escapes. [#92872](https://github.com/openclaw/openclaw/pull/92872) Thanks @sliverp, @zhangguiping-xydt. - QQBot speech-to-text now returns an early, labelled error when an OpenAI-compatible transcription endpoint sends an oversized response instead of buffering the full body in memory. [#96968](https://github.com/openclaw/openclaw/pull/96968) Thanks @mushuiyu886. - QQBot Markdown tables now keep escaped pipe characters inside their cells, so commands and expressions do not shift into the wrong columns. [#97429](https://github.com/openclaw/openclaw/pull/97429) Thanks @ly-wang19. - QQBot reminders created from long text now receive readable job names even when an emoji falls at the cutoff, rather than storing a broken character. [#96575](https://github.com/openclaw/openclaw/pull/96575) Thanks @llagy007, @weeli-009. - QQBot status now reports disconnections and fatal close reasons accurately, then returns to connected only after a READY or RESUMED event. [#100127](https://github.com/openclaw/openclaw/pull/100127) Thanks @masatohoshino, @vincentkoc. - QQBot approval cards, message previews, logs, media paths, and retry warnings now shorten emoji-containing text without broken replacement characters. [#101421](https://github.com/openclaw/openclaw/pull/101421) Thanks @wangmiao0668000666. - QQBot previews, errors, commands, speech-to-text messages, media diagnostics, and logs now remain valid when emoji-containing text reaches a length limit. [#101516](https://github.com/openclaw/openclaw/pull/101516) Thanks @vincentkoc, @wangmiao0668000666. - QQBot now avoids accidental reminders, limits exposure of private media details, and requires explicit confirmation before destructive channel or announcement actions. [#98032](https://github.com/openclaw/openclaw/pull/98032) Thanks @patrick-erichsen. #### Tlon and Urbit - Tlon and Urbit channel failures now bound oversized or malformed error responses before they can cause memory spikes, while retaining useful short messages. [#98496](https://github.com/openclaw/openclaw/pull/98496) Thanks @pandah97. - Tlon now stops oversized or stalled external image downloads before they consume unbounded memory and can continue the message with the original URL. [#100374](https://github.com/openclaw/openclaw/pull/100374) Thanks @hugenshen. - Oversized Tlon scry responses now fail with a clear path-specific error instead of risking a Gateway out-of-memory crash. [#100376](https://github.com/openclaw/openclaw/pull/100376) Thanks @hugenshen. - Tlon approval notifications now keep emoji intact at the preview limit, preventing malformed message previews. [#97599](https://github.com/openclaw/openclaw/pull/97599) Thanks @llagy007, @weeli-009. - Tlon media uploads now stop safely when Memex returns an oversized or malformed response instead of allowing the upload attempt to consume excessive memory. [#101115](https://github.com/openclaw/openclaw/pull/101115) Thanks @cxbasdev. #### Nostr - Repeated Nostr profile publishing now clears relay timeout timers after success, reducing stale resource buildup in long-running agents. [#98720](https://github.com/openclaw/openclaw/pull/98720) Related [#98463](https://github.com/openclaw/openclaw/issues/98463). Thanks @wangmiao0668000666, @zhanglei99586. #### Voice Calls - Google Meet and direct Voice Call sessions now keep the identity, workspace, routing, and transcript attribution of the agent that started the call instead of silently switching to the default agent. [#77763](https://github.com/openclaw/openclaw/pull/77763) Thanks @quangtran88. - Google Live call history now keeps both sides of the conversation, while reconnects avoid submitting unfinished speech or combining unrelated utterances. [#84161](https://github.com/openclaw/openclaw/pull/84161) - OpenAI Realtime outbound calls now play one opening greeting even when the recipient speaks immediately after answering, while later interruptions continue to stop active speech. [#86285](https://github.com/openclaw/openclaw/pull/86285) Thanks @giodl73-repo, @jnikolaidis. - Callers using realtime OpenAI or Google voice calls can now interrupt assistant speech and have buffered phone audio stop promptly, while other providers keep the existing local fallback. [#90749](https://github.com/openclaw/openclaw/pull/90749) Thanks @moellenbeck. - Voice callers now hear a completed answer without waiting for post-turn compaction, and a successful early playback is no longer repeated. [#94015](https://github.com/openclaw/openclaw/pull/94015) Thanks @xialonglee. - Twilio voice-call operators can select US1, IE1, or AU1 so call control and records use the intended Region, with US1 remaining the default. [#95832](https://github.com/openclaw/openclaw/pull/95832) Thanks @jodok. - Inbound Telnyx-style and Plivo voice conversations can now continue after the caller's first response instead of falling silent before OpenClaw speaks again. [#100255](https://github.com/openclaw/openclaw/pull/100255) Thanks @dvy. - Valid Twilio and Plivo callbacks now pass signature checks behind trusted IPv4 reverse proxies even when Node reports the proxy as an IPv4-mapped IPv6 address. [#100261](https://github.com/openclaw/openclaw/pull/100261) Thanks @rohitjavvadi. - Repeated voice-call webhook deliveries are now acknowledged without repeating call or transcript side effects within the replay window. [#100263](https://github.com/openclaw/openclaw/pull/100263) Thanks @xialonglee. - The Twilio voice-call provider now rejects unsupported API hostnames before sending a request and accepts only OpenClaw's supported Twilio regional hosts. [094c0d4](https://github.com/openclaw/openclaw/commit/094c0d421faff7691d259a26af9cb135f00c6ebc) Thanks @vincentkoc. - An accepted voice message that arrives while OpenClaw is already replying can still receive a voice response when `tts.auto: "inbound"` is configured. [#95596](https://github.com/openclaw/openclaw/pull/95596) Thanks @mcaxtr. - Realtime voice prompts now remain readable when long agent names or injected context containing emoji must be shortened. [#101304](https://github.com/openclaw/openclaw/pull/101304) Thanks @alix-007. - Google Meet local audio bridges now shut down cleanly and log a warning when a capture or playback command pipe fails, rather than crashing on an unhandled stream error. [#101596](https://github.com/openclaw/openclaw/pull/101596) Thanks @alix-007. - Voice Call history now stays with the correct configured agent across Gateway restarts and upgrades, while ambiguous legacy state is left untouched with actionable warnings. [#89884](https://github.com/openclaw/openclaw/pull/89884) Thanks @mushuiyu886. - Completed Voice Call status remains available through the Gateway, tool, and CLI after restart or eviction instead of incorrectly appearing missing. [#99797](https://github.com/openclaw/openclaw/pull/99797) Thanks @darren2030. #### ClickClack - ClickClack agent replies to top-level messages now stay in the active channel or direct message, while replies inside real threads remain threaded. [#100582](https://github.com/openclaw/openclaw/pull/100582) Thanks @marvinthebored, @vincentkoc. - ClickClack can now show opt-in, durable commentary and tool activity during a run so users are not left with an empty channel until the final reply. [#99954](https://github.com/openclaw/openclaw/pull/99954) Thanks @obviyus, @ragesaq. - ClickClack now stops oversized REST success responses at the provider limit, giving users and operators a predictable failure instead of continued streaming and memory growth. [#96970](https://github.com/openclaw/openclaw/pull/96970) Thanks @mushuiyu886, @vincentkoc. #### Shared channel improvements - Messages that fail before reaching Discord, Slack, Matrix, or another channel can now be replayed after connectivity returns, while uncertain post-send outcomes still avoid blind duplicates. [#101024](https://github.com/openclaw/openclaw/pull/101024) Thanks @sunnyshu0925. - Messages sent through OpenClaw's message tool now retain configured static or identity response prefixes, keeping routed and broadcast messages consistently labeled. [#93639](https://github.com/openclaw/openclaw/pull/93639) Thanks @zengwen-dt. - Completions from subagents, scheduled tasks, media jobs, and agent harnesses now return through the same configured account, destination, and thread that requested them. [#98240](https://github.com/openclaw/openclaw/pull/98240) Thanks @yetval. - Replies and attachments already accepted by a channel are no longer resent after a restart or recovery failure, while genuinely unsent items remain retryable. [#99600](https://github.com/openclaw/openclaw/pull/99600) Thanks @zhangguiping-xydt. - Outbound sends now report failed and partially delivered messages with useful per-part outcomes instead of presenting every attempt as a success. [#99928](https://github.com/openclaw/openclaw/pull/99928) Thanks @masatohoshino. - Non-streaming channels no longer send the same final text or media twice for one message, while genuinely separate replies with different routing or thread identities still go through. [#100828](https://github.com/openclaw/openclaw/pull/100828) Thanks @vincentkoc, @zhangxiaojiujiayi. - Cron and outbound channel sends no longer report success without a usable platform receipt, making missing notifications show as not delivered or suppressed instead of falsely delivered. [#79811](https://github.com/openclaw/openclaw/pull/79811) Thanks @indulgeback. - Queued messages now resume at a gentler pace after an outage, restart, or reconnect, reducing avoidable channel and provider rate-limit bursts while keeping recovery bounded. [#101118](https://github.com/openclaw/openclaw/pull/101118) Thanks @zengwen-dt. - Noisy phone numbers with extra plus signs now match the intended Signal, iMessage, or WhatsApp contact, while identities with no digits are rejected safely. [#100467](https://github.com/openclaw/openclaw/pull/100467) Thanks @morluto. - Reply directives containing hidden unsafe characters now produce stable, display-safe reply IDs before chat routing uses them. [#96446](https://github.com/openclaw/openclaw/pull/96446) Thanks @lin-hongkuan. - Ambient agents now stay quieter in observed group conversations and honor operator instructions such as replying only when spoken to. [#99144](https://github.com/openclaw/openclaw/pull/99144) Thanks @obviyus. - Ambient group chats now remain silent unless the agent deliberately sends a message, without stray status lines, tool summaries, compaction notices, delivery warnings, or overflow follow-ups. [#99145](https://github.com/openclaw/openclaw/pull/99145) Thanks @obviyus. - Always-on group agents can now receive and answer valid unmentioned messages after a plugin fallback instead of silently dropping them. [#99506](https://github.com/openclaw/openclaw/pull/99506) Related [#99457](https://github.com/openclaw/openclaw/issues/99457). Thanks @lzy3538, @zqchris. - Agents catching up in busy group chats now receive clearer sender-by-sender history, making multi-person conversations easier to follow without exposing local paths or URLs. [#100366](https://github.com/openclaw/openclaw/pull/100366) Thanks @gorkem2020. - Telegram and Discord plugin commands that send their own response can return `{ suppressReply: true }`, preventing a second misleading empty-response warning or failure. [#80928](https://github.com/openclaw/openclaw/pull/80928) Related [#80756](https://github.com/openclaw/openclaw/issues/80756). Thanks @alexuser, @unclouded77. - With `messages.ackReactionScope: "all"`, ambient room messages now receive the configured acknowledgement reaction across Discord, Slack, and Telegram. [#87433](https://github.com/openclaw/openclaw/pull/87433) Thanks @paul-phan, @scoootscooob. - Channel plugins can resume automatic recovery after a long healthy run, so an occasional later disconnect is not blocked by an old restart budget while true rapid crash loops remain capped. [#101413](https://github.com/openclaw/openclaw/pull/101413) Thanks @clintoncodewell. - Telegram and other channels can recover automatically after certain API outages and timed-out shutdowns instead of remaining silent until a Gateway restart. [#94016](https://github.com/openclaw/openclaw/pull/94016) Thanks @sheyanmin. - A partially delivered queued send is no longer blindly replayed after reconnect, reducing duplicate Telegram and other channel messages. [#96247](https://github.com/openclaw/openclaw/pull/96247) Thanks @obviyus, @rosenlo. - Discord and other progress views now hide repetitive internal Code Mode polling while continuing to show meaningful tool activity. [#99893](https://github.com/openclaw/openclaw/pull/99893) - Long-running Discord and Nextcloud Talk integrations now bound their channel metadata caches instead of letting each newly encountered room increase memory use forever. [#101650](https://github.com/openclaw/openclaw/pull/101650) Thanks @alix-007, @vincentkoc. - A transient Gmail watch-renewal failure now produces an error without crashing a long-running foreground `openclaw webhooks gmail run` process. [#100342](https://github.com/openclaw/openclaw/pull/100342) Thanks @cxbasdev, @vincentkoc. - Channel previews, thread names, snippets, and shortened errors across browser and messaging integrations now preserve whole emoji and other Unicode characters. [c16bb87](https://github.com/openclaw/openclaw/commit/c16bb8725a8a04d5de92855769cf87e13574384f) Thanks @vincentkoc. - Long Slack context labels, Zalo messages and captions, and extension command output now truncate without breaking emoji or other non-BMP characters. [7e03242](https://github.com/openclaw/openclaw/commit/7e0324263b867d3d47138d1d2b1e9afd1dd2016f) Thanks @hugenshen, @mushuiyu886, @vincentkoc. - Fenced code blocks that contain example lines resembling Markdown fence markers are now kept together instead of being split mid-block and becoming confusing or misread. [#96745](https://github.com/openclaw/openclaw/pull/96745) Thanks @ly-wang19, @vincentkoc. - Long unbroken messages now keep emoji intact when split into delivery-sized chunks, preventing garbled replacement characters for users and channel plugins. [#96951](https://github.com/openclaw/openclaw/pull/96951) Thanks @bartok9, @ly-wang19. - Skill command descriptions now remain fuller where supported and stay valid in Discord and Mattermost when emoji appears near a platform limit. [#99593](https://github.com/openclaw/openclaw/pull/99593) Thanks @pick-cat. - Long emoji-containing agent labels now produce clean native channel thread names and introductions instead of broken characters. [#101527](https://github.com/openclaw/openclaw/pull/101527) Thanks @lsr911. - Chinese, Japanese, and Korean bold labels followed immediately by text now render as bold instead of exposing literal `**` markers in Telegram and other shared-Markdown channels. [#101230](https://github.com/openclaw/openclaw/pull/101230) Thanks @nicknmorty. - Attachment download failures across WhatsApp, LINE, Signal, iMessage, Teams, Feishu, Mattermost, and Zalo now remain visible and actionable instead of disappearing or masquerading as successful media. [#100119](https://github.com/openclaw/openclaw/pull/100119) - OpenClaw now recognizes `.m2a` recordings as audio, allowing them to move through attachment, transcription, memory, and chat display workflows without conversion. [#92167](https://github.com/openclaw/openclaw/pull/92167) Thanks @llljjjwww333. - Files sent through Telegram and other supported chat channels now keep clean names such as `report.png` instead of exposing an internal cache identifier in the attachment filename. [#96565](https://github.com/openclaw/openclaw/pull/96565) Thanks @narahariraghava, @obviyus. - Cron summaries, Teams and Slack replies, and other embedded assistant responses no longer expose provider reasoning markers such as `</mm:think>`. [#101036](https://github.com/openclaw/openclaw/pull/101036) Thanks @velanir-ai-manager. - Punctuation around a model's `NO_REPLY` token no longer turns it into a visible chat message, while legitimate messages containing the token still arrive. [#98224](https://github.com/openclaw/openclaw/pull/98224) Thanks @sunnyshu0925. - Slack, Discord, Telegram, WhatsApp, and Microsoft Teams users now receive a clear retry and re-authentication message when a model provider returns a recognized HTTP 401 error instead of seeing only a reaction or no useful reply. [#96599](https://github.com/openclaw/openclaw/pull/96599) Thanks @sjf-oa. - Text commands such as `/model fable` now reliably display their confirmation even in flows that suppress ordinary source replies. [#100151](https://github.com/openclaw/openclaw/pull/100151) - The bare `/think` command now shows available thinking levels promptly in Telegram, Slack, and Discord without waiting on slow model discovery. [#101926](https://github.com/openclaw/openclaw/pull/101926) Thanks @vincentkoc. - Direct mentions to Telegram and Discord group bots using `message_tool_only` now produce visible channel replies on both new and resumed sessions. [#99389](https://github.com/openclaw/openclaw/pull/99389) Related [#99371](https://github.com/openclaw/openclaw/issues/99371). Thanks @obviyus. - The `/usage full` footer is shorter and easier to read on Telegram and other narrow displays, with detailed token information still available through dedicated views. [#92877](https://github.com/openclaw/openclaw/pull/92877) Thanks @marvinthebored. - Custom usage footers now render alias and map fallbacks correctly even when model or mode names collide with properties such as `toString` or `constructor`. [#98503](https://github.com/openclaw/openclaw/pull/98503) Related [#98466](https://github.com/openclaw/openclaw/issues/98466). Thanks @chenyangjun-xy, @zhanglei99586. - Transient stdout or stderr read errors from `gog gmail watch serve` no longer crash OpenClaw while Gmail watch mode is running. [#100519](https://github.com/openclaw/openclaw/pull/100519) Thanks @cxbasdev. ### Providers and Models Across Anthropic and Claude, Gemini, OpenAI and Codex, local models, and other supported routes, [providers](https://docs.openclaw.ai/concepts/model-providers) now handle credentials, catalogs, limits, fallbacks, streaming, and tool calls more consistently. Readers should see fewer requests fail because the selected route used the wrong model metadata, replayed incompatible reasoning, lost authentication state, or interpreted a provider response incorrectly. The [model catalog](https://docs.openclaw.ai/concepts/models) also reports availability and capability more accurately, while [Codex supervision](https://docs.openclaw.ai/plugins/codex-supervision) keeps connected model choices and session behavior aligned with the backend that was actually selected. #### Provider setup and model selection ##### New providers and integrations - OpenCode Zen users can browse and run its supported Claude, GPT, Gemini, GLM, DeepSeek, MiniMax, Qwen, and other models without manually defining each route. [#92495](https://github.com/openclaw/openclaw/pull/92495) Thanks @mushuiyu886, @sallyom. - Library and integration developers can now install a version-matched package, create independent AI runtimes, and reuse OpenClaw's supported model transports without embedding the full application. [#99059](https://github.com/openclaw/openclaw/pull/99059) - Featherless AI now has an official provider install and onboarding path, including `FEATHERLESS_API_KEY`, a curated `featherless/Qwen/Qwen3-32B` default, and support for exact Featherless model IDs. [#101092](https://github.com/openclaw/openclaw/pull/101092) Thanks @vincentkoc. - Meta Model API is now exposed through the public `meta` provider, with `meta/muse-spark-1.1`, canonical provider docs, and standalone npm or ClawHub installation paths. [#103070](https://github.com/openclaw/openclaw/pull/103070) Thanks @vincentkoc. - The bundled Meta provider now uses `https://api.meta.ai/v1`, advertises Muse Spark 1.1's documented 131,072-token output limit, and applies official-host request protections. [#103680](https://github.com/openclaw/openclaw/pull/103680) Thanks @vincentkoc. ##### Anthropic, Google, and OpenAI setup - Claude Fable 5 now works through Anthropic Vertex for simple-completion tasks such as generated conversation labels instead of failing before the request reaches Vertex. [#98932](https://github.com/openclaw/openclaw/pull/98932) - Claude CLI users can combine multiple `--mcp-config` files without losing servers or corrupting the prompt, and concurrent Gemini CLI runs are less likely to interfere with shared credential files. [#98983](https://github.com/openclaw/openclaw/pull/98983) Related [#98944](https://github.com/openclaw/openclaw/issues/98944), [#98945](https://github.com/openclaw/openclaw/issues/98945). Thanks @obviyus. - Google image generation can now use `models.providers.google.apiKey` and an optional custom `baseUrl` without separate environment credentials or an auth profile. [#100779](https://github.com/openclaw/openclaw/pull/100779) Thanks @amknight. - OpenAI image generation can now be enabled from `models.providers.openai` with a usable API key and custom base URL, without also requiring `OPENAI_API_KEY` or an auth profile. [#100745](https://github.com/openclaw/openclaw/pull/100745) Thanks @amknight. - Configurations using the retired `openai-codex-responses` API ID now receive a validation message naming the supported replacement instead of a generic failure. [#96257](https://github.com/openclaw/openclaw/pull/96257) Thanks @james-16, @yetval. - Legacy `openai-codex` references now direct operators to `openclaw doctor --fix` and `openclaw models status` instead of suggesting configuration that fails validation. [#100120](https://github.com/openclaw/openclaw/pull/100120) Thanks @jason-vaughan, @sunnyshu0925, @vincentkoc. ##### Local and self-hosted models - Ollama model discovery now stops oversized or never-ending endpoint responses before they can exhaust memory or leave setup hanging. [#96027](https://github.com/openclaw/openclaw/pull/96027) Thanks @alix-007. - LM Studio model discovery and startup now stop pathological server responses at a fixed size and report a clear error instead of buffering them indefinitely. [#96042](https://github.com/openclaw/openclaw/pull/96042) Thanks @alix-007. - `openclaw models list` now reports configured local Ollama models as available when they are running and usable. [#97491](https://github.com/openclaw/openclaw/pull/97491) Thanks @lingfeizi, @qingminglong. - Custom Xiaomi MiMo and other OpenAI-compatible models without a known output limit can now complete chats instead of failing with an invented oversized cap. [#98312](https://github.com/openclaw/openclaw/pull/98312) Thanks @peole, @sanjays2402. ##### Shared provider configuration - Provider setup now stops reading runaway model-discovery responses before they can stall or exhaust memory, while normal self-hosted server responses continue to work. [#95244](https://github.com/openclaw/openclaw/pull/95244) Thanks @alix-007, @sallyom. - Rerunning provider onboarding or refreshing models now preserves operator-owned timeouts, transport settings, MiniMax models, and SecretRef credentials instead of silently erasing them. [#100107](https://github.com/openclaw/openclaw/pull/100107) Thanks @frank-beans. - With `models.mode` set to `replace`, agent startup now uses only explicitly configured providers and skips the slow implicit provider scan. [#82638](https://github.com/openclaw/openclaw/pull/82638) Related [#66957](https://github.com/openclaw/openclaw/issues/66957). Thanks @eldar702, @wangzhengshu. - Bundled provider aliases now accept supported overlay settings such as request timeouts without demanding custom-provider fields like `baseUrl` and `models`. [#88400](https://github.com/openclaw/openclaw/pull/88400) Thanks @pluviobyte. - Isolated cron jobs can now use models supplied by enabled bundled plugins without failing as unknown or silently resolving to the wrong provider. [#96070](https://github.com/openclaw/openclaw/pull/96070) Thanks @sallyom, @sunnyshu0925. - Z.AI endpoint and model detection now fails gracefully on oversized or endless error responses instead of exhausting host memory. [#97540](https://github.com/openclaw/openclaw/pull/97540) Thanks @alix-007. - Microsoft Foundry connection tests now stop oversized or continuously streamed error responses while preserving concise setup diagnostics. [#97812](https://github.com/openclaw/openclaw/pull/97812) Thanks @pick-cat. - Generic provider configurations for official DashScope/Qwen, Moonshot, Z.AI, DeepSeek, Groq, Cerebras, and Chutes endpoints now retain the compatibility behavior those services require even without optional plugins. [#100125](https://github.com/openclaw/openclaw/pull/100125) - Provider onboarding no longer writes an empty `request` block when no request overrides were supplied. [3a0a736](https://github.com/openclaw/openclaw/commit/3a0a736843af2877d66f5b8b8bcc78786d8f04a0) Thanks @vincentkoc. ##### Model catalogs and selection - Switching a live Control UI or TUI session through a provider-qualified model alias now saves the canonical provider and model, preventing the next request from being rejected. [#100209](https://github.com/openclaw/openclaw/pull/100209) Thanks @sahilsatralkar. - Bedrock Mantle model discovery now times out and caps oversized catalog responses instead of hanging or consuming excessive memory, while cached models remain available. [#99961](https://github.com/openclaw/openclaw/pull/99961) Thanks @zhangguiping-xydt. - OpenRouter video model discovery now stops oversized or runaway catalog responses promptly instead of letting them consume memory without limit, while normal discovery behavior is preserved. [#96505](https://github.com/openclaw/openclaw/pull/96505) Thanks @mushuiyu886. - Model aliases and partial names such as `opus` now resolve to the newest matching version even when catalogs reach double-digit versions, preventing silent routing to an older model. [#96609](https://github.com/openclaw/openclaw/pull/96609) Thanks @yetval, @zw-xysk. - Paginated provider catalogs now expose models beyond the first page, while malformed, endless, or redirected catalogs fail safely instead of caching an incomplete list or forwarding sensitive headers across origins. [#97012](https://github.com/openclaw/openclaw/pull/97012) Thanks @zhangguiping-xydt. - Hugging Face model discovery now falls back to the bundled catalog when a provider response is malformed or oversized instead of risking excessive memory use. [#101079](https://github.com/openclaw/openclaw/pull/101079) Thanks @cxbasdev. - Trusted official external providers can now show model-specific thinking choices before full runtime activation, including off, low, high, and max for Z.AI GLM 5.2. [b4fce16](https://github.com/openclaw/openclaw/commit/b4fce16971995438ee416eee90569a37d6a592dc) Thanks @vincentkoc. - Status summaries now respect provider-local model aliases, showing the selected alias without a false pinned-model mismatch warning. [1d4e789](https://github.com/openclaw/openclaw/commit/1d4e7899a47f4483d29848eac02e1fb89de2a2ee) - OpenRouter scans now interpret model names such as `8b-70b` by their larger parameter size, improving minimum-size filters and small-model security warnings. [#96288](https://github.com/openclaw/openclaw/pull/96288) Thanks @ly-wang19. - Media-generation catalogs now keep the correct default model marker even when provider metadata includes harmless surrounding whitespace. [#96430](https://github.com/openclaw/openclaw/pull/96430) Thanks @lin-hongkuan. - Very long OpenRouter Fusion model IDs now remain valid Unicode in the agent prompt instead of showing a corrupted character when an emoji reaches the display limit. [#104433](https://github.com/openclaw/openclaw/pull/104433) Thanks @zhangguiping-xydt. #### Sign-in and credentials ##### Anthropic and Claude - Anthropic OAuth token exchange and refresh now reject oversized endpoint responses early instead of reading an unbounded body into memory. [#96644](https://github.com/openclaw/openclaw/pull/96644) Thanks @solodmd. - Anthropic sign-in now rejects unsupported callback-host overrides, keeps authorization on standard local loopback addresses, and avoids callback failures or exposure through a non-local listener. [#96917](https://github.com/openclaw/openclaw/pull/96917) Thanks @xialonglee. - Expired Claude CLI authentication now shows the exact recovery command `claude auth login && openclaw models auth login --provider anthropic --method cli` instead of a generic failure. [#97669](https://github.com/openclaw/openclaw/pull/97669) Thanks @alix-007. - Anthropic OAuth subscription requests now carry the Claude Code-style billing identity, helping them use the intended subscription route instead of failing or being treated as the wrong request type. [709be93](https://github.com/openclaw/openclaw/commit/709be93ca8987009540eb56ed1b6bfda136427de) Thanks @vincentkoc. ##### OpenAI, ChatGPT, and Codex - ChatGPT OAuth sign-in and refresh now reject unexpectedly large token responses cleanly instead of risking Gateway memory exhaustion. [#99479](https://github.com/openclaw/openclaw/pull/99479) Thanks @pandah97. - Cloudflare 403 challenges on OpenAI or Codex OAuth requests now produce gateway-block guidance instead of incorrectly telling users their authentication failed. [#94440](https://github.com/openclaw/openclaw/pull/94440) Related [#94432](https://github.com/openclaw/openclaw/issues/94432). Thanks @lzyyzznl, @pbm9z95m6z-hue. - OpenAI authentication errors now point ChatGPT/Codex OAuth users to a model compatible with their existing sign-in instead of recommending an outdated default. [#100579](https://github.com/openclaw/openclaw/pull/100579) Thanks @zhangguiping-xydt. - For Codex-backed OpenAI models, `/status` now identifies ChatGPT login authentication as `oauth (codex-cli)` instead of incorrectly labeling it as an environment API key. [#91240](https://github.com/openclaw/openclaw/pull/91240) Related [#91099](https://github.com/openclaw/openclaw/issues/91099). Thanks @849261680, @ukstem. - OpenAI Realtime voice in Talk, Voice Call, and Discord was announced with a Codex/OpenAI OAuth fallback in [#100671](https://github.com/openclaw/openclaw/pull/100671). Correction: public Codex OAuth accounts do not have a supported realtime transport, so current builds require an OpenAI Platform API key. Thanks @steipete-oai. ##### Google and Gemini - Google Gemini CLI sign-in now rejects oversized OAuth, profile, project, and onboarding responses with labeled errors instead of risking excessive memory use. [#97587](https://github.com/openclaw/openclaw/pull/97587) Thanks @hugenshen. - Google Gemini CLI OAuth failures now keep oversized or malformed provider responses bounded while preserving useful error details. [#99605](https://github.com/openclaw/openclaw/pull/99605) Thanks @mushuiyu886. - Google OAuth sign-in, token exchange, and project discovery now return a bounded error for oversized responses instead of risking a process crash. [#97628](https://github.com/openclaw/openclaw/pull/97628) Thanks @vincentkoc, @wangmiao0668000666. ##### GitHub Copilot - GitHub Copilot sign-in, refresh, and model-list checks now fail with labeled size limits when GitHub or a proxy returns an oversized response. [#97499](https://github.com/openclaw/openclaw/pull/97499) Thanks @wangmiao0668000666. - GitHub Copilot sign-in and token refresh now reject oversized service responses with a clear error before they can exhaust OpenClaw's memory. [#97579](https://github.com/openclaw/openclaw/pull/97579) Thanks @hugenshen. - GitHub Copilot device login now fails cleanly on an oversized successful response instead of risking an out-of-memory crash. [#97583](https://github.com/openclaw/openclaw/pull/97583) Thanks @hugenshen. - OpenAI-compatible providers routed through the GitHub Copilot BYOK harness now retain bearer authentication, reducing false 401 errors for valid credentials. [#99955](https://github.com/openclaw/openclaw/pull/99955) Thanks @hxy91819. ##### xAI and Grok - xAI and Grok OAuth sign-in now works on SSH hosts, containers, VPS systems, and other headless environments without forwarding a localhost callback port. [#97249](https://github.com/openclaw/openclaw/pull/97249) Thanks @fuller-stack-dev, @jaaneek. - xAI sign-in, token refresh, and device approval now stop oversized OAuth responses before they can consume unbounded memory. [#97615](https://github.com/openclaw/openclaw/pull/97615) Thanks @cxbasdev. - Existing xAI and Grok OAuth sessions using the retired token endpoint can renew after expiry without forcing another browser or SSH-tunneled login. [#96146](https://github.com/openclaw/openclaw/pull/96146) Thanks @fuller-stack-dev, @jaaneek. ##### Ollama, MiniMax, Chutes, Z.AI, OpenRouter, and ClawRouter - Ollama Cloud setup now stops oversized or malicious authentication responses before they can consume excessive memory, while normal sign-in remains unchanged. [#97581](https://github.com/openclaw/openclaw/pull/97581) Thanks @hugenshen. - MiniMax OAuth device setup now limits authorization response size so a faulty proxied or self-hosted endpoint cannot exhaust Gateway memory. [#96322](https://github.com/openclaw/openclaw/pull/96322) Thanks @lsr911. - Chutes login, user lookup, and token refresh now stop unexpectedly large OAuth responses with a bounded error instead of buffering them without limit. [#96777](https://github.com/openclaw/openclaw/pull/96777) Thanks @wangmiao0668000666. - Chutes onboarding now fails clearly when token-exchange or user-info responses are oversized, preventing abnormal authentication traffic from causing unbounded memory growth. [#96779](https://github.com/openclaw/openclaw/pull/96779) Thanks @wangmiao0668000666. - Z.AI users can recover a profile that accidentally stored an onboarding command as the API key without wiping all authentication state. [#97520](https://github.com/openclaw/openclaw/pull/97520) Thanks @zhangguiping-xydt. - Chutes sign-in and token refresh errors now include a useful bounded snippet without allowing an endpoint to stream an unlimited response into memory. [#97808](https://github.com/openclaw/openclaw/pull/97808) Thanks @pick-cat. - OpenRouter sign-in now fails safely on oversized replies, and Discord webhook sends remain successful when their optional response body is absent, malformed, or too large. [#98098](https://github.com/openclaw/openclaw/pull/98098) Thanks @lwy-2. - OpenRouter model probes and agent requests now use discovered environment or profile API keys correctly instead of failing with a missing-authentication-header error. [#98187](https://github.com/openclaw/openclaw/pull/98187) Related [#97934](https://github.com/openclaw/openclaw/issues/97934). Thanks @laurencebrown, @sunlit-deng. - ClawRouter models selected in agent defaults now resolve at runtime when the credential is stored in an auth profile instead of the environment. [#99759](https://github.com/openclaw/openclaw/pull/99759) ##### Amazon Bedrock - Amazon Bedrock users can now analyze images and PDFs with the same AWS profile, role, SSO, environment, or instance credentials already used for chat. [#72092](https://github.com/openclaw/openclaw/pull/72092) Thanks @truffle-dev. ##### Shared sign-in and credential behavior - OpenAI/Codex and Anthropic OAuth result pages now show OpenClaw branding instead of the legacy Pi logo. [1834592](https://github.com/openclaw/openclaw/commit/1834592be17668cbfc9ea834c57df73e05b71f14) - Agents created by copying credentials now preserve the source agent's portable provider-profile priority instead of unexpectedly choosing a different credential. [#100833](https://github.com/openclaw/openclaw/pull/100833) Thanks @machine3at. - New or updated provider credentials entered through the CLI now appear in the running Gateway and Control UI model picker without a manual secrets reload or restart. [#101256](https://github.com/openclaw/openclaw/pull/101256) Thanks @fuller-stack-dev. - OAuth-backed models now become available in Gateway model browsing after credentials are renewed from another CLI process, without requiring a Gateway restart. [#104732](https://github.com/openclaw/openclaw/pull/104732) Thanks @fuller-stack-dev. #### Fallbacks and model switching ##### Anthropic and Claude - Anthropic conversations rejected for a missing tool result now tell users to retry or start a fresh session with `/new` instead of showing only a generic provider failure. [#98163](https://github.com/openclaw/openclaw/pull/98163) Thanks @masatohoshino. - Claude native-thinking sessions can now recover automatically after Anthropic rejects a replayed thinking block, without manual compaction or transcript loss. [#98411](https://github.com/openclaw/openclaw/pull/98411) Related [#98308](https://github.com/openclaw/openclaw/issues/98308). Thanks @clearhorizoninvestments, @sunlit-deng. - Claude CLI agent runs now fail over instead of presenting provider errors or raw stream data as answers, preserve multilingual and emoji output, and stop runaway one-shot output before it exhausts Gateway memory. [#98942](https://github.com/openclaw/openclaw/pull/98942) Related [#98896](https://github.com/openclaw/openclaw/issues/98896). Thanks @obviyus. - Eligible direct API-key requests to Claude Fable 5 now return an Opus 4.8 answer when Anthropic's safety classifier declines Fable, with diagnostics and Opus billing made clear. [#99906](https://github.com/openclaw/openclaw/pull/99906) ##### Google and Gemini - Gemini streaming can retry with another configured API key after a retryable quota or rate-limit response instead of failing on the first key. [#97328](https://github.com/openclaw/openclaw/pull/97328) Thanks @monkeyleet. ##### Ollama, OpenAI-compatible providers, and Z.AI - Ollama requests whose native response stream ends early can now continue to a configured fallback model instead of stopping with `LLM request failed`. [#100482](https://github.com/openclaw/openclaw/pull/100482) Thanks @turbotheturtle. - A detail-less failure from an OpenAI-compatible provider no longer puts a valid API-key profile into cooldown or forces avoidable fallback traffic. [#100617](https://github.com/openclaw/openclaw/pull/100617) Thanks @fengjikui. - Z.AI and similar HTTP 429 responses now distinguish temporary service overload from ordinary rate limiting and preserve provider-supplied retry timing. [#98165](https://github.com/openclaw/openclaw/pull/98165) Thanks @sunnyshu0925. - Continued conversations with strict custom OpenAI Responses-compatible endpoints no longer fail on an unsupported `input[n].status` field and needlessly switch to a fallback model. [#100831](https://github.com/openclaw/openclaw/pull/100831) Thanks @chenxiaoyu209. ##### Shared fallback and model-selection behavior - Replay-safe model timeouts can now advance to the next configured provider, letting agent, chat, and cron runs recover without repeating work that may have side effects. [#96142](https://github.com/openclaw/openclaw/pull/96142) Thanks @brokemac79, @riazrahaman. - Agent runs can move to the next configured model after a provider drops a stream, while genuine cancellations still stop promptly. [#90908](https://github.com/openclaw/openclaw/pull/90908) Thanks @shengting. - Embedded-agent runs can now try the next configured fallback model after a temporary upstream `LLM request failed` error. [#95542](https://github.com/openclaw/openclaw/pull/95542) Thanks @altaywtf, @mikasa0818. - Configured fallback chains now try an alternate model when the primary provider reports `model_not_found`, reducing failures after model availability changes. [#97571](https://github.com/openclaw/openclaw/pull/97571) Thanks @liuhao1024. - When a configured runtime model is no longer available, chat now explains that a new session will not help and directs operators to choose an available model. [#97611](https://github.com/openclaw/openclaw/pull/97611) Thanks @romneyda. - Provider failures now keep fallback error text within the configured size limit, preventing oversized responses from overwhelming logs or visible diagnostics. [#99340](https://github.com/openclaw/openclaw/pull/99340) Thanks @pick-cat. - `/model default` now actually returns an active session to its configured model after steering, fallback, or a previous manual selection. [#96318](https://github.com/openclaw/openclaw/pull/96318) Thanks @marsman-lab, @sunnyshu0925. - Gateway chat now classifies mixed provider messages as rate limits when throttling is the real failure, giving users recovery guidance that matches the problem. [#100755](https://github.com/openclaw/openclaw/pull/100755) Thanks @pick-cat. - `openclaw status` and `session_status` now identify when a session is using a fallback model and show the configured primary model beside it. [#101337](https://github.com/openclaw/openclaw/pull/101337) Thanks @lzy3538. #### Replies, reasoning, and tool calls ##### Anthropic and Claude - Claude CLI replies that streamed successfully are now retained when the final success envelope contains no text, preventing the completed answer from disappearing or triggering an empty-response fallback. [#90450](https://github.com/openclaw/openclaw/pull/90450) Thanks @totobusnello. - Claude Code 2.1 users can again approve and run Bash, WebFetch, Grep, Glob, AskUserQuestion, and other native tools in claude-cli sessions. [#98665](https://github.com/openclaw/openclaw/pull/98665) Related [#95171](https://github.com/openclaw/openclaw/issues/95171). Thanks @carterdawson, @yetval. - Claude CLI-backed agents now show native reasoning in `/reasoning stream` or `/reasoning on`, while `/reasoning off` consistently suppresses it for queued follow-ups too. [#99401](https://github.com/openclaw/openclaw/pull/99401) Thanks @marvinthebored. - Anthropic Opus 4.8 can now run with `tools.profile=coding` without every turn failing with an HTTP 400 schema error before the assistant replies. [#100492](https://github.com/openclaw/openclaw/pull/100492) Thanks @lin-hongkuan, @vincentkoc. - Anthropic Messages-compatible proxy users no longer see raw antml tool-call XML or arguments leak into visible Claude replies. [b2787a1](https://github.com/openclaw/openclaw/commit/b2787a1c7a7ae1a20d05411bba1dbf9091490c23) Thanks @jerry-xin. - Anthropic agents routed through AWS Bedrock can keep Feishu Bitable write tools enabled without the tool definitions blocking every conversation. [#94990](https://github.com/openclaw/openclaw/pull/94990) Thanks @twinslee, @vincentkoc. - Claude Fable 5 now uses the expected Anthropic `context1m` stream setup when 1M context is enabled, without affecting similar model IDs. [#100572](https://github.com/openclaw/openclaw/pull/100572) Thanks @zhangguiping-xydt. - Claude conversations through GitHub Copilot can continue after a tool failure with no visible output instead of entering repeated provider-schema failures. [#101373](https://github.com/openclaw/openclaw/pull/101373) Thanks @galiniliev. - Anthropic-compatible calls with token caps too small for manual thinking now run normally without thinking instead of failing provider validation. [#101415](https://github.com/openclaw/openclaw/pull/101415) Thanks @pick-cat. ##### OpenAI-compatible and local models - Ollama Cloud and other OpenAI-compatible Ollama chats can now continue after a tool call instead of failing the next turn with a provider 400 error. [#96474](https://github.com/openclaw/openclaw/pull/96474) Thanks @849261680. - vLLM, Ollama proxies, and other OpenAI-compatible gateways can deliver streamed replies even when they incorrectly label an event stream as JSON, avoiding an early parsing failure that previously ended the agent run. [#96503](https://github.com/openclaw/openclaw/pull/96503) Thanks @zengwen-dt. - GPT-5.5 and other models can send valid streaming events larger than 64 KiB through ChatGPT Responses without failing the request, while malformed unbounded streams remain limited. [#98198](https://github.com/openclaw/openclaw/pull/98198) Thanks @marvinthebored, @obviyus, @peetiegonzalez. - `openclaw agent --local` now reports a clear first-event timeout when a provider opens a stream but never sends usable output instead of appearing to hang indefinitely. [#98525](https://github.com/openclaw/openclaw/pull/98525) Thanks @osolmaz. - MCP tools that expect arrays or objects can now accept those values when Xiaomi MiMo, Ollama, or another affected provider returns them as JSON strings, avoiding a pre-execution validation failure. [#96922](https://github.com/openclaw/openclaw/pull/96922) Thanks @liuhao1024. - Repaired plain-text tool calls from LM Studio, xAI, and Ollama now emit a final completion event so plugins and other streaming consumers can finish them reliably. [#104714](https://github.com/openclaw/openclaw/pull/104714) ##### Google and Gemini - Google Live voice sessions can now register and call OpenClaw tools instead of rejecting their declarations before a tool-backed turn begins. [#100260](https://github.com/openclaw/openclaw/pull/100260) ##### MiniMax, OpenRouter, Mistral, and opencode-go - MiniMax M3 replies, including those routed through Fireworks, no longer expose hidden `mm:` reasoning in visible chat or progress output. [#93767](https://github.com/openclaw/openclaw/pull/93767) Thanks @drhack1, @vincentkoc. - Long opencode-go model runs are less likely to be falsely stopped as stalled while valid provider events are still arriving. [#97128](https://github.com/openclaw/openclaw/pull/97128) Thanks @liuwqgit, @vincentkoc, @yetval. - OpenRouter's DeepSeek V4 Flash and Pro models can answer with thinking enabled without failing with an HTTP 400. [#97208](https://github.com/openclaw/openclaw/pull/97208) Related [#97196](https://github.com/openclaw/openclaw/issues/97196). Thanks @nianjiuzst, @patelmm79. - Direct `mistral-medium-3-5` requests now send the user-selected adjustable reasoning level to Mistral as `reasoningEffort`. [#100688](https://github.com/openclaw/openclaw/pull/100688) Thanks @aniruddhaadak80, @wm0018. ##### Shared reasoning and tool behavior - Realtime voice sessions now omit an individual custom tool with an invalid provider-specific name and warn about it instead of letting that tool break the entire OpenAI, Azure, or Google session. [#89175](https://github.com/openclaw/openclaw/pull/89175) Thanks @vincentkoc. - Switching from thinking-off mode to a reasoning-required model now selects its lowest supported effort rather than silently choosing the most expensive level. [#93335](https://github.com/openclaw/openclaw/pull/93335) Thanks @obuchowski. #### Voice, transcription, images, and video ##### OpenAI and Azure voice and images - OpenAI Realtime voice and transcription sessions now start behind Clash, Surge, sing-box, and similar TUN proxy setups that resolve `api.openai.com` into fake-IP ranges. [#86526](https://github.com/openclaw/openclaw/pull/86526) Thanks @shushushv. - OpenAI and Azure realtime voice connections now close inbound messages above 16 MiB, limiting avoidable gateway memory pressure. [#99450](https://github.com/openclaw/openclaw/pull/99450) Thanks @sunlit-deng. - OpenAI realtime voice sessions now default to `gpt-realtime-2.1` when no model is specified, while explicit model pins continue to work. [#101390](https://github.com/openclaw/openclaw/pull/101390) Thanks @vincentkoc. - OpenAI image generation and reference-image editing no longer crash when credentials or a custom base URL are ready before the provider model catalog finishes loading. [#105518](https://github.com/openclaw/openclaw/pull/105518) Thanks @vincentkoc. - OpenAI video generation now stops oversized or endless submission responses with a bounded provider error before they can hang the request or exhaust memory. [#96905](https://github.com/openclaw/openclaw/pull/96905) Thanks @alix-007. ##### Google and Gemini media - Gemini CLI media analysis now returns its description even when the valid response also contains nested usage or other metadata. [#96432](https://github.com/openclaw/openclaw/pull/96432) Thanks @lin-hongkuan. - Google Veo video generation now ends oversized create or status responses early with a clear bounded error, preventing a broken endpoint from hanging OpenClaw or consuming memory indefinitely. [#96605](https://github.com/openclaw/openclaw/pull/96605) Thanks @alix-007. ##### MiniMax, xAI, and Fal-hosted media - Reference-image edits through Fal-hosted Grok Imagine and Nano Banana 2 Lite now reach the correct service, while mixed-model fallbacks honor each candidate's supported resolution and reference limits. [#98688](https://github.com/openclaw/openclaw/pull/98688) Thanks @davenicoll, @vincentkoc. - MiniMax TTS now accurately explains that volume must be greater than 0 and may be as high as 10 when a directive is invalid. [#101359](https://github.com/openclaw/openclaw/pull/101359) Thanks @quratulain-bilal. - MiniMax VLM and native PDF provider errors now remain readable when emoji or other supplementary characters land at the diagnostic snippet limit. [#101728](https://github.com/openclaw/openclaw/pull/101728) Thanks @wings1029. - MiniMax video generation now rejects oversized task, status, or file-metadata responses before unbounded memory use or binary download begins, while normal responses continue to work. [#96889](https://github.com/openclaw/openclaw/pull/96889) Thanks @alix-007. - xAI video generation now stops oversized create or status responses with a clear size-limit error instead of buffering until OpenClaw hangs or consumes excessive memory. [#96903](https://github.com/openclaw/openclaw/pull/96903) Thanks @alix-007, @vincentkoc. - MiniMax image understanding now stops oversized or malformed successful responses at a bounded limit, protecting memory while returning a useful diagnostic. [#100694](https://github.com/openclaw/openclaw/pull/100694) Thanks @zhangguiping-xydt. ##### Video providers and generation services - Moonshot video understanding now returns a predictable error for oversized or malformed responses instead of hanging or consuming memory indefinitely, including with custom base URLs. [#96502](https://github.com/openclaw/openclaw/pull/96502) Thanks @hugenshen. - Qwen video understanding now stops oversized or malformed endpoint responses with a clear error instead of hanging or reading without limit, while normal descriptions continue unchanged. [#96604](https://github.com/openclaw/openclaw/pull/96604) Thanks @alix-007. - BytePlus video generation now stops oversized task-submission or status responses with a clear error before they can stall OpenClaw or exhaust memory, while normal responses continue unchanged. [#96606](https://github.com/openclaw/openclaw/pull/96606) Thanks @alix-007. - DashScope-compatible video submission and polling now reject oversized JSON responses with a bounded error instead of risking memory pressure or process instability, while ordinary responses continue normally. [#96782](https://github.com/openclaw/openclaw/pull/96782) Thanks @wangmiao0668000666. - OpenRouter video generation now rejects oversized submit and polling responses before they can hang OpenClaw or consume runaway memory, while normal-sized malformed responses retain their established error handling. [#96873](https://github.com/openclaw/openclaw/pull/96873) Thanks @alix-007. - Vydra image, video, and speech generation now fails with a bounded error on oversized or endless control responses instead of hanging or exhausting memory, while valid responses continue normally. [#96875](https://github.com/openclaw/openclaw/pull/96875) Thanks @alix-007. - fal music and video generation now stops oversized successful responses with a clear size-limit error before they can hang or exhaust memory, while normal generation continues as before. [#96886](https://github.com/openclaw/openclaw/pull/96886) Thanks @alix-007. - Together and PixVerse video generation now returns a provider-labelled size error for oversized successful responses instead of continuing until severe memory pressure or process failure. [#96904](https://github.com/openclaw/openclaw/pull/96904) Thanks @alix-007. - Runway video generation now stops oversized create and status responses instead of continuing to consume memory or stall, while normal polling and provider-specific errors remain intact. [#96907](https://github.com/openclaw/openclaw/pull/96907) Thanks @alix-007. - Comfy image-generation workflows now stop oversized ComfyUI responses with the actual size-limit error instead of risking memory exhaustion or misreporting the response as malformed JSON. [#96927](https://github.com/openclaw/openclaw/pull/96927) Thanks @wangmiao0668000666. - DeepInfra video generation now rejects oversized successful responses with a bounded error instead of risking an out-of-memory crash. [#97486](https://github.com/openclaw/openclaw/pull/97486) Thanks @hugenshen. ##### Voice and transcription across providers - Configured Voice Call transcription providers such as xAI remain selectable when another provider registry is active, allowing Talk sessions to start normally. [#97170](https://github.com/openclaw/openclaw/pull/97170) Thanks @solavrc. - Missing official media providers now produce errors with the exact recovery commands needed to restore transcription and other media workflows. [#97484](https://github.com/openclaw/openclaw/pull/97484) Thanks @wangmiao0668000666. - A malformed Inworld voices response now produces a clear provider-specific error instead of an unhelpful parsing exception or process crash. [#98660](https://github.com/openclaw/openclaw/pull/98660) Thanks @solodmd. - Short non-English audio now keeps the configured language hint without an unrelated English prompt, reducing accidental translation when users expect a transcript in the spoken language. [#99023](https://github.com/openclaw/openclaw/pull/99023) Thanks @flyveryhigh, @nianjiuzst. ##### Shared media selection and response safety - Image and video tools can now automatically select configured provider-plugin models authenticated through environment variables. [#98623](https://github.com/openclaw/openclaw/pull/98623) Thanks @medns. - Automatically configured video understanding now uses provider defaults such as Moonshot's intended video model unless the user selected a model explicitly. [#99791](https://github.com/openclaw/openclaw/pull/99791) Thanks @vincentkoc, @zhangguiping-xydt. - Image generation now stops with a clear size-limit error when a provider or custom endpoint sends an oversized or endless response, preventing hangs and runaway memory use while valid images and edits continue normally. [#96495](https://github.com/openclaw/openclaw/pull/96495) Thanks @hugenshen, @sallyom. #### Speech, search, embeddings, and documents ##### Speech and transcription - Google Gemini TTS now rejects oversized responses before buffering them into memory, while normal speech results continue through the existing audio workflow. [#96984](https://github.com/openclaw/openclaw/pull/96984) Thanks @mushuiyu886. - Inworld text-to-speech and voice-list requests now fail safely on oversized, malformed, or never-ending responses instead of hanging or consuming unbounded Gateway memory. [#95416](https://github.com/openclaw/openclaw/pull/95416) Thanks @alix-007, @vincentkoc. - Azure Speech, Microsoft Speech, ElevenLabs, MiniMax TTS, OpenRouter transcription, and xAI transcription now stop oversized or endless responses before they can stall speech work or strain Gateway memory, while ordinary responses remain unchanged. [#96496](https://github.com/openclaw/openclaw/pull/96496) Thanks @hugenshen. - Volcengine, BytePlus Seed Speech, and Xiaomi TTS now stop oversized provider responses before one speech request can stall or destabilize OpenClaw. [#96874](https://github.com/openclaw/openclaw/pull/96874) Thanks @alix-007. - Google audio and video understanding now stops oversized provider responses at the shared 16 MiB limit with a clear error instead of allowing them to consume excessive memory. [#96920](https://github.com/openclaw/openclaw/pull/96920) Thanks @mushuiyu886, @vincentkoc. ##### Embeddings and memory search - Gemini memory-embedding batch uploads, creation, and status checks now fail safely when a compatible endpoint returns an oversized control response. [#97535](https://github.com/openclaw/openclaw/pull/97535) Thanks @hugenshen. - OpenAI-compatible embedding requests now close oversized responses early with a clear provider error instead of buffering until OpenClaw stalls or runs out of memory, while normal embeddings continue working. [#96868](https://github.com/openclaw/openclaw/pull/96868) Thanks @alix-007. - OpenAI embedding batch polling and Realtime setup now cancel oversized successful responses early and return a bounded error instead of growing memory without limit. [#97533](https://github.com/openclaw/openclaw/pull/97533) Thanks @hugenshen. - OpenAI-compatible embedding batch downloads now process valid large outputs while stopping oversized files or JSONL records before they can exhaust memory. [#98554](https://github.com/openclaw/openclaw/pull/98554) Thanks @sunlit-deng, @vincentkoc. - GitHub Copilot model discovery and memory search now reject oversized or malformed responses instead of buffering them without limit, while valid catalog and embedding results continue normally. [#96499](https://github.com/openclaw/openclaw/pull/96499) Thanks @hugenshen, @sallyom. - Voyage embedding batch jobs now stop oversized status, failure, and error-file responses before they can hang or exhaust worker memory, while oversized diagnostics degrade safely and ordinary responses remain unchanged. [#96608](https://github.com/openclaw/openclaw/pull/96608) Thanks @alix-007. - LM Studio embedding preload now respects the configured context limit, reducing GPU out-of-memory failures during memory search on constrained hardware. [#100750](https://github.com/openclaw/openclaw/pull/100750) Thanks @hxz398, @zak-li, @zoowh. - Malformed Voyage embedding batches now close their download connections after parsing fails, reducing resource buildup during repeated or large workloads. [#98840](https://github.com/openclaw/openclaw/pull/98840) Thanks @solodmd. ##### Search and document processing - Google Meet document processing now rejects oversized Google Drive exports before they can destabilize OpenClaw, while ordinary documents still export as text. [#97620](https://github.com/openclaw/openclaw/pull/97620) Thanks @alix-007, @vincentkoc. - Parallel web search now returns a bounded error when an upstream response is malformed, oversized, or never-ending instead of risking a hang or out-of-memory crash. [#96035](https://github.com/openclaw/openclaw/pull/96035) Thanks @alix-007. - Exa searches now reject responses above the supported limit, preventing excessive provider output from hanging OpenClaw or creating memory pressure. [#96038](https://github.com/openclaw/openclaw/pull/96038) Thanks @alix-007. #### Provider response safety and clearer errors ##### Anthropic and OpenAI-compatible streams - Anthropic-compatible requests now fail promptly with a bounded transport error when an upstream stream sends an oversized partial event instead of hanging and consuming memory. [#100686](https://github.com/openclaw/openclaw/pull/100686) Thanks @zhangguiping-xydt. - OpenAI ChatGPT Responses streaming now cancels oversized or endless provider bodies with a clear error before they can consume excessive process memory, while normal responses keep using the existing parser. [#96762](https://github.com/openclaw/openclaw/pull/96762) Thanks @vincentkoc, @wangmiao0668000666. - OpenAI-compatible provider and proxy streams now stop oversized malformed or never-ending bodies at the affected request instead of letting them destabilize or crash the OpenClaw process. [#96989](https://github.com/openclaw/openclaw/pull/96989) Thanks @vincentkoc, @wangmiao0668000666. - OpenAI-compatible Chat Completions now use OpenClaw's guarded network path, adding the same response safety controls used by other protected model calls. [#97228](https://github.com/openclaw/openclaw/pull/97228) Thanks @vincentkoc, @wangmiao0668000666. - Azure OpenAI Responses now bound oversized streaming and error bodies, protecting memory while preserving normal errors and cancellation. [#97349](https://github.com/openclaw/openclaw/pull/97349) Thanks @wangmiao0668000666. - Anthropic-compatible model requests now consistently use OpenClaw's guarded transport, response normalization, and managed stream cleanup rather than bypassing them through the SDK. [#101357](https://github.com/openclaw/openclaw/pull/101357) Thanks @wangmiao0668000666. - When an OpenAI or OpenAI-compatible chat-completions model refuses a request, users now see the provider's explanation instead of a blank assistant reply. [#102344](https://github.com/openclaw/openclaw/pull/102344) Thanks @wuqxuan, @yetval. ##### Proxies and other provider endpoints - Proxy-backed model streams now fail with bounded, clearer errors when responses are oversized, malformed, incomplete, or idle instead of hanging or consuming unbounded data. [#97235](https://github.com/openclaw/openclaw/pull/97235) Thanks @vincentkoc, @zhangguiping-xydt. - Mistral-compatible endpoints now stop oversized streaming responses with a labeled error before OpenClaw can run out of memory. [#97648](https://github.com/openclaw/openclaw/pull/97648) Thanks @wangmiao0668000666. - Abnormally large Google Meet, Calendar, or OAuth responses now stop with an error before they can consume uncontrolled Gateway memory. [#98850](https://github.com/openclaw/openclaw/pull/98850) Thanks @pandah97. ##### Shared provider diagnostics - Request-format and schema failures now show the relevant diagnostic without sending users through unnecessary provider login or reconfiguration steps. [#95779](https://github.com/openclaw/openclaw/pull/95779) Thanks @pick-cat. #### Codex app-server and supervised sessions ##### Runtime and model compatibility - Codex users can route both `codex/*` and `openai/*` models through the bundled runtime, and older conversations resume without unnecessary context reprojection. [#105034](https://github.com/openclaw/openclaw/pull/105034) - The bundled Codex plugin can complete backend requests again after updating its managed app-server runtime, with no model-picker or configuration migration required. [#106098](https://github.com/openclaw/openclaw/pull/106098) - OpenClaw's managed Codex workflow now uses app-server 0.143.0, and self-managed installations must use 0.143.0 or newer for protocol compatibility. [366258d](https://github.com/openclaw/openclaw/commit/366258dee6e4a3ea0bb04b1316e5a0c419c60188) Thanks @vincentkoc. - The managed Codex harness now surfaces supported GPT-5.6 Sol, Terra, and Luna models returned by the account catalog and gives self-managed users current version guidance. [f80ce21](https://github.com/openclaw/openclaw/commit/f80ce219fcf0c5cbe9871b9ad05b7570fbfeba6e) Thanks @vincentkoc. - Managed Codex users on macOS, Linux, and Windows now receive app-server 0.144.1 instead of 0.144.0. [5dcba9f](https://github.com/openclaw/openclaw/commit/5dcba9fae725c080b62c4b4e19533f5fcd59b964) Thanks @vincentkoc. - Codex-native delegation from OpenClaw threads now creates native task records again, while unsupported custom Codex app-server versions fail startup with a clear minimum-version error. [#101221](https://github.com/openclaw/openclaw/pull/101221) - Codex sessions using `gpt-5.5-pro` or `gpt-5.4-pro` now clamp unsupported reasoning levels before the first turn, avoiding an immediate request rejection when live metadata is unavailable. [#101484](https://github.com/openclaw/openclaw/pull/101484) Thanks @zhangguiping-xydt. ##### Session reliability and diagnostics - Scheduled and CLI Codex runs with an explicit timeout longer than 30 minutes can now use that full budget instead of being stopped by the terminal-idle guard. [#85296](https://github.com/openclaw/openclaw/pull/85296) Thanks @alkor2000, @vincentkoc. - A missing or hung local Codex tool result no longer switches the active session to another provider that cannot resolve the local failure. [#95543](https://github.com/openclaw/openclaw/pull/95543) Thanks @mikasa0818. - Codex app-server runs with an invalid ChatGPT OAuth session now surface the real sign-in error promptly instead of waiting for a misleading ten-second authentication timeout. [#100713](https://github.com/openclaw/openclaw/pull/100713) Thanks @lin-hongkuan. - Codex runs stopped by the guardian rejection limit now say why they ended, so operators do not have to mistake the result for a crash, cancellation, or generic interruption. [#101220](https://github.com/openclaw/openclaw/pull/101220) Thanks @darren2030. - Crestodian setup and repair chats on Codex-backed runs can now access the status and repair tool they need instead of stopping with a missing-tool response. [#101281](https://github.com/openclaw/openclaw/pull/101281) - Shared Codex app-server clients now keep usage limits, auth cooldowns, thread subscriptions, and resumed connections tied to the account and conversation that actually owns them. [#101376](https://github.com/openclaw/openclaw/pull/101376) - Codex app-server stdout failures now end affected requests cleanly, while a diagnostics-only stderr failure no longer interrupts an otherwise healthy turn. [#101505](https://github.com/openclaw/openclaw/pull/101505) Thanks @mushuiyu886, @vincentkoc. #### Usage, context, cost, and diagnostics ##### Usage and quota reporting - Anthropic usage checks now cap unusually large error responses so a CDN, firewall, or proxy page cannot exhaust OpenClaw's memory. [#97614](https://github.com/openclaw/openclaw/pull/97614) Thanks @cxbasdev. - OpenAI and Codex users authenticated through the app server can again see their five-hour and weekly quota windows in chat, CLI, and JSON status output. [#92520](https://github.com/openclaw/openclaw/pull/92520) Thanks @brokemac79. - OpenAI OAuth usage checks now cap oversized WHAM rate-limit responses before they can destabilize the process. [#97702](https://github.com/openclaw/openclaw/pull/97702) Thanks @cxbasdev. - GitHub Copilot usage checks now contain oversized or endless endpoint responses as a usage error instead of buffering them indefinitely, while normal usage data still loads. [#96607](https://github.com/openclaw/openclaw/pull/96607) Thanks @alix-007. - OpenRouter cost tracking now caps unexpectedly large metadata responses and keeps the original streamed estimate instead of disrupting the agent turn. [#97490](https://github.com/openclaw/openclaw/pull/97490) Thanks @hugenshen. - MiniMax and other shared provider usage checks now fail safely on oversized or malformed replies instead of buffering them without limit. [#97659](https://github.com/openclaw/openclaw/pull/97659) Thanks @cxbasdev, @vincentkoc. - OpenRouter completions that the provider bills at $0 now stay recorded as free in transcripts, summaries, logs, and usage totals instead of being replaced with estimated catalog pricing. [#101177](https://github.com/openclaw/openclaw/pull/101177) ##### Context limits and prompt efficiency - Amazon Bedrock adaptive-thinking Claude and Fable runs now honor configured high output-token limits for longer answers, reasoning, and tool calls. [#97343](https://github.com/openclaw/openclaw/pull/97343) Thanks @lilan0125, @prasithg. - Long, tool-heavy or media-heavy embedded-agent conversations now retain more prompt-cache reuse between turns, reducing repeated token processing, latency, and cost on prefix-cached providers. [#102610](https://github.com/openclaw/openclaw/pull/102610) Thanks @ugiezzz. - Nemotron 3 Super now exposes its full 1,048,576-token context budget in OpenClaw's bundled NVIDIA fallback catalog instead of compacting at the stale 262,144-token limit. [#98726](https://github.com/openclaw/openclaw/pull/98726) Thanks @eleqtrizit. - ChatGPT OAuth-backed Responses sessions now retain backend affinity across turns, improving prompt-cache reuse and reducing repeated processing of the same conversation context. [#100233](https://github.com/openclaw/openclaw/pull/100233) Thanks @marvinthebored, @obviyus, @peetiegonzalez. ##### Session and model diagnostics - After `/model` changes a session's provider, `/status` and `session_status` now report that provider's usage, authentication, runtime, and context details rather than stale defaults. [#93384](https://github.com/openclaw/openclaw/pull/93384) Thanks @obviyus, @osolmaz, @rollingshmily, @samiralibabic, @zhangguiping-xydt. - Model-call traces now include prompt-size and per-call token usage details, helping operators investigate cost and prompt growth without capturing raw content. [#95770](https://github.com/openclaw/openclaw/pull/95770) Thanks @amknight. - The diagnostics timeline now shows when provider model calls ran, how long they took, and whether they succeeded without recording prompt or response content. [7253552](https://github.com/openclaw/openclaw/commit/7253552c68d0ac8c6098126d373f185bb6df22a2) Thanks @vincentkoc. ### Memory and Sessions [Memory](https://docs.openclaw.ai/concepts/memory) indexing, recall, wiki synchronization, and search recover from more malformed pages, stale status, large indexes, transient reads, and provider mismatches without hiding useful stored context or overwriting user notes. When a result is incomplete or a configured memory provider is unavailable, the failure is clearer instead of looking like a complete answer. [Sessions](https://docs.openclaw.ai/cli/sessions), transcripts, compaction, goals, and routing also retain the intended conversation more consistently through restarts, resets, delayed follow-ups, tool-heavy runs, and client changes. The practical result is less missing history, fewer replies stored against the wrong session, and more dependable continuation of long-running work. #### Memory search and recall - QMD `search` and `vsearch` modes now skip the LLM reranker, reducing latency and avoiding unnecessary GPU failures while full `query` mode keeps reranking. [#88887](https://github.com/openclaw/openclaw/pull/88887) Thanks @potterdigital. - Memory-wiki pages titled `Index` now remain stored, searchable, and retrievable instead of being hidden or overwritten by generated directory pages. [#94326](https://github.com/openclaw/openclaw/pull/94326) Thanks @vincentkoc, @yetval. - Active Memory now warns when recalled operational details may be outdated and clearly marks clipped summaries, so old or incomplete status is less likely to look current. [#95888](https://github.com/openclaw/openclaw/pull/95888) Thanks @spencer2211. - Memory-wiki pages in subfolders now appear in search, lookup, compiled indexes, digests, and vault counts just like pages at the top level. [#96022](https://github.com/openclaw/openclaw/pull/96022) Thanks @machine3at, @vincentkoc. - Large memory indexes can now return filtered matches beyond sqlite-vec's first 4,096 candidates without failing or silently missing valid results. [#96157](https://github.com/openclaw/openclaw/pull/96157) Thanks @itsuzef, @vincentkoc. - Repeated QMD-backed `memory_search` and `openclaw memory search` requests can return faster after the first lookup, while diagnostics separate setup time from search time and missing collections still trigger repair. [#96655](https://github.com/openclaw/openclaw/pull/96655) Thanks @bek91. - Memory search now works with installed generic embedding plugins such as local llama.cpp, including their default model and connection details. [#97095](https://github.com/openclaw/openclaw/pull/97095) Thanks @849261680. - One memory-wiki page with broken YAML no longer blocks healthy pages from being searched, compiled, linted, counted, or updated. [#97177](https://github.com/openclaw/openclaw/pull/97177) Related [#96125](https://github.com/openclaw/openclaw/issues/96125). Thanks @cow11023, @sunnyshu0925. - Memory Wiki now marks claims with malformed explicit freshness timestamps as unknown instead of masking the bad metadata with the page date. [#97465](https://github.com/openclaw/openclaw/pull/97465) Thanks @ly-wang19. - Detailed `/status plugins` now warns when a configured memory embedding provider is unavailable and semantic recall has fallen back to keyword search. [#97968](https://github.com/openclaw/openclaw/pull/97968) Thanks @masatohoshino. - QMD memory recall now turns malformed or warning-filled mcporter output into a clear, filtered error instead of exposing raw subprocess text. [#98381](https://github.com/openclaw/openclaw/pull/98381) Thanks @miorbnli. - `memory_get` with `corpus=all` can now return an available wiki supplement when the requested memory file is missing instead of stopping with an empty result. [#100904](https://github.com/openclaw/openclaw/pull/100904) Thanks @mushuiyu886, @vincentkoc. - With `memorySearch.provider: none`, OpenClaw now starts FTS-only memory without an unnecessary plugin capability scan. [fbf574a](https://github.com/openclaw/openclaw/commit/fbf574ad9db2658652e442aab4be3d597e1a9c14) - Interactive QMD memory searches with no matches now return an empty result promptly instead of appearing stuck during unnecessary index maintenance. [#90030](https://github.com/openclaw/openclaw/pull/90030) Related [#90023](https://github.com/openclaw/openclaw/issues/90023). Thanks @ruben2000de, @sahibzada-allahyar. - `openclaw doctor --fix` can now carry legacy Memory Core indexes from 2026.6.9 upgrades into the current store without forcing a full re-embed. [#95631](https://github.com/openclaw/openclaw/pull/95631) Thanks @mushuiyu886, @vincentkoc. - `openclaw memory status` now warns when session transcripts still need indexing instead of incorrectly reporting memory as current. [#97857](https://github.com/openclaw/openclaw/pull/97857) Related [#97814](https://github.com/openclaw/openclaw/issues/97814). Thanks @che10x, @zw-xysk. - Memory Core now preserves short standalone concepts such as `kv` and `s3` in tags, improving recall without matching them inside unrelated words. [#96304](https://github.com/openclaw/openclaw/pull/96304) Thanks @ly-wang19. - Memory-wiki bridge status now returns a usable warning instead of crashing on malformed plugin artifacts, and `readMemoryArtifacts: false` now reliably prevents those reads. [#100900](https://github.com/openclaw/openclaw/pull/100900) Thanks @huveewomg. - Wiki search and retrieval now explain when an older or partial memory plugin lacks shared-search support and offer a practical workaround instead of exposing a raw TypeError. [#100902](https://github.com/openclaw/openclaw/pull/100902) Thanks @huveewomg, @vincentkoc, @xuanmingguo. - Memories containing emoji or supplementary CJK characters can now be indexed without malformed text stalling the operation. [#101574](https://github.com/openclaw/openclaw/pull/101574) Thanks @jensenwang560-blip. - When both a primary memory read and its wiki supplement fail, `memory_get corpus=all` now returns the original structured read error instead of crashing the tool call. [#101902](https://github.com/openclaw/openclaw/pull/101902) Thanks @aniruddhaadak80, @vincentkoc, @zw-xysk. - Memory-index debug logs now show whether an embedding batch completed or failed, making indexing problems easier to trace. [#94732](https://github.com/openclaw/openclaw/pull/94732) Thanks @doubleji817-lang, @xydt-tanshanshan. - `openclaw memory status --fix` now repairs session-corpus state without mistaking healthy daily-memory records for stale data. [#93389](https://github.com/openclaw/openclaw/pull/93389) Thanks @alix-007, @vincentkoc. - `openclaw memory status` no longer shows impossible session indexing totals where the indexed file count exceeds the total file count. [#95452](https://github.com/openclaw/openclaw/pull/95452) Thanks @buyitsydney, @liuhao1024. #### Memory Wiki and long-term memory - Durable memory promotion now keeps OpenClaw's managed dreaming markers and adjacent managed content out of `MEMORY.md` when a recalled range touches a block boundary. [#83718](https://github.com/openclaw/openclaw/pull/83718) Thanks @grifjef. - Inferred follow-up commitments now return to the queue after temporary model or network extraction failures, reducing missed reminders without duplicate processing. [#89817](https://github.com/openclaw/openclaw/pull/89817) Thanks @masatohoshino. - Memory-core light dreaming no longer repeats an unchanged work-summary block in `DREAMS.md`, while genuine daily-note updates can still appear later. [#97446](https://github.com/openclaw/openclaw/pull/97446) Thanks @aaajiao, @qingminglong. - Memory Wiki lint now ignores link-looking text inside inline and fenced code while continuing to report genuine broken links in prose. [#98095](https://github.com/openclaw/openclaw/pull/98095) Thanks @durambar, @vincentkoc, @zhangqueping. - Memory-wiki source updates now preserve hand-written Notes when a temporary read failure prevents OpenClaw from safely loading the existing page. [#98360](https://github.com/openclaw/openclaw/pull/98360) Related [#98345](https://github.com/openclaw/openclaw/issues/98345). Thanks @qingminglong, @vincentkoc, @yetval. - Memory-wiki source sync can now recover when a page is missing or collides with a non-file, while preserving existing content when a retry remains unsafe. [#99276](https://github.com/openclaw/openclaw/pull/99276) Thanks @obviyus. - Memory Wiki imports now continue when a source page collides with a protected vault entry instead of stopping the whole import. [76db9a3](https://github.com/openclaw/openclaw/commit/76db9a3376228db6a6f58cd705fc236aa697446c) Thanks @vincentkoc. - Newly promoted long-term memories now omit raw transcript, summary, session-header, flush-prompt, and scoring clutter so useful notes are easier to find. [#94636](https://github.com/openclaw/openclaw/pull/94636) Thanks @josephur, @pinghe-learn, @tayoun. - Dreaming now keeps deleted or reset transcript archives and cron-created child conversations out of its learned session set, reducing duplicate history and automation noise without removing retained archives from historical search. [#96517](https://github.com/openclaw/openclaw/pull/96517) Thanks @adam-researchh, @jalehman, @xialonglee. - Memory Wiki import summaries now shorten ChatGPT text containing emoji without leaving corrupted replacement characters. [#97362](https://github.com/openclaw/openclaw/pull/97362) Thanks @mushuiyu886. - Rerunning memory-wiki synthesis or ChatGPT imports no longer risks erasing handwritten notes, frontmatter, or import state when an existing page cannot be read briefly. [#98787](https://github.com/openclaw/openclaw/pull/98787) Thanks @vincentkoc, @yetval. - Memory dreaming now records structured success or failure outcomes for light, REM, and deep phases so dashboards and health checks can monitor them reliably. [#97723](https://github.com/openclaw/openclaw/pull/97723) Thanks @lg320531124, @momothemage. - `openclaw wiki lint` now ignores wikilink-like patterns inside code examples so real broken Memory Wiki links are easier to spot. [#97954](https://github.com/openclaw/openclaw/pull/97954) Thanks @durambar, @liuhao1024, @vincentkoc. - `openclaw wiki lint` now recognizes valid imported Obsidian links by title, slug, fragment-free path, or source-path suffix, reducing false broken-link warnings. [#100017](https://github.com/openclaw/openclaw/pull/100017) Thanks @ishangodawatta, @k-kerrigan, @vincentkoc. - Archived memories around user messages that begin with `[cron:]` remain searchable after a session reset or deletion, while genuine cron-generated archives stay hidden. [#101322](https://github.com/openclaw/openclaw/pull/101322) Thanks @ly-wang19. #### Session continuity - After `/new` or `/reset`, the previous conversation remains available for daily memory summaries and full-history searches through the session-logs skill. [#71537](https://github.com/openclaw/openclaw/pull/71537) Thanks @injinj. - A group chat or Gateway session can now resume on the next visible request after a failed, timed-out, or killed turn without requiring `/new` or manual session-file edits. [#89045](https://github.com/openclaw/openclaw/pull/89045) Thanks @jerry-xin. - Aborted or timed-out embedded runs now release their session write lock, so the next message can proceed without minutes of waiting or manual file cleanup. [#96100](https://github.com/openclaw/openclaw/pull/96100) Thanks @richwilson-bloom, @sallyom, @xialonglee. - Replies that span an automatic daily or idle reset now remain together in one accessible transcript instead of losing later output. [#97164](https://github.com/openclaw/openclaw/pull/97164) Thanks @joshavant, @yetval. - Resuming work from a project now opens only that project's saved agent session, preventing unrelated transcripts from being mixed together. [#97785](https://github.com/openclaw/openclaw/pull/97785) Related [#96542](https://github.com/openclaw/openclaw/issues/96542). Thanks @qingminglong, @yetval. - Recurring provider-CLI cron jobs and local `openclaw agent` runs now keep their existing provider conversation across the daily reset boundary instead of silently losing context. [#98356](https://github.com/openclaw/openclaw/pull/98356) Thanks @yetval. - Discord, WebChat, and other ongoing conversations can keep receiving replies when background activity touches the same session during reply startup, without a false initialization conflict or dropped message. [#98835](https://github.com/openclaw/openclaw/pull/98835) Related [#98672](https://github.com/openclaw/openclaw/issues/98672). Thanks @aaronfaby, @jalehman, @moguangyu5-design. - Resetting a multi-agent room now restores message delivery promptly instead of blocking most agents' acknowledgement and queued replies for several minutes. [#99091](https://github.com/openclaw/openclaw/pull/99091) Thanks @gorkem2020, @zengwen-dt. - Rapid follow-ups in the same chat no longer freeze both messages while the first automatic reply is finishing. [#99549](https://github.com/openclaw/openclaw/pull/99549) Thanks @shagrat2. - Claude CLI-backed interactive replies now keep their saved session more consistently, preserving continuity and reducing repeated full-history replay. [#99595](https://github.com/openclaw/openclaw/pull/99595) Related [#99372](https://github.com/openclaw/openclaw/issues/99372). Thanks @obviyus. - CLI-backed agents in multi-person group chats now retain conversational context when participants alternate, without expanding non-owner tool permissions. [#99640](https://github.com/openclaw/openclaw/pull/99640) Related [#99633](https://github.com/openclaw/openclaw/issues/99633). Thanks @obviyus. - CLI-backed group agents now keep one warm conversation across mentioned and unmentioned follow-ups instead of resetting and losing context. [#99722](https://github.com/openclaw/openclaw/pull/99722) Related [#99696](https://github.com/openclaw/openclaw/issues/99696). Thanks @obviyus. - CLI-backed agents now keep conversation continuity across prompt-only changes, avoiding needless cold starts while still resetting when security or runtime conditions require it. [#99822](https://github.com/openclaw/openclaw/pull/99822) Related [#99729](https://github.com/openclaw/openclaw/issues/99729). Thanks @obviyus. - Temporary memory-maintenance failures no longer replace the agent reply, and persistently oversized sessions can recover in a fresh session while preserving the previous transcript. [#100618](https://github.com/openclaw/openclaw/pull/100618) Thanks @jerry-xin, @rhclaw. - A first command-only interaction in an auto-reply flow now keeps its session update even when no session row existed beforehand. [76d686c](https://github.com/openclaw/openclaw/commit/76d686cf61f29b4b26ef67066d0b88f405ddfe5c) - Sessions renamed with `/name` now keep that custom name in session lists instead of reverting to an automatic title or UUID-like label. [#98841](https://github.com/openclaw/openclaw/pull/98841) Related [#98742](https://github.com/openclaw/openclaw/issues/98742). Thanks @bsg2000, @sunnyshu0925. - A successfully completed main-agent conversation now continues in the same session on the next message instead of unexpectedly resetting and archiving its transcript. [#99985](https://github.com/openclaw/openclaw/pull/99985) Thanks @sunnyshu0925. - Dashboard session labels and display names now remain attached when a session rolls over after a day or idle period. [#101576](https://github.com/openclaw/openclaw/pull/101576) Thanks @merlin-zhou, @zengwen-dt. #### CLI and Codex sessions - Claude CLI conversations that exhaust their context now recover into a fresh reseeded session automatically, and timeout retries retain the temporary files they need to complete. [#98934](https://github.com/openclaw/openclaw/pull/98934) Related [#98897](https://github.com/openclaw/openclaw/issues/98897). Thanks @obviyus. - Local Ollama-backed CLI agent turns can now continue when the context engine reports an already-compacted transcript, allowing the assistant or MCP tool result to reach the user. [#99136](https://github.com/openclaw/openclaw/pull/99136) Thanks @mushuiyu886, @peterskwang, @pkoserowski, @psedd. - Existing Codex sessions can resume their bound threads more reliably after upgrades, resets, and compaction without depending on leftover transcript-side JSON files. [#101210](https://github.com/openclaw/openclaw/pull/101210) - A Codex reply delivered through `sourceReplyDeliveryMode: "message_tool_only"` now completes its turn promptly instead of later ending as an incomplete reply. [#95942](https://github.com/openclaw/openclaw/pull/95942) Thanks @omarshahine. - Codex app-server installations using the retired `on-failure` approval policy now upgrade to the supported `on-request` behavior without losing saved bindings. [70153f7](https://github.com/openclaw/openclaw/commit/70153f7f9c12be2ff025802c019e428047d1f579) Thanks @vincentkoc. - Existing Codex app-server conversations with dynamic tools can resume through the tool-fingerprint format upgrade instead of starting an avoidable replacement thread. [3051748](https://github.com/openclaw/openclaw/commit/305174845f38f075bfd5096a0a4912b8d7d2559a) Thanks @vincentkoc. - Legacy Codex bindings with large tool or MCP configurations can now migrate without overflowing plugin-state records or copying raw configuration secrets. [23228b6](https://github.com/openclaw/openclaw/commit/23228b67a47bf32fc9b662d13037757f51d329b8) Thanks @vincentkoc. - Upgraded Codex installations can now finish legacy binding migration and archive old sidecars instead of repeatedly retaining them after an earlier partial import. [39fac06](https://github.com/openclaw/openclaw/commit/39fac06f48745dcd4d7a840f8261631614bb1926) Thanks @vincentkoc. - Codex sessions created in beta 5 can keep their existing conversation after upgrade when the user MCP configuration is unchanged, without retaining its authorization token. [272750d](https://github.com/openclaw/openclaw/commit/272750daed354029c1968dce7cd6747163e0957a) Thanks @vincentkoc. - Provider-owned CLI conversations now keep the same session and transcript across the daily default reset boundary unless an explicit reset policy or `/reset` applies. [#97931](https://github.com/openclaw/openclaw/pull/97931) Thanks @yetval. - New Codex-backed threads now preserve configured plugin apps, can activate remote curated plugins, and run Guardian on the first eligible native OpenAI turn. [#98042](https://github.com/openclaw/openclaw/pull/98042) Thanks @kevinslin. - A stuck Claude CLI startup now fails only the affected turn instead of exiting the Gateway, and heartbeat activity no longer causes the next user turn to lose its CLI conversation history. [#98933](https://github.com/openclaw/openclaw/pull/98933) Related [#98894](https://github.com/openclaw/openclaw/issues/98894), [#98895](https://github.com/openclaw/openclaw/issues/98895). Thanks @obviyus. - Claude CLI agent runs now fail clearly when messaging tools are unavailable, recover when Claude exits without a result, retain more long-session continuity, and clean up prompt images and failed preparation files. [#99159](https://github.com/openclaw/openclaw/pull/99159) Related [#98946](https://github.com/openclaw/openclaw/issues/98946). Thanks @obviyus. - The same-release Codex session-continuity work now covers app-server thread start and resume, with binding fingerprints kept bounded throughout. [78edf1c](https://github.com/openclaw/openclaw/commit/78edf1cec15c4a45881386b94e06c71c64f90fa4) Thanks @vincentkoc. #### Transcripts and exports - Shared group and channel transcripts now retain the sender ID, display name, and username for each durable user turn, making later history and memory processing correctly attribute participants. [#90552](https://github.com/openclaw/openclaw/pull/90552) Thanks @pick-cat. - `/export-session` now warns when a CLI- or ACP-backed export contains only user messages and points users to the backend transcript for missing assistant, tool, usage, and cost details. [#90867](https://github.com/openclaw/openclaw/pull/90867) Thanks @tank-x3, @vincentkoc, @xydigit-sj. - `openclaw export-trajectory` and `/export-trajectory` now include redacted messages from older version 1 sessions instead of producing a successful but empty transcript. [#93814](https://github.com/openclaw/openclaw/pull/93814) Thanks @yetval. - Session-memory files created around `/new` and `/reset` now keep one copy of each assistant reply instead of duplicating reasoning-model responses. [#94401](https://github.com/openclaw/openclaw/pull/94401) Thanks @sallyom, @sunnyshu0925. - Compacted agent history now lists genuine tool failures instead of repeatedly mislabeling successful subagent launches, including when older transcript records contain the incorrect error flag. [#96842](https://github.com/openclaw/openclaw/pull/96842) Thanks @nxmxbbd. - Invalid transcript entries now raise a visible write error instead of becoming `undefined` JSONL lines that silently vanish after reload. [#97356](https://github.com/openclaw/openclaw/pull/97356) Thanks @miorbnli. - `openclaw sessions cleanup --fix-missing` now preserves fresh cron sessions with valid transcripts and clearly reports repaired entries. [#97495](https://github.com/openclaw/openclaw/pull/97495) Thanks @qingminglong. - Automatic recovery from provider role-ordering conflicts now archives the complete prior transcript as a timestamped JSONL file before replaying a shorter tail. [#97544](https://github.com/openclaw/openclaw/pull/97544) Thanks @yungchentang. - Compacted group conversations now retain identical long messages from different participants while still removing accidental duplicate retries from the same sender. [#98336](https://github.com/openclaw/openclaw/pull/98336) Thanks @sunnyshu0925, @yetval. - Transcript summary and import reads now close files reliably after malformed data, preventing long-running processes from gradually exhausting file handles. [#98493](https://github.com/openclaw/openclaw/pull/98493) Related [#98467](https://github.com/openclaw/openclaw/issues/98467). Thanks @wangmiao0668000666, @zhanglei99586. - Older or imported sessions with plain-string assistant messages now replay correctly across provider and streaming paths instead of sending malformed conversation history. [#98908](https://github.com/openclaw/openclaw/pull/98908) Thanks @obviyus. - Claude CLI chat history reloads no longer display OpenClaw's internal reseed wrapper as if it were a message the user typed. [#99653](https://github.com/openclaw/openclaw/pull/99653) Related [#99646](https://github.com/openclaw/openclaw/issues/99646). Thanks @harjothkhara, @jeehut, @vincentkoc, @zoowh. - Transcript-backed history now treats a missing file as empty while reporting real access, directory, or stream failures cleanly instead of leaving partial or unhandled results. [#100524](https://github.com/openclaw/openclaw/pull/100524) Thanks @cxbasdev, @zhanglei99586. - Transient transcript read failures no longer destabilize session-log diagnostics or let an incomplete usage scan overwrite the last complete cost cache as though it were current. [#101062](https://github.com/openclaw/openclaw/pull/101062) Thanks @cxbasdev, @vincentkoc. - Malformed transcript rows now produce an aggregate warning with skipped and loaded counts while the remaining usable session history continues to load. [#98669](https://github.com/openclaw/openclaw/pull/98669) Thanks @cxbasdev. - Transcript tools can now identify channel delivery mirrors as OpenClaw bookkeeping rather than mistaking them for OpenAI Responses output. [#99855](https://github.com/openclaw/openclaw/pull/99855) Thanks @vincentkoc. - Debug-proxy ACP runs now shut down cleanly, mark capture sessions finished, and close their capture databases without reporting a spurious database error. [#100827](https://github.com/openclaw/openclaw/pull/100827) Thanks @amknight. - `openclaw sessions tail` now rejects oversized trajectory snapshots and updates with a clear limit error before they can exhaust memory. [#101450](https://github.com/openclaw/openclaw/pull/101450) Thanks @cxbasdev, @vincentkoc. - Long usage and session log messages now truncate emoji cleanly instead of displaying malformed character artifacts. [#101517](https://github.com/openclaw/openclaw/pull/101517) Thanks @maweibin. #### Tool results, files, and media - Reopened sessions can now replay older string or single-object tool results correctly instead of treating successful output as empty or failing on its stored shape. [#98891](https://github.com/openclaw/openclaw/pull/98891) Related [#98825](https://github.com/openclaw/openclaw/issues/98825). Thanks @obviyus. - Agents in long-running WebChat, Discord, and other direct sessions can keep reading fresh command, file, browser, and status output instead of seeing it disappear or turn into an image placeholder. [#98955](https://github.com/openclaw/openclaw/pull/98955) Related [#98874](https://github.com/openclaw/openclaw/issues/98874). Thanks @lamkan0210, @momothemage. - Imported Claude CLI history now keeps image-only and attachment-bearing turns visible when removing empty legacy reseed text. [#99839](https://github.com/openclaw/openclaw/pull/99839) Thanks @vincentkoc. - Claude CLI model fallback now carries the prior tool-call trail alongside tool results, giving the replacement model enough context to continue coherently. [#99851](https://github.com/openclaw/openclaw/pull/99851) Thanks @vincentkoc. - Long-running agents can now recover full command output and truncated `web_fetch` content after history cleanup, reducing repeated expensive work and lost page context. [#100135](https://github.com/openclaw/openclaw/pull/100135) Thanks @obviyus. - Embedded agents now receive well-formed summaries of long media or JSON values instead of broken characters at Unicode truncation boundaries. [#101311](https://github.com/openclaw/openclaw/pull/101311) Thanks @alix-007. - Media-provider audit details containing emoji now remain valid and readable when shortened, instead of ending with malformed characters. [#101298](https://github.com/openclaw/openclaw/pull/101298) Thanks @alix-007. - Long agent prompt data containing emoji or other paired Unicode characters now stays well-formed when capped, avoiding broken text in agent and automation context. [#101303](https://github.com/openclaw/openclaw/pull/101303) Thanks @alix-007. #### Long conversations and compaction - Embedded agents now retain configured compaction reserve limits when runtime safeguards save settings, reducing unexpected context-budget shrinkage during long work. [#92237](https://github.com/openclaw/openclaw/pull/92237) Thanks @sercada. - Telling an agent to remember a preference no longer triggers the unrelated warning used for promises to schedule an automatic reminder. [#93862](https://github.com/openclaw/openclaw/pull/93862) Thanks @arkyu2077. - Sessions with large command output or summaries now compact before exceeding the model context, avoiding failed provider requests and misleading token budgets. [#97861](https://github.com/openclaw/openclaw/pull/97861) Thanks @yetval. - Long tool-heavy or compacted sessions now budget the real size of command output and summaries before sending a prompt, reducing context overflow failures. [#97928](https://github.com/openclaw/openclaw/pull/97928) Related [#97927](https://github.com/openclaw/openclaw/issues/97927). Thanks @liuhao1024, @yetval. - Edge-case fixes now preserve literal memory text and valid Unicode, improve voice-call cleanup and port checks, report Claude models and context limits accurately, and retain useful ClickClack connection errors. [#100204](https://github.com/openclaw/openclaw/pull/100204) Thanks @cxbasdev, @harjothkhara, @lilan0125, @lin-hongkuan, @liuhao1024, @mikasa0818, @pandah97, @sunlit-deng, @zoowh. - Fresh Claude CLI workspaces now run a pending `BOOTSTRAP.md` on the first reply so required identity, memory, and setup steps are completed before normal conversation. [#100560](https://github.com/openclaw/openclaw/pull/100560) Thanks @bill-starfoundry, @kruegerb, @vincentkoc. - Long-running agents are less likely to lose workspace instructions such as `AGENTS.md`, `SOUL.md`, or `MEMORY.md` for a turn during a temporary filesystem error. [#100910](https://github.com/openclaw/openclaw/pull/100910) Thanks @masatohoshino. - Embedded agent runs that omit a session key now retain the intended fallback session context more reliably. [31a65e0](https://github.com/openclaw/openclaw/commit/31a65e0647ae85eb4c9048051145f07003722caf) Thanks @vincentkoc. - A malformed custom tool in realtime Talk no longer removes the built-in consult tool or other valid custom tools from the session. [170150a](https://github.com/openclaw/openclaw/commit/170150a306e39204ebe1ab7be47450b73005de1f) Thanks @vincentkoc. - Local-model conversations now retain reusable prompt work when switching between interactive chats and background jobs, avoiding repeated multi-minute warm-up delays. [#98267](https://github.com/openclaw/openclaw/pull/98267) Related [#98261](https://github.com/openclaw/openclaw/issues/98261). Thanks @headbouyjb. - A response interrupted mid-tool-call no longer runs or saves that incomplete action, preventing accidental child sessions and other unintended side effects. [#97140](https://github.com/openclaw/openclaw/pull/97140) Thanks @galiniliev. - Agents running on macOS 26 now receive the macOS product version in their runtime prompt instead of the Darwin kernel version. [#95225](https://github.com/openclaw/openclaw/pull/95225) Thanks @sunlit-deng. - Level directives such as `/verbose` and `/think` no longer remove the first word of the user's message when both are sent together. [#97929](https://github.com/openclaw/openclaw/pull/97929) Thanks @yetval. - Malformed surrogate HTML entities in provider output no longer corrupt agent tool arguments, transcripts, or URLs, while legitimate entities and emoji still decode normally. [#99564](https://github.com/openclaw/openclaw/pull/99564) Thanks @mikasa0818. - Leaving one answer blank in a multi-question prompt no longer shifts the remaining typed answers onto the wrong questions. [#100832](https://github.com/openclaw/openclaw/pull/100832) Thanks @machine3at. - ACP runtime controls can now truly clear saved model, thinking, working-directory, permission, timeout, mode, and backend-extra settings so later turns do not reuse stale values. [#101044](https://github.com/openclaw/openclaw/pull/101044) Thanks @mushuiyu886. - Skill Workshop sessions now carry a clearer prompt with about 1.8KB less repeated prompt and schema overhead while retaining the same reviewable proposal flow. [#100481](https://github.com/openclaw/openclaw/pull/100481) - Prompt caching and cache traces now fingerprint malformed incoming text consistently with the cleaned text providers receive, avoiding needless cache misses and misleading diagnostics. [#101009](https://github.com/openclaw/openclaw/pull/101009) Thanks @qingminglong. - Operators now receive `payload.large` or `truncated` diagnostics and an accurate count whenever `chat.history` omits older messages, making hidden history trimming visible without changing client responses. [#96788](https://github.com/openclaw/openclaw/pull/96788) Thanks @zengwen-dt. - With memory flush enabled, important conversation context now gets a chance to reach durable memory before automatic compaction, reducing silent gaps in saved notes. [#84792](https://github.com/openclaw/openclaw/pull/84792) Thanks @turbotheturtle. - Long CJK-heavy sessions using a context engine such as lossless-claw no longer stop on a false `prompt too large` precheck after the engine has already managed the prompt. [#95342](https://github.com/openclaw/openclaw/pull/95342) Thanks @jalehman, @mpz4life. - Large Chinese, Japanese, and Korean tool results are now estimated more accurately, reducing false context-overflow interruptions and premature compaction. [#95447](https://github.com/openclaw/openclaw/pull/95447) Thanks @moguangyu5-design, @vincentkoc. - Prompts containing fullwidth East Asian characters now receive more accurate size estimates, allowing context management to start before an oversized request reaches the model. [#96442](https://github.com/openclaw/openclaw/pull/96442) Thanks @lin-hongkuan. - Long conversations now recover compaction after transient provider disconnects instead of replacing useful history with a degraded placeholder summary. [#97504](https://github.com/openclaw/openclaw/pull/97504) Thanks @hugenshen. - Long conversations using `historyLimit` or `dmHistoryLimit` now retain their saved earlier summary after compaction, helping the assistant remember prior context. [#97591](https://github.com/openclaw/openclaw/pull/97591) Thanks @liuhao1024, @yetval. - Long Codex conversations with heavy tool use can now compact at a real history boundary and continue with relevant tool results summarized instead of retaining the full transcript. [#99391](https://github.com/openclaw/openclaw/pull/99391) Related [#99375](https://github.com/openclaw/openclaw/issues/99375). Thanks @imchloe92, @lzy3538. - Local-model sessions now retain auto-compaction bookkeeping, reducing repeated context refills and the unresponsive behavior they could cause. [#99678](https://github.com/openclaw/openclaw/pull/99678) Related [#99677](https://github.com/openclaw/openclaw/issues/99677). Thanks @headbouyjb, @vincentkoc. - Long, tool-heavy agent sessions now preserve the newest command, file, or browser result for the model while shortening older history first. [#99756](https://github.com/openclaw/openclaw/pull/99756) Thanks @acosx. - Long cached Anthropic tool sessions now compact near the configured context threshold instead of interrupting work early because cumulative cache tokens looked like live context. [#99864](https://github.com/openclaw/openclaw/pull/99864) Thanks @jrex-jooni, @lzy3538, @vincentkoc. - Long-lived agents with large context windows now retain fresh tool output, compact under aggregate pressure, and warn users to run `/compact` or `/new` if pressure persists. [#100077](https://github.com/openclaw/openclaw/pull/100077) Thanks @obviyus. - Small-context local models can now begin and continue conversations without immediately entering an overflow-compaction loop before useful prompt space is available. [#100621](https://github.com/openclaw/openclaw/pull/100621) Thanks @vincentkoc. - Long sessions that compact in stages now preserve clearer older-to-newer ordering when summaries are combined, reducing the chance that stale context appears equally recent. [#100684](https://github.com/openclaw/openclaw/pull/100684) Thanks @vincentkoc, @zw-xysk. - Context-engine plugins can now identify the exact session that continues after compaction while older integrations using `sessionFile` remain compatible. [#101182](https://github.com/openclaw/openclaw/pull/101182) Thanks @jalehman. - Preparing a reset for a long-running session now avoids scanning the entire transcript, reducing startup file activity and memory use as history grows. [#99335](https://github.com/openclaw/openclaw/pull/99335) Thanks @gmschasiepen, @momothemage. #### Session storage and cleanup - Gateway and embedded TUI startup now reclaim old session temporary files left by hard shutdowns, reducing hidden disk growth while preserving fresh or potentially recoverable state. [#90503](https://github.com/openclaw/openclaw/pull/90503) Thanks @sahibzada-allahyar. - Long-running gateways can clear stale one-shot model-check sessions before they crowd out real conversation history, with dedicated CLI reporting for review. [#91057](https://github.com/openclaw/openclaw/pull/91057) Thanks @jalehman, @wangwllu. - Mac users now get stronger protection for local OpenClaw SQLite data after abrupt power loss or an operating-system crash, with no configuration change. [#99067](https://github.com/openclaw/openclaw/pull/99067) Thanks @ooiuuii. - Session-memory diagnostics now show the correct workspace and memory-file paths for sibling directories whose names merely resemble the user's home path. [#101577](https://github.com/openclaw/openclaw/pull/101577) Thanks @cxbasdev. ### Gateway and Agent Reliability The [Gateway](https://docs.openclaw.ai/gateway) now starts, connects, reloads, and reports health with clearer behavior across configuration, networking, task routing, and result delivery. Agents are less likely to lose their selected workspace or conversation, background work reaches the right destination more consistently, and tool failures can stay out of chat progress when a useful final reply is still available. The [Gateway protocol](https://docs.openclaw.ai/gateway/protocol) and [restart recovery](https://docs.openclaw.ai/gateway/restart-recovery) paths also reject invalid state more clearly and keep inspection available during common lifecycle failures. Skill loading and prompt overhead are steadier as well, with [skill controls](https://docs.openclaw.ai/cli/skills) avoiding unnecessary work and preserving cache fingerprints for the text providers actually receive. #### Run completion and replies - Timed-out cron jobs, expired agent requests, and disconnected HTTP clients now stop promptly instead of spending more time and provider calls on model fallback. [#62682](https://github.com/openclaw/openclaw/pull/62682) Thanks @altaywtf, @cinapbot, @simonusa. - Channel replies can now continue as soon as an embedded-agent turn finishes instead of waiting roughly 50 seconds for post-run authentication bookkeeping. [#85829](https://github.com/openclaw/openclaw/pull/85829) Thanks @turbotheturtle. - Anthropic sessions stuck on a thinking-signature replay error can now retry once without invalid thinking blocks and continue without `/new` or transcript repair. [#95430](https://github.com/openclaw/openclaw/pull/95430) Related [#95429](https://github.com/openclaw/openclaw/issues/95429). Thanks @alexelgier, @lzyyzznl, @vincentkoc. - Codex-backed runs can now deliver a completed final answer instead of timing out or appearing aborted when the final completion event is missing. [#99217](https://github.com/openclaw/openclaw/pull/99217) Thanks @100yenadmin, @fuller-stack-dev, @sedrak-hovhannisyan. - Interactive chat requests that end in a terminal failure now receive one visible error response instead of appearing to be ignored. [#99304](https://github.com/openclaw/openclaw/pull/99304) Thanks @grox2012, @moeedahmed. - Agent sessions are less likely to lose output, alter unrelated formatting, stall after temporary provider errors, reject BMP images, or drop longer ChatGPT connections. [#99949](https://github.com/openclaw/openclaw/pull/99949) - Long Claude CLI-backed runs now show honest `Thinking... (~N tokens)` activity for direct and queued work instead of appearing stalled when readable reasoning text is unavailable. [#100148](https://github.com/openclaw/openclaw/pull/100148) Thanks @obviyus. - Interactive turns that truly end without visible output now send a clear failure reply, while intentional silence and already-completed actions remain quiet. [#100474](https://github.com/openclaw/openclaw/pull/100474) - Completed answers from tool-using tasks now reach the user instead of being replaced by an incomplete-turn error, with run metadata attached to the same final response. [#100655](https://github.com/openclaw/openclaw/pull/100655) Thanks @liuwqgit. - Using `/stop` during a late-aborting prompt no longer leaves a stale session lock that blocks the next turn in the same conversation. [f8016c4](https://github.com/openclaw/openclaw/commit/f8016c44a4ba44ba2865938bcb4f7248a91d76fe) - Long agent runs can now resume from a valid conversation boundary after compaction recovery instead of wedging or incorrectly demoting the selected model. [486033b](https://github.com/openclaw/openclaw/commit/486033b18344d134d089e654ab0dbb278ce69008) Thanks @mettlyz11, @neltomw, @obviyus. - Embedded agent jobs with an explicitly longer timeout now keep their lane until that requested deadline instead of being recovered at the default limit. [1437512](https://github.com/openclaw/openclaw/commit/143751282c60a34a6e2ad6c5629f421441929993) Thanks @vincentkoc. - Mobile, WebChat, consult, and other `chat.send` clients can apply a one-time thinking level without losing the assistant reply or having the message mistaken for a text command. [#98855](https://github.com/openclaw/openclaw/pull/98855) Thanks @jesse-merhi. - A wedged provider call now releases its embedded agent lane on a bounded watchdog instead of indefinitely blocking queued work when run timeouts are disabled. [ec28935](https://github.com/openclaw/openclaw/commit/ec289357a450f50491723a86a8a771f5d512541c) Thanks @arismontclair, @obviyus, @patelmm79. - Gateway conversations with an orphaned active task can now recover through diagnostics instead of leaving later turns blocked until restart. [b1da734](https://github.com/openclaw/openclaw/commit/b1da734a1e7d5b608d6fccc4b2c0b3f2c9dc9347) Thanks @arismontclair, @obviyus, @ralf003. - An agent no longer stays silent after compaction when a plugin's final-answer hook hangs; OpenClaw times out the hook and still delivers the response. [b2baf79](https://github.com/openclaw/openclaw/commit/b2baf799b41edce512b1945b6dec3ad637b9c814) Thanks @dserious, @obviyus, @villa-feng. - Very long agent conversations are less likely to loop through failed overflow recovery because compaction now reflects the prompt OpenClaw actually prepared. [#101181](https://github.com/openclaw/openclaw/pull/101181) Thanks @jalehman. - With `messages.suppressToolErrors` enabled, tool failures no longer leak into chat as progress updates while normal progress and final replies continue. [#98063](https://github.com/openclaw/openclaw/pull/98063) Thanks @amittell, @moeedahmed. - Interactive and queued turns that finish without a visible answer now return a clear, sanitized failure message instead of leaving the chat looking stuck. [#100456](https://github.com/openclaw/openclaw/pull/100456) Thanks @mushuiyu886. #### Delegated agents and shared work - Legacy subagent sessions now follow their actual nesting level, so nested-agent limits and controls no longer fall back to top-level behavior. [#54593](https://github.com/openclaw/openclaw/pull/54593) Thanks @ruanrrn. - Subagent completion notices now arrive once instead of being repeated when the requesting session changes during delivery. [#92274](https://github.com/openclaw/openclaw/pull/92274) Related [#91527](https://github.com/openclaw/openclaw/issues/91527). Thanks @fsdwen, @obviyus, @zackchiutw. - Successful embedded-agent subagent launches now remain successful in transcripts and later compaction summaries instead of being recorded as tool failures, while real launch failures stay visible. [#96851](https://github.com/openclaw/openclaw/pull/96851) Thanks @neomail2, @parveshsaini. - Codex-runtime transcripts and compaction summaries now keep successful subagent launches and goal operations out of failure records, while genuine failures remain visible and accepted-launch hooks can run. [#96856](https://github.com/openclaw/openclaw/pull/96856) Thanks @nxmxbbd. - Successfully started subagents now remain visible in `/subagents list` and `subagents(action="list")`, including when different sessions own control and completion. [#99410](https://github.com/openclaw/openclaw/pull/99410) Related [#75593](https://github.com/openclaw/openclaw/issues/75593). Thanks @aaajiao, @sheyanmin. - Codex app-server agents can again list allowed agents, spawn OpenClaw or ACP subagents, and yield during delegated work without resumed heartbeats hitting incompatible tool definitions. [#99561](https://github.com/openclaw/openclaw/pull/99561) Related [#99464](https://github.com/openclaw/openclaw/issues/99464). Thanks @100yenadmin, @joshavant. - Requester agents now receive a follow-up when an accepted `sessions_send` delivery later fails because the target session is locked, so they can retry or choose another route. [#99907](https://github.com/openclaw/openclaw/pull/99907) Thanks @849261680, @alex-heyuqing. - Sub-agents and other HTTP loopback MCP clients can again receive browser screenshots and valid image or embedded-resource results without schema failures. [#100336](https://github.com/openclaw/openclaw/pull/100336) Thanks @tzy-17. - A yielded Codex native subagent's completion now reaches its parent run before the shared app-server connection is cleaned up. [2f89de8](https://github.com/openclaw/openclaw/commit/2f89de81655accf71f5fac5cdabcdf0c3488eab7) Thanks @vincentkoc. - Large agent and subagent workloads now place less memory pressure on the Gateway because completed run snapshots are bounded while results still remain available to active waiters. [#77973](https://github.com/openclaw/openclaw/pull/77973) Related [#77976](https://github.com/openclaw/openclaw/issues/77976). Thanks @fede-kamel, @vincentkoc. - Parent sessions waiting on a subagent now receive the subagent's actual hard-timeout phase and timestamps instead of a generic timeout. [#89367](https://github.com/openclaw/openclaw/pull/89367) Thanks @pick-cat. - Malformed cyclic attachments can no longer crash subagent delivery-evidence collection, so the reply handoff completes and still returns reachable media URLs. [#97041](https://github.com/openclaw/openclaw/pull/97041) Thanks @pick-cat. - A parent session waiting on several subagents now resumes and returns their combined results when the last outstanding work finishes, without requiring the user to send another message. [#97090](https://github.com/openclaw/openclaw/pull/97090) Thanks @galiniliev. - Manually spawned ACP child runs now appear once in the task ledger instead of creating duplicate requester-visible rows. [#97131](https://github.com/openclaw/openclaw/pull/97131) Thanks @moeedahmed. - Cancelling an ACP task from the CLI now reaches the live Gateway-owned run, reports real failures, and avoids duplicate active task rows. [#97352](https://github.com/openclaw/openclaw/pull/97352) Thanks @aliahnaf2013-max. - Stopping a subagent now clears its running task reliably and prevents late completion races from reviving or overwriting the canceled state. [#99806](https://github.com/openclaw/openclaw/pull/99806) Thanks @masatohoshino, @timofa. - After a Gateway restart, a redirected subagent now continues the user's newest instruction instead of returning to stale work. [7b5d86e](https://github.com/openclaw/openclaw/commit/7b5d86e89a5f74bd4c9bac1453d045e4c415a367) Thanks @amittell. - ACP run-to-session lookups now return the current active run instead of a stale association from an older run. [#96427](https://github.com/openclaw/openclaw/pull/96427) Thanks @lin-hongkuan. - Parent sessions no longer repeat an earlier child-agent progress message when the child later reports completion. [#101042](https://github.com/openclaw/openclaw/pull/101042) Thanks @mushuiyu886. #### Files, images, and result delivery - Isolated cron jobs can announce a cross-session result without feeding the recipient's reply back into the cron run and creating duplicate message loops. [#92283](https://github.com/openclaw/openclaw/pull/92283) Related [#92257](https://github.com/openclaw/openclaw/issues/92257). Thanks @harjothkhara, @nailujac, @vincentkoc. - Agents can now read structured JSON and resource tool results during provider replay instead of receiving an empty result or generic media placeholder. [#97742](https://github.com/openclaw/openclaw/pull/97742) Thanks @obviyus. - Images attached to a CLI-backed prompt now survive embedded-model fallback, preserving the visual context needed to answer. [#99891](https://github.com/openclaw/openclaw/pull/99891) Thanks @vincentkoc. - Messages mixing inline and offloaded images now preserve every attachment position so model instructions that depend on sequence remain accurate. [#99902](https://github.com/openclaw/openclaw/pull/99902) Thanks @vincentkoc. - Images from the current prompt now reach CLI fallback attempts in the right order, without pulling stale image references from earlier retries or history. [#100035](https://github.com/openclaw/openclaw/pull/100035) Thanks @vincentkoc. - Batched media replies can now finish successfully after delivery without a misleading session-change failure, while active conversation ownership checks remain enforced. [#100490](https://github.com/openclaw/openclaw/pull/100490) Thanks @scotthuang. - Sandboxed auto-replies now wait for remote media copied over SCP to finish and report transfer failures without crashing or cleaning up too early. [#100861](https://github.com/openclaw/openclaw/pull/100861) Thanks @cxbasdev. - Useful JSON, resource data, and CLI tool results now remain visible in transcripts instead of disappearing behind an attachment placeholder. [#97268](https://github.com/openclaw/openclaw/pull/97268) - An empty non-image tool result no longer becomes `(see attached image)` in OpenAI-compatible agent context, avoiding misleading follow-up behavior. [#97423](https://github.com/openclaw/openclaw/pull/97423) Thanks @scribe-dandelion-cult. - Gateway event-delivery failures now produce actionable warnings instead of unexplained process-level promise rejections, while unrelated subscriptions keep running. [#100401](https://github.com/openclaw/openclaw/pull/100401) Thanks @cxbasdev. - Discord now presents commentary, reasoning, and tool activity in a clearer sequence across queued turns, while loopback MCP clients can attach to one Gateway session with an expiring, revocable token. [35af831](https://github.com/openclaw/openclaw/commit/35af831fd0bc549d9333a197a90abbecbc55ff35) Thanks @dwc1997, @lsr911, @ooiuuii, @romneyda, @solodmd, @vincentkoc, @wendy-chsy, @yeager, @zenglingbiao. - Successful agent tools that return safe plain text now show that output instead of leaving users with an apparently empty result. [#99526](https://github.com/openclaw/openclaw/pull/99526) Related [#99523](https://github.com/openclaw/openclaw/issues/99523). Thanks @snowzlm. #### Gateway restarts and queued work - A successfully delivered heartbeat notification no longer leaves stale recovery state that can block later heartbeat alerts or check-ins. [#83187](https://github.com/openclaw/openclaw/pull/83187) Thanks @agocs. - Restarting the Gateway during a deferred channel reload no longer starts the same channel twice, avoiding webhook port conflicts and repeated restart failures. [#94964](https://github.com/openclaw/openclaw/pull/94964) Related [#79487](https://github.com/openclaw/openclaw/issues/79487). Thanks @lzyyzznl, @tseller. - A damaged SQLite delivery-queue entry no longer blocks recovery of every other valid queued session or outbound delivery after restart. [#98354](https://github.com/openclaw/openclaw/pull/98354) Thanks @pick-cat. - Gateway startup lock failures now clean up partial files and open handles, allowing a later startup to acquire the lock normally. [#99291](https://github.com/openclaw/openclaw/pull/99291) Related [#98958](https://github.com/openclaw/openclaw/issues/98958). Thanks @chenyangjun-xy, @zhanglei99586. - Gateway status now reports unavailable SSH cleanly and promptly instead of crashing or waiting indefinitely when tunnel startup fails. [#99800](https://github.com/openclaw/openclaw/pull/99800) Thanks @cxbasdev, @vincentkoc. - Heartbeat and cron work on macOS and Linux is less likely to fail with `Unknown system error -11` when reconnects overlap session or workspace updates. [#100389](https://github.com/openclaw/openclaw/pull/100389) Thanks @ogarciarevett. - Gateway startup no longer performs unsolicited provider-auth discovery across every configured agent, helping channels and local commands remain responsive while authentication loads on demand. [#100667](https://github.com/openclaw/openclaw/pull/100667) Thanks @vincentkoc. - Unexpected SSH tunnel diagnostic-stream closure no longer crashes the Gateway during tunnel checks or shutdown. [#100855](https://github.com/openclaw/openclaw/pull/100855) Thanks @cxbasdev, @vincentkoc. - A disconnected or failing session-history stream no longer crashes the Gateway and interrupts service for everyone else. [#101571](https://github.com/openclaw/openclaw/pull/101571) Thanks @vincentkoc, @zengwen-dt. - Gateway startup can now be retried immediately after a configuration-change rejection instead of being blocked for up to five minutes by a stale migration lease. [#103157](https://github.com/openclaw/openclaw/pull/103157) - Gateway startup channel warnings now use the same plugin manifests as the running startup process, reducing inconsistent warnings and repeated discovery. [10ca94e](https://github.com/openclaw/openclaw/commit/10ca94ef1a6a98a0033574ba537492453b6b3c4f) Thanks @vincentkoc. - Gateway startup now skips unnecessary provider thinking-policy work when an explicit setting or model catalog already determines the banner result. [b18af41](https://github.com/openclaw/openclaw/commit/b18af41f52d401223cad5913ed06650828aacdd6) - Gateway connection failures now identify the last completed handshake phase, helping operators distinguish upgrade, credential, authentication, session, and ready-state stalls. [#93402](https://github.com/openclaw/openclaw/pull/93402) Thanks @849261680, @bzelones, @vincentkoc, @youngting520. - Control UI and other Gateway clients now show the correct pairing or protocol-version guidance even when detail codes contain extra whitespace. [#99555](https://github.com/openclaw/openclaw/pull/99555) Thanks @ly85206559. - Gateway override authentication errors now tell CLI and TUI users whether to add a token or password, remove `--url`, or pair the relevant environment variables. [#100418](https://github.com/openclaw/openclaw/pull/100418) Thanks @gmays. - Standalone ACP clients now close the shared SQLite state database during shutdown so hot reloads and immediate restarts can reopen it without stale locks or callbacks. [#100691](https://github.com/openclaw/openclaw/pull/100691) Thanks @lzy3538. - Voice-call webhook setup through ngrok or Tailscale now fails cleanly on tunnel stream errors instead of crashing the Gateway, and shutdown avoids waiting on an already-ended tunnel. [#101394](https://github.com/openclaw/openclaw/pull/101394) Thanks @cxbasdev. #### Crashes and connection failures - Provider failures that contain BigInt, circular objects, or other unusual values now produce the intended structured transport error instead of crashing the error-reporting path. [#88401](https://github.com/openclaw/openclaw/pull/88401) Thanks @pluviobyte. - OpenClaw no longer crashes when a supervised child output stream fails immediately after launch. [#99802](https://github.com/openclaw/openclaw/pull/99802) Thanks @cxbasdev, @vincentkoc. - MCP stdio sessions now report stderr pipe failures as transport errors without taking down OpenClaw or losing available diagnostics. [#99803](https://github.com/openclaw/openclaw/pull/99803) Thanks @cxbasdev, @vincentkoc. - ACPX MCP proxies now turn closed input or output pipes into a clear proxy failure instead of an uncaught Node stream crash. [#99852](https://github.com/openclaw/openclaw/pull/99852) Thanks @sunlit-deng, @vincentkoc. - Shell snapshot capture and validation no longer crash OpenClaw when an unused helper-process output pipe reports a stream error. [#100744](https://github.com/openclaw/openclaw/pull/100744) Thanks @lsr911, @vincentkoc. - A node-host `system.run` stream failure now returns a clear failed result instead of crashing the node host, and a child that will not stop is terminated after one second. [#100849](https://github.com/openclaw/openclaw/pull/100849) Thanks @cxbasdev. - Docker-backed sandbox file and shell commands now fail promptly with the original input-stream error instead of crashing, hanging, or remaining pending. [#101032](https://github.com/openclaw/openclaw/pull/101032) Thanks @cxbasdev. - APNs relay pushes now reject oversized response bodies as `RelayResponseTooLarge` instead of exhausting Gateway memory or reporting false delivery. [#97550](https://github.com/openclaw/openclaw/pull/97550) Thanks @alix-007. - An ACP Gateway event-handler failure now produces a concise diagnostic instead of terminating the ACP process or corrupting protocol output. [#100558](https://github.com/openclaw/openclaw/pull/100558) Thanks @ajwan8998. - A runaway `tool_search_code` subprocess can no longer grow Gateway memory without limit through stderr, while failure reports retain the latest useful diagnostic detail. [#101007](https://github.com/openclaw/openclaw/pull/101007) Thanks @hugenshen, @vincentkoc. - Built-in grep stream failures now become ordinary tool errors instead of crashing the agent runtime, hanging the search, or leaving incomplete results unexplained. [#101014](https://github.com/openclaw/openclaw/pull/101014) Thanks @cxbasdev. - SSH-backed sandbox commands and uploads now stop cleanly, clean up child processes, and preserve the useful error when an input or output stream fails. [#101031](https://github.com/openclaw/openclaw/pull/101031) Thanks @cxbasdev. #### Gateway controls and settings - Experimental local-model lean mode now offers a smaller default tool menu for constrained models, while operators can explicitly retain media, voice, or PDF tools through allowlists. [#88881](https://github.com/openclaw/openclaw/pull/88881) Thanks @vincentkoc. - Operators can now set `OPENCLAW_SANDBOX_IMAGE` to build revision-specific sandbox image tags for controlled rollout and rollback. [#99915](https://github.com/openclaw/openclaw/pull/99915) - Lean local-model agents can now choose the familiar `exec` tool directly when policy permits it, while existing allowlists, sandboxing, approvals, and hooks still govern command execution. [#101607](https://github.com/openclaw/openclaw/pull/101607) Thanks @vincentkoc. - Busy or slower hosts now give Codex native permission checks and pre-tool hooks more time to finish, reducing dropped policy decisions. [123ec16](https://github.com/openclaw/openclaw/commit/123ec165bb5638ea9587c9e72566c081159bce5c) Thanks @vincentkoc. - Completed or expired exec approvals no longer add misleading follow-up warnings, making the remaining dispatch warnings more useful for spotting real delivery failures. [#66685](https://github.com/openclaw/openclaw/pull/66685) Thanks @pfrederiksen. - Local Gateway approval read or write failures now return a consistent `UNAVAILABLE` response instead of a generic handler error. [#79861](https://github.com/openclaw/openclaw/pull/79861) Thanks @martins-oss. - Agent requests with several MCP servers now initialize those servers concurrently, shortening the wait before the model begins while isolating slow or failed servers. [#94230](https://github.com/openclaw/openclaw/pull/94230) Thanks @mmyzwl, @vincentkoc. - External tools can now receive session-scoped Gateway access without process-wide credentials or permission to impersonate another session, forming the secure base for `openclaw attach`. [#96351](https://github.com/openclaw/openclaw/pull/96351) Thanks @anagnorisis2peripeteia, @obviyus. - Operators can inspect the effective tools for global sessions assigned to any configured agent, not only the default one. [#97265](https://github.com/openclaw/openclaw/pull/97265) Thanks @pick-cat. - Agent runs, Doctor, and Gateway tool views now describe access using the same policy that actually governs the run, reducing confusing permission mismatches. [#99817](https://github.com/openclaw/openclaw/pull/99817) - Bounded write-scope clients can now rename, pin, archive, categorize, and mark sessions unread without admin access, while user labels and stable list ordering survive refreshes. [#100964](https://github.com/openclaw/openclaw/pull/100964) - Embedded terminals can now open, resize, stream output, and close consistently across the Gateway, Control UI, and native apps. [6601576](https://github.com/openclaw/openclaw/commit/66015762a39030584d6a7cc91fad09f4709f8d3f) - Developers can build against and consume managed-worktree session results from the Gateway protocol package without duplicate-name failures. [8ce620f](https://github.com/openclaw/openclaw/commit/8ce620f3e675b25111dcbed6d1e124fedd4756a3) Thanks @vincentkoc. #### Health, usage, and status - Embedded `openclaw agent --local` runs using OpenAI-compatible providers now report and save streamed token usage instead of showing zero, improving session, context, cost, and monitoring records. [#96523](https://github.com/openclaw/openclaw/pull/96523) Thanks @ly85206559, @vincentkoc. - Unusual ACP failure causes now produce stable, readable diagnostic details instead of a missing or invalid explanation. [#96270](https://github.com/openclaw/openclaw/pull/96270) Thanks @ly-wang19. - Normally completed agent and subagent runs no longer appear as error-level log entries, reducing false alarms while genuine failures remain elevated. [#101703](https://github.com/openclaw/openclaw/pull/101703) Thanks @zengwen-dt. - Gateway logs now reveal when OpenClaw cannot save a terminal session's final lifecycle state, making silent persistence failures diagnosable. [#97839](https://github.com/openclaw/openclaw/pull/97839) Related [#97795](https://github.com/openclaw/openclaw/issues/97795). Thanks @aniruddhaadak80, @lzy3538. - Gateway MCP logs are now quieter and identify the responsible tool when schema problems occur, while distinct conflicts remain visible. [#98821](https://github.com/openclaw/openclaw/pull/98821) Thanks @alvelda, @harjothkhara. - Malformed Gateway MCP `tools/call` arguments now return a clear invalid-parameters response before any hook or tool can process them. [#99180](https://github.com/openclaw/openclaw/pull/99180) Thanks @vectorpeak. - MCP attach requests without a valid session key now return the intended validation error instead of crashing the Gateway with a TypeError. [#99488](https://github.com/openclaw/openclaw/pull/99488) Thanks @zhanglei99586. - Starting a new Codex session no longer emits a false history warning before its transcript exists, while genuine history failures remain visible. [#100484](https://github.com/openclaw/openclaw/pull/100484) Thanks @litang9, @vincentkoc. - Gateway usage reports now label start and end dates in the requested timezone, including correct calendar-day handling across local daylight-saving transitions. [#100567](https://github.com/openclaw/openclaw/pull/100567) Thanks @nianjiuzst. - Session usage details now recover malformed transcript dates from available message timestamps and return finite, consistently ordered values instead of nulls. [#100687](https://github.com/openclaw/openclaw/pull/100687) Thanks @sheyanmin. #### Text, emoji, and translated output - Truncated agent logs and diagnostic previews now keep emoji and other extended Unicode characters intact at the cutoff. [#96296](https://github.com/openclaw/openclaw/pull/96296) Thanks @ly-wang19. - Long agent grep lines now truncate emoji and uncommon CJK characters cleanly instead of ending with corrupted replacement symbols. [#97559](https://github.com/openclaw/openclaw/pull/97559) Thanks @zenglingbiao. - Emoji and other supplementary characters now remain intact when long agent progress or active-memory recall text is shortened. [#100244](https://github.com/openclaw/openclaw/pull/100244) Thanks @vincentkoc, @xialonglee, @zengwen-dt. - Shortened text across CLI output, diagnostics, plugin messages, previews, errors, task summaries, and Zalo sends now preserves complete emoji and other supplementary characters. [#101654](https://github.com/openclaw/openclaw/pull/101654) Thanks @lsr911, @maweibin, @wm0018. - Long names, labels, summaries, previews, titles, and diagnostics across OpenClaw now truncate without splitting emoji or other supplementary Unicode characters. [#101685](https://github.com/openclaw/openclaw/pull/101685) Thanks @lsr911, @ly85206559, @maweibin, @wings1029. - Bounded text in Parallel searches, compaction, telemetry, presence, Workboard, badges, and Control UI metadata now keeps or omits whole Unicode characters instead of leaving malformed fragments. [#101711](https://github.com/openclaw/openclaw/pull/101711) - Long streamed replies now split only between complete Unicode characters, preserving emoji in plain text and fenced Markdown even at tight message limits. [#104441](https://github.com/openclaw/openclaw/pull/104441) Thanks @mushuiyu886. - Long status messages and command output now stay readable when shortened, without splitting emoji or non-English characters into corrupted text. [2e7ffca](https://github.com/openclaw/openclaw/commit/2e7ffca8fff001d1d962611a70d76640c920fc6f) Thanks @vincentkoc. - Codex usage-limit previews and plan status labels now truncate emoji and uncommon Unicode cleanly at their display boundaries. [#97299](https://github.com/openclaw/openclaw/pull/97299) Thanks @zenglingbiao. - `/subagents list` now shortens long names and task descriptions containing emoji or uncommon CJK characters without displaying broken glyphs. [#97557](https://github.com/openclaw/openclaw/pull/97557) Thanks @zenglingbiao. - Compact subagent lists now keep long labels and task text within their display budget without splitting emoji or breaking alignment. [#100013](https://github.com/openclaw/openclaw/pull/100013) Thanks @qingminglong. - Shortened web, media, TTS, status, transport, and voice-call text now preserves complete Unicode characters instead of producing replacement symbols or malformed downstream content. [#101355](https://github.com/openclaw/openclaw/pull/101355) Thanks @alix-007, @vincentkoc. - Codex desktop notifications now shorten long assistant previews containing emoji or CJK text without malformed characters. [#101534](https://github.com/openclaw/openclaw/pull/101534) Thanks @lsr911. - ACP tool titles, permission prompts, warnings, and errors now keep long emoji or CJK argument previews readable when shortened. [#101535](https://github.com/openclaw/openclaw/pull/101535) Thanks @lsr911. - Suppressed auto-reply previews in verbose logs now preserve complete emoji and other supplementary characters instead of showing corrupted text at the length limit. [#101575](https://github.com/openclaw/openclaw/pull/101575) Thanks @wm0018. - Oversized agent tool results now preserve complete emoji and similar Unicode characters when shortened before being sent to the model. [#102087](https://github.com/openclaw/openclaw/pull/102087) Thanks @chengzhichao-xydt. - Gateway WebSocket failures now keep non-ASCII close reasons readable and within the byte limit instead of cutting characters into garbled text. [#100047](https://github.com/openclaw/openclaw/pull/100047) Thanks @narahariraghava. ### Accounts, Devices, and Data Protection Trust-sensitive actions stop earlier and explain more of what requires attention. The persistent [activity audit](https://docs.openclaw.ai/gateway/audit) can be filtered and exported after restarts, ClawHub installations distinguish blocked releases from releases that need deliberate acknowledgement, and guarded networking supports approved proxy-only paths without weakening destination checks. Credential resolution and redaction now cover more model and plugin paths, while [sandboxing and approvals](https://docs.openclaw.ai/gateway/sandboxing) enforce clearer device, permission, and workspace boundaries. The [secrets](https://docs.openclaw.ai/gateway/secrets) workflow also avoids exposing resolved model credentials in ordinary request and error paths. #### Credentials and private data - Model-provider keys stored with SecretRefs now receive additional protection against accidental exposure in logs, errors, proxy captures, SDK setup, and runtime inspection, with a compatibility switch for secret sentinels. [#102009](https://github.com/openclaw/openclaw/pull/102009) - Operators can use targeted Doctor lint to detect credential residue in historical `config-audit.jsonl` entries and preview redaction before running `openclaw doctor --fix`. [#84450](https://github.com/openclaw/openclaw/pull/84450) Thanks @giodl73-repo. - Gateway service regeneration now keeps environment-backed secrets out of Linux unit definitions and preserves resolved provider and channel credentials on macOS. [#96065](https://github.com/openclaw/openclaw/pull/96065) Thanks @darren2030, @obviyus. - `openclaw doctor --fix` now preserves separate OAuth accounts for the same provider, including each account reference and saved display name. [#97541](https://github.com/openclaw/openclaw/pull/97541) Thanks @liuhao1024, @yetval. - Bare Fireworks API keys are now masked in logs, provider errors, command details, tool output, and Control UI diagnostics even without a nearby sensitive-field label. [#98226](https://github.com/openclaw/openclaw/pull/98226) Related [#98225](https://github.com/openclaw/openclaw/issues/98225). Thanks @ooiuuii. - Failed OpenAI or Codex credential refreshes now report that reauthentication is required and privately identify the affected profile instead of appearing healthy until model turns fail. [#99134](https://github.com/openclaw/openclaw/pull/99134) Related [#99120](https://github.com/openclaw/openclaw/issues/99120). Thanks @100yenadmin, @fuller-stack-dev. - A temporary output-stream read failure from an exec-based SecretRef provider no longer crashes OpenClaw during credential resolution. [#100521](https://github.com/openclaw/openclaw/pull/100521) Thanks @cxbasdev. - Agent payload logs and cache traces now redact provider keys even when those credentials appear inside free-text diagnostic values. [d8ee630](https://github.com/openclaw/openclaw/commit/d8ee630b203c86fd5d91331156614a441ec9e52c) Thanks @joshavant. - Failed cron webhooks no longer forward raw command summaries or diagnostics that may contain setup prompts, codes, or secret-like output. [1d17263](https://github.com/openclaw/openclaw/commit/1d172637d6dda23a0b108c624239264eae0e5042) Thanks @joshavant. - Secret target discovery now works consistently for both scoped requests and the full compiled registry instead of failing when no allowed subset is supplied. [e490171](https://github.com/openclaw/openclaw/commit/e490171ff24b4165b68b9835e76c1baf8903a149) - `/login codex` now switches the active chat to the account just authenticated without overwriting a newer manual profile choice, and gives recovery guidance if the switch fails. [02c3de9](https://github.com/openclaw/openclaw/commit/02c3de947169acdafbf60dd5ce76f655c34e37c7) Thanks @vincentkoc. - Profile changes made through `/login` now use the standard session save path, preserving newer concurrent selections and existing recovery behavior. [f07c478](https://github.com/openclaw/openclaw/commit/f07c4782fa6a109df7f4345f51a88caa9d8439c9) Thanks @vincentkoc. - Codex session bindings now keep large MCP configurations and rotated Authorization credentials in bounded fingerprints without persisting readable bearer values. [491e42e](https://github.com/openclaw/openclaw/commit/491e42e6d5a334f850e2ad790a19c936c8daa07e) Thanks @100yenadmin. - Copied provider keys and tokens now have hidden terminal control characters removed before request headers are prepared, while intentional spaces remain intact. [#96444](https://github.com/openclaw/openclaw/pull/96444) Thanks @lin-hongkuan. - Masked malformed credentials now stay on one safe line in setup and authentication diagnostics even when the original input contains newlines or other control bytes. [#96445](https://github.com/openclaw/openclaw/pull/96445) Thanks @lin-hongkuan. - Security audits no longer mistake bundled placeholder keys for LM Studio, Ollama, and other keyless local providers as exposed plaintext credentials. [#97622](https://github.com/openclaw/openclaw/pull/97622) Thanks @xydigit-sj. - Control UI Activity previews now conceal API keys stored under dotted configuration names or returned in structured tool output. [#99460](https://github.com/openclaw/openclaw/pull/99460) Related [#99459](https://github.com/openclaw/openclaw/issues/99459). Thanks @ooiuuii. - Custom ACP error redactors now keep OpenClaw's built-in secret cleanup, preventing known tokens, credentials, and private-key material from leaking into formatted errors. [#100191](https://github.com/openclaw/openclaw/pull/100191) Thanks @lin-hongkuan. - When another OpenClaw process is refreshing OpenAI OAuth credentials, operators now see one useful contention error without duplicated wording or exposed local file paths. [#101573](https://github.com/openclaw/openclaw/pull/101573) Thanks @vincentkoc. #### Devices and pairing - Running a read-only local Gateway check no longer leaves stale pairing permissions that block a later agent, admin, write, or device-approval command. [#96002](https://github.com/openclaw/openclaw/pull/96002) Thanks @vincentkoc. - `/pair` now refuses setup codes that point to non-routable `0.0.0.0` or `::` addresses and gives operators secure Gateway URL guidance instead. [#98617](https://github.com/openclaw/openclaw/pull/98617) Thanks @crh-code. - Gateway authentication retries now send stored device tokens only to true loopback endpoints, not remote hostnames that merely resemble `127.*` addresses. [#99859](https://github.com/openclaw/openclaw/pull/99859) Thanks @ly85206559. - The `/pair` mobile setup flow now accepts local IPv6 ULA and link-local Gateway addresses without requiring TLS or a different advertised host, while public cleartext URLs remain blocked. [#101008](https://github.com/openclaw/openclaw/pull/101008) Thanks @zhangguiping-xydt. - Device owners can approve the request ID most recently shown by `openclaw devices list` after a reconnect, without weakening protection against newly expanded scopes. [#98145](https://github.com/openclaw/openclaw/pull/98145) Thanks @romneyda. - Swift native clients now support device-scoped skill approvals, with the reviewer-device field encoded in their generated Gateway models. [1403c64](https://github.com/openclaw/openclaw/commit/1403c64799ae62785e36327b6fc4c5235b10d8ba) - Gateway sign-in tracking now keeps bounded memory use during floods of failed attempts from many addresses while preserving existing lockouts. [#96224](https://github.com/openclaw/openclaw/pull/96224) Thanks @eleqtrizit. #### Permissions and approvals - Browser control now requires the same administrator permission through direct node invocation as through the standard browser request path, preventing write-only credentials or third-party plugins from gaining elevated access. [#85916](https://github.com/openclaw/openclaw/pull/85916) Thanks @eleqtrizit, @laphilosophie. - Only the configured owner can now change whether a group responds to mentions or every message through `/activation`. [#97838](https://github.com/openclaw/openclaw/pull/97838) Thanks @pgondhi987. - Starting or changing native Codex sessions now requires owner or `operator.admin` access, while other authorized senders retain read-only inspection. [#97952](https://github.com/openclaw/openclaw/pull/97952) Thanks @eleqtrizit. - ACP session lifecycle and runtime controls now require an owner or internal Gateway administrator instead of being available to any authorized channel user. [#97953](https://github.com/openclaw/openclaw/pull/97953) Thanks @eleqtrizit. - Approving a node that can handle sensitive browser traffic now requires administrator permission, matching the security level already required to use that capability. [#104491](https://github.com/openclaw/openclaw/pull/104491) Thanks @yetval. - Authorized non-owner chat participants can no longer inspect or change owner-controlled MCP server configuration through `/mcp`. [ad5a26c](https://github.com/openclaw/openclaw/commit/ad5a26cf699afd7a387a187aee77bbc7d04793df) Thanks @joshavant. - Auto-reply diagnostics now remain owner-only instead of allowing non-owner participants to run the command. [170bf72](https://github.com/openclaw/openclaw/commit/170bf72e64a9b85933e156244cccda7bd0270df4) Thanks @joshavant. - After an agent is removed, its leftover sessions can no longer start new model runs through the Gateway. [#97260](https://github.com/openclaw/openclaw/pull/97260) Thanks @obviyus, @pick-cat. - Non-owner Gateway chat users are no longer offered the protected `cron`, `gateway`, or `nodes` control tools, even when those tools are otherwise allowlisted. [#102030](https://github.com/openclaw/openclaw/pull/102030) Thanks @pgondhi987. - Trajectory exports from chat now require owner authority, preventing other command-authorized channel users from retrieving sensitive session artifacts. [#97840](https://github.com/openclaw/openclaw/pull/97840) Thanks @pgondhi987. - Gateway-wide Active Memory can now be changed only by owners or administrators, while other authorized users retain session-level controls. [#97841](https://github.com/openclaw/openclaw/pull/97841) Thanks @pgondhi987. - Only owners and administrative Gateway clients can now turn Memory Core dreaming on or off through `/dreaming`, while status and help remain available to others. [#97869](https://github.com/openclaw/openclaw/pull/97869) Thanks @eleqtrizit. - Non-admin Telegram and Discord users can no longer change the Gateway's Talk voice, though they can still view the current and available voices. [#97874](https://github.com/openclaw/openclaw/pull/97874) Thanks @eleqtrizit. - Installing or reconfiguring Codex Computer Use resources now requires owner or administrator access, while other authorized senders can still inspect status. [#97955](https://github.com/openclaw/openclaw/pull/97955) Thanks @eleqtrizit. - Authenticated owners can use their already-granted shell, file, process, Skill Workshop, and plugin tools in WebChat without extending those permissions to guests or external senders. [#101271](https://github.com/openclaw/openclaw/pull/101271) Thanks @fuller-stack-dev. - With `strictInlineEval` enabled, versioned Python and PyPy commands plus additional PHP and R inline forms now require fresh explicit approval rather than inheriting executable trust. [#96216](https://github.com/openclaw/openclaw/pull/96216) Thanks @eleqtrizit. - In shared channels, only the person who started a Claude Code command can approve or deny its tool permission requests. [#98256](https://github.com/openclaw/openclaw/pull/98256) Thanks @eleqtrizit. - Running `/prose` now shows operators the transitive remote imports and asks for consent before OpenProse fetches those code dependencies. [259877d](https://github.com/openclaw/openclaw/commit/259877dccf1c6e2e8abce5deb92450af1a8b53a6) Thanks @joshavant. - Codex plugin users can allow read-only app actions while requiring a fresh approval for every write or destructive action. [#97123](https://github.com/openclaw/openclaw/pull/97123) Thanks @kevinslin. - Codex plugin apps now avoid approval prompts for read-only actions, preserve per-app write policies across recovery, and refresh their app inventory after upgrades. [#97327](https://github.com/openclaw/openclaw/pull/97327) Thanks @kevinslin. - Windows exact-path execution approvals now launch the approved executable rather than a same-named program from the working directory. [#98260](https://github.com/openclaw/openclaw/pull/98260) Thanks @eleqtrizit. - The Codex plugin now names per-action destructive approval mode `ask`, making it clear that each write or destructive action remains available but requires confirmation. [#98501](https://github.com/openclaw/openclaw/pull/98501) Related [#98499](https://github.com/openclaw/openclaw/issues/98499). Thanks @kevinslin. - Exec approval prompts now display and transmit long command text containing emoji or malformed Unicode without broken characters or encoding failures. [#99566](https://github.com/openclaw/openclaw/pull/99566) Thanks @mikasa0818. - The Control UI terminal is now explicit opt-in, opens tabs under the selected agent's workspace and policy, and closes affected shells when accepted access restrictions tighten. [#100081](https://github.com/openclaw/openclaw/pull/100081) Thanks @rayncc. - Windows companion-node exec policies can now be viewed and updated through node-aware approvals commands and displayed correctly in Control UI. [#101669](https://github.com/openclaw/openclaw/pull/101669) Thanks @vincentkoc. - Using `jq` through exec now requires an explicit trusted allowlist entry or approval instead of being treated as a harmless stdin-only safe binary. [#102032](https://github.com/openclaw/openclaw/pull/102032) Thanks @pgondhi987. - Always-allow approvals for `npm exec`, `npx`, `pnpm`, and `yarn` wrappers now apply to the actual command rather than unintentionally trusting different future payloads. [#102035](https://github.com/openclaw/openclaw/pull/102035) Thanks @pgondhi987. - Skills created by agents now remain pending for Skill Workshop review and approval instead of becoming active immediately without the expected safeguards. [#98346](https://github.com/openclaw/openclaw/pull/98346) Related [#96054](https://github.com/openclaw/openclaw/issues/96054). Thanks @momothemage, @xianshishan. - Status and diagnostic tools can now identify stale exec approval follow-ups intentionally suppressed after `/new` or `/reset` instead of treating them as unexplained delivery failures. [#98293](https://github.com/openclaw/openclaw/pull/98293) Thanks @bsniznd. - Codex `/btw` side conversations now preserve an ask-mode plugin app's requirement to obtain approval before destructive actions. [#98812](https://github.com/openclaw/openclaw/pull/98812) - Long Codex app-server approval details and command previews now preserve emoji and extended Unicode characters instead of showing corrupted text. [#100177](https://github.com/openclaw/openclaw/pull/100177) Thanks @xialonglee. - Strict exec approval now keeps joined or clustered interpreter inline-code commands such as `python3 -xcprint` as one-time approvals rather than reusable allowlist entries. [#101353](https://github.com/openclaw/openclaw/pull/101353) Thanks @pgondhi987. - Long exec auto-review explanations containing emoji or supplementary CJK characters now shorten cleanly instead of showing a broken replacement symbol. [#101513](https://github.com/openclaw/openclaw/pull/101513) Thanks @wm0018. - Plugin approval titles and descriptions now remain readable when emoji or supplementary CJK characters fall at the Gateway's text limit. [#101580](https://github.com/openclaw/openclaw/pull/101580) Thanks @wm0018. #### Channels, users, and conversation separation - Agents using OpenClaw's cron tools are now limited to their own scheduled jobs and session targets, while operator-managed cron remains unchanged and mixed-version setups fail closed with an `openclaw gateway restart` instruction. [#96883](https://github.com/openclaw/openclaw/pull/96883) Thanks @joshavant. - Cron wake actions started by an agent now remain within that agent's own session lanes, reducing the chance of waking another agent's conversation. [#97949](https://github.com/openclaw/openclaw/pull/97949) Thanks @eleqtrizit. - Write-scoped Gateway clients can still perform supported message actions but can no longer supply identity fields that masquerade as a trusted requester or owner. [#102031](https://github.com/openclaw/openclaw/pull/102031) Thanks @pgondhi987. - Multi-user bridges using `openclaw agent --agent ... --channel ... --to ...` now keep recipients in separate sessions when per-recipient isolation is configured. [#101507](https://github.com/openclaw/openclaw/pull/101507) Thanks @pingfanfan, @vincentkoc. - Read-only voice-call status now omits phone numbers, transcripts, routing details, processed event IDs, and raw metadata. [#97870](https://github.com/openclaw/openclaw/pull/97870) Thanks @eleqtrizit. #### Plugin and skill download checks - ClawHub now checks community plugin and skill releases before download, blocking prohibited releases and requiring explicit acknowledgement for suspicious ones while leaving existing installs in place when an update is skipped. [#81364](https://github.com/openclaw/openclaw/pull/81364) Thanks @jesse-merhi. #### Activity history - Authorized operators now have a durable audit history for agent and tool activity, with filters, stable paging, bounded JSON export, configurable recording, and automatic retention limits. [#98704](https://github.com/openclaw/openclaw/pull/98704) #### Security checks and guided fixes - Operators using workspace repairs can now run `doctor --fix` to disable policy-denied Gateway HTTP endpoints without removing nested URL-fetch settings. [#99731](https://github.com/openclaw/openclaw/pull/99731) Thanks @giodl73-repo. - `openclaw security audit` now warns that per-agent skill allowlists do not prevent shell-capable agents from reaching globally configured MCP servers. [#98352](https://github.com/openclaw/openclaw/pull/98352) Thanks @momothemage. - Managed deployments can now require entries such as `system.run` in `gateway.nodes.denyCommands`, and Policy doctor warns when configuration drift leaves a privileged node command available. [#99121](https://github.com/openclaw/openclaw/pull/99121) Thanks @giodl73-repo. - `policy check --json` now tells administrators whether each finding is automatically repairable, needs review or manual work, is validation-only, or is unsupported. [#99686](https://github.com/openclaw/openclaw/pull/99686) Thanks @giodl73-repo. - Operators who explicitly enable Policy workspace repairs can now automatically narrow several unsafe settings, while OpenClaw remains read-only without that opt-in. [#99690](https://github.com/openclaw/openclaw/pull/99690) Thanks @giodl73-repo, @omarshahine. - Policy workspace repairs can now add required tools to the affected deny list while preserving existing entries and avoiding unintended root-policy widening. [#99700](https://github.com/openclaw/openclaw/pull/99700) Thanks @giodl73-repo. - Policy workspace repairs can now move reported open channel groups to allowlist mode and require mentions without changing inherited defaults. [#99720](https://github.com/openclaw/openclaw/pull/99720) Thanks @giodl73-repo, @omarshahine. - `doctor --fix` now shows the exact `gateway.bind=loopback` or `gateway.nodes.denyCommands` change needed for sensitive findings without applying it automatically. [#99776](https://github.com/openclaw/openclaw/pull/99776) Thanks @giodl73-repo. - `openclaw security audit` now reports Browser exposure only when plugin policy actually allows the Browser plugin to run. [#97732](https://github.com/openclaw/openclaw/pull/97732) Thanks @amtellezfernandez. #### Network request protections - Provider, channel, media, and web requests can now reach public destinations through a managed proxy even when local DNS is unavailable or differs from the proxy's DNS. [#98951](https://github.com/openclaw/openclaw/pull/98951) Related [#98925](https://github.com/openclaw/openclaw/issues/98925). Thanks @momothemage, @sandl99. - Malformed MCP OAuth failures now return a bounded HTTP-status diagnostic instead of allowing an unbounded error response to exhaust agent memory. [#98143](https://github.com/openclaw/openclaw/pull/98143) Thanks @pick-cat. - Under strict SSRF policy, remote-browser discovery can no longer redirect OpenClaw from the configured CDP endpoint to a different host, port, or security mode. [cbc833a](https://github.com/openclaw/openclaw/commit/cbc833a7f33804db11f11274678770a1b55be3ca) Thanks @vincentkoc. - Oversized or never-ending responses from supported external providers now stop at a fixed limit with a labeled error instead of consuming memory until the full body arrives. [0a14444](https://github.com/openclaw/openclaw/commit/0a14444924e34e031133c997b00d30573353c5a0) Thanks @joshavant. - Web fetch and provider integrations now enforce response-size caps without allocating an entire nonstandard response in memory. [#99884](https://github.com/openclaw/openclaw/pull/99884) Thanks @zenglingbiao. - Trusted custom provider hosts are now protected from DNS rebinding into local services; intentional loopback aliases must use an explicit local origin or enable `allowPrivateNetwork`. [#100835](https://github.com/openclaw/openclaw/pull/100835) Thanks @machine3at. - Browser-control requests now reject oversized successful JSON responses with a `BrowserServiceError` before they can consume excessive memory, while supported large browser results still work. [#100889](https://github.com/openclaw/openclaw/pull/100889) Thanks @mushuiyu886. - Browser automation now keeps Chrome control traffic tied to the configured or explicitly allowed CDP host, reducing the risk that a discovered debugger address redirects credentials or control elsewhere. [#101171](https://github.com/openclaw/openclaw/pull/101171) - Hidden control characters can no longer break terminal hyperlink boundaries or inject control behavior through documentation link text. [#96440](https://github.com/openclaw/openclaw/pull/96440) Thanks @lin-hongkuan. - MCP include and exclude filters with many wildcard segments now reject nonmatches quickly instead of stalling tool discovery for minutes. [#100330](https://github.com/openclaw/openclaw/pull/100330) Thanks @lsr911. - Anthropic and Gemini PDF analysis now blocks unsafe private-network redirects and oversized responses by default while still supporting configured local endpoints. [#97872](https://github.com/openclaw/openclaw/pull/97872) Thanks @eleqtrizit. - Anthropic requests through Cloudflare AI Gateway now receive OpenClaw's standard private-address blocking, timeouts, retry guidance, and managed response safeguards. [#98003](https://github.com/openclaw/openclaw/pull/98003) Thanks @wangmiao0668000666. #### File, path, and configuration protections - Sandboxed agents with host browser control disabled can no longer reach a signed-in host browser through a paired browser node. [#97958](https://github.com/openclaw/openclaw/pull/97958) Thanks @eleqtrizit. - Hooks and skills no longer activate from unsafe inherited configuration values, while ordinary configured paths and explicit defaults continue to work. [#59694](https://github.com/openclaw/openclaw/pull/59694) Thanks @yonganzhang. - Unsafe, malformed, or unexpectedly large fd and ripgrep helper archives now fail early and clean up after themselves instead of putting agent setup at risk. [#98988](https://github.com/openclaw/openclaw/pull/98988) Thanks @leonidaslux, @vincentkoc. - Config show, set, and unset now operate only on values truly stored in the user's configuration, preventing inherited object state from masquerading as saved settings. [#99846](https://github.com/openclaw/openclaw/pull/99846) Thanks @vincentkoc, @zenglingbiao. - Terminal requests with an unknown agent ID now fail clearly instead of falling back to global defaults and potentially opening a host shell outside the intended agent boundary. [3601dca](https://github.com/openclaw/openclaw/commit/3601dcad24fea8924c52d8abbafb85e50fc247ce) - The Windows installer now accepts patched SQLite runtimes, rejects unsafe or unreadable ones, and reports the detected version when another Node.js upgrade is required. [28db140](https://github.com/openclaw/openclaw/commit/28db14005a77ca146c1f10979501dcfd375e8d01) Thanks @vincentkoc. - Managed host tools no longer inherit the active Conda environment from the shell that launched OpenClaw, avoiding unintended Python and package-manager behavior. [#99425](https://github.com/openclaw/openclaw/pull/99425) Related [#99424](https://github.com/openclaw/openclaw/issues/99424). Thanks @krissding, @ooiuuii. - OpenShell workspace file operations now stay inside the validated local sandbox mirror, with unsafe symlink, hard-link, cross-root, and changing-directory cases failing cleanly. [c6f5725](https://github.com/openclaw/openclaw/commit/c6f5725906dcaaaeeb0b5942addc844ffc579caf) Thanks @joshavant. - Config recovery now warns when the file was repaired but its final permissions could not be hardened, preserving the recovery while exposing the security issue. [#95348](https://github.com/openclaw/openclaw/pull/95348) Thanks @hugenshen. - Installing or updating ClawHub skills, plugins, and packages on Linux no longer risks changing shared `/tmp` permissions and disrupting unrelated services. [#101246](https://github.com/openclaw/openclaw/pull/101246) Thanks @ch3ch2cho2021, @yangxiansheng. ### Official App Updates Across first-party client surfaces, conversation lists, command palettes, notifications, media, connection state, and file or diff views behave more consistently. Shared keyboard, path, status, Talk, and voice behavior is less likely to drift between clients, and failures leave clearer recovery paths. The [Android](https://docs.openclaw.ai/platforms/android), [iOS](https://docs.openclaw.ai/platforms/ios), and [macOS](https://docs.openclaw.ai/platforms/macos) apps add refreshed navigation, voice-message and Watch reply workflows, multiple Gateway profiles, background location options, and many chat and connection fixes. Cached state, trust, push settings, and the selected Gateway remain better separated when people switch between installations. #### Shared app changes - The Diffs viewer now provides a multi-file overview and direct file navigation, while PNG and PDF exports omit controls that cannot be used. [#100753](https://github.com/openclaw/openclaw/pull/100753) - After the Diffs viewer is reopened or refreshed, its toolbar controls now act only on the currently displayed diff cards. [#96138](https://github.com/openclaw/openclaw/pull/96138) Thanks @brokemac79, @davinci282828. - Session tools now display the correct absolute path for projects beside the home directory instead of turning a shared text prefix into a misleading `~...` path. [#96562](https://github.com/openclaw/openclaw/pull/96562) Thanks @he-yufeng. - Realtime Talk consult calls acknowledge as soon as the embedded agent run is accepted, rather than waiting for it to finish. [#101091](https://github.com/openclaw/openclaw/pull/101091) Thanks @romneyda. - Authorized remote clients can now request playable speech for an individual assistant message using the existing Gateway TTS configuration without accessing server-local files. [#100770](https://github.com/openclaw/openclaw/pull/100770) ##### Android and iOS - Trusted Gateway clients can now browse workspace directories and preview supported files, enabling the iOS and Android apps to inspect and share agent output without SSH. [#100738](https://github.com/openclaw/openclaw/pull/100738) - iOS and Android users can create empty session groups, rename them once across their sessions, and remove a group without deleting the conversations inside it. [#101234](https://github.com/openclaw/openclaw/pull/101234) - Android and iOS now explain which side needs an update when app and Gateway protocol versions differ and avoid offering reconnect attempts that cannot succeed. [#98385](https://github.com/openclaw/openclaw/pull/98385) Related [#98384](https://github.com/openclaw/openclaw/issues/98384). Thanks @joshavant. - Mobile camera clips and screen recordings longer than 30 seconds can now finish within the existing duration limit without the request expiring early. [#99455](https://github.com/openclaw/openclaw/pull/99455) Thanks @nianjiuzst. - The iOS and Android terminal pages now receive the operator credential from the connected device session, so authenticated users do not land on a terminal that cannot connect. [451190d](https://github.com/openclaw/openclaw/commit/451190d625693153dfdca800fdbb9a05b2c21b6a) Thanks @vincentkoc. - iOS and Android can now show the Gateway terminal as a focused full-screen view with stored credentials and a clear unavailable state instead of embedding the full desktop Control UI. [9c78489](https://github.com/openclaw/openclaw/commit/9c7848928f8b7f4104dd3eb4ddc9330d850d1886) - Android and iOS Gateway setup now clearly requires Secure TLS for remote hosts, warns before trusted LAN use without encryption, and offers actionable update guidance for protocol mismatches. [#101325](https://github.com/openclaw/openclaw/pull/101325) Thanks @joshavant. ##### iOS and macOS - iOS and macOS chat now show a context-usage ring that changes warning color near the limit, helping users anticipate compaction or truncation in long conversations. [#101183](https://github.com/openclaw/openclaw/pull/101183) - Apple native app users across 21 supported non-English locales now see translated Listen and speech-playback status controls. [0146534](https://github.com/openclaw/openclaw/commit/01465340f6dfe6dd51671e3a0c3b33d23c1ff1d7) - Swift clients can now decode skill curator actions and status details such as pinned state, use counts, timestamps, archived reasons, and overlaps. [ad833d7](https://github.com/openclaw/openclaw/commit/ad833d788305faeb9c12f3f4c5068674d201ee68) - Apple chat now presents fenced code with theme-aware highlighting and GitHub-style tables as aligned native tables on iOS and macOS. [#100207](https://github.com/openclaw/openclaw/pull/100207) - Apple chat now restores the visible in-progress state after backgrounding or reconnecting, preventing overlapping sends and reconciling one correct final reply. [#100277](https://github.com/openclaw/openclaw/pull/100277) - iOS chat now shows and switches the active model, while iOS and macOS model pickers support pinned favorites and the five most recent choices. [#100774](https://github.com/openclaw/openclaw/pull/100774) - Display equations in iOS and macOS chats now appear as readable, accessible typeset math, with horizontal scrolling for wide formulas and raw text retained for malformed expressions. [#100829](https://github.com/openclaw/openclaw/pull/100829) - iOS and macOS hide the thinking-level control for models that cannot use it, avoid sending stale unsupported settings, and restore the previous level when a reasoning-capable model is selected again. [#100875](https://github.com/openclaw/openclaw/pull/100875) - Streaming replies in iOS and macOS chats now reveal text more smoothly word by word, while reduced-motion users still receive immediate text and completed messages remain unchanged. [#100884](https://github.com/openclaw/openclaw/pull/100884) - iOS and macOS users can preview a safe link's title and description inside chat before deciding whether to open it. [#101198](https://github.com/openclaw/openclaw/pull/101198) - Expanded link previews on iOS and macOS can now show a safe page thumbnail, with the existing text card retained when image loading fails. [#101387](https://github.com/openclaw/openclaw/pull/101387) - Finished iOS and macOS chat replies now typeset inline LaTeX formulas while streaming text, code, currency, and invalid math remain readable as plain text. [#101388](https://github.com/openclaw/openclaw/pull/101388) - iOS chat and macOS webchat users can search, pin, rename, archive, restore, and reopen sessions from the in-chat switcher instead of scrolling a simple recent list. [#101053](https://github.com/openclaw/openclaw/pull/101053) ##### Native app localization and design - Transcript export controls, chat actions, and export failure messages are now translated across 21 supported native app locales. [45f561a](https://github.com/openclaw/openclaw/commit/45f561ab6c24de9848b70823c80b7ac770531c41) - Supported non-English native apps now translate newer app information, support links, and message retry, delete, and waiting-to-send states. [82f5ac1](https://github.com/openclaw/openclaw/commit/82f5ac150ffde0c847696cddcdcb2d300bb44294) - Broader native app setup, chat, Talk, permission, connection, session, provider, and status text now uses the selected language across the language packs updated in this release. Sources: [a39b07b](https://github.com/openclaw/openclaw/commit/a39b07bb15f280c6d83522f79b1397104e5e05c4), [f8e1e0c](https://github.com/openclaw/openclaw/commit/f8e1e0c5bfbc1b43339ffaaaddd3ee6e45083c2d), [db27d2e](https://github.com/openclaw/openclaw/commit/db27d2ecfa77666397f841d6c0d47153ff94d822), [28a8414](https://github.com/openclaw/openclaw/commit/28a841472684eed2d98a1a277fcefc30855b580b), [e8e96bf](https://github.com/openclaw/openclaw/commit/e8e96bf7ee03aa251fc196693deb70af81da3d63), [6ea407d](https://github.com/openclaw/openclaw/commit/6ea407d46223ad3336abfc93abfb0345b2a58e75), [0011a18](https://github.com/openclaw/openclaw/commit/0011a184786686e625268f55799bdfbb8c8c7fda), [8c5adbf](https://github.com/openclaw/openclaw/commit/8c5adbfe3ec4f68a49d41a3b313a3b6b059c81d3), [019603d](https://github.com/openclaw/openclaw/commit/019603d336028c31de7c49814b45bb29314174e8), [d3d7282](https://github.com/openclaw/openclaw/commit/d3d7282a8cf4c99a29efa8c58c1980557f1c1abc), [267898c](https://github.com/openclaw/openclaw/commit/267898cddb9804bc2f27f94350e0c2342b48bf4b), [55ed57a](https://github.com/openclaw/openclaw/commit/55ed57a4e39b8e40628b9fcbfc982e9ac5fd86b5), [c54dc67](https://github.com/openclaw/openclaw/commit/c54dc67381933fa6240fe617e414fd6f1933ea38), [fd0355d](https://github.com/openclaw/openclaw/commit/fd0355d5b1a12c263bbd87e01ee88f451d11514b), [49726a5](https://github.com/openclaw/openclaw/commit/49726a5f5cbc013d42d7bf64c3033bbce4af319c), [2ffeedf](https://github.com/openclaw/openclaw/commit/2ffeedf406e741e9f58858c83af06aa763ba1ab6), [#98043](https://github.com/openclaw/openclaw/pull/98043), [beca2b1](https://github.com/openclaw/openclaw/commit/beca2b1749733f4afccf47a780187859e7afce22), [4078dc7](https://github.com/openclaw/openclaw/commit/4078dc78cc79b6a9ab0564f065fe1871a9a0c499), [e7e98f6](https://github.com/openclaw/openclaw/commit/e7e98f6399cd7bffdd5598bb86a48066dd2ce3e3), [3020f78](https://github.com/openclaw/openclaw/commit/3020f7817eb3ecf54057ed2847a0d54d0801d348), [0c82908](https://github.com/openclaw/openclaw/commit/0c82908f78e9eb33a9ad13dd726fa92833a688d9), [8a3935f](https://github.com/openclaw/openclaw/commit/8a3935fe0ba7b06dd76203b4f20b11a74ecbc688), [3f289fd](https://github.com/openclaw/openclaw/commit/3f289fdb4042446042b6cd9a5261a17dc3edf6a0), [203a896](https://github.com/openclaw/openclaw/commit/203a896b27c5c5191823138a4365578e0e77352d), [6afef15](https://github.com/openclaw/openclaw/commit/6afef15100fb402fb747a3543822d33fb9086f68). Thanks @yeager. - New-chat and worktree-chat entry points now appear in the selected language across supported Android and Apple app locales. [24bca38](https://github.com/openclaw/openclaw/commit/24bca38cdaad4a304a5624ef8ddc6cdc9b7d4d5a) - Supported non-English native apps now cover more Gateway setup, session, provider, health, messaging, terminal, and device text without English gaps. [52f1e05](https://github.com/openclaw/openclaw/commit/52f1e056006dc3aeca574877d51b942c87fa7cb1) - Refreshed native language packs now cover workspace files, sharing actions, folder states, Android SMS guidance, message delivery states, and related branding. [a9b0a9a](https://github.com/openclaw/openclaw/commit/a9b0a9a12b07899d8a0c4638a8521f5865d75bc6) - Supported non-English native apps now translate the new Terminal destination, Gateway setup guidance, Back action, connection messages, and OpenClaw branding. [e069cb2](https://github.com/openclaw/openclaw/commit/e069cb26f72a2e6233df8e2bd18a4274e1d53722) - Native app onboarding and AI connection guidance now reflects Crestodian and the current setup flow across supported non-English locales. Sources: [ad4809f](https://github.com/openclaw/openclaw/commit/ad4809f677f531cb00085c1d006db3d46a529ed8), [f0ecc16](https://github.com/openclaw/openclaw/commit/f0ecc16629f018d157345f1c653011f3ec9c97d3). - Native app command search now translates loading, unavailable, retry, and no-result states across the languages updated in this release. Sources: [745d2d0](https://github.com/openclaw/openclaw/commit/745d2d09cdbc79a019d2f7491bf04959ead4e51b), [7f7bec7](https://github.com/openclaw/openclaw/commit/7f7bec78445d049ba1d1b7019b2085cc808beb5a), [35be1c8](https://github.com/openclaw/openclaw/commit/35be1c81439c8df99e4de7057344c5bf0d056f56), [7db67ab](https://github.com/openclaw/openclaw/commit/7db67abd9eb01c36c55f3621a1b3521b290131b3), [4bc5766](https://github.com/openclaw/openclaw/commit/4bc57666cd8b0924f5ab15d5d8cafc4ba9b0ddbb), [0672720](https://github.com/openclaw/openclaw/commit/06727207d66ec1aef814664cf1e88da82c100140), [2a8cd44](https://github.com/openclaw/openclaw/commit/2a8cd440d14ae66e41c63140ea0c0067ca033461), [fd648fb](https://github.com/openclaw/openclaw/commit/fd648fbb17575fec3780c7d8fddf13780b083df2), [00b0b40](https://github.com/openclaw/openclaw/commit/00b0b40e284f40c3c8906251bbb202b81caab656), [a67990a](https://github.com/openclaw/openclaw/commit/a67990a180d6915328165dd7dc9975395160a784), [7640f67](https://github.com/openclaw/openclaw/commit/7640f672b407cf28384cbf5396cdf5d20965da6b), [15f4819](https://github.com/openclaw/openclaw/commit/15f481920c079364513b06939edc06aba6caef04), [4d1d720](https://github.com/openclaw/openclaw/commit/4d1d720164dbf3eb46c4d3a4a98814c2a1d2bdc2), [d1d3a27](https://github.com/openclaw/openclaw/commit/d1d3a2724feeca65759f2658c4af6a8350c1f854), [c2737d5](https://github.com/openclaw/openclaw/commit/c2737d55a9ffea741e07687a6eb40eff61fd369d), [bd3263d](https://github.com/openclaw/openclaw/commit/bd3263d713a1dbb299c14392139bab3cc5aed428), [127ce63](https://github.com/openclaw/openclaw/commit/127ce639547ef0f6016c829c31b915d97d4a55df), [0c960cd](https://github.com/openclaw/openclaw/commit/0c960cd8ae6a1553bdef3820b8167376772e7e53), [e6c3ad9](https://github.com/openclaw/openclaw/commit/e6c3ad99637b4f6fba34d9f2d64f7ca5b2413e45), [84c86f7](https://github.com/openclaw/openclaw/commit/84c86f73eb99b716598d031e7dce58ed73fa5d28), [e7aea60](https://github.com/openclaw/openclaw/commit/e7aea605426cfe8e39287b1e07fa23436260c88b). - Native chat controls for jumping to the latest message or reply now use the selected language across the translations in this release. Sources: [e31fa36](https://github.com/openclaw/openclaw/commit/e31fa360d94a0efd6003079271986ad32f0c2f9c), [375def8](https://github.com/openclaw/openclaw/commit/375def86042a938141bed0c635c361df72cf0ab2), [aabe44f](https://github.com/openclaw/openclaw/commit/aabe44f6382206a49855e8b7c7f1848666790f61), [48c3f4b](https://github.com/openclaw/openclaw/commit/48c3f4b10326a890352ba5e7dd51fad897145c38), [3db6fb9](https://github.com/openclaw/openclaw/commit/3db6fb9972768d7b4979a2649f202d8851935dd8), [a4b51e5](https://github.com/openclaw/openclaw/commit/a4b51e58d3627ba4524a98d9aebe2c11115b284e), [a60686d](https://github.com/openclaw/openclaw/commit/a60686dbc376667625e1613aa131af5487e5d8fa), [12e17ec](https://github.com/openclaw/openclaw/commit/12e17ec052982a37c29245d738954488248ea8c7), [6c4ac0c](https://github.com/openclaw/openclaw/commit/6c4ac0c71da53cd99968a976894c7b8def078f67), [bdc6258](https://github.com/openclaw/openclaw/commit/bdc625866b942f8f8d82ecfb72427f7c90992e78), [a775f9f](https://github.com/openclaw/openclaw/commit/a775f9f78e80a76b49cdf259e71ee002ee1da101), [a1f6acc](https://github.com/openclaw/openclaw/commit/a1f6accef457ab9f48adff2975a853e28c291909), [ee9f61d](https://github.com/openclaw/openclaw/commit/ee9f61d724ff265017c93aef0b11c2d5f1a2401b), [f188c66](https://github.com/openclaw/openclaw/commit/f188c664c0e73d455f3bf6c5ac074a5432269c50), [2525078](https://github.com/openclaw/openclaw/commit/2525078b86544143634697a4f46aef850b783025), [ed5ccda](https://github.com/openclaw/openclaw/commit/ed5ccda79c8b0b96c59a6af880bf114997e85414), [a6a4792](https://github.com/openclaw/openclaw/commit/a6a4792098a88953f1be8a81035f06b9bd7ed83a), [0924bee](https://github.com/openclaw/openclaw/commit/0924bee96bcc86715942d11c31b878c323548e90), [0420aef](https://github.com/openclaw/openclaw/commit/0420aefb1d4eeab37bbcf7f50268c41cfb760b26), [d23c4fd](https://github.com/openclaw/openclaw/commit/d23c4fdbb55f06833b9e37675185c003f7b3ea81), [37f0067](https://github.com/openclaw/openclaw/commit/37f006725d3706cfa28922178e123d8ff192f352). - Native prompts for starting work, checking status, using phone and voice controls, pairing, and returning to Chat now use the selected language across the translations in this release. Sources: [dd050bc](https://github.com/openclaw/openclaw/commit/dd050bc5f8151488e080b117714ea9f5cad832b5), [db72ffd](https://github.com/openclaw/openclaw/commit/db72ffd5d47050acb2d4dd72de8087c162876523), [4997802](https://github.com/openclaw/openclaw/commit/4997802eb0051cc83b9da1a06c923f211ff12159), [2dc7bd1](https://github.com/openclaw/openclaw/commit/2dc7bd19cb67742a7908427d2512d7b816f4d96f), [4381c29](https://github.com/openclaw/openclaw/commit/4381c294942b342c0b7df82668fdae7883978ba8), [9eb1a05](https://github.com/openclaw/openclaw/commit/9eb1a05c49082f221547015ad7a69561d113964a), [7838bc8](https://github.com/openclaw/openclaw/commit/7838bc82b6df287946b9d45afd52f507c1e1463c), [4352eaf](https://github.com/openclaw/openclaw/commit/4352eaf6ade181654d5a729e5632a1681385b1e6), [43fe5cc](https://github.com/openclaw/openclaw/commit/43fe5cc890fc98a29af7aacd4030a0c288f76f76), [6bd1a4b](https://github.com/openclaw/openclaw/commit/6bd1a4b89f2f82da1e19b0205c80fc4bd855be6d), [531af42](https://github.com/openclaw/openclaw/commit/531af42246acecc8ee37d0ee189c8d3b8fea3af6), [305715c](https://github.com/openclaw/openclaw/commit/305715c725af26d80c69bc9daa3fad77df330139), [8f9e163](https://github.com/openclaw/openclaw/commit/8f9e1635a1d6351f9ec4a64c2624423e45b5e7a8), [2abad57](https://github.com/openclaw/openclaw/commit/2abad575d250b6e7723a660c92b5ad7fed9ea379). - Native app status and appearance choices now use the selected language across the translations in this release. Sources: [58d199b](https://github.com/openclaw/openclaw/commit/58d199bbcbd298a3e806bcf5c56eb242759dea5b), [c15348b](https://github.com/openclaw/openclaw/commit/c15348b74f6291282d79b592ec29577b2b871852), [c047a3a](https://github.com/openclaw/openclaw/commit/c047a3a9c669f12c51e3cf0f72606e53e85f7f2b), [e191685](https://github.com/openclaw/openclaw/commit/e191685be93f9a461d6346439ce227419fb41d1d), [b1e173d](https://github.com/openclaw/openclaw/commit/b1e173d4c30419f8c7f7393a9c4977f30a49ddcd), [50fecf8](https://github.com/openclaw/openclaw/commit/50fecf848c405af2902838cecb34771367f3552c), [5211afe](https://github.com/openclaw/openclaw/commit/5211afeb67cc521eb7b55cf19884e1d77c6dbbce), [4c43cf5](https://github.com/openclaw/openclaw/commit/4c43cf5eaba52ab729587c9d4f4a660638770701), [fb394de](https://github.com/openclaw/openclaw/commit/fb394de179ba7b5914b1b886795d67c17aff39e8), [ba8c1fa](https://github.com/openclaw/openclaw/commit/ba8c1fa76fe9031424cc2727c7d0f7b2cd08ecba), [7bee4f6](https://github.com/openclaw/openclaw/commit/7bee4f67d4cd66c78009497f931b8a19e03dda2a), [77ab268](https://github.com/openclaw/openclaw/commit/77ab268f79a5cee110df9ee0014b08f67368ff55), [2417d94](https://github.com/openclaw/openclaw/commit/2417d94663fdfd8770ebf00d67f0a73ae1a904cb), [9b6ef34](https://github.com/openclaw/openclaw/commit/9b6ef34f9deaa6f6fa524b860340d7000eb87ccd), [9c4274f](https://github.com/openclaw/openclaw/commit/9c4274f94570f1f41ee30350eae32255c675c38e), [2671bcc](https://github.com/openclaw/openclaw/commit/2671bcc39f8c17d55ae3e96cabf48e4d474cac19), [b21153b](https://github.com/openclaw/openclaw/commit/b21153b98d6d2bde03cd1979d6db6ecb2ad47bab), [117e8e1](https://github.com/openclaw/openclaw/commit/117e8e1e042709b6eba851fc8d208b98c43b22b9), [cc0d7e1](https://github.com/openclaw/openclaw/commit/cc0d7e1dd4c638034cafc27a93da1bb7c7735694), [e6f3f54](https://github.com/openclaw/openclaw/commit/e6f3f54ad05728d874fdc4ff492e688741785249), [dd64f66](https://github.com/openclaw/openclaw/commit/dd64f66bb981595b8558af907d628fd49322a06f), [4c16e66](https://github.com/openclaw/openclaw/commit/4c16e669b2252724cd6e68bf68d727de3edfedc9), [3a8375c](https://github.com/openclaw/openclaw/commit/3a8375c29a810d923603d9f043e3e0916548bddf), [3e3b6d6](https://github.com/openclaw/openclaw/commit/3e3b6d6669468460959f1c9a57f4cb6a84b00620), [c356245](https://github.com/openclaw/openclaw/commit/c356245fc0d04803f768b6cd0675744728618fcd), [d506201](https://github.com/openclaw/openclaw/commit/d506201c6578e5ae782c4a401cdfd46557a11b1f). - Native app license notices, acknowledgements, and unavailable-file explanations now use the selected language across the translations in this release. Sources: [34bf5a9](https://github.com/openclaw/openclaw/commit/34bf5a90b4ae2ff2b987899a44f9c6b10467f6fe), [068088c](https://github.com/openclaw/openclaw/commit/068088c7fc98d6e18d67855abb2c9ad9e6de449a), [a623ac7](https://github.com/openclaw/openclaw/commit/a623ac71eba10364e558490326273cf369d9ee3c), [71374d3](https://github.com/openclaw/openclaw/commit/71374d379b40cd080992955e57587b552e55a5f6), [a9b0de8](https://github.com/openclaw/openclaw/commit/a9b0de803789a9945c12bf37f143ae4cde2faeba), [8f495e2](https://github.com/openclaw/openclaw/commit/8f495e2f805af548d78ee1f3834bde962a86f1a9), [436dd39](https://github.com/openclaw/openclaw/commit/436dd3934328bce7d75d77998212441859a044db), [f917e89](https://github.com/openclaw/openclaw/commit/f917e893a6d3fb2005074b6a1d752cf4fd505497), [2c8b97c](https://github.com/openclaw/openclaw/commit/2c8b97cee9e056f155e2144311eccd5e5a66a6e2), [ace162b](https://github.com/openclaw/openclaw/commit/ace162b95b47d1a16e9b2dd42851af64c731a9f1), [e60cccf](https://github.com/openclaw/openclaw/commit/e60cccf8a9c95d7a158e3fe4b8f47204141fea2e), [359ea4c](https://github.com/openclaw/openclaw/commit/359ea4c19bc9251e225a130d6f9c0fcab71d0ec2), [b7bc860](https://github.com/openclaw/openclaw/commit/b7bc8600e46aca2fbac8e0ddbea1a1084db80c64), [49ea27e](https://github.com/openclaw/openclaw/commit/49ea27ecc230b49b664b594e99758400595fa80f), [99cbc58](https://github.com/openclaw/openclaw/commit/99cbc589536e7309a5f8c468de4d9795addad55f), [204526a](https://github.com/openclaw/openclaw/commit/204526ac0a2a35fd7482cac4c64ecee6ad7de0fa), [3821c36](https://github.com/openclaw/openclaw/commit/3821c36d58cebab82ebf46614413b688930e3b47), [030d184](https://github.com/openclaw/openclaw/commit/030d184254756706af637fb1eeb0a9c31036eb8c), [24f639c](https://github.com/openclaw/openclaw/commit/24f639c66ca9a05a6531d4504971f67434989324), [499feb2](https://github.com/openclaw/openclaw/commit/499feb2e2fd474c7abeff9e87743b720ba03f593), [591d099](https://github.com/openclaw/openclaw/commit/591d099897938a27c6383b17ca36e128abcf098c). - Native photo-permission controls now explain limited, selected, and recent-photo access in the selected language across the translations in this release. Sources: [c360f92](https://github.com/openclaw/openclaw/commit/c360f92563fb2221452ae599412ea61f9eee188b), [4dd027e](https://github.com/openclaw/openclaw/commit/4dd027eaa1f14356f4f7740d4258d72adb59d2f2), [9cde1ca](https://github.com/openclaw/openclaw/commit/9cde1ca97141784f89816afd9283b2d7416b9a8c), [328fb70](https://github.com/openclaw/openclaw/commit/328fb70ba730bc7bb4cd3a0eaa5e6d1d089c734c), [71e5fcc](https://github.com/openclaw/openclaw/commit/71e5fccb644b51e50f61e8e3bd6715a0fd717a58), [b11d710](https://github.com/openclaw/openclaw/commit/b11d710e524f7d6d664ea5857f358f4ebbaff6e4), [55a2a9b](https://github.com/openclaw/openclaw/commit/55a2a9b0f0c4c56d03292b930ed116a146322e6c), [c4b40d0](https://github.com/openclaw/openclaw/commit/c4b40d0b2a008c1ba1bae82a180e455bc8656e00), [3a1b983](https://github.com/openclaw/openclaw/commit/3a1b983bc227f67ac0862f1761d53f6a3fee083d), [dea40a5](https://github.com/openclaw/openclaw/commit/dea40a5f96307e9da0862bbc774100f799110d6c), [4b1fab8](https://github.com/openclaw/openclaw/commit/4b1fab8047319bc07e47ef8136a9c83594729ed8), [44ca739](https://github.com/openclaw/openclaw/commit/44ca739f77ab7dfaa1f096627e84bc79e859b849), [d36452c](https://github.com/openclaw/openclaw/commit/d36452cc0bd66722f426c7c686859cbfcb1e9f24), [a50a59e](https://github.com/openclaw/openclaw/commit/a50a59e64802a1263bd8befe6c4bea57e055499e), [49b68e1](https://github.com/openclaw/openclaw/commit/49b68e1039347867c227e992fa7fcfac3e58f932), [122e4ba](https://github.com/openclaw/openclaw/commit/122e4ba3a30f32b8d563d7afa2f60cc4cd6c431b), [4086d35](https://github.com/openclaw/openclaw/commit/4086d35caf54c3a9759b21ad5f83536cdf08c2bc), [547a563](https://github.com/openclaw/openclaw/commit/547a563e4ca3cf6d573cf6210db3ffbedb592175), [538f28a](https://github.com/openclaw/openclaw/commit/538f28abce55949ee0a412da07664092427413d1), [c5afa92](https://github.com/openclaw/openclaw/commit/c5afa92c1f8ac63a9c01b7971acabcfb1d6f948f), [32a986d](https://github.com/openclaw/openclaw/commit/32a986d21c170741b5505870dd0a2e98ec410b1d). - Native skill availability, Gateway setup, diagnostics, privacy, and access guidance now use the selected language across the translations in this release. Sources: [fdcd5c0](https://github.com/openclaw/openclaw/commit/fdcd5c0eb0c2493f5d3845fcf76a02f4e1a6d6ba), [26f6735](https://github.com/openclaw/openclaw/commit/26f673526e7a6680df175570da67baf6fe5abeed), [5220eff](https://github.com/openclaw/openclaw/commit/5220effc10c92cec20abb6df0c5acdaa40e56ad6), [bb7dbda](https://github.com/openclaw/openclaw/commit/bb7dbda027b9451281f2d81d2f4cbad9a003599c), [952245b](https://github.com/openclaw/openclaw/commit/952245b49c4b6743afc9ad97f6f3e48af407e5ed), [edb1e74](https://github.com/openclaw/openclaw/commit/edb1e74645ebba0b8992863a9d395d80fd10498f), [f7bad57](https://github.com/openclaw/openclaw/commit/f7bad5749b9a441a6b55d1dc34cf9ef037270960), [0602930](https://github.com/openclaw/openclaw/commit/060293056b33ff1a44dd5ab6f44ff8783d612f31), [e779b8f](https://github.com/openclaw/openclaw/commit/e779b8f1bde92173dcaeadd87853a458656dd7b3), [0400be7](https://github.com/openclaw/openclaw/commit/0400be7118c03b6e3c2330fc31d9451e5a2c0151), [851d0ad](https://github.com/openclaw/openclaw/commit/851d0ad7354321ccad43ecf5f7c04abd168da0dc), [1e0dd95](https://github.com/openclaw/openclaw/commit/1e0dd95e5d9a0bb4d62dd72ce451a9902b4eb6d3), [703e1ad](https://github.com/openclaw/openclaw/commit/703e1adadefe213c4fcc312ccb4aead7b120a3a1), [1c93e50](https://github.com/openclaw/openclaw/commit/1c93e509a36673ee8a58b0c1aa6c4b9a9a00a5e8), [37c45f2](https://github.com/openclaw/openclaw/commit/37c45f28fbbdbd768bd7fefa8d8a94274d075aa9), [8fe917b](https://github.com/openclaw/openclaw/commit/8fe917b4f7784e44dabcb6cf7b673da74bf3753e), [da21e4b](https://github.com/openclaw/openclaw/commit/da21e4b8dd47fc174cef6e3373471aba37f851e0), [f4f63b1](https://github.com/openclaw/openclaw/commit/f4f63b187041cd20fe4016ad62d85ad59b94fa66), [3e4febb](https://github.com/openclaw/openclaw/commit/3e4febbe68f82d8ee06977486a0f50ecba933452), [a82cd35](https://github.com/openclaw/openclaw/commit/a82cd35ed5405a5cca392a5272fe898264eaf107), [52323b6](https://github.com/openclaw/openclaw/commit/52323b67c5872f5c396ad2eb5e5749bfa1a63f6e). - Native Gateway connection, diagnostics, permissions, onboarding, Chat, and Talk guidance now uses the selected language across the translations in this release. Sources: [3b27bb4](https://github.com/openclaw/openclaw/commit/3b27bb4536a3bdc4b6bdf82fc59f878e478121d0), [e296d14](https://github.com/openclaw/openclaw/commit/e296d1447eb7b7666100e34169b0cd27b07e759c), [5516775](https://github.com/openclaw/openclaw/commit/5516775933a84f3bc88f9a485d7f53ad2d9e5928), [6ec4962](https://github.com/openclaw/openclaw/commit/6ec49620baf962ecbd2c69f0299fd98410f18a8f), [291f2a4](https://github.com/openclaw/openclaw/commit/291f2a477373c01cde9aac0f36438b9073b7677e), [7e2d41b](https://github.com/openclaw/openclaw/commit/7e2d41b94c7a11ba96abe1839819e7c63c3e6c87), [81bc96f](https://github.com/openclaw/openclaw/commit/81bc96f70f9e50fcf7cbbe014d0e6f9b10ff35d0), [574556c](https://github.com/openclaw/openclaw/commit/574556cd32d816436209d006d6744273b82a0276), [8bb44e6](https://github.com/openclaw/openclaw/commit/8bb44e60d0cf740d13663d40a780fa28705eeeed), [ae09908](https://github.com/openclaw/openclaw/commit/ae09908259e163598eea8170640255aa6d8c04ce), [42fc19d](https://github.com/openclaw/openclaw/commit/42fc19d77e93e7a41ce634c43f3317d3e123fd6a), [28bbb43](https://github.com/openclaw/openclaw/commit/28bbb439f6398a3e48fa8a88e67879290bb70ea0), [6ff9185](https://github.com/openclaw/openclaw/commit/6ff9185637fc3ab0fd1f966355fc7cfe505863e8), [4be0be6](https://github.com/openclaw/openclaw/commit/4be0be697fb95444596f9d604cf54ea4ecd12943), [0f1fbbe](https://github.com/openclaw/openclaw/commit/0f1fbbe8779dfbe317bf99de0a45aebcdadec1ea), [d893a72](https://github.com/openclaw/openclaw/commit/d893a724f6f0e91161a93a223d01057c04cd8db4), [f5cb29b](https://github.com/openclaw/openclaw/commit/f5cb29b2881edf85de14569adbfaea44b7b02056). - Wake Words and Discovery Logs now use current, natural labels across supported non-English native app locales. [de30d2f](https://github.com/openclaw/openclaw/commit/de30d2f5c333d49004f0771f529b578ed1af6f17) - Supported non-English native apps now translate workspace file browsing and sharing, image preview failures, offline status, and custom Gateway header controls. [6b99fd9](https://github.com/openclaw/openclaw/commit/6b99fd9a94ce99023c77e733efe7943e4f51c285) - OpenClaw's mascot now uses the same float, blink, antenna, and claw animations across web, iOS, and Android surfaces while respecting reduced-motion preferences. [851156a](https://github.com/openclaw/openclaw/commit/851156af3b35b56c56d8d20fff7fb97104d13d1a) #### Android ##### Setup, navigation, and app tools - New Android users now get a guided first-run path through setup-code or QR entry, Gateway pairing, node approval, permissions, recovery steps, and confirmed phone readiness before onboarding completes. [#98752](https://github.com/openclaw/openclaw/pull/98752) Thanks @jesse-merhi. - Android users can open an agent-workspace shell from Settings > Terminal, with clear connection guidance and Gateway credentials passed without placing the token in the URL when supported. [fcd7eb6](https://github.com/openclaw/openclaw/commit/fcd7eb6130ed0d3de4a850bda6434f6a8b67664f) - Android users can sideload the official signed `OpenClaw-Android.apk` from a stable GitHub release and verify it with the published SHA-256 checksums. [#101212](https://github.com/openclaw/openclaw/pull/101212) - Android node reconnects now point users from a failed `devices approve` attempt to the correct `openclaw nodes approve <requestId>` command, including a reminder to reuse connection flags. [#98115](https://github.com/openclaw/openclaw/pull/98115) Thanks @welfo-beo. - Android SMS commands now clearly distinguish phone permission from the Gateway's separate opt-in, allowing read-only `sms.search` without also enabling `sms.send`. [#100993](https://github.com/openclaw/openclaw/pull/100993) Thanks @narcissus0702. - Android notification forwarding now leaves WhatsApp, Telegram, Discord, and Signal messages with their dedicated channel sessions, preventing duplicate or wrong-conversation replies while other selected apps continue to follow forwarding rules. [#101170](https://github.com/openclaw/openclaw/pull/101170) - Android Canvas content can no longer navigate to device-local web services, while normal remote and Gateway-hosted pages continue to work. [#99874](https://github.com/openclaw/openclaw/pull/99874) Thanks @ly85206559. - Android release builds no longer expose detailed `camera.clip` settings, device data, temporary paths, and recording events in production logs. [#99484](https://github.com/openclaw/openclaw/pull/99484) Thanks @nianjiuzst. - Android Back navigation now returns users from Gateway or Talk settings, Sessions, and Providers to the Voice, Chat, or command-palette tab where they started. [#98914](https://github.com/openclaw/openclaw/pull/98914) Thanks @lokimorty. - Android now presents evenly spaced bottom tabs and avoids the chat-cache startup crash that could block entry to the post-onboarding shell. [#100382](https://github.com/openclaw/openclaw/pull/100382) Thanks @iwhatsskill. - Android's Home overview now uses more consistent card, Talk, and recent-session spacing for a calmer, easier-to-tap first screen. [#100059](https://github.com/openclaw/openclaw/pull/100059) Thanks @iwhatsskill. - Android's command palette now keeps action and session rows visually aligned, with consistent icons, navigation spacing, and clean truncation for long labels. [#101072](https://github.com/openclaw/openclaw/pull/101072) Thanks @iwhatsskill. - Android users can open a scheduled job to inspect its timing, payload, delivery state, recent results, errors, and exact ID. [#95107](https://github.com/openclaw/openclaw/pull/95107) Thanks @tosko4. - The Android Files card now lets users browse the active agent workspace, preview text and images, and share output directly from their phone. [#100776](https://github.com/openclaw/openclaw/pull/100776) - Android users can now read bundled third-party and open-source license notices directly from Settings > Licenses. [#99299](https://github.com/openclaw/openclaw/pull/99299) Thanks @joshavant. - Android's About screen now clearly identifies OpenClaw and provides direct links to the website, documentation, source repository, and Discord community. [#100994](https://github.com/openclaw/openclaw/pull/100994) ##### Chat and sessions - Android Chat now includes a New chat action and a `/` command browser that filters the current agent's advertised commands without dropping command arguments. [#98796](https://github.com/openclaw/openclaw/pull/98796) Thanks @iwhatsskill, @solvely-colin. - Android Chat now lets users choose and verify the configured agent for new messages, with Chat, Talk mode, and the home canvas staying aligned to that selection. [#80422](https://github.com/openclaw/openclaw/pull/80422) Thanks @bcperry. - Android chats now render links, lists, quotes, emphasis, code, and plain text consistently through the shared Markdown renderer. [#88899](https://github.com/openclaw/openclaw/pull/88899) Related [#88014](https://github.com/openclaw/openclaw/issues/88014). Thanks @iman-sharif, @pluviobyte. - Android chat now adds light- and dark-mode syntax highlighting to supported fenced code, making code-heavy replies easier to scan without delaying partial or oversized messages. [#100217](https://github.com/openclaw/openclaw/pull/100217) - Android chat now restores an active response with buffered text after reconnecting or reopening, and recovers missed event gaps without duplicating transcript rows. [#100384](https://github.com/openclaw/openclaw/pull/100384) - Android chat now keeps sent messages and active replies stable through reconnects, reconciling delayed history without duplicate turns or stale composer activity. [#100551](https://github.com/openclaw/openclaw/pull/100551) - Android chats now keep internal reasoning, tool results, and raw operational details out of both live conversations and reopened offline caches. [#100826](https://github.com/openclaw/openclaw/pull/100826) Thanks @iman-sharif. - Android users can long-press a completed chat message to copy all text, select an excerpt, share it, or quote it in a reply without losing their current draft. [#100879](https://github.com/openclaw/openclaw/pull/100879) Thanks @bdhwan. - Android chat users can preview a link's destination and summary before opening it, without messages triggering background lookups and with a clear unavailable state when inspection fails. [#100898](https://github.com/openclaw/openclaw/pull/100898) - Android's model picker now stays aligned with the active chat and agent, and a failed model change no longer sends the next message with the previous model. [#100985](https://github.com/openclaw/openclaw/pull/100985) - Android hides thinking controls for models that do not support configurable reasoning, prevents unsupported settings from breaking live or queued sends, and restores the user's preference on compatible models. [#101002](https://github.com/openclaw/openclaw/pull/101002) - Android users can search sessions by name, label, or key beyond the currently loaded Recent or Archived window, with cached active-session matches still available during a temporary Gateway outage. [#101102](https://github.com/openclaw/openclaw/pull/101102) - Android users with a physical keyboard can press Enter to send a chat message while modified Enter combinations remain available for multiline text. [#101321](https://github.com/openclaw/openclaw/pull/101321) Thanks @3ninyt3nin-creator. - Android users can now see safe page thumbnails in expanded link previews, while bad or blocked images quietly leave the text preview intact. [#101396](https://github.com/openclaw/openclaw/pull/101396) - Android users can now archive a chat session and delete it from the Archived view even with the app's bounded operator permissions. [#101522](https://github.com/openclaw/openclaw/pull/101522) - Android users with a hardware keyboard can now send from the chat composer with Enter, while an unaccepted send still preserves the draft. [de8db74](https://github.com/openclaw/openclaw/commit/de8db7405850146199c5f4e6e9efa0704878eea4) Thanks @vincentkoc. - Android users can switch the current chat's model from the composer, pin favorites, revisit recent choices, and return to the default without leaving the conversation; older pairings may need to be renewed. [#100798](https://github.com/openclaw/openclaw/pull/100798) - Android chat now renders top-level display LaTeX as readable equations while invalid or still-streaming math remains visible as text. [#101435](https://github.com/openclaw/openclaw/pull/101435) - Android's thread picker now prioritizes real conversations, hides internal setup and device sessions, and still makes valid older chats available through All. [#99557](https://github.com/openclaw/openclaw/pull/99557) Thanks @ly85206559. - Returning to an already loaded Android chat no longer flashes a loading screen, and the Overview recent-session list stays deduplicated and steadier during refreshes. [#100966](https://github.com/openclaw/openclaw/pull/100966) Thanks @solvely-colin. - Android Home's Recent Sessions section now keeps recently active rows in a stable order, collapses duplicates, and preserves labels and timestamps during partial live refreshes. [#101161](https://github.com/openclaw/openclaw/pull/101161) Thanks @solvely-colin. - Android physical-keyboard users can press or hold Enter to send once without leaving a stray newline, while Shift+Enter and in-progress input-method composition keep working. [#101360](https://github.com/openclaw/openclaw/pull/101360) Thanks @3ninyt3nin-creator, @joshavant. - Expanded Android link previews now keep thumbnail memory within a byte budget, reducing excessive memory retention during long chats. [#101560](https://github.com/openclaw/openclaw/pull/101560) ##### Gateway setup and connections - Android can now keep multiple Gateways paired and switch among them without repeating setup, while each Gateway retains its own credentials, chat state, queued messages, and removable local data. [#100947](https://github.com/openclaw/openclaw/pull/100947) - Android Gateway actions now stop promptly when their connection closes, while requests started after reconnect are not cancelled by old cleanup. [#98067](https://github.com/openclaw/openclaw/pull/98067) Thanks @nianjiuzst. - Android connection recovery now identifies expired setup codes, stale credentials, and missing or invalid authentication with the appropriate next step. [#98094](https://github.com/openclaw/openclaw/pull/98094) Thanks @qingminglong. - Android can reconnect to the same Gateway without erasing saved access when credential fields are blank, while endpoint and setup-code changes avoid carrying stale credentials silently. [#98277](https://github.com/openclaw/openclaw/pull/98277) Thanks @solvely-colin. - Android now gives clearer TLS verification guidance for reachable remote and Tailnet Gateways and allows slow valid handshakes more time to show the trust prompt. [#98366](https://github.com/openclaw/openclaw/pull/98366) Related [#98365](https://github.com/openclaw/openclaw/issues/98365). Thanks @joshavant. - Android can now pair with local Gateways advertised by standard cleartext `.local` names while continuing to reject unsafe remote or ambiguous cleartext addresses. [#98439](https://github.com/openclaw/openclaw/pull/98439) Thanks @joshavant. - Scanning a valid Gateway setup QR code on Android now starts pairing immediately and advances to recovery or approval instead of leaving users on setup. [#98483](https://github.com/openclaw/openclaw/pull/98483) Thanks @joshavant. - Android Gateway setup now replaces a generic authentication warning with specific recovery labels for expired setup codes, missing or invalid credentials, stale saved authentication, and required device identity. [#98698](https://github.com/openclaw/openclaw/pull/98698) Related [#98046](https://github.com/openclaw/openclaw/issues/98046). Thanks @ccaprani, @masatohoshino. - Android gateway setup now gives specific recovery actions for expired codes, stale credentials, pending node approval, and terminal authentication failures. [#99414](https://github.com/openclaw/openclaw/pull/99414) Related [#98045](https://github.com/openclaw/openclaw/issues/98045), [#98046](https://github.com/openclaw/openclaw/issues/98046). Thanks @ccaprani. - Android manual Gateway setup now defaults blank ports to 18789 for ordinary TLS and cleartext hosts while retaining port 443 for Tailscale MagicDNS. [#99865](https://github.com/openclaw/openclaw/pull/99865) Thanks @ly85206559. - Saved Android Gateway sessions now reconnect promptly when validated internet access returns, without unnecessary retries during captive or partial network changes. [#100347](https://github.com/openclaw/openclaw/pull/100347) Thanks @ly85206559. - Android Gateway settings now give connection details, setup fields, and helper text more stable space on phone-sized screens, reducing clipping and crowding. [#100363](https://github.com/openclaw/openclaw/pull/100363) Thanks @iwhatsskill. - Android now isolates cached conversations and queued commands when users re-pair, sign out, or replace Gateway credentials, preventing a new identity from inheriting the previous one's data. [#100454](https://github.com/openclaw/openclaw/pull/100454) - Android onboarding now finishes after permission-triggered node approval instead of trapping users in a loop between the Permissions and approval screens. [#100959](https://github.com/openclaw/openclaw/pull/100959) - Android users can now connect to Gateways behind Cloudflare Access or another authenticating reverse proxy by saving the required credential headers in Advanced manual-connection settings. [#100765](https://github.com/openclaw/openclaw/pull/100765) - When Android Chat cannot reach the Gateway, users can open Gateway Settings or copy connection diagnostics directly from the blocked screen. [#94566](https://github.com/openclaw/openclaw/pull/94566) Thanks @tosko4. - Android manual Gateway setup now accepts IPv6 hosts such as `::1` directly instead of rejecting an address that works only when entered as a bracketed WebSocket URL. [#99107](https://github.com/openclaw/openclaw/pull/99107) Thanks @ly85206559. - Android manual setup now accepts and preserves complete `ws://`, `wss://`, and HTTP Gateway addresses, including embedded ports, so private-LAN onboarding reaches the intended server. [#99110](https://github.com/openclaw/openclaw/pull/99110) Related [#87216](https://github.com/openclaw/openclaw/issues/87216). Thanks @cursoragent, @ly85206559, @ruben2000de. - Android setup now rejects gateway URLs with unsupported IPv6 interface zones and directs users to an unscoped address or LAN hostname before saving. [#99570](https://github.com/openclaw/openclaw/pull/99570) Thanks @ly85206559. - Android now preserves specific Gateway and A2UI error codes containing numbers, such as `A2UI_HOST_UNAVAILABLE`, instead of replacing them with a generic failure. [#99591](https://github.com/openclaw/openclaw/pull/99591) Thanks @ly85206559. - Android Gateway settings now show both setup actions as full-width buttons, keeping `Pair New Gateway` readable and easy to tap. [#100090](https://github.com/openclaw/openclaw/pull/100090) Thanks @iwhatsskill. - The Android app now respects a user's disconnect, connect, or gateway-switch choice during startup and reports final disconnect failures to fire-and-forget callers. [#101799](https://github.com/openclaw/openclaw/pull/101799) ##### Voice and Talk - Android users can record and send a voice note of up to three minutes from the chat composer without entering live Talk mode. [#101193](https://github.com/openclaw/openclaw/pull/101193) - Android background push-to-talk requests now return `NODE_BACKGROUND_UNAVAILABLE` instead of attempting a microphone start that the operating system may reject. [#98055](https://github.com/openclaw/openclaw/pull/98055) Thanks @nianjiuzst. - Android now reports Realtime Talk and Dictation readiness separately, opens setup only for the mode that needs it, and keeps useful provider failure details visible. [#98269](https://github.com/openclaw/openclaw/pull/98269) Related [#98268](https://github.com/openclaw/openclaw/issues/98268). Thanks @solvely-colin. - Android Talk and Dictation now use a connected Bluetooth headset microphone for hands-free capture and fall back cleanly when it disconnects. [#99259](https://github.com/openclaw/openclaw/pull/99259) Related [#96241](https://github.com/openclaw/openclaw/issues/96241). Thanks @gwtaylor. - Android push-to-talk now takes exclusive microphone control during Talk Mode and resumes the correct realtime listener afterward, preventing duplicate capture. [#99986](https://github.com/openclaw/openclaw/pull/99986) Thanks @nianjiuzst. - Android push-to-talk now cleans up backgrounded, cancelled, or retried captures without reopening the microphone or stopping a newer voice session, and overlapping requests return busy. [#100552](https://github.com/openclaw/openclaw/pull/100552) Thanks @xialonglee. - Android users can now long-press an assistant reply and choose Listen, with visible playback status, tap-to-stop, and on-device speech fallback. [#100772](https://github.com/openclaw/openclaw/pull/100772) - Android Talk Mode now keeps push-to-talk busy until the active turn is safely handed off, preventing overlapping microphones, stale playback, or the wrong relay resuming. [#100786](https://github.com/openclaw/openclaw/pull/100786) - Android voice features now speak only chat events explicitly identified as assistant replies, preventing user, tool, system, or role-less text from being read aloud. [#99123](https://github.com/openclaw/openclaw/pull/99123) Thanks @ly85206559. - Android Talk now applies supported directive values even when generated or dictated JSON uses different capitalization for keys such as `Voice` or `Language_Code`. [#99592](https://github.com/openclaw/openclaw/pull/99592) Thanks @ly85206559. - Android Talk Mode now delivers agent-consult answers even when realtime completion events arrive out of order, preventing sessions from remaining stuck on `Thinking...`. [#100049](https://github.com/openclaw/openclaw/pull/100049) Thanks @qingminglong. - Android Voice and Talk setup text now truncates cleanly on narrow screens and at larger accessibility font sizes instead of appearing clipped. [#100060](https://github.com/openclaw/openclaw/pull/100060) Thanks @iwhatsskill, @solvely-colin. - The Android Voice tab now gives Realtime Talk and Dictation text and controls enough room to remain readable on phones and at larger font sizes. [#100491](https://github.com/openclaw/openclaw/pull/100491) Thanks @iwhatsskill. ##### Device permissions, notifications, and capture - Third-party Android builds can allow Gateway-requested location checks while the app is in the background by selecting Location > Always and granting Android's persistent location permission. [#100967](https://github.com/openclaw/openclaw/pull/100967) Thanks @ioridev. - Android notification automations now queue accepted events during Gateway connection or reconnection and deliver them in order once the link is ready. [#92602](https://github.com/openclaw/openclaw/pull/92602) Related [#79552](https://github.com/openclaw/openclaw/issues/79552). Thanks @ashishpatel26, @hectorrp13. - Android one-shot camera captures now turn the camera and privacy indicator off promptly after success, failure, or cancellation. [#98040](https://github.com/openclaw/openclaw/pull/98040) Thanks @nianjiuzst. - Android's selected-photos permission now counts as usable access, allowing `photos.latest` while clearly showing how to manage the limited selection. [#98059](https://github.com/openclaw/openclaw/pull/98059) Thanks @nianjiuzst. - Android onboarding now marks Contacts and Calendar ready only after both read and write access are available, including when those permissions arrive in separate prompts. [#99158](https://github.com/openclaw/openclaw/pull/99158) Thanks @nianjiuzst. - Android now reports Contacts and Calendar access as granted only when both reading and adding entries are authorized, preventing misleading setup results. [#99204](https://github.com/openclaw/openclaw/pull/99204) Thanks @nianjiuzst. - The Android companion no longer forwards OpenClaw's own notifications back to the Gateway, even when older allowlists still include the app package. [#99568](https://github.com/openclaw/openclaw/pull/99568) Thanks @ly85206559. - Android third-party onboarding now recognizes SMS access when send and read permissions are granted in separate prompts, while genuinely missing permissions remain unauthorized. [#99147](https://github.com/openclaw/openclaw/pull/99147) Thanks @nianjiuzst. - Cancelled, timed-out, failed, or interrupted Android `camera.clip` requests now release the camera and remove unfinished temporary files before later camera commands run. [#99153](https://github.com/openclaw/openclaw/pull/99153) Thanks @nianjiuzst. - Android node commands now honor common boolean values such as `yes`, `no`, `1`, and `0` for app filters and camera audio options. [#99873](https://github.com/openclaw/openclaw/pull/99873) Thanks @ly85206559. - Tapping an Android notification created by `system.notify` now brings OpenClaw to the foreground. [#100888](https://github.com/openclaw/openclaw/pull/100888) ##### Localization - Android's "New chat in worktree" action is now translated across supported non-English locales instead of appearing with a missing resource. [#100805](https://github.com/openclaw/openclaw/pull/100805) Thanks @amknight. - Android users in supported languages now see key Gateway setup, connection, trust, shell, and recovery prompts in their device language. [#97111](https://github.com/openclaw/openclaw/pull/97111) Thanks @vincentkoc. - Indonesian Android strings ship under Android's recognized locale; the same prior-release work also prepared the 2026.6.11 Play version and store text. [3412318](https://github.com/openclaw/openclaw/commit/341231831b706df0024d2d9e2096438e3581b5af) Thanks @joshavant. - Traditional Chinese users now see localized wording for common native app actions, permissions, connection messages, and mobile states. [f0d2066](https://github.com/openclaw/openclaw/commit/f0d2066787f172079c19f26b72f49ad3950ceea6) - Android now explains in the selected language how to keep a saved token or replace an existing Gateway setup. Sources: [32f3eb3](https://github.com/openclaw/openclaw/commit/32f3eb3fa805e776f562ea1af6f7731bf4ce8b48), [6336762](https://github.com/openclaw/openclaw/commit/6336762b68e5cebd44acbda527ba1d964448355a), [eeb0682](https://github.com/openclaw/openclaw/commit/eeb0682409b86dcd956ffe30e45f12c6424d8c05), [ed72b86](https://github.com/openclaw/openclaw/commit/ed72b860a436eb187c9fa2fb4ef91ecb13180760), [e376f28](https://github.com/openclaw/openclaw/commit/e376f285e87bfa07bf3111b446b9e44fcba6cd9e), [a6631fe](https://github.com/openclaw/openclaw/commit/a6631fee6d465b30e116038d8e6e8aa1f041019c), [283bd82](https://github.com/openclaw/openclaw/commit/283bd82eb414f0ba968157aec77eac7701e7ae1e), [6d5a1db](https://github.com/openclaw/openclaw/commit/6d5a1db04859adbf8860376ddbd5ce1b5d5f3efa), [d3087fc](https://github.com/openclaw/openclaw/commit/d3087fcf375c81b81ffb0cf7b65764559b6e836f), [8bab3f7](https://github.com/openclaw/openclaw/commit/8bab3f7dbd8364de93422d064c00c7171139ccf4), [dfb7bc8](https://github.com/openclaw/openclaw/commit/dfb7bc84d8194177988d2870fe17b963912a1c52), [7780e30](https://github.com/openclaw/openclaw/commit/7780e3062dcb547227d90cbd02111910e00e3f6f), [b109b88](https://github.com/openclaw/openclaw/commit/b109b88b5785b22fea0fe20f06b314dbda156d58), [c1b7bf2](https://github.com/openclaw/openclaw/commit/c1b7bf23bc16d641e966ff4de7cbb8b2becfaddc), [dedb17c](https://github.com/openclaw/openclaw/commit/dedb17ceff3c93c938aaff5c3f697d70d06e9dd1), [6f84c10](https://github.com/openclaw/openclaw/commit/6f84c10bdae1f73b112777c9a94d5933171d4b75), [a8358e8](https://github.com/openclaw/openclaw/commit/a8358e8848c8228893a259b36cd6f54139fa18da), [2501ca3](https://github.com/openclaw/openclaw/commit/2501ca340945072642b9bb2ec1348a15de83d4b6), [1b40eb9](https://github.com/openclaw/openclaw/commit/1b40eb9e6a2feb0c436948fbcd113424e85db01e), [d47308f](https://github.com/openclaw/openclaw/commit/d47308f8008ca08c7df983d3932c63d4ede4060c), [3a2baef](https://github.com/openclaw/openclaw/commit/3a2baef0bfc62b0d37b4f7648869e57fabaa3cb3). - Android pairing and connection failures now provide localized next steps for expired codes, credentials, approvals, and retries. Sources: [48eae1b](https://github.com/openclaw/openclaw/commit/48eae1b8c96d9e8873ba59ccc6e2493fa847c27e), [f095eb9](https://github.com/openclaw/openclaw/commit/f095eb9fd989020ad1bdd57a57702ce899f98607), [714c2b0](https://github.com/openclaw/openclaw/commit/714c2b07bdf715055205b550018d289e4fb06948), [d2b5bb7](https://github.com/openclaw/openclaw/commit/d2b5bb72e8e3b61dac5ddc7085fb0b5dfe53a18c), [d2551bd](https://github.com/openclaw/openclaw/commit/d2551bdd3cf53973d679a47f3e753fc0d75f3edb), [6b91507](https://github.com/openclaw/openclaw/commit/6b915072208b121055000ef1d3a36578eac4da2e), [f1c4476](https://github.com/openclaw/openclaw/commit/f1c44762771edb9fe2124a15c871dc466b215c43), [5ef6fb4](https://github.com/openclaw/openclaw/commit/5ef6fb4d7cd053e1caa0d1caf27ff93f7bb3311c), [e2e0312](https://github.com/openclaw/openclaw/commit/e2e03127240c1878b3ea6a336fd91bd995a2be83), [7fb70b2](https://github.com/openclaw/openclaw/commit/7fb70b235d1d7d4ece6519b27f2d65d51999272c), [d702f5c](https://github.com/openclaw/openclaw/commit/d702f5c6e6c4f1463c82c4f74d96765b316f76bf), [24e6b9f](https://github.com/openclaw/openclaw/commit/24e6b9fbe1b9449b837fecddf1f9b160ed7bb896), [7cb41cc](https://github.com/openclaw/openclaw/commit/7cb41ccc63f51208630426e08ceef65e78b02bf9), [a6040c3](https://github.com/openclaw/openclaw/commit/a6040c3560c18005b58aed73a687b8c0d06b7d6b), [5e61da3](https://github.com/openclaw/openclaw/commit/5e61da3deb190b16899157ace98aa520b424e085), [18360ac](https://github.com/openclaw/openclaw/commit/18360ac668f82631f61cf48d0816800385f4cf05), [17a1e3b](https://github.com/openclaw/openclaw/commit/17a1e3bbb2b8de1da6569fe4f46a4ea4138c56e6), [adafb56](https://github.com/openclaw/openclaw/commit/adafb56b2eb9207d93896ebf6c5faa9205875833), [5b5fadb](https://github.com/openclaw/openclaw/commit/5b5fadbf0d17c1fddb13d891037767beb64aa144), [9b30570](https://github.com/openclaw/openclaw/commit/9b30570a935ecdae8ee0e2bc45a42ffdd7223948), [d331a36](https://github.com/openclaw/openclaw/commit/d331a36250f8ebb29bda2ae8fa480a2aa5e15193). - Android Gateway discovery, QR and manual setup, connection checks, approvals, and permission guidance now use the selected language across the translations in this release. Sources: [28062c8](https://github.com/openclaw/openclaw/commit/28062c868c03e1e6876013d450c8f92bf1fc2faf), [3d43858](https://github.com/openclaw/openclaw/commit/3d438588c5eb0497bdb2fbccf9d6f6cd325d0ec5), [ad74b32](https://github.com/openclaw/openclaw/commit/ad74b322ba80178c1c0f68348a55d5d3e65e64ae), [1b07620](https://github.com/openclaw/openclaw/commit/1b076209c4d2ea37a7178b50f5ba5c54b5753c2b), [4fa4c9e](https://github.com/openclaw/openclaw/commit/4fa4c9e06e39e095a7373390240b3a5a5cf1be79), [1dd5230](https://github.com/openclaw/openclaw/commit/1dd52307fcd74bc25ea31800a4c551bc415f7645), [9db7ec5](https://github.com/openclaw/openclaw/commit/9db7ec5edd62e3f05758a28a6c6acb14f6889ea5), [e6f8788](https://github.com/openclaw/openclaw/commit/e6f8788bf5569e87e9df0d3e404eaef5f86184ab), [e5cf67e](https://github.com/openclaw/openclaw/commit/e5cf67ea1d73d9724a227000eadead902fa606a9), [b52d988](https://github.com/openclaw/openclaw/commit/b52d98861e8c14f30dc459c395fd60281fa99604), [cd3b4ee](https://github.com/openclaw/openclaw/commit/cd3b4eee7d104d266d8514afea2ae53eea435e9d), [c3bcb9f](https://github.com/openclaw/openclaw/commit/c3bcb9fa21ec5f1b98bdb89940e93707b8f9a3e1), [8af3aa0](https://github.com/openclaw/openclaw/commit/8af3aa0b1bfa3f5d2950b053a8d7d2568cbbea31), [c34e79e](https://github.com/openclaw/openclaw/commit/c34e79e7299b19267000a79bb94bcae9608f93a1), [c9c8f6c](https://github.com/openclaw/openclaw/commit/c9c8f6c9f6a9ebf337ff486c15b9cc4d43904ffe), [255e251](https://github.com/openclaw/openclaw/commit/255e2518de492d518cde78617f6c5b220bb1278d), [0e98ba4](https://github.com/openclaw/openclaw/commit/0e98ba4391dddfa9bcd48a978b5cd1df8ae03411), [0cc9927](https://github.com/openclaw/openclaw/commit/0cc9927577c6663a5839a4d2ad3e5708df04157a), [97955d9](https://github.com/openclaw/openclaw/commit/97955d969d83a158a70c23912703e92b69b0883a), [ba449f2](https://github.com/openclaw/openclaw/commit/ba449f240d4e437752be44bef76e93c177454ca4), [0e22e54](https://github.com/openclaw/openclaw/commit/0e22e54431f5740b65ddbfcc307bd6b3c1f43eea), [ae65251](https://github.com/openclaw/openclaw/commit/ae65251fdf5ebfa7213a7d36f64a5bbb8883eb4c), [d957f5a](https://github.com/openclaw/openclaw/commit/d957f5a7900e134b514915cee07c45bb0c2a54be). - Android now explains in the selected language when a scoped IPv6 address must be replaced with an unscoped address or LAN hostname. Sources: [5793f73](https://github.com/openclaw/openclaw/commit/5793f731f54f1de387a49e014a632517450f75a2), [066e697](https://github.com/openclaw/openclaw/commit/066e6973b084c62717a2e9ac99b84e99459597b7), [bf35947](https://github.com/openclaw/openclaw/commit/bf35947eb2695740e61cdd180fde44b4308ba472), [3385817](https://github.com/openclaw/openclaw/commit/3385817658496c88166f16cdbcbb0dbd3b8419b5), [a0a5054](https://github.com/openclaw/openclaw/commit/a0a5054b93bf842ff4dd281dac2617129dd9900c), [66cb9a9](https://github.com/openclaw/openclaw/commit/66cb9a99b1d9c30589fcc9b42144c95322bd30ab), [3da73a7](https://github.com/openclaw/openclaw/commit/3da73a77fe51060659a3ad69018a65e19cf21837), [df659ec](https://github.com/openclaw/openclaw/commit/df659eca87253824b5eccaa1939fa38877a87e7e), [57a3975](https://github.com/openclaw/openclaw/commit/57a3975ce14062de887707e38ab580b20ff39421), [141b2cf](https://github.com/openclaw/openclaw/commit/141b2cf4d10cb33a487e62c7e304aba88b135da1), [b043adf](https://github.com/openclaw/openclaw/commit/b043adf192bb64e8ff64bbf6b9631e30a4446f1e), [dcc4fa8](https://github.com/openclaw/openclaw/commit/dcc4fa874683a59f86656be19adfc05b688cc3ea), [eade8f1](https://github.com/openclaw/openclaw/commit/eade8f1c1a142eefa47a2657ef77a352944506cc), [72a8098](https://github.com/openclaw/openclaw/commit/72a809840890575654f7d293631965af0541f9e9), [355fa77](https://github.com/openclaw/openclaw/commit/355fa773f8ac13c433eea42f4e575c895b224863), [8cc1786](https://github.com/openclaw/openclaw/commit/8cc1786f495af1c7c55ac5f2b145ff7df25853dd), [a3ef37b](https://github.com/openclaw/openclaw/commit/a3ef37b991533671eae13ddbd25324bc5f9c4749), [cb9ac50](https://github.com/openclaw/openclaw/commit/cb9ac50f5bc7f8148eeacbf8b921ebaa3bab6680), [cab8147](https://github.com/openclaw/openclaw/commit/cab81470d96126ef92614ba38468e94964429c20), [7cc3cb0](https://github.com/openclaw/openclaw/commit/7cc3cb0d28c807871b2e997a996f4c920fc0b7ae), [ca258fb](https://github.com/openclaw/openclaw/commit/ca258fb9452d6dac7344530fafbcf2939238d9a4). - Android license notices, acknowledgements, empty states, and open-license actions now use the selected language across the translations in this release. Sources: [4b8b60f](https://github.com/openclaw/openclaw/commit/4b8b60f8abc1ae99228fe31bedd31977064062d1), [3b16c41](https://github.com/openclaw/openclaw/commit/3b16c41daa8237f481c2b8061b0f6e00817ffbca), [c4966e8](https://github.com/openclaw/openclaw/commit/c4966e86cbc9403177ccb725d5d1cb87c519b853), [116e9db](https://github.com/openclaw/openclaw/commit/116e9db2a18d5341b5e44844dfefa938fa467e6a), [1617233](https://github.com/openclaw/openclaw/commit/1617233ff141c913def1675aaee33bac3590b1f6), [a598c97](https://github.com/openclaw/openclaw/commit/a598c976d01db50adc35de495a981635c6a38cd4), [3b9e0c8](https://github.com/openclaw/openclaw/commit/3b9e0c86828e0d8f45acafd2908b82191ecfd13f), [eebbf6c](https://github.com/openclaw/openclaw/commit/eebbf6cba5fef565044e556b862f3ce09db2fd86), [4c08ea4](https://github.com/openclaw/openclaw/commit/4c08ea403ad9436d9a8cf0dd02799a441a1bc4db), [21be45c](https://github.com/openclaw/openclaw/commit/21be45c17e845e4027f7a044d2c009423bcd07b7), [b415072](https://github.com/openclaw/openclaw/commit/b415072a2e6a900f382d7e68594b4511bd1a0c5b), [9eec24d](https://github.com/openclaw/openclaw/commit/9eec24df6710308e7a66a7a80bc232f7ee024900), [de23987](https://github.com/openclaw/openclaw/commit/de23987f13b95d71a145218b11f36857a8eefc2c), [898564e](https://github.com/openclaw/openclaw/commit/898564e71aef7abe66112d757eee8db83eaf04d2), [7af800b](https://github.com/openclaw/openclaw/commit/7af800b5be960b595829642b412fce2842017cfc), [a47ec8d](https://github.com/openclaw/openclaw/commit/a47ec8d303e46642d81c8c231786fb0b2fd51045), [fac9e58](https://github.com/openclaw/openclaw/commit/fac9e586685666a9f8159f5132fb18ad2bc37210), [61e4ef0](https://github.com/openclaw/openclaw/commit/61e4ef08f483e9e32eaa6edf6fb391185e462394), [399f9d6](https://github.com/openclaw/openclaw/commit/399f9d696171ec14eafa1d5de64533d2b9670819), [9069f69](https://github.com/openclaw/openclaw/commit/9069f696986ed970565989efacb27024160dbad2), [2e049f5](https://github.com/openclaw/openclaw/commit/2e049f509fad1ba2889186e457e630bad50d7a16). - Android Talk, dictation, speech-provider setup, readiness, and failure guidance now use the selected language across the translations in this release. Sources: [c785196](https://github.com/openclaw/openclaw/commit/c785196287d0e929396def1fc0929af672bdc7cf), [9edb906](https://github.com/openclaw/openclaw/commit/9edb9065a8596f8473bea1ae4a626da8f0508724), [da67520](https://github.com/openclaw/openclaw/commit/da67520b8d5fc49775005638425ca2d9317d6ee7), [88f13ca](https://github.com/openclaw/openclaw/commit/88f13cab62999abe7c2650ccd32d55e72ee80046), [e878efe](https://github.com/openclaw/openclaw/commit/e878efe9508edd88166a09eb5a1e503ab405aad9), [662d127](https://github.com/openclaw/openclaw/commit/662d127f60b91aaaec4b5363c73bd00855d9e3f0), [5002a0e](https://github.com/openclaw/openclaw/commit/5002a0e9ea9970e4e270ec029c994dc217549687), [fe57718](https://github.com/openclaw/openclaw/commit/fe57718b419a08a5306e3d195519d3527a07f936), [ebcf8dc](https://github.com/openclaw/openclaw/commit/ebcf8dcaf7120bfdc01d0b83c595895355944b5b), [4e7ca8e](https://github.com/openclaw/openclaw/commit/4e7ca8e6c6afe672da1a40922e67f94e005f9e8b), [9863ceb](https://github.com/openclaw/openclaw/commit/9863cebef12bf2e7b1414ac5f64bc3277a7ca28b), [768da09](https://github.com/openclaw/openclaw/commit/768da09ceb157a1bfd4dd309b8566a2b9ce7668d), [ff5d986](https://github.com/openclaw/openclaw/commit/ff5d98681f7e38043bbc33a87fade6069da9795c), [005ebd1](https://github.com/openclaw/openclaw/commit/005ebd108f4d6ebd663c8cf996634aeaf3e82287), [2824796](https://github.com/openclaw/openclaw/commit/28247960130f88b6ac01d8a392d54d0996212c1a), [4eaec93](https://github.com/openclaw/openclaw/commit/4eaec934e83d0bc4f0d595c37e06356c5b54dc2a), [f99fdc9](https://github.com/openclaw/openclaw/commit/f99fdc9403b49b59a42c8d3522368d64b9168498), [555f601](https://github.com/openclaw/openclaw/commit/555f601230c075185f362c71db518096c3818998), [d2af689](https://github.com/openclaw/openclaw/commit/d2af68965a0cdb3a1ed91c2d1ba8aedd76dcb3ac), [81e92de](https://github.com/openclaw/openclaw/commit/81e92deb089b54ccedbe0c9593b492f6f09b989d), [8ed6c78](https://github.com/openclaw/openclaw/commit/8ed6c78b7891b12fee2b378d79e6888764455486). - Android command search and New Chat labels now use the selected language across the translations in this release. Sources: [b81c58b](https://github.com/openclaw/openclaw/commit/b81c58bdf6a07894231bc3afcab9a6b12b175bf8), [8929118](https://github.com/openclaw/openclaw/commit/8929118353fce0b8ac8189a95fd4534b39e85903), [1eee853](https://github.com/openclaw/openclaw/commit/1eee853c71e1ddd5c632e49f1e75b18c0837add7), [a5c9662](https://github.com/openclaw/openclaw/commit/a5c9662cd17746a35adf350f55b3f6b7c6cae78c), [9035729](https://github.com/openclaw/openclaw/commit/9035729528a9ae0ed4922728c94fd025cfdd8ea6), [2e359d4](https://github.com/openclaw/openclaw/commit/2e359d49951bf8c786e4c018ef59858743e80386), [91f4d0a](https://github.com/openclaw/openclaw/commit/91f4d0ae25ae86f76cccaac709b84d87990c7ca1), [e785c4a](https://github.com/openclaw/openclaw/commit/e785c4a8f7025ee7a529816a50207c0f925e3a93), [2c5a076](https://github.com/openclaw/openclaw/commit/2c5a07661c153bced0feb10f34e74811f2920831), [02250d9](https://github.com/openclaw/openclaw/commit/02250d957fed2a1e05baac4b33b7315603002732), [bf23194](https://github.com/openclaw/openclaw/commit/bf23194888b626ec4318955d4305197c1c9c4a88), [603502f](https://github.com/openclaw/openclaw/commit/603502f60f54bf9c0e0b7bd8b200ac0a4cc0d5e5), [a837a1a](https://github.com/openclaw/openclaw/commit/a837a1ac6c00c3e71471bcf4ff451b9cecf02f69), [26df1fa](https://github.com/openclaw/openclaw/commit/26df1fa7bca40fbb24f199593ae4bd4de74b2302), [c926610](https://github.com/openclaw/openclaw/commit/c9266107d6c65489b75ae412fe9484d2eca347c6), [c312f9f](https://github.com/openclaw/openclaw/commit/c312f9f0e059b838f4afdbf20f2f1bd8b938ba13), [f4275fa](https://github.com/openclaw/openclaw/commit/f4275fa00b8f89055a8b3a8b23740153750e97af), [69d4657](https://github.com/openclaw/openclaw/commit/69d4657bdb2da553641e34f1b7f85223cfb8c660), [3e66eb9](https://github.com/openclaw/openclaw/commit/3e66eb9de863d333d9f7b7951d2b63eac857df07), [db5057e](https://github.com/openclaw/openclaw/commit/db5057edf935d85b6324bd725506424f2554fc89), [1fee4a5](https://github.com/openclaw/openclaw/commit/1fee4a5daf57a864cd730b9dc2f0bcb19d90c5d8). - Supported non-English Android builds now localize offline Gateway queue guidance and the Retry and Delete actions for text messages. [660d752](https://github.com/openclaw/openclaw/commit/660d752b348f740f130610571101db1f0e3ebb53) - Supported non-English Android builds now translate more cron inspection, delivery error, copy feedback, default-state, and agent request details. [d83ee4c](https://github.com/openclaw/openclaw/commit/d83ee4c44f9562c4e73fb571016624cf54b538d7) - Android model organization, default-model, and pinning controls now use the selected language. Sources: [41bea62](https://github.com/openclaw/openclaw/commit/41bea62b4a28fab24edff319c7cd8807c494cd53), [bdc98f4](https://github.com/openclaw/openclaw/commit/bdc98f482a1ab6f86766041d8c48a16dddde5a96). - Android link-preview controls and status messages now appear in the selected language across refreshed locales. [9997c53](https://github.com/openclaw/openclaw/commit/9997c534b8ebd82fb8db0e9a944e75e594facb2d) - The Android background-location explanation, settings action, and Not Now choice now appear in the selected language when Always location mode is offered. [4c38d89](https://github.com/openclaw/openclaw/commit/4c38d89c0c948b215dd00603db68a80029364c37) #### iOS and Apple Watch ##### Navigation, settings, and app information - Opening Control -> Terminal on iOS now goes directly to the terminal without briefly showing the general Web UI login screen during connection. [#100727](https://github.com/openclaw/openclaw/pull/100727) - iOS users can open Terminal directly from the Control hub, see a Gateway setup prompt when disconnected, and keep active shell sessions running through unrelated screen updates. [211e0d7](https://github.com/openclaw/openclaw/commit/211e0d7263c188ef8cbc5956808306b37bbfccc0) - The iOS Control, Chat, Talk, Agent, Settings, Gateway, and Overview screens now use clearer navigation, status cues, controls, and a compact expanding chat composer. [#98452](https://github.com/openclaw/openclaw/pull/98452) Thanks @joelnishanth. - The iOS Control, Agents, and Settings screens are now easier to scan, with fewer duplicate destinations, more compact controls, standard navigation, and a direct Gateway shortcut from detail views. [#98811](https://github.com/openclaw/openclaw/pull/98811) Related [#98803](https://github.com/openclaw/openclaw/issues/98803). - Chat, Talk, Settings, navigation, and onboarding on iPhone and iPad now use more consistent native controls, appearance, and back behavior. [#99231](https://github.com/openclaw/openclaw/pull/99231) Related [#99195](https://github.com/openclaw/openclaw/issues/99195). Thanks @marvkr. - On iPad, selecting Overview, Chat, Talk, or another sidebar destination now leaves the current Settings detail and opens the requested screen. [#94991](https://github.com/openclaw/openclaw/pull/94991) Thanks @solvely-colin. - The iOS app now opens to Chat for normal launches while preserving direct navigation to Control, Settings, Agent, Talk, and nested destinations. [#98353](https://github.com/openclaw/openclaw/pull/98353) Thanks @bsniznd. - iOS Control, Talk, and Settings are easier to scan with clearer status emphasis, safer action styling, calmer idle visuals, and improved large-text support. [#98423](https://github.com/openclaw/openclaw/pull/98423) Related [#98397](https://github.com/openclaw/openclaw/issues/98397). - iOS connection, warning, and information text is now easier to read in light and dark modes, and Appearance settings accurately describe the selected behavior. [#98443](https://github.com/openclaw/openclaw/pull/98443) Related [#98440](https://github.com/openclaw/openclaw/issues/98440). - iOS users who open Gateway, Voice, or Notifications settings from another screen now return to the Chat, Talk, Agent, Control, or Approvals screen they came from. [#98898](https://github.com/openclaw/openclaw/pull/98898) Thanks @lokimorty. - The iOS app now applies OpenClaw's palette consistently across Talk, settings, Gateway, privacy, usage, and workboard views while retaining accessible contrast. [#98930](https://github.com/openclaw/openclaw/pull/98930) Thanks @joelnishanth. - iPhone users who open Chat from a Control detail can now return to that same Overview, Activity, Workboard, or Sessions screen without losing their place. [#99245](https://github.com/openclaw/openclaw/pull/99245) Thanks @solvely-colin. - iOS users can now read OpenClaw's bundled third-party license acknowledgements from Settings > Licenses. [#99290](https://github.com/openclaw/openclaw/pull/99290) Thanks @joshavant. - On iOS 26, affected Settings switches now respond when users tap anywhere on the labeled row, with accessibility labels and values preserved. [#99888](https://github.com/openclaw/openclaw/pull/99888) Thanks @ly85206559. - Talk and Settings rows on iOS now use consistent title sizing and typography, making adjacent options easier to scan. [#100515](https://github.com/openclaw/openclaw/pull/100515) - The iOS About screen now presents OpenClaw branding, license information, and direct links to the website, documentation, GitHub repository, and Discord community. [#100531](https://github.com/openclaw/openclaw/pull/100531) - Equivalent rows in the iPhone Control and Settings tabs now use the same rounded icon treatment, making both lists easier to scan. [#98936](https://github.com/openclaw/openclaw/pull/98936) Related [#98916](https://github.com/openclaw/openclaw/issues/98916). Thanks @sahilsatralkar. - The iOS About screen now shows a concise app, device-family, and iOS summary without duplicated identity or a raw hardware identifier. [#98985](https://github.com/openclaw/openclaw/pull/98985) Related [#98943](https://github.com/openclaw/openclaw/issues/98943). Thanks @sahilsatralkar. - The iOS appearance setting now sits in the normal Settings list, shows the current System, Light, or Dark choice at a glance, and behaves consistently on iPad. [#99052](https://github.com/openclaw/openclaw/pull/99052) Related [#98995](https://github.com/openclaw/openclaw/issues/98995). Thanks @sahilsatralkar. - The iPhone Control destination list is now denser and easier to scan without changing navigation or status information. [#99468](https://github.com/openclaw/openclaw/pull/99468) Related [#99439](https://github.com/openclaw/openclaw/issues/99439). Thanks @sahilsatralkar. - Already-paired iPhone users now return to Chat, Talk, and Settings instead of being trapped in setup when older onboarding flags are stale. [#101481](https://github.com/openclaw/openclaw/pull/101481) ##### Chat and sessions - Images shared from iOS or through node `agent.request` now remain attached to the correct conversation turn after history reload, so later messages can still use them. [#86936](https://github.com/openclaw/openclaw/pull/86936) Thanks @peterdsp. - iPhone and iPad users can now browse an agent workspace, preview generated files, logs, and configuration, and share a file without returning to the host computer. [#100767](https://github.com/openclaw/openclaw/pull/100767) - Native iOS Chat now follows Larger Text and Dynamic Type settings for messages, the intro, and composer text with less clipping. [#97552](https://github.com/openclaw/openclaw/pull/97552) Thanks @jmcte. - Native iOS Chat now gives the conversation more room, uses a compact composer that grows with longer drafts, and keeps attachment, Talk, and send controls comfortably tappable. [#98953](https://github.com/openclaw/openclaw/pull/98953) Related [#98929](https://github.com/openclaw/openclaw/issues/98929). - iOS Chat now keeps one final assistant reply per turn instead of briefly showing a duplicate that disappears after history refreshes. [#98117](https://github.com/openclaw/openclaw/pull/98117) Related [#98116](https://github.com/openclaw/openclaw/issues/98116). Thanks @joshavant, @ooiuuii. - iOS Chat now preserves intentional line breaks in assistant responses and other multiline messages without disrupting normal Markdown rendering. [#98304](https://github.com/openclaw/openclaw/pull/98304) Related [#98028](https://github.com/openclaw/openclaw/issues/98028). Thanks @jabato01, @joshavant. - The iOS chat experience now offers useful starting prompts, clearer pairing and setup actions, better agent placeholders, and steadier message ordering during refreshes. [#99243](https://github.com/openclaw/openclaw/pull/99243) Thanks @jcooley8. - iOS chat now lets users browse, filter, and select available commands and skills from the composer instead of memorizing exact slash commands. [#99426](https://github.com/openclaw/openclaw/pull/99426) Thanks @solvely-colin, @viczhang6. - iOS chat now provides tactile feedback for accepted sends and most completed or failed runs, though some abort paths may still omit or misclassify failure feedback. [#100416](https://github.com/openclaw/openclaw/pull/100416) - iOS users can export the current conversation as a named, readable Markdown file and save or send it through the system share sheet. [#100417](https://github.com/openclaw/openclaw/pull/100417) - Offline iOS messages now survive relaunch, remain tied to their original Gateway and conversation, and send once only when delivery can be confirmed, with clear uncertain-delivery status when it cannot. [#100942](https://github.com/openclaw/openclaw/pull/100942) - Tapping the iPhone status bar now leaves the chat at the top for reading older messages until the user chooses Jump to latest. [#100502](https://github.com/openclaw/openclaw/pull/100502) ##### Voice, Talk, and Apple Watch - Translated Gateway controls on iOS and approval actions on Apple Watch no longer fall back to English in supported locales. [#97112](https://github.com/openclaw/openclaw/pull/97112) Thanks @vincentkoc. - iOS voice notes now stay with the intended chat and recover more reliably across offline queues, app recreation, uncertain sends, and competing microphone use. [#101236](https://github.com/openclaw/openclaw/pull/101236) - The iPhone app now presents a compact Talk control bar, a cleaner Appearance picker, and a properly aligned realtime-audio button beside the resting Chat composer. [#98736](https://github.com/openclaw/openclaw/pull/98736) - Apple Watch users can dictate a message and hear OpenClaw's final reply on the Watch, with separate silent-send, cancel, and stop controls. [#100283](https://github.com/openclaw/openclaw/pull/100283) - iOS users can record and send a voice note of up to three minutes from the chat composer, optionally add text, and see the recording's duration in chat. [#100946](https://github.com/openclaw/openclaw/pull/100946) - Paired iOS users can start native ElevenLabs Talk with a SecretRef-backed Gateway key without copying the credential into plaintext mobile configuration. [#98210](https://github.com/openclaw/openclaw/pull/98210) Related [#98209](https://github.com/openclaw/openclaw/issues/98209). Thanks @joshavant, @ooiuuii. - iOS Talk's Gateway Default now uses the configured Gateway speech provider, and stopping a reply prevents delayed audio from leaking into later turns. [#98376](https://github.com/openclaw/openclaw/pull/98376) Related [#98153](https://github.com/openclaw/openclaw/issues/98153). Thanks @jraxworthy, @tony-ooo. - OpenAI Realtime Talk on iPhone now uses native WebRTC by default, recovers continuous sessions from provider disconnects, and respects speaker, Bluetooth, and AirPlay output choices. [#98563](https://github.com/openclaw/openclaw/pull/98563) Thanks @pollybot13. - The iOS Talk fallback banner now opens Voice & Talk settings directly instead of sending users to unrelated Gateway settings. [#98602](https://github.com/openclaw/openclaw/pull/98602) Related [#98593](https://github.com/openclaw/openclaw/issues/98593). Thanks @pollybot13. - Voice Wake on iOS can now pause while Talk, camera audio, or another feature uses the microphone and resume without crashing the app. [#99137](https://github.com/openclaw/openclaw/pull/99137) Thanks @pollybot13. - Apple Watch pairing and companion status now refresh without restarting the iPhone app, while cold-launch actions wait for readiness or return a clear `WATCH_UNAVAILABLE` error. [#100732](https://github.com/openclaw/openclaw/pull/100732) - iPhone users can now choose Listen on an assistant reply, follow preparation and playback status, stop at any time, and fall back to on-device speech when needed. [#100771](https://github.com/openclaw/openclaw/pull/100771) - Apple Watch quick replies now survive an unavailable iPhone and reconnect later to the intended Gateway without being lost, duplicated, or misrouted. [#100372](https://github.com/openclaw/openclaw/pull/100372) Thanks @nianjiuzst. - OpenClaw now uses consistent branded typography throughout its iOS, Watch, and Live Activity interfaces while retaining Dynamic Type and accessibility support. [#99246](https://github.com/openclaw/openclaw/pull/99246) Thanks @joelnishanth, @joshavant. ##### Gateway setup and connections - iOS users can pair multiple Gateways once and switch among them while keeping credentials, trust, chats, preferences, device access, and push registration attached to the correct Gateway. [#100948](https://github.com/openclaw/openclaw/pull/100948) - iPhone users pairing with a LAN Gateway now stay authenticated after the one-time bootstrap so Chat and the node connection do not immediately disconnect. [#98066](https://github.com/openclaw/openclaw/pull/98066) Related [#98064](https://github.com/openclaw/openclaw/issues/98064). Thanks @ooiuuii. - After scanning an iOS pairing QR code, users now move to a live connection-progress screen instead of returning to Welcome while pairing continues invisibly. [#98302](https://github.com/openclaw/openclaw/pull/98302) Related [#98297](https://github.com/openclaw/openclaw/issues/98297). Thanks @joelnishanth. - iOS now explains secure Gateway connection and certificate-verification failures precisely and reliably presents the fingerprint trust prompt for first-time HTTPS connections. [#98429](https://github.com/openclaw/openclaw/pull/98429) Thanks @joshavant. - New iPhone users now get clearer QR, setup-code, and manual Gateway choices, better nearby and connection status, and a direct handoff to Chat after connecting. [#98868](https://github.com/openclaw/openclaw/pull/98868) Thanks @solvely-colin, @thats2easyyy. - iOS users can correct gateway details after a failed manual setup and retry immediately with the values currently on screen. [#99220](https://github.com/openclaw/openclaw/pull/99220) Related [#99219](https://github.com/openclaw/openclaw/issues/99219). Thanks @abdullahtas0. - iOS gateway QR pairing now stays open through trust and approval, avoids scanner crashes, and keeps credentials and pending actions with the correct gateway during switches. [#99572](https://github.com/openclaw/openclaw/pull/99572) Thanks @pollybot13. - Repeated iOS Gateway setup links now update the visible settings screen with the newest connection instead of being consumed by a hidden view or replaying stale details. [#100328](https://github.com/openclaw/openclaw/pull/100328) - The iOS app can now connect through Cloudflare Access, Basic authentication, and similar proxies by storing per-Gateway credential headers for the next reconnect. [#100768](https://github.com/openclaw/openclaw/pull/100768) - iOS pairing codes can now advertise both local and Tailnet Gateway routes, allowing the phone to save the first reachable address when it is away from the private LAN. [#100317](https://github.com/openclaw/openclaw/pull/100317) - iOS Gateway connection errors now appear as one dismissible toast that returns for a later failure and visibly reacts instead of stacking when the same problem repeats. [#98856](https://github.com/openclaw/openclaw/pull/98856) Thanks @lokimorty. - The iOS QR setup scanner is less likely to crash or become unstable when users open, cancel, or close the camera during onboarding. [#101235](https://github.com/openclaw/openclaw/pull/101235) Thanks @joshavant, @solvely-colin. ##### Permissions, location, and capture - iOS location settings now explain Off, While Using, Always, Precise Location, restrictions, and permission mismatches in the selected language across the translations in this release. Sources: [3542585](https://github.com/openclaw/openclaw/commit/3542585de59987dd0b962df3ddb70bde093fa4dd), [261d79a](https://github.com/openclaw/openclaw/commit/261d79a9a42ef45a41c3947caa6e616c92702ad4), [ef1474d](https://github.com/openclaw/openclaw/commit/ef1474dd3d4dfdffd4a47a5f14166dc8e2e97a55), [cc1d61b](https://github.com/openclaw/openclaw/commit/cc1d61bd3c04d86b470f94364b1fe7fc6762c456), [2a1e118](https://github.com/openclaw/openclaw/commit/2a1e1184f5139d300567d0c2437669727dddc821), [748bfee](https://github.com/openclaw/openclaw/commit/748bfee90d16df63b9d89ae7db8c80579c8f7a6f), [e0b2dda](https://github.com/openclaw/openclaw/commit/e0b2ddad6cd7a8a562dd39fd99746557923549a1), [f371a2f](https://github.com/openclaw/openclaw/commit/f371a2f2022f9ef6dd9ee781ccf9cb3ee2cf5d88), [ee00cc7](https://github.com/openclaw/openclaw/commit/ee00cc7c949469612e79a55479c363d62a00f7e6), [27f9ae0](https://github.com/openclaw/openclaw/commit/27f9ae0c0a41f812c872439efdfb05f1df79c17c), [51a07ae](https://github.com/openclaw/openclaw/commit/51a07aec27eee6ff7c75ddc9d2d1d40ce0d74672), [ba9d167](https://github.com/openclaw/openclaw/commit/ba9d167e1a9596eff784716992a1f9885d60e892), [576169e](https://github.com/openclaw/openclaw/commit/576169e6d247308fd92cb8cdd3ba493797fa2f3f), [10500a6](https://github.com/openclaw/openclaw/commit/10500a63fa5837a58d3e9b400daa7f52d20d0fbb), [a344252](https://github.com/openclaw/openclaw/commit/a34425273c4ed1796845f1706d1c3b3974044434), [d7d280f](https://github.com/openclaw/openclaw/commit/d7d280fc78a0e8c51b3404294a6a1958a023eb03), [cb2547f](https://github.com/openclaw/openclaw/commit/cb2547f329109ee0b81a62b12ebea7743cac5905), [2191c2e](https://github.com/openclaw/openclaw/commit/2191c2eb1f77eb24f5c0dc8499630d52ebb55a68), [c63e9f9](https://github.com/openclaw/openclaw/commit/c63e9f9bf8ac0e573cfd32937e11ee0e16248709), [4b1e0de](https://github.com/openclaw/openclaw/commit/4b1e0deb3374012338586f39fa8f064515a50cc8), [525c4c7](https://github.com/openclaw/openclaw/commit/525c4c7ce1b821236a07901d80b14a0e7ed81ded). - iOS location settings now show the permission that is actually in effect, including Precise Location and mismatches between OpenClaw's selected mode and the iOS grant. [#99247](https://github.com/openclaw/openclaw/pull/99247) Thanks @pollybot13. - iOS users can now add contacts and search affected records without crashing the app or disconnecting the node. [#99475](https://github.com/openclaw/openclaw/pull/99475) Thanks @abdullahtas0. - iOS Calendar, Reminders, and Contacts commands now return an immediate permission-required result instead of opening a prompt that leaves the agent request waiting. [#99477](https://github.com/openclaw/openclaw/pull/99477) Thanks @nianjiuzst. - Choosing While Using for location access on iOS now remains selected after approval and after the app is relaunched. [#100512](https://github.com/openclaw/openclaw/pull/100512) - The iOS `screen.record` command now finishes more reliably with a nonempty MP4 instead of crashing the app and disconnecting the node as recording stops. [#101550](https://github.com/openclaw/openclaw/pull/101550) Thanks @tony-ooo. - The iOS app now recovers when a location permission prompt returns without a clear decision instead of waiting indefinitely. [75c8753](https://github.com/openclaw/openclaw/commit/75c8753a2cb52cf14acdc50cfa2d2c99368d0e0e) Thanks @vincentkoc. - Cancelling or interrupting an iOS `screen.record` request now stops the system recorder instead of letting capture continue after the tool call fails. [#99155](https://github.com/openclaw/openclaw/pull/99155) Thanks @nianjiuzst. - iOS now recognizes Limited Photos access as usable, offers in-app controls for requesting or managing the grant, and avoids interrupting gateway requests with a surprise prompt. [#99350](https://github.com/openclaw/openclaw/pull/99350) Related [#99046](https://github.com/openclaw/openclaw/issues/99046). Thanks @tony-ooo. - The iOS camera permission prompt now clearly connects access to Gateway setup and assistant-requested photo, video, document, screen, or workspace capture. [e77994e](https://github.com/openclaw/openclaw/commit/e77994ed5adfd5e69c457a5bca82795eff3555bf) Thanks @joshavant. #### macOS ##### Setup and local agent - Localized macOS builds now translate the new GitHub link label, including its accessibility-facing text, instead of falling back to English. [8be1d36](https://github.com/openclaw/openclaw/commit/8be1d366a1f72936495c3d2b00461c5b58572706) - macOS onboarding now translates local Gateway installation, checks, repairs, retries, paused setup, and resume guidance across the languages updated in this release. Sources: [7a717b7](https://github.com/openclaw/openclaw/commit/7a717b777037c6e5152eda24e135e2a64295d256), [85d31e1](https://github.com/openclaw/openclaw/commit/85d31e10d5fcbbeb331e31aa67f8bce520cdbd8e), [27778a7](https://github.com/openclaw/openclaw/commit/27778a7c3de9ba798ae821d5a8dfc3059d4b9af2), [cffc6ad](https://github.com/openclaw/openclaw/commit/cffc6adbce9ca2c8421459a29cfc7bcabb5cf148), [ab0d604](https://github.com/openclaw/openclaw/commit/ab0d604ced35802e8e754ba298b76f5d9a933e1b), [972d394](https://github.com/openclaw/openclaw/commit/972d394c7b008ff278a138c6e1587647e8545c4f), [edbbdf6](https://github.com/openclaw/openclaw/commit/edbbdf6728472f98b92bba22381dd7d70bcb9c0b), [863a054](https://github.com/openclaw/openclaw/commit/863a054576cdeed556bb55c110a451f5c8cab571), [ef5650f](https://github.com/openclaw/openclaw/commit/ef5650f7816433aa5003ebef40019220911bf126), [5f2e51f](https://github.com/openclaw/openclaw/commit/5f2e51fccfc1c700a854cf1b288b16311fd43f87), [5769416](https://github.com/openclaw/openclaw/commit/5769416b6280042684efde75a64ebb36ff27c6d7), [a3aa917](https://github.com/openclaw/openclaw/commit/a3aa917225ecaf87ef83d41f7d23b31dba748722), [2f7bd01](https://github.com/openclaw/openclaw/commit/2f7bd01835c8e7fe28a0aee44d235a6fd521c7f4), [c54a6f3](https://github.com/openclaw/openclaw/commit/c54a6f304e49ba6746e8d92bd96d7ed904352a2c), [9c3ffc5](https://github.com/openclaw/openclaw/commit/9c3ffc5aafbf1075c0f6a00bdd2956a71e8a5f05), [469e707](https://github.com/openclaw/openclaw/commit/469e707970ea5ac0465b83b259f060b13ed2eede), [d066a81](https://github.com/openclaw/openclaw/commit/d066a81d225df29c3f763c62885219991585bea6), [72a3b71](https://github.com/openclaw/openclaw/commit/72a3b712af9b02352d6f2d8d2af3202204480097), [63aa909](https://github.com/openclaw/openclaw/commit/63aa90921602909f19293ba243c344f4d895da6e), [b68e2e7](https://github.com/openclaw/openclaw/commit/b68e2e701ae5f083909e499a84d57ec225cc5ffb). - macOS users can run Codex Computer Use desktop controls through managed installation without a manual `appServer.command`, and an outdated Codex Desktop app-server no longer blocks a supported plugin-local binary. [#96730](https://github.com/openclaw/openclaw/pull/96730) Thanks @bdjben. - New Mac users can now open the app and reach a working local agent without Terminal, Homebrew, administrator access, or an extra approval prompt for the app's own node. [#99767](https://github.com/openclaw/openclaw/pull/99767) Related [#99764](https://github.com/openclaw/openclaw/issues/99764). - macOS onboarding now verifies the chosen AI connection before first chat, presents clearer local and remote setup choices, and offers friendly recovery or a verified manual API-key path when authentication fails. [#100288](https://github.com/openclaw/openclaw/pull/100288) - macOS onboarding now offers the Gateway's supported text-inference provider catalog instead of only Anthropic, OpenAI, and Google, and tests credentials before saving them. [#101132](https://github.com/openclaw/openclaw/pull/101132) - First-run macOS setup now recognizes a successfully saved Codex login and is less likely to finish with a stale Gateway or bundled-skills warning. [#101218](https://github.com/openclaw/openclaw/pull/101218) - After `openclaw doctor --fix` archives a legacy sidecar, the macOS app no longer recreates it or triggers the same migration conflict warning on every command or Gateway start. [#99039](https://github.com/openclaw/openclaw/pull/99039) Related [#98917](https://github.com/openclaw/openclaw/issues/98917). Thanks @momothemage, @p51moustache. - Repeated pairing repair attempts now produce one usable macOS approval prompt per device instead of stacking stale alerts that cannot complete approval. [#100976](https://github.com/openclaw/openclaw/pull/100976) - On macOS, an explicit `OPENCLAW_STATE_DIR` now stays isolated from the machine's existing App Group pairing identity and device tokens. [#101779](https://github.com/openclaw/openclaw/pull/101779) ##### Remote mode and Gateway reliability - macOS remote mode can now connect through explicitly selected managed SSH aliases and recover app-owned tunnels when SSH multiplexing or backgrounding is enabled. [#99661](https://github.com/openclaw/openclaw/pull/99661) - Finder-launched macOS sessions can now use SSH aliases backed by common user-installed `ProxyCommand` helpers without losing agent state or failing Gateway readiness checks. [#100214](https://github.com/openclaw/openclaw/pull/100214) - Multiple macOS app instances now preserve shared SSH tunnel tracking and clean up stale processes more reliably, reducing port conflicts after a crash. [#100601](https://github.com/openclaw/openclaw/pull/100601) - The macOS Dashboard now follows a restarted remote SSH tunnel to its new local port automatically and keeps authentication tokens out of logged URLs. [#100488](https://github.com/openclaw/openclaw/pull/100488) - After a macOS crash or force quit, OpenClaw now reclaims confirmed orphaned remote-mode SSH tunnels so relaunches can reuse the preferred local Gateway port. [#100489](https://github.com/openclaw/openclaw/pull/100489) - The macOS menu-bar app now uses fewer idle CPU wakeups and less repeated configuration and permission work, reducing background battery use without changing active status behavior. [#100463](https://github.com/openclaw/openclaw/pull/100463) - Long-running `system.run` commands on the macOS app node no longer make the node appear offline or block unrelated Gateway traffic. [#100842](https://github.com/openclaw/openclaw/pull/100842) Thanks @lvan185, @vincentkoc. - The macOS app no longer mistakes a valid launchd-managed local Gateway for an unexpected listener and terminates active assistant or channel work. [#100867](https://github.com/openclaw/openclaw/pull/100867) Thanks @lsr911, @vincentkoc. - The macOS app now keeps the same paired device and node identity across upgrades, restarts, and Gateway reconnects instead of repeatedly asking for approval or creating stale duplicates. [#101105](https://github.com/openclaw/openclaw/pull/101105) Thanks @yetval. ##### App design and launching - The Mac app now shows the animated OpenClaw mascot in onboarding and About, while Reduce Motion keeps it still. [f052a2f](https://github.com/openclaw/openclaw/commit/f052a2f23b2d2b510686526ce52c6637bca8a4c6) - The macOS onboarding and About mascot now more closely matches openclaw.ai with theme-aware colors, glow, hover scaling, and smoother motion that keeps its antennae visible. [05c9dcc](https://github.com/openclaw/openclaw/commit/05c9dccf35ec86ebd41e17fdcc0dbf67d203b54c) - The Mac About screen now links directly to the OpenClaw website, documentation, GitHub project, and Discord community, matching the other native apps. [6e7ef63](https://github.com/openclaw/openclaw/commit/6e7ef631d2ac41370fc5b14b8e5b5992413a4cd7) - Opening OpenClaw again from the macOS Dock or Finder now brings up the dashboard or its failure window even when the menu-bar app is already running. [#97637](https://github.com/openclaw/openclaw/pull/97637) Thanks @solvely-colin. ### Terminal UI and Other Clients #### Terminal conversations and recovery - `openclaw tui` now finds the custom port of an active local Gateway automatically, so users usually do not need to repeat its URL with `--url`. [#73338](https://github.com/openclaw/openclaw/pull/73338) Thanks @haishmg, @vincentkoc. - Gateway-backed and local TUI sessions now display assistant text as it arrives instead of appearing quiet until the final response. [#83000](https://github.com/openclaw/openclaw/pull/83000) Thanks @flashosophy. - The TUI now explains when repeated invalid tool arguments abort a run, giving users a useful correction clue without exposing sensitive inputs. [#91002](https://github.com/openclaw/openclaw/pull/91002) Thanks @taerlandsen, @wsyjh8. - Typing indicators now remain active during long Codex model, tool, command, recovery, and queued follow-up work instead of making the reply appear idle. [#95844](https://github.com/openclaw/openclaw/pull/95844) Thanks @jalehman. - Shortened exec and bash summaries now keep emoji and other supplementary characters intact around the ellipsis instead of displaying a broken replacement glyph. [#96963](https://github.com/openclaw/openclaw/pull/96963) Thanks @bartok9, @ly-wang19, @vincentkoc. - Replies triggered through Telegram or another external channel now appear only once in the terminal UI after history refreshes, while resets, session switches, delayed events, and in-progress recovery continue normally. [#96980](https://github.com/openclaw/openclaw/pull/96980) Thanks @xialonglee. - Long assistant and provider errors now end cleanly when emoji or rare Unicode characters land near the display limit. [#97289](https://github.com/openclaw/openclaw/pull/97289) Thanks @zenglingbiao. - The TUI now directs users to the pending device or scope-upgrade approval command instead of incorrectly sending them through chat-DM pairing. [#98144](https://github.com/openclaw/openclaw/pull/98144) Thanks @romneyda. - Embedded and local TUI sessions now contain event-consumer errors instead of terminating the terminal. [#100117](https://github.com/openclaw/openclaw/pull/100117) Thanks @cxbasdev. - TUI users can now submit prompts while an agent is working and receive the configured followup, collect, or interrupt behavior, with Esc and `/stop` canceling only the intended work. [#100123](https://github.com/openclaw/openclaw/pull/100123) Thanks @kevinlp, @sebtardif. - TUI `/new` now performs a real session transition with the expected lifecycle hooks and prevents a new session from racing an active turn. [#100241](https://github.com/openclaw/openclaw/pull/100241) Thanks @caopulan. - Terminal Hatch onboarding and other TUI connections now show `starting up` until session loading finishes, with accurate running indicators after reconnects. [#93999](https://github.com/openclaw/openclaw/pull/93999) Thanks @ml12580. - Repeated submits while the TUI agent is busy now update one warning instead of flooding the conversation with duplicate notices. [#99879](https://github.com/openclaw/openclaw/pull/99879) Thanks @vincentkoc. - `openclaw tui --local` now explains when a known slash command requires the Gateway instead of sending that command to the model as an unwanted prompt. [#100188](https://github.com/openclaw/openclaw/pull/100188) Thanks @goslingmanagment. - Workspace skill approvals started in the TUI now appear in that terminal, so users can review and unblock the run without switching to Telegram. [#100251](https://github.com/openclaw/openclaw/pull/100251) Thanks @vincentkoc. - The terminal UI now stays open and shows a safe, useful error when a local shell command, slash command, or message submission fails. [#100340](https://github.com/openclaw/openclaw/pull/100340) Thanks @cxbasdev. #### Codex CLI session lists - Codex CLI session lists now shorten long last-message previews without splitting emoji or similar characters into broken text. [#96582](https://github.com/openclaw/openclaw/pull/96582) Thanks @llagy007, @weeli-009. ### Plugins and Packaging [Skills](https://docs.openclaw.ai/cli/skills) can be drafted from a conversation or source, reviewed, pinned, archived, restored, and kept out of future context when stale. [Plugin management](https://docs.openclaw.ai/plugins/manage-plugins) is clearer about discovery, installation, updates, marketplace snapshots, connected Codex apps, approvals, and runtime failures, while [Codex supervision](https://docs.openclaw.ai/plugins/codex-supervision) can give each new thread an explicit bounded app allowlist. Official packages are easier to obtain through the supported [Docker](https://docs.openclaw.ai/install/docker) and [Android](https://docs.openclaw.ai/platforms/android) paths, and plugin-backed workflows such as Google Meet and [Apple Messages](https://docs.openclaw.ai/channels/imessage) recover from more setup and migration problems. [Doctor](https://docs.openclaw.ai/cli/doctor) also handles damaged migration caches and older plugin or skill layouts without turning a recoverable upgrade into a dead end. #### Skills and personal workflows - Users can turn a conversation, file path, URL, or pasted note into a reviewable Skill Workshop proposal with one message instead of starting from a blank draft. [#100442](https://github.com/openclaw/openclaw/pull/100442) - Long-running agents can automatically retire unused Skill Workshop skills from future context, pin important ones, restore archives, and surface possible overlaps without deleting the underlying skills. [#101214](https://github.com/openclaw/openclaw/pull/101214) - The opt-in Logbook lets users review a model-organized workday timeline, generate standups, and ask questions about captured activity, with owner-only local storage and configurable retention. [#99930](https://github.com/openclaw/openclaw/pull/99930) - Skill archive validation and upload hashing errors now identify the missing or unreadable file while preserving the original filesystem error. [#101085](https://github.com/openclaw/openclaw/pull/101085) Thanks @cxbasdev, @vincentkoc. - The bundled xurl skill now shows a working Node/npm installation path, and the github skill no longer advertises an unsupported Linux apt option. [#102158](https://github.com/openclaw/openclaw/pull/102158) Thanks @not-stbenjam. #### Codex apps and connected agents - Owner-operated native Codex agents can now use selected apps already connected to the operator's Codex account, with a bounded per-thread allowlist and existing approval controls preserved. [#100973](https://github.com/openclaw/openclaw/pull/100973) Thanks @pash-openai. - Updated integration runtimes keep Codex, ACP, Copilot, Telegram, and diff rendering aligned with compatible upstream behavior, while reconnect recovery no longer floods operator logs with duplicate messages. [#100027](https://github.com/openclaw/openclaw/pull/100027) - Configured and accessible native Codex plugin apps now remain available when a new OpenClaw thread starts during an app-inventory and activation-state transition instead of disappearing silently. [#96872](https://github.com/openclaw/openclaw/pull/96872) Thanks @kevinslin. #### Plugin workflows, hooks, and media - Changes made by plugin hooks now reach agent and child-run context, including replacements or removals made by `agent:bootstrap`. [#97281](https://github.com/openclaw/openclaw/pull/97281) Thanks @outdog-hwh. - Embedded context-engine plugins now see the current turn in the transcript during `afterTurn`, preventing missing first messages and duplicate imports. [#97342](https://github.com/openclaw/openclaw/pull/97342) Thanks @gorkem2020, @iwhatsskill, @sgh6688, @udjin79. - Windows can now load valid inbound media when configured roots and runtime file paths differ only in letter casing. [#97630](https://github.com/openclaw/openclaw/pull/97630) Thanks @vectorpeak. - Plugins can now react when a new DM pairing request is created, enabling owner alerts, audit records, tickets, and approval integrations without polling. [#97733](https://github.com/openclaw/openclaw/pull/97733) Thanks @clawsean, @omarshahine, @trupe-rs. - Provider plugins that mask text now restore intended values inside tool-call inputs before messages, file operations, and other external actions run. [#97769](https://github.com/openclaw/openclaw/pull/97769) Related [#97761](https://github.com/openclaw/openclaw/issues/97761). Thanks @get-viti, @zoowh. - Plugin and media workflows now handle malformed or truncated ffprobe output without crashing while continuing to read valid video dimensions normally. [#98613](https://github.com/openclaw/openclaw/pull/98613) Thanks @pick-cat. - Ordinary Lobster run and resume approvals no longer fail TaskFlow-only validation simply because unused default flow fields were present. [#102036](https://github.com/openclaw/openclaw/pull/102036) Thanks @arthurnie, @lilan0125, @vincentkoc. #### Plugin marketplace and development - Operators can run `openclaw plugins marketplace refresh` to verify and save a hosted feed, enforce a SHA-256 match, and see whether live, saved, or bundled data was used. [#96155](https://github.com/openclaw/openclaw/pull/96155) Thanks @giodl73-repo. - `openclaw plugins init` can now scaffold a model-provider plugin with authentication, model setup, tests, packaging, validation, and ClawHub publishing structure. [#94352](https://github.com/openclaw/openclaw/pull/94352) Thanks @patrick-erichsen. - Existing plugin discovery keeps the same bundled official catalog while gaining a versioned, fail-closed fallback format for the hosted marketplace work. [#95846](https://github.com/openclaw/openclaw/pull/95846) Thanks @giodl73-repo. - ClawHub marketplace reads now fail back to OpenClaw's bundled plugin catalog when hosted data is unsafe or unusable, providing a guarded base for the new marketplace workflow. [#95868](https://github.com/openclaw/openclaw/pull/95868) Thanks @giodl73-repo. - A hosted marketplace can keep serving its last verified catalog when the feed is unchanged or briefly unavailable, without trusting stale or invalid saved data. [#95877](https://github.com/openclaw/openclaw/pull/95877) Thanks @giodl73-repo. - The latest verified hosted marketplace catalog can survive a restart and remain available through unchanged responses or temporary feed failures, with persistence still optional. [#95964](https://github.com/openclaw/openclaw/pull/95964) Thanks @giodl73-repo. - Hosted marketplace entries become installable only when they match approved local sources and trusted ClawHub packages, preventing unknown or untrusted choices from slipping into installation. [#95969](https://github.com/openclaw/openclaw/pull/95969) Thanks @giodl73-repo. - Administrators can configure named hosted marketplace feeds and the trusted local package sources those feeds may reference, while unsupported trust settings are rejected. [#95981](https://github.com/openclaw/openclaw/pull/95981) Thanks @giodl73-repo. - The new `openclaw plugins marketplace entries` command lists available hosted plugins, versions, and install choices while showing whether results came from live, saved, or bundled data. [#96158](https://github.com/openclaw/openclaw/pull/96158) Thanks @giodl73-repo. - Marketplace diagnostics now show whether refresh and entries commands used a hosted feed, a saved snapshot, or a fallback without logging feed secrets. [#96194](https://github.com/openclaw/openclaw/pull/96194) Thanks @giodl73-repo. - Plugin authors can now import shared `textResult` and `jsonResult` helpers from `openclaw/plugin-sdk/tool-results` instead of recreating common response shapes. [#99740](https://github.com/openclaw/openclaw/pull/99740) Thanks @romneyda. - Plugin authors now have a shared `formatByteSize` helper for consistent byte labels, while existing labels across OpenClaw remain unchanged. [#99768](https://github.com/openclaw/openclaw/pull/99768) Thanks @romneyda. #### Plugin installation, updates, and repair - Migration `agentDir` values beginning with `~` now resolve against OpenClaw's effective home. [#99901](https://github.com/openclaw/openclaw/pull/99901) - Starting QR login without a required official channel plugin now returns the exact installation command or `openclaw doctor --fix` instead of only saying the provider is unavailable. [#90517](https://github.com/openclaw/openclaw/pull/90517) Related [#83277](https://github.com/openclaw/openclaw/issues/83277). Thanks @carol-iung, @tuaran. - Plugin update failures now report the real npm metadata or registry problem instead of disguising it as an unsupported package specification. [#96143](https://github.com/openclaw/openclaw/pull/96143) Thanks @brokemac79, @romneyda, @slideshow-dingo. - Operators can install a pinned older ClawHub plugin when that version is compatible with their OpenClaw deployment, without the latest release's requirements incorrectly blocking it; incompatible or unverifiable versions remain blocked. [#96506](https://github.com/openclaw/openclaw/pull/96506) Thanks @isaiahstapleton. - `openclaw plugins update --all` now realigns trusted official plugins with the current stable or beta catalog after a core upgrade, without manual force installs or overwriting intentional targeted pins. [#96831](https://github.com/openclaw/openclaw/pull/96831) Thanks @ooiuuii, @velvet-shark. - `openclaw plugins update <id> --dry-run` now tells operators when a newer default release exists even if the installed plugin is pinned exactly. [#97282](https://github.com/openclaw/openclaw/pull/97282) Thanks @yungchentang. - Windows plugin updates no longer create managed paths so long that official Codex-backed agents fail before they can start and reply. [#97488](https://github.com/openclaw/openclaw/pull/97488) Thanks @ooiuuii. - `openclaw update` now accepts valid bundle-format marketplace and ClawHub plugins without `package.json`, preventing plugin sync from aborting and leaving the Gateway stopped. [#98010](https://github.com/openclaw/openclaw/pull/98010) Related [#97985](https://github.com/openclaw/openclaw/issues/97985). Thanks @herove, @lilan0125. - `openclaw/memory-lancedb` can now install and update under normal npm dependency resolution, keeping LanceDB-backed memory active without version pinning or bypass flags. [#99118](https://github.com/openclaw/openclaw/pull/99118) Related [#90295](https://github.com/openclaw/openclaw/issues/90295). Thanks @allenhurff, @joshavant. - Installing a managed npm plugin no longer makes workspace plugins from `plugins.load.paths` disappear after startup or restart. [#99196](https://github.com/openclaw/openclaw/pull/99196) Thanks @leonidaslux. - Git-backed plugin installs and updates now work when `~/.openclaw` and the system temp directory are on different filesystems, without a `TMPDIR` workaround. [#99896](https://github.com/openclaw/openclaw/pull/99896) Thanks @bartok9, @carelvanheerden, @vincentkoc. - Extended-stable users can install, repair, and update eligible official plugins at the exact OpenClaw core version instead of drifting onto the regular stable line. [#100448](https://github.com/openclaw/openclaw/pull/100448) Thanks @kevinslin. - `openclaw update` no longer retries a plugin after successfully moving it to ClawHub, preventing a redundant transient failure from disabling the migrated plugin. [3ce26d6](https://github.com/openclaw/openclaw/commit/3ce26d690f627ad07dd1097384e8c71dd1537ac1) Thanks @vincentkoc. - `openclaw doctor` can continue legacy dedupe migration when a retired cache file contains malformed JSON instead of stopping with a parsing error. [#98125](https://github.com/openclaw/openclaw/pull/98125) Thanks @pick-cat. - Plugin install and update failures now show whether npm exited, was killed, or timed out instead of presenting a blank error that makes valid packages look invalid. [#98497](https://github.com/openclaw/openclaw/pull/98497) Thanks @sanjays2402, @vincentkoc. - Failed plugin installations now show the useful plugin error without adding a false `Also not a valid hook pack` diagnosis, while genuine hook-pack failures remain visible. [#100554](https://github.com/openclaw/openclaw/pull/100554) Thanks @vincentkoc. #### Plugin runtime, status, and diagnostics - Declared plugin tools now remain callable in subagent sessions after plugin registry changes, avoiding repeated `plugin tool runtime missing` failures and Gateway restarts. [#82562](https://github.com/openclaw/openclaw/pull/82562) Thanks @luoyanglang, @vincentkoc. - Plugin metadata cache hits no longer flood diagnostics with repeated full-scan entries, leaving smaller timelines where real scans are easier to identify. [#86796](https://github.com/openclaw/openclaw/pull/86796) Thanks @galiniliev, @vincentkoc. - Plugin loading no longer evaluates OpenClaw's own package code twice, reducing startup work and avoiding duplicate module, class, singleton, or registry identities in one process. [#88384](https://github.com/openclaw/openclaw/pull/88384) Thanks @vincentkoc. - `openclaw plugins inspect` now shows the bundled document-extract plugin's PDF extractor as an available capability instead of reporting none. [#91597](https://github.com/openclaw/openclaw/pull/91597) Thanks @xydt-tanshanshan. - Configured context-engine plugins such as lossless-claw now stay active after discovery instead of being silently replaced by the built-in legacy engine. [#96357](https://github.com/openclaw/openclaw/pull/96357) Thanks @vincentkoc. - Gateway startup now reports configured channels that failed to load, so operators can fix plugin trust, enablement, or installation before messages go missing. [#96397](https://github.com/openclaw/openclaw/pull/96397) Thanks @849261680. - Plugin-heavy startup and configuration checks, especially on Windows, now repeat fewer package-path lookups while rebuilding installed-plugin fingerprints, making those paths more responsive. [#96710](https://github.com/openclaw/openclaw/pull/96710) Thanks @211-lee, @sheyanmin, @vincentkoc. - `/status plugins` now labels a plugin as loaded only when it is actually running, while still showing healthy installed inventory. [#97479](https://github.com/openclaw/openclaw/pull/97479) Thanks @masatohoshino. - Raising a running Gateway's log level to debug now immediately enables Mattermost, Matrix, Microsoft Teams, IRC, Nextcloud Talk, and other plugin diagnostics without a restart. [#97617](https://github.com/openclaw/openclaw/pull/97617) Thanks @amknight, @vincentkoc. - Detailed `/status plugins` now flags a plugin that was configured to run but did not load, separating runtime drift from ordinary inactive inventory. [#97878](https://github.com/openclaw/openclaw/pull/97878) Thanks @masatohoshino. - Plugin loading now honors operator-configured Jiti native-module exceptions while retaining protection against duplicate OpenClaw package evaluation. [#100344](https://github.com/openclaw/openclaw/pull/100344) - Bundled channel setup plugins now load correctly through current-release symlinks and mixed source/dist layouts without false outside-package warnings. [#100758](https://github.com/openclaw/openclaw/pull/100758) - Source checkouts with a partial bundled plugin tree now retain complete built-in metadata for plugin health checks and provider endpoint discovery. [26c0285](https://github.com/openclaw/openclaw/commit/26c0285812b4299bcb5d61ae76f374410e39d5c5) Thanks @vincentkoc. - The GitHub Copilot plugin no longer breaks `openclaw plugins list` or `openclaw status` during metadata-only loading before full runtime state is available. [#95229](https://github.com/openclaw/openclaw/pull/95229) Related [#94516](https://github.com/openclaw/openclaw/issues/94516). Thanks @cuihaijun, @sunlit-deng. - `/status plugins` now groups disabled plugins by reason, including allowlist, denylist, default, and override decisions, without changing activation behavior. [#99598](https://github.com/openclaw/openclaw/pull/99598) Thanks @masatohoshino. - Bundled channel runtime and setup plugins now load from valid source-only registry roots in mixed source/dist checkouts instead of silently disappearing. [#100737](https://github.com/openclaw/openclaw/pull/100737) - Duplicate plugin-request scopes now normalize consistently, and genuine plugin scan access failures are surfaced. [#99932](https://github.com/openclaw/openclaw/pull/99932) #### Packages and platform installs - Official OpenClaw container images are now available from Docker Hub as well as GHCR, reducing reliance on unofficial mirrors. [#97122](https://github.com/openclaw/openclaw/pull/97122) Thanks @vincentkoc. - Docker users now get a more complete bundled AI runtime, reducing startup and runtime failures caused by package links removed during image trimming. [57ca1b0](https://github.com/openclaw/openclaw/commit/57ca1b02543af9f4ac1d78446951b98cc31fba5a) Thanks @vincentkoc. - Affected npm installations can once again start the Gateway and produce replies because speech now loads only through its supported package-backed TTS path. [#89899](https://github.com/openclaw/openclaw/pull/89899) Thanks @zhangguiping-xydt. - OpenClaw npm packages are now about 3.18 MB smaller unpacked and 371 KB smaller compressed, with plugin SDK entrypoints and runtime behavior unchanged. [#98758](https://github.com/openclaw/openclaw/pull/98758) Related [#98757](https://github.com/openclaw/openclaw/issues/98757). Thanks @romneyda. - Source and macOS package builds no longer fail when the tsdown configuration is loaded from a temporary directory that cannot resolve the runtime package. [#100499](https://github.com/openclaw/openclaw/pull/100499) - Global npm upgrades can continue as OpenClaw's packaged files grow without hitting `InstalledDistScanLimitError`, while runaway scans remain bounded. [#101206](https://github.com/openclaw/openclaw/pull/101206) - Source builds now work on supported Node.js distributions without native TypeScript stripping, avoiding a late failure tied to `--experimental-strip-types`. [#91262](https://github.com/openclaw/openclaw/pull/91262) Thanks @smoe, @vincentkoc. ### Docs and Admin Tools #### Setup and configuration ##### Onboarding and guided setup - `openclaw onboard` now explains up front what setup covers, why full onboarding can take longer, and which optional steps can be postponed. [#97482](https://github.com/openclaw/openclaw/pull/97482) Thanks @ly85206559. - Crestodian on Claude Code or Gemini CLI can now hold multi-turn setup conversations, inspect state, request exact approval for changes, and verify writes instead of falling back immediately to a single-turn planner. [#100029](https://github.com/openclaw/openclaw/pull/100029) - Crestodian setup and repair chats no longer destabilize the local TUI when a terminal event consumer fails during response delivery. [#100341](https://github.com/openclaw/openclaw/pull/100341) Thanks @cxbasdev, @vincentkoc. - Crestodian now distinguishes ordinary questions from operational requests, accepts natural approval phrases, clears stale proposals, and keeps sensitive configuration out of the conversation model. [#100656](https://github.com/openclaw/openclaw/pull/100656) - Fresh git installs now lead users through setup, or give the exact command to finish later, before missing configuration or Gateway authentication can break first use. [#101901](https://github.com/openclaw/openclaw/pull/101901) Thanks @fuller-stack-dev. - Setup now checks the configured custom agent or auth directory for credentials instead of reporting the wrong bootstrap state from a default location. [0fd69dc](https://github.com/openclaw/openclaw/commit/0fd69dc3d2b864fb7d3a0b5204a7c720b5a19c0d) Thanks @vincentkoc. ##### Configuration editing and live reload - `openclaw config` now recommends a Gateway restart only when the changed settings require one, so hot-loadable agent, model, and provider edits no longer prompt unnecessary restarts. [#80823](https://github.com/openclaw/openclaw/pull/80823) Thanks @kiranmagic7. - Removing a visible built-in model alias now explains that the alias is automatic and shows how to shadow it, while genuinely absent aliases still report as not found. [#81641](https://github.com/openclaw/openclaw/pull/81641) Thanks @scientificprogrammer, @vincentkoc. - `openclaw config unset` now explains when a visible value is an inherited runtime default that is not stored in the user's config, avoiding an unproductive loop between `config get` and `config unset` while leaving failed attempts unchanged. [#96557](https://github.com/openclaw/openclaw/pull/96557) Thanks @moeghashim. - Configuration and plugin-schema validation hints now show clear allowed values instead of the misleading literal label `undefined`. [#99045](https://github.com/openclaw/openclaw/pull/99045) Thanks @lzyyzznl. - Valid `openclaw.json` files with a BOM, PowerShell formatting, or deep indentation can now save authentication, model, repair, and other configuration changes without manual reformatting. [#100591](https://github.com/openclaw/openclaw/pull/100591) Thanks @vincentkoc. - Upgrades from the legacy config-health store no longer repeat a permanent conflict warning, and existing recovery backups remain available without overwriting newer observations. [#99728](https://github.com/openclaw/openclaw/pull/99728) Related [#99280](https://github.com/openclaw/openclaw/issues/99280). Thanks @ccbridle, @jalehman, @joshavant. - Repeated configuration warnings are now suppressed between meaningful recurrences, keeping long-running Gateway logs readable without hiding new diagnostics. [#100569](https://github.com/openclaw/openclaw/pull/100569) Thanks @vincentkoc. - Gateway settings marked as no-restart now take effect in live and heartbeat-driven turns without requiring a manual restart. [#100586](https://github.com/openclaw/openclaw/pull/100586) Thanks @obviyus, @sedrak-hovhannisyan. - Gateway `config.patch` now accepts unrelated configuration updates when a bundled provider uses its default endpoint, without saving empty runtime-only provider fields. [#98396](https://github.com/openclaw/openclaw/pull/98396) Related [#98270](https://github.com/openclaw/openclaw/issues/98270). Thanks @momothemage, @weltmaister. - Gateway configuration updates now reject missing redacted values for keys such as `toString` or `constructor` instead of restoring an inherited JavaScript function. [#99152](https://github.com/openclaw/openclaw/pull/99152) Thanks @zenglingbiao. - Manual Gateway setup now rejects port entries such as `1e3` or `0x1000` instead of silently saving a different port, while valid decimal ports remain unchanged. [#98689](https://github.com/openclaw/openclaw/pull/98689) Related [#98681](https://github.com/openclaw/openclaw/issues/98681). Thanks @qingminglong. #### Doctor and diagnostics ##### Core checks and repair behavior - `openclaw doctor` now warns when QMD session search is enabled without transcript export and provides commands and documentation to correct the missing recall setup. [#80947](https://github.com/openclaw/openclaw/pull/80947) Thanks @anyech. - `openclaw doctor` now gives a missing-transcript preview command that actually shows the entries eligible for removal before users choose to enforce cleanup. [#83630](https://github.com/openclaw/openclaw/pull/83630) Thanks @yuanhanzhong. - `openclaw doctor` now evaluates the default agent's actual per-agent bootstrap limits, producing accurate truncation warnings and remediation guidance. [#84424](https://github.com/openclaw/openclaw/pull/84424) Thanks @kasangyong, @vincentkoc. - Gateway-managed skill checks can now find commands installed through pnpm 11 and common npm-global layouts, reducing false missing-tool warnings and unnecessary reinstalls. [#85238](https://github.com/openclaw/openclaw/pull/85238) Thanks @shbernal, @vincentkoc. - `openclaw doctor` on Windows now detects supported Chrome versions accurately instead of warning that a working installation could not be identified. [#87937](https://github.com/openclaw/openclaw/pull/87937) Thanks @mukundakatta. - `openclaw doctor` no longer aborts when a configured agent workspace has not been created yet, while real file operations still enforce workspace boundaries. [#89226](https://github.com/openclaw/openclaw/pull/89226) Thanks @sasan1200, @shifengwang333-ai. - Gateway status, Doctor, and onboarding diagnostics now read large logs within fixed bounds and surface recent useful failures instead of stale noise. [#99407](https://github.com/openclaw/openclaw/pull/99407) Thanks @sunlit-deng. - Terminal notes, Doctor output, and diagnostics now wrap long runs of CJK, full-width, or emoji characters within the requested width instead of spilling across columns. [#96746](https://github.com/openclaw/openclaw/pull/96746) Thanks @ly-wang19. - Default `doctor --lint` results now focus on actionable configuration and runtime problems, with optional backup and memory advice available only when requested. [#99249](https://github.com/openclaw/openclaw/pull/99249) Thanks @giodl73-repo. - `openclaw doctor --fix` now completes successfully in locked-down environments when only shell-completion installation is blocked, while still reporting genuine write failures. [#99540](https://github.com/openclaw/openclaw/pull/99540) Related [#99237](https://github.com/openclaw/openclaw/issues/99237). Thanks @hunglp6d, @rballiance. - `doctor --lint --all` can now explain the path or permission that would block a configuration repair before operators run `doctor --fix`. [#100093](https://github.com/openclaw/openclaw/pull/100093) Thanks @giodl73-repo. - `openclaw health` now warns when gateway configuration hot reload has stopped, so operators know a restart is needed instead of unknowingly running stale settings. [#99267](https://github.com/openclaw/openclaw/pull/99267) Thanks @masatohoshino, @vincentkoc. ##### Focused lint checks - Operators can inspect stale session write locks with `openclaw doctor --lint --json --only core/doctor/session-locks` and preview which locks a repair would remove or preserve. [#84366](https://github.com/openclaw/openclaw/pull/84366) Thanks @giodl73-repo. - Optional Doctor lint can now report missing, unsafe, unwritable, cloud-synced, removable, volatile, or incomplete OpenClaw state storage with paths and repair guidance. [#95979](https://github.com/openclaw/openclaw/pull/95979) Thanks @giodl73-repo. - An opt-in Doctor lint check now explains which configured plugin installation is broken and previews the repair before operators run the existing fix workflow. [#96171](https://github.com/openclaw/openclaw/pull/96171) Thanks @giodl73-repo. - Operators can run `openclaw doctor --lint --all` to include every opt-in diagnostic check without changing the behavior of existing `doctor --lint` automation. [#96471](https://github.com/openclaw/openclaw/pull/96471) Thanks @giodl73-repo. - Operators can run `openclaw doctor --lint --only core/doctor/gateway-health`, `--only core/doctor/gateway-daemon`, or `--all` for structured, credential-safe warnings about Gateway reachability and local service health without changing service state. [#97075](https://github.com/openclaw/openclaw/pull/97075) Thanks @giodl73-repo. - Operators can use the focused auth-profile Doctor lint check to find expired, missing, malformed, cooled-down, disabled, or legacy credentials with structured repair guidance. [#97125](https://github.com/openclaw/openclaw/pull/97125) Thanks @giodl73-repo. - A focused memory-search Doctor lint check now reports provider, credential, backend, and QMD setup problems with structured paths and fixes. [#97137](https://github.com/openclaw/openclaw/pull/97137) Thanks @giodl73-repo. - The workspace-status Doctor lint check now reports plugin drift, compatibility, loading diagnostics, and recoverable TaskFlow state in machine-readable form. [#97358](https://github.com/openclaw/openclaw/pull/97358) Thanks @giodl73-repo. - A focused device-pairing Doctor lint check now provides structured warnings and repair guidance for pending requests, stale authentication, missing scopes, and unreadable stores. [#97366](https://github.com/openclaw/openclaw/pull/97366) Thanks @giodl73-repo. - Operators can request a structured Doctor lint check for configured channels whose backing plugins are blocked, including the unmet requirement and suggested fix. [#97496](https://github.com/openclaw/openclaw/pull/97496) Thanks @giodl73-repo. - A focused tool-result-cap Doctor lint check now identifies settings below model-aware defaults or above the runtime ceiling with actionable paths. [#97500](https://github.com/openclaw/openclaw/pull/97500) Thanks @giodl73-repo. - Linux operators can use the systemd-linger Doctor lint check to learn when logout may stop the Gateway and get the exact `loginctl enable-linger` remedy. [#97514](https://github.com/openclaw/openclaw/pull/97514) Thanks @giodl73-repo. - Doctor lint can now identify legacy fenced `HEARTBEAT.md` templates and distinguish files suitable for automatic cleanup from those containing custom content. [#98400](https://github.com/openclaw/openclaw/pull/98400) Thanks @giodl73-repo. - Doctor lint can now flag the combination of WhatsApp, a strained Gateway event loop, and active local TUI sessions that is associated with delayed replies. [#98406](https://github.com/openclaw/openclaw/pull/98406) Thanks @giodl73-repo. - Structured Doctor lint can now report stale global plugin-runtime symlinks, including the obsolete link, its target, and the `openclaw doctor --fix` cleanup command. [#98729](https://github.com/openclaw/openclaw/pull/98729) Thanks @giodl73-repo. - Operators can use targeted Doctor lint to inspect legacy session transcripts and stale snapshot paths, preview the cleanup, and choose whether to apply it. [#95976](https://github.com/openclaw/openclaw/pull/95976) Thanks @giodl73-repo. - WhatsApp and Telegram default-account routing warnings are now available through selectable structured Doctor lint while normal Doctor output remains unchanged. [#96147](https://github.com/openclaw/openclaw/pull/96147) Thanks @pick-cat, @vincentkoc. - Optional Doctor lint can now identify stale or missing plugin registry data, shadowed bundled plugins, stale install records, and broken OpenClaw peer links. [#96169](https://github.com/openclaw/openclaw/pull/96169) Thanks @giodl73-repo. - Structured Doctor lint can now report low or critical disk space for the OpenClaw state directory, including the affected path, available space, requirement, and remediation. [#98391](https://github.com/openclaw/openclaw/pull/98391) Thanks @giodl73-repo. - Plugin operators can run `doctor --lint --only core/doctor/legacy-plugin-manifests` or `--all` to identify legacy manifest keys and see the affected plugin, path, and repair command. [#98695](https://github.com/openclaw/openclaw/pull/98695) Thanks @giodl73-repo. - Operators can use `openclaw doctor --lint --only core/doctor/legacy-plugin-dependencies` or `--all` to find stale plugin dependency state and receive a path plus safe repair guidance without changing the installation. [#98725](https://github.com/openclaw/openclaw/pull/98725) Thanks @giodl73-repo. - Channel setup warnings are now available as structured Doctor lint findings with stable paths and repair guidance for operators and automation. [#99238](https://github.com/openclaw/openclaw/pull/99238) Thanks @giodl73-repo. #### CLI Operators can [attach an external coding harness](https://docs.openclaw.ai/cli/attach) to an existing Gateway session and work with compatible [Codex-supervised](https://docs.openclaw.ai/plugins/codex-supervision) threads across native and OpenClaw surfaces. [Status](https://docs.openclaw.ai/cli/status) and [configuration](https://docs.openclaw.ai/cli/config) commands provide clearer diagnostics, safer defaults, and more dependable control of sessions, services, credentials, and runtime behavior. ##### Attached coding and sessions - `openclaw attach` now launches Claude Code with temporary access to the main or selected Gateway session, keeps credentials out of arguments, and revokes the grant when the session ends. [#96454](https://github.com/openclaw/openclaw/pull/96454) Thanks @anagnorisis2peripeteia, @obviyus. - Owner-controlled agents can opt into `appServer.homeScope: "user"` to inspect and safely fork the same Codex threads available in Desktop and the CLI. [#99821](https://github.com/openclaw/openclaw/pull/99821) - `openclaw sessions --json` now includes available subagent lineage and runtime details such as parent linkage, workspace, depth, role, timestamps, and status. [#87917](https://github.com/openclaw/openclaw/pull/87917) Related [#80286](https://github.com/openclaw/openclaw/issues/80286). Thanks @islandpreneur007, @zhangguiping-xydt. - `status` and `status --json` now build session model labels with less unnecessary normalization, improving readback speed for larger session sets and incident checks. [#87831](https://github.com/openclaw/openclaw/pull/87831) Thanks @acskamloops. - `usage.cost` and `sessions.usage` now reject a start date later than the end date with a clear `INVALID_REQUEST` instead of returning a misleading empty report. [#94096](https://github.com/openclaw/openclaw/pull/94096) Thanks @alix-007. - Session cost summaries now estimate a real charge when a transcript records zero dollars despite token use and known model pricing. [c5260a3](https://github.com/openclaw/openclaw/commit/c5260a3c03b0444597f3dc4a80c1f003ca7c4b4a) Thanks @nianjiuzst. - Session logs and cached cost views now preserve provider-reconciled zero-dollar totals while recalculating genuinely missing costs from stored provider and model details. [c45124a](https://github.com/openclaw/openclaw/commit/c45124ab8554d70c4564ae1b3a81fc65872ecb9d) - `openclaw sessions tail --tail` now rejects counts too large to represent safely instead of applying an imprecise history limit. [#99398](https://github.com/openclaw/openclaw/pull/99398) Thanks @qingminglong. - A malformed transcript timestamp no longer corrupts session usage and cost records with invalid values. [#99420](https://github.com/openclaw/openclaw/pull/99420) Thanks @krissding. - Session maintenance warnings now say `1 minute`, `1 hour`, or `1 day` at rounded boundaries instead of awkward values such as `60 seconds`. [#100096](https://github.com/openclaw/openclaw/pull/100096) Thanks @narahariraghava, @vincentkoc. - Session maintenance warnings now show more accurate wait estimates near unit boundaries, so a roughly 90-second delay is not inflated to two minutes. [58d707f](https://github.com/openclaw/openclaw/commit/58d707fbed3400292b9d7bf8fe31e6480309a180) Thanks @vincentkoc. ##### Status, logs, usage, and telemetry - `openclaw logs --follow` can bridge a brief local Gateway outage with journal output and automatically return to normal Gateway logs after recovery. [#88159](https://github.com/openclaw/openclaw/pull/88159) Thanks @anyech, @vincentkoc. - Debug proxy capture now keeps oversized or endless response bodies from crashing the agent, while retaining useful status and header metadata. [#97551](https://github.com/openclaw/openclaw/pull/97551) Thanks @alix-007. - The first Gateway status check after a restart now reports the selected model's actual context window instead of briefly showing a generic 200k limit. [#97576](https://github.com/openclaw/openclaw/pull/97576) Thanks @turbotheturtle. - `openclaw health` now surfaces permanently failed deliveries with queue counts and oldest-failure age instead of reporting an all-green state. [#99842](https://github.com/openclaw/openclaw/pull/99842) Thanks @masatohoshino. - Timing displays now roll rounded sub-second values over to `1s` instead of showing the awkward `1000ms`. [#100006](https://github.com/openclaw/openclaw/pull/100006) Thanks @qingminglong. - `openclaw logs` now reports log-tail stream failures cleanly instead of crashing, hanging, or leaving `journalctl` running. [#100850](https://github.com/openclaw/openclaw/pull/100850) Thanks @cxbasdev, @vincentkoc. - Trimmed OpenClaw CLI logs now remain valid UTF-8 when the retained byte range begins inside an emoji or other multibyte character. [#101029](https://github.com/openclaw/openclaw/pull/101029) Thanks @ly85206559. - Langfuse, OpenTelemetry, and Prometheus can now capture usage, cost, model, provider, timing, and session data for runs started through `/v1/responses` and `/v1/chat/completions`. [#96152](https://github.com/openclaw/openclaw/pull/96152) Thanks @rocke2020, @xialonglee. - File-backed usage-bar templates now keep watcher and file-descriptor use bounded in long-running OpenClaw processes while still reloading templates when needed. [#98990](https://github.com/openclaw/openclaw/pull/98990) Thanks @chenyangjun-xy, @vincentkoc, @zhanglei99586. - Compact `/status` no longer shows the ambiguous `Plugins: OK` row, while warnings and detailed plugin diagnostics remain available. [#100143](https://github.com/openclaw/openclaw/pull/100143) - Failed OpenClaw and plugin-harness traces now include useful redacted error details in OpenTelemetry instead of only a generic failure label. [#101244](https://github.com/openclaw/openclaw/pull/101244) Thanks @amknight. - OpenTelemetry trace viewers can now display captured tool results alongside tool inputs in standard GenAI fields, making failed-run investigation more complete. [#101371](https://github.com/openclaw/openclaw/pull/101371) Thanks @amknight. - `openclaw status --all` now keeps shortened channel issue messages readable when an emoji falls at the display boundary. [#101503](https://github.com/openclaw/openclaw/pull/101503) Thanks @wm0018. - OTLP traces, metrics, and logs now follow `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY`, keeping diagnostics exports on the configured network path. [#100616](https://github.com/openclaw/openclaw/pull/100616) Thanks @jesse-merhi. ##### Commands, help, tables, and terminal output - The bounded `openclaw hooks` commands now return control promptly after printing their output, so terminals, scripts, and CI jobs no longer remain stuck. [#76922](https://github.com/openclaw/openclaw/pull/76922) Thanks @dorukardahan. - Non-interactive `openclaw models list` and `openclaw models status` now exit normally after printing their results, allowing scripts and SSH diagnostics to finish without an external timeout. [#77904](https://github.com/openclaw/openclaw/pull/77904) Thanks @dorukardahan, @vincentkoc. - TUI links now leave malformed fragments and stray punctuation as plain text while keeping valid parenthetical, IPv6, and line-wrapped URLs clickable at the correct target. [#100780](https://github.com/openclaw/openclaw/pull/100780) - `openclaw docs` now rejects oversized search responses with a clear error before they can destabilize the CLI or exhaust memory. [#98188](https://github.com/openclaw/openclaw/pull/98188) Thanks @cxbasdev. - Several edge cases now preserve transcript and voice text, surface MCP failures, bound oversized responses, show current session time, choose the right Linux package manager, and use port 443 for secure Gateway links without an explicit port. [#100258](https://github.com/openclaw/openclaw/pull/100258) Thanks @connermo, @cxbasdev, @gfaerny, @hailory, @harjothkhara, @ly85206559, @mushuiyu886, @simon-xydt, @sunlit-deng, @uditdewan. - Failed `openclaw --help` and `openclaw --version` startup now returns exit code 1 promptly instead of leaving the terminal process stuck. [#97807](https://github.com/openclaw/openclaw/pull/97807) Thanks @aniruddhaadak80, @maweibin. - CLI tables now shorten only the actual home directory and its descendants, so sibling paths such as `/home/alice2/project` no longer appear as misleading home-relative paths. [#98876](https://github.com/openclaw/openclaw/pull/98876) Related [#98872](https://github.com/openclaw/openclaw/issues/98872). Thanks @qingminglong. - Message read, pinned-message, and search commands can now display more than 25 returned rows when a higher `--limit` is requested and warn when additional provider results remain. [#99089](https://github.com/openclaw/openclaw/pull/99089) Thanks @jerrytao-ai, @wm0018. - `openclaw --help` now matches command-specific help and completions, with `config patch` and `config schema` visible from the main command list. [#100670](https://github.com/openclaw/openclaw/pull/100670) Thanks @amirf194, @vincentkoc. - Terminal-rendered links containing balanced parentheses now remain clickable through the complete intended URL instead of being shortened or misdirected. [#100697](https://github.com/openclaw/openclaw/pull/100697) Thanks @aniruddhaadak80, @zoowh. - Generated shell completion now suggests accepted OpenClaw command aliases and continues completing their options and subcommands. [#99419](https://github.com/openclaw/openclaw/pull/99419) Thanks @amirf194, @jack-dev-ops, @vincentkoc. - Terminal and setup documentation links now resolve correctly when relative paths begin with `http` or absolute HTTP schemes use uppercase letters. [#96439](https://github.com/openclaw/openclaw/pull/96439) Thanks @lin-hongkuan. - Long IDs and scopes no longer push `openclaw commitments` columns out of alignment, keeping the table readable at a glance. [#95923](https://github.com/openclaw/openclaw/pull/95923) Thanks @parveshsaini. #### Devices, nodes, and Gateway administration ##### Pairing and node management - Built-in `openclaw nodes status`, `openclaw nodes list`, and related node commands now start quickly without unnecessary plugin initialization, while plugin-provided node commands still load when requested. [#96702](https://github.com/openclaw/openclaw/pull/96702) Thanks @erhhung, @qijian-zhang, @zengwen-dt. - Failed `openclaw devices approve` attempts now explain whether to approve a scope upgrade elsewhere or refresh the pending request ID and retry. [#98146](https://github.com/openclaw/openclaw/pull/98146) Thanks @romneyda. - An invalid `openclaw nodes approve <requestId>` now shows available pending IDs and the `openclaw nodes pending` recovery command instead of a raw client error. [#94452](https://github.com/openclaw/openclaw/pull/94452) Thanks @mushuiyu886. - `openclaw pairing list` now gives a useful device-approval next step when no chat DM pairing channels exist instead of displaying a broken empty-choice error. [#98142](https://github.com/openclaw/openclaw/pull/98142) Thanks @romneyda. - Node status, list, and pending-pairing views now tolerate malformed saved values and show the usable node information instead of crashing. [#93930](https://github.com/openclaw/openclaw/pull/93930) Thanks @ly-wang19. - Operators can upgrade the Gateway before N-1 subordinate nodes without losing the normal update, restart, repair, status, and maintenance path for those nodes. [#101109](https://github.com/openclaw/openclaw/pull/101109) Thanks @jtczville. - `openclaw agents list` now shows configured external channels even when their plugin is missing and provides the appropriate install or `openclaw doctor --fix` guidance. [#95363](https://github.com/openclaw/openclaw/pull/95363) Thanks @hugenshen. ##### Gateway status, connectivity, and recovery - `openclaw gateway status` now gives relevant credential, configuration, restart, and log guidance when a running Gateway fails its probe instead of telling operators to wait for warm-up. [#98183](https://github.com/openclaw/openclaw/pull/98183) Thanks @masatohoshino. - Remote node hosts can now connect to Gateways mounted at reverse-proxy paths such as `/openclaw-gw`, including after daemon installation or reconnect. [#97679](https://github.com/openclaw/openclaw/pull/97679) Related [#97678](https://github.com/openclaw/openclaw/issues/97678). Thanks @wm0018. - Linux operators now see when systemd has stopped restarting a repeatedly crashing Gateway, and `openclaw gateway restart` can recover the latched failed service. [#98291](https://github.com/openclaw/openclaw/pull/98291) Thanks @masatohoshino. - Control UI, pairing, setup-code, QR, and status links now prefer a reachable LAN address on hosts with VPNs, virtual adapters, WSL, Hyper-V, or multiple networks. [#98482](https://github.com/openclaw/openclaw/pull/98482) Thanks @joshavant. - `openclaw gateway status --deep` can now identify Windows Firewall rules blocking LAN devices and suggest practical rule, loopback, Tailscale, or SSH-tunnel remedies. [#98666](https://github.com/openclaw/openclaw/pull/98666) Thanks @joshavant. - `gateway run --force` now ignores malformed listener PID records during port cleanup instead of carrying invalid process state into recovery. [#98371](https://github.com/openclaw/openclaw/pull/98371) Thanks @lzyyzznl. - Gateway busy-port diagnostics and forced cleanup now ignore malformed listener IDs, avoid phantom processes, and verify that a port is actually free before reporting recovery. [#98505](https://github.com/openclaw/openclaw/pull/98505) Thanks @qiuyuang. - Windows now detects active Gateway listeners reliably from localized `netstat` output, improving port diagnostics and `gateway --force` cleanup without confusing established connections for listeners. [#100012](https://github.com/openclaw/openclaw/pull/100012) Thanks @qingminglong, @vincentkoc. - A Gateway WebSocket 1006 disconnect now gives operators accurate connection-loss guidance instead of implying that a healthy Gateway necessarily crashed. [#101219](https://github.com/openclaw/openclaw/pull/101219) Thanks @darren2030, @vincentkoc. - Windows Gateway restarts no longer depend on the `findstr` check that could leave a visible or hung command window blocking the handoff. [#101366](https://github.com/openclaw/openclaw/pull/101366) Thanks @deepujain. - `openclaw status`, `status --json`, and `status --all` now respect their timeout on Linux when systemd is unresponsive instead of hanging indefinitely. [#94149](https://github.com/openclaw/openclaw/pull/94149) Related [#84698](https://github.com/openclaw/openclaw/issues/84698). Thanks @zengwen-dt, @zus-assistant. - When a local Gateway is listening but unhealthy, `openclaw gateway status --deep` can surface a recent likely cause such as a full disk instead of only reporting a generic disconnect. [#95902](https://github.com/openclaw/openclaw/pull/95902) Thanks @vincentkoc, @wangbyg. - Remote Gateway status checks now fall back to the configured SSH target when local effective-config probing fails instead of crashing or stalling discovery. [#101160](https://github.com/openclaw/openclaw/pull/101160) Thanks @cxbasdev. #### Installation, updates, and backups The supported [installation](https://docs.openclaw.ai/install) and [update](https://docs.openclaw.ai/install/updating) paths preserve working state more carefully across packages, containers, and daemons. [Onboarding](https://docs.openclaw.ai/cli/onboard) and [doctor](https://docs.openclaw.ai/cli/doctor) retain choices through interrupted setup and migrations, surface actionable repair steps, and avoid silently continuing with stale services, missing plugins, or unusable model configuration. ##### Installation and prerequisites - Shell-completion repair during `openclaw doctor` and updates now skips expensive plugin-command loading, avoiding unnecessary delays while full user-requested generation still includes plugin commands. [#76235](https://github.com/openclaw/openclaw/pull/76235) - Pressing Ctrl+C during the installer upgrade doctor now stops the flow cleanly and prevents an incomplete or failed installation from opening a stale dashboard. [#76386](https://github.com/openclaw/openclaw/pull/76386) Thanks @sebtardif. - LaunchAgent-managed Gateways on permission-constrained macOS volumes now start the generated environment wrapper through `/bin/sh`, preventing immediate background-service exits. [#89967](https://github.com/openclaw/openclaw/pull/89967) Related [#87199](https://github.com/openclaw/openclaw/issues/87199). Thanks @joshdaynard, @zhangguiping-xydt. - Windows command lookup now honors the caller's `PATHEXT`, allowing valid PowerShell scripts and executables to resolve in containers, CI, and isolated environments. [#98093](https://github.com/openclaw/openclaw/pull/98093) Thanks @wendy-chsy. - Windows Gateway setup now detects when Task Scheduler exits without starting a listener and can use the existing fallback launch without creating a duplicate if startup is merely late. [#76245](https://github.com/openclaw/openclaw/pull/76245) - Local Docker source builds are less likely to run out of memory, and failures that still exhaust memory now suggest the relevant build settings. [#98119](https://github.com/openclaw/openclaw/pull/98119) Related [#98118](https://github.com/openclaw/openclaw/issues/98118). Thanks @zyzo. - First-run skill setup on minimal machines now groups missing Homebrew, uv, or Go prerequisites into one clear note while still installing dependencies that can succeed. [#99726](https://github.com/openclaw/openclaw/pull/99726) Thanks @fuller-stack-dev, @sedrak-hovhannisyan. - Installers and runtime checks now reject Node 23.0-23.10 early with supported-version guidance instead of leaving users with a broken OpenClaw CLI. [#99832](https://github.com/openclaw/openclaw/pull/99832) Thanks @fuller-stack-dev, @vincentkoc. - The CLI and full-screen TUI now open with a clear recovery message when their launch directory has been deleted instead of crashing before startup. [#93636](https://github.com/openclaw/openclaw/pull/93636) Thanks @ml12580. - Windows users can launch globally installed Gemini CLI and Claude Code backends through their npm command shims without immediate spawn failures or mangled prompt arguments. [#101378](https://github.com/openclaw/openclaw/pull/101378) Thanks @wendy-chsy. - Failed CLI installations now clean up their temporary Node staging directories and pnpm workspace rewrite files. [#103725](https://github.com/openclaw/openclaw/pull/103725) Thanks @sebtardif. - Git installs now create an `openclaw` launcher that keeps using the intended Node.js runtime even after the user's PATH changes. [be7198f](https://github.com/openclaw/openclaw/commit/be7198f6a2225dd988e707c4ef11c3cf002c14c3) - `openclaw plugins list` now uses substantially less peak memory on fresh and already-migrated packaged installs while preserving required migration behavior. [#103132](https://github.com/openclaw/openclaw/pull/103132) ##### Updates and service handoff - OpenClaw update checks now limit malformed or unexpectedly large npm registry responses before they can consume excessive memory. [#98508](https://github.com/openclaw/openclaw/pull/98508) Thanks @lzyyzznl. - `openclaw update` on Windows now prevents the managed Gateway Scheduled Task from relaunching during package replacement, avoiding partially updated or mixed-version processes. [#100757](https://github.com/openclaw/openclaw/pull/100757) Thanks @vincentkoc. - Managed Gateway updates now allow active work to finish within the configured drain period before timing out the service handoff. [#99695](https://github.com/openclaw/openclaw/pull/99695) Thanks @zoowh. - Extended-stable Gateways now show a periodic `openclaw update` hint when a newer exact package is verified, without changing the installation automatically. [#100438](https://github.com/openclaw/openclaw/pull/100438) Thanks @kevinslin. - Restarting, updating, reinstalling, or repairing a macOS Gateway now preserves active SecretRef-backed channel credentials instead of leaving Telegram and other integrations unable to authenticate. [#99124](https://github.com/openclaw/openclaw/pull/99124) Thanks @mushuiyu886. - Update and status checks now identify malformed npm metadata as invalid JSON instead of returning only an opaque syntax error. [#100338](https://github.com/openclaw/openclaw/pull/100338) Thanks @cxbasdev. - A failed Gateway replacement process during an update no longer causes an additional uncaught crash in the existing parent process. [#101489](https://github.com/openclaw/openclaw/pull/101489) Thanks @aniruddhaadak80, @momothemage, @vincentkoc. - Windows update and doctor repair now move an owned legacy Startup gateway to Task Scheduler without leaving a stale process, dropping authentication, or removing the fallback too early. [#101213](https://github.com/openclaw/openclaw/pull/101213) Thanks @vincentkoc. - `openclaw update` now targets the global Node installation that launched it, avoiding false success when Homebrew, nvm, asdf, or Volta exposes another OpenClaw copy. [#101228](https://github.com/openclaw/openclaw/pull/101228) Thanks @buddyh. ##### Backups and durable state - Windows backups now recover more reliably from live-write races by avoiding repeated use of the same locked temporary archive and cleaning stale retry files. [#101449](https://github.com/openclaw/openclaw/pull/101449) Thanks @lilan0125, @vincentkoc. - Large session histories now produce smaller `.usage-cost-cache.json` files with less parsing and rewrite work, rebuilding automatically after upgrade. [#99714](https://github.com/openclaw/openclaw/pull/99714) Related [#99511](https://github.com/openclaw/openclaw/issues/99511). Thanks @dexhunter, @wayne524. - `openclaw backup create` now tolerates disposable runtime files disappearing during a live backup, while continuing to protect durable files under the existing inclusion policy. [#98879](https://github.com/openclaw/openclaw/pull/98879) Related [#98865](https://github.com/openclaw/openclaw/issues/98865). Thanks @carterstebbins23-spec, @vincentkoc, @zengwen-dt. - `openclaw backup create` on Windows now retries live-file archive races with fresh temporary paths, reducing locked partial backups and leftover retry archives. [#101464](https://github.com/openclaw/openclaw/pull/101464) Thanks @lilan0125, @zoowh. #### Scheduled work [Scheduled automation](https://docs.openclaw.ai/automation/cron-jobs) retains intended models, timing, state, and delivery across more restarts and edits. Tool calls and results also recover more cleanly from timeouts, malformed content, oversized output, and interrupted work instead of leaving a task looking complete when its usable result was lost. ##### Cron configuration and administration - When cron command output is truncated, operators can still recover the earlier login or setup instruction they need without exposing its raw secret through notifications. [#96393](https://github.com/openclaw/openclaw/pull/96393) Related [#96346](https://github.com/openclaw/openclaw/issues/96346). Thanks @nz365guy. - Default cron failure alerts enabled with `openclaw cron edit <job> --failure-alert` now survive Gateway restarts instead of silently disappearing after reload. [#96615](https://github.com/openclaw/openclaw/pull/96615) Thanks @liuhao1024. - `openclaw doctor` now warns when cron jobs target channels whose plugins are inactive, letting operators correct delivery before the next scheduled run fails. [#98184](https://github.com/openclaw/openclaw/pull/98184) Thanks @masatohoshino, @vincentkoc. - Docker and bind-mount installations can finish legacy cron migration across filesystem boundaries, with actionable warnings and duplicate-safe retries when cleanup cannot complete. [#98217](https://github.com/openclaw/openclaw/pull/98217) Thanks @masatohoshino. - `openclaw doctor` now explains cron jobs that still look in flight after an interrupted Gateway run and how those leftover markers are cleared on the next start. [#98620](https://github.com/openclaw/openclaw/pull/98620) Thanks @masatohoshino. - Doctor now warns when enabled cron jobs are stuck in repeated failures without configured alerts, while healthy and below-threshold jobs stay quiet. [#99606](https://github.com/openclaw/openclaw/pull/99606) Thanks @masatohoshino. - `openclaw cron add` now rejects invalid `--no-output-timeout-seconds` and `--output-max-bytes` values immediately instead of silently creating a command job without the requested limits. [#96516](https://github.com/openclaw/openclaw/pull/96516) Thanks @zhangguiping-xydt. - Human-readable `cron list` and `cron show` output now reveals repeated failure streaks such as `error (12x)` while leaving JSON status values unchanged. [#99602](https://github.com/openclaw/openclaw/pull/99602) Thanks @masatohoshino. - Operators can opt into `core/doctor/legacy-cron-store` to find legacy cron data that needs attention without the lint check changing any stored state. [#99211](https://github.com/openclaw/openclaw/pull/99211) Thanks @giodl73-repo. - A normal Doctor lint run no longer invokes `crontab -l` for the optional legacy WhatsApp check unless an operator explicitly selects it. [#99250](https://github.com/openclaw/openclaw/pull/99250) Thanks @giodl73-repo. - Cron jobs with a valid future run exactly on a second boundary now keep that scheduled time instead of being incorrectly treated as stale and rebased. [#81731](https://github.com/openclaw/openclaw/pull/81731) Thanks @vincentkoc, @yashkot007. - Editing a recurring cron job no longer skips a run that is already due or shifts an unchanged interval schedule to the edit time. [#96159](https://github.com/openclaw/openclaw/pull/96159) Thanks @yetval. - Clearing a saved Model or Thinking/Effort override in the Cron Control UI now truly restores inherited defaults, with `--clear-thinking` available from the CLI. [#96293](https://github.com/openclaw/openclaw/pull/96293) Related [#96287](https://github.com/openclaw/openclaw/issues/96287). Thanks @takamasa-aiso, @zengwen-dt. - Failed `cron add`, `cron update`, and `cron remove` commands now leave the running scheduler unchanged, so live jobs match the saved configuration and reported result. [#99960](https://github.com/openclaw/openclaw/pull/99960) Thanks @masatohoshino, @vincentkoc. - Editing a scheduled job's message no longer accidentally breaks later CLI-backed runs, while explicit tool restrictions remain protected where they cannot be enforced. [#100203](https://github.com/openclaw/openclaw/pull/100203) Thanks @obviyus. - Cron job updates can now remove a job-specific fallback model setting so scheduled runs inherit the global defaults again without recreating the job. [#100801](https://github.com/openclaw/openclaw/pull/100801) Thanks @sunnyshu0925. - `openclaw cron edit` now finds jobs more reliably and with less delay on Gateways that contain many scheduled jobs, including `--exact` and timeout-only edits. [#100836](https://github.com/openclaw/openclaw/pull/100836) Thanks @machine3at, @vincentkoc. - Editing a cron payload with `--no-best-effort-deliver` no longer silently changes the job's delivery mode to announcements. [#100846](https://github.com/openclaw/openclaw/pull/100846) Thanks @machine3at. - Using `openclaw cron edit <id> --no-best-effort-deliver` on an older detached job no longer accidentally suppresses its completion announcement. [#101027](https://github.com/openclaw/openclaw/pull/101027) - Agent and MCP cron requests using mixed-case command labels now fail closed instead of slipping past the restriction on shell-backed agent cron jobs. [#101350](https://github.com/openclaw/openclaw/pull/101350) Thanks @pgondhi987. - Replies now correctly confirm reminders scheduled through commands such as `openclaw cron add` instead of also claiming that no reminder was created. [#101807](https://github.com/openclaw/openclaw/pull/101807) Thanks @bryantegomoh, @vincentkoc. ##### Scheduled runs, delivery, and recovery - A timeout while one isolated cron job is setting up no longer restarts the Gateway or interrupts unrelated agent and scheduled work. [#96396](https://github.com/openclaw/openclaw/pull/96396) Thanks @849261680, @brycemurray, @velvet-shark. - `openclaw tasks maintenance --apply` now preserves active cron session history even when job IDs contain spaces, capitals, punctuation, or explicit session keys. [#96352](https://github.com/openclaw/openclaw/pull/96352) Thanks @ly-wang19, @vincentkoc. - Isolated `agentTurn` cron jobs can recover from temporarily mismatched runtime artifacts instead of failing at startup with a `sourceReplyDeliveryMode` error. [#85249](https://github.com/openclaw/openclaw/pull/85249) Thanks @jerry-xin. - `openclaw tasks maintenance --apply` can now repair false lost-task records when durable cron history proves the run completed successfully. [#86088](https://github.com/openclaw/openclaw/pull/86088) Thanks @altaywtf, @liaoandi. - Scheduled agent jobs now warn when `ANNOUNCE_SKIP` suppresses a cron completion, making missing reports and partial output easier to diagnose. [#90566](https://github.com/openclaw/openclaw/pull/90566) Related [#68561](https://github.com/openclaw/openclaw/issues/68561). Thanks @mibslee, @sahibzada-allahyar. - Catch-up cron jobs deferred briefly after startup are no longer skipped merely because an operator checks cron status before they fire. [#94022](https://github.com/openclaw/openclaw/pull/94022) Related [#93935](https://github.com/openclaw/openclaw/issues/93935). Thanks @richchen01, @vincentkoc, @yetval. - Scheduled agent turns using `claude-cli` or another CLI backend now start normally, while explicitly unsupported tool restrictions still fail closed. [#95615](https://github.com/openclaw/openclaw/pull/95615) Thanks @anagnorisis2peripeteia, @obviyus. - Timed-out or cancelled isolated cron runs now retain their provider, model, and session details in `cron_run_logs`, making failed jobs easier to trace. [#95943](https://github.com/openclaw/openclaw/pull/95943) Related [#95873](https://github.com/openclaw/openclaw/issues/95873). Thanks @luke-renjoy, @zengwen-dt. - A scheduled cloud-model job that opens a response but sends no content can now move to a healthy fallback model before the entire run times out. [#96096](https://github.com/openclaw/openclaw/pull/96096) Thanks @849261680, @velvet-shark. - CLI-backed workers from isolated cron jobs now exit after completion instead of accumulating and slowing the host and Gateway. [#97227](https://github.com/openclaw/openclaw/pull/97227) Thanks @vianne-droid, @xialonglee, @yusukeit0. - Long cron failure alerts now preserve emoji and other supplementary Unicode characters instead of ending with a broken replacement symbol. [#97298](https://github.com/openclaw/openclaw/pull/97298) Thanks @zenglingbiao. - Heartbeat fallback failures no longer send noisy chat messages made only of repeated internal error placeholders. [#97364](https://github.com/openclaw/openclaw/pull/97364) Thanks @turbotheturtle. - Scheduled jobs that permit `web_search` now report that no usable search provider is selected instead of completing with an unusable result. [#97677](https://github.com/openclaw/openclaw/pull/97677) Thanks @lilan0125, @riazrahaman. - Scheduled commitment follow-ups now stay focused on their original conversation instead of absorbing unrelated heartbeat instructions, queued context, or recovery work. [#98169](https://github.com/openclaw/openclaw/pull/98169) Thanks @bdjben. - Scheduled jobs can deliver to a live chat without blocking replies or mixing background work into its transcript, and operators can clear stale childless cron tasks without cancelling active session-backed runs. [#98755](https://github.com/openclaw/openclaw/pull/98755) Related [#98121](https://github.com/openclaw/openclaw/issues/98121). Thanks @ethansk, @obviyus. - Recurring cron jobs created for `current` or `session:<id>` once again carry their selected conversation history into later runs, while `isolated` jobs still start clean. [#98947](https://github.com/openclaw/openclaw/pull/98947) Thanks @ethansk, @obviyus. - Completed heartbeat tasks remain recorded when the quiet `HEARTBEAT_OK` acknowledgment cannot be delivered, reducing repeated work and duplicate follow-up actions on the next heartbeat. [#100834](https://github.com/openclaw/openclaw/pull/100834) Thanks @machine3at, @vincentkoc. #### Browser control ##### Connections, profiles, and tab control - Browser CLI commands now accept `--browser-profile` before or after the subcommand, restoring existing remote-browser and WSL2 command patterns. [#94431](https://github.com/openclaw/openclaw/pull/94431) Thanks @ml12580. - A stalled remote Chrome or WSL2 browser can no longer hold tab-list requests indefinitely; OpenClaw returns a bounded timeout and can reconnect on the next request. [#80147](https://github.com/openclaw/openclaw/pull/80147) Thanks @hemantsudarshan, @keaneyan. - Remote-browser actions now recover from a closed or replaced selected tab by retrying without the stale tab ID, matching local browser behavior. [#89086](https://github.com/openclaw/openclaw/pull/89086) Thanks @rhclaw. - Updating `browser.profiles.*` connection details can now take effect without an unnecessary Gateway restart or interruption to active sessions. [#93827](https://github.com/openclaw/openclaw/pull/93827) Thanks @goutamadwant. - Browser automation can now act on tabs by suggested ID, tab ID, label, or unique prefix without false target-mismatch failures. [#96178](https://github.com/openclaw/openclaw/pull/96178) Thanks @zengwen-dt. - Persistent managed-browser logins now survive ordinary Chrome and Gateway restarts, reducing repeated sign-ins and MFA interruptions for unattended browser work. [#98284](https://github.com/openclaw/openclaw/pull/98284) Thanks @malashenia, @turbotheturtle. - Browser extensions can reconnect with a newly rotated pairing token while Browser control remains running, and old tokens continue to be rejected. [a703183](https://github.com/openclaw/openclaw/commit/a7031832ecd5bb9eba30ce844b1a059c9c3b5395) Thanks @vincentkoc. - Remote browser CDP connections now accept URL-encoded Basic auth credentials containing spaces, at signs, and other reserved characters. [#97972](https://github.com/openclaw/openclaw/pull/97972) Thanks @vectorpeak. - Running `/new` or `/reset` in a direct message now closes that conversation's managed browser tabs while leaving other people's tabs alone, even through a brief browser connection hiccup. [#100792](https://github.com/openclaw/openclaw/pull/100792) Thanks @fmls. - Agents can now screenshot a selected background Chromium tab without waiting for the browser command to time out, though capture may bring that tab forward. [#100857](https://github.com/openclaw/openclaw/pull/100857) Thanks @spencer2211. - Managed local browser pages can navigate normally under a restrictive `browser.ssrfPolicy.hostnameAllowlist`, while remote CDP endpoints and disallowed destinations remain blocked. [#100986](https://github.com/openclaw/openclaw/pull/100986) Thanks @nianjiuzst, @sarinv. - Browser automation attached to an existing Chrome session now stops with a bounded error when Chrome crashes or a request is cancelled, and later requests can reconnect cleanly. [#101454](https://github.com/openclaw/openclaw/pull/101454) Thanks @aniruddhaadak80. - Browser Control users who are missing Playwright now receive a working documentation pointer for installing or repairing the required browser runtime. [d460635](https://github.com/openclaw/openclaw/commit/d460635185a499ffb96b3ca32df8a05d058c9145) - Browser Control can now emulate no explicit color preference with `openclaw browser set media no-preference`, and invalid values list every supported choice. [9133118](https://github.com/openclaw/openclaw/commit/913311845ebdab6faf701ee73e07465f171274e7) - Browser POST actions now complete on supported Node 24.16 and newer runtimes after JSON parsing while still cancelling when the client disconnects. [52044e1](https://github.com/openclaw/openclaw/commit/52044e134567ebe3598684b6f968027723dd86a5) Thanks @obviyus, @vincentkoc. ##### Downloads, uploads, screenshots, and page data - CDP-backed browser navigation to CSV, PDF, and other attachment URLs now returns a safely saved managed file with its URL and suggested filename. [#89416](https://github.com/openclaw/openclaw/pull/89416) Thanks @zhangguiping-xydt. - Browser downloads now tell the agent the saved filename and path, helping it use the completed download instead of retrying the action. [#93307](https://github.com/openclaw/openclaw/pull/93307) Thanks @sunlit-deng. - Oversized browser-control error responses can no longer consume excessive Gateway memory, while ordinary failures still provide useful diagnostics. [#98455](https://github.com/openclaw/openclaw/pull/98455) Thanks @wings1029. - Browser `responsebody` requests for a short prefix of a large response now avoid decoding a second full-size text copy while still returning the requested truncated content. [#98940](https://github.com/openclaw/openclaw/pull/98940) Thanks @pandah97. - Malformed browser fill data supplied through `--fields` or `--fields-file` now produces a clear actionable error and exits before any browser action starts. [#98861](https://github.com/openclaw/openclaw/pull/98861) Thanks @lsr911. - Browser screenshots used privately for visual inspection are no longer attached automatically to channel replies and are shared only when explicitly requested. [#101434](https://github.com/openclaw/openclaw/pull/101434) - Browser uploads on re-rendering pages now recover more reliably and expose the real stale-reference or action error instead of a generic timeout. [#101465](https://github.com/openclaw/openclaw/pull/101465) Thanks @diwakarrankawat, @m13v, @tigicion. - Browser response bodies and page snapshots now stay valid and readable when output is shortened near an emoji. [#101761](https://github.com/openclaw/openclaw/pull/101761) Thanks @mushuiyu886. #### Files, documents, and media ##### PDFs and image understanding - Vision-capable models can now read rendered pages from scanned and image-only PDFs attached through chat channels. [#97354](https://github.com/openclaw/openclaw/pull/97354) Thanks @joshavant. - `openclaw infer image describe` now tries configured fallback image models after an explicitly selected model fails and reports which model ultimately succeeded. [#98347](https://github.com/openclaw/openclaw/pull/98347) Thanks @momothemage. - Multi-page scanned PDFs now keep later pages at a usable image size during fallback extraction, allowing vision models to read the full document. [#96390](https://github.com/openclaw/openclaw/pull/96390) Thanks @cls3389, @vincentkoc, @zengwen-dt. - Requesting nonexistent PDF pages now returns a clear range error instead of accidentally sending the entire document to a native provider. [#97698](https://github.com/openclaw/openclaw/pull/97698) Thanks @zhangguiping-xydt. - Fractional PDF page selections such as `1.5` now fail immediately with a clear validation error instead of silently omitting requested content. [#99399](https://github.com/openclaw/openclaw/pull/99399) Thanks @qingminglong. ##### Media, attachments, and file transfer - Screenshot-style images returned by plugin tools over MCP now reach clients as usable results instead of causing the tool call to fail. [#90902](https://github.com/openclaw/openclaw/pull/90902) Thanks @k-schmidt, @mushuiyu886. - After one generated video clip is ready, a different next clip can start immediately instead of waiting several extra minutes behind stale duplicate suppression. [#96018](https://github.com/openclaw/openclaw/pull/96018) Thanks @palomyates516-alt, @vincentkoc. - `openclaw capability video generate` now returns a bounded, actionable error when a provider URL serves an oversized video without `--output`. [#97549](https://github.com/openclaw/openclaw/pull/97549) Thanks @alix-007. - Fetching an empty file with an image-style name now returns a clear saved-file path instead of an unusable inline image result. [#99370](https://github.com/openclaw/openclaw/pull/99370) Thanks @2loch-ness6, @vincentkoc. - File Transfer folder downloads now either produce a complete verified archive or report a clear read failure instead of crashing or returning partial data. [#101590](https://github.com/openclaw/openclaw/pull/101590) Thanks @sunlit-deng. - Multi-attachment prompts now keep real captions while removing duplicate transport markers and placeholder-only text that could confuse the model. [#96431](https://github.com/openclaw/openclaw/pull/96431) Thanks @lin-hongkuan. - GIF attachments are now recognized despite normal Content-Type parameters, spaces, or mixed casing instead of falling through as another media type. [#96435](https://github.com/openclaw/openclaw/pull/96435) Thanks @lin-hongkuan. - Valid inline image data URLs without trailing base64 padding are now accepted, while malformed image payloads remain blocked. [#96437](https://github.com/openclaw/openclaw/pull/96437) Thanks @lin-hongkuan, @vincentkoc. - Video inputs near the configured size boundary are now accepted or rejected according to their actual byte size, avoiding unexpected failures for files that are still within the limit. [#96519](https://github.com/openclaw/openclaw/pull/96519) Thanks @lin-hongkuan, @vincentkoc. - Markdown frontmatter now preserves null-valued fields named `toString`, `constructor`, `valueOf`, or `hasOwnProperty` instead of silently dropping metadata from skills, hooks, or commands. [#99129](https://github.com/openclaw/openclaw/pull/99129) Thanks @vincentkoc, @zenglingbiao. - Markdown beginning with text such as `---not` or `----` now remains ordinary content instead of being mistaken for frontmatter and stripped. [#101795](https://github.com/openclaw/openclaw/pull/101795) Thanks @nianjiuzst. #### Worktrees and sandboxes ##### Managed worktrees - Workboard tasks can now use managed isolated worktrees, with CLI and Control UI tools for creation, cleanup, restoration, and recovery snapshots when work cannot be removed safely. [#100535](https://github.com/openclaw/openclaw/pull/100535) - Users can now start a chat in its own managed worktree from the Control UI or mobile app, isolating parallel coding while preserving dirty work and cleaning safe idle checkouts automatically. [#100788](https://github.com/openclaw/openclaw/pull/100788) ##### Sandboxes and workspace paths - Agent commands with an invalid explicit `workdir`, including a literal `~`, now stop clearly instead of running from an unintended fallback directory. [#94441](https://github.com/openclaw/openclaw/pull/94441) Thanks @jesse-merhi, @renaudcerrato. - SSH- and OpenShell-backed sandbox commands now clean up remote resources after failed launches, preserve the correct plugin session and channel context, and return a normal tool error for malformed input instead of an internal WeakMap failure. [#96926](https://github.com/openclaw/openclaw/pull/96926) Thanks @jesse-merhi. - OpenShell sandbox sessions now start with the intended workspace files in the managed remote directory, avoiding missing-file and wrong-directory failures. [d9034da](https://github.com/openclaw/openclaw/commit/d9034da0a60600cb1d2e081cb80e619ff7d180c5) Thanks @vincentkoc. - The optional common sandbox image now includes Node 24 and pnpm so documented Node-based development tasks can run inside it. [eabc12b](https://github.com/openclaw/openclaw/commit/eabc12b7d66687f6829009c103c0f33114e2949e) Thanks @vincentkoc. - OpenShell sandbox uploads now place workspace directories at the requested remote path so sandbox commands can reliably find their files. [#96303](https://github.com/openclaw/openclaw/pull/96303) Thanks @vincentkoc. #### Command execution ##### Process execution and cleanup - Pending exec approval cards now describe only the approval state, and the foreground-fallback warning appears only after a command actually runs that way. [#101561](https://github.com/openclaw/openclaw/pull/101561) Thanks @vincentkoc. - Timed-out commands on Windows are less likely to leave child processes running when `taskkill.exe` cannot start. [#101392](https://github.com/openclaw/openclaw/pull/101392) Thanks @aniruddhaadak80, @zengwen-dt. - Failed shell-tool messages now separate the command the agent typed from framework labels and show the exit code, node, and working directory more clearly. [#97511](https://github.com/openclaw/openclaw/pull/97511) Thanks @aditya-vithaldas. - Exec and finished background-session results now include signals, timeout flags, failure kinds, and exit reasons so users can tell why a command stopped. [#89104](https://github.com/openclaw/openclaw/pull/89104) Thanks @yu-xin-c. - Windows `autoreview --engine copilot` runs now return a completed review result even when temporary-directory cleanup is briefly delayed. [#97901](https://github.com/openclaw/openclaw/pull/97901) Thanks @paulcam206. - Oversized local socket replies now fail promptly without consuming memory until timeout, while large macOS commands still return completion status and bounded recent output. [#98130](https://github.com/openclaw/openclaw/pull/98130) Thanks @pick-cat. - Timed-out, aborted, or output-limited extension commands now clean up their child processes instead of leaving background work running after `api.exec()` returns. [#98340](https://github.com/openclaw/openclaw/pull/98340) Related [#98335](https://github.com/openclaw/openclaw/issues/98335). Thanks @ooiuuii. - Emoji and other supplementary Unicode characters remain intact when long command output is shortened for polls, completion notices, or approval follow-ups. [#98721](https://github.com/openclaw/openclaw/pull/98721) Thanks @zengwen-dt. - A set of failure-path fixes now keeps commands and maintenance tasks running through isolated errors, preserves terminal and model text, improves skill and approval diagnostics, and stops Android voice sessions cleanly after microphone loss. [#100440](https://github.com/openclaw/openclaw/pull/100440) Thanks @cxbasdev, @lavyatandel, @nankingjing, @nianjiuzst, @tzy-17, @wendy-chsy. - Agent workflows can now survive transient stdout or stderr read failures from helper processes instead of losing the whole OpenClaw process. [#100522](https://github.com/openclaw/openclaw/pull/100522) Thanks @cxbasdev, @vincentkoc. - Docker sandbox commands now return an explicit failure when output cannot be read instead of crashing OpenClaw or reporting an incomplete result as successful. [#100523](https://github.com/openclaw/openclaw/pull/100523) Thanks @cxbasdev. - Crestodian setup and local-tool checks no longer terminate OpenClaw when a probed command encounters a rare output-stream read failure. [#100741](https://github.com/openclaw/openclaw/pull/100741) Thanks @lsr911. - Stopping a chat through `chat.abort` can now find and terminate its matching embedded run instead of reporting failure while the underlying tool process continues. [#101222](https://github.com/openclaw/openclaw/pull/101222) Thanks @zoowh. - Broken child-process output, timeouts, and aborts during agent shell commands are now contained instead of causing rare Gateway crashes. [#101370](https://github.com/openclaw/openclaw/pull/101370) Thanks @wings1029. - Repeated failed or cancelled agent directory listings now release their cancellation listeners, avoiding listener buildup over time. [#101588](https://github.com/openclaw/openclaw/pull/101588) Thanks @lzw112. - Codex session tools now honor their requested seconds-based timeout and return their own useful timeout status instead of ending early. [#100722](https://github.com/openclaw/openclaw/pull/100722) Thanks @carterstebbins23-spec, @cxbasdev. - Cancelled ACP background tasks now appear as cancelled in task lists, summaries, and parent-run updates rather than being reported as successful. [#101245](https://github.com/openclaw/openclaw/pull/101245) Thanks @masatohoshino. ##### Editing, diffs, and task recovery - Reliability fixes now reject unsafe cron and plugin inputs, preserve skill formatting, surface Gateway and memory failures, fail LSP startup sooner, and prevent stale Android camera results after cancellation. [#100399](https://github.com/openclaw/openclaw/pull/100399) Thanks @849261680, @anyech, @cxbasdev, @lin-hongkuan, @masatohoshino, @nankingjing, @qingminglong, @simon-xydt, @snotty, @xialonglee. - A broad reliability pass now replaces stalled child-process work with clear errors, improves sandbox diagnostics, bounds mobile calendar and voice state, normalizes cron fallbacks, and rejects unsafe provider responses. [#100483](https://github.com/openclaw/openclaw/pull/100483) Thanks @aniruddhaadak80, @cxbasdev, @jincheng-xydt, @morluto, @nianjiuzst, @pandah97, @versatagent, @xialonglee, @zenglingbiao, @zengwen-dt. - Agent runs now stop cleanly when a `write`, `edit`, or `apply_patch` operation would make no change, preventing repeated false-progress retries while real mutations and valid sibling edits continue normally. [#97044](https://github.com/openclaw/openclaw/pull/97044) Thanks @vincentkoc, @zw-xysk. - The diffs tool now renders default outputs faster, preserves highlighting for pack-only languages, handles unchanged input clearly, and reports file-render and invalid-patch errors more accurately. [#100487](https://github.com/openclaw/openclaw/pull/100487) - Failed code-mode tool attempts now show the error type, message, and location, giving the model and operator enough detail to diagnose or correct the problem. [#95906](https://github.com/openclaw/openclaw/pull/95906) Thanks @vincentkoc, @zengwen-dt. - When the edit tool cannot match `oldText`, its error now points to likely nearby lines and explains common indentation, escaping, and whitespace differences, reducing blind retries. [#97038](https://github.com/openclaw/openclaw/pull/97038) Thanks @aocogoal-gethub, @vincentkoc, @zoowh. - Legacy task upgrades now restore persisted tasks automatically, preventing linked TaskFlows from falsely reporting them missing or requiring manual SQLite recovery. [#103946](https://github.com/openclaw/openclaw/pull/103946) Thanks @bek91, @theo674. - Terminal task lists now shorten emoji-heavy summaries without leaving broken replacement characters in the row. [#101600](https://github.com/openclaw/openclaw/pull/101600) Thanks @maweibin. - Progress summaries for inline scripts and generated files no longer present heredoc content as extra shell commands that ran. [#99379](https://github.com/openclaw/openclaw/pull/99379) Thanks @zengwen-dt. - Failed exact-match edits now show readable current-file context even when truncation falls beside an emoji or other non-BMP character. [#99527](https://github.com/openclaw/openclaw/pull/99527) Thanks @mikasa0818. #### Search and web ##### Web fetch and link understanding - `web_fetch` now reaches provider fallback much faster for shell-style pages with no locally extractable content, cutting the measured fresh-process delay from several seconds to about one. [#98559](https://github.com/openclaw/openclaw/pull/98559) Thanks @vincentkoc. - `web_fetch` now handles malformed or adversarial HTML more predictably, reducing excessive processing and keeping hidden script-like text out of fallback output. [#102033](https://github.com/openclaw/openclaw/pull/102033) Thanks @pgondhi987. - Agent-side `web_search` now sees the configured provider in the active runtime, so Gateway and channel sessions can keep using providers such as Brave without a restart. [#88684](https://github.com/openclaw/openclaw/pull/88684) Thanks @alexzhu0, @vincentkoc. - Link understanding now keeps page fetching available for the slowest configured fallback and applies `tools.links.timeoutSeconds` consistently regardless of model order. [#100731](https://github.com/openclaw/openclaw/pull/100731) Thanks @aniruddhaadak80, @cxbasdev. - Recovered `web_fetch` spill files now keep emoji intact and report the actual safely written length when a long page exceeds the inline limit. [#101312](https://github.com/openclaw/openclaw/pull/101312) Thanks @alix-007. - `web_fetch` now preserves emoji, mathematical symbols, extended Unicode, and intentionally escaped numeric entity text more faithfully. [#96268](https://github.com/openclaw/openclaw/pull/96268) Thanks @ly-wang19. - DuckDuckGo results now preserve intentional entity notation such as `<` and `'` instead of silently changing titles, snippets, or URLs. [#96348](https://github.com/openclaw/openclaw/pull/96348) Thanks @ly-wang19, @vincentkoc. - Canvas embed replies now retain their visible message text when a self-closing embed shortcode is followed by an extra closing marker. [#96449](https://github.com/openclaw/openclaw/pull/96449) Thanks @ly-wang19. - Bracketed labels in Markdown citations no longer make link understanding fetch display-only URLs that the user did not intend to retrieve. [#96476](https://github.com/openclaw/openclaw/pull/96476) Thanks @ly-wang19, @vincentkoc. - DuckDuckGo search pages containing malformed numeric HTML entities no longer crash parsing or inject broken Unicode into titles, URLs, and snippets, while valid emoji entities remain supported. [#96583](https://github.com/openclaw/openclaw/pull/96583) Thanks @llagy007, @weeli-009. ##### Local and tool search - When an installed `fd` or `rg` binary is unusable, agent search can now install a working copy and recover instead of failing repeatedly. [#96361](https://github.com/openclaw/openclaw/pull/96361) Thanks @miorbnli. - A failed `find` search now returns one contained tool error and stops its `fd` process instead of risking an agent crash or orphaned search. [#101158](https://github.com/openclaw/openclaw/pull/101158) Thanks @cxbasdev. - Tool Search now fails the affected call cleanly and terminates its unusable child when the diagnostic stream breaks, rather than risking a stranded request or Gateway crash. [#101295](https://github.com/openclaw/openclaw/pull/101295) Thanks @cxbasdev. - QMD command pipe failures now report a clean memory-operation error instead of taking down the memory host. [#101402](https://github.com/openclaw/openclaw/pull/101402) Thanks @wings1029. - The agent `find` tool now reports an interrupted or failed directory search as an error instead of returning a partial match list as complete. [#99446](https://github.com/openclaw/openclaw/pull/99446) Thanks @zhangguiping-xydt. #### SDK, MCP, and tools Agents can read scanned PDFs with vision-capable models, work in isolated coding checkouts, and handle files, media, browser results, and execution failures with more usable output. [Browser control](https://docs.openclaw.ai/tools/browser-control) preserves pairing and download state more reliably, while parallel workspace operations are less likely to collide with one another or the user's current files. ##### MCP, ACP, and tool protocols - Shortened tool descriptions in catalogs and `/tools verbose` no longer split emoji or other Unicode characters into garbled replacement symbols. [#98644](https://github.com/openclaw/openclaw/pull/98644) Thanks @zengwen-dt. - `openclaw mcp serve` and bare `openclaw acp` now begin with clean machine-protocol output, preventing startup warnings from corrupting JSON-RPC for MCP and ACP clients. [#89997](https://github.com/openclaw/openclaw/pull/89997) Thanks @kenners22, @vincentkoc. - When a bundled MCP server stops mid-session, users now get a prompt server-specific disconnect message and can clear the dead session by refreshing the catalog. [#98738](https://github.com/openclaw/openclaw/pull/98738) Thanks @masatohoshino, @vincentkoc. - Malformed draft-2020-12 tool schemas from an MCP server now produce an actionable setup error that identifies the external schema and retains the underlying failure. [#89619](https://github.com/openclaw/openclaw/pull/89619) Thanks @vincentkoc. - Prompt templates now preserve intentionally blank quoted arguments so later positional placeholders receive the correct values. [#96405](https://github.com/openclaw/openclaw/pull/96405) Thanks @lin-hongkuan. - OpenTelemetry latency dashboards now provide useful duration and context-size distributions for agent and harness work lasting well beyond 10 seconds, including multi-minute runs, without collector-side bucket customization. [#96592](https://github.com/openclaw/openclaw/pull/96592) Thanks @hcnode, @vincentkoc, @zhiling-chen-20230331. - MCP tools now receive optional null values correctly instead of having them changed into empty strings that can break valid calls. [#97212](https://github.com/openclaw/openclaw/pull/97212) Thanks @vincentkoc, @zw-xysk. - Successful Codex thread-goal reads now appear as successful in model context, transcripts, and diagnostics instead of being recorded as failed tool calls. [#98659](https://github.com/openclaw/openclaw/pull/98659) Thanks @yetval. - Message-tool calls with an invalid Gateway timeout now return an immediate validation error instead of appearing to stall. [#98652](https://github.com/openclaw/openclaw/pull/98652) - Invalid plugin approval requests now show the actual validation problem instead of misleading users with a Gateway-unavailable error. [#100337](https://github.com/openclaw/openclaw/pull/100337) Thanks @tzy-17. - Oversized ClawHub packages, skills, ClawPacks, resolver archives, and GitHub-source downloads now stop with a clear size-limit error before they can exhaust Gateway memory. [#101176](https://github.com/openclaw/openclaw/pull/101176) - Automatic session rotation is less likely to strand the next conversation when a context-engine plugin immediately reads or checkpoints its transcript. [#101192](https://github.com/openclaw/openclaw/pull/101192) - Internal hook authors now receive a warning when a likely event-name typo would otherwise leave a hook silently inactive. [#99456](https://github.com/openclaw/openclaw/pull/99456) Thanks @masatohoshino. - Tool-using Anthropic-family requests can now fail over to OpenAI without a 400 error caused by an incompatible tool format. [#101443](https://github.com/openclaw/openclaw/pull/101443) Thanks @chrisbaker2000. ##### Skill Workshop - Natural-language corrections can now become the right pending Skill Workshop improvement after successful or failed turns without repeating old feedback, duplicating `/learn`, or replacing proposal context. [#100576](https://github.com/openclaw/openclaw/pull/100576) Thanks @vincentkoc. - Skill Workshop approval prompts now include the proposal details needed to apply, reject, or quarantine a change, while unanswered requests stay safely pending and return a clear timeout message. [#100498](https://github.com/openclaw/openclaw/pull/100498) - When users say things like "next time" or "remember to," OpenClaw can now offer one reviewable Skill Workshop proposal without requiring autonomous capture or repeatedly prompting after dismissal. [#100692](https://github.com/openclaw/openclaw/pull/100692) - Skill Workshop now explains when tool policy is hiding `skill_workshop` and shows the exact `allow` or `alsoAllow` change needed to enable manual review calls. [#100654](https://github.com/openclaw/openclaw/pull/100654) Thanks @wangwllu. #### Documentation Official operating guidance now matches shipped commands, configuration, setup, status output, placeholders, and recovery behavior more closely. Generated documentation maps also preserve literal command parameters, reducing the chance that a reader follows an example whose identifiers were stripped or whose workflow no longer matches the product. ##### Setup and operating guides - The CLI config documentation now clearly distinguishes normal JSON5 value parsing from `--strict-json`, which accepts standard JSON and rejects JSON5-only syntax. [#80981](https://github.com/openclaw/openclaw/pull/80981) Thanks @addu2612. - The macOS guide now gives users a clearer path from downloading the app through first-run setup, Gateway selection, and focused troubleshooting. [#97120](https://github.com/openclaw/openclaw/pull/97120) Thanks @romneyda. - OpenClaw's public docs now use shorter, task-first instructions with corrected commands, configuration names, defaults, provider behavior, and troubleshooting steps. [#100142](https://github.com/openclaw/openclaw/pull/100142) - Logbook users now have end-to-end guidance for setup, model routing, privacy choices, and troubleshooting missing capture or timeline results. [b6a7898](https://github.com/openclaw/openclaw/commit/b6a7898c7c7f43e4b984c6c62aaa685f6a206f33) - Safe-restart guidance now states that the default wait can end after `gateway.reload.deferralTimeoutMs` and explains how to configure an indefinite wait. [#95397](https://github.com/openclaw/openclaw/pull/95397) Thanks @zhangqueping. - The agent configuration guide now identifies the current models selected by the built-in `opus` and `gpt` aliases. [#96375](https://github.com/openclaw/openclaw/pull/96375) Thanks @niks999. - Docker operators now have an official path to install, authenticate, verify, and persist the `claude-cli` backend across container image upgrades. [#96380](https://github.com/openclaw/openclaw/pull/96380) Thanks @fffrank, @zaidazmi. - OpenClaw's Anthropic and Claude CLI documentation now reflects the current subscription-limit treatment for `claude -p` and related usage, with official references for billing and deployment decisions. [#96848](https://github.com/openclaw/openclaw/pull/96848) Thanks @fightingsleep, @tirion-p. - The public onboarding docs now cover eleven existing non-interactive flags for token auth, Cloudflare AI Gateway, daemon, UI, hooks, and token output. [#97753](https://github.com/openclaw/openclaw/pull/97753) Thanks @vincentkoc, @wm0018. - OpenClaw's mobile documentation now identifies the iOS and Android apps as official releases and provides consistent App Store, Google Play, and hosted iOS push-relay guidance. [#98843](https://github.com/openclaw/openclaw/pull/98843) Thanks @joshavant. - Official OpenClaw docs now help operators and plugin authors handle credentials safely, preflight cron jobs that use local-provider fallbacks, apply Talk timing defaults, configure MiniMax providers and models, and copy a complete minimal plugin package with the required dependency metadata. [#100182](https://github.com/openclaw/openclaw/pull/100182) - Android node operators now have an end-to-end guide for securely mirroring and controlling a remote device from macOS, including authorization, troubleshooting, and clean disconnection. [#100398](https://github.com/openclaw/openclaw/pull/100398) - The onboarding reference now explains that bare `openclaw` starts onboarding for a missing config, opens Crestodian for an invalid config, and launches the agent TUI for a valid config. [d9dbee7](https://github.com/openclaw/openclaw/commit/d9dbee7676fb4a7fcd4617e9fe3bd26f7adf4452) - ACP troubleshooting now names `PermissionPromptUnavailableError`, helping operators recognize a non-interactive permission failure and find the right configuration fix. [b3a74cc](https://github.com/openclaw/openclaw/commit/b3a74ccc3aef9d670994baee3b0039e4783d82a2) - The onboarding reference now gives accurate signal-cli, Gateway runtime, and channel allowlist guidance, including Windows limits and the IDs expected for direct messages. [aaaa803](https://github.com/openclaw/openclaw/commit/aaaa8030bf4f139d43717731fd3402e06b248d48) ##### Channels and messaging guidance - Plugin and channel-status documentation now clarifies that a `MessageReceipt` or durable `sent` result proves platform acceptance, not display or read confirmation on a recipient's device. [#90063](https://github.com/openclaw/openclaw/pull/90063) Thanks @pdurlej. - The Discord setup guide now points users to the correct Developer settings section for enabling Developer Mode and copying required IDs. [#97336](https://github.com/openclaw/openclaw/pull/97336) Thanks @naseemm123. - The Discord setup guide now separates General Permissions from Text Permissions so bot access choices are easier to read correctly. [#97584](https://github.com/openclaw/openclaw/pull/97584) Thanks @slammajamma28. - Telegram's error-reply documentation now lists the supported policies and correct cooldown defaults, avoiding invalid `errorPolicy: "reply"` configurations. [#97635](https://github.com/openclaw/openclaw/pull/97635) Thanks @wm0018. - The Feishu documentation no longer suggests the rejected `dmPolicy: disabled` setting, reducing configuration failures copied from the guide. [#97640](https://github.com/openclaw/openclaw/pull/97640) Thanks @wm0018. - Matrix documentation now explains progress streaming, room-specific mention matching, per-room enablement, and bot-loop safeguards that operators can configure. [#98318](https://github.com/openclaw/openclaw/pull/98318) Thanks @vincentkoc, @wm0018. - Telegram channel documentation now correctly states that an unset streaming mode uses partial previews and explains how to choose final-only replies. [#98453](https://github.com/openclaw/openclaw/pull/98453) Thanks @solodmd. - The bundled `imsg` skill now guides agents toward the correct direct or group conversation, stable targets, least-privilege actions, and confirmation before visible or sensitive changes. [#100105](https://github.com/openclaw/openclaw/pull/100105) Thanks @omarshahine. ##### Plugin and generated reference guidance - Plugin developers now receive clearer SDK deprecations and migration guidance for session-store and transcript-file helpers ahead of the planned SQLite transition. [#97494](https://github.com/openclaw/openclaw/pull/97494) Thanks @jalehman. - Plugin authors now get clearer packaging guidance for runtime dependencies, built artifacts, `npm-pack:` validation, and trusted official-plugin checks before publication. [#99962](https://github.com/openclaw/openclaw/pull/99962) Thanks @hxy91819. - Official plugin package examples now agree on the required `typebox` runtime and `openclaw` peer dependencies, reducing copy-and-paste setup failures. [#99973](https://github.com/openclaw/openclaw/pull/99973) - The Codex and WhatsApp plugin references now identify their tools contract, making supported plugin capabilities easier to match with OpenClaw workflows. [46ad3f9](https://github.com/openclaw/openclaw/commit/46ad3f9ae94cec1bfa94b14974a3d32b46921080) Thanks @vincentkoc. - Generated documentation navigation now preserves complete headings with command placeholders such as `<id>` and `<deviceId>` instead of hiding required arguments. [#99099](https://github.com/openclaw/openclaw/pull/99099) Thanks @hxy91819. ### Additional contributions Maintainer-facing contributions: [#59695](https://github.com/openclaw/openclaw/pull/59695), [#73649](https://github.com/openclaw/openclaw/pull/73649), [#83826](https://github.com/openclaw/openclaw/pull/83826), [#87081](https://github.com/openclaw/openclaw/pull/87081), [#87695](https://github.com/openclaw/openclaw/pull/87695), [#89535](https://github.com/openclaw/openclaw/pull/89535), [#89558](https://github.com/openclaw/openclaw/pull/89558), [#89585](https://github.com/openclaw/openclaw/pull/89585), [#90365](https://github.com/openclaw/openclaw/pull/90365), [#90547](https://github.com/openclaw/openclaw/pull/90547), [#91134](https://github.com/openclaw/openclaw/pull/91134), [#91276](https://github.com/openclaw/openclaw/pull/91276), [#91483](https://github.com/openclaw/openclaw/pull/91483), [#91519](https://github.com/openclaw/openclaw/pull/91519), [#91728](https://github.com/openclaw/openclaw/pull/91728), [#91907](https://github.com/openclaw/openclaw/pull/91907), [#92667](https://github.com/openclaw/openclaw/pull/92667), [#93209](https://github.com/openclaw/openclaw/pull/93209), [#94291](https://github.com/openclaw/openclaw/pull/94291), [#94526](https://github.com/openclaw/openclaw/pull/94526) (related [#89352](https://github.com/openclaw/openclaw/issues/89352)), [#94708](https://github.com/openclaw/openclaw/pull/94708), [#95211](https://github.com/openclaw/openclaw/pull/95211), [#95230](https://github.com/openclaw/openclaw/pull/95230), [#95531](https://github.com/openclaw/openclaw/pull/95531), [#95534](https://github.com/openclaw/openclaw/pull/95534), [#95622](https://github.com/openclaw/openclaw/pull/95622), [#95842](https://github.com/openclaw/openclaw/pull/95842), [#95920](https://github.com/openclaw/openclaw/pull/95920), [#95954](https://github.com/openclaw/openclaw/pull/95954), [#96058](https://github.com/openclaw/openclaw/pull/96058), [#96094](https://github.com/openclaw/openclaw/pull/96094) (related [#91167](https://github.com/openclaw/openclaw/issues/91167)), [#96222](https://github.com/openclaw/openclaw/pull/96222), [#96225](https://github.com/openclaw/openclaw/pull/96225), [#96302](https://github.com/openclaw/openclaw/pull/96302), [#96320](https://github.com/openclaw/openclaw/pull/96320), [#96327](https://github.com/openclaw/openclaw/pull/96327), [#96338](https://github.com/openclaw/openclaw/pull/96338), [#96340](https://github.com/openclaw/openclaw/pull/96340), [#96359](https://github.com/openclaw/openclaw/pull/96359), [#96360](https://github.com/openclaw/openclaw/pull/96360), [#96366](https://github.com/openclaw/openclaw/pull/96366), [#96434](https://github.com/openclaw/openclaw/pull/96434), [#96448](https://github.com/openclaw/openclaw/pull/96448), [#96460](https://github.com/openclaw/openclaw/pull/96460), [#96507](https://github.com/openclaw/openclaw/pull/96507), [#96524](https://github.com/openclaw/openclaw/pull/96524), [#96527](https://github.com/openclaw/openclaw/pull/96527), [#96530](https://github.com/openclaw/openclaw/pull/96530), [#96539](https://github.com/openclaw/openclaw/pull/96539), [#96543](https://github.com/openclaw/openclaw/pull/96543), [#96567](https://github.com/openclaw/openclaw/pull/96567), [#96594](https://github.com/openclaw/openclaw/pull/96594), [#96595](https://github.com/openclaw/openclaw/pull/96595), [#96707](https://github.com/openclaw/openclaw/pull/96707), [#96711](https://github.com/openclaw/openclaw/pull/96711), [#96714](https://github.com/openclaw/openclaw/pull/96714), [#96735](https://github.com/openclaw/openclaw/pull/96735), [#96736](https://github.com/openclaw/openclaw/pull/96736), [#96765](https://github.com/openclaw/openclaw/pull/96765), [#96811](https://github.com/openclaw/openclaw/pull/96811), [#96930](https://github.com/openclaw/openclaw/pull/96930), [#96945](https://github.com/openclaw/openclaw/pull/96945), [#96948](https://github.com/openclaw/openclaw/pull/96948), [#96950](https://github.com/openclaw/openclaw/pull/96950), [#96952](https://github.com/openclaw/openclaw/pull/96952), [#96955](https://github.com/openclaw/openclaw/pull/96955), [#96964](https://github.com/openclaw/openclaw/pull/96964), [#97079](https://github.com/openclaw/openclaw/pull/97079), [#97101](https://github.com/openclaw/openclaw/pull/97101), [#97110](https://github.com/openclaw/openclaw/pull/97110), [#97113](https://github.com/openclaw/openclaw/pull/97113), [#97116](https://github.com/openclaw/openclaw/pull/97116), [#97119](https://github.com/openclaw/openclaw/pull/97119), [#97124](https://github.com/openclaw/openclaw/pull/97124), [#97133](https://github.com/openclaw/openclaw/pull/97133), [#97150](https://github.com/openclaw/openclaw/pull/97150), [#97151](https://github.com/openclaw/openclaw/pull/97151), [#97181](https://github.com/openclaw/openclaw/pull/97181), [#97250](https://github.com/openclaw/openclaw/pull/97250), [#97297](https://github.com/openclaw/openclaw/pull/97297), [#97306](https://github.com/openclaw/openclaw/pull/97306), [#97348](https://github.com/openclaw/openclaw/pull/97348), [#97351](https://github.com/openclaw/openclaw/pull/97351), [#97369](https://github.com/openclaw/openclaw/pull/97369), [#97370](https://github.com/openclaw/openclaw/pull/97370), [#97374](https://github.com/openclaw/openclaw/pull/97374), [#97478](https://github.com/openclaw/openclaw/pull/97478), [#97547](https://github.com/openclaw/openclaw/pull/97547), [#97548](https://github.com/openclaw/openclaw/pull/97548), [#97604](https://github.com/openclaw/openclaw/pull/97604), [#97609](https://github.com/openclaw/openclaw/pull/97609), [#97632](https://github.com/openclaw/openclaw/pull/97632), [#97657](https://github.com/openclaw/openclaw/pull/97657), [#97661](https://github.com/openclaw/openclaw/pull/97661), [#97689](https://github.com/openclaw/openclaw/pull/97689), [#97701](https://github.com/openclaw/openclaw/pull/97701), [#97708](https://github.com/openclaw/openclaw/pull/97708), [#97712](https://github.com/openclaw/openclaw/pull/97712), [#97714](https://github.com/openclaw/openclaw/pull/97714), [#97736](https://github.com/openclaw/openclaw/pull/97736), [#97802](https://github.com/openclaw/openclaw/pull/97802), [#97803](https://github.com/openclaw/openclaw/pull/97803), [#97805](https://github.com/openclaw/openclaw/pull/97805), [#97891](https://github.com/openclaw/openclaw/pull/97891), [#97896](https://github.com/openclaw/openclaw/pull/97896), [#97898](https://github.com/openclaw/openclaw/pull/97898) (related [#97792](https://github.com/openclaw/openclaw/issues/97792)), [#97900](https://github.com/openclaw/openclaw/pull/97900), [#97907](https://github.com/openclaw/openclaw/pull/97907), [#97912](https://github.com/openclaw/openclaw/pull/97912), [#97915](https://github.com/openclaw/openclaw/pull/97915), [#97937](https://github.com/openclaw/openclaw/pull/97937), [#97940](https://github.com/openclaw/openclaw/pull/97940), [#97941](https://github.com/openclaw/openclaw/pull/97941), [#97943](https://github.com/openclaw/openclaw/pull/97943), [#97946](https://github.com/openclaw/openclaw/pull/97946), [#97947](https://github.com/openclaw/openclaw/pull/97947), [#97948](https://github.com/openclaw/openclaw/pull/97948), [#97950](https://github.com/openclaw/openclaw/pull/97950), [#97951](https://github.com/openclaw/openclaw/pull/97951), [#97959](https://github.com/openclaw/openclaw/pull/97959), [#97962](https://github.com/openclaw/openclaw/pull/97962), [#98009](https://github.com/openclaw/openclaw/pull/98009), [#98087](https://github.com/openclaw/openclaw/pull/98087), [#98134](https://github.com/openclaw/openclaw/pull/98134), [#98138](https://github.com/openclaw/openclaw/pull/98138), [#98205](https://github.com/openclaw/openclaw/pull/98205), [#98219](https://github.com/openclaw/openclaw/pull/98219), [#98233](https://github.com/openclaw/openclaw/pull/98233), [#98249](https://github.com/openclaw/openclaw/pull/98249), [#98319](https://github.com/openclaw/openclaw/pull/98319), [#98325](https://github.com/openclaw/openclaw/pull/98325), [#98369](https://github.com/openclaw/openclaw/pull/98369), [#98370](https://github.com/openclaw/openclaw/pull/98370), [#98395](https://github.com/openclaw/openclaw/pull/98395), [#98494](https://github.com/openclaw/openclaw/pull/98494), [#98533](https://github.com/openclaw/openclaw/pull/98533), [#98536](https://github.com/openclaw/openclaw/pull/98536), [#98551](https://github.com/openclaw/openclaw/pull/98551), [#98598](https://github.com/openclaw/openclaw/pull/98598) (related [#98462](https://github.com/openclaw/openclaw/issues/98462), [#98464](https://github.com/openclaw/openclaw/issues/98464)), [#98605](https://github.com/openclaw/openclaw/pull/98605), [#98610](https://github.com/openclaw/openclaw/pull/98610), [#98611](https://github.com/openclaw/openclaw/pull/98611) (related [#98566](https://github.com/openclaw/openclaw/issues/98566)), [#98619](https://github.com/openclaw/openclaw/pull/98619), [#98701](https://github.com/openclaw/openclaw/pull/98701), [#98749](https://github.com/openclaw/openclaw/pull/98749), [#98751](https://github.com/openclaw/openclaw/pull/98751), [#98779](https://github.com/openclaw/openclaw/pull/98779), [#98792](https://github.com/openclaw/openclaw/pull/98792), [#98808](https://github.com/openclaw/openclaw/pull/98808), [#98818](https://github.com/openclaw/openclaw/pull/98818), [#99098](https://github.com/openclaw/openclaw/pull/99098), [#99151](https://github.com/openclaw/openclaw/pull/99151), [#99165](https://github.com/openclaw/openclaw/pull/99165), [#99169](https://github.com/openclaw/openclaw/pull/99169), [#99212](https://github.com/openclaw/openclaw/pull/99212), [#99233](https://github.com/openclaw/openclaw/pull/99233), [#99261](https://github.com/openclaw/openclaw/pull/99261), [#99262](https://github.com/openclaw/openclaw/pull/99262), [#99264](https://github.com/openclaw/openclaw/pull/99264), [#99265](https://github.com/openclaw/openclaw/pull/99265), [#99278](https://github.com/openclaw/openclaw/pull/99278), [#99294](https://github.com/openclaw/openclaw/pull/99294), [#99296](https://github.com/openclaw/openclaw/pull/99296), [#99298](https://github.com/openclaw/openclaw/pull/99298), [#99302](https://github.com/openclaw/openclaw/pull/99302), [#99303](https://github.com/openclaw/openclaw/pull/99303), [#99307](https://github.com/openclaw/openclaw/pull/99307), [#99310](https://github.com/openclaw/openclaw/pull/99310), [#99352](https://github.com/openclaw/openclaw/pull/99352), [#99355](https://github.com/openclaw/openclaw/pull/99355), [#99359](https://github.com/openclaw/openclaw/pull/99359), [#99361](https://github.com/openclaw/openclaw/pull/99361), [#99368](https://github.com/openclaw/openclaw/pull/99368), [#99374](https://github.com/openclaw/openclaw/pull/99374), [#99520](https://github.com/openclaw/openclaw/pull/99520) (related [#99513](https://github.com/openclaw/openclaw/issues/99513)), [#99607](https://github.com/openclaw/openclaw/pull/99607), [#99628](https://github.com/openclaw/openclaw/pull/99628) (related [#99627](https://github.com/openclaw/openclaw/issues/99627)), [#99629](https://github.com/openclaw/openclaw/pull/99629), [#99632](https://github.com/openclaw/openclaw/pull/99632) (related [#99622](https://github.com/openclaw/openclaw/issues/99622)), [#99642](https://github.com/openclaw/openclaw/pull/99642), [#99649](https://github.com/openclaw/openclaw/pull/99649) (related [#99648](https://github.com/openclaw/openclaw/issues/99648)), [#99656](https://github.com/openclaw/openclaw/pull/99656) (related [#99655](https://github.com/openclaw/openclaw/issues/99655)), [#99671](https://github.com/openclaw/openclaw/pull/99671) (related [#99667](https://github.com/openclaw/openclaw/issues/99667)), [#99676](https://github.com/openclaw/openclaw/pull/99676) (related [#99663](https://github.com/openclaw/openclaw/issues/99663)), [#99679](https://github.com/openclaw/openclaw/pull/99679) (related [#99664](https://github.com/openclaw/openclaw/issues/99664)), [#99682](https://github.com/openclaw/openclaw/pull/99682) (related [#99674](https://github.com/openclaw/openclaw/issues/99674)), [#99687](https://github.com/openclaw/openclaw/pull/99687) (related [#99675](https://github.com/openclaw/openclaw/issues/99675)), [#99688](https://github.com/openclaw/openclaw/pull/99688), [#99691](https://github.com/openclaw/openclaw/pull/99691), [#99702](https://github.com/openclaw/openclaw/pull/99702) (related [#99697](https://github.com/openclaw/openclaw/issues/99697)), [#99705](https://github.com/openclaw/openclaw/pull/99705), [#99707](https://github.com/openclaw/openclaw/pull/99707), [#99710](https://github.com/openclaw/openclaw/pull/99710), [#99715](https://github.com/openclaw/openclaw/pull/99715), [#99717](https://github.com/openclaw/openclaw/pull/99717), [#99718](https://github.com/openclaw/openclaw/pull/99718), [#99719](https://github.com/openclaw/openclaw/pull/99719), [#99721](https://github.com/openclaw/openclaw/pull/99721), [#99735](https://github.com/openclaw/openclaw/pull/99735), [#99736](https://github.com/openclaw/openclaw/pull/99736) (related [#99734](https://github.com/openclaw/openclaw/issues/99734)), [#99737](https://github.com/openclaw/openclaw/pull/99737), [#99743](https://github.com/openclaw/openclaw/pull/99743), [#99744](https://github.com/openclaw/openclaw/pull/99744), [#99746](https://github.com/openclaw/openclaw/pull/99746), [#99750](https://github.com/openclaw/openclaw/pull/99750), [#99753](https://github.com/openclaw/openclaw/pull/99753), [#99755](https://github.com/openclaw/openclaw/pull/99755), [#99766](https://github.com/openclaw/openclaw/pull/99766), [#99771](https://github.com/openclaw/openclaw/pull/99771), [#99777](https://github.com/openclaw/openclaw/pull/99777), [#99778](https://github.com/openclaw/openclaw/pull/99778), [#99784](https://github.com/openclaw/openclaw/pull/99784), [#99785](https://github.com/openclaw/openclaw/pull/99785), [#99786](https://github.com/openclaw/openclaw/pull/99786), [#99788](https://github.com/openclaw/openclaw/pull/99788), [#99790](https://github.com/openclaw/openclaw/pull/99790), [#99793](https://github.com/openclaw/openclaw/pull/99793), [#99816](https://github.com/openclaw/openclaw/pull/99816), [#99820](https://github.com/openclaw/openclaw/pull/99820), [#99850](https://github.com/openclaw/openclaw/pull/99850), [#99900](https://github.com/openclaw/openclaw/pull/99900), [#99909](https://github.com/openclaw/openclaw/pull/99909), [#99917](https://github.com/openclaw/openclaw/pull/99917), [#99940](https://github.com/openclaw/openclaw/pull/99940), [#99944](https://github.com/openclaw/openclaw/pull/99944), [#99945](https://github.com/openclaw/openclaw/pull/99945), [#99969](https://github.com/openclaw/openclaw/pull/99969), [#99988](https://github.com/openclaw/openclaw/pull/99988), [#100002](https://github.com/openclaw/openclaw/pull/100002), [#100008](https://github.com/openclaw/openclaw/pull/100008), [#100015](https://github.com/openclaw/openclaw/pull/100015), [#100019](https://github.com/openclaw/openclaw/pull/100019), [#100024](https://github.com/openclaw/openclaw/pull/100024), [#100039](https://github.com/openclaw/openclaw/pull/100039), [#100053](https://github.com/openclaw/openclaw/pull/100053), [#100061](https://github.com/openclaw/openclaw/pull/100061), [#100069](https://github.com/openclaw/openclaw/pull/100069), [#100083](https://github.com/openclaw/openclaw/pull/100083), [#100087](https://github.com/openclaw/openclaw/pull/100087), [#100108](https://github.com/openclaw/openclaw/pull/100108), [#100114](https://github.com/openclaw/openclaw/pull/100114), [#100122](https://github.com/openclaw/openclaw/pull/100122), [#100183](https://github.com/openclaw/openclaw/pull/100183), [#100186](https://github.com/openclaw/openclaw/pull/100186), [#100200](https://github.com/openclaw/openclaw/pull/100200), [#100201](https://github.com/openclaw/openclaw/pull/100201), [#100206](https://github.com/openclaw/openclaw/pull/100206), [#100210](https://github.com/openclaw/openclaw/pull/100210), [#100220](https://github.com/openclaw/openclaw/pull/100220), [#100221](https://github.com/openclaw/openclaw/pull/100221), [#100222](https://github.com/openclaw/openclaw/pull/100222), [#100223](https://github.com/openclaw/openclaw/pull/100223), [#100239](https://github.com/openclaw/openclaw/pull/100239), [#100242](https://github.com/openclaw/openclaw/pull/100242), [#100243](https://github.com/openclaw/openclaw/pull/100243), [#100249](https://github.com/openclaw/openclaw/pull/100249), [#100253](https://github.com/openclaw/openclaw/pull/100253), [#100259](https://github.com/openclaw/openclaw/pull/100259), [#100272](https://github.com/openclaw/openclaw/pull/100272), [#100278](https://github.com/openclaw/openclaw/pull/100278), [#100304](https://github.com/openclaw/openclaw/pull/100304), [#100332](https://github.com/openclaw/openclaw/pull/100332), [#100346](https://github.com/openclaw/openclaw/pull/100346), [#100355](https://github.com/openclaw/openclaw/pull/100355), [#100370](https://github.com/openclaw/openclaw/pull/100370), [#100420](https://github.com/openclaw/openclaw/pull/100420), [#100437](https://github.com/openclaw/openclaw/pull/100437), [#100441](https://github.com/openclaw/openclaw/pull/100441), [#100459](https://github.com/openclaw/openclaw/pull/100459), [#100464](https://github.com/openclaw/openclaw/pull/100464), [#100466](https://github.com/openclaw/openclaw/pull/100466), [#100469](https://github.com/openclaw/openclaw/pull/100469), [#100472](https://github.com/openclaw/openclaw/pull/100472), [#100473](https://github.com/openclaw/openclaw/pull/100473), [#100495](https://github.com/openclaw/openclaw/pull/100495), [#100497](https://github.com/openclaw/openclaw/pull/100497), [#100507](https://github.com/openclaw/openclaw/pull/100507), [#100517](https://github.com/openclaw/openclaw/pull/100517), [#100532](https://github.com/openclaw/openclaw/pull/100532), [#100533](https://github.com/openclaw/openclaw/pull/100533), [#100536](https://github.com/openclaw/openclaw/pull/100536), [#100543](https://github.com/openclaw/openclaw/pull/100543), [#100545](https://github.com/openclaw/openclaw/pull/100545), [#100555](https://github.com/openclaw/openclaw/pull/100555), [#100561](https://github.com/openclaw/openclaw/pull/100561), [#100562](https://github.com/openclaw/openclaw/pull/100562), [#100575](https://github.com/openclaw/openclaw/pull/100575), [#100593](https://github.com/openclaw/openclaw/pull/100593), [#100599](https://github.com/openclaw/openclaw/pull/100599), [#100603](https://github.com/openclaw/openclaw/pull/100603), [#100609](https://github.com/openclaw/openclaw/pull/100609), [#100611](https://github.com/openclaw/openclaw/pull/100611), [#100612](https://github.com/openclaw/openclaw/pull/100612), [#100650](https://github.com/openclaw/openclaw/pull/100650), [#100663](https://github.com/openclaw/openclaw/pull/100663), [#100702](https://github.com/openclaw/openclaw/pull/100702), [#100703](https://github.com/openclaw/openclaw/pull/100703), [#100723](https://github.com/openclaw/openclaw/pull/100723), [#100740](https://github.com/openclaw/openclaw/pull/100740), [#100781](https://github.com/openclaw/openclaw/pull/100781), [#100793](https://github.com/openclaw/openclaw/pull/100793), [#100804](https://github.com/openclaw/openclaw/pull/100804), [#100823](https://github.com/openclaw/openclaw/pull/100823), [#100856](https://github.com/openclaw/openclaw/pull/100856), [#100882](https://github.com/openclaw/openclaw/pull/100882), [#100887](https://github.com/openclaw/openclaw/pull/100887), [#100895](https://github.com/openclaw/openclaw/pull/100895), [#100897](https://github.com/openclaw/openclaw/pull/100897), [#100903](https://github.com/openclaw/openclaw/pull/100903), [#100909](https://github.com/openclaw/openclaw/pull/100909), [#100931](https://github.com/openclaw/openclaw/pull/100931), [#100950](https://github.com/openclaw/openclaw/pull/100950), [#100952](https://github.com/openclaw/openclaw/pull/100952), [#100961](https://github.com/openclaw/openclaw/pull/100961), [#100975](https://github.com/openclaw/openclaw/pull/100975), [#100989](https://github.com/openclaw/openclaw/pull/100989), [#100990](https://github.com/openclaw/openclaw/pull/100990), [#100992](https://github.com/openclaw/openclaw/pull/100992), [#101012](https://github.com/openclaw/openclaw/pull/101012), [#101013](https://github.com/openclaw/openclaw/pull/101013), [#101041](https://github.com/openclaw/openclaw/pull/101041), [#101045](https://github.com/openclaw/openclaw/pull/101045), [#101051](https://github.com/openclaw/openclaw/pull/101051), [#101055](https://github.com/openclaw/openclaw/pull/101055), [#101063](https://github.com/openclaw/openclaw/pull/101063), [#101076](https://github.com/openclaw/openclaw/pull/101076), [#101080](https://github.com/openclaw/openclaw/pull/101080), [#101081](https://github.com/openclaw/openclaw/pull/101081), [#101112](https://github.com/openclaw/openclaw/pull/101112), [#101128](https://github.com/openclaw/openclaw/pull/101128), [#101131](https://github.com/openclaw/openclaw/pull/101131), [#101135](https://github.com/openclaw/openclaw/pull/101135), [#101165](https://github.com/openclaw/openclaw/pull/101165), [#101173](https://github.com/openclaw/openclaw/pull/101173), [#101174](https://github.com/openclaw/openclaw/pull/101174), [#101178](https://github.com/openclaw/openclaw/pull/101178), [#101179](https://github.com/openclaw/openclaw/pull/101179), [#101180](https://github.com/openclaw/openclaw/pull/101180), [#101184](https://github.com/openclaw/openclaw/pull/101184), [#101185](https://github.com/openclaw/openclaw/pull/101185), [#101186](https://github.com/openclaw/openclaw/pull/101186), [#101196](https://github.com/openclaw/openclaw/pull/101196), [#101223](https://github.com/openclaw/openclaw/pull/101223), [#101232](https://github.com/openclaw/openclaw/pull/101232), [#101233](https://github.com/openclaw/openclaw/pull/101233), [#101242](https://github.com/openclaw/openclaw/pull/101242), [#101243](https://github.com/openclaw/openclaw/pull/101243), [#101262](https://github.com/openclaw/openclaw/pull/101262), [#101273](https://github.com/openclaw/openclaw/pull/101273), [#101275](https://github.com/openclaw/openclaw/pull/101275), [#101315](https://github.com/openclaw/openclaw/pull/101315), [#101331](https://github.com/openclaw/openclaw/pull/101331), [#101339](https://github.com/openclaw/openclaw/pull/101339), [#101356](https://github.com/openclaw/openclaw/pull/101356), [#101362](https://github.com/openclaw/openclaw/pull/101362), [#101372](https://github.com/openclaw/openclaw/pull/101372), [#101379](https://github.com/openclaw/openclaw/pull/101379), [#101393](https://github.com/openclaw/openclaw/pull/101393), [#101406](https://github.com/openclaw/openclaw/pull/101406), [#101425](https://github.com/openclaw/openclaw/pull/101425), [#101440](https://github.com/openclaw/openclaw/pull/101440), [#101452](https://github.com/openclaw/openclaw/pull/101452), [#101466](https://github.com/openclaw/openclaw/pull/101466), [#101470](https://github.com/openclaw/openclaw/pull/101470), [#101508](https://github.com/openclaw/openclaw/pull/101508), [#101519](https://github.com/openclaw/openclaw/pull/101519), [#101523](https://github.com/openclaw/openclaw/pull/101523), [#101549](https://github.com/openclaw/openclaw/pull/101549), [#101566](https://github.com/openclaw/openclaw/pull/101566), [#101568](https://github.com/openclaw/openclaw/pull/101568), [#101579](https://github.com/openclaw/openclaw/pull/101579), [#101583](https://github.com/openclaw/openclaw/pull/101583), [#101594](https://github.com/openclaw/openclaw/pull/101594), [#101604](https://github.com/openclaw/openclaw/pull/101604), [#101632](https://github.com/openclaw/openclaw/pull/101632), [#101647](https://github.com/openclaw/openclaw/pull/101647), [#101666](https://github.com/openclaw/openclaw/pull/101666), [#101680](https://github.com/openclaw/openclaw/pull/101680), [#101682](https://github.com/openclaw/openclaw/pull/101682), [#101688](https://github.com/openclaw/openclaw/pull/101688), [#101689](https://github.com/openclaw/openclaw/pull/101689), [#101699](https://github.com/openclaw/openclaw/pull/101699), [#101701](https://github.com/openclaw/openclaw/pull/101701), [#101726](https://github.com/openclaw/openclaw/pull/101726), [#101731](https://github.com/openclaw/openclaw/pull/101731), [#101757](https://github.com/openclaw/openclaw/pull/101757), [#101758](https://github.com/openclaw/openclaw/pull/101758), [#101771](https://github.com/openclaw/openclaw/pull/101771), [#101831](https://github.com/openclaw/openclaw/pull/101831), [#101834](https://github.com/openclaw/openclaw/pull/101834), [#101858](https://github.com/openclaw/openclaw/pull/101858), [#101860](https://github.com/openclaw/openclaw/pull/101860), [#101869](https://github.com/openclaw/openclaw/pull/101869), [#101875](https://github.com/openclaw/openclaw/pull/101875), [#101886](https://github.com/openclaw/openclaw/pull/101886), [#101889](https://github.com/openclaw/openclaw/pull/101889), [#101892](https://github.com/openclaw/openclaw/pull/101892), [#101894](https://github.com/openclaw/openclaw/pull/101894), [#101896](https://github.com/openclaw/openclaw/pull/101896), [#101898](https://github.com/openclaw/openclaw/pull/101898), [#101903](https://github.com/openclaw/openclaw/pull/101903), [#101904](https://github.com/openclaw/openclaw/pull/101904), [#101907](https://github.com/openclaw/openclaw/pull/101907), [#101915](https://github.com/openclaw/openclaw/pull/101915), [#101917](https://github.com/openclaw/openclaw/pull/101917), [#101922](https://github.com/openclaw/openclaw/pull/101922), [#101925](https://github.com/openclaw/openclaw/pull/101925), [#101931](https://github.com/openclaw/openclaw/pull/101931), [#101936](https://github.com/openclaw/openclaw/pull/101936), [#101941](https://github.com/openclaw/openclaw/pull/101941), [#101945](https://github.com/openclaw/openclaw/pull/101945), [#101949](https://github.com/openclaw/openclaw/pull/101949), [#101954](https://github.com/openclaw/openclaw/pull/101954), [#101959](https://github.com/openclaw/openclaw/pull/101959), [#101963](https://github.com/openclaw/openclaw/pull/101963), [#101969](https://github.com/openclaw/openclaw/pull/101969), [#101974](https://github.com/openclaw/openclaw/pull/101974), [#101980](https://github.com/openclaw/openclaw/pull/101980), [#101987](https://github.com/openclaw/openclaw/pull/101987), [#101990](https://github.com/openclaw/openclaw/pull/101990), [#102005](https://github.com/openclaw/openclaw/pull/102005), [#102010](https://github.com/openclaw/openclaw/pull/102010), [#102021](https://github.com/openclaw/openclaw/pull/102021), [#102029](https://github.com/openclaw/openclaw/pull/102029), [#102037](https://github.com/openclaw/openclaw/pull/102037), [#102040](https://github.com/openclaw/openclaw/pull/102040), [#102042](https://github.com/openclaw/openclaw/pull/102042), [#102044](https://github.com/openclaw/openclaw/pull/102044), [#102048](https://github.com/openclaw/openclaw/pull/102048), [#102059](https://github.com/openclaw/openclaw/pull/102059), [#102065](https://github.com/openclaw/openclaw/pull/102065), [#102159](https://github.com/openclaw/openclaw/pull/102159), [#102256](https://github.com/openclaw/openclaw/pull/102256), [#102600](https://github.com/openclaw/openclaw/pull/102600), [#102732](https://github.com/openclaw/openclaw/pull/102732), [#103163](https://github.com/openclaw/openclaw/pull/103163), [#103244](https://github.com/openclaw/openclaw/pull/103244), [#103467](https://github.com/openclaw/openclaw/pull/103467), [#103556](https://github.com/openclaw/openclaw/pull/103556), [#103564](https://github.com/openclaw/openclaw/pull/103564), [#103635](https://github.com/openclaw/openclaw/pull/103635), [#103650](https://github.com/openclaw/openclaw/pull/103650), [#103654](https://github.com/openclaw/openclaw/pull/103654), [#103681](https://github.com/openclaw/openclaw/pull/103681), [#103685](https://github.com/openclaw/openclaw/pull/103685), [#103718](https://github.com/openclaw/openclaw/pull/103718), [#103906](https://github.com/openclaw/openclaw/pull/103906), [#103923](https://github.com/openclaw/openclaw/pull/103923), [#104162](https://github.com/openclaw/openclaw/pull/104162), [#104186](https://github.com/openclaw/openclaw/pull/104186), [#104684](https://github.com/openclaw/openclaw/pull/104684), [#104702](https://github.com/openclaw/openclaw/pull/104702), [#104722](https://github.com/openclaw/openclaw/pull/104722), [#104750](https://github.com/openclaw/openclaw/pull/104750), [#104794](https://github.com/openclaw/openclaw/pull/104794), [#104939](https://github.com/openclaw/openclaw/pull/104939), [#104975](https://github.com/openclaw/openclaw/pull/104975), [#105133](https://github.com/openclaw/openclaw/pull/105133), [#105401](https://github.com/openclaw/openclaw/pull/105401), [#105444](https://github.com/openclaw/openclaw/pull/105444), [#105488](https://github.com/openclaw/openclaw/pull/105488), [#105493](https://github.com/openclaw/openclaw/pull/105493), [#105500](https://github.com/openclaw/openclaw/pull/105500). Thanks @100yenadmin, @645648406-max, @849261680, @acosx, @aleps001, @alix-007, @aniruddhaadak80, @bartok9, @brian-bell, @brokemac79, @bryantegomoh, @clawsean, @cxbasdev, @d1rshan, @dboone323, @deepujain, @dwc1997, @evan-ym, @fuller-stack-dev, @galiniliev, @giodl73-repo, @glenn-agent, @goutamadwant, @guanbear, @haishmg, @hannesrudolph, @hemantsudarshan, @hugenshen, @hxy91819, @hyspacex, @iwhatsskill, @jalehman, @joshavant, @keaneyan, @kesslerio, @kevinslin, @kiagentkronos-cell, @leonidaslux, @lin-hongkuan, @luoyanglang, @ly-wang19, @lzw112, @marvinthebored, @masatohoshino, @maweibin, @mcaxtr, @miorbnli, @ml12580, @morluto, @mushuiyu886, @neatguycoding, @nxmxbbd, @obviyus, @ooiuuii, @osolmaz, @patrick-erichsen, @peetiegonzalez, @pikaqqqqqq, @pmika, @qingminglong, @qiuyuang, @romneyda, @ruanrrn, @saju01, @sebtardif, @shakkernerd, @solodmd, @solvely-colin, @steipete-oai, @sunlit-deng, @super-cabbage, @sweetcornna, @tiffanychum, @totobusnello, @turbotheturtle, @vincentkoc, @vishal-dharm, @vishalj99, @wiidz, @wm0018, @wuqxuan, @xialonglee, @xianshishan, @yonganzhang, @zenglingbiao, @zengwen-dt, @zhangguiping-xydt, @zhanglei99586, @zw-xysk. ## 2026.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. [#58993](https://github.com/openclaw/openclaw/pull/58993) Thanks @starhappysh, @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. [#89172](https://github.com/openclaw/openclaw/pull/89172) Related [#53798](https://github.com/openclaw/openclaw/issues/53798). Thanks @areslp, @fxz26284407, @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. [#89911](https://github.com/openclaw/openclaw/pull/89911) Thanks @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. [#89949](https://github.com/openclaw/openclaw/pull/89949) Related [#86034](https://github.com/openclaw/openclaw/issues/86034). Thanks @tianxiaochannel-oss88, @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. [#90475](https://github.com/openclaw/openclaw/pull/90475) Thanks @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. [#92154](https://github.com/openclaw/openclaw/pull/92154) Thanks @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. [#92356](https://github.com/openclaw/openclaw/pull/92356) Related [#92260](https://github.com/openclaw/openclaw/issues/92260). Thanks @jmpei, @tangtaizong666, @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. [#93002](https://github.com/openclaw/openclaw/pull/93002) Related [#90753](https://github.com/openclaw/openclaw/issues/90753). Thanks @shadow-enthusiast, @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. [#93143](https://github.com/openclaw/openclaw/pull/93143) Thanks @omarshahine. - Successful Discord replies sent through the message tool no longer trigger a misleading failure warning in affected `message_tool_only` source-channel turns. [#94072](https://github.com/openclaw/openclaw/pull/94072) Related [#93875](https://github.com/openclaw/openclaw/issues/93875). Thanks @chenyangjun-xy, @hoyanhan, @vincentkoc. - WhatsApp group conversations now preserve the right message and group context more reliably during retries, reconnects, and group changes. [#94338](https://github.com/openclaw/openclaw/pull/94338) Related [#7433](https://github.com/openclaw/openclaw/issues/7433). Thanks @mcaxtr, @octopuslabs-fl, @xialonglee. - Fixes OpenClaw sometimes replying to its own delayed iMessage echoes when stray leading characters keep the sent message from being recognized. [#94442](https://github.com/openclaw/openclaw/pull/94442) Thanks @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. [#94506](https://github.com/openclaw/openclaw/pull/94506) Related [#90254](https://github.com/openclaw/openclaw/issues/90254). Thanks @obviyus, @travellingsoldier85, @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. [#94942](https://github.com/openclaw/openclaw/pull/94942) Related [#90455](https://github.com/openclaw/openclaw/issues/90455). Thanks @xzh-icenter, @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. [#94977](https://github.com/openclaw/openclaw/pull/94977) Related [#71140](https://github.com/openclaw/openclaw/issues/71140). Thanks @cuttingwater, @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. [#95007](https://github.com/openclaw/openclaw/pull/95007) Related [#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. [#95069](https://github.com/openclaw/openclaw/pull/95069) Related [#94930](https://github.com/openclaw/openclaw/issues/94930). Thanks @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. [#95084](https://github.com/openclaw/openclaw/pull/95084) Related [#90684](https://github.com/openclaw/openclaw/issues/90684). Thanks @jailbirt, @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. [#95118](https://github.com/openclaw/openclaw/pull/95118) Related [#92903](https://github.com/openclaw/openclaw/issues/92903). Thanks @849261680, @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. [#95120](https://github.com/openclaw/openclaw/pull/95120) Related [#53638](https://github.com/openclaw/openclaw/issues/53638). Thanks @gandalf-at-lerian, @thomaszta, @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. [#95183](https://github.com/openclaw/openclaw/pull/95183) Related [#95004](https://github.com/openclaw/openclaw/issues/95004). Thanks @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. [#95240](https://github.com/openclaw/openclaw/pull/95240) Thanks @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. [#95278](https://github.com/openclaw/openclaw/pull/95278) Related [#94571](https://github.com/openclaw/openclaw/issues/94571). Thanks @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. [#95299](https://github.com/openclaw/openclaw/pull/95299) Related [#95248](https://github.com/openclaw/openclaw/issues/95248). Thanks @kriegerbangerz-ship-it, @mikasa0818, @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. [#95390](https://github.com/openclaw/openclaw/pull/95390) Related [#95378](https://github.com/openclaw/openclaw/issues/95378). Thanks @maiduy708, @mikasa0818, @obviyus. - Fixes completed assistant messages appearing twice in Telegram, Discord, Slack, and other streamed chats after a multi-message reply. [#95432](https://github.com/openclaw/openclaw/pull/95432) Thanks @vincentkoc, @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. [#95483](https://github.com/openclaw/openclaw/pull/95483) Thanks @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. [#95532](https://github.com/openclaw/openclaw/pull/95532) Related [#95409](https://github.com/openclaw/openclaw/issues/95409). Thanks @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. [#95546](https://github.com/openclaw/openclaw/pull/95546) Thanks @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. [#95550](https://github.com/openclaw/openclaw/pull/95550) Thanks @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. [#95552](https://github.com/openclaw/openclaw/pull/95552) Thanks @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. [#95577](https://github.com/openclaw/openclaw/pull/95577) Related [#86957](https://github.com/openclaw/openclaw/issues/86957). Thanks @freidrich-goldenflow, @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. [#95637](https://github.com/openclaw/openclaw/pull/95637) Thanks @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. [#95707](https://github.com/openclaw/openclaw/pull/95707) Thanks @sahibzada-allahyar, @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. [#95794](https://github.com/openclaw/openclaw/pull/95794) Thanks @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. [#95914](https://github.com/openclaw/openclaw/pull/95914) Thanks @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. [#95935](https://github.com/openclaw/openclaw/pull/95935) Thanks @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. [#96087](https://github.com/openclaw/openclaw/pull/96087) Thanks @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. [#96140](https://github.com/openclaw/openclaw/pull/96140) Related [#96103](https://github.com/openclaw/openclaw/issues/96103). Thanks @lansenger-pm, @vincentkoc, @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. [#96220](https://github.com/openclaw/openclaw/pull/96220) Thanks @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. [#96243](https://github.com/openclaw/openclaw/pull/96243) Related [#81566](https://github.com/openclaw/openclaw/issues/81566). Thanks @arkyu2077, @rafaelmgbh, @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. [#96244](https://github.com/openclaw/openclaw/pull/96244) Related [#95645](https://github.com/openclaw/openclaw/issues/95645). Thanks @arkyu2077, @iloveleon19, @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 @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 @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 @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 @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 @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 @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 @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. [#97543](https://github.com/openclaw/openclaw/pull/97543) Thanks @romneyda, @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. [#73079](https://github.com/openclaw/openclaw/pull/73079) Thanks @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. [#89648](https://github.com/openclaw/openclaw/pull/89648) Related [#89300](https://github.com/openclaw/openclaw/issues/89300). Thanks @enominera, @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. [#89716](https://github.com/openclaw/openclaw/pull/89716) Thanks @enominera, @masatohoshino. - Cron tool calls using Gemini models through OpenAI-compatible providers now run without nullable fields triggering provider schema rejections. [#91559](https://github.com/openclaw/openclaw/pull/91559) Related [#91542](https://github.com/openclaw/openclaw/issues/91542). Thanks @pick-cat, @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. [#91724](https://github.com/openclaw/openclaw/pull/91724) Thanks @vincentkoc, @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. [#93356](https://github.com/openclaw/openclaw/pull/93356) Thanks @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. [#93956](https://github.com/openclaw/openclaw/pull/93956) Thanks @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. [#94062](https://github.com/openclaw/openclaw/pull/94062) Related [#93931](https://github.com/openclaw/openclaw/issues/93931). Thanks @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. [#94233](https://github.com/openclaw/openclaw/pull/94233) Related [#56979](https://github.com/openclaw/openclaw/issues/56979). Thanks @goutamadwant, @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. [#94726](https://github.com/openclaw/openclaw/pull/94726) Related [#94723](https://github.com/openclaw/openclaw/issues/94723). Thanks @ajwan8998, @anguslogan01, @kevinat. - Dashboard child sessions now handle allowed provider-qualified model choices consistently and give accurate recovery guidance when saved model state is stale. [#94752](https://github.com/openclaw/openclaw/pull/94752) Related [#94713](https://github.com/openclaw/openclaw/issues/94713). Thanks @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. [#95008](https://github.com/openclaw/openclaw/pull/95008) Thanks @anagnorisis2peripeteia. - OpenClaw now rejects oversized provider catalog or JSON responses with a clear error before buffering the entire response in memory. [#95218](https://github.com/openclaw/openclaw/pull/95218) Thanks @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. [#95268](https://github.com/openclaw/openclaw/pull/95268) Related [#95198](https://github.com/openclaw/openclaw/issues/95198). Thanks @daniel-alejandro-t, @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. [#95283](https://github.com/openclaw/openclaw/pull/95283) Related [#95280](https://github.com/openclaw/openclaw/issues/95280). Thanks @marvinthebored, @vincentkoc, @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. [#95400](https://github.com/openclaw/openclaw/pull/95400) Thanks @jason-allen-oneal, @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. [#95401](https://github.com/openclaw/openclaw/pull/95401) Thanks @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. [#95417](https://github.com/openclaw/openclaw/pull/95417) Thanks @alix-007. - OpenRouter model scans fail safely on oversized or malformed catalogs instead of risking excessive memory use that can destabilize OpenClaw. [#95418](https://github.com/openclaw/openclaw/pull/95418) Thanks @alix-007. - OpenRouter setups now reject oversized model catalogs before they can exhaust OpenClaw's memory, without caching or immediately refetching the failed response. [#95420](https://github.com/openclaw/openclaw/pull/95420) Thanks @alix-007, @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. [#95508](https://github.com/openclaw/openclaw/pull/95508) Related [#95489](https://github.com/openclaw/openclaw/issues/95489). Thanks @mikasa0818, @riazrahaman, @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. [#95682](https://github.com/openclaw/openclaw/pull/95682) Thanks @sunjae-k, @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. [#95686](https://github.com/openclaw/openclaw/pull/95686) Thanks @fuller-stack-dev, @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. [#95710](https://github.com/openclaw/openclaw/pull/95710) Thanks @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. [#95744](https://github.com/openclaw/openclaw/pull/95744) Related [#95743](https://github.com/openclaw/openclaw/issues/95743). Thanks @parveshsaini. - First-run setup now opens the credential prompt for a newly installed external provider instead of appearing to loop and leaving OpenAI selected. [#95792](https://github.com/openclaw/openclaw/pull/95792) Related [#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. [#95827](https://github.com/openclaw/openclaw/pull/95827) Thanks @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. [#95934](https://github.com/openclaw/openclaw/pull/95934) Thanks @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. [#95957](https://github.com/openclaw/openclaw/pull/95957) Thanks @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. [#96124](https://github.com/openclaw/openclaw/pull/96124) Thanks @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 @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 @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 @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 @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 @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 @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 @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 @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 @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 @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. [#92399](https://github.com/openclaw/openclaw/pull/92399) Related [#91959](https://github.com/openclaw/openclaw/issues/91959). Thanks @amersheeny, @daimingnj, @phoenixyy, @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. [#93965](https://github.com/openclaw/openclaw/pull/93965) Related [#93610](https://github.com/openclaw/openclaw/issues/93610). Thanks @forceconstant, @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. [#84708](https://github.com/openclaw/openclaw/pull/84708) Thanks @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. [#87912](https://github.com/openclaw/openclaw/pull/87912) Thanks @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. [#89017](https://github.com/openclaw/openclaw/pull/89017) Related [#87700](https://github.com/openclaw/openclaw/issues/87700). Thanks @zhangguiping-xydt, @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. [#89518](https://github.com/openclaw/openclaw/pull/89518) Thanks @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. [#89800](https://github.com/openclaw/openclaw/pull/89800) Related [#89773](https://github.com/openclaw/openclaw/issues/89773). Thanks @killo3967, @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. [#89886](https://github.com/openclaw/openclaw/pull/89886) Related [#89868](https://github.com/openclaw/openclaw/issues/89868). Thanks @lykeion-dev, @openperf, @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. [#90489](https://github.com/openclaw/openclaw/pull/90489) Related [#90443](https://github.com/openclaw/openclaw/issues/90443). Thanks @ramitrkar-hash, @sahibzada-allahyar, @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. [#93113](https://github.com/openclaw/openclaw/pull/93113) Related [#67868](https://github.com/openclaw/openclaw/issues/67868). Thanks @agentarclab, @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. [#93394](https://github.com/openclaw/openclaw/pull/93394) Thanks @alix-007. - Repeated instructions sent after compaction now remain in the conversation, preventing lost turns, orphaned replies, and malformed history that some providers reject. [#94328](https://github.com/openclaw/openclaw/pull/94328) Thanks @vincentkoc, @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. [#94369](https://github.com/openclaw/openclaw/pull/94369) Thanks @sunnyshu0925, @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. [#94701](https://github.com/openclaw/openclaw/pull/94701) Thanks @imadal1n, @mrclawfield. - Ollama memory search now respects a configured smaller embedding dimension and keeps indexes for different dimensions separate, avoiding incompatible vectors being mixed together. [#94811](https://github.com/openclaw/openclaw/pull/94811) Thanks @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. [#95087](https://github.com/openclaw/openclaw/pull/95087) Thanks @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. [#95128](https://github.com/openclaw/openclaw/pull/95128) Thanks @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. [#95274](https://github.com/openclaw/openclaw/pull/95274) Related [#92302](https://github.com/openclaw/openclaw/issues/92302). Thanks @ardooken, @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. [#95322](https://github.com/openclaw/openclaw/pull/95322) Thanks @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. [#95467](https://github.com/openclaw/openclaw/pull/95467) Thanks @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. [#95472](https://github.com/openclaw/openclaw/pull/95472) Thanks @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. [#95699](https://github.com/openclaw/openclaw/pull/95699) Thanks @jalehman, @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. [#95782](https://github.com/openclaw/openclaw/pull/95782) Related [#95781](https://github.com/openclaw/openclaw/issues/95781). Thanks @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. [#95791](https://github.com/openclaw/openclaw/pull/95791) Thanks @sweetsophia, @vincentkoc, @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. [#95831](https://github.com/openclaw/openclaw/pull/95831) Related [#95693](https://github.com/openclaw/openclaw/issues/95693). Thanks @sallyom, @yui-tien. - Long, tool-heavy sessions now compact oversized conversations instead of getting stuck when a large tool result appears at the end. [#95860](https://github.com/openclaw/openclaw/pull/95860) Related [#78478](https://github.com/openclaw/openclaw/issues/78478). Thanks @jw8957, @wzhgba, @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. [#95916](https://github.com/openclaw/openclaw/pull/95916) Thanks @rrrrrredy, @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. [#96049](https://github.com/openclaw/openclaw/pull/96049) Thanks @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. [#96201](https://github.com/openclaw/openclaw/pull/96201) Thanks @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 @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 @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 @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. [#93374](https://github.com/openclaw/openclaw/pull/93374) Related [#92273](https://github.com/openclaw/openclaw/issues/92273). Thanks @mushuiyu886, @poison, @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. [#95484](https://github.com/openclaw/openclaw/pull/95484) Related [#76729](https://github.com/openclaw/openclaw/issues/76729). Thanks @maweibin, @njuboy11, @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. [#96162](https://github.com/openclaw/openclaw/pull/96162) Thanks @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. [#94054](https://github.com/openclaw/openclaw/pull/94054) Thanks @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. [#94545](https://github.com/openclaw/openclaw/pull/94545) Thanks @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. [#95175](https://github.com/openclaw/openclaw/pull/95175) Thanks @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. [#95691](https://github.com/openclaw/openclaw/pull/95691) Thanks @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 @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. [#95720](https://github.com/openclaw/openclaw/pull/95720) Related [#78396](https://github.com/openclaw/openclaw/issues/78396). Thanks @jteddy, @vincentkoc, @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. [#94707](https://github.com/openclaw/openclaw/pull/94707) Thanks @pash-openai, @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. [#95497](https://github.com/openclaw/openclaw/pull/95497) Thanks @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. [#68389](https://github.com/openclaw/openclaw/pull/68389) Related [#68352](https://github.com/openclaw/openclaw/issues/68352). Thanks @aym9999, @jirboy, @lyfuci, @pahuchi-joe, @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. [#78105](https://github.com/openclaw/openclaw/pull/78105) Related [#68780](https://github.com/openclaw/openclaw/issues/68780). Thanks @jirboy, @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`. [#89612](https://github.com/openclaw/openclaw/pull/89612) Related [#89609](https://github.com/openclaw/openclaw/issues/89609). Thanks @mugabuga, @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. [#91786](https://github.com/openclaw/openclaw/pull/91786) Related [#91772](https://github.com/openclaw/openclaw/issues/91772). Thanks @amknight, @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. [#91903](https://github.com/openclaw/openclaw/pull/91903) Thanks @lanzhi-lee, @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. [#93919](https://github.com/openclaw/openclaw/pull/93919) Related [#76209](https://github.com/openclaw/openclaw/issues/76209). Thanks @ml12580, @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. [#94154](https://github.com/openclaw/openclaw/pull/94154) Related [#94127](https://github.com/openclaw/openclaw/issues/94127). Thanks @brycemurray, @pick-cat, @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. [#95226](https://github.com/openclaw/openclaw/pull/95226) Thanks @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. [#95541](https://github.com/openclaw/openclaw/pull/95541) Thanks @ooiuuii, @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. [#95589](https://github.com/openclaw/openclaw/pull/95589) Thanks @ooiuuii, @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. [#95845](https://github.com/openclaw/openclaw/pull/95845) Thanks @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. [#95987](https://github.com/openclaw/openclaw/pull/95987) Thanks @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. [#97122](https://github.com/openclaw/openclaw/pull/97122) Thanks @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 @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 @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 @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. [#95683](https://github.com/openclaw/openclaw/pull/95683) Thanks @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. [#82909](https://github.com/openclaw/openclaw/pull/82909) Thanks @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. [#95661](https://github.com/openclaw/openclaw/pull/95661) Thanks @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 @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 @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. [#77339](https://github.com/openclaw/openclaw/pull/77339) Related [#77322](https://github.com/openclaw/openclaw/issues/77322). Thanks @mjamiv, @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. [#93943](https://github.com/openclaw/openclaw/pull/93943) Related [#78714](https://github.com/openclaw/openclaw/issues/78714). Thanks @tnzgit, @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. [#95797](https://github.com/openclaw/openclaw/pull/95797) Thanks @solvely-colin. - Anthropic streaming responses now keep interleaved text, thinking, and tool-call updates attached to the correct response block instead of mixing them when several blocks are active at once. [#96013](https://github.com/openclaw/openclaw/pull/96013) Thanks @vincentkoc. ### Memory, Sessions, and State #### Additional session and memory fixes Additional [memory](https://docs.openclaw.ai/concepts/memory) fixes cover resume, indexing, synchronization, and cleanup edge cases. - Memory-wiki status cards and bridge-backed source sync are less likely to fail during simultaneous page rewrites because OpenClaw now retries the transient path mismatch while still stopping unsafe or persistent filesystem writes. [#94443](https://github.com/openclaw/openclaw/pull/94443) Related [#92134](https://github.com/openclaw/openclaw/issues/92134). Thanks @cknzraposo, @zengwen-dt. - Fixes recent-session resume opening a fresh conversation for users with long workspace paths instead of returning to their existing transcript. [#94578](https://github.com/openclaw/openclaw/pull/94578) Related [#94577](https://github.com/openclaw/openclaw/issues/94577). Thanks @rohitjavvadi, @vincentkoc. - Memory Wiki now keeps user-written notes intact when an existing source page is re-ingested or synced, while still refreshing its generated content. [#95614](https://github.com/openclaw/openclaw/pull/95614) Thanks @yetval. - Fixes Memory Wiki repeatedly copying its own generated source pages back into itself when its vault is stored inside the workspace memory folder, avoiding duplicate files, repeated cleanup, and unnecessary memory index growth. [#95666](https://github.com/openclaw/openclaw/pull/95666) Related [#95657](https://github.com/openclaw/openclaw/issues/95657). Thanks @johannes0402, @turbotheturtle, @vincentkoc. - For operators using Active Memory with memory-core dreaming, nightly dreaming jobs no longer start unnecessary recall work and hit 45-second timeouts, while regular web chats continue to receive memory recall. [#95721](https://github.com/openclaw/openclaw/pull/95721) Related [#78500](https://github.com/openclaw/openclaw/issues/78500). Thanks @vincentkoc, @vishutdhar, @xialonglee. - Agent sessions with many tool calls repair out-of-order results with less repeated work while keeping each result paired with the right tool call. [#96014](https://github.com/openclaw/openclaw/pull/96014) Thanks @vincentkoc. - Windows qmd-backed memory work now stops all related processes after availability probes and command timeouts, preventing qmd children from continuing to run in the background. [830691b](https://github.com/openclaw/openclaw/commit/830691b2010bd0406399adb8a2e97e0b043e2ca8) ### Gateway, Security, and Trust #### Restart and readiness recovery [Gateway health](https://docs.openclaw.ai/gateway/health), [troubleshooting](https://docs.openclaw.ai/gateway/troubleshooting), and [`openclaw agent`](https://docs.openclaw.ai/cli/agent) workflows now report and recover from more runtime failures clearly. - When a configured or explicit remote gateway is slow but reachable, `openclaw gateway probe --timeout ...` now waits for the requested timeout instead of reporting it unreachable after a shorter internal cutoff. [#89859](https://github.com/openclaw/openclaw/pull/89859) Related [#65355](https://github.com/openclaw/openclaw/issues/65355). Thanks @hellocli, @mushuiyu886. - Long or parallel internal subagent runs now avoid unnecessary live-preview processing, while visible subagent sessions still show live updates and final responses. [#91906](https://github.com/openclaw/openclaw/pull/91906) Thanks @lanzhi-lee, @vincentkoc. - ACP conversations, especially Kiro-backed threads, now continue past the first reply by starting a fresh session when the backend can no longer resume the old one. [#93547](https://github.com/openclaw/openclaw/pull/93547) Related [#87830](https://github.com/openclaw/openclaw/issues/87830). Thanks @amersheeny, @chouzz. - When Linux memory pressure kills a child command or session, systemd-managed OpenClaw gateways now stay running and keep channel connections alive while reporting the child failure. [#93585](https://github.com/openclaw/openclaw/pull/93585) Thanks @snowzlm. - Canceling an OpenClaw run during tool work now ends it promptly instead of starting another model turn or leaving the session locked. [#94412](https://github.com/openclaw/openclaw/pull/94412) Thanks @szsip239, @vincentkoc. - Scheduled OpenClaw jobs using cloud models now recover from silent, stuck model calls by default, helping prevent later cron work from backing up while local or self-hosted providers keep their existing timeout behavior. [#94445](https://github.com/openclaw/openclaw/pull/94445) Thanks @bek91. - Gateway readiness checks now turn unhealthy during a restart drain, preventing traffic managers from sending new work to a Gateway that is temporarily rejecting requests. [#94915](https://github.com/openclaw/openclaw/pull/94915) Related [#78136](https://github.com/openclaw/openclaw/issues/78136). Thanks @markoub, @maxschachere, @vincentkoc. - Mac users can keep LaunchAgent-managed gateways running through OpenClaw upgrades instead of seeing repeated crash-and-restart loops when older text-transform runtime code is still cached. [#95081](https://github.com/openclaw/openclaw/pull/95081) Related [#95057](https://github.com/openclaw/openclaw/issues/95057). Thanks @849261680, @yveslarose. - Codex-powered conversations in TUI, WebChat, and compatible streaming APIs now show replies as they are written, while replacing provisional text cleanly so the final answer does not include stale drafts. [#95404](https://github.com/openclaw/openclaw/pull/95404) Related [#95422](https://github.com/openclaw/openclaw/issues/95422). Thanks @agonza1, @vincentkoc. - After a gateway restart, users no longer see a misleading retry notice when OpenClaw is already resuming the interrupted reply or reporting the actual recovery failure, reducing unnecessary duplicate attempts. [#95431](https://github.com/openclaw/openclaw/pull/95431) Thanks @moeedahmed, @vincentkoc. - Long, tool-heavy agent sessions now retain prompt-cache savings as results accumulate, reducing avoidable delays and cost from resending rewritten history between turns. [#95624](https://github.com/openclaw/openclaw/pull/95624) Thanks @vincentkoc. - Gateway restarts no longer leave configured Codex, Copilot, or trusted plugin-based agents temporarily unavailable, and untrusted workspace plugins remain blocked from activating themselves. [#95652](https://github.com/openclaw/openclaw/pull/95652) Thanks @vincentkoc. - Long responses, busy tool streams, image-heavy requests, and memory recall now incur less CPU and filesystem overhead without requiring settings or workflow changes. [#95697](https://github.com/openclaw/openclaw/pull/95697) Thanks @vincentkoc. - Operators can again add or update scheduled announcements for known channels in no-config setups, while configured environments still reject disabled, stale, ownerless, or unknown destinations before delivery. [#95754](https://github.com/openclaw/openclaw/pull/95754) Thanks @vincentkoc. - macOS users are less likely to see a false port-conflict failure when stopping or updating a managed gateway, because OpenClaw briefly waits for normal shutdown to release the port while still reporting conflicts that persist. [#95886](https://github.com/openclaw/openclaw/pull/95886) Thanks @fuller-stack-dev. - Copilot-backed agents can now ask users a question and accept the answer through OpenClaw's normal chat reply flow, while compact tool-search and code-mode controls avoid loading the full tool catalog into the session. [#96005](https://github.com/openclaw/openclaw/pull/96005) Thanks @vincentkoc. - Gateway restarts on systemd or container setups no longer leave old Codex or Claude adapter processes behind, helping new ACPX sessions start without minutes-long cleanup stalls after repeated restarts. [#96032](https://github.com/openclaw/openclaw/pull/96032) Thanks @t2wei, @vincentkoc. - Copilot-backed sessions now show plan updates as work unfolds, and their native child tasks stay visible through completion or failure instead of disappearing from OpenClaw's task view. [#96062](https://github.com/openclaw/openclaw/pull/96062) Thanks @vincentkoc. - Connected agents such as OpenCode now start through OpenClaw even when their harness cannot select a requested model, while genuinely unsupported model choices still return the original error. [#96068](https://github.com/openclaw/openclaw/pull/96068) Related [#95869](https://github.com/openclaw/openclaw/issues/95869). Thanks @sabatech-dev, @vincentkoc. - Plugins using `heartbeat_prompt_contribution` now deliver their heartbeat-specific context to models when agents run through harness runtimes such as the Codex app-server, without affecting ordinary user turns or plugins that do not use the hook. [#96233](https://github.com/openclaw/openclaw/pull/96233) Thanks @azogheb, @vincentkoc. - Windows gateway cleanup and listener checks now handle UTF-16 WMIC command-line data consistently, reducing failed or conflicting identification of the running gateway process. [15c880a](https://github.com/openclaw/openclaw/commit/15c880aeff1f4e55964ad7204d14733a2d1362f7) Thanks @vincentkoc. - Long-context, tool-heavy agent sessions now keep prompt-cache reuse steadier across repeated turns without losing per-result size limits, while advanced operators can configure larger tool-result caps for large-context models without configuration rejection. [a60947f](https://github.com/openclaw/openclaw/commit/a60947fb3e92f45ea7eb2581da8877b10a8bebb2) Thanks @vincentkoc. - Long, tool-heavy agent sessions are less likely to bloat model requests as tool output accumulates, while repeated turns keep stable prompt-cache reuse. [2f33999](https://github.com/openclaw/openclaw/commit/2f3399989893e6af18be49fb810e58941d7a4a45) Thanks @vincentkoc. - Gateway restarts now use OpenClaw's durable state database for the handoff, while stale, malformed, wrong-process, or superseded requests are discarded before they can affect the restart. [0ad48da](https://github.com/openclaw/openclaw/commit/0ad48dad2c4747f255d5a156b94578f7d87386a1) - Gateway status, doctor, and restart diagnostics now retain recent restart details in OpenClaw's shared state database, while expired or malformed records are still discarded. [a39a3b7](https://github.com/openclaw/openclaw/commit/a39a3b74de05f06227ede904a73c1b4687679d3e) Thanks @vincentkoc. - Gateway restarts and managed-service updates now keep the correct continuation message, avoid reusing stale handoff state, and mark failed update handoffs consistently. [514b336](https://github.com/openclaw/openclaw/commit/514b3365b54c8b3493eaf8a94198b7c04ea34aec) Thanks @vincentkoc. - Gateway-launched agents no longer lose owner-only OpenClaw tools during tasks such as live cron checks, so authorized operations can use the intended tools with the correct request context. [c2ee9b0](https://github.com/openclaw/openclaw/commit/c2ee9b0be8aeeadedffc8c6aaa9f5f291283fea5) Thanks @vincentkoc. - Malformed gateway restart requests now fail clearly without scheduling a restart, preventing bad or accidental integration calls from unexpectedly restarting the gateway. [108d6d7](https://github.com/openclaw/openclaw/commit/108d6d7eca0000a736e28d198e77100f4d7774e5) Thanks @vincentkoc. - Stale node requests queued by the gateway now expire automatically, so old work is less likely to linger and affect later activity. [f6d432e](https://github.com/openclaw/openclaw/commit/f6d432e545e2e2be91d17badc48354a0135e5294) - Plugin workflows are less likely to stall or overload the gateway when an integration requests too much subagent session history, because each read is now capped at a safe limit. [b66b450](https://github.com/openclaw/openclaw/commit/b66b4504f87205dd8ba0393e763e23a4a6158a79) Thanks @vincentkoc. - Image descriptions now handle extremely large timeout settings consistently by capping them to a safe runtime limit instead of risking timer overflow. [88b21fc](https://github.com/openclaw/openclaw/commit/88b21fc30b4ac615b3d3870e483190bc832f9846) - Embedded agent sessions now wait reliably for another session to release its file lock, even with an extremely large timeout, instead of risking timer overflow. [4c736df](https://github.com/openclaw/openclaw/commit/4c736df975fed8e39f18db43bfaea9654b9ac0c7) Thanks @vincentkoc. - Queued commands with extremely large task timeout settings now time out reliably because OpenClaw caps the wait at the runtime's safe maximum. [1f6ae32](https://github.com/openclaw/openclaw/commit/1f6ae32cabb9d5ed308bb30715c287936ef483f1) Thanks @vincentkoc. - Fixes normalization-core exposing the wrong string-coercion entry point and ACP sessions showing an outdated fast-mode value, so integrations receive the intended API and users see the mode actually in effect. [93ad397](https://github.com/openclaw/openclaw/commit/93ad39772590a34be3821d83709a5050c186fdf9) Thanks @vincentkoc. - Fast auto runs now deliver final replies more consistently, with progress-reset handling limited to automatic mode so it does not interfere with responses or forwarded callbacks. [9e8ab08](https://github.com/openclaw/openclaw/commit/9e8ab083dd6b9df4dadf40ee523ff18ac1472bd3) Thanks @vincentkoc. - Agent sessions using OpenAI Responses now resume tool-based work without failing or losing progress when replayed history contains mismatched tool requests and results. [b4bc1f2](https://github.com/openclaw/openclaw/commit/b4bc1f20c9fca6d316561d42cbabdd793c67a6e7) Thanks @vincentkoc. - Completed plugin subagent and QA runs are no longer misreported as failures when gateways return alternate completion envelope shapes, making successful handoffs more reliable for plugin authors and operators. [d1b268f](https://github.com/openclaw/openclaw/commit/d1b268f7f7f7309dd5db99728019218b4d453e18) Thanks @vincentkoc. - Fixes completed subagent tasks sometimes ending without an update, so users receive the result or the parent agent's next step. [68a1e00](https://github.com/openclaw/openclaw/commit/68a1e00b73bd746f6fb577f4127fecb0ade9e228) Thanks @vincentkoc. #### Remote result and media delivery Additional [Gateway](https://docs.openclaw.ai/gateway/index) fixes return remote media and completed subagent results to the active conversation more reliably. - Generated images from a remote Codex app-server now arrive as attachments instead of showing `Media failed` or returning only text after successful generation. [#96212](https://github.com/openclaw/openclaw/pull/96212) Thanks @sjf-oa. - When a subagent finishes, its result now reaches the active parent run more reliably instead of appearing silent. [7fc4bbc](https://github.com/openclaw/openclaw/commit/7fc4bbc0bcbabc2aa99b1fd51e77099f2b26f4e1) Thanks @vincentkoc. #### Additional security and trust fixes Additional [secret-handling](https://docs.openclaw.ai/gateway/secrets) hardening keeps trusted package paths within the intended boundary. - Trusted OpenClaw package sources now reject lookalike sibling paths, so trusting `/artifactory/openclaw` no longer also admits paths such as `/artifactory/openclaw-malicious`. [12c34fc](https://github.com/openclaw/openclaw/commit/12c34fc3a95121f5a15f01c3f971a1bc5b0fe6f9) Thanks @vincentkoc. ### Clients and Interfaces #### Client sends and reconnects [WebChat](https://docs.openclaw.ai/web/webchat), the [Control UI](https://docs.openclaw.ai/web/control-ui), mobile clients, and the [terminal UI](https://docs.openclaw.ai/cli/tui) now recover completed, rejected, or interrupted sends and reconnects without leaving conversations looking stuck. - When a WebChat message fails before the agent starts, WebChat and Control UI now show the session as failed instead of leaving it looking like it is still running. [#84352](https://github.com/openclaw/openclaw/pull/84352) Thanks @jesse-merhi. - Fixes the Control UI session picker getting stuck behind hidden subagent sessions, so Load More reaches the next usable chat without showing a misleading total. [#89323](https://github.com/openclaw/openclaw/pull/89323) Related [#89249](https://github.com/openclaw/openclaw/issues/89249). Thanks @giodl73-repo, @originsecured-do. - When users reopen a Control UI conversation from History, their prompts now appear with the assistant's replies, preserving the question-and-answer context without blank gaps in long transcripts. [#93841](https://github.com/openclaw/openclaw/pull/93841) Related [#90241](https://github.com/openclaw/openclaw/issues/90241). Thanks @mushuiyu886, @pronzcw. - Control UI deployments behind a path prefix now keep manifest, favicon, and service-worker requests under that prefix, avoiding confusing root-level 403 errors after login. [#94204](https://github.com/openclaw/openclaw/pull/94204) Related [#94157](https://github.com/openclaw/openclaw/issues/94157). Thanks @hugenshen, @xrow. - Android users can now open Health log and Skill rows in Settings for readable details, making it easier to troubleshoot gateway activity, check skill setup and status, and understand how to pair with an existing setup code. [#95148](https://github.com/openclaw/openclaw/pull/95148) Thanks @tosko4. - Sent prompts no longer reappear in the Control UI composer after a send, so users can switch sessions or start their next message without risking a duplicate send or overwriting a new draft, while intentional re-entry still works. [#95503](https://github.com/openclaw/openclaw/pull/95503) Related [#89466](https://github.com/openclaw/openclaw/issues/89466). Thanks @vincentkoc, @zhangguiping-xydt, @zhong18804784882. - Android users now get a cleaner Overview where connection status, the configured agent, node health, approvals, recent sessions, and Chat and Talk actions are visible at a glance. [#95557](https://github.com/openclaw/openclaw/pull/95557) Thanks @joshavant, @solvely-colin. - Android users can now refresh and resolve gateway command approvals from the in-app Approvals screen, choosing Allow Once, Always, or Deny while connected. [#95593](https://github.com/openclaw/openclaw/pull/95593) Thanks @solvely-colin. - iOS users now avoid surprise notification prompts and get clear guidance when approval alerts are unavailable, with permission managed from one predictable Settings screen. [#95640](https://github.com/openclaw/openclaw/pull/95640) Thanks @joshavant. - Local TUI shutdowns now stay within safe timer limits even when `OPENCLAW_TUI_LOCAL_RUN_SHUTDOWN_GRACE_MS` is set extremely high. [c21dcfc](https://github.com/openclaw/openclaw/commit/c21dcfc7c272201484514bbc096bd51ab112bd47) - Canvas A2UI now serves only the current app assets after each build, so outdated compatibility images and leftover files are less likely to appear. [a89e65c](https://github.com/openclaw/openclaw/commit/a89e65c167f3280b047baff931f52e393875c892) Thanks @vincentkoc. - iOS push relay setup failures are easier to pinpoint because registration diagnostics show where setup stopped while keeping sensitive push credentials out of logs. [f2b8668](https://github.com/openclaw/openclaw/commit/f2b8668a549b50339a96e47020a12615734640a9) Thanks @joshavant. - iOS devices are now enrolled for push notifications only after users accept the hosted relay disclosure and allow notifications, preventing registration data from being published before consent. [8efed50](https://github.com/openclaw/openclaw/commit/8efed50c4ed33105cfed9f2f96532fc9fe2d7e6d) Thanks @joshavant. - Fixes chat, voice, TUI, and forwarded sends sometimes appearing stuck or disappearing after the gateway had already finished or rejected them, so affected clients now clear the pending state, restore retryable input, refresh history, or show a useful failure. [#91049](https://github.com/openclaw/openclaw/pull/91049) Related [#91048](https://github.com/openclaw/openclaw/issues/91048). Thanks @nxmxbbd. #### Additional client interface fixes Additional [Control UI](https://docs.openclaw.ai/web/control-ui), mobile, and desktop fixes improve display accuracy, accessibility, onboarding, and app behavior. - Restores the OpenAI/Codex usage quota in the expanded Control UI chat sidebar, so users can check their limits without leaving the conversation. [#94219](https://github.com/openclaw/openclaw/pull/94219) Related [#93041](https://github.com/openclaw/openclaw/issues/93041). Thanks @jazzroutine, @pick-cat. - iOS screens now use consistent OpenClaw accent and status colors across onboarding, settings, chat, approval prompts, voice permissions, widgets, and shared chat views. [#94627](https://github.com/openclaw/openclaw/pull/94627) Thanks @zats. - The Control UI can now create Early Morning jobs with the Silent preset in the main session and without notifications, instead of leaving the dialog open with no visible result. [#95459](https://github.com/openclaw/openclaw/pull/95459) Related [#95073](https://github.com/openclaw/openclaw/issues/95073). Thanks @vincentkoc, @vporton, @zoowh. - At the million-token boundary, Control UI badges and usage readouts now show "1M" instead of the confusing "1000k", while the underlying token counts remain unchanged. [#95485](https://github.com/openclaw/openclaw/pull/95485) Thanks @narahariraghava, @vincentkoc. - The Control UI Overview now counts and flags only enabled cron jobs that still need attention, while disabled jobs retain their past failure details without appearing as current problems. [#95723](https://github.com/openclaw/openclaw/pull/95723) Related [#95716](https://github.com/openclaw/openclaw/issues/95716). Thanks @voytas75, @zengwen-dt. - Control UI users now see shorter System, Light, and Dark theme tooltips, while screen readers announce less repetitive labels without losing the surrounding Color mode context. [#95837](https://github.com/openclaw/openclaw/pull/95837) Thanks @hannesrudolph, @sannidhyasah. - Raw configuration no longer appears missing in Settings after switching from the form view, because the JSON is brought back into view instead of retaining the previous scroll position. [#96145](https://github.com/openclaw/openclaw/pull/96145) Related [#94202](https://github.com/openclaw/openclaw/issues/94202). Thanks @sunlit-deng, @vporton. - New iOS users now reach OpenClaw's welcome and onboarding before iOS asks for local-network access, while existing users still get the request when opening gateway setup or otherwise needing LAN gateway discovery. [#96181](https://github.com/openclaw/openclaw/pull/96181) Thanks @joshavant. ### Plugins and Packaging #### Additional plugin and package fixes Additional [plugin management](https://docs.openclaw.ai/plugins/manage-plugins) fixes improve installation, verification, package resolution, and updates. - People installing or updating the official Yuanbao channel plugin through OpenClaw's trusted catalog now get version 2.15.0, with the expected integrity check and missing-plugin guidance aligned to that release. [#94470](https://github.com/openclaw/openclaw/pull/94470) Thanks @jase-283. - First-run onboarding can now install the bundled `gog` skill through Homebrew without failing on the removed third-party tap formula. [#95019](https://github.com/openclaw/openclaw/pull/95019) Related [#95017](https://github.com/openclaw/openclaw/issues/95017). Thanks @sedrak-hovhannisyan, @vincentkoc, @zengwen-dt. - Canvas, Discord, Slack, Voice Call, and WhatsApp users keep the same skill guidance with each installed or bundled plugin, while references to the former root `skills/...` paths need to move into the relevant plugin directory. [#95664](https://github.com/openclaw/openclaw/pull/95664) Thanks @vincentkoc. - ClawHub skill verification now accepts the same `@owner/` reference used for installs and updates, so users can check the intended publisher without switching to an ambiguous bare slug. [#95992](https://github.com/openclaw/openclaw/pull/95992) Thanks @patrick-erichsen. - OpenClaw's install-time package-manager warning now identifies npm, Yarn, Yarn Berry, and Corepack-style launchers correctly, avoiding misleading guidance when those tools run through alternate executable names. [11a2e03](https://github.com/openclaw/openclaw/commit/11a2e03bd4deda748336553710cb6426d448d952) Thanks @vincentkoc. - Package URL installs now handle oversized download timeouts without failing before available package data can be resolved. [c310f8c](https://github.com/openclaw/openclaw/commit/c310f8cfa4524453c7082bb5aab642c9decc6e99) - Plugin and CLI developers now see a clearer supported command-formatting API, while device pairing, node registration, and doctor guidance keep producing the same shell-safe commands. [23b4f33](https://github.com/openclaw/openclaw/commit/23b4f33195933ff4def4609d970f073293760683) - Windows ARM64 users now get matching ARM64 Node and MinGit downloads when running the PowerShell installer through an x64-emulated shell. [fac091b](https://github.com/openclaw/openclaw/commit/fac091b39de230d9ed90e8412123126cf676004f) Thanks @vincentkoc. - Default OpenClaw installs no longer spend time building optional llama.cpp support, avoiding native-build failures for users who did not enable it. [cc1b3a8](https://github.com/openclaw/openclaw/commit/cc1b3a8550dd9c29f581799934d140aaf5a84f1c) Thanks @vincentkoc. ### Docs and Admin Tools #### Setup and command reliability The [OpenClaw CLI](https://docs.openclaw.ai/cli/index), [tab completion](https://docs.openclaw.ai/cli/completion), and [`openclaw doctor`](https://docs.openclaw.ai/cli/doctor) now handle more setup and repair cases cleanly. - OpenClaw's zsh tab-completion menu now displays option descriptions containing `$` variables or backtick-wrapped examples literally instead of evaluating them as shell input and corrupting the menu. [#64490](https://github.com/openclaw/openclaw/pull/64490) Thanks @edenkangdw. - After upgrading from older sandbox storage, operators now get a clear `openclaw doctor` warning about leftover registry files and can use `openclaw doctor --fix` to migrate or clean them up. [#84326](https://github.com/openclaw/openclaw/pull/84326) Thanks @giodl73-repo. - Operators can now use `doctor --lint` to spot stale legacy Gateway services and preview cleanup, while intentional extra services remain informational and do not fail the default check. [#84340](https://github.com/openclaw/openclaw/pull/84340) Thanks @giodl73-repo. - macOS gateway operators now get a warning before reinstall, repair, or restart overwrites custom LaunchAgent wrapper behavior, while `openclaw status` distinguishes CLI-only missing-secret checks from the installed service. [#90537](https://github.com/openclaw/openclaw/pull/90537) Related [#90518](https://github.com/openclaw/openclaw/issues/90518). Thanks @turbotheturtle, @vincentkoc. - Long, multiline, or code-heavy prompts can now be sent to `openclaw agent` with `--message-file`, avoiding fragile shell quoting and reporting invalid files before dispatch. [#93351](https://github.com/openclaw/openclaw/pull/93351) Thanks @ooiuuii. - Fixes scheduled `doctor --fix --non-interactive` repairs restarting an already-running gateway after a temporary health-check failure, so unattended maintenance no longer interrupts the live service. [#94148](https://github.com/openclaw/openclaw/pull/94148) Related [#78217](https://github.com/openclaw/openclaw/issues/78217). Thanks @esqandil, @zhangguiping-xydt. - `openclaw configure` and bare `openclaw config` now stop with clear subcommand guidance when run from scripts or pipes, instead of opening a partial interactive wizard and exiting unclearly. [#94238](https://github.com/openclaw/openclaw/pull/94238) Related [#93953](https://github.com/openclaw/openclaw/issues/93953). Thanks @nianjiuzst, @ruomuxydt. - Multi-agent operators can now use `openclaw gateway usage-cost` to view costs for one configured agent or all agents while the existing default-agent command remains unchanged. [#94483](https://github.com/openclaw/openclaw/pull/94483) Thanks @ly-wang19. - Archived Workboard cards no longer clutter the default `openclaw workboard list` output, while `--include-archived` and JSON output still provide access when needed. [#94562](https://github.com/openclaw/openclaw/pull/94562) Related [#94555](https://github.com/openclaw/openclaw/issues/94555). Thanks @ecican, @vincentkoc, @zengwen-dt. - OpenClaw Doctor now gives accurate guidance for working isolated shell-prompt cron jobs instead of repeatedly suggesting a `--fix` command that cannot clear the warning. [#94784](https://github.com/openclaw/openclaw/pull/94784) Related [#94655](https://github.com/openclaw/openclaw/issues/94655). Thanks @altaywtf, @geekoagent, @zengwen-dt. - Fixes `openclaw doctor` showing a fix-required warning for healthy local GGUF memory setups after an intentionally skipped readiness check, while preserving the warning when the configured local model is actually missing. [#95393](https://github.com/openclaw/openclaw/pull/95393) Related [#92582](https://github.com/openclaw/openclaw/issues/92582). Thanks @mikasa0818, @neekolascmd, @vincentkoc. - On Windows, installer-created gateway tasks now run in the background without a console window that users could accidentally close and stop the gateway. [#95480](https://github.com/openclaw/openclaw/pull/95480) Related [#89231](https://github.com/openclaw/openclaw/issues/89231). Thanks @cameronweller, @mikasa0818, @vincentkoc. - Agent channel bindings now reject malformed account specs such as `matrix:work:extra` with a clear error instead of silently routing the agent to a different account. [#95572](https://github.com/openclaw/openclaw/pull/95572) Thanks @ly-wang19. - ClawHub skill updates now honor your configured install safety policy, and `openclaw skills update --all` updates only tracked ClawHub skills instead of unexpectedly installing other configured skills. [#95684](https://github.com/openclaw/openclaw/pull/95684) Thanks @vincentkoc. - Windows restart and gateway startup workflows are more reliable because OpenClaw now hands commands to the trusted system `cmd.exe` path instead of depending on process lookup. [7dd01d1](https://github.com/openclaw/openclaw/commit/7dd01d15c56da2ee50f55746ba725d708682fca9) Thanks @vincentkoc. - Windows gateway cleanup and listener checks are more reliable when PATH lookup is incomplete, so operators can identify the gateway process and free an occupied port without installed system tools being missed. [e9b694e](https://github.com/openclaw/openclaw/commit/e9b694ef9cd8b7528a76d85b8be2a830b296a5e1) Thanks @vincentkoc. - On Windows, OpenClaw startup and TUI Codex handoff now find `bun`, `codex`, and other runtime binaries through the trusted system locator even when another `where` command appears earlier on PATH. [72b9bc7](https://github.com/openclaw/openclaw/commit/72b9bc730370e3b1155fb231621c2bc7b2c87b56) Thanks @vincentkoc. - Windows port diagnostics now use the intended system tools even when PATH entries are missing or shadowed, so gateway and service port conflicts are less likely to be obscured by command-resolution failures. [c4facb2](https://github.com/openclaw/openclaw/commit/c4facb2bb372e99037f497e2640ca7bdc5cbc5f6) Thanks @vincentkoc. - Windows daemon recovery is less likely to miss process detection or cleanup when PATH is incomplete, unusual, or shadowed because scheduled-task fallback now finds PowerShell and taskkill in trusted system locations. [2a140e6](https://github.com/openclaw/openclaw/commit/2a140e6e6ae8c48edb5bd52d8d177915f0555d70) Thanks @vincentkoc. - OpenClaw now keeps config recovery markers, last-known-good snapshots, and suspicious-read history in its shared state through migration, without leaving a separate config-health log file behind. [6daabd2](https://github.com/openclaw/openclaw/commit/6daabd23f821c66154739de4b0f103e33343333c) Thanks @vincentkoc. - On Windows, Crabbox commands launched through Node package shims now receive provider flags, shell commands, and special shell characters as entered instead of losing or reinterpreting them. [54d24cd](https://github.com/openclaw/openclaw/commit/54d24cd956ff91f4fa8c4924f17c06798c1e0359) Thanks @vincentkoc. - Windows-targeted Crabbox workflows are less likely to fail or fall back to slower shell handling when launching Node tools through `.cmd` and `.bat` shims. [d48dcc6](https://github.com/openclaw/openclaw/commit/d48dcc664bc6e1106a61942a951745886f22d582) Thanks @vincentkoc. - Windows users can run `crabbox`, `git`, and other Node-backed tools through npm-installed command shims without Crabbox stopping before the tool opens. [77f4e45](https://github.com/openclaw/openclaw/commit/77f4e45c3518751b5f586eac193c4aee904f02d9) Thanks @vincentkoc. - `openclaw doctor` now checks profiles that omit tool policy settings without treating the valid omission as an error. [03ba09b](https://github.com/openclaw/openclaw/commit/03ba09bfa8676832d55bdc7724e79d9980fdd2d7) - `openclaw doctor` no longer shows misleading tool-section warnings when it cannot evaluate a custom preview profile. [420a0e6](https://github.com/openclaw/openclaw/commit/420a0e6fce4b2c5339e535e6b307f50df1c00bb2) Thanks @vincentkoc. - `openclaw doctor` now limits preview warnings to tool profiles it can evaluate, avoiding misleading configured-grant warnings for unknown profiles. [541f7ff](https://github.com/openclaw/openclaw/commit/541f7ffc6558c0e59a8afca066a9f00884d39b65) Thanks @vincentkoc. - Windows users can install OpenClaw from source without dependency setup being blocked by the installer forcing npm or pnpm scripts through `cmd.exe`. [1252378](https://github.com/openclaw/openclaw/commit/1252378018f899bfc110914bac7cba94b65b8930) Thanks @vincentkoc. #### Tools and scheduled work [Scheduled jobs](https://docs.openclaw.ai/cli/cron) and [tool workflows](https://docs.openclaw.ai/tools/index) now finish, validate, and report failures more consistently. - Isolated cron jobs using `deleteAfterRun` now remove their temporary session and transcript after finishing, including runs with delivery disabled, reducing stale files, accumulated context, and manual cleanup. [#84794](https://github.com/openclaw/openclaw/pull/84794) Related [#84707](https://github.com/openclaw/openclaw/issues/84707). Thanks @bottenbenny, @turbotheturtle. - Individual scheduled jobs can now use their own fallback models, run with fallbacks disabled, or return to normal fallback inheritance through the CLI instead of requiring operators to edit lower-level payload data. [#93369](https://github.com/openclaw/openclaw/pull/93369) Related [#90302](https://github.com/openclaw/openclaw/issues/90302). Thanks @849261680, @walliiee. - Cron history now reliably finds entries whose job IDs include extra surrounding spaces, and rejects nested or blank IDs before they can create log records that cannot be read back safely. [#93567](https://github.com/openclaw/openclaw/pull/93567) Thanks @alix-007, @vincentkoc. - Adding or removing a cron job no longer causes another recurring job that is already due to lose its pending run. [#94323](https://github.com/openclaw/openclaw/pull/94323) Thanks @yetval. - Word, PowerPoint, and Excel document reads and writes now use the intended `.docx`, `.pptx`, or `.xlsx` path instead of failing against a made-up extension. [#95805](https://github.com/openclaw/openclaw/pull/95805) Related [#93326](https://github.com/openclaw/openclaw/issues/93326). Thanks @bhnan, @lzyyzznl, @vincentkoc, @xzh-icenter. - Browser automation users keep the same reference-rich snapshots, including useful branches in compact results, with less avoidable processing during snapshot generation. [#96072](https://github.com/openclaw/openclaw/pull/96072) Thanks @vincentkoc. - Fixes timed-out commands and interrupted core updates on Windows sometimes leaving child processes running, so OpenClaw can stop the full process tree more reliably after cancellations, timeouts, or update cleanup. [a192b2e](https://github.com/openclaw/openclaw/commit/a192b2ea52b3166a7d190bf5f60f3feb030306bb) Thanks @vincentkoc. - Windows users are less likely to see agent-managed tool installs fail while unpacking ZIP downloads such as ripgrep, because OpenClaw now uses the built-in Windows extraction programs instead of relying on PATH lookup. [a5fde91](https://github.com/openclaw/openclaw/commit/a5fde9119c9c50685a392bff078a2f76a03d749d) - Windows setup and runtime checks now find required tools more reliably by using the trusted System32 resolver instead of depending on an unexpected PATH entry. [d3b4444](https://github.com/openclaw/openclaw/commit/d3b44442f6c8bedd765dc20a06316d3420b5d854) Thanks @vincentkoc. - SDK runs created with `timeoutMs: 0` now keep the requested zero timeout without an unwanted client-side watchdog. [2bdcc83](https://github.com/openclaw/openclaw/commit/2bdcc8314d3fce9ee2d0300759cd6a1d9bb45a7d) Thanks @vincentkoc. - Stalled OpenClaw commands now stop reliably even when callers supply extremely large execution or idle-output timeouts. [1425bb3](https://github.com/openclaw/openclaw/commit/1425bb3a03189813787194c23b8a38518166005a) Thanks @vincentkoc. - Commands given extremely large timeout settings now use a safe maximum instead of failing because the runtime cannot schedule the requested wait. [66b94ba](https://github.com/openclaw/openclaw/commit/66b94ba577b8836a4afa7cb59cd1a749bf2a8d68) - Provider-specific tool allow/deny settings now align more consistently with OpenClaw's doctor warnings, including configurations with provider aliases, model-specific keys, OpenRouter-style model IDs, or malformed policy entries. [8f2882f](https://github.com/openclaw/openclaw/commit/8f2882f94affbe5e89994ae175fdaf7304d7b392) #### Additional setup and CLI fixes Additional [`openclaw config`](https://docs.openclaw.ai/cli/config) and CLI fixes improve diagnostics, pairing, startup, and command behavior. - Larger OpenClaw configurations can initialize and generate UI hints more efficiently, while sensitive fields continue to be marked the same way. [#55018](https://github.com/openclaw/openclaw/pull/55018) Thanks @huangyandi-red, @vincentkoc, @xdhuangyandi. - Config changes that still need a manual gateway restart now show a clear restart-required notice with the original note preserved, instead of looking finished with a misleading `config-patch ok` message. [#83041](https://github.com/openclaw/openclaw/pull/83041) Related [#46797](https://github.com/openclaw/openclaw/issues/46797). Thanks @stache73, @xuruiray. - Help for `doctor`, `gateway`, `models`, `plugins`, `sessions`, and `tasks` now appears in tens of milliseconds, while commands such as `sessions --help` and `tasks --help` previously took about 1.6 to 1.8 seconds to begin responding. [#89628](https://github.com/openclaw/openclaw/pull/89628) Thanks @yyzquwu. - OpenTelemetry trace backends such as Langfuse now show the actual provider/model name instead of "unknown" for slash-qualified model IDs. [#89981](https://github.com/openclaw/openclaw/pull/89981) Thanks @mycarrysun, @vincentkoc. - Malformed or older device-pairing records no longer stop `openclaw devices list` from showing pending approval requests, while valid roles still appear normally. [#93504](https://github.com/openclaw/openclaw/pull/93504) Thanks @ly-wang19. - OpenClaw now rejects SSH targets with stray leading or trailing colons before they can produce invalid SSH configuration or tunnel startup failures for SSH-backed sandboxes and gateways. [#93887](https://github.com/openclaw/openclaw/pull/93887) Thanks @miorbnli. - Users whose non-interactive setup fails its local gateway health check now get runnable `openclaw onboard --install-daemon` or `openclaw onboard --skip-health` recovery commands instead of unsupported `setup` flags. [#93994](https://github.com/openclaw/openclaw/pull/93994) Related [#93947](https://github.com/openclaw/openclaw/issues/93947). Thanks @bk-z1, @nianjiuzst. - Gateway health and probe checks now accept the same custom `--port` used to start a local gateway, reject invalid ports early, and show the selected loopback target in JSON output. [#94687](https://github.com/openclaw/openclaw/pull/94687) Related [#79100](https://github.com/openclaw/openclaw/issues/79100). Thanks @bryantegomoh, @ozthedivine. - `gateway --force` now detects IPv4-only processes occupying the gateway port and still attempts cleanup when a port check is inconclusive, instead of mistakenly treating the port as free. [#94949](https://github.com/openclaw/openclaw/pull/94949) Related [#94426](https://github.com/openclaw/openclaw/issues/94426). Thanks @sunlit-deng, @vincentkoc, @wangwllu. - `openclaw config validate` now accepts command-based MCP server setups that explicitly use `transport: "stdio"`, avoiding false validation errors while still rejecting invalid remote-style stdio configurations. [#95102](https://github.com/openclaw/openclaw/pull/95102) Related [#95082](https://github.com/openclaw/openclaw/issues/95082). Thanks @ken-jo, @lzyyzznl. - CLI image edits can now return multiple variants in one command with `--count `, instead of being limited to the provider's default single result. [#95300](https://github.com/openclaw/openclaw/pull/95300) Thanks @ly-wang19. - `openclaw sessions export-trajectory` now finds sessions that other session commands can already see when custom, `~`-based, or `{agentId}`-templated stores are configured, without requiring the store path again. [#95570](https://github.com/openclaw/openclaw/pull/95570) Related [#95568](https://github.com/openclaw/openclaw/issues/95568). Thanks @youngting520. - Fixes `infer inspect --name --json` showing flags that the matching CLI commands did not accept, so developers and operators can reliably discover supported model, auth, and transcription options. [#95719](https://github.com/openclaw/openclaw/pull/95719) Thanks @ly-wang19, @vincentkoc. - People inspecting very large or out-of-order sessions can open usage details and still get the latest timestamped log entries without OpenClaw retaining the entire parsed log history in memory. [#96019](https://github.com/openclaw/openclaw/pull/96019) Thanks @vincentkoc. - Operators can now set up the auth monitor, systemd timer, and Termux widgets for their own OpenClaw host without first replacing maintainer-specific hostnames and filesystem paths. [af3e509](https://github.com/openclaw/openclaw/commit/af3e509ab823dac5f91b16915ee7067b369656a3) Thanks @vincentkoc. - Native Windows crabbox hydration now selects the required Windows daemon job automatically, avoiding failed or misrouted runs while leaving WSL2 and explicit job overrides unchanged. [d5d9a82](https://github.com/openclaw/openclaw/commit/d5d9a8256d6bc2ff8d699152923357bd61c606c1) Thanks @vincentkoc. #### User operation documentation The [Gateway configuration](https://docs.openclaw.ai/gateway/configuration) and related user guides now give clearer setup and operating instructions. - People setting a local agent avatar can avoid missing images by keeping workspace-relative files under 2 MB, while HTTP(S) and data URI avatars are not subject to that limit. [#78884](https://github.com/openclaw/openclaw/pull/78884) Related [#65312](https://github.com/openclaw/openclaw/issues/65312). Thanks @wangjieweb3-design, @nyx-nocturna. - OpenClaw's default agent instructions now ask agents to check for suitable free or open-source solutions before proposing a custom build, while still allowing custom work when it is the better fit. [#86608](https://github.com/openclaw/openclaw/pull/86608) Thanks @cablackmon. - Plugin authors can now use the documented `targetSessionKey` on `subagent_ended` events to match them with the corresponding spawn, instead of relying on `agentId` or `childSessionKey` fields that are not emitted. [#95191](https://github.com/openclaw/openclaw/pull/95191) Related [#95186](https://github.com/openclaw/openclaw/issues/95186). Thanks @ken-jo, @mahaohao-ch. - ClawHub skill links in OpenClaw docs and showcase cards now open the canonical owner-qualified pages, and install examples use copy-ready `openclaw skills install @owner/` references instead of older bare-slug routes. [#95972](https://github.com/openclaw/openclaw/pull/95972) Thanks @patrick-erichsen. #### Additional tool and automation fixes Additional [plugin SDK](https://docs.openclaw.ai/plugins/sdk-runtime) and automation fixes improve tool events, cron inputs, and Windows handoffs. - SDK applications now receive `tool.call.failed` when terminal tools fail or are blocked, instead of a misleading completion event, so existing failure handling can react correctly. [#95383](https://github.com/openclaw/openclaw/pull/95383) Thanks @ly-wang19. - Fixes cron add and update requests being rejected when recognized job fields arrive with harmless trailing spaces, so schedules can be saved without relaxing checks for ambiguous or unsafe input. [#95674](https://github.com/openclaw/openclaw/pull/95674) Related [#95407](https://github.com/openclaw/openclaw/issues/95407). Thanks @nassiel, @zw-xysk. - Codex subagent monitoring handles large sets of child agents and transcript files with less unnecessary scanning, while older transcript filename formats continue to resolve as before. [#96085](https://github.com/openclaw/openclaw/pull/96085) Thanks @vincentkoc. - Fixes native Windows crabbox hydration getting stuck or missing handoffs when the runner and daemon use different home directories, so both can find the same job state and stop files. [f354889](https://github.com/openclaw/openclaw/commit/f354889efa1c8bafca9304767afba2c270add549) Thanks @vincentkoc. ### Additional contributions Additional maintainer-facing contributions: [#95308](https://github.com/openclaw/openclaw/pull/95308), [#95465](https://github.com/openclaw/openclaw/pull/95465), [#95625](https://github.com/openclaw/openclaw/pull/95625), [#95649](https://github.com/openclaw/openclaw/pull/95649), [#95681](https://github.com/openclaw/openclaw/pull/95681), [#95857](https://github.com/openclaw/openclaw/pull/95857), [#95870](https://github.com/openclaw/openclaw/pull/95870), [#95872](https://github.com/openclaw/openclaw/pull/95872), [#95879](https://github.com/openclaw/openclaw/pull/95879), [#95890](https://github.com/openclaw/openclaw/pull/95890), [#95909](https://github.com/openclaw/openclaw/pull/95909), [#95922](https://github.com/openclaw/openclaw/pull/95922), [#95946](https://github.com/openclaw/openclaw/pull/95946), [#95967](https://github.com/openclaw/openclaw/pull/95967), [#95983](https://github.com/openclaw/openclaw/pull/95983), [#96258](https://github.com/openclaw/openclaw/pull/96258), [#95094](https://github.com/openclaw/openclaw/pull/95094), [#95466](https://github.com/openclaw/openclaw/pull/95466), [#95876](https://github.com/openclaw/openclaw/pull/95876), [#95880](https://github.com/openclaw/openclaw/pull/95880), [#95919](https://github.com/openclaw/openclaw/pull/95919), [#95928](https://github.com/openclaw/openclaw/pull/95928), [#95991](https://github.com/openclaw/openclaw/pull/95991), [#96235](https://github.com/openclaw/openclaw/pull/96235), [#94272](https://github.com/openclaw/openclaw/pull/94272), [#94622](https://github.com/openclaw/openclaw/pull/94622), [#95898](https://github.com/openclaw/openclaw/pull/95898), [#95901](https://github.com/openclaw/openclaw/pull/95901), [#95999](https://github.com/openclaw/openclaw/pull/95999), [#96055](https://github.com/openclaw/openclaw/pull/96055), [#96226](https://github.com/openclaw/openclaw/pull/96226), [#96271](https://github.com/openclaw/openclaw/pull/96271), [#97909](https://github.com/openclaw/openclaw/pull/97909), [#91502](https://github.com/openclaw/openclaw/pull/91502), [#91506](https://github.com/openclaw/openclaw/pull/91506), [#94700](https://github.com/openclaw/openclaw/pull/94700), [#95406](https://github.com/openclaw/openclaw/pull/95406), [#95858](https://github.com/openclaw/openclaw/pull/95858), [#95933](https://github.com/openclaw/openclaw/pull/95933), [#95944](https://github.com/openclaw/openclaw/pull/95944), [#95947](https://github.com/openclaw/openclaw/pull/95947), [#95952](https://github.com/openclaw/openclaw/pull/95952), [#95961](https://github.com/openclaw/openclaw/pull/95961), [#95971](https://github.com/openclaw/openclaw/pull/95971), [#95975](https://github.com/openclaw/openclaw/pull/95975), [#96003](https://github.com/openclaw/openclaw/pull/96003), [#96017](https://github.com/openclaw/openclaw/pull/96017), [#96030](https://github.com/openclaw/openclaw/pull/96030), [#96246](https://github.com/openclaw/openclaw/pull/96246), [#87121](https://github.com/openclaw/openclaw/pull/87121), [#90223](https://github.com/openclaw/openclaw/pull/90223), [#93378](https://github.com/openclaw/openclaw/pull/93378), [#95475](https://github.com/openclaw/openclaw/pull/95475), [#95499](https://github.com/openclaw/openclaw/pull/95499), [#95602](https://github.com/openclaw/openclaw/pull/95602), [#95653](https://github.com/openclaw/openclaw/pull/95653), [#76668](https://github.com/openclaw/openclaw/pull/76668), [#87861](https://github.com/openclaw/openclaw/pull/87861), [#95243](https://github.com/openclaw/openclaw/pull/95243), [#78715](https://github.com/openclaw/openclaw/pull/78715), [#93502](https://github.com/openclaw/openclaw/pull/93502), [#96044](https://github.com/openclaw/openclaw/pull/96044), [#96057](https://github.com/openclaw/openclaw/pull/96057), [#96061](https://github.com/openclaw/openclaw/pull/96061), [#91193](https://github.com/openclaw/openclaw/pull/91193), [#95706](https://github.com/openclaw/openclaw/pull/95706), [#96179](https://github.com/openclaw/openclaw/pull/96179), [#89912](https://github.com/openclaw/openclaw/pull/89912), [#90439](https://github.com/openclaw/openclaw/pull/90439), [#96182](https://github.com/openclaw/openclaw/pull/96182), [#96191](https://github.com/openclaw/openclaw/pull/96191), [#96193](https://github.com/openclaw/openclaw/pull/96193), [#96195](https://github.com/openclaw/openclaw/pull/96195), [#96204](https://github.com/openclaw/openclaw/pull/96204), [#96206](https://github.com/openclaw/openclaw/pull/96206), [#96213](https://github.com/openclaw/openclaw/pull/96213), [#96218](https://github.com/openclaw/openclaw/pull/96218), [#95893](https://github.com/openclaw/openclaw/pull/95893), [#95930](https://github.com/openclaw/openclaw/pull/95930). Thanks @aniruddhaadak80, @coder999999999, @davinci282828, @harjothkhara, @hugenshen, @jalehman, @jason-allen-oneal, @joshavant, @kklouzal, @lizuju, @mehrazmorshed, @mmyzwl, @patrick-erichsen, @romneyda, @rushindrasinha, @shuofengzhang, @tayoun, @vincentkoc, @wadydx, @wangmiao0668000666, @whiteyzy, @yachiyo1680, @zats. ## 2026.6.10 Automatic fast mode starts short conversations quickly, then returns longer or fallback work to normal mode without losing visible state. Provider routing, channel progress, session identity, and trusted tool policies are more reliable, with smaller improvements spanning provider setup, diagnostics, and transcript tooling. ### Highlights #### Automatic fast mode - Adds [`/fast auto`](https://docs.openclaw.ai/tools/thinking) so short conversational calls can start quickly, while longer or fallback work returns to normal mode with the effective state still visible. [PR #85104](https://github.com/openclaw/openclaw/pull/85104), [Issue #85087](https://github.com/openclaw/openclaw/issues/85087). Thanks @alexph-dev and @vincentkoc. - Shows the effective automatic fast-mode state in status instead of reducing it to on/off, and avoids carrying a cleared Codex service-tier choice into later runs. [8845f2f](https://github.com/openclaw/openclaw/commit/8845f2fd6143becc37110ab5021dd5e1517f0cdc). Thanks @vincentkoc. - Keeps automatic fast-mode timing consistent when a turn switches to a fallback model. [075091d](https://github.com/openclaw/openclaw/commit/075091d0cab94053ff094268efc0acb225d514f4). Thanks @vincentkoc. - Keeps the original fast-mode timing and progress behavior when a live model switch retries a turn. [d1e190f](https://github.com/openclaw/openclaw/commit/d1e190fbe822ad6ae4e660ce376b60ec9fdb0fba). Thanks @vincentkoc. - Keeps automatic fast-mode progress and reset behavior distinct from explicit fast mode after a run switches modes. [20aec98](https://github.com/openclaw/openclaw/commit/20aec985545db7a24ea066e5bff1c47b789cbded). Thanks @vincentkoc. - Shows the effective fast-mode value in connected-agent sessions instead of the configured value, so status reflects what the session is actually using. [9509aa0](https://github.com/openclaw/openclaw/commit/9509aa063c0ef3e32be1516fcb0c23606b6d5c7b). Thanks @vincentkoc. - Keeps the effective automatic fast-mode setting visible through fallback transitions in connected-agent sessions. [7f5423c](https://github.com/openclaw/openclaw/commit/7f5423ca97174a3f16c211db54a6c96e5b3a6089). Thanks @vincentkoc. - Keeps automatic fast-mode timing and progress consistent when reply and [scheduled-agent runs](https://docs.openclaw.ai/automation/cron-jobs) retry or switch models. [6c29f88](https://github.com/openclaw/openclaw/commit/6c29f88913796bfe05696556cd82246670b126f0). Thanks @vincentkoc. - Keeps fast-mode cleanup and status consistent when a run switches between fallback models. [c4694f8](https://github.com/openclaw/openclaw/commit/c4694f84ffd52064f89609098cc4f8570fb72e1b). Thanks @vincentkoc. - Shows the automatic fast-mode reset only when fallback work is finished, so status messages match the end of the transition. [f4d93c8](https://github.com/openclaw/openclaw/commit/f4d93c855bff6930f5e5d739b95e0c2612ec4899). Thanks @vincentkoc. - Shows reset and delivery progress at the right time when auto-reply or other follow-up runs retry or leave automatic fast mode. [684e440](https://github.com/openclaw/openclaw/commit/684e44013778bd47d159e64b2595e4d09a92ebea). Thanks @vincentkoc. ### Channels and Messaging #### Channel delivery and progress updates - Prevents the next turn after a [scheduled message](https://docs.openclaw.ai/automation/cron-jobs) from losing what was delivered or whether delivery failed, so replies can use that context without exposing cron details in the channel. [PR #93580](https://github.com/openclaw/openclaw/pull/93580). Thanks @jalehman and @scotthuang. - Prevents streamed channel progress from dropping a repeated status that represents a separate step, so each meaningful step remains visible in the draft. [2d42e52](https://github.com/openclaw/openclaw/commit/2d42e52ac5513e0bd824b8a0e069db83e04bc056). Thanks @vincentkoc. - Prevents keyed streamed progress from staying on an older status, so viewers see the latest state instead of stale text. [8bb6472](https://github.com/openclaw/openclaw/commit/8bb6472c4de2eea06f1ba31d6ed679e2ac4581b0). Thanks @vincentkoc. ### Providers and Models #### Provider model catalogs and reasoning controls - Treats Zhipu/GLM overload responses as overloads, so a configured fallback is selected for the right reason instead of following the wrong failover path. [PR #93241](https://github.com/openclaw/openclaw/pull/93241), [Issue #93211](https://github.com/openclaw/openclaw/issues/93211). Thanks @0xghost42 and @zhengli0922. - Prevents Telegram, Slack, and Discord `/think` menus for live Ollama models from hiding supported levels, so users can choose valid reasoning settings without guessing. [PR #94067](https://github.com/openclaw/openclaw/pull/94067), [Issue #93835](https://github.com/openclaw/openclaw/issues/93835). Thanks @civiltox and @openperf. - Expands [`zai/glm-5.2` thinking choices](https://docs.openclaw.ai/tools/thinking) beyond binary on/off and sends high or max requests as the intended Z.AI reasoning effort. [PR #94136](https://github.com/openclaw/openclaw/pull/94136). Thanks @borclaw. - Prevents bundled [Z.ai GLM-5 models](https://docs.openclaw.ai/providers/zai) from falling through to OpenAI and producing misleading API-key errors, so they use Z.AI by default. [PR #94461](https://github.com/openclaw/openclaw/pull/94461), [Issue #94269](https://github.com/openclaw/openclaw/issues/94269). Thanks @chrysb and @pandah97. - Adds GLM-5.2 and Kimi K2.7 Code to the [OpenCode Go catalog](https://docs.openclaw.ai/providers/opencode-go) with current limits, so users can select the models from OpenClaw. [66f84a9](https://github.com/openclaw/openclaw/commit/66f84a9bf1082de26f92b2b3741cc2f34aba34fa). Thanks @samson1357924. - Corrects `kimi-k2.7-code` capability listings so OpenCode Go users are not offered unsupported video prompts when the model accepts text and images. [715dc71](https://github.com/openclaw/openclaw/commit/715dc718fc5a2a5d6f7e9ec16e0269382b726e83). #### Provider plugin onboarding - Prevents first-run setup from skipping the selected provider's credential prompt after plugin installation, so onboarding continues with that provider instead of falling back to OpenAI. [PR #95792](https://github.com/openclaw/openclaw/pull/95792), [Issue #95765](https://github.com/openclaw/openclaw/issues/95765). Thanks @snowzlmbot. ### Memory, Sessions, and State #### Session transcript SDK helpers - Adds a durable [session-transcript SDK contract](https://docs.openclaw.ai/plugins/sdk-runtime) so plugins can read, append, publish, and lock the intended transcript without treating [legacy file paths](https://docs.openclaw.ai/plugins/sdk-subpaths) as identity. [PR #95030](https://github.com/openclaw/openclaw/pull/95030). Thanks @jalehman. #### Cross-channel session identity - Prevents a shared direct-message [session](https://docs.openclaw.ai/concepts/session) from carrying the previous [channel's identity](https://docs.openclaw.ai/channels/channel-routing) after a switch, so status, reactions, threads, and message references target the current channel. [PR #95328](https://github.com/openclaw/openclaw/pull/95328), [Issue #95325](https://github.com/openclaw/openclaw/issues/95325). Thanks @gorkem2020, @jalehman, and @zengwen-dt. ### Gateway, Security, and Trust #### Prompt context boundaries - Keeps empty prompts separate from hook-added context during compaction or session reuse in [Copilot and Codex sessions](https://docs.openclaw.ai/plugins/copilot), so prompt boundaries remain consistent. [PR #94838](https://github.com/openclaw/openclaw/pull/94838). Thanks @vincentkoc. #### Trusted tool policy enforcement - Keeps [approval-sensitive Gateway and plugin tools](https://docs.openclaw.ai/plugins/hooks) protected when connected extensions change, so configured safeguards continue to apply. [PR #94545](https://github.com/openclaw/openclaw/pull/94545). Thanks @jesse-merhi. #### Trusted package redirects - Prevents authenticated package-source tokens from being sent to an allowed redirect on another origin, while the valid redirected download still completes. [b0df6dc](https://github.com/openclaw/openclaw/commit/b0df6dc10eb5b9e9fdca93063a16316f8589954e). ### Clients and Interfaces #### Docker and Podman setup timeouts - Prevents [Docker](https://docs.openclaw.ai/install/docker) and [Podman](https://docs.openclaw.ai/install/podman) setup from running unbounded on hosts where GNU timeout is installed as `gtimeout`, so image pulls, builds, and detached startup receive the intended guard. [62b2e9e](https://github.com/openclaw/openclaw/commit/62b2e9ef14b4be6fd396621c8e5e248331f08695). ### Plugins and Packaging #### Codex service-tier clearing - Prevents cleared [Codex service tiers](https://docs.openclaw.ai/tools/thinking) from being persisted as explicit stale state, so resumed or switched conversations use the normal default instead. [cd32d9f](https://github.com/openclaw/openclaw/commit/cd32d9ff91caf84c0ead38796ef096cdc5bea06e). Thanks @vincentkoc. #### StepFun provider installation - Restores [ClawHub discovery](https://docs.openclaw.ai/plugins/reference/stepfun) for the [StepFun provider](https://docs.openclaw.ai/providers/stepfun) plugin, so operators can install it through either ClawHub or npm. [ecb82f1](https://github.com/openclaw/openclaw/commit/ecb82f1be93024be23c1b191ebea92c63230b6c0). Thanks @vincentkoc. ### Docs and Operator Workflows #### Doctor check ordering - Keeps core [`openclaw doctor`](https://docs.openclaw.ai/gateway/doctor) diagnostics in their normal order before extension checks, making lint and repair output easier to follow. [PR #86627](https://github.com/openclaw/openclaw/pull/86627). Thanks @giodl73-repo. ## 2026.6.9 ### Highlights - **Richer Telegram delivery:** Telegram now sends rich HTML, preserves rich markdown and sticker paths, renders progress drafts and command output more faithfully, normalizes HTML tables safely, and keeps mentions and spooled handlers on the right delivery path. (#93286, #93164, #93124, #93364, #93130, #93002, #93088, #93281, #94891, #94856) Thanks @obviyus, @vincentkoc, @goutamadwant, @kesslerio, @NianJiuZst, @SweetSophia, @Marvinthebored, @aaajiao, @zhangguiping-xydt, @zhangqueping, and @jairrab. - **More dependable agent recovery:** retries, terminal outcomes, usage after compaction, session history repair, and reply reconciliation now keep more interrupted or partial turns moving toward a visible final result. (#92191, #93073, #93228, #93084, #93469, #93291, #90943) Thanks @ai-hpc, @lml2468, @fuller-stack-dev, @Hollychou924, @leno23, @de1tydev, @425072024, @wuwahe3, @drvoss, @yetval, @sandieman2, and @vincentkoc. - **A stronger Codex integration:** Codex gains automatic plugin approvals, GPT-5.3 Spark OAuth routing, remote-node `exec` as a dynamic tool, and more reliable app-server teardown and terminal outcomes. (#92625, #89133, #93654, #91767, #93287) Thanks @kevinslin, @VACInc, @vincentkoc, @JPKay-AI, and @aliahnaf2013-max. - **Standalone official provider plugins:** external provider packages are now first-class npm releases, externally installed channel plugins load at Gateway startup, and StepFun is available from npm and ClawHub. (#93470) Thanks @sunlit-deng, @cxdnicole, and @vincentkoc. - **More capable web and native clients:** the Control UI adds a session workspace rail and extension health, iOS adds Watch controls, and Android shows chat context. (#92856, #91952, #93387, #92837) Thanks @Solvely-Colin, @jalehman, @joshavant, and @Tosko4. - **More useful search and skills:** Codex Hosted Search is available, key-free search providers remain deliberate opt-ins, and ClawHub skill installs retain verified source provenance. (#93446, #93616, #93283, #93506) Thanks @fuller-stack-dev, @davemorin, @momothemage, @nmccready-tars, and @vincentkoc. ### Changes - Providers and auth: add Codex Hosted Search, improve Gemini CLI OAuth behind proxies, and keep external provider onboarding on current choices and package metadata. (#93446, #92815) Thanks @fuller-stack-dev, @yetval, @EvetteYoung, and @vincentkoc. - Plugins and installs: externalized official providers publish as independent npm packages, Gateway discovers installed channel plugins at startup, and StepFun installs from npm or ClawHub. (#93470) Thanks @sunlit-deng, @cxdnicole, and @vincentkoc. - Dashboard and mobile: add a session workspace rail, plugin health in status, compact cron lists, and iOS Watch controls. (#92856, #91952, #93395, #93387) Thanks @Solvely-Colin, @jalehman, @yu-xin-c, @centralpc, @joshavant, and @vincentkoc. - Codex, observability, and skills: add automatic plugin approvals and SecretRefs, preserve ClawHub skill provenance, add OpenTelemetry log export, and expose remote-node execution to Codex when a node is connected. (#92625, #94324, #93283, #94561, #93654) Thanks @kevinslin, @kevinlin-openai, @momothemage, @nmccready-tars, @jesse-merhi, @vincentkoc, and @JPKay-AI. - QA and release engineering: QA scenarios now use YAML, with broader profile evidence and release coverage for the plugin and channel matrix. Thanks @vincentkoc. ### Fixes - Security and privacy: redact secrets from debug/config output, block internal HTTP session overrides, audit open-DM tool exposure, and retain plugin write ownership checks. (#93333, #88496, #93443, #92883, #93353) Thanks @Alix-007, @jason-allen-oneal, @coygeek, @RichardCao, @yu-xin-c, @cjg20ss, @eleqtrizit, and @vincentkoc. - Agent and session runtime: retry thinking-only and empty post-tool turns, prevent duplicate hook execution, preserve pending subagent delivery, preserve fresh usage through compaction, and repair partial JSON/history artifacts. (#92191, #93073, #93009, #93084, #93469, #94349, #92383, #94257) Thanks @ai-hpc, @lml2468, @fuller-stack-dev, @zenglingbiao, @dertbv, @Hollychou924, @leno23, @de1tydev, @425072024, @wuwahe3, @drvoss, @vincentkoc, @sallyom, @oiGaDio, @Hidetsugu55, and @Nas01010101. - Channels and replies: fix Telegram rich delivery, table rendering, action-error handling, progress draft cleanup before visible tool output, and ingress recovery; preserve command progress detail across channel adapters; retain WhatsApp opening text after a media failure; keep Mattermost thread replies intact; and harden Discord action handling. (#93286, #93364, #93281, #93002, #93076, #93334, #93424, #93488, #94868, #94891, #94856, #94810, #93823) Thanks @obviyus, @NianJiuZst, @mcaxtr, @zhangguiping-xydt, @rushindrasinha, @amknight, @lzyyzznl, @darealgege, @vincentkoc, @zhangqueping, @jairrab, @ZOOWH, @parveshsaini, and @yetval. - Storage and migrations: avoid SQLite WAL on network filesystems, clean reindex artifacts, keep setup state out of workspace dot-directories, and import default-agent auth profiles into SQLite. (#93454, #92891, #93182, #93295, #93520, #93156) Thanks @vincentkoc, @ZengWen-DT, @Zeng-wen, @potterdigital, @Alix-007, @Pick-cat, @sallyom, @1qh, and @Tazio7. - Provider and model behavior: fix Gemini CLI proxy OAuth, restore Codex Spark OAuth routing, correct Bedrock embedding model IDs, and preserve configured defaults in embedded runs. (#92815, #89133, #93452, #93428) Thanks @yetval, @EvetteYoung, @VACInc, @LiuwqGit, @aleck31, @zenglingbiao, @danielgerlag, and @vincentkoc. - CLI, TUI, and apps: accept global flags after subcommands, keep terminal output and activity indicators visible, preserve CJK IME composition, and refresh stale UI state. (#93455, #93460, #93006, #93427, #93498, #93606) Thanks @ooiuuii, @Alix-007, @ZengWen-DT, @Zeng-wen, @AlethiaQuizForge, @Zhaoqj2016, @liuhao1024, @BrianClaw1955, @vincentkoc, and @NicoBoom13. - Operations and updates: harden official plugin recovery, restart managed Gateways after failed update handoff, keep safe cron delivery defaults, avoid Node-specific npm prefixes, and keep package validation paths reliable. (#93325, #92111, #93650, #94453, #91685) Thanks @vincentkoc, @yetval, @ofan, @yaanfpv, @jincheng-xydt, @sallyom, @davectr, and @nxmxbbd. ### Complete contribution record This audited record covers the complete v2026.6.8..HEAD history: 423 merged PRs. The generation manifest also supplies direct commits as editorial input; the grouped notes above prioritize user impact. #### Pull requests - **PR #92154** fix(qqbot): gate private group commands and close strict command visibility gaps. Thanks @sliverp. - **PR #90463** refactor: add session accessor seam with gateway consumer. Thanks @jalehman. - **PR #88656** Drop reasoning-only length turns from replay. Thanks @abel-zer0. - **PR #92856** feat(webui): add session workspace rail. Thanks @Solvely-Colin. - **PR #92845** docs(browser-control): document OPENCLAW_EAGER_BROWSER_CONTROL_SERVER requirement. Related #92841. Thanks @liuhao1024 and @jeugregg. - **PR #82366** fix: use passive periodic sqlite wal checkpoints. Related #81715. Thanks @honor2030 and @KrasimirKralev. - **PR #92815** fix(google): route Gemini CLI OAuth through the env proxy (#46184). Thanks @yetval and @EvetteYoung. - **PR #91331** fix(mattermost): merge progress preview lines by identity. Related #89761. Thanks @iloveleon19 and @leonthe8th and @vincentkoc. - **PR #92909** fix(tui): keep spinner active when toggling tools. Related #49763. Thanks @ZengWen-DT and @Zeng-wen and @vincentkoc and @CrimsonDump. - **PR #92904** fix(elevenlabs): use current TTS model ids. Thanks @vortexopenclaw and @vincentkoc. - **PR #92642** fix #86872: Subagent run reports success but fails to write output file. Thanks @zhangguiping-xydt and @vincentkoc and @zapper35. - **PR #89122** refactor: route command session reads through seam. Thanks @jalehman. - **PR #90943** fix(reply): deliver final reply when queued follow-up claims session; scope dedupe to routed thread. Thanks @sandieman2 and @vincentkoc. - **PR #92894** fix(skills): keep managed prompt paths readable. Related #92875. Thanks @kesslerio and @sallyom. - **PR #39617** fix: reload config in slash command routing so dmScope is respected. Related #39605. Thanks @Ciward. - **PR #92191** fix(agents): retry thinking-only errored turns. Related #91953. Thanks @ai-hpc and @lml2468. - **PR #92891** fix(memory): clean stale reindex temp files. Related #92874. Thanks @ZengWen-DT and @Zeng-wen and @vincentkoc and @potterdigital. - **PR #93005** Add OpenRouter Fusion guidance and prompt context. Related #92984. Thanks @sallyom. - **PR #88792** fix(state): harden sqlite path caching. Thanks @vincentkoc. - **PR #93022** fix(gateway): repair usage cost aggregation across agents. Thanks @luke-skywalker-open-claw and @stablegenius49. - **PR #93020** fix(telegram): cool down transient sendChatAction failures. Related #56096. Thanks @Boulea7 and @sumaiazaman and @Pick-cat and @cal-rufus. - **PR #93002** fix(telegram): clear progress drafts before visible tool output. Thanks @zhangguiping-xydt. - **PR #89160** fix(agents): detect truncated API responses to prevent silent session hang. Related #89051. Thanks @joelnishanth and @ArthurusDent. - **PR #93009** fix(agents): make wrapToolWithBeforeToolCallHook idempotent to prevent double hook execution (fixes #92973). Thanks @zenglingbiao and @dertbv. - **PR #92991** fix(agents): tolerate missing attribution baseUrl. Related #92974. Thanks @samrusani and @Haderach-Ram. - **PR #92913** fix(opencode-go): register model catalog to fix context window detection. Related #92912. Thanks @kumaxs. - **PR #89129** refactor: route bundled plugin session callers through seam. Thanks @jalehman. - **PR #93084** fix(agents): preserve fresh usage after compaction. Related #50795. Thanks @Hollychou924 and @leno23 and @de1tydev and @425072024 and @vincentkoc and @wuwahe3. - **PR #92869** fix #90333: [Bug]: Discord image build aborts at step 66 — openclaw-build-messaging-plugins.py exits 1. Thanks @zhangguiping-xydt and @vincentkoc and @chriskosys. - **PR #93011** fix(gateway): accept file-only input on /v1/responses (parity with image-only). Thanks @yetval and @vincentkoc. - **PR #92915** Convert QA scenarios to YAML files. Thanks @RomneyDa. - **PR #91767** Fix one-shot Codex app-server teardown. Thanks @aliahnaf2013-max. - **PR #92625** feat(codex): add auto plugin approvals. Thanks @kevinslin. - **PR #91587** test(qa): add qa run --qa-profile and unified output summary/evidence. Thanks @RomneyDa. - **PR #93104** test(reply): seed channel fixtures for dedupe tests. Thanks @RomneyDa. - **PR #93107** test(reply): preserve telegram dedupe fallback. Thanks @RomneyDa. - **PR #92954** fix(memory): accept local default model path migration. Thanks @mushuiyu886 and @vincentkoc. - **PR #90936** fix(agents): do not misclassify client-disconnect abort as run timeout. Related #90764. Thanks @openperf and @reginaldomarcilon. - **PR #90812** fix(voice-call): preserve live Twilio streams in stale reaper. Related #79121. Thanks @Takhoffman and @sahibzada-allahyar and @donkeykong91. - **PR #93094** fix(whatsapp): bound socket operations. Thanks @mcaxtr. - **PR #91629** fix(scripts): add database-first legacy store guard. Related #91628. Thanks @galiniliev. - **PR #93124** fix(telegram): render progress drafts as rich previews. Thanks @Marvinthebored. - **PR #93109** test(qa): embed profile scorecard evidence. Thanks @RomneyDa. - **PR #87298** test: add temp directory helper guidance. Thanks @hxy91819. - **PR #92318** fix(cron): require explicit message target proof. Thanks @hxy91819. - **PR #93137** fix(imessage): honor disabled reply actions. Related #92142. Thanks @omarshahine and @dprev. - **PR #93134** fix(feishu): pass card_msg_content_type to get full card content (fixes #78289). Thanks @liuhao1024 and @vincentkoc and @longdoubled7. - **PR #93138** fix(agents): preserve literal current session resolution. Thanks @liuhao1024 and @vincentkoc. - **PR #91225** fix #83830: [Bug]: Dreaming diary repeats "first day" narrative every sweep — same early memories dominate snippets. Thanks @mushuiyu886 and @YinLiuLiu66. - **PR #93153** simplify QA evidence profile and mappings/coverage shape. Thanks @RomneyDa. - **PR #93164** fix(telegram): preserve rich markdown line breaks. Thanks @vincentkoc. - **PR #93119** fix: accept mixed source/dist bundled roots. Related #87730. Thanks @arkyu2077 and @vincentkoc and @jasonftl. - **PR #93130** fix(telegram): preserve sticker media paths. Related #83748. Thanks @goutamadwant and @vincentkoc and @aaajiao. - **PR #93073** fix(agents): retry empty post-tool final turns. Thanks @fuller-stack-dev. - **PR #91784** fix(voice-call): require realtime websocket path boundary. Thanks @jason-allen-oneal. - **PR #89133** Restore GPT-5.3 Codex Spark OAuth routing. Thanks @VACInc. - **PR #91996** refactor: prune unused iOS code. Thanks @zats. - **PR #90231** fix #69443: [Bug] Subagent RPC callback to WeChat session key routed to main session instead. Thanks @zhangguiping-xydt and @sliverp and @chen11221. - **PR #89920** fix(matrix): replace recovered command progress lines. Thanks @bdjben and @jesse-merhi. - **PR #93159** fix(tui): keep parent stdin paused after exit. Thanks @fuller-stack-dev. - **PR #93201** fix(auto-reply): clear pending-final state before honoring post-send abort (#89115). Thanks @amknight and @danashburn. - **PR #93228** fix(agents): replace prose terminal classifiers. Thanks @fuller-stack-dev. - **PR #93231** fix(status): correct pinned model clear hint. Thanks @hxy91819. - **PR #92428** fix(qqbot): keep markdown table chunks valid. Thanks @sliverp. - **PR #93220** fix(status): avoid stale session context windows. Thanks @hxy91819. - **PR #91957** perf(sessions): share one enumeration across archive retention sweeps. Thanks @amknight. - **PR #93281** fix(telegram): recover pid-reused ingress claims. Thanks @obviyus. - **PR #93287** fix(codex): preserve terminal outcome ordering. - **PR #93182** fix(memory): clean rollback-journal reindex temp sidecar on NFS stores. Thanks @Alix-007. - **PR #93283** Persist ClawHub skill install provenance. Related #92077. Thanks @momothemage and @nmccready-tars. - **PR #88872** fix: attribute spawned task runs to child agent. Related #66670. Thanks @Alix-007 and @Neomail2. - **PR #92837** fix(android): show live chat context usage. Thanks @Tosko4. - **PR #93325** fix(cli): harden official plugin recovery. Thanks @vincentkoc. - **PR #93286** feat(telegram): send rich messages as rich html. Thanks @obviyus. - **PR #92910** fix(memory-core): safely refresh qmd index during collection repair. - **PR #93329** fix(cli): allow zero Discord timeout duration. Related #93327. Thanks @rohitjavvadi. - **PR #91625** fix(cron): add cron edit --clear-model to clear a job's model override. Thanks @ly-wang19. - **PR #91691** [AI] fix(memory): prevent empty-string expectedModel in resolveMemory…. Thanks @xydt-tanshanshan. - **PR #93006** fix(tui): keep stderr visible when local shell stdout fills the output cap. Thanks @Alix-007. - **PR #93001** fix(daemon): prefer stderr over stale stdout in gateway restart diagnostics. Thanks @Alix-007. - **PR #91117** refactor: remove dead code and improve string concatenation. Thanks @Pommelle. - **PR #90893** fix(models): mask paste-token input in CLI auth prompt. Thanks @anurag-bg-neu. - **PR #90571** fix(configure): mask gateway password input in CLI wizard prompt. Thanks @anurag-bg-neu. - **PR #91768** fix(ios): respect chat header safe area. Thanks @zats. - **PR #93245** fix(cron): resolve lastRunStatus in cron list/show human output. Thanks @ly-wang19. - **PR #78765** fix(tui): avoid inserting spaces into long CJK text. Thanks @hpt. - **PR #91776** fix(ios): refresh permission rows after grants. Thanks @zats. - **PR #92817** fix(cron): trust agent output when channel is unresolved without explicit delivery. Related #90664. Thanks @fsdwen and @dertbv. - **PR #93297** fix(control-ui): respect agents.defaults.timeFormat for timestamps. Related #58147. Thanks @ZengWen-DT and @Zeng-wen and @TommoT2. - **PR #93364** Fix Telegram rich progress command output. Thanks @obviyus. - **PR #91952** feat(status): surface plugin health. Thanks @jalehman. - **PR #75025** fix(heartbeat): refresh stale Current time line on every helper call (#44993). Thanks @MoerAI and @mclee1975. - **PR #90992** docs(windows): fix WSL gateway-autostart recipe for WSL ≥ 2.6.1.0 idle-termination. Thanks @spencer2211. - **PR #86544** fix(cli): show Gemini CLI runtime auth status. Related #79585. Thanks @giodl73-repo and @fabricefoy. - **PR #88945** fix(plugins): serialize binding approval saves. Related #64065. Thanks @Alix-007 and @lihaokun. - **PR #90115** fix(gateway): pass managed inbound PDFs through chat.send. Related #90097. Thanks @harjothkhara and @joeykrug. - **PR #74613** docs(cli): add agent selector to CLI backend quick start. Related #68940. Thanks @vyctorbrzezowski and @drmarcopapa. - **PR #89121** refactor: add transcript reader seam. Thanks @jalehman. - **PR #84434** fix(cli): disable ScheduleWakeup/CronCreate in --print claude runs. Thanks @SkyWolfDreamer. - **PR #66985** fix(agents): resolve requestedNode to canonical ID before boundNode comparison. Related #87213. Thanks @mujiannan. - **PR #91488** fix(reply): project preflight compaction gate by next-input size on fresh tokens. Thanks @yetval. - **PR #93353** fix(plugins): require owner for plugin writes. Thanks @eleqtrizit. - **PR #91499** fix(cron): preserve scheduled turn tool policy [AI]. Thanks @mmaps. - **PR #90412** fix(sessions): cache warm transcript reads to avoid per-turn re-parse. Related #83943. Thanks @Alix-007 and @yyds-xxxx. - **PR #93118** fix(gateway): guard fast-path startup migrations. Related #93032. Thanks @openperf and @Haderach-Ram. - **PR #93355** fix(ci): verify performance workflow downloads. Thanks @eleqtrizit. - **PR #93358** fix(outbound): guard cross-context message mutations. Thanks @eleqtrizit. - **PR #93362** fix(flock): bind allow-always to wrapped command. Thanks @eleqtrizit. - **PR #92578** refactor(whatsapp): add inbound admission foundation. Thanks @mcaxtr. - **PR #89547** Control Telegram group history context. Thanks @mmaps. - **PR #89201** refactor: add transcript runtime identity contract. Thanks @jalehman. - **PR #93357** fix(plugins): enforce install policy in wrappers. Thanks @eleqtrizit. - **PR #93156** fix(doctor): import default-agent auth profiles into sqlite. Related #93145. Thanks @Pick-cat and @sallyom and @Tazio7. - **PR #93179** Add slim evidence mode for QA profile evidence. Thanks @RomneyDa. - **PR #93349** fix(control-ui): keep workboard card titles visible in overflowing columns (fixes #91717). Thanks @Pick-cat and @NicoBoom13. - **PR #93324** fix(cli): accept --no-color after subcommands. Thanks @ooiuuii. - **PR #89621** Return Google Chat thread metadata from message sends. Thanks @franco-viotti. - **PR #82458** fix(infra): drop duplicated "restart" word in restart-sentinel summary. Thanks @jameswniu. - **PR #85471** Suppress cron announce control replies. Related #85421. Thanks @TurboTheTurtle and @leatherneck-33. - **PR #85316** fix(auth): keep alias-compatible auth-profile overrides instead of clearing them. Thanks @SkyWolfDreamer. - **PR #89260** fix(doctor): separate platform-incompatible skills from missing requirements. Related #89232. Thanks @Alix-007 and @CameronWeller. - **PR #90846** fix(media): stop pruning media on write; let the configured timer do it. Thanks @lundog. - **PR #88062** fix(logging): avoid stalled warnings for active model calls. Thanks @litang9. - **PR #93308** fix(discord): reject malformed realtime consult calls. Thanks @khoek. - **PR #93334** fix(whatsapp): notify user when trailing media send fails instead of silent drop. Thanks @rushindrasinha. - **PR #92575** fix(sessions): preserve user behavior overrides across daily/idle rollover (#92562) [AI-assisted]. Thanks @harjothkhara and @civiltox. - **PR #89124** refactor: route auto-reply sessions through session seam. Thanks @jalehman. - **PR #93431** fix: stabilize transcript cache and CLI env isolation. Thanks @shakkernerd. - **PR #93412** fix(discord): suppress tool progress for message-tool replies. Thanks @mgunnin and @vincentkoc. - **PR #93409** fix(whatsapp): stop markdownToWhatsApp dropping code spans followed by a digit. Thanks @rushindrasinha. - **PR #93295** fix(memory): swap rollback-journal sidecar during atomic reindex. Thanks @Alix-007. - **PR #93076** fix(whatsapp): preserve auth on terminal disconnects. Thanks @mcaxtr. - **PR #93435** fix(agents): bound autoreview scope. Thanks @vincentkoc. - **PR #93279** fix(telegram): restore readable default text sends. Related #93263. Thanks @NianJiuZst and @SweetSophia. - **PR #93429** fix(line): cap carousel column text at 60 chars when a title or image is set. Thanks @harjothkhara and @vincentkoc. - **PR #93428** fix(agents): resolve configured default model in runEmbeddedAgent (fixes #93419). Thanks @zenglingbiao and @vincentkoc and @danielgerlag. - **PR #93427** fix(tui): show activity indicator for system-injected runs. Related #51825. Thanks @ZengWen-DT and @vincentkoc and @Zeng-wen and @AlethiaQuizForge. - **PR #90003** feat(policy): cover exec approvals artifact. Thanks @giodl73-repo. - **PR #93448** fix(guards): allow auth profile sqlite reader. Thanks @amknight. - **PR #93424** fix(mattermost): keep message tool replies in threads. Thanks @amknight and @vincentkoc. - **PR #93418** fix(telegram): forward Bot API 10.1 rich_message content to agent. Related #93410. Thanks @xzh-icenter and @vincentkoc and @0pen7ech. - **PR #93175** test(qa): taxonomy profiles: includeAllCategories for release profile, update some coverage. Thanks @RomneyDa. - **PR #93456** fix(agents): handle string assistant message content. Thanks @vincentkoc. - **PR #93441** fix(outbound): ignore schema-padded poll metadata on send. Related #43015. Thanks @weichengdeng and @charzhou. - **PR #93443** fix(gateway): block internal HTTP session overrides. Thanks @RichardCao. - **PR #93454** fix(sqlite): disable WAL on network filesystems. Thanks @vincentkoc. - **PR #90275** test: make install-safe-path symlink tests compatible with Windows. Thanks @aniruddhaadak80. - **PR #93464** fix(qa): suppress empty WhatsApp debug artifacts. Thanks @vincentkoc. - **PR #90861** fix(cli): preserve sessions_yield over MCP. Related #77426. Thanks @zhangguiping-xydt and @jarvisagimuspicard-hub. - **PR #90946** fix(infra): preserve inherited gateway PID across reparent during cleanup. Thanks @amittell. - **PR #92220** fix(media): extract large managed inbound PDFs via media-understanding. Related #90096, #90097. Thanks @amknight and @joeykrug. - **PR #91208** fix #91047: Plugin session-extension registry not pinned; sessions.pluginPatch fails after agent/subagent plugin-load churn. Thanks @mushuiyu886 and @teamadams. - **PR #92111** fix(update): restart managed gateway when update handoff fails after stop. Related #92088. Thanks @yetval and @ofan. - **PR #93238** fix(agents): honor disabled envelope timestamps at model boundary. Thanks @osolmaz. - **PR #93343** fix(codex): de-duplicate commentary notes across the raw response lane. Related #93296. Thanks @Marvinthebored and @Peetiegonzalez. - **PR #93361** fix(openshell): pin mirror remote mutations. Thanks @eleqtrizit. - **PR #93354** fix(discord): block cross-provider guild admin actions. Thanks @eleqtrizit. - **PR #92178** fix(gateway): normalize malformed paired access lists. Related #90654. Thanks @wangmiao0668000666 and @EmilioNicolas. - **PR #85254** perf(plugins): thread prepared manifestPlugins through runtime model-id normalize chain. Thanks @zeroaltitude. - **PR #93489** Add ClawHub content rights docs to sidebar. Thanks @Patrick-Erichsen. - **PR #93466** [AI] fix(feishu): guard against missing inbound in channelRuntime fallback. Thanks @xydt-tanshanshan. - **PR #93460** fix(cli): honor --log-level in route-first commands. Related #93457. Thanks @ooiuuii. - **PR #93495** fix(cron): clear delivery routing fields from cron edit. Thanks @ly-wang19 and @vincentkoc. - **PR #93494** docs: point PR landing at maintainer workflow. Thanks @fuller-stack-dev and @vincentkoc. - **PR #93487** fix(ui): add agent selector to skills page. Related #78553. Thanks @goutamadwant and @vincentkoc and @xiaobu1112. - **PR #93488** fix(discord): apply tool status emojis immediately to avoid override by thinking reactions. Related #92715. Thanks @lzyyzznl and @vincentkoc and @darealgege. - **PR #93055** fix(ui): restore provider usage pill in desktop chat composer [AI]. Thanks @harjothkhara. - **PR #83156** fix(matrix): accept bracketed display-name mentions. Related #83142. Thanks @wdx-agent-io and @wdongxv. - **PR #93333** fix(auto-reply): redact secrets in /debug show and /debug set output. Thanks @Alix-007. - **PR #88496** fix(auto-reply): redact secrets in config show output. Related #65623. Thanks @jason-allen-oneal and @coygeek. - **PR #93105** fix(doctor): repair null agents.list[].workspace values. Related #77718. Thanks @xydigit-sj and @slideshow-dingo. - **PR #73923** fix(ui): preserve gateway token during safe websocket url edits. Related #41545. Thanks @wsyjh8. - **PR #88970** fix #85871: [Bug]: Heartbeat scheduler silently fails to fire on 5.20 and all 5.x versions (regression from 4.23). Thanks @zhangguiping-xydt and @vincentkoc and @carlbjson. - **PR #93511** fix(imessage): normalize leading NUL echo-cache prefixes. Thanks @vincentkoc and @drvoss. - **PR #92594** [Bug]: ollama-cloud runtime fails DNS lookup for ai.ollama.com, while ollama/:cloud works. Related #92391. Thanks @zhangguiping-xydt and @vincentkoc and @kvzsolt. - **PR #93512** build(docs): finish PowerShell-safe docs formatting. Related #44293. Thanks @vincentkoc and @yil337 and @aniruddhaadak80. - **PR #93513** fix(skills): refresh persisted snapshots after restart. Thanks @vincentkoc and @fif911 and @skadauke. - **PR #93517** fix(skills): quote skill-creator template description. Thanks @vincentkoc and @parubets. - **PR #73976** fix(memory): use per-keyword FTS search in hybrid mode #39484. Thanks @joshuakeithpa-sudo. - **PR #93520** fix(workspace): store setup state outside workspace dot-dir. Thanks @vincentkoc and @1qh. - **PR #93521** fix(onboard): skip Homebrew prompt on unsupported platforms. Related #68893. Thanks @vincentkoc and @yurivict. - **PR #93522** fix(feishu): send post mentions as native at elements. Thanks @vincentkoc and @gavin-ali and @YizukiAme and @Panniantong. - **PR #93496** fix(gateway): rotate already-stale generated transcript filename on /reset. Thanks @harjothkhara and @vincentkoc. - **PR #93471** fix(cron): preserve aborted isolated-run failure. Thanks @BhargavSatya and @vincentkoc. - **PR #93473** fix(memory): report skipped QMD embedding probe. Related #77645. Thanks @TurboTheTurtle and @vincentkoc and @aderius. - **PR #93498** fix(ui): preserve CJK IME composition. Related #86035. Thanks @Zhaoqj2016 and @vincentkoc. - **PR #93088** fix(telegram): bind bot mentions to assistant identity. Thanks @kesslerio and @vincentkoc. - **PR #93499** fix(nodes): return screen snapshots as media. Related #90126. Thanks @zenglingbiao and @vincentkoc and @JeffSteinbok. - **PR #93506** fix(skills): trust verified ClawHub source provenance. Thanks @vincentkoc. - **PR #93525** agents: notify chat exec empty-success completions. Thanks @vincentkoc and @wenkang-xie. - **PR #93446** feat: add Codex hosted web search. Thanks @fuller-stack-dev. - **PR #92883** fix(security): audit open dm tool exposure. Related #55612. Thanks @yu-xin-c and @vincentkoc and @cjg20ss. - **PR #93476** fix(mattermost): preserve Codex progress preview. Related #88766. Thanks @goutamadwant and @vincentkoc and @KelTech-Services. - **PR #93395** feat(cron): add compact list responses. Related #93366. Thanks @yu-xin-c and @vincentkoc and @centralpc. - **PR #93527** fix(cron): preserve model overrides for text payloads. Thanks @vincentkoc and @liaoandi. - **PR #90487** fix: harden ChatGPT Responses missing content-type streams. Thanks @anyech and @vincentkoc. - **PR #93528** fix(gateway): tolerate transient pre-hello clean closes. Thanks @vincentkoc and @ruanrrn. - **PR #93529** fix(auto-reply): allow message tool for group attachments. Related #43146. Thanks @vincentkoc and @Robcis. - **PR #93291** fix(reply): preserve pending thread evidence when reconciling partial send results. Thanks @yetval and @vincentkoc. - **PR #90572** fix(feishu): drop self-authored receive echoes. Thanks @baskduf. - **PR #93455** fix(cli): accept --log-level after subcommands. Thanks @ooiuuii and @vincentkoc. - **PR #93452** fix(bedrock): strip inference profile prefix from model ID in embedding adapter. Related #79212. Thanks @LiuwqGit and @vincentkoc and @aleck31. - **PR #89799** fix(cli): skip compile cache on early Node 24.x to avoid startup deadlock. Related #86550. Thanks @zhangguiping-xydt and @vincentkoc and @renyuliang000. - **PR #93469** fix(agents): drop partialJson streaming artifacts from session history repair. Thanks @drvoss and @vincentkoc. - **PR #93463** fix(codex): log app-server compaction completion. Related #83932. Thanks @goutamadwant and @vincentkoc and @aounakram. - **PR #93562** fix(tui): refresh after external session reset. Related #38966. Thanks @vincentkoc and @wsyjh8 and @yizhanzjz. - **PR #93470** fix(plugins): load externally-installed channel plugins at gateway startup. Related #93219. Thanks @sunlit-deng and @vincentkoc and @cxdnicole. - **PR #88796** fix(discord): resolve guildId from session channel for search actions. Related #88790. Thanks @SebTardif and @vincentkoc and @mugabuga. - **PR #93194** fix(agents): preserve prompt-released session metadata. Related #93193. Thanks @snowzlm. - **PR #89483** fix(gateway): project failed agent turns in chat history. Related #89197. Thanks @IWhatsskill and @vincentkoc and @yangiit. - **PR #93434** fix: avoid parent group allowlist false positive. Related #92684. Thanks @kingrubic and @vincentkoc and @motteman. - **PR #93449** fix(feishu): dedupe redelivered text by stable retry identity. Related #46778. Thanks @ZengWen-DT and @vincentkoc and @kingcuty. - **PR #93407** AGT-80 AGT-81 Fix Discord ingress ack ordering. Thanks @mgunnin and @vincentkoc. - **PR #93439** fix(agents): honor embedded run default model. Related #93419. Thanks @harjothkhara and @vincentkoc and @danielgerlag. - **PR #93565** fix(cli): summarize cleanup dry-run by label. Related #76826. Thanks @AgentArcLab and @vincentkoc and @renatomaluhy. - **PR #93509** fix(skills): clear orphaned idempotency pointer on corrupt-metadata re-begin. Thanks @Alix-007 and @vincentkoc. - **PR #93274** Clarify plugin channel config additional-property errors. Thanks @zhangguiping-xydt and @vincentkoc. - **PR #93555** fix(read): route text decoding through shared Windows codepage fallba…. Thanks @zhanxingxin1998 and @vincentkoc. - **PR #93314** fix(skills): preserve ClawHub origin provenance on readback. Thanks @Alix-007 and @vincentkoc. - **PR #93573** fix(acp): keep bridge sessions out of stale ACP classification [AI-assisted]. Related #38907. Thanks @eldar702 and @vincentkoc and @ninaopenclaw. - **PR #93398** fix(cron): emit isolated model usage diagnostics. Related #92338. Thanks @849261680 and @vincentkoc and @niks999. - **PR #93367** Fix SSH sandbox remote directory args. Related #93344. Thanks @dmorn and @vincentkoc. - **PR #93574** fix(feishu): suppress log noise for bot_p2p_chat_entered_v1 event [AI-assisted]. Related #42351. Thanks @eldar702 and @vincentkoc and @sunking0223. - **PR #93269** Fix tokenjuice bash results without details. Thanks @moeedahmed and @vincentkoc. - **PR #93575** fix(telegram): hydrate group reply-chain media into model context [AI-assisted]. Thanks @eldar702 and @vincentkoc. - **PR #93261** fix(plugins): resolve provider policy surface for plugin-owned CLI backends. Related #93259. Thanks @BitmapAsset and @vincentkoc. - **PR #93303** fix(whatsapp): bound stalled read-receipt socket operations. Thanks @Alix-007 and @vincentkoc. - **PR #93242** fix(mattermost): keep bare @mention with empty body instead of dropping it. Related #93205. Thanks @iloveleon19 and @vincentkoc. - **PR #93606** fix(ui): clear stale Talk error when session transitions to non-error state (fixes #88176). Thanks @liuhao1024 and @vincentkoc and @BrianClaw1955. - **PR #93607** perf(tasks): memoize reconcileInspectableTasks for same-tick calls (fixes #73531). Thanks @liuhao1024 and @vincentkoc and @slideshow-dingo. - **PR #93612** fix(gateway): compute sessions.usage aggregate totals from all sessions, not just the limited page (fixes #76496). Thanks @liuhao1024 and @vincentkoc and @bobsahur-robot. - **PR #93615** fix(telegram): recover lone active spooled handler on timeout (#84158). Thanks @0xghost42 and @vincentkoc and @crash2kx. - **PR #93616** Keep key-free web search providers opt-in. Thanks @davemorin and @vincentkoc. - **PR #93298** fix #93044: control-ui webchat double-renders agent replies when dmScope=main. Thanks @zhangguiping-xydt and @vincentkoc and @cfmilam. - **PR #93618** fix(feishu): filter temporary card-action-c-\* IDs from reply target to prevent Invalid open_message_id errors (fixes #56818). Thanks @liuhao1024 and @vincentkoc and @SwordImmortal. - **PR #93387** feat(ios): add watch action surface. Thanks @Solvely-Colin and @joshavant. - **PR #93648** fix(doctor): archive superseded plugin install index conflicts. Related #90418. Thanks @vincentkoc and @ramitrkar-hash. - **PR #93649** fix(qwen): place DashScope image prompts in user content. Related #92688. Thanks @vincentkoc and @Yachiyo404. - **PR #93650** fix(update): avoid per-Node npm prefixes during self-update. Related #80387. Thanks @vincentkoc and @yaanfpv. - **PR #93653** fix(skill-workshop): skip helper sessions during auto-capture. Thanks @vincentkoc and @zhangguiping-xydt. - **PR #93654** fix(codex): expose remote node exec as a Codex dynamic tool. Related #92141. Thanks @vincentkoc and @JPKay-AI. - **PR #93662** fix(discord): protect mention aliases in code fences. Thanks @vincentkoc and @rohitjavvadi. - **PR #93663** fix(clawdock): open dashboard on published port without starting deps. Related #77344. Thanks @vincentkoc and @dhoman. - **PR #93670** fix(browser): recover stale managed Chrome CDP listener. Related #41750. Thanks @vincentkoc and @rohitjavvadi and @kissman911. - **PR #93672** fix(commands): preserve multiline slash skill args. Related #79155. Thanks @vincentkoc and @web3blind. - **PR #93674** fix(browser): accept top-level act fields with nested requests. Related #38762. Thanks @vincentkoc and @angelusbr and @Lumos-789. - **PR #93678** fix(plugins): allow Dreaming sidecar through restrictive memory allowlists. Related #92536. Thanks @vincentkoc and @pradeep7127 and @resYuto. - **PR #93306** fix(status): ignore stale context after model switch. Thanks @hxy91819. - **PR #93666** fix(control-ui): copy code blocks over plain HTTP via clipboard fallback. Related #93628. Thanks @Pick-cat and @pjq2926. - **PR #93629** fix(reply): preserve unsent text-only finals after block pipeline streamed partial content (fixes #81078). Thanks @liuhao1024 and @Jackten. - **PR #93690** fix(telegram): dispatch MEDIA directives as attachments. Related #77702. Thanks @vincentkoc and @butttersbot. - **PR #93693** fix(gateway): ignore stale sudo scope for root user services. Related #81410. Thanks @vincentkoc and @Ericksza. - **PR #93646** fix(agents): return string assistant content in getLastAssistantText. Thanks @Alix-007 and @vincentkoc. - **PR #93687** fix(i18n): retain Codex error tails in logs. Thanks @hxy91819. - **PR #93630** fix(heartbeat): bootstrap plugin session targets. Thanks @ZengWen-DT and @vincentkoc. - **PR #93658** fix(wizard): preserve existing default model during setup auth choice [AI-assisted]. Related #64129. Thanks @ml12580 and @vegapunk9527. - **PR #93671** fix(respawn): rewrite pnpm versioned entry paths to stable wrapper (fixes #52313). Thanks @liuhao1024 and @vincentkoc and @RichardCao. - **PR #93698** Fix Telegram rich progress detail updates. Thanks @obviyus. - **PR #93656** fix(gateway): send approval route notices with write scope. Related #93563. Thanks @mushuiyu886 and @vincentkoc and @clawbot247-commits. - **PR #93665** fix(gateway): surface codex app-server returned failures. Thanks @litang9 and @vincentkoc. - **PR #93727** fix(context-engine): avoid turn-maintenance lane livelock. Related #77340. Thanks @vincentkoc and @baghvn and @Veda-openclaw. - **PR #93681** fix(llm): handle string assistant content on the OpenAI-compatible completion path. Thanks @Alix-007. - **PR #93722** chore(release): update appcast for 2026.6.8. Thanks @vincentkoc. - **PR #93677** fix(google-meet): declare realtime provider secret inputs. Related #81891. Thanks @goutamadwant and @vincentkoc and @chachi-max. - **PR #92947** fix(qqbot): deliver cron auto-TTS voice by trusting OpenClaw temp root. Related #92816. Thanks @ZengWen-DT and @Zeng-wen and @lewiswu1209. - **PR #93679** fix(whatsapp): extract GIF metadata and distinguish gifPlayback in media placeholders (fixes #49099). Thanks @liuhao1024 and @vincentkoc and @bugkill3r. - **PR #93688** fix(minimax): check base_resp envelope errors in TTS provider. Related #76904. Thanks @dwc1997 and @najef1979-code. - **PR #93714** fix: isolate async model resolution mock from sync mock in flaky test. Related #92117. Thanks @lsr911 and @wangwllu. - **PR #93705** test(macos): cover root command dispatch. Related #83879. Thanks @markoub and @vincentkoc and @davinci282828. - **PR #93711** Keep command text in progress drafts. Thanks @keshavbotagent and @vincentkoc. - **PR #93712** fix: scope assistant avatar override to agent ID. Related #90890. Thanks @lsr911 and @vincentkoc and @najef1979-code. - **PR #93725** fix(usage): prune stale usage cache temp files. Related #78939. Thanks @markoub and @Tramsrepus. - **PR #93726** fix(typing): start typing on reasoning deltas in thinking mode before visible text. Related #79681. Thanks @xialonglee and @novaflash82. - **PR #93716** fix(discord): propagate timeout through channel capabilities diagnostics. Related #77040. Thanks @xialonglee and @vincentkoc and @unicebondoc. - **PR #93729** fix(ollama): preserve configured API during discovery. Related #93710. Thanks @zhangguiping-xydt and @vincentkoc and @obnoxious2011-cmd. - **PR #93719** fix: pin plugin workspace dir for sessions.list to avoid O(rows) memo busting. Related #90814. Thanks @lsr911 and @vincentkoc and @k-l-lambda. - **PR #93732** fix(agents): preserve re-sent user prompt during compaction transcript rotation. Thanks @yetval. - **PR #93738** fix: break plugin registry type import cycle. Thanks @giodl73-repo. - **PR #93740** fix(sessions): release retained locks after takeover. Thanks @TurboTheTurtle. - **PR #93745** fix(usage): reject invalid explicit dates in usage RPC date parsing. Thanks @harjothkhara and @vincentkoc. - **PR #93746** fix(ui): populate realtime talk provider and transport options from talk.catalog. Thanks @shushushv and @vincentkoc. - **PR #93751** fix(ios): fix quick setup sheet layout design. Thanks @zats. - **PR #93749** fix(compaction): ignore stale persisted totalTokens in preflight gate. Thanks @yetval. - **PR #93753** fix: correct tautological uppercase check in tool description summarizer. Thanks @GautamKumarOffical. - **PR #89123** refactor: route transcript writers through session seam. Thanks @jalehman. - **PR #93758** feat(memory): apply outputDimensionality truncation to local GGUF embeddings (fixes #58765). Thanks @liuhao1024 and @vincentkoc and @losz5000. - **PR #93754** feat(inbound-meta): expose per-turn source modality. Related #50482. Thanks @liuhao1024 and @vincentkoc and @JTOrca. - **PR #93767** fix(reasoning-tags): strip MiniMax `mm:` namespaced reasoning tags. Thanks @DrHack1 and @vincentkoc. - **PR #93772** fix(feishu): recover CJK filenames from JSON file_name field (fixes #81103). Thanks @liuhao1024 and @vincentkoc and @pjuneye. - **PR #93773** fix(ui): scope Skill Workshop proposals to selected agent. Related #93760. Thanks @TurboTheTurtle and @vincentkoc and @hannesrudolph. - **PR #88750** feat(context-engine): pass runtime settings into lifecycle. Thanks @ragesaq and @jalehman. - **PR #93763** fix(agents): use neutral billing copy for subscription auth. Related #80877. Thanks @eldar702 and @vincentkoc and @22kyasue. - **PR #93818** List all ClawHub docs in sidebar. Thanks @Patrick-Erichsen. - **PR #93779** fix(webchat): skip textarea resize during IME composition to eliminate typing lag. Related #90800. Thanks @joelnishanth and @vincentkoc and @w10497-create. - **PR #93786** fix(plugins): treat refreshable catalogs as requiring runtime discovery (fixes #93775). Thanks @liuhao1024 and @St0rmz1. - **PR #93791** fix(memory): await search-sync before returning results to prevent stale index (fixes #52115). Thanks @liuhao1024 and @vincentkoc and @FicheallADa. - **PR #93780** fix(google): keep parallel Gemini tool responses in the turn after the model. Thanks @yetval and @vincentkoc. - **PR #93789** fix(agents): make lane suspension consistent across cooldown-precheck and embedded-runner paths. Related #93036. Thanks @joelnishanth and @vincentkoc and @kumaxs. - **PR #93798** fix(status): show 0 (not ?) for fresh-session context tokens. Related #93771. Thanks @Alix-007 and @vincentkoc and @anarchia-99. - **PR #93810** fix(cron): preserve startup overflow catch-up deferrals in start() maintenance pass. Thanks @yetval. - **PR #93811** Strip UTF-8 BOM when reading SKILL.md in quick_validate. Thanks @HrachShah. - **PR #93803** fix(ui): preserve WebChat visible messages across session switches. Related #80855. Thanks @LiuwqGit and @vincentkoc and @viagarsuker. - **PR #93792** fix(android): wait for node capability approval before onboarding. Thanks @Solvely-Colin and @vincentkoc. - **PR #93796** fix(feishu): paginate wiki node and space listing (#37626). Thanks @ZengWen-DT and @vincentkoc and @ritou11. - **PR #93797** fix(browser): use openTab return value to prevent wsUrl race in ensureTabAvailable (fixes #63343). Thanks @liuhao1024 and @vincentkoc and @OpenCodeEngineer. - **PR #93806** fix(reasoning-tags): strip MiniMax mm: tags on silent-reply and streaming paths missed by #93767. Thanks @Alix-007 and @vincentkoc. - **PR #93691** refactor: add gateway sessions.create lifecycle seam. Thanks @jalehman. - **PR #88748** fix(gemini): bridge OAuth profiles into CLI runtime. Related #88742. Thanks @jason-allen-oneal. - **PR #93857** fix(deps): remediate Dependabot alerts. Thanks @vincentkoc. - **PR #93874** fix(slack): recognize MiniMax mm: namespaced reasoning tags in monitor preview. Thanks @Alix-007. - **PR #93832** feat(providers): add ClawRouter managed proxy. Thanks @vincentkoc. - **PR #93880** fix(macos): preserve approvals migration data. Thanks @vincentkoc. - **PR #93903** fix(cron): reject invalid absolute timestamps. Thanks @Alix-007 and @vincentkoc. - **PR #93879** fix(update): use configured npm registry for update metadata. Related #79140. Thanks @vincentkoc and @sixerLiu. - **PR #93924** revert(providers): remove ClawRouter provider. Thanks @vincentkoc. - **PR #93955** fix(telegram): surface rich-message disabled state. Thanks @obviyus. - **PR #93881** fix(agents): route BTW through canonical Codex runtime. Related #88902. Thanks @vincentkoc and @TurboTheTurtle and @khalil-omer. - **PR #90192** fix(feishu): fetch quoted content before empty-message guard. Related #90177. Thanks @bladin and @sliverp and @lkxlaz. - **PR #93237** Fix Mattermost open DM validation. Thanks @amknight. - **PR #93945** feat(diagnostics): add SIEM security events. Thanks @vincentkoc. - **PR #87487** fix(cli): clarify mcp list registry scope. Related #65209. Thanks @Alix-007 and @slideshow-dingo. - **PR #24661** feat(cohere): add provider plugin. Thanks @vincentkoc. - **PR #93532** Expose verified ClawHub source in skill verify output. Thanks @momothemage. - **PR #93538** feat(codex): support app-server network proxy profiles. Thanks @vincentkoc. - **PR #93938** fix(telegram): guard UTF-16 surrogate pairs in outbound chunkers. Related #93921. Thanks @Nas01010101 and @vincentkoc. - **PR #94104** feat(agents): trace compaction summarization model calls. Thanks @amknight. - **PR #94108** Fix package Telegram temp root. Thanks @obviyus. - **PR #94113** Fix Telegram package output mount. Thanks @obviyus. - **PR #89062** feat(docker): support offline setup reruns. Related #70443. Thanks @Alix-007 and @safrano9999. - **PR #93929** fix(secrets): explicitly pass BWS_SERVER_URL to resolver for self-hosted instances. Related #93851. Thanks @Pandah97 and @vincentkoc and @AdoShan. - **PR #90057** Polish Workboard operations view. Thanks @fuller-stack-dev. - **PR #89396** fix(doctor): drop inert legacy cron notify when cron.webhook is unset. Related #44460. Thanks @Alix-007. - **PR #94138** fix(session): prevent stale finalizer from recreating deleted session rows. Related #40840. Thanks @xialonglee and @vincentkoc and @AL-knows. - **PR #93739** refactor: add session patch projection seam. Thanks @jalehman. - **PR #94178** fix(workspace): skip optional bootstrap files when workspace setup is already completed. Related #83593. Thanks @dwc1997 and @jsompis. - **PR #93363** fix(feishu): enforce account tool family gates. Thanks @eleqtrizit. - **PR #93813** fix(codex): keep message registered for internal turns. Related #93750. Thanks @jalehman and @hannesrudolph. - **PR #93659** refactor: add session reset delete lifecycle seam. Thanks @jalehman. - **PR #93852** ci(release): harden release controls. Thanks @vincentkoc. - **PR #94203** feat(codex): support remote app-server plugins. Thanks @kevinslin. - **PR #94263** chore: migrate claw-score skill. Thanks @RomneyDa and @kevinslin. - **PR #93695** refactor: add compact trim lifecycle seam. Thanks @jalehman. - **PR #93114** test: fold lifecycle and package proof into QA Lab. Thanks @RomneyDa. - **PR #93181** test: fold otel smoke into qa e2e. Thanks @RomneyDa. - **PR #93178** test: fold gateway smoke into qa e2e. Thanks @RomneyDa. - **PR #94276** qa-lab: support script-backed evidence scenarios. Thanks @Solvely-Colin and @RomneyDa. - **PR #94282** Support owner-qualified ClawHub skill installs. Thanks @Patrick-Erichsen. - **PR #93704** refactor: add session cleanup lifecycle seam. Thanks @jalehman. - **PR #94296** fix: require all taxonomy coverage ids for a feature - AND not OR. Thanks @RomneyDa. - **PR #92016** fix(plugins): compose live hook registry view for tool-call hooks. Related #91918. Thanks @amknight and @vokaplok. - **PR #89596** fix(policy): recognize declared tool allowlists. Thanks @giodl73-repo. - **PR #93713** fix: route deleted-agent session purge through lifecycle seam. Thanks @jalehman. - **PR #84172** fix(exec): rebuild command authorization on the Tree-sitter command planner. Thanks @jesse-merhi. - **PR #94332** docs: add ClawHub namespace claims to sidebar. Thanks @Patrick-Erichsen. - **PR #86360** fix(codex): honor bound agent exec host policy. Thanks @jesse-merhi. - **PR #73162** fix(slack): remove socket reconnect attempt cap so gateway stays connected indefinitely. Related #72808. Thanks @suboss87 and @tleyden. - **PR #94156** fix: expose OpenAI image quality and moderation CLI options. Thanks @lastguru-net and @fuller-stack-dev. - **PR #94350** feat: externalize GMI provider plugin. Thanks @Patrick-Erichsen and @vincentkoc. - **PR #94543** fix(gateway): bound config.get middleware results. Related #94265. Thanks @vincentkoc and @v-s-gusev. - **PR #91409** fix(update): run plugin convergence after RPC git updates. Thanks @masatohoshino. - **PR #94556** chore(extensions): bump tokenjuice to 0.8.1. Thanks @vincentkoc. - **PR #94580** fix(ci): stabilize update run gates. - **PR #94394** fix(infra): probe 127.0.0.1 in ensurePortAvailable to detect IPv4-only occupants. Related #94379. Thanks @Pandah97 and @wangwllu. - **PR #94421** fix(agents): preserve active compaction retries. Related #94391. Thanks @dexiosmb. - **PR #94428** fix(feishu): preserve replies before error finals. Related #94360. Thanks @xunx33. - **PR #93735** refactor: add restart recovery lifecycle seam. Thanks @jalehman. - **PR #94591** docs(release): backfill complete contribution records. Thanks @vincentkoc. - **PR #94588** fix(cron): retry isolated setup timeouts. Thanks @aaroneden. - **PR #94082** fix(cron): prevent lane timeout during long tool execution. Related #94033. Thanks @ajwan8998 and @JingWang-Star996. - **PR #94551** feat(firecrawl): add keyless scrape support. Thanks @vincentkoc and @developersdigest. - **PR #94619** test(ci): stabilize timeout-sensitive shards. Thanks @vincentkoc. - **PR #94048** fix(telegram): set richMessages default to false explicitly in schema. Related #93770, #93794. Thanks @Monkey-wusky and @obviyus and @Nardoa375 and @laurenceputra. - **PR #94118** [codex] Fix Telegram rich local Markdown link hrefs. Related #94117. Thanks @dankarization and @obviyus. - **PR #94646** refactor(sqlite): land database-first memory and proxy alignment. Thanks @vincentkoc. - **PR #94658** test(sqlite): use shared temp directory helper. Thanks @vincentkoc. - **PR #92135** fix(openai-embedding): preserve openai/ prefix for non-native base URLs. Related #92124. Thanks @xialonglee and @Kambrian. - **PR #93737** refactor: add session maintenance transaction seam. Thanks @jalehman. - **PR #93685** refactor(auto-reply): add lifecycle storage seams. Thanks @jalehman. - **PR #94349** fix(agents): preserve pending subagent completion announces. Related #93323. Thanks @sallyom and @oiGaDio. - **PR #93174** test: fold channel message flows into qa e2e. Thanks @RomneyDa. - **PR #94093** Prevent Codex thread rotation from losing next-step context. Thanks @VACInc. - **PR #53920** fix(scripts): avoid mutating tracked auth-monitor template during setup. Thanks @JackWuGlobal. - **PR #94702** Standardize QA coverage IDs on dotted names. Thanks @RomneyDa. - **PR #81825** fix(skills/1password): stop forcing tmux for desktop app auth (#52540). Thanks @koshaji and @tylerbittner. - **PR #94725** fix(doctor): warn on volatile SQLite state. Thanks @vincentkoc. - **PR #88551** fix(agents): skip auth gate for CLI-owned transport. Thanks @yu-xin-c. - **PR #88581** feat(commands): add /name to rename the current session from chat. Thanks @BSG2000. - **PR #94324** feat(codex): support app-server SecretRefs. Thanks @kevinlin-openai and @kevinslin. - **PR #90882** fix: add self-knowledge docs rule to system prompt. Related #90713. Thanks @SutraHsing. - **PR #94684** fix: #80507 show dry-run output for message send/poll. Thanks @lzyyzznl and @YB0y. - **PR #93823** fix(whatsapp): keep opening text chunk when first media fails on multi-chunk reply. Thanks @yetval. - **PR #89203** refactor: route SDK session compatibility through seam. Thanks @jalehman. - **PR #94453** fix: default cron runMode to "due" instead of "force" (#94270). Thanks @jincheng-xydt and @sallyom and @davectr. - **PR #94746** fix(note): prevent clack from re-breaking copy-sensitive tokens. Related #94730. Thanks @xzh-icenter and @berkgungor. - **PR #89904** refactor: route sdk session compatibility through accessor. Thanks @jalehman. - **PR #86719** fix(skills): retarget stale plugin skill symlinks. Related #85925. Thanks @stevenepalmer and @shakkernerd. - **PR #94337** fix(tui): show 0 not ? for fresh-session context tokens in footer. Thanks @mushuiyu886. - **PR #94539** fix(android): group settings by intent. Thanks @Tosko4. - **PR #92383** fix(gateway): never return an empty chat.history transcript. Thanks @Hidetsugu55. - **PR #92574** test(browser): cover action-input CLI request bodies. Related #83877. Thanks @yu-xin-c and @davinci282828. - **PR #92873** test(diffs): add viewerState, toolbar toggle, shadow root, and hydrateProps tests (fixes #83915). Thanks @liuhao1024 and @davinci282828. - **PR #94257** fix(sessions): preserve Media\* index alignment when reading user-turn fields. Thanks @Nas01010101. - **PR #94756** fix(codex): bound turn/start text when context budget is non-positive. Related #94748. Thanks @Nas01010101. - **PR #94729** fix(skills/trello): add curl to requires.bins to match body examples (fixes #94727). Thanks @liuhao1024 and @berkgungor. - **PR #94790** feat(slack): log INFO receipt for inbound app_mention events. Related #94691. Thanks @ZengWen-DT and @BryceMurray. - **PR #81696** fix: guard tool event callbacks (AI-assisted). Thanks @enjoylife1243. - **PR #94809** chore: forward-port alpha release fixes. - **PR #94612** fix(macos): open NSOpenPanel for embedded Control UI file inputs (#94468). Thanks @bbblending and @DINGDANGMAOUP. - **PR #89806** fix(feishu): avoid axios interceptor internals. Related #83913. Thanks @sweetcornna and @davinci282828. - **PR #91923** fix(ios): clean up notification settings state. Thanks @zats. - **PR #91345** fix: suggest close CLI commands. Related #83999. Thanks @glenn-agent and @HannesOberreiter. - **PR #94561** Add stdout diagnostics OTEL log exporter. Thanks @jesse-merhi. - **PR #91013** fix(gateway): ignore stale abort markers for fresh chat events. Related #91012. Thanks @nxmxbbd. - **PR #89279** fix(tasks): deliver ACP completions to bound Discord threads. Related #84022. Thanks @anyech and @h-mascot. - **PR #91656** test(cron): expand parseAbsoluteTimeMs test coverage to 39 cases. Related #91654. Thanks @SpecialLeon. - **PR #94810** fix(telegram): classify sendChatAction 401 by structured error_code, not bare substring match. Related #94787. Thanks @ZOOWH and @parveshsaini. - **PR #94737** fix(reply): clarify provider internal error copy. Thanks @snowzlmbot. - **PR #94868** fix(channels): preserve command progress detail. Thanks @vincentkoc. - **PR #94891** fix(telegram): send progress previews as html text. Thanks @obviyus. - **PR #94683** fix(outbound): keep direct-only targets out of group sessions. Related #92384. Thanks @scotthuang and @haiwei01. - **PR #92477** fix: migrate watch app to single-target app (Xcode 27+ compat). Thanks @zats and @joshavant. - **PR #94812** test(perf): compare saved CLI startup benchmarks. Thanks @FelixIsaac. - **PR #94856** fix(telegram): normalize all HTML tables before entity-escaping in rich messages. Related #94317. Thanks @zhangqueping and @jairrab. - **PR #91685** fix(cron): refuse keyless implicit isolated cron delivery inherited from shared agent-main bucket. Thanks @nxmxbbd. ## 2026.6.8 ### Highlights - **Richer channel delivery:** Telegram and WhatsApp are less brittle: Telegram renders structured text with tables, lists, expandable blockquotes, preserved intentional line breaks, and CLI-backed replies, while WhatsApp now honors configured ACP bindings. (#92679, #93164, #84082, #89421, #92513) Thanks @obviyus, @vincentkoc, @jzakirov, @spacegeologist, @TurboTheTurtle, @mcaxtr, @myrzka, and @dmorn. - **More reliable agent runs:** account-scoped DM sends, generated media completions, auto-reply message-tool final replies, reset archive fallback reads, restart shutdown aborts, yielded subagent pauses, and session identity prompts all stay on the correct recovery path. (#92788, #91246, #92879, #91357, #92631, #92468) Thanks @yetval, @TurboTheTurtle, @masatohoshino, @CadanHu, @vincentkoc, @ooiuuii, @openperf, @zhangguiping-xydt, @QQSHI13, @kumaxs, and @aleps001. - **Safer model routing:** new GLM-5.2 and Claude Haiku 4.5 catalog support arrives with normalized provider IDs, managed SecretRef auth, bounded model browsing, and safer OpenAI/Anthropic tool-schema recovery. (#92796, #90116, #92627, #90686, #92247, #92941) Thanks @arkyu2077, @liuhao1024, @lijenhsin, @rohitjavvadi, @samson910022, @maaron34, @syfvb, and @samson1357924. - **Useful usage footers:** `/usage` and reply payload hooks now have a native full footer renderer, default template, fixed-decimal formatting, credential-aware limits, better partial-count handling, and warnings for broken templates instead of silent bad output. (#92657, #89835, #89629) Thanks @Marvinthebored. - **Predictable web search defaults:** key-free providers such as Parallel Free, DuckDuckGo, Ollama, and Codex Hosted Search remain explicit opt-ins rather than surprising automatic fallbacks. (#93616) Thanks @davemorin and @vincentkoc. - **Calmer UI and mobile sessions:** workspace files start collapsed, WebChat backscroll survives streaming, the desktop session picker remains interactive, reset arguments survive dispatch, and iOS reconnects stale foreground Gateways. (#92779, #92622, #92705, #91353, #92552) Thanks @shakkernerd, @TurboTheTurtle, @NianJiuZst, @zhouhe-xydt, @Solvely-Colin, @MaBeitian, @vincentkoc, @Chang2020618, and @DrtyMorty. - **Resilient memory and state:** oversized OpenAI embedding batches split before 431s, QMD search stays available in transient mode, SQLite avoids WAL on NFS volumes, and full reindexes preserve rollback/cache recovery. (#92650, #92618, #92639, #91247, #92881) Thanks @mushuiyu886, @BrettHamlin, @zhbcher, @TurboTheTurtle, @Takhoffman, @849261680, @TSHOGX, @vincentkoc, and @AFabyTWE. ### Changes - Providers/models: add GLM-5.2 support and Claude Haiku 4.5 catalog entries while keeping provider-qualified model IDs normalized across OpenRouter and Google Vertex paths. (#92796, #90116, #92627, #91218) Thanks @arkyu2077, @liuhao1024, @bymle, @maaron34, @lijenhsin, @davemorin, and @vincentkoc. - Web search: keep key-free providers such as Parallel Free, DuckDuckGo, Ollama, and Codex Hosted Search as explicit opt-ins instead of selecting them automatically when no API-backed provider is configured. (#93616) Thanks @davemorin and @vincentkoc. - Channel plugins: ship Telegram rich-message delivery and WhatsApp ACP binding support, including preserved intentional line breaks, rich prompt handoff to CLI backends, and transport fixtures for richer drafts. (#92679, #93164, #92513) Thanks @obviyus, @TurboTheTurtle, @vincentkoc, @mcaxtr, and @dmorn. - Agent commands: support `/btw` in CLI-backed sessions and keep CLI usage-error exits classified as usage failures instead of successful runs. (#92669, #92162) Thanks @joshavant, @Pandah97, @marcospaulo, @davemorin, and @vincentkoc. - Usage hooks: add built-in full footer rendering, default footer templates, per-turn usage state, credential-aware limits, and fixed-decimal formatting for usage-bar templates. (#92657, #89835, #89629) Thanks @Marvinthebored. ### Fixes - Channels and delivery: preserve account-scoped DM channel send policy, intentional rich-message line breaks in Telegram and status output, rich Telegram final replies, rich Telegram tables and lists, Telegram thread-create CLI remapping, Feishu dynamic-agent routes after persisted binding reuse, Slack outbound `message_sent` hooks, contributed message-tool schema optionality, same-channel generated media completions, and channel chunking around surrogate pairs and Infinity limits. (#92788, #93164, #92679, #89421, #89943, #42837, #92814, #91137, #91246, #92735) Thanks @yetval, @obviyus, @spacegeologist, @rishitamrakar, @liuhao1024, @lundog, @TurboTheTurtle, @yhterrance, @vincentkoc, @myrzka, @cwlong163-afk, @kumaxs, @shakkernerd, and @RewardsPal. - Gemini CLI: use the selected OpenClaw OAuth/API-key auth profile in an isolated Gemini CLI runtime home, preventing ambient Google machine credentials from overriding the chosen profile. (#88748) Thanks @jason-allen-oneal and @shakkernerd. - Feishu: fetch quoted/replied message content before the empty-message guard so a mention-only reply that quotes a message with meaningful content is no longer dropped. (#90192) Thanks @bladin. - Discord: give generated auto-thread titles a 60-second timeout and 4,096-token reasoning-model output budget, clamped to the selected model output cap. (#64734) Thanks @hanamizuki. - Agent, cron, and Gateway runtime: mark active main sessions before restart shutdown aborts, pause yielded subagent runs whose terminal also signals abort, clamp trusted subagent thinking overrides through provider/model fallback, preserve yielded media completions, deliver channel message-tool final replies through auto-reply while hiding internal delivery hints, restore reset archive fallback reads when active async transcripts are missing, de-duplicate main-session heartbeat events, expose session identity in runtime prompts, reject unknown OpenAI agent selectors, keep generated media completions, slash-command block replies, and trajectory export commands in WebChat, and require admin privileges for HTTP session/model override surfaces. (#91357, #92631, #92412, #92146, #92879, #91287, #92468, #92510, #91246, #92651, #92646) Thanks @ooiuuii, @openperf, @IWhatsskill, @masatohoshino, @CadanHu, @ZengWen-DT, @zhangguiping-xydt, @TurboTheTurtle, @oiGaDio, @aleps001, @vincentkoc, @GSL-R, @QQSHI13, @ryanhelms, @kumaxs, @steipete-oai, @hxy91819, @davemorin, and @nailujac. - Providers and model replay: preserve storeless OpenAI Responses replay compatibility, recover invalid OpenAI reasoning signatures and genericized Anthropic thinking-signature replay errors, route OAuth image defaults through Codex for eligible OpenAI profiles, avoid eager tool streaming for Claude 4.5 in Copilot, quarantine unreadable and post-hook OpenAI/Anthropic-family tool schemas without broadening allowed tool choices, deliver explicit thinking-off requests to LM Studio binary-thinking models, honor profile auth for SecretRef model entries, bound model browsing, strip provider prefixes where runtimes need bare IDs, and surface nested embedding fetch failures. (#90706, #92941, #92201, #92916, #92824, #75393, #92908, #92921, #92928, #92002, #90686, #92247, #92627, #91218, #92628) Thanks @snowzlm, @mmyzwl, @CarlCapital, @bek91, @Kailigithub, @vincentkoc, @rohitjavvadi, @samson910022, @nxmxbbd, @liuhao1024, @bymle, @mushuiyu886, @finchinslc, @syfvb, @lijenhsin, @crsnpalmer-art, @samson1357924, @shakkernerd, and @mlaihk. - Memory, state, diagnostics, and config: split header-too-large embedding batches, keep QMD memory search enabled in transient mode, avoid SQLite WAL on NFS volumes, preserve recovery scheduling outside stuck-session warning backoff, preserve full-reindex rollback/cache recovery, and treat raw Memory Wiki source pages as source evidence. (#92650, #92618, #92639, #91247, #92752, #92881, #59137, #92876) Thanks @mushuiyu886, @TurboTheTurtle, @849261680, @gnanam1990, @TSHOGX, @vincentkoc, @arlen8411, @BrettHamlin, @zhbcher, @Takhoffman, @AFabyTWE, @davemorin, and @zhuyankarl. - UI/mobile/TUI: preserve dashboard session parent lineage, WebChat backscroll, reset soft command args, sidebar session picker interactivity, collapsed workspace files, resolved `/model` confirmation refs, stale foreground iOS Gateway reconnects, and paused setup-parent stdin after inherited-stdio child exit. (#90658, #92622, #91353, #92705, #92779, #92773, #92552, #93159) Thanks @luoyanglang, @TurboTheTurtle, @zhouhe-xydt, @NianJiuZst, @shakkernerd, @NarahariRaghava, @Solvely-Colin, @fuller-stack-dev, @lily-oc, @MaBeitian, @vincentkoc, @obviyus, @DrtyMorty, and @Chang2020618. - Plugins and updates: repair missing required platform packages during managed plugin installs and updates, including omitted Codex platform binaries. Thanks @vincentkoc. - Dependencies: update Hono to 4.12.25 so published OpenClaw and ACPX packages use the patched runtime. Thanks @vincentkoc. - Updates: avoid a false downgrade prompt when the latest tag cannot resolve. (#92911) Thanks @Andy312432 and @vincentkoc. ### Complete contribution record This audited record covers the complete v2026.6.6..v2026.6.8 history: 192 merged PRs. The generation manifest also supplies direct commits as editorial input; the grouped notes above prioritize user impact. #### Pull requests - **PR #92144** fix(cron): report SQLite storage path in cron.status instead of legacy jobs.json. Related #91766. Thanks @liuhao1024 and @AaronFaby. - **PR #92175** fix(channel): harden local setup trust. Thanks @hxy91819. - **PR #91528** fix #73837: stop after failed Node package installs. Thanks @mushuiyu886 and @ItsMeForLua. - **PR #91561** fix(wizard): report keyless web_search providers as ready, not missing a key. Thanks @NormallyGaussian. - **PR #92073** fix: handle explicit silent assistant replies. Related #92038. Thanks @sallyom and @vultusv. - **PR #91311** Allow Skill Workshop apply through trusted skill symlinks. Thanks @abnershang. - **PR #88245** refactor(whatsapp): introduce inbound message contexts. Thanks @mcaxtr. - **PR #92212** refactor: move workspace skill writes to lifecycle. Thanks @shakkernerd. - **PR #92248** Remove ClawHub owner preflight. Thanks @Patrick-Erichsen. - **PR #91617** test(sqlite): add state perf query plan harness. Related #91616. Thanks @galiniliev. - **PR #91626** fix(daemon): keep status readable on unsupported services. Related #25621. Thanks @mushuiyu886 and @kucharskim. - **PR #92295** fix(cron): preserve tz and staggerMs when --cron replaces expression. Related #92291. Thanks @liuhao1024 and @dcapclaw. - **PR #92087** fix(docker): bundle QA Lab runtime in the image. Thanks @jesse-merhi. - **PR #92004** fix(telegram): classify streaming preview edit failures instead of killing the draft. Thanks @obviyus. - **PR #91997** fix(telegram): survive getUpdates conflicts in isolated polling ingress. Thanks @obviyus. - **PR #92387** fix(anthropic-vertex): stop re-marking cache_control on transport-budgeted payloads. Related #91982. Thanks @openperf and @Takhoffman and @danieljimz. - **PR #92229** Fix doctor preview channel SecretRef resolution. Related #91939. Thanks @joshavant and @Niriakot. - **PR #92225** Fix disabled heartbeat one-shot cron retries. Related #91775. Thanks @joshavant and @A1fred-AI. - **PR #92265** Fix configured DeepSeek model transport inheritance. Related #92148. Thanks @joshavant and @marcoraepple-sys. - **PR #92226** Fail closed for CLI-backed /btw fallback. Related #92168. Thanks @joshavant and @wangwllu. - **PR #92231** Fix suppressed heartbeat commitment delivery. Related #91948. Thanks @joshavant and @bizzle12368239. - **PR #92280** fix(agents): classify structured unsupported model errors. Related #92118. Thanks @joshavant and @pikaqqqqqq. - **PR #92276** Fix OTLP log trace correlation. Related #91865. Thanks @joshavant and @sinzin91. - **PR #92282** fix(update): hand off Linux service auto-updates. Related #91823. Thanks @joshavant and @hanyizuo. - **PR #92235** fix: resolve managed SecretRef provider auth. Related #92097. Thanks @joshavant and @LINSUISHENG034. - **PR #92293** Fix provider static model fallback resolution. Related #92009. Thanks @joshavant and @mattsfraser. - **PR #92343** fix(agent): continue after source message tool replies. Related #92169. Thanks @joshavant and @elyalvarado. - **PR #92350** fix(codex): preserve memory prompt registration. Thanks @rubencu and @sallyom. - **PR #92290** fix: clarify gateway SecretRef auth diagnostics. Related #91815. Thanks @joshavant and @mattsfraser. - **PR #92286** fix: repair rejected Anthropic thinking replay. Related #91983. Thanks @joshavant and @reginaldomarcilon. - **PR #92281** Fix Telegram spooled buffered replay. Related #92129. Thanks @joshavant and @riseandshinefutures. - **PR #47493** fix(doctor): show per-step progress spinners during update. Thanks @amersheeny. - **PR #92416** fix(outbound): honor top-level image param as send media source (#92407). Thanks @xydigit-sj and @ichirokyoto. - **PR #92508** fix(sandbox): render CLI skill prompts from materialized paths. Thanks @brokemac79. - **PR #92540** chore: fix esbuild production audit failure. Thanks @RomneyDa. - **PR #91484** Add QA evidence artifact output. Thanks @RomneyDa. - **PR #91500** Add QA scorecard taxonomy validation. Thanks @RomneyDa. - **PR #84082** fix(telegram): allow expandable blockquotes. Thanks @jzakirov. - **PR #92554** feat(moonshot): add Kimi K2.7 Code support. - **PR #92396** fix(moonshot): backfill reasoning_content on assistant tool-call replay messages. Related #71491. Thanks @xialonglee and @RoseKongPS. - **PR #92566** Fix lifecycle timeout cleanup after leader exit. Thanks @RomneyDa. - **PR #92311** ci: split plugin ClawHub publishing paths. Thanks @Patrick-Erichsen. - **PR #92216** fix(gateway): mirror hidden commentary-phase assistant events. Thanks @ragesaq. - **PR #87596** fix(moonshot): rewrite duplicate native Kimi tool_call ids on replay. Related #51593. Thanks @Pluviobyte and @Faaab84. - **PR #88993** Expose paged channel action results. Thanks @fuller-stack-dev. - **PR #90326** fix(fireworks): resolve catalog model params from plugin.json via core. Thanks @obuchowski. - **PR #86629** fix(doctor): warn for untrusted external Discord plugin. Related #83212. Thanks @brokemac79 and @ooiuuii and @cdeyoung67. - **PR #90242** fix(providers): skip unreadable Mistral tool schemas. Thanks @vincentkoc. - **PR #92498** fix(reply): mirror same-channel Slack final replies. Related #92489. Thanks @TurboTheTurtle and @TalkingHeadsJed. - **PR #92083** fix(channels): default boundary logger for swallowed progress-draft start errors. Thanks @hansraj316. - **PR #92564** fix(agents): isolate invalid plugin model catalogs [AI-assisted]. Related #92553. Thanks @tangtaizong666 and @fxstein. - **PR #89827** docs: UX-013 — design system documentation. Thanks @BunsDev. - **PR #89615** feat(ui): hide empty workboard columns. Thanks @BunsDev. - **PR #89822** fix(a11y): B-1+B-2+B-3 — contrast, focus states, minimum font sizes. Thanks @BunsDev. - **PR #92618** fix #92218: memory_search tool disabled with QMD backend. Thanks @mushuiyu886 and @zhbcher. - **PR #92608** docs(gateway): add uptime monitoring guidance to health check docs (fixes #55768). Thanks @liuhao1024 and @faahim. - **PR #92605** fix(docs): pin Windows Hub download links to v2026.6.5. Related #92470. Thanks @lzyyzznl and @arjkul. - **PR #92593** #92589: fix(internal-runtime-context): wrap prompt-preface runtime context body in delimiters. Thanks @zhangqueping and @jovi2014-cyber. - **PR #92606** Run Vitest and Playwright scenarios from qa suite. Thanks @RomneyDa. - **PR #89629** feat(hooks): per-turn usageState on reply_payload_sending. Thanks @Marvinthebored. - **PR #89835** feat(usage): native templated /usage full footer renderer. Thanks @Marvinthebored. - **PR #92247** fix(models): bound /models and models list catalog loading. Related #91809. Thanks @samson910022 and @samson1357924 and @syfvb. - **PR #92646** fix: require admin for HTTP model overrides. Thanks @steipete-oai. - **PR #90686** fix(gateway): honor profile auth for SecretRef model entries. Related #90685. Thanks @rohitjavvadi. - **PR #92651** fix: require admin for HTTP session kills. Thanks @steipete-oai. - **PR #92652** test(models): stabilize plugin auth marker fixtures. - **PR #89438** fix(slack): warn when channels map is keyed by name instead of channel ID. Related #81665. Thanks @Alix-007 and @cjalden. - **PR #92631** fix(agents): pause yielded subagent runs whose terminal also signals abort. Related #92448. Thanks @openperf and @vincentkoc and @aleps001. - **PR #92622** fix(ui): preserve WebChat backscroll during streaming. Related #92386. Thanks @TurboTheTurtle and @vincentkoc and @DrtyMorty. - **PR #92627** fix(openrouter): strip openrouter/ prefix from model ID in normalizeResolvedModel hook (fixes #92611). Thanks @liuhao1024 and @lijenhsin. - **PR #92146** fix(cron): preserve yielded media completions. Related #92120. Thanks @IWhatsskill and @nailujac. - **PR #90116** fix: add Claude Haiku 4.5 static catalog entries. Related #90088. Thanks @arkyu2077 and @maaron34. - **PR #91137** fix(channels): keep contributed message-tool schema properties optional. Related #67852. Thanks @lundog and @RewardsPal. - **PR #75393** fix(copilot): disable eager tool streaming for Claude 4.5. Related #75348. Thanks @Kailigithub and @finchinslc. - **PR #92628** fix #73713: surface nested embedding fetch failures. Thanks @mushuiyu886 and @crsnpalmer-art. - **PR #92510** fix(gateway): reject unknown OpenAI agent selectors. Related #92504. Thanks @zhangguiping-xydt and @ryanhelms. - **PR #91453** fix #91420: [Bug]: Delivery retry loop corrupts active sessions (R-004) — retry selector bypasses delivery.mode=none. Thanks @zhangguiping-xydt and @CarotaWealth. - **PR #92468** fix #92453: add session identity to runtime prompt. Thanks @zhangguiping-xydt and @QQSHI13. - **PR #89943** fix(slack): emit message_sent hook on outbound delivery (mirror Telegram). Related #89942. Thanks @rishitamrakar. - **PR #92668** fix(docs): finalize i18n postprocess before skip. Thanks @hxy91819. - **PR #92673** fix: split image setup and request timeout semantics. Thanks @hxy91819. - **PR #92162** #92069: fix(cli): usage errors exit 0. Thanks @Pandah97 and @marcospaulo. - **PR #91185** fix(browser): remove dead requireRef import and void expression in register.navigation.ts. Related #83878. Thanks @whiteyzy and @davinci282828. - **PR #90706** fix(OpenAI Responses): disable item id replay for storeless providers. Related #89728. Thanks @snowzlm. - **PR #90247** fix(disk-space): promote 1024 MiB to 1.0 GiB in disk warnings. Related #90245. Thanks @jbetala7. - **PR #92657** feat(usage): ship built-in /usage full footer. Thanks @Marvinthebored. - **PR #90464** perf(terminal): reuse ANSI scanner during truncation. Thanks @yyzquwu. - **PR #91281** fix(feishu): clear client cache when SDK is replaced via setFeishuClientRuntimeForTest. Related #83911. Thanks @whiteyzy and @davinci282828. - **PR #92639** fix(memory): keep memory_search in transient qmd mode. Related #92464. Thanks @TurboTheTurtle and @Takhoffman and @BrettHamlin. - **PR #91287** fix(cron): de-duplicate main-session systemEvent in heartbeat model input. Related #44922. Thanks @ZengWen-DT and @GSL-R. - **PR #91246** Fix webchat media completion handoff. Related #91003. Thanks @TurboTheTurtle and @kumaxs. - **PR #91353** fix(ui): preserve /reset soft args in Control UI dispatch. Related #91316. Thanks @zhouhe-xydt and @MaBeitian. - **PR #92679** feat(telegram): send rich message text. Thanks @obviyus. - **PR #92705** fix(ui): restore sidebar session picker interactivity above desktop workbench. Related #92707. Thanks @NianJiuZst and @vincentkoc. - **PR #91218** fix(google): strip provider prefix from Vertex model path. Thanks @bymle. - **PR #92669** feat: support /btw in CLI-backed sessions. Thanks @joshavant. - **PR #91357** fix(gateway): mark active main sessions before restart shutdown aborts. Related #91355. Thanks @ooiuuii. - **PR #91066** fix(parallel): send openclaw-parallel User-Agent on free Search MCP requests. Thanks @NormallyGaussian. - **PR #90658** fix(ui): preserve dashboard session parent lineage when session list is stale. Related #90623. Thanks @luoyanglang and @lily-oc. - **PR #92552** fix(ios): force stale foreground gateway reconnects. Thanks @Solvely-Colin. - **PR #89421** fix(telegram): expose thread create CLI remap. Related #81581. Thanks @spacegeologist and @myrzka. - **PR #92779** fix: start workspace files collapsed. Related #90359. Thanks @shakkernerd and @Chang2020618. - **PR #91247** fix(state): avoid sqlite wal on nfs state volumes. Related #90491. Thanks @849261680 and @AFabyTWE. - **PR #92773** fix(tui): show resolved canonical model ref in /model confirmation. Thanks @NarahariRaghava. - **PR #92752** fix(diagnostics): keep recovery scheduling out of the stuck-session warning backoff. Related #92742. Thanks @gnanam1990 and @Takhoffman and @zhuyankarl. - **PR #92735** fix(markdown-core): treat Infinity chunk limit as unbounded, not 1. Related #92734. Thanks @yhterrance. - **PR #92695** docs(config): correct maxConcurrent default in agent-defaults type comments (AI-assisted). Thanks @ArielSmoliar. - **PR #92766** clarify before_install hook scope. Related #91593. Thanks @sallyom and @Trump-last. - **PR #92677** docs(nodes): add openclaw.json config example to Nodes overview. Related #92662. Thanks @liuhao1024 and @Casper-Mars. - **PR #92513** Honor WhatsApp configured ACP bindings. Related #92449. Thanks @TurboTheTurtle and @mcaxtr and @dmorn. - **PR #92650** fix #92465: split OpenAI 431 embedding batches. Thanks @mushuiyu886 and @BrettHamlin. - **PR #92796** feat(providers): add GLM-5.2 support. - **PR #92788** fix(sessions): derive channel from account-scoped DM session keys in send-policy. Thanks @yetval. - **PR #92590** Docker image ships an extraneous stale openclaw in /app/node_modules (extensions pin the published release). Related #92551. Thanks @lzyyzznl and @fxstein. - **PR #92393** chore(deps): bump the swift-deps group across 1 directory with 3 updates. - **PR #92476** fix(agents): preserve compatible CLI session runtime pins. Thanks @yu-xin-c. - **PR #92483** fix(matrix): validate CLI numeric option ranges. Related #92482. Thanks @rohitjavvadi. - **PR #92490** fix(canvas): validate CLI numeric options. Related #92487. Thanks @rohitjavvadi. - **PR #92802** fix(ui): reflow composer beside workspace rail. Thanks @Solvely-Colin and @shakkernerd. - **PR #91059** fix(configure): mask gateway token input in CLI wizard prompt. Thanks @anurag-bg-neu. - **PR #91143** fix(ports): only classify SSH -L/-R tunnels on the queried port as ssh. Related #91142. Thanks @jbetala7. - **PR #91110** fix(tavily): keep web_search contract executable. Related #91096. Thanks @extrasmall0 and @xucongyuan98-sys. - **PR #91181** fix(daemon): strip schtasks backslash prefix when matching gateway task name. Related #90494. Thanks @425072024 and @Darnellicious. - **PR #91187** fix(cron): isolate auth profile failure policy so cron runs don't pollute shared cooldowns. Related #90991. Thanks @openperf and @cx306806112. - **PR #92807** fix(heartbeat): route outbound mirror to isolated session key. Thanks @agent-merkava. - **PR #92745** fix(memory): explain skipped short-term recall hits. Related #92706. Thanks @mushuiyu886 and @armarinho. - **PR #92488** fix(gateway): forward image-only input on /v1/responses (parity with chat completions). Thanks @s554097550 and @cursoragent. - **PR #92604** fix(status): avoid cumulative usage for context percent. Related #83526. Thanks @ashishpatel26 and @darconadalabarga. - **PR #92810** fix: reject unvalidated voice media streams. Thanks @steipete-oai. - **PR #92800** fix(telegram): answer callback queries before sequentialize delays them. Related #42156. Thanks @liuhao1024 and @Diaspar4u. - **PR #92547** fix(nodes): surface pending reapproval diagnostics. Thanks @fuller-stack-dev. - **PR #92690** fix(doctor): avoid false-positive legacy cron store warning when store was already migrated (fixes #92683). Thanks @liuhao1024 and @motteman. - **PR #92806** fix(telegram): skip IPv4 fallback when user explicitly configures non-ipv4first dnsResultOrder (fixes #41671). Thanks @liuhao1024 and @vincentkoc and @leandroirani933-ctrl. - **PR #92778** fix(macos): defer isOverflowing mutation to break SwiftUI render loop (fixes #43480). Thanks @liuhao1024 and @vincentkoc and @gdiab. - **PR #92795** fix(gateway): use resolveNonNegativeNumber for totalTokens to display 0 instead of ? (fixes #43009). Thanks @liuhao1024 and @vincentkoc and @ltxy12138-ai. - **PR #92746** fix(gateway): preserve active runs during plugin finalization. Thanks @scotthuang and @vincentkoc. - **PR #92820** UI: localize Logs tab labels. Thanks @rubensfox20. - **PR #92825** fix(telegram): preserve command callbacks while prefixing generic callback data. Related #54909. Thanks @hnshah and @timt80. - **PR #90889** fix: cap session context overrides by model window. Related #39857. Thanks @xdanger. - **PR #92830** fix(copilot): strip replayed thinking blocks. Related #81520. Thanks @giodl73-repo and @warcold. - **PR #92834** feat(browser): extend --labels overlay to full-page and element captures. Thanks @hxy91819 and @FMLS and @cursoragent. - **PR #92836** fix(discord): raise thread title timeout and tokens to fit reasoning models. Thanks @hanamizuki. - **PR #92095** fix #92039: [Bug]: WhatsApp login reports success before auth is durably persisted, so Docker rebuilds/upgrades can force relink. Thanks @zhangguiping-xydt and @dinorastoder. - **PR #92801** fix(stale): exempt ClawSweeper actionable labels from stale lifecycle (fixes #89564). Thanks @liuhao1024 and @brokemac79. - **PR #89736** fix(status): render sub-1000 token counts as plain integers. Related #89735. Thanks @jbetala7 and @vincentkoc. - **PR #92792** fix(agents): catch malformed image blocks in sanitizeContentBlocksImages. Thanks @LowCode191 and @vincentkoc. - **PR #92555** ci: gate stable releases on Windows companion assets. Thanks @fuller-stack-dev. - **PR #91824** fix(agents): add usage guidance to sessions_spawn tool description (fixes #91814). Thanks @zenglingbiao and @vincentkoc and @cattails-lgao. - **PR #92840** fix(feishu): await HTTP server shutdown during monitor cleanup. Related #48183. Thanks @alex-xuweilong and @ai-nurmamat. - **PR #91632** feat: add tool search directory mode. Thanks @fuller-stack-dev. - **PR #92823** fix(qqbot): surface failed media sends. Thanks @zhangguiping-xydt and @vincentkoc. - **PR #92849** fix(tailscale): preserve parse errors for malformed JSON. Thanks @franciscomaestre. - **PR #92045** Fix diagnostics OTEL runtime install trust. Thanks @efpiva. - **PR #92853** fix(acp): accept MCP date protocolVersion in ACP server. Related #56102. Thanks @bugkill3r and @moliveto. - **PR #92854** fix(hooks): reject slug-generator error payloads. Thanks @Cypherm. - **PR #92855** fix(ui): repair iOS Safari chat viewport handling. Thanks @macdao. - **PR #91586** fix(update): continue after package doctor warnings. Thanks @fuller-stack-dev. - **PR #92862** fix(feishu): target typing reaction on inbound message. Thanks @huiwen01. - **PR #92861** fix(lobster): surface workflow path errors. Related #68101. Thanks @vvitovec and @MPC7500. - **PR #69975** fix(cli): clarify --tz help text for offset-less --at values. Related #59456. Thanks @rrrrrredy. - **PR #90682** fix(openai): preserve opaque reasoning transcript fields. Related #90093. Thanks @toruvieI and @richardmqq. - **PR #92373** fix(anthropic): strip thinking blocks from history when thinking is disabled (fixes #92360). Thanks @liuhao1024 and @notnaji. - **PR #87346** fix(anthropic): merge consecutive assistant turns in turn validation. Related #87329. Thanks @Jefsky and @travellingsoldier85. - **PR #92896** fix(anthropic): quarantine invalid direct tool schemas. Thanks @vincentkoc. - **PR #90739** fix(active-memory): preserve verbose recall summaries. Related #90454. Thanks @brokemac79 and @nocode-ananas. - **PR #92558** Simplify QA scorecard mapping shape. Thanks @RomneyDa. - **PR #92876** fix(memory-wiki): stop flagging raw source pages as malformed. Thanks @vincentkoc. - **PR #92908** fix(providers): quarantine unreadable Anthropic payload tools. Thanks @vincentkoc. - **PR #92881** fix(memory): preserve reindex rollback recovery. Thanks @TSHOGX and @vincentkoc. - **PR #92921** fix(openai): quarantine unreadable tool schemas. Thanks @vincentkoc. - **PR #92550** Fold Telegram RTT sampling into live QA evidence. Thanks @RomneyDa. - **PR #92824** fix(media): route OAuth image defaults through Codex. Related #87168. Thanks @bek91. - **PR #92928** fix(openai): guard post-hook tool payloads. Thanks @vincentkoc. - **PR #92814** fix(feishu): re-resolve route when dynamic agent binding already exists in runtime config (fixes #42837). Thanks @liuhao1024 and @vincentkoc and @cwlong163-afk. - **PR #89055** fix: restart gateway after isolated cron setup timeout. Thanks @ghitafilali. - **PR #90574** fix(openai): omit gpt-5.5 tool reasoning effort. Thanks @BSG2000. - **PR #92941** fix(openai): recover invalid reasoning signatures. - **PR #92914** fix(agents): clamp unsupported thinking for subagent spawns instead of hard-failing. Related #92412. Thanks @openperf and @oiGaDio. - **PR #92573** fix: preserve config-selected subagent model overrides. Related #92486. Thanks @arkyu2077 and @PatrickTrent. - **PR #92852** fix(gateway): fall back to polling when config watcher exhausts inotify retries. Related #92851. Thanks @danbao. - **PR #92362** fix(gateway): build row metadata context for single session lists. Thanks @anyech. - **PR #92897** fix(memory-wiki): tolerate public artifacts without agent ids. Related #92207. Thanks @yu-xin-c and @qq230849622-a11y. - **PR #92002** fix(lmstudio): deliver thinking "off" to binary-thinking models. Related #91913. Thanks @nxmxbbd and @mlaihk. - **PR #92738** Forward suppressed-source progress for message-tool channel replies. Thanks @ragesaq. - **PR #92916** #92201: Embedded runner: freshly streamed thinking signatures intermittently invalid on replay (Anthropic); recovery wrapper never fires because error text is genericized. Thanks @mmyzwl and @CarlCapital. - **PR #90936** fix(agents): do not misclassify client-disconnect abort as run timeout. Related #90764. Thanks @openperf and @reginaldomarcilon. - **PR #93009** fix(agents): make wrapToolWithBeforeToolCallHook idempotent to prevent double hook execution (fixes #92973). Thanks @zenglingbiao and @dertbv. - **PR #92318** fix(cron): require explicit message target proof. Thanks @hxy91819. - **PR #93022** fix(gateway): repair usage cost aggregation across agents. Thanks @luke-skywalker-open-claw and @stablegenius49. - **PR #93159** fix(tui): keep parent stdin paused after exit. Thanks @fuller-stack-dev. - **PR #93616** Keep key-free web search providers opt-in. Thanks @davemorin and @vincentkoc. - **PR #93164** fix(telegram): preserve rich markdown line breaks. Thanks @vincentkoc. ## 2026.6.7 ### Highlights - **Durable channel replies:** Telegram polling and preview failures recover instead of ending a stream, Slack keeps delivered replies in the transcript, and top-level image sends retain their intended media source. (#92281, #92498, #92416) Thanks @joshavant, @TurboTheTurtle, @xydigit-sj, @ichirokyoto, @TalkingHeadsJed, and @riseandshinefutures. - **More dependable provider sessions:** SecretRef-backed profiles, configured DeepSeek transports, static model fallback, Anthropic thinking replay, and Codex prompt memory all recover cleanly instead of leaving a turn unusable. (#92265, #92235, #92293, #92286, #92350) Thanks @joshavant, @rubencu, @sallyom, @marcoraepple-sys, @LINSUISHENG034, @mattsfraser, and @reginaldomarcilon. - **Kimi K2.7 Code support:** the provider catalog now includes the new Kimi coding model, with replay handling that preserves its reasoning content across tool turns. (#92554, #92396) Thanks @xialonglee and @RoseKongPS. - **Safer operations:** SQLite-backed cron status, disabled heartbeat retries, Linux service updates, and external-plugin diagnosis now expose clearer, actionable state to operators. (#92144, #92225, #92282, #86629) Thanks @liuhao1024, @joshavant, @brokemac79, @AaronFaby, @cdeyoung67, @ooiuuii, @shakkernerd, @A1fred-AI, and @hanyizuo. - **Guarded skill installs:** Skill Workshop support-file targets now go through trusted lifecycle writes instead of unbounded filesystem updates, while ClawHub package checks stay on the current release path. (#91311) Thanks @abnershang. ### Changes - Skills and plugin workflows now permit trusted Skill Workshop support-file targets only through guarded lifecycle writes, and package publishing uses the current ClawHub plugin checks. (#91311) Thanks @abnershang and @vincentkoc. - Providers: add Kimi K2.7 Code support. (#92554) ### Fixes - Channels and delivery: recover Telegram preview and polling failures, retain Slack final replies in transcripts, preserve top-level outbound image parameters, and make channel-action result pages available to callers. (#92281, #92498, #92407, #88993) Thanks @joshavant, @TurboTheTurtle, @xydigit-sj, @fuller-stack-dev, @TalkingHeadsJed, and @riseandshinefutures. - Agent/provider reliability: preserve configured model transport/auth resolution, fail closed for unsupported CLI-backed `/btw` fallback, continue after source message-tool replies, repair Anthropic thinking replay, and keep Codex memory prompts registered. (#92265, #92226, #92343, #92286, #92350) Thanks @joshavant, @rubencu, @sallyom, @marcoraepple-sys, @wangwllu, @elyalvarado, and @reginaldomarcilon. - Operations: make cron and daemon status resilient, preserve disabled heartbeat one-shot retries, hand off Linux service auto-updates, and keep lifecycle timeout cleanup alive after leader exit. (#92144, #92225, #92282, #92566) Thanks @liuhao1024, @joshavant, @RomneyDa, @AaronFaby, @A1fred-AI, and @hanyizuo. ### Complete contribution record This audited record covers the complete v2026.6.6..v2026.6.7-beta.1 history: 59 merged PRs. The generation manifest also supplies direct commits as editorial input; the grouped notes above prioritize user impact. #### Pull requests - **PR #92144** fix(cron): report SQLite storage path in cron.status instead of legacy jobs.json. Related #91766. Thanks @liuhao1024 and @AaronFaby. - **PR #92175** fix(channel): harden local setup trust. Thanks @hxy91819. - **PR #91528** fix #73837: stop after failed Node package installs. Thanks @mushuiyu886 and @ItsMeForLua. - **PR #91561** fix(wizard): report keyless web_search providers as ready, not missing a key. Thanks @NormallyGaussian. - **PR #92073** fix: handle explicit silent assistant replies. Related #92038. Thanks @sallyom and @vultusv. - **PR #91311** Allow Skill Workshop apply through trusted skill symlinks. Thanks @abnershang. - **PR #88245** refactor(whatsapp): introduce inbound message contexts. Thanks @mcaxtr. - **PR #92212** refactor: move workspace skill writes to lifecycle. Thanks @shakkernerd. - **PR #92248** Remove ClawHub owner preflight. Thanks @Patrick-Erichsen. - **PR #91617** test(sqlite): add state perf query plan harness. Related #91616. Thanks @galiniliev. - **PR #91626** fix(daemon): keep status readable on unsupported services. Related #25621. Thanks @mushuiyu886 and @kucharskim. - **PR #92295** fix(cron): preserve tz and staggerMs when --cron replaces expression. Related #92291. Thanks @liuhao1024 and @dcapclaw. - **PR #92087** fix(docker): bundle QA Lab runtime in the image. Thanks @jesse-merhi. - **PR #92004** fix(telegram): classify streaming preview edit failures instead of killing the draft. Thanks @obviyus. - **PR #91997** fix(telegram): survive getUpdates conflicts in isolated polling ingress. Thanks @obviyus. - **PR #92387** fix(anthropic-vertex): stop re-marking cache_control on transport-budgeted payloads. Related #91982. Thanks @openperf and @Takhoffman and @danieljimz. - **PR #92229** Fix doctor preview channel SecretRef resolution. Related #91939. Thanks @joshavant and @Niriakot. - **PR #92225** Fix disabled heartbeat one-shot cron retries. Related #91775. Thanks @joshavant and @A1fred-AI. - **PR #92265** Fix configured DeepSeek model transport inheritance. Related #92148. Thanks @joshavant and @marcoraepple-sys. - **PR #92226** Fail closed for CLI-backed /btw fallback. Related #92168. Thanks @joshavant and @wangwllu. - **PR #92231** Fix suppressed heartbeat commitment delivery. Related #91948. Thanks @joshavant and @bizzle12368239. - **PR #92280** fix(agents): classify structured unsupported model errors. Related #92118. Thanks @joshavant and @pikaqqqqqq. - **PR #92276** Fix OTLP log trace correlation. Related #91865. Thanks @joshavant and @sinzin91. - **PR #92282** fix(update): hand off Linux service auto-updates. Related #91823. Thanks @joshavant and @hanyizuo. - **PR #92235** fix: resolve managed SecretRef provider auth. Related #92097. Thanks @joshavant and @LINSUISHENG034. - **PR #92293** Fix provider static model fallback resolution. Related #92009. Thanks @joshavant and @mattsfraser. - **PR #92343** fix(agent): continue after source message tool replies. Related #92169. Thanks @joshavant and @elyalvarado. - **PR #92350** fix(codex): preserve memory prompt registration. Thanks @rubencu and @sallyom. - **PR #92290** fix: clarify gateway SecretRef auth diagnostics. Related #91815. Thanks @joshavant and @mattsfraser. - **PR #92286** fix: repair rejected Anthropic thinking replay. Related #91983. Thanks @joshavant and @reginaldomarcilon. - **PR #92281** Fix Telegram spooled buffered replay. Related #92129. Thanks @joshavant and @riseandshinefutures. - **PR #47493** fix(doctor): show per-step progress spinners during update. Thanks @amersheeny. - **PR #92416** fix(outbound): honor top-level image param as send media source (#92407). Thanks @xydigit-sj and @ichirokyoto. - **PR #92508** fix(sandbox): render CLI skill prompts from materialized paths. Thanks @brokemac79. - **PR #92540** chore: fix esbuild production audit failure. Thanks @RomneyDa. - **PR #91484** Add QA evidence artifact output. Thanks @RomneyDa. - **PR #91500** Add QA scorecard taxonomy validation. Thanks @RomneyDa. - **PR #84082** fix(telegram): allow expandable blockquotes. Thanks @jzakirov. - **PR #92554** feat(moonshot): add Kimi K2.7 Code support. - **PR #92396** fix(moonshot): backfill reasoning_content on assistant tool-call replay messages. Related #71491. Thanks @xialonglee and @RoseKongPS. - **PR #92566** Fix lifecycle timeout cleanup after leader exit. Thanks @RomneyDa. - **PR #92311** ci: split plugin ClawHub publishing paths. Thanks @Patrick-Erichsen. - **PR #92216** fix(gateway): mirror hidden commentary-phase assistant events. Thanks @ragesaq. - **PR #87596** fix(moonshot): rewrite duplicate native Kimi tool_call ids on replay. Related #51593. Thanks @Pluviobyte and @Faaab84. - **PR #88993** Expose paged channel action results. Thanks @fuller-stack-dev. - **PR #90326** fix(fireworks): resolve catalog model params from plugin.json via core. Thanks @obuchowski. - **PR #86629** fix(doctor): warn for untrusted external Discord plugin. Related #83212. Thanks @brokemac79 and @ooiuuii and @cdeyoung67. - **PR #90242** fix(providers): skip unreadable Mistral tool schemas. Thanks @vincentkoc. - **PR #92498** fix(reply): mirror same-channel Slack final replies. Related #92489. Thanks @TurboTheTurtle and @TalkingHeadsJed. - **PR #92083** fix(channels): default boundary logger for swallowed progress-draft start errors. Thanks @hansraj316. - **PR #92564** fix(agents): isolate invalid plugin model catalogs [AI-assisted]. Related #92553. Thanks @tangtaizong666 and @fxstein. - **PR #89827** docs: UX-013 — design system documentation. Thanks @BunsDev. - **PR #89615** feat(ui): hide empty workboard columns. Thanks @BunsDev. - **PR #89822** fix(a11y): B-1+B-2+B-3 — contrast, focus states, minimum font sizes. Thanks @BunsDev. - **PR #92618** fix #92218: memory_search tool disabled with QMD backend. Thanks @mushuiyu886 and @zhbcher. - **PR #92608** docs(gateway): add uptime monitoring guidance to health check docs (fixes #55768). Thanks @liuhao1024 and @faahim. - **PR #92605** fix(docs): pin Windows Hub download links to v2026.6.5. Related #92470. Thanks @lzyyzznl and @arjkul. - **PR #92593** #92589: fix(internal-runtime-context): wrap prompt-preface runtime context body in delimiters. Thanks @zhangqueping and @jovi2014-cyber. - **PR #92606** Run Vitest and Playwright scenarios from qa suite. Thanks @RomneyDa. ## 2026.6.6 ### Highlights - **Tighter security boundaries:** transcript, sandbox, MCP, browser, channel, and exec-approval paths now fail closed around unsafe access, timed-out approvals, and malformed boundary input. (#91529, #91618, #91741, #91750, #89938) Thanks @joshavant, @pgondhi987, @mmaps, @eleqtrizit, @drobison00, @vincentkoc, and @devinkuhn. - **Reliable Telegram delivery:** account-scoped topics route to the correct agent, streamed text survives tool calls, callbacks and draft chunks stay coherent, and unauthorized DM text does not enter cache or prompt context. (#91189, #88682, #90212, #91478, #91915) Thanks @codysai001, @alexzhu0, @snowzlm, @obviyus, @sallyom, @AbdelftahZowail, @producedbysavant, @shakkernerd, @vincentkoc, and @BSG2000. - **iMessage stays connected:** always-on inbound recovery, durable echo markers, block streaming, idle approval discovery, and outbound transport now survive restarts and idle periods. (#91335, #91449, #88969, #91783) Thanks @omarshahine, @jmissig, @dwonshin, @colmbrogan, @vincentkoc, and @TurboTheTurtle. - **Better browser and MCP connectivity:** existing browser sessions, CDP/WebSocket discovery, default-profile URLs, OAuth/SSE transport, and tool schemas now connect through clearer, safer paths. (#91422, #89851, #91736, #91451) Thanks @pgondhi987, @anagnorisis2peripeteia, @eleqtrizit, @LiuwqGit, @lifuyue, @marcusbsorensen, @cursoragent, @vincentkoc, @849261680, and @mgrandau. - **Faster first replies:** Control UI startup no longer waits on broad model loading, while cached metadata, lazy slash-command work, and first-event tracing make slow initial responses visible. (#91531, #91538, #91568, #91583) Thanks @vincentkoc and @BSG2000. - **Broader provider support:** OpenRouter OAuth and Claude Fable 5 land alongside correct Codex compaction ownership, local-model execution, normalized tool progress, and Gemma 4 reasoning replay. (#91830, #91882, #91590, #88630, #91696) Thanks @Patrick-Erichsen, @joshavant, @bdjben, @Coder-Wangyankun, @vincentkoc, @bfox55, @shakkernerd, and @NOVA-Openclaw. ### Changes - CLI progress: emit Claude CLI commentary progress events and bridge inter-tool commentary into channel progress without exposing internal protocol scaffolding. (#89834, #90883) Thanks @anagnorisis2peripeteia, @AbdelftahZowail, @kentuscn, and @vincentkoc. - Observability: allow trusted diagnostics channels to capture tool input/output content, add first-assistant-event traces, and warn on slow initial replies. (#91256, #91568, #91583) Thanks @amknight, @mjunaidca, and @vincentkoc. - Plugins/ClawHub: dogfood reusable package publishing, let dry runs skip publish approval, allow declared installed trusted hooks, report managed plugin version drift, and warn instead of failing on retired Skill Workshop configuration. (#91574, #91591, #90004, #90927, #90838) Thanks @Patrick-Erichsen, @brokemac79, @lonexreb, @rogerallen1, @vincentkoc, and @ryanhelms. - Memory/providers: move the local llama.cpp runtime into its provider plugin, batch embeddings across files, persist the agent model catalog cache, and keep QMD JSON search one-shot while filtering stale REM recall previews. (#91324, #89138, #90457, #91837, #91851) Thanks @osolmaz, @mushuiyu886, @ai-hpc, @TurboTheTurtle, @jalehman, @hartmark, @vincentkoc, @rudi193-cmd, @Peilsender, and @xpysgdhr. - Channels/mobile: add the QQBot group mention toggle, improve iPad and iPhone control surfaces, and expose the active connection host in the TUI footer. (#91423, #91557, #89909) Thanks @cxyhhhhh, @Solvely-Colin, @baskduf, @joshavant, @sliverp, and @deuxksy. - Performance: prewarm TUI runtime plugins, deduplicate plugin auto-enable fanout, trim dense text-delta snapshots, and reuse prepared startup model metadata. (#90782, #89978, #91580, #91531) Thanks @RomneyDa, @ai-hpc, @vincentkoc, and @JakeBiggs. ### Fixes - Agent/session recovery: drop stale approval follow-ups after session rebind, remove drained reply-queue items by identity, recover stale main and visible replies, preserve Codex context-engine compaction ownership, lower the default compaction timeout to 180 seconds while respecting explicit configuration, and keep provider-failure terminal lifecycle state correct. (#85679, #91450, #91566, #91840, #91590, #91361, #91895) Thanks @openperf, @yetval, @joshavant, @wangmiao0668000666, @TurboTheTurtle, @two3pro, @velvet-shark, @sallyom, @849261680, @vincentkoc, @Tony-ooo, @Jerry-Xin, @olveww-dot, and @nikhilmaddirala. - User-visible content boundaries: suppress Codex/Harmony protocol artifacts, neutralize browser and LanceDB memory media directives, redact transcript images, and preserve native `/compact` replies through source suppression. (#89151, #91422, #91425, #91529, #90212) Thanks @joelnishanth, @pgondhi987, @joshavant, @snowzlm, @reslp, @vincentkoc, and @devinkuhn. - Channel delivery: keep WhatsApp captured replies attached to the successor controller after restart, retry Feishu rate limits, preserve Mattermost thread replies, canonicalize LINE webhook paths, restore Discord reply hydration and runtime timeout exports, and show OpenAI Realtime WebRTC assistant transcripts. (#85823, #89659, #91684, #91649, #90263, #91686, #90426) Thanks @itsuzef, @ladygege, @jacobtomlinson, @fuller-stack-dev, @shushushv, @mcaxtr, @AxelHu, @vincentkoc, @marshallm-create, @sliverp, and @dahifi. - Cron: cancel active task runs cleanly, preserve terminal timeout/cancel state, and recover no-deliver tool warnings instead of silently losing the outcome. (#90666, #90678) Thanks @ai-hpc. - Gateway/config/auth: share the approval runtime socket token, replace arrays explicitly in `config.patch`, skip the deleted-agent guard only for valid ACP harness sessions, surface headless LaunchAgent state, verify SQLite auth migration before cleanup, and arm QMD startup maintenance. (#87105, #91551, #91219, #91614, #91740, #91978) Thanks @fuller-stack-dev, @scotthuang, @joshavant, @velvet-shark, @vincentkoc, and @dahifi. - Providers/Codex: clarify quota errors, restore the Codex synthetic usage line, canonicalize Codex protocol assets, require API-key auth for realtime voice, normalize ACP model refs, preserve Gemma 4 `reasoning_content`, and avoid guardian review for local models. (#91390, #91709, #91507, #91567, #88630, #91696) Thanks @hxy91819, @brokemac79, @RomneyDa, @joshavant, @Coder-Wangyankun, @vincentkoc, @bfox55, @shakkernerd, and @sergiopesch. - Updates/builds: recover package Gateway restarts after refresh failure, expose plugin convergence repair, fall back to Corepack in PATH-less pnpm environments, seed the correct Docker store packages, and keep ClawHub dry-run and publish paths reusable. (#91581, #91599, #91547, #91591) Thanks @fuller-stack-dev, @sallyom, @Patrick-Erichsen, @vincentkoc, and @laurenceputra. - UI: require explicit user intent before opening chat sessions and drain restored chat queues after session switches. (#91480) Thanks @TurboTheTurtle, @Takhoffman, and @zdwalter. - Android: avoid the `dataSync` foreground-service type for persistent nodes. (#80082) Thanks @davelutztx. - Native hooks: bound relay lifetimes so abandoned native hook connections cannot linger indefinitely. (#91550) Thanks @joshavant and @clem-git. ### Complete contribution record This audited record covers the complete v2026.6.5..v2026.6.6 history: 198 merged PRs. The generation manifest also supplies direct commits as editorial input; the grouped notes above prioritize user impact. #### Pull requests - **PR #91335** fix(imessage): always-on inbound recovery and dedupe. Related #89237. Thanks @omarshahine and @vincentkoc and @dwonshin. - **PR #91189** fix(telegram): route account-scoped topic agents. Thanks @codysai001. - **PR #88682** Preserve Telegram streamed text blocks between tool calls. Related #87326. Thanks @alexzhu0 and @AbdelftahZowail. - **PR #91390** fix: clarify provider quota errors. Thanks @hxy91819. - **PR #90883** fix(cli): bridge inter-tool commentary events to channel progress. Thanks @anagnorisis2peripeteia. - **PR #91419** docs: preserve channel brand terms in Chinese i18n. Thanks @hxy91819. - **PR #87105** fix(gateway): share approval runtime socket token. Thanks @fuller-stack-dev. - **PR #80082** fix(android): avoid dataSync FGS for persistent node. Thanks @davelutztx. - **PR #91442** docs: preserve LINE across localized docs glossaries. Thanks @hxy91819. - **PR #88768** fix(codex): normalize dynamic tool progress results. Thanks @bdjben. - **PR #91422** fix(browser): neutralize media directives in browser output [AI]. Thanks @pgondhi987. - **PR #89834** feat(cli): emit commentary progress events from Claude CLI parser. Related #87326. Thanks @anagnorisis2peripeteia and @AbdelftahZowail. - **PR #85679** fix(agents): drop stale exec approval followups after session rebind. Related #59349. Thanks @openperf and @two3pro. - **PR #91450** fix(reply-queue): remove the drained item by reference instead of front index. Thanks @yetval. - **PR #89151** fix(delivery): suppress Codex/Harmony internal protocol artifacts from user-facing channels. Related #88128. Thanks @joelnishanth and @reslp. - **PR #90678** fix(cron): recover no-deliver tool warnings. Thanks @ai-hpc. - **PR #91449** fix(imessage): honor block streaming config. Thanks @jmissig and @omarshahine. - **PR #91508** Revert "docs: add maturity scorecard mirror". Thanks @kevinslin. - **PR #91364** build(deps): bump github.com/steipete/peekaboo from 3.3.0 to 3.4.0 in /apps/macos in the swift-deps group. - **PR #91368** build(deps): bump actions/github-script from 8 to 9. - **PR #91512** chore: add taxonomy file. Thanks @kevinslin. - **PR #91369** build(deps): bump actions/cache from 4 to 5. - **PR #91367** build(deps): bump the actions group with 2 updates. - **PR #91365** build(deps): bump the android-deps group in /apps/android with 3 updates. - **PR #91496** chore: bump Codex app-server to 0.137.0. Thanks @RomneyDa. - **PR #90666** fix(cron): cancel active cron task runs. Thanks @ai-hpc. - **PR #90927** fix(doctor): report managed plugin version drift. Related #90891. Thanks @brokemac79. - **PR #91531** perf(control-ui): reuse startup model metadata. Thanks @vincentkoc. - **PR #91538** perf(control-ui): avoid startup catalog wait. Thanks @vincentkoc. - **PR #91507** feat: canonicalize Codex protocol JSON asset ordering. Thanks @RomneyDa. - **PR #91550** fix: bound native hook relay lifetime. Related #90993. Thanks @joshavant and @clem-git. - **PR #89588** fix(telegram): restore /compact on generic message ingress. Related #89525. Thanks @joelnishanth and @cursoragent and @bomberluke37-prog. - **PR #91529** Fix transcript image redaction. Related #90760. Thanks @joshavant and @devinkuhn. - **PR #91551** Fix config.patch explicit array replacement. Thanks @joshavant. - **PR #91568** perf(control-ui): trace first assistant event. Thanks @vincentkoc. - **PR #85823** fix(whatsapp): route captured replies through successor controller after restart. Thanks @itsuzef and @mcaxtr. - **PR #91574** feat: dogfood reusable ClawHub package publish. Thanks @Patrick-Erichsen. - **PR #91583** perf(control-ui): warn on slow first replies. Thanks @vincentkoc. - **PR #89659** fix(feishu): retry on send rate-limit errors (230020/230006). Related #70879. Thanks @ladygege and @marshallm-create and @sliverp and @AxelHu. - **PR #91547** Fix Docker store seed target packages. Related #91035. Thanks @sallyom and @laurenceputra. - **PR #91578** fix: make docs i18n frontmatter translation resilient. Thanks @hxy91819. - **PR #91567** fix(openai): require api-key auth for realtime voice. Related #90456. Thanks @joshavant and @sergiopesch. - **PR #91591** fix: let ClawHub dry runs skip publish approval. Thanks @Patrick-Erichsen. - **PR #91598** perf(control-ui): lazy load slash commands. Thanks @vincentkoc. - **PR #91580** fix(agents): trim dense text delta snapshots. Related #86599. Thanks @vincentkoc and @JakeBiggs. - **PR #91425** fix(memory-lancedb): guard memory recall output [AI]. Thanks @pgondhi987. - **PR #88969** fix(imessage): persist echo markers before send. Thanks @colmbrogan. - **PR #91566** Fix stale main session startup recovery. Related #90525. Thanks @joshavant and @Tony-ooo. - **PR #91324** fix(memory): move local llama.cpp runtime to provider plugin. Related #88705. Thanks @osolmaz and @Peilsender. - **PR #91637** docs: include plugin prerelease in release validation approval. - **PR #91649** fix(line): canonicalize trailing-slash webhook paths. - **PR #91423** feat(qqbot): add /bot-group-allways command to toggle mention requirement. Thanks @cxyhhhhh and @sliverp. - **PR #91642** fix(docs): continue partial i18n batches after file errors. Thanks @hxy91819. - **PR #91661** chore(plugin-sdk): refresh API baseline hash. - **PR #91665** docs: fix release CI Android dispatch guidance. - **PR #89138** fix #88009: [Feature]: batched memory embedding should batch over files. Thanks @mushuiyu886 and @jalehman and @hartmark. - **PR #91679** fix(plugin-sdk): align Discord component edit facade types. Thanks @vincentkoc. - **PR #91686** fix(discord): restore runtime timeout compatibility exports. Thanks @vincentkoc. - **PR #90212** fix(agents): deliver native /compact replies through source suppression. Thanks @snowzlm. - **PR #91618** fix: expand unsafe host env denylist. Thanks @pgondhi987. - **PR #91615** fix: block rustup toolchain env overrides [AI]. Thanks @pgondhi987. - **PR #89851** fix(gateway): support Streamable HTTP MCP transport on loopback server. Thanks @anagnorisis2peripeteia. - **PR #91619** fix: block git protocol env controls [AI]. Thanks @pgondhi987. - **PR #91684** fix(mattermost): keep default replies in existing threads. Thanks @jacobtomlinson. - **PR #90457** fix(models): persist agent catalog cache. Thanks @ai-hpc. - **PR #91709** fix(status): restore Codex synthetic usage line. Related #91694. Thanks @brokemac79. - **PR #89909** fix(tui): show connection host in footer. Related #56276. Thanks @baskduf and @deuxksy. - **PR #89978** perf(config): dedupe plugin auto-enable fanout work. Thanks @ai-hpc. - **PR #91219** fix(gateway): skip deleted-agent guard for ACP harness session keys. Thanks @scotthuang. - **PR #90782** perf(tui): prewarm runtime plugins before first send. Thanks @RomneyDa. - **PR #90838** fix(config): warn for retired skill-workshop plugin entry instead of failing validation (#90244). Thanks @lonexreb and @rogerallen1. - **PR #91753** docs: clarify Matrix plugin upgrade repair. Thanks @RomneyDa. - **PR #91755** docs: align Feishu DM policy defaults. Thanks @RomneyDa. - **PR #91745** fix(discord): require sender for moderation actions [AI]. Thanks @eleqtrizit. - **PR #85950** docs: clarify trusted-proxy Control UI scope behavior. Related #80063. Thanks @nielskaspers and @longstoryscott. - **PR #91746** fix(msteams): require admin for group actions. Thanks @eleqtrizit. - **PR #91256** feat(diagnostics-otel): capture tool input/output content via trusted channel. Thanks @amknight. - **PR #91749** fix(gateway): restrict non-owner loopback tools. Thanks @eleqtrizit. - **PR #91748** fix(elevated): reject group ids as senders. Thanks @eleqtrizit. - **PR #91752** fix(codex): guard sandbox http requests. Thanks @eleqtrizit. - **PR #91763** fix: require ACP metadata for deleted-agent bypass. Thanks @shakkernerd. - **PR #91751** fix(mcp): harden stdio env filtering. Thanks @eleqtrizit. - **PR #91765** Clarify env-var executable behavior reports in SECURITY.md. Thanks @jacobtomlinson. - **PR #91480** fix(ui): require user intent for chat sessions. Related #89760. Thanks @TurboTheTurtle and @Takhoffman and @zdwalter. - **PR #91777** docs: remove superpowers spec draft. Thanks @Patrick-Erichsen. - **PR #91773** fix(mcp): lowercase SSE event-source header keys to prevent duplicate Authorization (401). Thanks @Takhoffman. - **PR #91741** Validate sandbox bind parent paths [AI]. Thanks @mmaps. - **PR #88530** fix(imessage): skip idle approval discovery scans. Thanks @colmbrogan and @omarshahine. - **PR #91780** fix(ui): drain restored chat queue after session switch. Thanks @tmimmanuel. - **PR #91750** fix(search): enforce native web search tool policy. Thanks @eleqtrizit. - **PR #91757** fix(config): clarify retired skill workshop plugin warning. Thanks @RomneyDa. - **PR #91787** fix(doctor): keep TTS legacy migration on supported paths. - **PR #91783** fix(imessage): harden outbound send transport. Related #84329. Thanks @omarshahine and @TurboTheTurtle. - **PR #91785** fix(imessage): surface inbound startup diagnostics. Thanks @omarshahine. - **PR #91590** Fix context-engine compaction ownership for Codex sessions. Thanks @joshavant. - **PR #91557** Improve iPad and iPhone control surfaces. Thanks @Solvely-Colin and @joshavant. - **PR #91666** chore(deps): bump useblacksmith/setup-docker-builder from 1.8.0 to 1.9.0 in the actions group. - **PR #91819** docs: link ClawHub plugin validation fixes guide. Thanks @Patrick-Erichsen. - **PR #88630** fix(codex): avoid guardian review for local models. Thanks @vincentkoc. - **PR #91830** feat: add OpenRouter OAuth to onboarding. Thanks @Patrick-Erichsen. - **PR #91842** fix(plugin-sdk): refresh API baseline hash. - **PR #91614** fix(gateway): surface headless LaunchAgent state. Thanks @fuller-stack-dev. - **PR #91851** fix(memory-core): filter stale recall entries in REM harness preview. Thanks @vincentkoc. - **PR #91859** fix(ci): disable memory slot in release smoke config. Thanks @vincentkoc. - **PR #90004** [plugin sdk] Allow declared installed trusted hooks. Related #87735. Thanks @brokemac79 and @ryanhelms. - **PR #91837** fix(memory-core): keep QMD JSON search one-shot. Related #91821. Thanks @TurboTheTurtle and @xpysgdhr. - **PR #91871** Remove bundled channel contract fallbacks. Thanks @obviyus. - **PR #91879** fix(ci): include ACPX in shared live-test image. - **PR #91840** Fix stale visible reply recovery. Related #90535. Thanks @joshavant and @Jerry-Xin. - **PR #91876** Fix Telegram callback API handling. Thanks @obviyus. - **PR #91874** Share channel draft chunking resolver. Thanks @obviyus. - **PR #91599** fix(update): expose plugin convergence repair. Thanks @fuller-stack-dev. - **PR #91581** fix(update): recover package gateway restart after refresh failure. Thanks @fuller-stack-dev. - **PR #91904** fix(telegram): use SDK dispatch dedupe. Thanks @obviyus. - **PR #90263** fix(discord): hydrate reply context metadata. Thanks @fuller-stack-dev. - **PR #91478** block unauthorized Telegram DM text from prompt context. Related #91209. Thanks @sallyom and @producedbysavant. - **PR #91915** fix(telegram): audit follow-ups — block-mode chunk config, dedupe bucket cleanup, grammy contract trust. Thanks @obviyus. - **PR #91361** fix(compaction): lower default timeout from 900s to 180s, preserve explicit config. Related #91358. Thanks @wangmiao0668000666 and @velvet-shark and @olveww-dot. - **PR #91791** fix(sandbox): use materialized skill paths in startup prompts. Related #91761. Thanks @brokemac79 and @vincentkoc and @gbb-netizen. - **PR #91736** Support existing-session browser CDP endpoints. Related #56118. Thanks @lifuyue and @mgrandau. - **PR #91747** fix(browser): validate discovered CDP websocket URLs. Thanks @eleqtrizit. - **PR #91882** feat(anthropic): support Claude Fable 5 adaptive thinking. Related #91805. Thanks @NOVA-Openclaw. - **PR #91884** fix(memory): keep ignored-name QMD roots watchable. Thanks @vincentkoc. - **PR #91740** fix(auth): verify SQLite auth migration before cleanup. Thanks @fuller-stack-dev and @velvet-shark. - **PR #91451** fix(mcp): repair OAuth redirect, errors, and unicode schema patterns. Related #91433. Thanks @LiuwqGit and @cursoragent and @vincentkoc and @marcusbsorensen. - **PR #91978** fix(gateway): arm qmd startup maintenance. Thanks @vincentkoc. - **PR #90426** fix(talk): show OpenAI Realtime WebRTC assistant transcripts. Thanks @shushushv and @vincentkoc. - **PR #91696** fix(agents): preserve reasoning_content replay for Gemma 4 openai-completions models. Related #91645. Thanks @Coder-Wangyankun and @bfox55. - **PR #89938** Fail closed on exec approval timeout. Thanks @drobison00. - **PR #91895** fix(webchat): finalize provider failure lifecycle. Related #91730. Thanks @TurboTheTurtle and @sallyom and @nikhilmaddirala. - **PR #80143** fix(browser): honor cdpUrl for user default profile. Related #48042. Thanks @HemantSudarshan and @Max-Resilient. - **PR #91688** fix(cron): reject cron expressions that have no reachable run time. Thanks @yetval and @vincentkoc. - **PR #91737** fix(cron): use final-call usage for session token totals. Related #91716. Thanks @MonkeyLeeT and @vincentkoc and @yetval. - **PR #89605** fix(process): return timeout code for killed commands. Thanks @ai-hpc. - **PR #80013** perf(usage-cost-cache): throttle full-cache rewrites during refresh. Thanks @zeroaltitude. - **PR #76731** Fix mobile Control UI chat layout. Thanks @Solvely-Colin. - **PR #83738** fix(cron): capture originating session/agent on the cron wake tool call. Thanks @anagnorisis2peripeteia. - **PR #85196** Redact tool output secrets. Thanks @amknight. - **PR #92007** fix(security): block build tool env overrides. Thanks @eleqtrizit. - **PR #91891** fix: preserve non-oneOf protocol schema array order. Thanks @RomneyDa. - **PR #91754** fix(macos): hide unsupported Voice Wake controls. Related #89575. Thanks @RomneyDa and @cwhyhy. - **PR #92049** test(ci): restore upgrade survivor session fixture. Thanks @vincentkoc. - **PR #89670** fix: keep skill toggles keyed by skill identity. Related #89661. Thanks @s-moffett. - **PR #91934** fix(state): tolerate chmod failures when opening the state database. Related #91919. Thanks @truffle-dev and @david-garcia-garcia. - **PR #92051** fix(fal): parse raw completed queue results. Related #91989. Thanks @harjothkhara and @oswaldyeo. - **PR #92047** fix(agents): prefer explicit sessions_send keys. Related #64699. Thanks @vincentkoc and @sunxq1017-hash. - **PR #92020** fix(memory-core): check SQLite plugin state for dreaming ingestion audit after JSON migration (fixes #92017). Thanks @zenglingbiao and @JUMPUNDER. - **PR #92032** fix(mcp): always log channel-bridge notification failures. Thanks @hansraj316. - **PR #92033** fix(gateway): log swallowed background-task finalization errors. Thanks @hansraj316. - **PR #92022** fix(sessions): derive channel from direct-chat session keys in send-policy. Thanks @hansraj316. - **PR #91163** fix(xai): clarify x_search query guidance. Thanks @rubencu. - **PR #90121** fix(memory): write dream fallback without subagent runtime. Thanks @a-m-a-r-a. - **PR #91215** fix(ui): show prompt progress while sending. Related #91199. Thanks @zhangguiping-xydt and @vincentkoc and @Monniasza. - **PR #92029** fix(tools): surface unsupported-signal in anyOf availability. Thanks @hansraj316. - **PR #92034** perf(agents): memoize XML attribute regex in DSML stream parser. Thanks @hansraj316. - **PR #92026** perf(agents): sanitize compaction messages once for token estimation. Thanks @hansraj316. - **PR #91351** fix(opencode-go): add qwen plus tiered pricing. Related #91238. Thanks @849261680 and @vincentkoc and @samson910022. - **PR #92027** fix(gateway): recover config hot-reload after watcher errors. Thanks @hansraj316. - **PR #91471** feat(cron): add readable ISO time fields to `cron runs` JSON output. Thanks @FMLS and @cursoragent. - **PR #91711** :bug: fix(agents): classify harness provider mismatch as format error (#91710). Thanks @a-tokyo. - **PR #91292** fix(models): keep bundled provider catalog when configured base URL is blank (#91270). Thanks @yetval and @vincentkoc and @resYuto. - **PR #91720** :bug: fix(openai): remove chatgpt-responses transport override from gpt-5.3-codex catalog entry. Related #91710. Thanks @a-tokyo. - **PR #91305** fix(control-ui): make Control UI bootstrap config endpoint base-path-relative (#66946). Thanks @Alix-007 and @vincentkoc and @yndwx01. - **PR #92056** fix(exec): honor state dir approvals. Thanks @vincentkoc. - **PR #91897** fix(memory): self-heal missing index identity by initializing provider during sync. Thanks @xydt-tanshanshan and @vincentkoc. - **PR #91802** fix(diagnostics): release wedged session lane when stuck-session recovery aborts a run with queued session work. Related #91700. Thanks @openperf and @infocus13. - **PR #92030** fix(cron): structural top-of-hour match in stagger heuristic. Thanks @hansraj316 and @vincentkoc. - **PR #92055** fix(media): resolve state-relative inbound attachments. Thanks @sercada and @vincentkoc. - **PR #91962** fix(agent): dampen Discord stale thread replies. Thanks @RomneyDa. - **PR #90912** fix(agents): honor configured CLI resume timeouts. Thanks @ai-hpc and @vincentkoc. - **PR #91296** fix: hand off supervised git updates. Thanks @abnershang. - **PR #91950** fix(web_fetch): sanitize URL whitespace from LLM tool call arguments (fixes #91651). Thanks @zenglingbiao and @vincentkoc and @akang1798. - **PR #77367** fix(discord): scope command-deploy cache by application id. Related #77359. Thanks @lonexreb and @sallyom and @igmarketing. - **PR #91976** feat(auto-reply): durable inter-tool commentary via verbose standalone progress (supersedes #89850/#89890). Thanks @anagnorisis2peripeteia. - **PR #90128** fix(sessions): preserve user /model override across daily/idle session rollover (#90119). Thanks @Marvinthebored. - **PR #92084** fix(clickclack): allow explicit enable through plugin allowlist. - **PR #92092** fix(auto-reply): stop dropping claude-cli narration when commentary lane is off. Thanks @ragesaq. - **PR #92123** #92109: [Bug]: EmbeddedAttemptSessionTakeoverError caused by Btrfs ctimeNs instability. Thanks @lzyyzznl and @vincentkoc and @recruits. - **PR #92136** fix(feishu): reply inside P2P direct-message threads. Thanks @LiaoyuanNing and @vincentkoc. - **PR #92121** fix(memory): preserve live SQLite index during swaps. Related #91216. Thanks @xydt-tanshanshan and @chrisreddington. - **PR #90173** fix(agents): stabilize a2a prompt cache context. Thanks @Sunjae-k and @sunjae-1. - **PR #91974** fix(cli-runner): scope claude-cli queue to live-session owner identity (#91946). Thanks @wangwllu. - **PR #92053** fix(thinking): apply Claude profile to anthropic-messages catalog rows. Related #91975. Thanks @wangwllu. - **PR #41991** Google: show detailed Gemini CLI OAuth extraction failures. Thanks @bgmbgm94. - **PR #92074** fix(qqbot): flush tool output before silent non-streaming final. Thanks @sliverp. - **PR #89508** fix(models): clarify provider model registration hint. Related #89192. Thanks @sweetcornna and @aaajiao. - **PR #89085** fix(agents): keep migrated session entry ids unique on v1 upgrade. Thanks @yetval. - **PR #89552** fix(discord): clean migrated thread binding state. Thanks @SYU8384. - **PR #89448** fix(cron): reject durations that overflow to a non-finite value. Related #83906. Thanks @Alix-007 and @davinci282828. - **PR #89319** fix(doctor): warn on unsupported hook entry loaders. Related #89309. Thanks @leno23 and @vincentkoc and @CameronWeller. - **PR #91966** fix(config): stop config.patch replacePaths index suffix from widening array consent. Thanks @yetval and @vincentkoc. - **PR #92127** fix(plugins): rescan storm in "/models" call (regression shipped since v2026.5.18). Thanks @obuchowski. - **PR #91657** fix(ollama): use provider thinking default in SDK session factory. Related #91428. Thanks @openperf and @vincentkoc and @anijatsu. - **PR #91742** fix(memory): abort orphaned embedding work when memory_search times out. Related #91718. Thanks @dreamhunter2333 and @vincentkoc and @NOVA-Openclaw. - **PR #89091** fix(memory-core): retry narrative message reads. Thanks @bennewell35. - **PR #92150** fix(release): gate beta publish on plugin verification. Thanks @vincentkoc. - **PR #92158** fix(cli): validate gateway RPC timeout inputs. Thanks @ruanrrn and @comeran. - **PR #91911** fix(agents): retry same model across short rate-limit windows. Thanks @lanzhi-lee. ## 2026.6.5 ### Highlights - **Safer channel output:** QQBot strips model reasoning and thinking scaffolding before native delivery, so users see the final answer rather than raw internal markup. (#89913, #90132) Thanks @openperf, @dygg2001, @Takhoffman, and @vincentkoc. - **MCP results no longer poison sessions:** `resource_link`, audio, malformed images, and future non-text blocks are normalized before provider conversion, avoiding Anthropic 400s and broken follow-up history. (#90710, #90728) Thanks @RanSHammer, @849261680, and @Takhoffman. - **Anthropic extended thinking recovers after restarts:** prompt-cache expiry and early-signature failures wait for a real message start, so they reach the existing retry path rather than ending a turn. (#90667, #90697) Thanks @openperf, @MIHHHMIH, @Takhoffman, @vincentkoc, @itsuzef, and @mcaxtr. - **Parallel web search is bundled:** API-key discovery, guarded endpoint handling, cache-safe session IDs, onboarding, and documentation make it a first-class search provider. (#85158) Thanks @NormallyGaussian. - **Better Matrix and Vertex reliability:** Matrix voice notes and threaded conversations retain their context, while Google Vertex ADC models regain static catalog and runtime resolution. (#78016, #90415, #90506, #90609) Thanks @849261680, @frankdierolf, and @paulogogs. - **Safer upgrades and restarts:** cron JSON stores migrate before runtime, service env placeholders stop masking secrets, and macOS avoids unnecessary direct-Gateway reconnect churn. (#90072, #90208, #90668, #90815) Thanks @MonkeyLeeT, @sallyom, @vrurg, @wlassalle724, @jalehman, @Takhoffman, @zhangguiping-xydt, @joshavant, and @vincentkoc. ### Changes - Search/providers: add the Parallel bundled web-search plugin, registration contracts, onboarding integration, and guarded `api.parallel.ai/v1/search` support. (#85158) Thanks @NormallyGaussian and @vincentkoc. - Matrix/channels: add voice-message preflight and thread-aware read/reply behavior. (#78016, #90415) Thanks @frankdierolf. - Skills/ClawHub: install ClawHub skills backed by GitHub repositories through the resolved install API, download the pinned GitHub commit, keep install-policy checks, and report install telemetry after success. (#90478) Thanks @Patrick-Erichsen, @vincentkoc, @itsuzef, and @mcaxtr. - Google Chat/channels: add native approval card actions and click handling so Google Chat approvals use platform-native cards instead of generic message flow. - Mobile: Android provider/model screens now surface expiring, unavailable, unresolved, and attention states more clearly, while iOS settings and Talk tabs keep diagnostics, gateway rows, attachment labels, and unavailable Talk controls reachable. Thanks @joshavant and @shakkernerd. - Memory: QMD search can use the new rerank toggle, and memory adapter status uses the resolved default model identity when checking plain status. (#61834) Thanks @kouka-t0yohei and @vincentkoc. - QQBot: add `/bot-group-allways on|off` slash command (with named-account and default-account support) to toggle whether group messages require an `@mention` before the bot replies, and clear the runtime config snapshot after the write so the new account-level `defaultRequireMention` takes effect immediately without restart. (#91423) Thanks @cxyhhhhh, @joshavant, @vincentkoc, @itsuzef, @mcaxtr, and @jacobtomlinson. ### Fixes - Agents: `sessions_send` now honors an explicit `sessionKey` when stale label metadata is also present, and denied session-id sends no longer echo the resolved canonical session key. Fixes #64699; refs #74009 and #41199 Thanks @Mintalix, @RevisitMoon, @Mocha-s, @chouxiaozi1989, @sunxq1017-hash, @vincentkoc, and @joshavant. - Channel content boundaries: QQBot now strips reasoning/thinking tags before sending, preserving final answers while hiding internal model narration from users. (#89913, #90132) Thanks @openperf, @Takhoffman, @dygg2001, and @vincentkoc. - Agents/MCP/providers: coerce non-text/image MCP tool-result blocks before they reach provider converters, preserving valid images and turning richer MCP content into text instead of malformed image blocks. (#90710, #90728) Thanks @RanSHammer, @849261680, @Takhoffman, @vincentkoc, and @LiuwqGit. - Anthropic/Codex/ACP/agent recovery: defer Anthropic stream start events until `message_start`, strip stale compaction thinking signatures before Anthropic replay, detect unsigned thinking-only stalls, refresh prompt fences after compaction writes, reject empty completion handoffs, preserve parent streaming-off overrides/shared progress commentary, forward heartbeat metadata to context-engine hooks, and cover Codex session/thread migration edge cases. (#90667, #90697, #90163, #90108, #89874, #89505, #90632, #89302, #90729, #90317, #90319) Thanks @openperf, @100yenadmin, @ooiuuii, @johnib, @Takhoffman, @MIHHHMIH, @dexiosmb, @zenglingbiao, @jalehman, @huangxun375-stack, @holgergruenhagen, @vincentkoc, @joshavant, and @ArthurusDent. - Provider/model resolution: preserve Google Vertex ADC auth markers in generated catalogs, re-probe a single-provider primary after cooldown, share Codex model visibility, fail closed for unknown model auth, preserve Codex alias availability, keep unresolved profile refs unknown, and avoid resolving auth while listing models. (#90506, #90609, #90717, #90702) Thanks @849261680, @paulogogs, @brtkwr, and @vincentkoc. - Gateway/macOS/mobile: avoid duplicate Gateway probe warnings by identity, rate-limit node pairing requests while preserving paired-node reconnects, keep macOS node mode on a healthy direct Gateway session, keep iOS diagnostics and gateway rows reachable, and avoid Linux ARM Gradle resource tasks during Android builds. (#85791, #90147, #90668, #90815) Thanks @giodl73-repo, @vrurg, @pgondhi987, @Takhoffman, @zhangguiping-xydt, @vincentkoc, @joshavant, and @shakkernerd. - TUI/chat/Workboard/auto-reply: optimistic user messages stay stable across stale history reloads, runId reassignment, and abort windows instead of disappearing, jumping, or lingering as ghost rows; Workboard stale lifecycle bulk updates no longer overwrite newer status/provenance; message-tool sends now count as delivery. (#86205, #89600, #88592, #90123) Thanks @RomneyDa, @BunsDev, @kzclaw, @mcaxtr, @vincentkoc, @joshavant, and @LiuwqGit. - Cron/update/service env: doctor config preflight now migrates legacy cron JSON stores into SQLite before runtime reads, service env planning skips unresolved placeholders that would mask state-dir `.env` values, and session transcript rewrites keep registry markers/discriminants consistent. (#90072, #90208, #90277, #90488) Thanks @MonkeyLeeT, @sallyom, @Kvikkulf, @jalehman, @wlassalle724, @shakkernerd, and @vincentkoc. - Security/config/tooling: guard MCP HTTP redirects, protect global agent config defaults, and keep malformed operational limits bounded and explicit. (#89732, #90145) Thanks @pgondhi987, @vincentkoc, and @joshavant. - Channels: WhatsApp restarts when per-account config changes, bounds background startup waits, closes failed sockets, and preserves reconnect behavior; Mattermost slash commands keep their state on `globalThis`; Feishu streaming cards preserve full merged content; voice-call tracks Twilio streams after connect; ClickClack reply tools respect `toolsAllow`. (#87951, #87965, #90486, #68113, #90534, #90181, #90607, #89500) Thanks @MukundaKatta, @mcaxtr, @infoanton, @mushuiyu886, @sahibzada-allahyar, @borntobefree2-cmyk, @Takhoffman, @mmaps, @MMMMSSSS8899, @ly85206559, @sliverp, @vincentkoc, @joshavant, @LiuwqGit, @itsuzef, @wjm7220, and @donkeykong91. - Feishu: retry transient send rate-limit errors (HTTP 429, per-chat code 230020, tenant-level code 11232) with linear backoff, including SDK responses that fulfill with rate-limit bodies instead of throwing, and route streaming-card sends through the retry wrapper. (#89659) Thanks @ladygege, @AxelHu, @marshallm-create, @sliverp, @joshavant, @vincentkoc, @itsuzef, and @mcaxtr. - Memory: keep doctor REM harness previews aligned with live REM by dropping short-term recall snippets whose source files disappeared before rendering preview output. Thanks @samzong, @frankekn, and @vincentkoc. ### Complete contribution record This audited record covers the complete v2026.6.2-beta.1..v2026.6.5 history: 142 merged PRs. The generation manifest also supplies direct commits as editorial input; the grouped notes above prioritize user impact. #### Pull requests - **PR #89102** refactor(auth): store auth profiles in SQLite. - **PR #90028** docs: clarify legacy openai-codex auth. Thanks @jalehman. - **PR #89600** Fix Workboard status persistence. Related #88592. Thanks @BunsDev and @kzclaw. - **PR #90067** fix(workboard): isolate stale lifecycle bulk patches. Thanks @BunsDev. - **PR #88585** Pin official npm plugin install records. Thanks @zhuisDEV. - **PR #90053** fix: hide Skill Workshop revision handoff from chat. Thanks @shakkernerd. - **PR #90123** fix(auto-reply): count message tool sends as delivery. Thanks @mcaxtr. - **PR #87965** fix(whatsapp): restart channel when a per-account config field changes so disabled accounts are torn down. Related #87951. Thanks @MukundaKatta and @mcaxtr and @borntobefree2-cmyk. - **PR #90145** fix: protect global agent config defaults [AI]. Thanks @pgondhi987. - **PR #90147** Rate limit node pairing requests [AI]. Thanks @pgondhi987. - **PR #89732** fix: guard MCP HTTP redirects [AI]. Thanks @pgondhi987. - **PR #90181** fix(feishu): preserve streaming card content. Related #90164. Thanks @mushuiyu886 and @sliverp and @wjm7220. - **PR #90058** fix(docker): qualify base image refs for podman short-name mode. Thanks @mrunalp and @sallyom. - **PR #89488** fix: stabilize Anthropic cache marker through tool loops. Thanks @Marvinthebored. - **PR #89505** fix(acp): re-add opt-in parent commentary progress. Related #89501. Thanks @100yenadmin. - **PR #90341** fix(acp): default parent commentary in progress mode. Thanks @obviyus. - **PR #90351** fix(message-tool): stabilize send idempotency keys. Thanks @jesse-merhi. - **PR #90375** refactor: remove Feishu runtime dedupe JSON fallback. - **PR #90385** refactor: move MS Teams state migration to doctor. - **PR #90287** fix(ci): scope PR merge diff checks to first parent. Thanks @hxy91819. - **PR #90436** Add NVIDIA Nemotron 3 Ultra default. Thanks @jacobtomlinson. - **PR #90205** fix: tolerate missing streamed response content type. Thanks @jalehman. - **PR #90163** fix(agents): strip stale compaction thinking signatures before Anthropic replay. Related #90108. Thanks @openperf and @dexiosmb. - **PR #90486** fix(whastapp): bound connection startup waits. Thanks @mcaxtr and @MMMMSSSS8899. - **PR #90488** fix service env placeholder collection. Thanks @sallyom. - **PR #90478** feat: install GitHub-backed ClawHub skills. Thanks @Patrick-Erichsen. - **PR #90304** feat(memory): support qmd query rerank toggle. Related #61834. Thanks @osolmaz and @kouka-t0yohei. - **PR #90532** Fix main CI guard drift. Thanks @RomneyDa. - **PR #90534** fix(mattermost): anchor slash state on globalThis (#68113). Thanks @Takhoffman and @ly85206559 and @infoanton. - **PR #89502** feat(googlechat): add native approval cards. Thanks @kevinslin. - **PR #90317** Add Codex multi-agent config migration coverage. Thanks @ooiuuii. - **PR #90319** Add Codex session route migration coverage. Thanks @ooiuuii. - **PR #90132** fix(qqbot): sanitize outbound text to strip reasoning/thinking content. Related #89913. Thanks @openperf and @Takhoffman and @dygg2001. - **PR #89874** fix(agents): detect unsigned thinking-only stall when reasoning payload inflates payloadCount. Related #89787. Thanks @openperf and @Takhoffman and @ArthurusDent. - **PR #90594** fix(android): align provider readiness with available models. Thanks @Tosko4. - **PR #90576** fix(sessions): reconcile stale terminal main transcripts. Related #60542. Thanks @ferminquant and @kAIborg24. - **PR #90405** Fix ClickClack toolsAllow reply dispatch. Thanks @mmaps. - **PR #90415** feat(matrix): handle voice preflight and threads. Related #78016. Thanks @frankdierolf. - **PR #90208** fix(cron): auto-migrate legacy cron store. Related #90072. Thanks @MonkeyLeeT and @jalehman and @wlassalle724. - **PR #85791** fix(gateway): dedupe probe warnings by gateway identity. Thanks @giodl73-repo. - **PR #90632** fix(context-engine): forward isHeartbeat to afterTurn (fixes #89302). Thanks @zenglingbiao and @jalehman and @huangxun375-stack. - **PR #90250** docs: prefer web_fetch in weather skill. Thanks @fuller-stack-dev. - **PR #85158** feat(parallel): add Parallel as a bundled web_search provider. Thanks @NormallyGaussian. - **PR #86205** fix(tui): stabilize optimistic user messages across history reloads, runId reassignment, and abort. Thanks @RomneyDa. - **PR #86483** chore(deps): bump the swift-deps group across 1 directory with 3 updates. - **PR #90601** chore(deps): bump the actions group across 1 directory with 4 updates. - **PR #81757** chore(deps): bump github.com/apple/swift-testing from 6.3.1 to 6.3.2 in /apps/swabble in the swift-deps group across 1 directory. - **PR #86481** chore(deps): bump the android-deps group across 1 directory with 9 updates. - **PR #74980** build(deps): bump docker/login-action from 3.6.0 to 4.1.0. - **PR #90717** fix(agents): re-probe single-provider primary during cooldown. Related #90702. Thanks @849261680 and @brtkwr. - **PR #90609** fix(google): preserve Vertex ADC catalog auth. Related #90506. Thanks @849261680 and @paulogogs. - **PR #90775** fix: refresh prompt fence after compaction writes. Related #90729. Thanks @jalehman and @johnib. - **PR #90027** test(codex): pin completion-idle timeout thread reset. Thanks @harjothkhara. - **PR #89566** fix(telegram): suppress post-final tool error noise. Thanks @keshavbotagent. - **PR #90607** fix(voice-call): track Twilio streams after connect. Related #81122. Thanks @sahibzada-allahyar and @Takhoffman and @donkeykong91. - **PR #90728** fix(agents): coerce non-text/image MCP tool-result blocks to text (fixes #90710). Thanks @849261680 and @Takhoffman and @RanSHammer. - **PR #90697** fix(llm): defer Anthropic stream start event until after message_start. Related #90667. Thanks @openperf and @Takhoffman and @MIHHHMIH. - **PR #90816** fix(memory): resolve adapter default model in plain status identity check. Related #90413. Thanks @849261680 and @Takhoffman and @colinmac-boop. - **PR #90815** fix #90668: [Bug]: macOS node mode can silently self-reconnect in a healthy direct gateway session. Thanks @Takhoffman and @zhangguiping-xydt and @vrurg. - **PR #90793** Fix OpenAI audio auth to use API keys. Thanks @Glucksberg and @sallyom. - **PR #90790** fix(codex): preserve completed replies after client close. Related #90771. Thanks @brokemac79 and @jalehman. - **PR #90820** fix(codex): report completion timeout diagnostics. Thanks @kevinslin. - **PR #90845** fix(imessage): frame rpc stdout on LF only. Related #89830. Thanks @omarshahine and @mmartoccia. - **PR #90813** fix(uninstall): refuse to remove current working directory during cleanup. Related #90806. Thanks @xydigit-sj and @sallyom and @brandondube. - **PR #90336** fix(memory): fail fast when embeddings provider is unavailable. Related #89691. Thanks @osolmaz and @joeykrug. - **PR #90914** fix(talk): resolve realtime provider secret refs. Thanks @ngutman. - **PR #88771** fix(agents): stream phased text deltas incrementally. Thanks @vincentkoc. - **PR #87856** fix(agents): count streamed model deltas incrementally. Thanks @vincentkoc. - **PR #88882** test(gateway): add small model live profile. Thanks @vincentkoc. - **PR #90919** [codex] Add iOS Apple Review demo mode. Thanks @ngutman. - **PR #90954** fix(cron): require HTTP context for server_error retry classification. Related #90947. Thanks @Nas01010101. - **PR #90854** fix(build): copy export-html assets to dist/export-html matching runtime path (fixes #90843). Thanks @zenglingbiao and @Tank-x3. - **PR #90922** docs: improve plugin inventory layout. Thanks @joshp123. - **PR #89652** fix(plugins): load owning plugin for configured memory embedding provider at startup. Related #89651. Thanks @joeykrug. - **PR #90811** fix(agents): stabilize user-turn serialization across turns to preserve prompt cache. Related #90810. Thanks @Marvinthebored and @jalehman. - **PR #90853** fix(imessage): send TTS audio as voice messages. Thanks @omarshahine. - **PR #90995** fix(release): use monthly patch versions. Thanks @vincentkoc. - **PR #91030** fix: store device-pair notify state in sqlite. - **PR #91034** fix: store acpx process state in sqlite. - **PR #90849** feat(parallel): add free Parallel Search MCP as the zero-config default web_search provider. Thanks @NormallyGaussian. - **PR #91056** fix: store memory-core dreams state in sqlite. - **PR #89918** fix(vertex): route eu/us multi-region to .rep.googleapis.com host. Related #89891. Thanks @alkor2000 and @Wimcomander. - **PR #91058** fix(gemini): accept empty grounding metadata. Related #88528. Thanks @TarsTriggerBot. - **PR #91072** refactor(memory-wiki): store source sync state in sqlite. - **PR #91073** fix(openrouter): reconcile streamed generation cost. Related #68066. Thanks @chrispatil. - **PR #91032** docs(imessage): require DisableLibraryValidation on modern macOS; document macOS 26 injection gates. Thanks @omarshahine. - **PR #87933** fix(agents): suppress DeepSeek thinking for Foundry aliases. Related #90520. Thanks @MukundaKatta and @wlassalle724. - **PR #91037** fix(config): allow thinkingLevelMap in persisted model schema. Related #91011. Thanks @wsyjh8 and @chrisreddington. - **PR #89832** fix(config): allow requiresReasoningContentOnAssistantMessages in ModelCompatSchema. Related #89660. Thanks @KrasimirKralev and @kyKKK. - **PR #91088** refactor(matrix): store sync cache in sqlite. - **PR #90138** fix(minimax): exempt M3 from thinking-disabled wrapper. Thanks @IamVNIE. - **PR #91053** refactor: store Zalo hosted media in plugin state. - **PR #91098** fix(test): type overflow resolver mock. Thanks @RomneyDa. - **PR #81277** fix(google): handle compressed Vertex ADC token refresh responses. Thanks @liaoandi. - **PR #91100** refactor(matrix): store crypto sidecars in sqlite. - **PR #90260** fix(agents): decode xai and venice tool-call arguments exactly once. Thanks @yetval. - **PR #90593** fix: preserve LM Studio Responses tool arguments. Related #90585. Thanks @849261680 and @ceo-nada. - **PR #89109** fix(agents): block message-tool spam loops defeated by volatile message ids. Related #89090. Thanks @openperf and @wujiaming88. - **PR #90429** Fix LM Studio wizard prompter binding. Thanks @christineyan4. - **PR #90780** perf(qqbot): narrow tool discovery cold load. Thanks @RomneyDa. - **PR #90504** fix(codex): preserve post-tool reasoning liveness. Thanks @fuller-stack-dev. - **PR #91113** fix: align Xiaomi completions replay compat. Related #91106. Thanks @KrasimirKralev. - **PR #91108** refactor(memory-wiki): store import runs in sqlite. - **PR #91118** fix: preserve Foundry Responses reasoning replay ids. Related #91033. Thanks @chrisreddington. - **PR #91125** fix: strip Google provider prefix from Gemini paths. Related #71932. Thanks @soumoucookie. - **PR #90056** fix(doctor): merge disjoint openai-codex model entries into canonical openai provider. Related #90047. Thanks @openperf and @holgergruenhagen. - **PR #91127** refactor: store sandbox registry in sqlite. - **PR #91131** fix: migrate legacy agent registry schema via doctor. - **PR #91119** fix(outbound): keep Discord runtime adapters resolvable. Related #90162. Thanks @TurboTheTurtle and @thewilloftheshadow and @hoyanhan. - **PR #91128** fix(qqbot): migrate group tool policy config. - **PR #91133** refactor(plugin-sdk): persist dedupe state in sqlite. - **PR #90612** fix(agents): dispatch subagent spawn in process. Thanks @lanzhi-lee. - **PR #87323** fix(infra/agents): session-routing guard for coalesced gateway restart continuations (#86742). Thanks @openperf and @songshikang0111. - **PR #91101** fix(inbound-meta): apply head+tail body truncation to ReplyChain and ReplyToBody JSON paths (fixes #91042). Thanks @zenglingbiao and @wangwllu. - **PR #91201** feat(ios): clarify talk realtime fallback. Thanks @ngutman. - **PR #91233** fix(agents): prevent ReDoS in background-session name derivation. Thanks @Takhoffman and @yetval. - **PR #90798** fix(agents): materialize sandbox skills for rw sandboxes. Related #90410. Thanks @brokemac79 and @gbb-netizen. - **PR #91248** fix: preserve live Ollama catalog metadata. Related #90315. Thanks @civiltox. - **PR #91041** fix(imessage): self-explaining private-API failures and dedicated send timeout. Thanks @omarshahine. - **PR #90029** feat: add live provider model catalog helper. Thanks @fuller-stack-dev. - **PR #90752** feat(android): add theme mode selection. Thanks @Tosko4 and @joshavant. - **PR #90261** fix: gate owner-only HTTP tools. Thanks @pgondhi987 and @joshavant. - **PR #90022** fix(codex): quarantine unreadable dynamic tools. Thanks @vincentkoc. - **PR #88822** fix(agents): compact lean local tool catalogs. Thanks @vincentkoc. - **PR #89350** fix(agents): guard prompt cache tool names. Thanks @vincentkoc. - **PR #91241** fix(outbound): preserve retries for budget-deferred deliveries. Thanks @849261680 and @Takhoffman. - **PR #91124** fix(agents): do not refresh lastUsedAt on MCP lease release. Related #91075. Thanks @openperf and @Takhoffman and @Atlas-crete. - **PR #90858** fix(imessage): gate split-send coalescing on imsg metadata. Thanks @omarshahine. - **PR #91235** fix(codex): preserve native subagent completion results. Related #91120. Thanks @849261680 and @Takhoffman and @jinon86. - **PR #91230** fix(cron): preserve isolated agent turn payload message. Related #91228. Thanks @849261680 and @Takhoffman and @AgentXaGent. - **PR #90480** feat(whatsapp): expand live QA coverage. Thanks @mcaxtr. - **PR #89712** feat(cron): support command jobs. Thanks @mbelinky. - **PR #90937** fix(gateway): preserve stale channel restart diagnostics. Related #90901. Thanks @snowzlm and @Takhoffman and @Tony-ooo. - **PR #91231** fix(anthropic): drop reasoning_content replay signatures. Related #91205. Thanks @849261680 and @Takhoffman and @bobgitmcgrath. - **PR #90897** fix #90452: Regression: Heartbeat exec completion still shows generic fallback text instead of actual output. Thanks @mushuiyu886 and @Takhoffman and @bizzle12368239. - **PR #91322** refactor: move session metadata to SQLite. - **PR #91529** Fix transcript image redaction. Related #90760. Thanks @joshavant and @devinkuhn. - **PR #91551** Fix config.patch explicit array replacement. Thanks @joshavant. - **PR #85823** fix(whatsapp): route captured replies through successor controller after restart. Thanks @itsuzef and @mcaxtr. - **PR #89659** fix(feishu): retry on send rate-limit errors (230020/230006). Related #70879. Thanks @ladygege and @marshallm-create and @sliverp and @AxelHu. - **PR #91547** Fix Docker store seed target packages. Related #91035. Thanks @sallyom and @laurenceputra. - **PR #91423** feat(qqbot): add /bot-group-allways command to toggle mention requirement. Thanks @cxyhhhhh. ## 2026.6.2 ### Highlights - **Governed plugin and skill installs:** the old dangerous-code scanner gives way to an operator install policy with clearer doctor, CLI, ClawHub, package, archive, source, upload, and marketplace recovery paths. (#89516) Thanks @joshavant and @vincentkoc. - **Safer channel delivery:** Telegram, Feishu, Discord, WhatsApp, and outbound sends now handle transcript mirroring, streamed finals, admin writeback, approval allowlists, poll modifiers, and setup state without corrupting delivery. (#88973, #89626, #89812, #89035, #89814, #89813, #89601) Thanks @pgondhi987, @Petru2224, @zhangguiping-xydt, @ppmuzyk, @codezz, @takhoffman, @vincentkoc, @harjothkhara, @obviyus, @glenn-agent, @kesslerio, and @leiJack-lo. - **Steadier chat and operator UI:** visible stream text, completed sends, Workboard keyboard navigation, dialog accessibility, lazy usage views, and Android companion flows retain their state through normal interaction. (#89801, #89777) Thanks @vincentkoc. - **Stricter safety checks:** config, policy, shell snapshots, exec prechecks, script limits, and Gateway startup reject malformed or unsafe input before it becomes runtime state. (#89701, #87074, #81488, #87056, #89480) Thanks @RomneyDa, @giodl73-repo, @mmaps, @drobison00, @vincentkoc, and @q1387154-spec. - **More reliable Gateway and model sessions:** session locks, abandoned Codex startup, ACP handoffs, custom-provider fanout, provider aliases, prompt caching, and memory checks recover without leaving a run wedged. (#89811, #89244) Thanks @RomneyDa, @takhoffman, @spencer2211, and @vincentkoc. ### Changes - Plugins/security: replace dangerous-code scanner enforcement with operator install policy, install-policy context, doctor checks, install/update CLI wiring, ClawHub metadata paths, and package/archive/source/upload lifecycle coverage. (#89516) Thanks @joshavant and @vincentkoc. - Policy: add data-handling conformance checks and reject unsupported policy keys. (#87056, #87074) Thanks @giodl73-repo. - Telegram/channels: show commentary and reasoning in progress drafts, share progress draft compositors across channel plugins, and keep Telegram polling stop/reset boundaries cheaper and more reliable. - UI/mobile: add Workboard keyboard movement controls, tighten Workboard card operations, and improve Android companion-first shell UX. Thanks @vincentkoc. ### Fixes - Channels/outbound: keep channel sends durable when transcript mirroring fails, stop schema-padded poll modifiers from blocking normal sends, preserve WebChat `sessions_send` handoffs, preserve Discord channel-label suppression while hiding internal agent failure traces, match Discord libopus error shapes, and sanitize Discord tool progress scaffolding. (#89626, #89812, #89601) Thanks @Petru2224, @codezz, @takhoffman, @harjothkhara, and @vincentkoc. - Telegram/Feishu: require admin rights for Telegram target writeback, keep Telegram DM exec approval allowlists working with `ask:off`, prevent Telegram preview duplication across streaming modes, isolate verbose status after streamed finals, cancel clean restart stop timers, slow polling restart storms, and wire Feishu setup runtime setters. (#88973, #89035, #89813, #89814) Thanks @pgondhi987, @zhangguiping-xydt, @ppmuzyk, @takhoffman, @vincentkoc, @obviyus, @kesslerio, @glenn-agent, and @leiJack-lo. - Feishu: preserve full streaming card content by sending the merged text on each update instead of only the latest delta, so card readers see complete output when intermediate frames are missed. (#90181) Thanks @mushuiyu886. - Chat/UI/Gateway: preserve visible chat stream text, clear stale stream buffers before terminal commits, reconcile completed sends, scroll pending sends into view, harden Workboard dialog accessibility, stabilize WebChat prompt-cache affinity, overlap chat catalog startup, render chat history incrementally, lazy-load usage dashboard, and report gateway health auth diagnostics. (#89337) Thanks @RomneyDa and @vincentkoc. - Agents/Codex/providers/models: release session write locks when prompt-release fence reads fail, retire abandoned Codex app-server startups, keep stream-to-parent ACP spawns registered, close Codex startup clients on timeout, recover bundled provider aliases, avoid custom-provider runtime fanout, preserve provider prompt-cache boundaries, forward Gemini stop sequences, and strip Kimi-incompatible Anthropic cache markers. (#89811) Thanks @takhoffman, @spencer2211, and @vincentkoc. - Memory/build/update: warn after startup watcher pressure checks, externalize optional Baileys image backends, restore and pin Canvas A2UI compatibility assets, keep plugin repair fetch failures nonblocking, restore Skill Workshop view switching, and keep the current chat toggle active after awaited session switches. (#89244) Thanks @RomneyDa and @vincentkoc. - Plugins/auth: keep Hermes migration reports pointed at SQLite auth-profile stores. - Plugins/CLI: avoid importing the runtime plugin loader only to clear in-process caches after short-lived plugin install, enable, disable, update, and uninstall commands refresh registry metadata. - Security/config/tooling: reject corrupt shell snapshots, suspicious gateway startup configs, malformed numeric limits, oversized audit responses, unsafe exec precheck env, and invalid pending-agent SQLite scaffold denials. (#89701, #89705, #89480, #81488) Thanks @RomneyDa, @mmaps, @drobison00, @vincentkoc, and @q1387154-spec. ### Complete contribution record This audited record covers the complete v2026.6.1..v2026.6.2-beta.1 history: 57 merged PRs. The generation manifest also supplies direct commits as editorial input; the grouped notes above prioritize user impact. #### Pull requests - **PR #88922** fix(google): forward stop sequences to Gemini generationConfig. Thanks @coder999999999. - **PR #89460** fix(models): preserve provider prompt cache boundaries. Related #89386. Thanks @Enominera. - **PR #89478** fix: restore Skill Workshop view switcher. Thanks @shakkernerd. - **PR #76741** fix(kimi): strip anthropic cache markers. Related #76612. Thanks @BryanTegomoh and @vliuyt. - **PR #89480** fix: recover suspicious gateway startup configs. Related #89331. Thanks @q1387154-spec. - **PR #87056** Policy: add data handling conformance checks. Thanks @giodl73-repo. - **PR #81488** Harden node exec approval precheck env [AI]. Thanks @mmaps and @drobison00. - **PR #89356** Add accessible Workboard movement controls. Thanks @BunsDev. - **PR #87074** fix(policy): reject unsupported policy keys. Thanks @giodl73-repo. - **PR #89601** fix(outbound): stop schema-padded poll modifiers from blocking send. Thanks @codezz and @Takhoffman. - **PR #88963** perf(telegram): avoid broad reset-boundary scan. Thanks @MonkeyLeeT. - **PR #89125** Suppress internal agent failure traces before channel delivery. Thanks @fuller-stack-dev. - **PR #89701** fix(exec): reject corrupt shell snapshots. Thanks @RomneyDa. - **PR #89705** fix: allowlist pending agent sqlite scaffold. Thanks @RomneyDa. - **PR #89704** Share channel progress draft compositor. Thanks @obviyus. - **PR #89708** perf(control-ui): coalesce chat metadata startup. Thanks @vincentkoc. - **PR #89337** fix: report gateway health auth diagnostics. Related #89711. Thanks @RomneyDa. - **PR #88685** Render dashboard chat history incrementally. Related #87345. Thanks @alexzhu0 and @2xmncvcx92-dotcom. - **PR #89740** fix(gateway): stabilize webchat prompt cache affinity. Related #89139. Thanks @vincentkoc and @Enominera. - **PR #89191** fix(webchat): show sessions_send handoffs as forwarded. Related #89161. Thanks @849261680 and @Xj49688-lgtm. - **PR #89723** fix(auto-reply): surface fatal channel errors. Thanks @fuller-stack-dev. - **PR #89727** fix #87699: [Bug]: [BUG] UI shows agent "running" after conversation ends — requires manual page refresh every time. Thanks @zhangguiping-xydt and @csck-luoy. - **PR #88786** fix #71992: [Bug]: Control UI webchat duplicates every assistant reply on 2026.4.21 — regression from #5964/#39469. Thanks @zhangguiping-xydt and @rzhnrhjr6j-cloud and @astoreyai and @kAIborg24. - **PR #89530** fix(ui): preserve visible chat stream text. Related #67035. Thanks @osolmaz and @q7793527. - **PR #87072** feat(telegram): opt-in interleaved progress lane. Thanks @anagnorisis2peripeteia. - **PR #89771** perf(ui): start chat refresh before bootstrap. Thanks @vincentkoc. - **PR #89777** perf(ui): label delayed chat sends in telemetry. Thanks @vincentkoc. - **PR #89786** perf(gateway): overlap chat catalog startup. Thanks @vincentkoc. - **PR #89793** test(ui): cover control chat send timing phases. Thanks @vincentkoc. - **PR #89801** perf(ui): surface chat ACK server timing. Thanks @vincentkoc. - **PR #89355** Harden Workboard modal and drawer accessibility. Thanks @BunsDev. - **PR #89802** docs(web): document chat ACK timing metadata. Thanks @vincentkoc. - **PR #89391** fix(android): improve companion-first shell UX. Thanks @Tosko4. - **PR #89811** fix(agents): release session write lock if fence read throws on prompt release. Thanks @Takhoffman and @spencer2211. - **PR #89808** perf(ui): trace chat send server milestones. Thanks @vincentkoc. - **PR #89813** fix(telegram): isolate verbose status after streamed finals. Related #89540. Thanks @Takhoffman and @kesslerio. - **PR #89814** fix(feishu): wire setup runtime setter. Related #88024. Thanks @Takhoffman and @glenn-agent and @leiJack-lo. - **PR #85961** fix #85807: retain Telegram preview after generation race. Thanks @zhangguiping-xydt and @samson1357924. - **PR #89035** fix #88773: [Bug]: Telegram DM exec requires approval despite allowlist + ask:off — works in webchat, not in Telegram. Thanks @zhangguiping-xydt and @obviyus and @ppmuzyk. - **PR #88634** fix(telegram): prevent preview duplication in partial and block streaming modes. Related #87624. Thanks @jmao0001 and @tuckyapps. - **PR #89812** fix(outbound): keep channel send durable when transcript mirror fails (#89626). Thanks @Takhoffman and @harjothkhara and @Petru2224. - **PR #88973** fix(telegram): require admin for target writeback [AI]. Thanks @pgondhi987 and @vincentkoc. - **PR #89449** refactor(gateway): share duplicated test helpers. Thanks @vincentkoc. - **PR #88832** fix(telegram): slow polling restart storms. Thanks @TurboTheTurtle. - **PR #89960** test(channels): fix guardrail regex lint. Thanks @RomneyDa. - **PR #89244** fix(memory): warn after startup watcher pressure check. Thanks @RomneyDa. - **PR #89516** Add operator install policy and remove dangerous-code install scanners. Thanks @joshavant. - **PR #90024** chore(release): update appcast for 2026.6.1. - **PR #89613** docs: document auth profile failure policy contract. - **PR #89548** fix(agents): classify read-only shell commands as non-mutating. Thanks @Glucksberg. - **PR #89939** fix: keep stream-to-parent spawns registered. Thanks @scotthuang. - **PR #88964** fix(agents): repair context-engine tool-result pairing. Related #88561. Thanks @MonkeyLeeT and @Finn-jiejie. - **PR #82219** fix(codex): accept first-party OpenAI plugin marketplaces (bundled and primary-runtime). Related #82216. Thanks @yaanfpv. - **PR #89998** revert(codex): revert first-party marketplace allowlist. Thanks @kevinslin. - **PR #89176** fix(browser): honor tab timeout for Chrome MCP. Related #88213. Thanks @MonkeyLeeT and @lamkan0210. - **PR #90043** fix: restore Skill Workshop current chat toggle. Thanks @shakkernerd. - **PR #81422** fix(update): surface plugin channel fallbacks. Thanks @BKF-Gitty. ## 2026.6.1 ### Highlights - **Resilient agent and Codex runs:** interrupted tool calls, stale session bindings, compaction handoffs, auth-profile failover, reasoning-tag cleanup, yielded subagents, and generated-media delivery all recover without leaving work stranded. (#85798, #87484, #88182, #89220) Thanks @RomneyDa, @neeravmakwana, @joshavant, @omarshahine, @vincentkoc, @bgmbgm94, and @ksiyuna-claw. - **Reliable channel and mobile delivery:** WhatsApp, iMessage, Discord state, QQBot, and iOS Talk now preserve replies, typing, session state, QR-login recovery, and realtime connections across normal restart and transport failure paths. (#88183, #88866, #88948, #89015, #88231) Thanks @mcaxtr, @omarshahine, @sliverp, @Jensenwgd, @ngutman, @vincentkoc, and @alfredjbclaw. - **Faster Control UI chat:** startup, local drafts, incremental stream rendering, transcript caching, first connect, and post-send cleanup no longer compete with the active conversation. (#88952, #88960, #88998, #89030, #89106) Thanks @vincentkoc and @sallyom. - **Governed skills and plugins:** Skill Workshop proposals, disabled-skill snapshots, support-file approvals, plugin contracts, and external package boundaries are clearer and safer for operators. (#79173, #82326, #89336) Thanks @zeus1959, @sallyom, @RomneyDa, @maverikva, @vincentkoc, and @shakkernerd. - **Richer operator coordination:** Workboard goals, task-backed runs, and SQLite-backed plugin state make multi-agent work and installed-plugin discovery survive reloads cleanly. (#87469, #88794) Thanks @vincentkoc. - **More dependable providers:** Google defaults, provider IDs, model catalogs, OAuth/device-code flows, media timers, and reasoning output now stay valid across hosted and local runtimes. (#88512, #88781, #89343, #89379, #89400) Thanks @1052326311, @charles-openclaw, @zz327455573, @849261680, @xzh-xydt, @azgardtek, @google, @mrbrl, @nyuDSA, @vincentkoc, and @cjalden. ### Changes - Skills: let the `skill_workshop` agent tool apply, reject, and quarantine explicit proposals through the guarded review flow. Thanks @shakkernerd and @vincentkoc. - Skills: let proposals carry approved support files under standard skill folders, with scanner, hash, and rollback safeguards. Thanks @shakkernerd and @vincentkoc. - Skills: let pending proposals be revised in place with versioned, dated proposal frontmatter before approval. Thanks @shakkernerd. - Skills: add Skill Workshop with pending proposals, CLI/Gateway review actions, rollback metadata, and the `skill_workshop` agent tool. Thanks @shakkernerd and @vincentkoc. - Skill Workshop: add the Control UI navigation, styled dashboard, proposal today view, revision dialog, file preview modal, searchable preview files, reusable session handoff, and localized strings. Thanks @vincentkoc and @shakkernerd. - Plugins: externalize Tokenjuice as the official `@openclaw/tokenjuice` plugin with npm and ClawHub publish metadata. - Plugins: externalize the GitHub Copilot agent runtime as the official `@openclaw/copilot` plugin with npm and ClawHub publish metadata. - iOS: add hosted push relay defaults, realtime Talk playback, and a guarded WebSocket ping path for more reliable mobile sessions. (#88096, #88105, #88231) Thanks @ngutman. - iOS: support native iPad display layouts. - Android: add installed-app inspection commands, notification picker helpers, and updated-system-app classification. - Workboard: add orchestration primitives and agent coordination tools for multi-agent planning and run tracking. (#87469) - Workboard: wire task-backed board runs and show task comments in the edit modal. - Code mode: add internal namespaces for scoped agent/global sessions and exact namespace tool dispatch. (#88043) - Gateway: support Tailscale Serve service names for local service routing. - Control UI: add a Dreaming-tab agent selector and propagate the selected agent through Dreaming status, diary, and diary actions. (#78748) Thanks @stevenepalmer, @vincentkoc, and @ttomiczek. - Control UI: add calmer chat composer controls, local draft typing state, and first-output latency instrumentation for active chat entry. (#88772, #88998) Thanks @vincentkoc. - Plugins: add a SecretRef provider integration manifest contract. (#82326) Thanks @sallyom. - Plugin SDK: add typed presentation command actions and the bounded `resolve_exec_env` hook for plugin-provided exec environment contributions. (#88721) Thanks @vincentkoc. - Plugins: persist the plugin install index in SQLite so installed package lookup survives reloads with less filesystem scanning. (#88794) Thanks @vincentkoc. - Providers: add MiniMax M3 model support. (#88860) - Tools/media: allow validated host-local text document media sends while keeping unsafe plain-text media sends blocked. (#79658) Thanks @simplyclever914. - Doctor: add disk space health checks and stabilize post-upgrade JSON probes. Thanks @vincentkoc. - Channels: store inbound queues in SQLite and migrate iMessage monitor state to SQLite-backed tracking. (#88797) Thanks @vincentkoc. - Skills: add the core skills index and centralize skills runtime loading, status, filtering, and prompt formatting. Thanks @shakkernerd. ### Fixes - Build: render independent CLI startup metadata help snapshots concurrently to cut cold build-all metadata time. - Plugins: stop timed-out package-boundary prep steps by process group so descendant TypeScript/helper processes do not survive local check cleanup. Thanks @vincentkoc. - Control UI: serve static assets asynchronously after safe-open checks so large UI files do not block Gateway request handling. Thanks @vincentkoc. - Scripts/UI: forward direct wrapper SIGHUP shutdown to child processes so terminal hangups do not leave wrapped dev commands running. Thanks @vincentkoc. - Gateway: return the post-expiration pending-work revision from node drains so reconnecting nodes do not observe stale queue revisions after expired items are pruned. Thanks @vincentkoc. - Update: keep core updates nonblocking when missing external plugin repair downloads or soft plugin repair warnings would otherwise stall, pin post-core plugin compatibility to the downgraded core version, and still block installed active plugin payload smoke failures. (#84431, #87914, #87952) Thanks @TurboTheTurtle, @Niriakot, @MukundaKatta, @giodl73-repo, @vincentkoc, and @davinci282828. - Agents/providers: keep streaming tool-call argument parsing record-shaped when providers emit valid non-object JSON such as `null` or arrays. Thanks @vincentkoc. - Talk: preserve explicit `null` payloads on controller-created turn and output-audio lifecycle events. Thanks @vincentkoc. - Agents/TUI: keep local custom provider runs from loading plugin runtime and auth alias metadata when plugins are disabled. - Agents/TUI: restore in-flight TUI run switch-back behavior, keep no-policy native hook fallback available, guard vanished workspaces, and keep lightweight isolated subagents lightweight. - Agents/media: keep async image, music, and video generation starts from ending the Codex turn, avoid duplicate generated-media fallbacks, and let mixed requests continue with summaries or other work while media renders in the background. (#89220) Thanks @omarshahine. - Agents/Codex: keep public OpenAI API-key profiles from being treated as native Codex app-server auth while preserving persisted Codex OAuth sessions. Thanks @vincentkoc. - Agents/Codex: stream Codex app-server final-answer partials to live reply previews, preserve ACP metadata in SQLite, prefer real tool results over synthetic repair output, prevent aborted app-server turn handles from lingering, migrate legacy OpenAI Codex `lastGood` auth state, and preserve workspace/session metadata through ACP runtime refactors. (#88405, #88724, #88730) Thanks @vincentkoc and @crash2kx. - Control UI: keep collapsed tool cards labeled with the tool name and action instead of generic output text. Thanks @shakkernerd and @vincentkoc. - Agents/Codex: surface Skill Workshop guidance in Codex app-server prompts when `skill_workshop` is available. Thanks @shakkernerd and @vincentkoc. - Skill Workshop: restore and localize the Control UI board/today view switcher so review workflows keep their intended layout toggle across locales. Thanks @shakkernerd and @vincentkoc. - Agents/auth: write auth profiles atomically, dispatch auth failures by type, add force re-login and exhausted-failover recovery, clear legacy auto fallback pins, preserve workspaces during state-only uninstall, and compact before oversized turns so recovery paths avoid partial state. (#85798, #87484, #89181) Thanks @RomneyDa, @neeravmakwana, @vincentkoc, and @bgmbgm94. - Skills: skip disabled skill env overrides from stale persisted snapshots so disabled skill `apiKey` SecretRefs cannot abort embedded or channel turns. (#79072, #79173) Thanks @zeus1959, @maverikva, and @shakkernerd. - Skill Workshop: render the Control UI tab from filtered navigation state and keep filtered fallback routing stable. Thanks @vincentkoc and @shakkernerd. - CLI: avoid live catalog validation during `openclaw agents add`, so adding a secondary agent no longer depends on provider catalog availability. (#76284, #88314) Thanks @zhangguiping-xydt and @RicardoUKMX. - CLI: harden CLI and plugin edge cases, and keep `plugins list --json` on the snapshot-only path so plugin sweeps avoid loading the full runtime status graph. (#88896) Thanks @vincentkoc. - CLI/desktop: bridge WSL clipboard operations through the shell, recognize manual-update launchd jobs, and keep machine-readable startup output parseable during progress setup. (#88764, #88689) Thanks @alexzhu0, @TurboTheTurtle, @toruvieI, and @deonkretch. - Plugins: make PixVerse external-plugin ClawHub metadata explicit and keep it out of bundled dist builds. Thanks @vincentkoc. - Plugins: clarify plugin loader failure guidance and treat soft plugin repair warnings as nonfatal so missing or incompatible plugin packages point operators at the right repair path without blocking unrelated work. (#84431) Thanks @TurboTheTurtle and @davinci282828. - Plugins: preserve npm plugin roots after blocked installs, skip plugin-local `openclaw` peer symlinks during rollback snapshots, relink those peers after restore, isolate cached tool runtime siblings, isolate provider catalog projections and web-provider factory failures, and keep private LLM-core declarations bundled so one bad plugin does not poison sibling runtime paths. (#77237, #88767, #88807, #89336) Thanks @vincentkoc, @RomneyDa, and @zhuisDEV. - Cron: keep SQLite cron migrations compatible with legacy run-log tables, archived job stores, diagnostic cron names, single-job run-history names, startup cron retries, and legacy one-shot delete-after-run behavior. (#88285, #88294, #89075) Thanks @kip-claw, @Takhoffman, @bennewell35, and @highfly-hi. - Cron: keep update delivery validation scoped, harden restart state, and retire MCP runtimes on isolated cron cleanup. Thanks @vincentkoc. - Auto-reply: guard dispatcher failure-count probes so missing optional counters do not break SDK-typed recovery paths. (#89318) Thanks @Alix-007, @takhoffman, and @Bigzhangbig. - Memory: serialize QMD update/embed writes per store, reduce Linux watcher fan-out, avoid noisy gateway watcher warnings, retry transient FileProvider-backed reads, preserve phase signals on read errors, harden envelope metadata sanitization, reattach Linux native watchers when directories are recreated, and rewrite generated transcript paths on rollover so memory/search state survives concurrent gateway and CLI activity. (#66339, #85931, #89185, #89188, #89246, #85351) Thanks @openperf, @amittell, @RomneyDa, @NianJiuZst, @SakenW, @vincentkoc, @chrisabad, and @richardmqq. - Memory: keep vector-disabled FTS indexes from resolving embedding providers during sync and search. Thanks @vincentkoc. - Providers: bound generated media downloads from OpenAI, Runway, xAI, MiniMax, BytePlus, DashScope-compatible, FAL, OpenRouter, Google, Vydra, and Comfy providers. Thanks @vincentkoc. - Providers: resolve Google defaults to `google-generative-ai`, register Vertex static catalog rows and `gemini-3.1-flash-lite`, align Foundry reasoning metadata, skip DeepSeek V4 thinking params on Foundry fallback, use MiniMax account OAuth endpoints, preserve Copilot Claude 1M capabilities, suppress disabled Ollama reasoning output, forward Gemini stop sequences, switch direct Gemini reasoning to native mode, strip provider self-prefixes and Kimi-incompatible Anthropic cache markers, keep OpenAI stop-finished tool calls, and avoid replay ids when the Responses store is disabled. (#88480, #88512, #88781, #89343, #89379, #89400, #76612) Thanks @coder999999999, @BryanTegomoh, @vliuyt, @charles-openclaw, @zz327455573, @849261680, @XuZehan-iCenter, @azgardtek, @1052326311, @google, @mrbrl, @xzh-xydt, @nyuDSA, @vincentkoc, and @cjalden. - Providers: cap GitHub Copilot OAuth request timeouts before creating abort signals. - Cron: retry recurring jobs after transient model rate limits before waiting for the next scheduled slot. - Agents/Codex: keep live session locks during cleanup, recover interrupted CLI tool transcripts, preserve Codex auth and compaction session identity, clear orphan tool state, cap app-server idle timers, and keep media completion delivery retryable. (#88129, #88136, #88141, #88162, #88182) Thanks @joshavant, @vincentkoc, @ssdatye, and @ksiyuna-claw. - Chat/UI: show Gateway chat failures as visible assistant messages in the Control UI instead of only setting an invisible error state. Thanks @vincentkoc. - Channels: cap Telegram, Discord, WhatsApp, Signal, Feishu, Google Chat, Microsoft Teams, QQBot, Nostr, Zalo, Zalouser, and Nextcloud-style request/retry timers; preserve SMS approval reply routes; keep iMessage typing active during tool work; allow RFC2544 benchmark ranges for QQBot token fetches; and retry WhatsApp QR login 408 timeouts. (#88183, #88948, #88984, #89015) Thanks @omarshahine, @Jensenwgd, @sliverp, @mcaxtr, @vincentkoc, and @alfredjbclaw. - Security/config parsing: reject unsafe OAuth/token lifetimes, retry-after delays, inbound timestamps, response body sizes, command timeout config, sandbox observer token TTLs, corrupt shell snapshots, untrusted workspace setup-only channel loads, remote media reference overreads, trajectory export leaks, hooks-token auth reuse, and gateway WebSocket calls after close. (#86953, #87376, #88974, #89354, #89701) Thanks @hxy91819, @coygeek, @pgondhi987, @RomneyDa, @SebTardif, and @vincentkoc. - Providers/media: cap local service, model, usage, queue, generated media, TTS, music, workflow polling, and provider OAuth request timers across hosted and local providers. - Backup: accept root-relative hardlink targets during backup verification. (#89328) Thanks @abnershang. - Agents: keep configured fallback model metadata typed so provider params, context-token caps, and media input limits do not break changed-gate typechecks. - Agents: accept hidden `sessions_send` body aliases before validation while keeping the model-facing `message` schema canonical. (#88229) Thanks @zhangguiping-xydt and @jsonmez. - Chat/UI: preserve startup chat sends during history loading, unblock the initial Control UI chat send, stream chat deltas incrementally, skip markdown parsing while streaming, keep drafts local while typing, guard composer rerenders, cache chat transcript renders, record pending-send paint timing, show the Communication Notifications tab, and honor Chromium executable overrides. (#74715, #88952, #88960, #88998) Thanks @VladyslavLevchuk and @vincentkoc. - Channels: stop schema-padded poll modifiers from turning normal `send` actions into invalid poll sends. (#89601) Thanks @codezz and @takhoffman. - Channels: preserve long Feishu streaming replies, recover failed progress draft starts, send visible fallbacks when accepted Feishu turns produce no final reply, preserve external `sessions_send` routes, persist Discord thread bindings in SQLite, tolerate iMessage self-chat timestamp skew, preserve colon-prefixed slash commands in mention parsing, decode Nostr `npub` allowlists correctly, and suppress raw provider errors during channel delivery. (#87896, #88749, #88803, #88866) Thanks @MonkeyLeeT, @ArthurNie, @vincentkoc, @SebTardif, and @Lvan185. - Config/status/doctor: skip unresolved shell references in state-dir dotenv files, resolve gateway auth secrets during deep status audits, respect explicit PI runtime policy, report runtime tool-schema and gateway health credential errors, clear recovered embedded-run activity, and keep post-upgrade JSON stable. (#88820, #88288, #89731) Thanks @openperf, @RomneyDa, @Alix-007, @vincentkoc, @Iman-Sharif, and @mathias15010. - Gateway/session state: list commands from the Gateway plugin registry, harden MCP loopback tool schemas, hide phantom agent-store rows from `sessions.list`, make task persistence failures explicit, support Tailscale Serve service names, guard Browser/Chrome pending attach aborts, and carry session UUIDs on interactive dispatch events. (#88305) Thanks @rohitjavvadi and @vincentkoc. - Gateway/plugins: narrow plugin lookup memoization to the stable plugin/runtime inputs, avoiding repeated lookup work without mixing disabled or filtered plugin state. Thanks @vincentkoc. - OpenAI/TTS: handle speed directives for OpenAI TTS voices. (#74089) Thanks @stainlu, @useramuser, and @vincentkoc. - Performance: prebuild QA runtime probes with generated plugin assets but without CLI startup metadata. - Performance: skip declaration bundling for runtime-only CLI startup and gateway watch build profiles. Thanks @vincentkoc. - Performance: reuse prepared provider handles, strict tool schemas, gateway runtime metadata, session maintenance config, plugin metadata, bundled skill allowlists, package-local plugin artifacts, single-entry store writes, and validated/serialized session prompt blobs. Thanks @vincentkoc and @shakkernerd. ### Complete contribution record This audited record covers the complete v2026.5.31-beta.4..v2026.6.1 history: 115 merged PRs. The generation manifest also supplies direct commits as editorial input; the grouped notes above prioritize user impact. #### Pull requests - **PR #88995** perf(ui): guard chat composer controls. Thanks @vincentkoc. - **PR #88998** perf(ui): keep chat draft local while typing. Thanks @vincentkoc. - **PR #89012** perf(ui): trace chat first output latency. Thanks @vincentkoc. - **PR #89019** perf(ui): speed up first global chat sends. Thanks @vincentkoc. - **PR #86953** fix(plugins): block untrusted workspace setup-only channel loads. Thanks @hxy91819 and @SebTardif. - **PR #89030** perf(control-ui): prioritize first connect startup. Thanks @vincentkoc. - **PR #89058** perf(control-ui): hydrate chat startup state. Thanks @vincentkoc. - **PR #89106** fix(ui): clear chat composer after send. Related #89108. Thanks @sallyom. - **PR #88974** fix: bound remote media reference reads [AI]. Thanks @pgondhi987. - **PR #88966** fix: allow admins to approve dependency guard. Thanks @RomneyDa. - **PR #89169** fix(ci): restore dist cache before artifact builds. Thanks @RomneyDa. - **PR #85798** fix(agents): actionable copy for exhausted auth-profile failover. Thanks @RomneyDa. - **PR #88689** Keep JSON CLI output clean during startup. Related #88602. Thanks @alexzhu0 and @toruvieI. - **PR #85351** fix(memory): retry transient FileProvider-backed reads. Related #85252. Thanks @NianJiuZst and @richardmqq. - **PR #89188** fix(memory-core): reduce Linux watcher fan-out. Related #89182. Thanks @RomneyDa. - **PR #88734** docs: refresh ClawHub showcase cards. Thanks @vyctorbrzezowski. - **PR #89212** test: reset gateway timers at test boundaries. Thanks @RomneyDa. - **PR #89181** fix(agents): dispatch auth failures by type. Thanks @RomneyDa. - **PR #89180** enhance(slack): route plugin approvals through native UI. Thanks @kevinslin. - **PR #89185** fix(memory): warn on gateway watcher FD risk. Related #71335. Thanks @RomneyDa and @chrisabad. - **PR #89135** fix(ui): render skill workshop tab. Thanks @Solvely-Colin. - **PR #89246** Revert "fix(memory): warn on gateway watcher FD risk". Thanks @RomneyDa. - **PR #88948** Keep iMessage typing active during tool work. Related #75847. Thanks @omarshahine and @alfredjbclaw. - **PR #89220** fix(agents): avoid duplicate generated media fallback. Thanks @omarshahine. - **PR #88946** Fix live model inference edge cases. Related #44870, #63685, #74305, #83192, #83810, #84109, #84688, #84697, #84804, #85806, #85918, #86808, #87381, #87740, #87768, #88039, #88439, #88456, #88833, #88918, #89008, #89241, #89242. Thanks @86jkuncle and @behroozbc and @SimSef and @tassiocamara and @chac4l and @alfredpennyworthtc-netizen and @shichuzhu and @mz1009-web and @devinallen-07 and @garyd9 and @silvesterxm and @jsompis and @xiaoxuesheng123467 and @TitanBob2026 and @guzzijones and @fenglanhua and @Nassiel and @ge0el and @pigfoot and @yetval and @joshgaskin and @shadow-enthusiast. - **PR #89305** fix(agents): bypass stale auth for plugin harnesses. Related #85105. Thanks @saphoroth. - **PR #89297** docs: add ClawHub CLI page. Thanks @Wang-Yeah623 and @Takhoffman. - **PR #89318** fix(auto-reply): guard missing dispatcher getFailedCounts without weakening the SDK type. Related #89116. Thanks @Takhoffman and @Alix-007 and @Bigzhangbig. - **PR #89321** fix: honor channel model overrides in agent ingress. Related #60078. Thanks @davidbordenwi. - **PR #89328** Fix backup verifier for root-relative hardlink targets. Thanks @abnershang. - **PR #87907** fix(memory): validate memory index identity. Related #83333. Thanks @osolmaz and @jacka-L. - **PR #89347** fix: repair model provider edge cases. Related #80347, #88357, #45269. Thanks @wherewolf87 and @bottenbenny and @Alfred-claw28. - **PR #89336** Fix private llm-core leaks in plugin SDK declarations. Thanks @RomneyDa. - **PR #89015** fix(qqbot): allow RFC2544 benchmark range for token fetch (#88984). Thanks @sliverp and @Jensenwgd. - **PR #89046** feat(android): add installed apps node command. Thanks @Tosko4. - **PR #88315** feat(agents): generalized native compaction ownership for CLI backends. Thanks @anagnorisis2peripeteia. - **PR #89075** fix(memory-core): keep startup cron retries quiet. Related #75889. Thanks @Takhoffman and @bennewell35 and @highfly-hi. - **PR #89049** fix(idle-timeout): honor provider timeout for no-timeout runs. Thanks @lanzhi-lee. - **PR #89047** fix: hide sessions_spawn timeout overrides. Thanks @lanzhi-lee. - **PR #89036** fix(cron): reject blank delivery targets. Thanks @lanzhi-lee. - **PR #89354** fix: redact trajectory exports consistently. Thanks @pgondhi987. - **PR #88101** fix(codex): trace app-server thread lifecycle timing. Related #84640. Thanks @ai-hpc and @crash2kx. - **PR #89243** fix: guard in-band macOS LaunchAgent stop. Related #89174. Thanks @bek91. - **PR #87339** fix(discord): accumulate reasoning progress deltas. Related #83983. Thanks @giodl73-repo and @xueqingli1. - **PR #89298** fix(diagnostics): re-queue pending messages after stuck-session recovery aborts ghost run. Related #89208. Thanks @LiLan0125 and @ketos-jona. - **PR #88821** trace: Correlate channel message diagnostics into one trace. Related #88811. Thanks @bek91. - **PR #89411** fix: detect shrinkwrapped npm installs. Related #87732. Thanks @jasonftl. - **PR #87749** fix(messages): preserve inbound audio for message-tool TTS. Related #87708. Thanks @ai-hpc and @nikodim-ai. - **PR #84431** Treat soft plugin repair warnings as nonfatal. Related #83889. Thanks @TurboTheTurtle and @davinci282828. - **PR #78005** feat(status): detect externalized plugin version drift in --deep. Thanks @hussein1362. - **PR #89050** fix(sessions): preserve corrupt-header transcripts. Related #89037. Thanks @charles-openclaw and @yetval. - **PR #84314** fix: QQBot credential backups bypass gateway state isolation. Related #84313. Thanks @coygeek. - **PR #89281** fix: repeat doctor state migration repairs. Thanks @RomneyDa. - **PR #87952** fix(update): pin post-core plugin compatibility to the downgraded core version (#87914). Thanks @MukundaKatta and @giodl73-repo and @Niriakot. - **PR #89417** refactor: tighten agent harness surfaces. - **PR #89400** fix(google): add missing gemini-3.1-flash-lite to google-vertex catalog. Related #89390. Thanks @xzh-xydt and @nyuDSA. - **PR #88699** fix(codex): clear stale context-engine projection after overflow retry. Related #88355. Thanks @SebTardif and @100yenadmin. - **PR #89379** fix(providers): use native reasoning mode for Gemini instead of tagged. Related #69220. Thanks @849261680 and @mrbrl. - **PR #84266** Surface unresolved OAuth sidecar auth failures. Related #84252. Thanks @TurboTheTurtle. - **PR #88879** feat(plugin-sdk): add resolve_exec_env hook. Thanks @lanzhi-lee. - **PR #89432** fix(qqbot): migrate state stores to sqlite kv. - **PR #89436** fix(llm): gate OpenAI-compatible reasoning output. Thanks @zz327455573. - **PR #87703** fix(agents): run before_agent_finalize for embedded agents. Related #87585. Thanks @ai-hpc and @lileilei-camera. - **PR #89440** fix(llm): keep OpenAI-compatible reasoning streams active. Related #84384. Thanks @teknolojay. - **PR #88976** fix(mistral): enable prompt cache key compat. Related #83709. Thanks @Alix-007 and @Net-Sentinel. - **PR #87379** fix: audit and repair hooks token reuse with Gateway auth. Related #87376. Thanks @coygeek. - **PR #89701** fix(exec): reject corrupt shell snapshots. Thanks @RomneyDa. - **PR #89601** fix(outbound): stop schema-padded poll modifiers from blocking send. Thanks @codezz and @Takhoffman. - **PR #89731** fix: backport gateway health credential handling. Thanks @RomneyDa. - **PR #87484** fix(agents): clear legacy auto fallback pins. Related #87467. Thanks @neeravmakwana and @bgmbgm94. - **PR #88182** Fix subagent DM completion delivery after yield. Related #88042. Thanks @joshavant and @ksiyuna-claw. - **PR #88183** fix(whatsapp): retry QR login 408 timeouts. Thanks @mcaxtr. - **PR #88866** Persist Discord thread bindings in SQLite. - **PR #88231** fix(ios): guard websocket ping continuation. Thanks @ngutman. - **PR #88952** perf(ui): cache chat transcript renders. Thanks @vincentkoc. - **PR #88960** perf(ui): record pending send paint timing. Thanks @vincentkoc. - **PR #79173** fix: skip disabled skill snapshot env overrides. Related #79072. Thanks @zeus1959 and @maverikva. - **PR #82326** Add plugin manifest contract for SecretRef provider integrations. Thanks @sallyom. - **PR #87469** feat: add core session goals. - **PR #88794** Persist plugin install index in SQLite. - **PR #88512** fix: resolve google provider default API to google-generative-ai. Related #88480. Thanks @1052326311 and @azgardtek. - **PR #88781** fix(models): strip remaining provider self prefixes. Related #88770. Thanks @charles-openclaw and @cjalden. - **PR #88096** feat(ios): default to hosted push relay. Thanks @ngutman. - **PR #88105** feat(ios): add talk tab realtime playback. Thanks @ngutman. - **PR #88043** feat: add internal code mode namespaces. - **PR #78748** fix(ui): add agent selector to dreaming tab. Related #63558. Thanks @stevenepalmer and @ttomiczek. - **PR #88772** feat: calm composer controls. - **PR #88721** feat(plugin-sdk): add typed presentation command actions. - **PR #88860** feat(minimax): add MiniMax M3 support. - **PR #79658** Allow validated TXT/JSON/YAML media sends. Thanks @simplyclever914. - **PR #88797** Migrate iMessage monitor state to SQLite. - **PR #88724** fix: persist ACP metadata in SQLite. - **PR #88730** fix(codex): stream final answer partials. Related #88405. Thanks @crash2kx. - **PR #88314** fix #76284: [Bug]: openclaw agents add blocked — cannot add Jon/Atlas as separate agents. Thanks @zhangguiping-xydt and @RicardoUKMX. - **PR #88896** fix: harden CLI and plugin edge cases. - **PR #88764** fix(update): recognize manual-update launchd jobs. Related #88736. Thanks @TurboTheTurtle and @deonkretch. - **PR #77237** Preserve managed npm plugin root when install validation blocks update. Thanks @zhuisDEV. - **PR #88767** fix(plugin-sdk): isolate provider catalog projection failures. Thanks @vincentkoc. - **PR #88807** fix(plugins): isolate web provider factory failures. Thanks @vincentkoc. - **PR #88285** Move cron persistence to SQLite. - **PR #88294** fix(cron): include job name when reading single-job run history. Thanks @kip-claw. - **PR #85931** fix(memory): serialize qmd update writes across processes to stop SQLITE_BUSY. Related #66339. Thanks @openperf and @SakenW. - **PR #88129** fix: keep live OpenClaw session locks during cleanup. - **PR #88136** fix(agents): centralize terminal run outcome precedence. Related #87444. Thanks @ssdatye. - **PR #88141** fix: route generated media completions through requester agent. - **PR #88162** fix(agents): extend terminal outcome projections. - **PR #88229** fix(agents): normalize sessions_send message aliases. Related #88146. Thanks @zhangguiping-xydt and @jsonmez. - **PR #74715** fix(ui): show Communication Notifications tab. Thanks @VladyslavLevchuk. - **PR #87896** fix(feishu): fallback when accepted turns send no visible reply. Thanks @ArthurNie. - **PR #88749** fix(channels): recover failed progress draft starts. Related #83115. Thanks @SebTardif. - **PR #88803** fix(reply): preserve sessions_send external routes. Related #88044. Thanks @MonkeyLeeT and @Lvan185. - **PR #88820** fix(diagnostics): clear embedded-run activity when recovery declares lane idle. Related #88660. Thanks @openperf and @Iman-Sharif. - **PR #88288** fix(config): skip state-dir dotenv values that are unresolved shell references. Related #88274. Thanks @Alix-007 and @mathias15010. - **PR #88305** fix(browser): isolate Chrome MCP pending attach aborts. Related #88304. Thanks @rohitjavvadi. - **PR #74089** fix(openai/tts): handle [[tts:speed]] directive in OpenAI speech provider (#12163). Thanks @stainlu and @useramuser. ## 2026.5.31 ### Highlights - **Faster Control UI chat:** transcript rendering, draft persistence, pending-send paint, scrolling, and first-message work no longer block one another while a conversation is active. (#88952, #88960, #88998) Thanks @vincentkoc. - **More reliable agent recovery:** fallback auth state, legacy Codex app-server auth, stale bootstrap history, and streamed reasoning cleanup recover cleanly instead of carrying stale turn state forward. (#87484, #88924) Thanks @neeravmakwana, @vincentkoc, @bgmbgm94, and @kdonthar. - **Clearer cron and channel history:** external `sessions_send` routes, single-job history, and channel reply state retain the right destination and job context through restarts. (#88294, #88803) Thanks @kip-claw, @MonkeyLeeT, @vincentkoc, and @Lvan185. - **Better operator coordination:** core session goals and durable plugin-install state make long-running work easier to inspect and resume after reloads. (#87469, #88794) Thanks @vincentkoc. - **Safer mobile reconnects:** iOS realtime sessions retain their WebSocket continuation instead of failing a healthy Talk connection, with hosted push/realtime paths kept aligned. (#88231) Thanks @ngutman and @vincentkoc. ### Changes - Workboard task details, Android notification app selection, and Dreaming candidate scoring gained broader operator controls. - Control UI now streams stable Markdown blocks and records more chat responsiveness signals to guide first-reply performance work. Thanks @vincentkoc. ### Fixes - Chat/UI: keep first Control UI sends responsive, retain pending sends while history catches up, cache transcript renders, and avoid draft persistence or navigation churn from blocking the active conversation. (#88952, #88960, #88998) Thanks @vincentkoc. - Agents/Codex/auth: repair automatic fallback state, accept supported legacy Codex app-server auth, remove stale bootstrap history, strip streamed reasoning tags, and validate shell snapshots against trusted environment data. (#87484, #88924) Thanks @RomneyDa, @neeravmakwana, @vincentkoc, @bgmbgm94, and @kdonthar. - Cron/channels: preserve external `sessions_send` routes, include the job name in single-job history, keep Mattermost attachments on the upload path, and bound Telegram/installer/Parallels proof cleanup. (#88294, #88803) Thanks @kip-claw, @MonkeyLeeT, @vincentkoc, and @Lvan185. ### Complete contribution record This audited record covers the complete v2026.5.28..v2026.5.31-beta.4 history: 402 merged PRs. The generation manifest also supplies direct commits as editorial input; the grouped notes above prioritize user impact. #### Pull requests - **PR #87469** feat: add core session goals. - **PR #88129** fix: keep live OpenClaw session locks during cleanup. - **PR #88133** Fix heartbeat default run timeout. Related #87438. Thanks @ovrsr. - **PR #88132** fix: move compaction planning off the event loop. Related #86358. Thanks @Mithril1991. - **PR #88137** fix ci mainline checks. Thanks @RomneyDa. - **PR #88140** perf: centralize skills indexing and visibility. Thanks @shakkernerd. - **PR #82326** Add plugin manifest contract for SecretRef provider integrations. Thanks @sallyom and @joshavant. - **PR #88141** fix: route generated media completions through requester agent. - **PR #87770** refactor: share native approval route gates. Thanks @kevinslin. - **PR #88156** Refactor SQLite state base and plugin migration. - **PR #87781** fix(codex): prevent false completion stalls during native streams. Thanks @keshavbotagent. - **PR #88136** fix(agents): centralize terminal run outcome precedence. Related #87444. Thanks @ssdatye. - **PR #88155** test(infra): avoid max fake-timer jumps. Thanks @RomneyDa. - **PR #88160** test(unit-fast): isolate fake-timer files. Thanks @RomneyDa. - **PR #84535** fix(gateway): resolve message actions against runtime config. Related #84530. Thanks @funmerlin and @joshavant. - **PR #88107** feat: only include the current changelog section in tarball. Thanks @RomneyDa. - **PR #88130** fix(agents): preserve Codex auth for compaction fallback. Related #86820. Thanks @kopl-blip. - **PR #84814** fix(agents): classify embedded provider business denials for fallback. Related #48680. Thanks @Takhoffman and @yu-xin-c and @lovensky1992-wk. - **PR #88178** feat(workboard): add orchestration primitives. - **PR #88162** fix(agents): extend terminal outcome projections. - **PR #88182** Fix subagent DM completion delivery after yield. Related #88042. Thanks @joshavant and @ksiyuna-claw. - **PR #88191** Fix Codex raw image generation media projection. Related #87948. Thanks @joshavant and @mazetsoligarh-cell. - **PR #88134** fix(imessage): preserve SMS approval reply routes. Thanks @kevinslin. - **PR #88161** Fix restart sentinel internal continuations. Related #87792. Thanks @joshavant and @chrispydizzle. - **PR #88199** ci: extend platform checkout fetch timeout. Thanks @RomneyDa. - **PR #87796** feat(ci): autoscrub dependency lockfile-only PR changes. Thanks @RomneyDa. - **PR #88200** Refactor task state onto shared SQLite. - **PR #88083** fix(agent): preserve media task success on delivery miss. Thanks @obviyus. - **PR #88127** perf(test): fix explicit-file Vitest wrapper hangs. Thanks @RomneyDa. - **PR #88183** fix(whatsapp): retry QR login 408 timeouts. Thanks @mcaxtr. - **PR #84234** fix(cli-runner): write-side flush gate + orphan-tool-use invalidator. Thanks @adele-with-a-b. - **PR #88231** fix(ios): guard websocket ping continuation. Thanks @ngutman. - **PR #88117** refactor: extract LLM core packages. - **PR #88248** fix: show chat errors as visible messages. - **PR #88250** refactor(agents): type media completion delivery misses. - **PR #88207** Fix Codex native thread overflow rotation. Thanks @fuller-stack-dev. - **PR #88109** refactor: extract media generation core package. - **PR #88247** feat: add hosted model providers. - **PR #88259** feat(workboard): add board ops recovery metadata. - **PR #87788** fix(codex): move skills list and memory pointer to collaboration instructions. Thanks @lastguru-net. - **PR #88262** fix(codex): stop injecting mirrored history into prompts. - **PR #88177** fix(codex): prevent post-tool edit stream timeouts. Thanks @keshavbotagent. - **PR #88265** refactor: extract markdown core package. - **PR #88279** refactor: move terminal core into package. - **PR #86179** feat:Add Xiaomi Token Plan provider support. Related #86169. Thanks @NianJiuZst and @openclaws420. - **PR #88211** fix(plugins): resolve ${ENV_VAR} references in plugin config before handoff. Related #88195. Thanks @Marvinthebored and @Peetiegonzalez. - **PR #88284** fix(agents): harden autoreview Windows harness. Thanks @vincentkoc. - **PR #88260** Persist subagent registry in SQLite. - **PR #88217** refactor: unify OpenAI provider identity. - **PR #88297** refactor: extract media understanding common package. - **PR #88299** fix(gateway): recover channels after reload stop timeout. Thanks @obviyus. - **PR #88326** perf(cli): reduce room-event Claude cache churn. Thanks @obviyus. - **PR #88310** fix(test): include workflow lint target in routing expectation. Thanks @vincentkoc. - **PR #88225** fix(ui): stop pulsing completed stream segments. Thanks @scotthuang. - **PR #88298** fix: classify ws pre-handshake close as benign. Related #88257. Thanks @akrimm702 and @survivor998. - **PR #88338** feat(workboard): persist orchestration metadata in sqlite. - **PR #88266** refactor: extract model catalog core package. - **PR #88235** feat(ios): refresh app store metadata. Thanks @ngutman. - **PR #85258** fix(qqbot): deliver partial tool progress. Related #66509. Thanks @samzong and @vincentkoc and @gabrielduartesignart. - **PR #88349** Add per-agent SQLite cache store. - **PR #88135** fix(codex): refresh stale managed runtime plugin. Related #87650. Thanks @brokemac79 and @thoth-ctl. - **PR #68844** fix(outbound): pack newline-mode paragraphs up to limit. Thanks @kesslerio. - **PR #88236** fix(plugins): ignore helper files in extension roots. Related #88198. Thanks @mushuiyu886 and @mmhzlrj. - **PR #86089** [Fix] Deliver restart recovery replies. Related #69249. Thanks @samzong and @slideshow-dingo. - **PR #88375** refactor: route model catalog imports to core package. - **PR #85511** feat(ui): add collapsible toggle for recent sessions in sidebar. Related #85510. Thanks @NianJiuZst. - **PR #80560** fix(tui): distinguish /new and /reset command descriptions. Related #49517. Thanks @KhanCold and @KaysonYeh. - **PR #88229** fix(agents): normalize sessions_send message aliases. Related #88146. Thanks @zhangguiping-xydt and @jsonmez. - **PR #88387** refactor(matrix): move ephemeral state to plugin sqlite. - **PR #86755** test(tasks): cover task domain view mappers. Thanks @leno23. - **PR #76355** fix(install): show progress during npm install in non-interactive mode. Related #82305. Thanks @SebTardif. - **PR #77279** fix(media): dedupe identical path/url in inbound media-note formatter (#47587). Thanks @MoerAI and @yzjJosh. - **PR #82824** fix(gateway): explain ignored config-triggered restart when restart command is disabled. Thanks @wAngByg. - **PR #85979** fix(discord): omit undefined component registry fields [AI]. Thanks @funmerlin. - **PR #76091** Fix Discord reply typing lifecycle. Thanks @zhuisDEV. - **PR #88232** fix(models): prefer exact configured provider refs before aliases. Related #88218. Thanks @stevenepalmer and @herculeanfit1. - **PR #88276** fix(feishu): stream plain replies as cards. Thanks @qiangu. - **PR #80037** Expose resolved subagent model metadata. Thanks @guanbear. - **PR #78288** Agents/exec: show target node name in exec tool transparency messages. Related #77719. Thanks @JiataiWang and @civiltox. - **PR #88408** feat: expand workboard orchestration metadata. - **PR #87920** feat(gateway): forward OpenAI stop sequences through chat completions. Thanks @Lellansin. - **PR #87886** fix(skill-creator): sort files for deterministic .skill package order. Related #37748. Thanks @coder999999999 and @shuofengzhang. - **PR #88399** Improve MCP operability. - **PR #88398** refactor: move model catalog refs into core package. - **PR #88328** feat: add Skill Workshop and skill research. Thanks @shakkernerd. - **PR #88271** fix(export-html): guard msg.content and result.content filter/iteration paths against non-array values. Related #88255. Thanks @Alix-007 and @survivor998. - **PR #88429** ci: keep harness changes on fast checks. - **PR #88430** fix(scripts): quiet minimal runtime asset copies. Thanks @vincentkoc. - **PR #88321** fix(codex): keep app-server continuation turns alive. Related #88196, #88331. Thanks @abnershang and @aounakram. - **PR #88435** refactor: move model catalog normalization into core package. - **PR #88226** fix(llm): repair \u escapes that lack four hex digits in streaming JSON. Thanks @coder999999999. - **PR #88380** fix(ui): keep chat model selected after session switch. Related #86597. Thanks @brokemac79 and @xuli500177. - **PR #88285** Move cron persistence to SQLite. - **PR #87915** fix(build): avoid stale agent-core dts warnings. Thanks @keshavbotagent. - **PR #68669** fix(agents): dedupe subagent browser session cleanup wrapper with dispatch flag. Related #68668. Thanks @Feelw00. - **PR #88411** refactor(msteams): persist conversation and poll stores in sqlite. - **PR #88303** Skip browser cleanup when browser is disabled. Thanks @poison. - **PR #88416** Refactor subagent thread binding into core. - **PR #83956** feat(cli): add sessions tail progress view. Related #83441. Thanks @spacegeologist and @ndj888. - **PR #71648** fix(mcp): bound pendingClaudePermissions / pendingApprovals via TTL sweeper + close clear. Related #71646. Thanks @Feelw00. - **PR #88346** refactor: extract web content core package. - **PR #71280** test(gateway): avoid brittle shutdown timer assertion. Thanks @hansolo949. - **PR #80686** fix(agents): extend session-write-lock payload-less orphan grace from 5s to 30s. Thanks @wAngByg. - **PR #88067** fix(responses): drop orphaned assistant msg\_\* id when reasoning is dropped (#88019). Thanks @BSG2000. - **PR #88417** [codex] Route denied exec approval followups to sessions. Related #88167. Thanks @brokemac79 and @jhartman00. - **PR #85996** fix #85782: surface terminal TUI lifecycle errors. Thanks @zhangguiping-xydt and @vincentkoc and @shakkernerd. - **PR #88445** refactor: source model catalog types from core. - **PR #88444** Classify release dependency ownership metadata. - **PR #82415** Fix /acp spawn cwd inheritance for target agent workspaces. Thanks @summerview1997. - **PR #88448** refactor: simplify sqlite cron persistence. - **PR #88268** fix #88214: [Feature]: Dashboard sidebar Recent sessions should filter by currently selected agent. Thanks @zhangguiping-xydt and @wujitianya. - **PR #86642** feat: pass structured provider error signals to hooks. Thanks @fuller-stack-dev. - **PR #63840** fix(slack): preserve thread context for Agents & Assistants DM root messages. Related #63659. Thanks @zozo123 and @dev-ithitchhiker. - **PR #86924** fix: scrub serialized tool-call text from replies. Thanks @fuller-stack-dev. - **PR #87093** fix: promote serialized tool calls via repair package. Thanks @fuller-stack-dev. - **PR #88452** chore(release): update appcast for 2026.5.28. - **PR #88043** feat: add internal code mode namespaces. - **PR #78748** fix(ui): add agent selector to dreaming tab. Related #63558. Thanks @stevenepalmer and @ttomiczek. - **PR #88455** Refactor cron migrations under doctor. - **PR #87929** fix(cron): preserve plugin delivery targets. Related #87905. Thanks @TurboTheTurtle and @xmoxmo. - **PR #87390** fix(ci): ignore fenced headings in proof parser. Thanks @MonkeyLeeT. - **PR #85248** fix(gateway): strip spurious tool call blocks when provider signals stop. Related #85161. Thanks @Jerry-Xin and @syncword. - **PR #83660** fix(browser): allow upload from inbound media directory. Related #83544. Thanks @spacegeologist and @scorpiord. - **PR #88467** feat: improve MCP operator workflows. - **PR #84247** Refactor browser screenshot vision through shared media understanding. Thanks @scotthuang. - **PR #88464** Move Workboard to relational SQLite. - **PR #88451** refactor: unify OpenAI provider identity. - **PR #88459** refactor: extract normalization core package. - **PR #84670** [codex] fix webchat full-message reader for truncated history. Related #84651. Thanks @NianJiuZst and @100yenadmin. - **PR #88462** fix(heartbeat): advance stale scheduler deferrals. Related #79380. Thanks @jorgemarmor. - **PR #88461** refactor(cron): split service timer helpers. - **PR #88427** fix(auth): bound inherited oauth expiry. - **PR #88458** fix: clarify generated media reply prompts. - **PR #88421** [codex] Fix Telegram DM topic session routing. Related #80212. Thanks @brokemac79 and @SergeyKerj. - **PR #88113** fix(commands): make /skill load workspace skills. Related #88056. Thanks @MonkeyLeeT and @shakkernerd. - **PR #85904** fix(slack): keep DM thread turns out of active steering. Thanks @guanbear. - **PR #88395** build(OpenClawKit): make ElevenLabsKit (talk/TTS) an optional package trait. Thanks @mochiexists and @atlascodesai. - **PR #88469** refactor(telegram): persist plugin state in sqlite. - **PR #88406** Fix iMessage startup watch replay. Thanks @obviyus. - **PR #87179** fix(discord): deliver same-session channel replies. Related #87157. Thanks @stevenepalmer and @neo-jacked-in. - **PR #88115** docs: remove divider comments. - **PR #88319** fix(agents): skip below-target CLI compaction failures. Thanks @frankekn. - **PR #88552** Remove channel test isolation hack. - **PR #86176** Fix Telegram media message edits. Related #86161. Thanks @TurboTheTurtle and @crowneglobal. - **PR #88476** feat: add Twilio SMS channel. - **PR #83992** fix(webchat): preserve refresh-visible history and composer state. Related #83344. Thanks @spacegeologist and @zachisfine. - **PR #88496** fix(auto-reply): redact secrets in config show output. Related #65623. Thanks @jason-allen-oneal and @coygeek. - **PR #88536** feat: improve MCP operator controls. - **PR #84290** Doctor: expose UI freshness health findings. Thanks @giodl73-repo. - **PR #88539** refactor(telegram): keep topic thread mapping plugin-local. - **PR #80391** fix(scripts): timeout crabbox wrapper sanity checks. Thanks @ejames-dev. - **PR #85990** Prefer Talk source-reply final text. Related #85275. Thanks @TurboTheTurtle and @BsnizND. - **PR #65914** fix(memory): respect qmd status timeout and skip checkpoint exports. Thanks @shawnduggan. - **PR #88555** feat(workboard): add worker dispatch CLI. - **PR #88018** fix(infra): guard against overwriting corrupt target session store during migration. Related #88017. Thanks @Feelw00. - **PR #88185** fix(cron): accept sub-second --at datetimes resolved in a timezone. Thanks @coder999999999. - **PR #88378** fix(xiaomi): support MiMo voicedesign TTS. Thanks @GimingRao. - **PR #70864** feat: add scoped mention pattern policy. Thanks @patrick-slimelab. - **PR #87998** fix(agents): route per-turn media task hints below the cache boundary. Related #85203. Thanks @nxmxbbd and @AV500group. - **PR #75181** test(plugins): cover Link agent wallet bundle shape. Thanks @stainlu. - **PR #88347** fix(agents): strip malformed arg-value suffixes. Related #48780. Thanks @vincentkoc and @koden588-blip. - **PR #88578** docs: document scoped mention patterns. - **PR #81808** chore(lint): enable object-shorthand. Thanks @tanshanshan. - **PR #70789** fix(ui): fix tool result pairing for sequential same-name tool calls. Related #70746. Thanks @chinar-amrutkar and @tarvis0523. - **PR #88011** fix(logging): align diagnostic recovery in-flight dedup keys. Related #88010. Thanks @Feelw00. - **PR #88574** Fix silent internal aborts after tool-use turns. Thanks @obviyus. - **PR #82219** fix(codex): accept first-party OpenAI plugin marketplaces (bundled and primary-runtime). Related #82216. Thanks @yaanfpv. - **PR #83719** feat(dreaming): add report-only shadow trial runner. Thanks @iFiras-Max1. - **PR #87772** fix(reply): deliver plugin binding replies. Related #87721. Thanks @MonkeyLeeT and @wingleungron. - **PR #74493** fix(cli): identity-only auth-epoch hashing for token credentials (#74312). Thanks @stainlu and @aderius. - **PR #88534** refactor: extract media and ACP core packages. - **PR #79447** fix(model-auth): resolve per-entry apiKey profile ID references. Related #67423. Thanks @kinjitakabe and @presidenzo. - **PR #88577** fix(sms): diagnose Twilio webhook setup. - **PR #84628** [AI-assisted] fix(plugins): scope startup metadata manifest reads. Related #70533. Thanks @IWhatsskill and @jpippo364. - **PR #88582** Refactor cron SQLite runtime paths. - **PR #88595** perf: speed up chat hydration and add 3D workboard. - **PR #75005** fix(media): allow explicit synthetic auth for media providers. Related #74644. Thanks @sqsge and @mozi1924. - **PR #75128** fix(boot): wrap BOOT.md in internal-runtime-context, strip from message-tool args (#53732). Thanks @stainlu and @alvaro630. - **PR #88599** fix(memory): retry transient embedding failures. Related #44166, #71784. Thanks @MrGeDiao and @kevinheinrichs. - **PR #88466** fix(gateway): guide dashboard auth after service repair. Related #88290. Thanks @sallyom and @drarturryzhov-boop. - **PR #88463** fix(ui): keep transient chat errors out of page headers. Thanks @sallyom. - **PR #88474** [AI-assisted] fix(gateway): avoid restarts for auth cooldown reloads. Related #88443. Thanks @IWhatsskill and @MrMaturin. - **PR #88603** fix(media): use typed auth for no-auth media providers. Related #74644. Thanks @mozi1924. - **PR #88605** refactor: make OpenAI Codex legacy doctor-only. - **PR #88440** Retry stale CLI sessions inside runner lifecycle. Related #77089. Thanks @brokemac79 and @clawdbotv2. - **PR #88393** fix(browser): document stable tab references. Thanks @FMLS and @hxy91819. - **PR #88340** fix(agents): classify expired thinking signatures. Related #88020. Thanks @Takhoffman and @BryanTegomoh and @bryanbaer. - **PR #88607** fix(devices): refresh paired device last-seen metadata. Related #81169. Thanks @vyctorbrzezowski and @deminson. - **PR #88613** fix: queue subagent completion handoffs. - **PR #88609** refactor: move plugin state stores to SQLite. - **PR #79363** fix(exec): allow known safe shell builtins in allowlist mode. Related #46056. Thanks @kinjitakabe and @aukei. - **PR #88617** fix(agents): preserve reasoning replay from model metadata. Related #88068. Thanks @syncword. - **PR #77953** fix(auto-reply): honor per-model thinking params. Thanks @tynamite. - **PR #88626** refactor(openai): confine legacy codex repair to doctor. - **PR #87887** fix(hooks): isolate slug-generator failures from shared auth profile (#71709). Thanks @openperf and @nikolaykazakovvs-ux. - **PR #88281** fix(tasks): reclaim ACP zombie runs blocking gateway restart. Related #88205. Thanks @openperf and @subaochen. - **PR #88619** refactor: unify subagent handoffs into agent steering queue. - **PR #88004** fix(tui): skip history reload when final event has displayable output. Related #87922. Thanks @SebTardif and @darconadalabarga. - **PR #87962** fix(webchat): suppress stale active session row racing a completed turn (#87875). Thanks @MukundaKatta and @TunMax. - **PR #88050** fix(tui): use middle truncation for paths and commands in tool display. Related #87936. Thanks @SebTardif and @Joel-Claw. - **PR #86463** fix(auto-reply): warn on substantive private message-tool finals. Thanks @yaoyi1222. - **PR #88554** docs: clarify Android token comments. - **PR #87959** fix(tui): preserve pending local runs during session sync. Thanks @nao860226-rgb and @vincentkoc. - **PR #82224** feat(codex): add portable Codex command pickers. Thanks @yaanfpv. - **PR #88637** chore: bump OpenClaw version to 2026.5.31. - **PR #88587** fix(agents): normalize prefixed Anthropic fallback model ids (#88560). Thanks @TurboTheTurtle and @cjalden. - **PR #88351** fix(doctor): diagnose malformed provider catalogs. Thanks @vincentkoc. - **PR #88618** refactor: expand acp core package. - **PR #87538** fix(agents): model-scope cooldown for transport timeout (#87462). Thanks @openperf and @fenglanhua. - **PR #88623** fix(agents): release session lock on manual abort. Related #88600. Thanks @williammu. - **PR #88588** fix(agents): avoid synthetic tool results during parallel races (#88168). Thanks @TurboTheTurtle and @jhartman00. - **PR #88636** feat: add MCP code-mode namespace. - **PR #88558** fix(gateway): enforce OpenAI tool_choice required/function contracts. Thanks @Lellansin. - **PR #88628** fix: scope plugin tools and async media starts. - **PR #84007** fix(agents): inherit subagent thinking defaults. Related #55790. Thanks @stevenepalmer and @vrurg. - **PR #81795** Fix Control UI agent thinking defaults. Related #81760. Thanks @jbetala7 and @caiming0331. - **PR #74418** fix(agents): recognize params.thinking=false and "disabled"/"none" as thinking=off. Related #74374. Thanks @yelog and @simmssun-hashh. - **PR #88583** fix(gateway): reject pre-reset run lifecycle events from clobbering the rotated session row. Related #88538. Thanks @openperf and @tianxiaochannel-oss88. - **PR #88612** fix(models): keep auth login out of main config. Related #88565. Thanks @corleonexie-maker. - **PR #88655** fix(gateway): reject stale lifecycle session updates. Related #88538. Thanks @tianxiaochannel-oss88. - **PR #88658** fix(agents): report stale session locks without cleanup. - **PR #88661** ci: stabilize Testbox changed checks. - **PR #88641** feat: add exec shell snapshot cache. - **PR #84232** fix(messages): use best-effort for implicit tool-only source replies. Related #84078. Thanks @tianxiaochannel-oss88. - **PR #88381** fix(agents): preserve runtime tools in lean mode. Thanks @vincentkoc. - **PR #88527** fix(discord): ping mention-bearing final replies under live preview (#88360). Thanks @openperf and @hughbeyond. - **PR #88659** refactor: clean up ACP package metadata and helpers. - **PR #88652** fix(codex): restore bounded recovery continuity. Related #88352, #88354. Thanks @100yenadmin. - **PR #82739** fix(macos): prevent duplicate menu bar icons. Thanks @afalk42. - **PR #87975** fix(slack): avoid forced threads for replyToMode off. Thanks @lawrencetran. - **PR #86397** fix(discord): PluralKit DM pairing identity + `direct` peer regex (#86332). Thanks @Sanjays2402. - **PR #88601** fix(sms): cover native proof follow-ups. Thanks @clawSean. - **PR #88670** fix(agents): retry transient stale session locks. - **PR #80996** Fix Google Chat message tool thread replies. Related #80995. Thanks @franco-viotti. - **PR #88549** fix(memory-core): reclaim orphaned dreaming sessions with surviving transcripts. Related #88322. Thanks @Alix-007 and @TheDenStudios. - **PR #88557** fix(terminal): clamp wide graphemes in narrow table cells. Related #88556. Thanks @jbetala7. - **PR #87904** fix: route iMessage DM media through attachment handoff. Related #87597. Thanks @HOYALIM and @omarshahine and @TurboTheTurtle. - **PR #88547** feat(github-copilot): add Claude Opus 4.8 to default model catalog. Thanks @saju01. - **PR #88428** fix(discord): route thread bindings to plugin owners. Related #64199. Thanks @SYU8384 and @hoh-dev-bot. - **PR #85612** fix(slack): keep one draft message in progress mode. Thanks @mycarrysun. - **PR #88500** fix: release abandoned provider streams. Related #67461. Thanks @samzong and @jakedwyer. - **PR #85691** fix(doctor): auto-repair stale session snapshot paths on --fix. Related #85689. Thanks @ggzeng. - **PR #86737** fix(ios): subscribe to per-session transcripts so group chats update in real time (#80231). Thanks @yetval and @jm7v7fgpdy-sketch. - **PR #88642** fix(whatsapp): suppress spurious typing indicator on silent tool-only runs. Related #450. Thanks @Bluetegu and @thesash. - **PR #88635** fix(secrets): treat Codex app-server marker as non-secret. Thanks @vortexopenclaw. - **PR #88525** feat(deepseek): show provider balance in usage status. Thanks @litang9. - **PR #88563** fix(agents): resolve exact static-catalog models for plugin-harness cold start (#88510). Thanks @yetval and @wlassalle724. - **PR #87818** fix(ollama): yield during dense stream processing. Thanks @vincentkoc and @udaymanish6. - **PR #88665** refactor: move delivery queues to SQLite. - **PR #88676** fix(auto-reply): add memory flush failure tracking with retry exhaustion. Thanks @Jerry-Xin. - **PR #88672** fix(plugins): reuse current metadata snapshot in provider hot paths. Thanks @masatohoshino. - **PR #88678** feat: add typed MCP code-mode API. - **PR #77882** fix(feishu): gate bitable tools by tools config. Thanks @glfruit. - **PR #59172** fix(cli): extend holiday tagline dates through 2030. Thanks @alkor2000. - **PR #88252** fix(agents): avoid full stream replay on text deltas. Thanks @vincentkoc. - **PR #59500** fix: extend CA bundle auto-injection to all 8 Node version managers. Related #59494. Thanks @alkor2000. - **PR #87855** fix(telegram): handle ENOENT race in spool drain recovery rename. Related #87847. Thanks @SebTardif and @ppanphper. - **PR #88677** refactor: clean up ACP translator and manager tests. - **PR #88715** perf(plugins): avoid duplicate provider hook load probes. - **PR #88675** refactor: move plugin state slices to sqlite. - **PR #88153** fix(agents): count stream deltas incrementally. Thanks @vincentkoc. - **PR #87698** fix(gateway): emit subagent_ended hook for api.runtime.subagent.run() (#59164). Thanks @sweetcornna and @Amyssjj. - **PR #81692** fix(doctor): detect stale gateway service version metadata. Thanks @wAngByg. - **PR #87549** fix(agents): validate context engine assemble result shape. Related #75541. Thanks @Pluviobyte and @tyyim. - **PR #88720** refactor: extract ACP translator session updates. - **PR #85666** fix #85124: skip Anthropic API keys for usage status. Thanks @zhangguiping-xydt and @rqlangley. - **PR #88722** refactor: make Telegram message cache SQLite-only. - **PR #88724** fix: persist ACP metadata in SQLite. - **PR #86917** fix(session-store): rewrite generated transcript paths on rollover. Thanks @Sunjae-k and @sunjae-1. - **PR #84419** fix(session): prefer real tool result over synthetic error in transcript repair. Thanks @Jerry-Xin. - **PR #88725** refactor: extract ACP manager runtime handle cache. - **PR #88721** feat(plugin-sdk): add typed presentation command actions. - **PR #79658** Allow validated TXT/JSON/YAML media sends. Thanks @simplyclever914. - **PR #87618** fix(daemon): detect system-scope systemd gateway units on Linux (#87577). Thanks @yetval and @fisherman86-ai. - **PR #84988** Refresh Node Docker base image digests. Related #84981. Thanks @LibraHo. - **PR #85931** fix(memory): serialize qmd update writes across processes to stop SQLITE_BUSY. Related #66339. Thanks @openperf and @SakenW. - **PR #78793** fix(approvals): interpolate request id into "Reply with:" line. Thanks @itsuzef. - **PR #88730** fix(codex): stream final answer partials. Related #88405. Thanks @crash2kx. - **PR #80801** fix(auth): force re-login flag, remediation hint, and session-scoped fallback skip cache. Thanks @MertBasar0. - **PR #88729** refactor: extract ACP runtime handle ensure flow. - **PR #79040** fix(gateway): guard buildGroupDisplayName behind group/channel chatType. Related #55354. Thanks @sebuh-infsol and @toruvieI. - **PR #77952** fix(discord): bound REST entity cache to prevent unbounded Map growth. Related #77975. Thanks @fede-kamel. - **PR #88733** refactor: extract ACP runtime resume state. - **PR #77924** fix(memory-core): preserve phase signals on read errors. Related #77881. Thanks @bennewell35 and @SimbaKingjoe. - **PR #88314** fix #76284: [Bug]: openclaw agents add blocked — cannot add Jon/Atlas as separate agents. Thanks @zhangguiping-xydt and @RicardoUKMX. - **PR #77394** fix(agents): sanitize raw HTTP 401 provider errors in user-visible replies (#56197). Thanks @jeffrey701 and @lokamir. - **PR #88739** refactor: extract ACP turn runner. - **PR #77998** fix(skills): clear workspaceVersions entry when skills watcher is disabled. Related #77997. Thanks @fede-kamel. - **PR #77527** fix(gateway): rate-limit pre-auth bootstrap-token verify to prevent mutex DoS. Related #77978. Thanks @fede-kamel. - **PR #88744** refactor: extract ACP close session flow. - **PR #88731** refactor: migrate voice-call call logs through doctor. - **PR #87522** fix: force preflight compaction before oversized agent turns. Related #87234. Thanks @ArthurNie. - **PR #75061** fix: preserve workspaces during state-only uninstall. Related #75052. Thanks @Jason-Bai and @XueJourney. - **PR #79465** Fix ACP command bypass for channel text commands. Thanks @RoeeJ. - **PR #88747** refactor: extract ACP runtime option commands. - **PR #74715** fix(ui): show Communication Notifications tab. Thanks @VladyslavLevchuk. - **PR #88691** feat(gateway): support Tailscale Serve service names. Related #88629. Thanks @charles-openclaw and @resYuto. - **PR #88749** fix(channels): recover failed progress draft starts. Related #83115. Thanks @SebTardif. - **PR #88029** fix(agents): atomic auth.json write to prevent credential lockout on crash. Related #88028. Thanks @Feelw00. - **PR #85277** fix(openai): avoid stale Responses message id replay. Thanks @latensified. - **PR #79173** fix: skip disabled skill snapshot env overrides. Related #79072. Thanks @zeus1959 and @maverikva. - **PR #88752** refactor: split ACP manager session flows. - **PR #79149** fix(ci): guard workflow template injection. Related #68428. Thanks @WT-WSL and @visionik. - **PR #74089** fix(openai/tts): handle [[tts:speed]] directive in OpenAI speech provider (#12163). Thanks @stainlu and @useramuser. - **PR #88763** feat: add code-mode MCP API files. - **PR #87896** fix(feishu): fallback when accepted turns send no visible reply. Thanks @ArthurNie. - **PR #88761** [codex] Surface disabled Codex plugin routes in doctor lint. Related #88751. Thanks @brokemac79 and @jalehman. - **PR #88759** fix: repair providerless Codex session overrides. Thanks @earlvanze. - **PR #88740** fix(hooks): pass media metadata to internal message_received hook. Thanks @SebTardif. - **PR #88695** fix(agents): wait for cron media completions. Related #88001. Thanks @nailujac. - **PR #88762** fix(ui): show Workboard comments in edit modal. Thanks @MonkeyLeeT. - **PR #88765** fix(agents): publish owned announcement session writes. Related #88703. Thanks @TurboTheTurtle and @neo-hu. - **PR #59196** feat(doctor): add disk space health check for state directory. Thanks @alkor2000. - **PR #79260** feat(doctor): add --post-upgrade --json mode for plugin-compat findings. Thanks @arniesaha. - **PR #88486** fix(diagnostics): carry session UUID on interactive dispatch events. Thanks @arniesaha. - **PR #84904** fix: avoid replaying Responses item ids when store is disabled. Thanks @zhanghang02. - **PR #82828** fix(daemon): preserve container service env across regen. Thanks @wAngByg. - **PR #88755** fix(agents): expose session status route context. Related #84544. Thanks @nxmxbbd and @lykeion-dev. - **PR #88781** fix(models): strip remaining provider self prefixes. Related #88770. Thanks @charles-openclaw and @cjalden. - **PR #88131** fix(logging): refresh file log hostname per write. Related #87258. Thanks @lonexreb and @mmhzlrj. - **PR #88667** fix #81214: [Bug]: OpenClaw 2026.5.7 subagent regression. Thanks @zhangguiping-xydt and @GreyWolfRon. - **PR #88764** fix(update): recognize manual-update launchd jobs. Related #88736. Thanks @TurboTheTurtle and @deonkretch. - **PR #88727** fix(feishu): preserve long streaming replies. Related #88631. Thanks @MonkeyLeeT and @Leorand-dev. - **PR #88512** fix: resolve google provider default API to google-generative-ai. Related #88480. Thanks @1052326311 and @Xin and @azgardtek. - **PR #88756** feat: add Skill Workshop Control UI. Thanks @shakkernerd. - **PR #88610** fix: suppress raw provider errors in channel delivery. Related #69737. Thanks @jason-allen-oneal and @alexisperumal. - **PR #88808** perf: hydrate chat history session metadata. - **PR #88735** fix(agents): harden runtime tool schema quarantine. Thanks @vincentkoc. - **PR #88221** fix(nostr): decode npub allowFrom entries to hex correctly. Thanks @DocNR and @hypoxicdrive. - **PR #88772** feat: calm composer controls. - **PR #88388** fix(agents): guard transport payload sanitizer against non-string input. Related #60113. Thanks @Pluviobyte and @cursoragent and @wujiaming88. - **PR #88149** fix(agents): cap bootstrap snapshot cache. Thanks @yozakura-ava. - **PR #88545** fix(memory-core): stop dream diary fallback from leaking raw staging fragments. Related #88391. Thanks @Alix-007 and @Carme99. - **PR #88289** fix(microsoft-foundry): skip DeepSeek V4 thinking params on Foundry fallback. Thanks @silvesterxm. - **PR #88209** fix(subagents): roll formatTokenShort over to "m" at 1000k. Thanks @coder999999999. - **PR #88008** fix(tasks): persist task store before in-memory mutation to prevent sqlite divergence. Related #88007. Thanks @Feelw00. - **PR #88306** fix(gateway): hide phantom agent store rows from sessions.list. Related #57376. Thanks @Alix-007 and @smarchetti. - **PR #88760** fix(doctor): report runtime tool schema errors. Thanks @vincentkoc. - **PR #88495** fix(imessage): tolerate sub-second self-chat reflection skew. Thanks @colmbrogan. - **PR #88797** Migrate iMessage monitor state to SQLite. - **PR #87981** fix(cron): retire MCP runtimes on isolated cron timeout and dispose. Related #87821. Thanks @Jerry-Xin and @zachisfine. - **PR #88410** fix(gateway): harden MCP loopback tool schemas. Thanks @vincentkoc. - **PR #88100** fix(doctor): quiet tool policy removal audits. Related #87798. Thanks @giodl73-repo and @oalansilva. - **PR #88804** fix(agents): preserve stop-finished OpenAI tool calls. Related #88791. Thanks @MonkeyLeeT and @kiagentkronos-cell. - **PR #88802** test(agents): cover nonfatal trajectory flush timeout. Related #88520. Thanks @TurboTheTurtle and @novac42code. - **PR #88819** fix(workboard): wire task-backed board runs. Thanks @vincentkoc. - **PR #88608** fix(minimax): use account OAuth device endpoints. Thanks @MatthewSchleder. - **PR #88794** Persist plugin install index in SQLite. - **PR #88827** Add Vertex API key model config regression coverage. Related #88816. Thanks @TurboTheTurtle and @randompup. - **PR #77237** Preserve managed npm plugin root when install validation blocks update. Thanks @zhuisDEV. - **PR #88288** fix(config): skip state-dir dotenv values that are unresolved shell references. Related #88274. Thanks @Alix-007 and @mathias15010. - **PR #87848** fix(status): resolve gateway auth secrets for deep audit. Related #87815. Thanks @ai-hpc and @kAIborg24. - **PR #88807** fix(plugins): isolate web provider factory failures. Thanks @vincentkoc. - **PR #88518** fix(plugins): isolate cached tool runtime siblings. Thanks @vincentkoc. - **PR #88851** Persist OpenRouter model cache in SQLite. - **PR #88485** fix(agents): guard vanished workspaces. Related #88333. Thanks @TurboTheTurtle and @HT-Moh. - **PR #88825** perf: streamline chat startup metadata. - **PR #88723** fix(doctor): respect explicit PI runtime policy. Related #88706. Thanks @toruvieI. - **PR #88365** fix(infra): bridge WSL clipboard through shell. Related #88080. Thanks @vincentkoc and @YaneCheung. - **PR #88785** fix: restore backgrounded in-flight runs on TUI switch-back via gateway snapshot. Thanks @williamliu-ai. - **PR #87992** feat(ios): support native iPad display. Thanks @EmpX2025. - **PR #88846** fix: preserve no-policy native hook fallback. Thanks @woodym-dotcom. - **PR #81264** fix(installer): align Node version floor with package engine. Thanks @kiranmagic7. - **PR #87838** test(agents): include Ollama in small live model matrix. Thanks @vincentkoc. - **PR #88860** feat(minimax): add MiniMax M3 support. - **PR #88305** fix(browser): isolate Chrome MCP pending attach aborts. Related #88304. Thanks @rohitjavvadi. - **PR #88814** fix(ci): repair current main checks. Thanks @vincentkoc. - **PR #88855** fix(microsoft-foundry): satisfy extension lint. Thanks @RomneyDa. - **PR #88824** test: consolidate plugin registration contracts. Thanks @RomneyDa. - **PR #88847** test(ui): remove stylesheet grep tests. Thanks @RomneyDa. - **PR #88704** fix(memory): rehydrate daily list promotions. Related #87854. Thanks @MonkeyLeeT and @KingYiKa. - **PR #88848** test(agents): use neutral tool schema fixtures. Thanks @vincentkoc. - **PR #88817** fix(agents): return schema lookup misses in-band. Related #88813. Thanks @ksj3421 and @cjalden. - **PR #88866** Persist Discord thread bindings in SQLite. - **PR #88801** fix(hooks): expose inbound reply metadata before dispatch. Related #88521. Thanks @TurboTheTurtle and @hoyanhan. - **PR #88865** docs: clarify diffs language pack additions. Thanks @RomneyDa. - **PR #88849** docs: continue inline comment pass. - **PR #87077** fix(ui): bypass service worker for top-level navigations. Thanks @nayrosk. - **PR #88394** fix(plugins): fail closed on trusted policy errors. Thanks @vincentkoc. - **PR #88758** docs(imessage): document SSH wrapper TCC send failure. Related #79289. Thanks @TurboTheTurtle. - **PR #88859** fix(mattermost): route send attachments through upload. Related #87930. Thanks @vincentkoc and @NewCoffee7477. - **PR #88830** feat(dreaming): score candidates with shadow trial results. Thanks @iFiras-Max1. - **PR #88803** fix(reply): preserve sessions_send external routes. Related #88044. Thanks @MonkeyLeeT and @Lvan185. - **PR #88294** fix(cron): include job name when reading single-job run history. Thanks @kip-claw. - **PR #88896** fix: harden CLI and plugin edge cases. - **PR #88767** fix(plugin-sdk): isolate provider catalog projection failures. Thanks @vincentkoc. - **PR #88892** feat(ui): improve Workboard task details. Thanks @vincentkoc. - **PR #88806** fix(memory-lancedb): reject envelope metadata sludge (incl. marker-free shapes). Thanks @amittell. - **PR #88921** fix(ui): keep first control chat sends responsive. Thanks @vincentkoc. - **PR #87484** fix(agents): clear legacy auto fallback pins. Related #87467. Thanks @neeravmakwana and @bgmbgm94. - **PR #88904** fix(android): add notification app picker. Thanks @Tosko4. - **PR #88820** fix(diagnostics): clear embedded-run activity when recovery declares lane idle. Related #88660. Thanks @openperf and @Iman-Sharif. - **PR #88897** refactor(copilot): compact sessions through SDK state. - **PR #88924** fix(agents): strip streamed reasoning tags. Related #88741. Thanks @kdonthar. - **PR #88937** fix(ui): render pending sends in chat thread. Thanks @vincentkoc. - **PR #88949** fix(ui): scroll pending sends into view. Thanks @vincentkoc. - **PR #88952** perf(ui): cache chat transcript renders. Thanks @vincentkoc. - **PR #88960** perf(ui): record pending send paint timing. Thanks @vincentkoc. - **PR #88972** perf(ui): debounce chat draft persistence. Thanks @vincentkoc. - **PR #88978** perf(ui): skip closed slash menu rerenders. Thanks @vincentkoc. - **PR #88982** fix(test): wait for telegram timer flushes. Thanks @vincentkoc. - **PR #88989** perf(ui): guard chat transcript rerenders. Thanks @vincentkoc. ## 2026.5.28 ### Highlights - Agent and Codex runtime recovery is steadier: subagents keep cwd/workspace separation, hook context stays prompt-local, session locks release on timeout abort while live OpenClaw locks survive cleanup, stale restart continuations are avoided, and Codex app-server/helper failures no longer tear down shared runtime state. (#87218, #86875, #87409, #87399, #87375, #88129) - Channel delivery and session identity got safer across outbound plugin hooks, Matrix room ids, iMessage reactions/approvals, Slack final replies, Discord recovered tool warnings, runtime-config message actions, WhatsApp profile auth roots, Telegram polling, and Microsoft Teams service URL trust checks. (#73706, #75670, #87366, #87451, #87334, #84535, #82492, #83304, #87160) - Mobile and chat surfaces got a broader refresh: the iOS Pro UI, hosted push relay default, realtime Talk tab playback, Gateway chat transport, onboarding, Talk permissions, WebChat reconnect delivery, and session picker behavior now preserve more state across reconnects and empty searches. (#87367, #87531, #87682, #88096, #88105) Thanks @ngutman and @BunsDev. - Browser, channel, and automation inputs are stricter: Browser tool timeouts, viewport/tab indices, Gateway ports, cron retry handling, Discord component ids, schema array refs, Telegram callback pages, and channel progress callbacks now reject malformed values earlier and preserve the intended delivery context. (#82887) - Provider, media, and document coverage expands with Claude Opus 4.8, Fal Krea image schemas, NVIDIA featured models, MiniMax streaming music responses, encrypted PDF extraction, voice model catalogs, GitHub Copilot agent runtime support, and a Codex Supervisor plugin path for delegated Codex workflows. (#87845, #87890, #80775, #84764, #87751, #87794) - CLI, auth, doctor, and provider paths fail faster and recover more clearly: malformed numeric/version options are rejected, workspace dotenv provider credentials are ignored, heartbeat defaults, OAuth/token lifetimes, and local service startup requests are bounded, agent auth health labels are clearer, legacy `api_key` auth profiles migrate to canonical form, and restart guidance is actionable. (#87398, #86281, #87361, #88133, #83655, #87559, #88088, #85924) Thanks @vincentkoc and @giodl73-repo. - Plugin and Gateway hot paths do less repeated work while preserving cache correctness for install records, config JSON parsing, tool search catalogs, session stores, manifest model rows, auto-enabled plugin config, browser tokens, viewer assets, and release-split external plugin packages. (#86699) - Release, QA, and E2E validation now bound more log, artifact, harness, and cross-OS waits so failing lanes produce proof instead of hanging or false-greening. ### Changes - Status: show active subagent details in status output. - Diffs: split the default language pack and expand default Diffs language coverage while keeping the host floor aligned. (#87370, #87372) Thanks @RomneyDa. - ClawHub: add plugin display names plus skill verification and trust surfaces. (#87354, #86699) Thanks @thewilloftheshadow and @Patrick-Erichsen. - iOS: refresh the dev app with Pro Command, Chat, Agents, Settings, hosted push relay defaults, and realtime Talk playback wired to gateway sessions, diagnostics, chat, and realtime Talk. (#87367, #88096, #88105) Thanks @Solvely-Colin and @ngutman. - Docs: clarify Codex computer-use setup, paste-token stdin auth setup, macOS gateway sleep troubleshooting, native Codex hook relay recovery, container model auth, install deployment cards, device-token admin gating, CLI setup flow compatibility, Notte cloud browser CDP setup, and backport targets. (#87313, #63050, #87685) Thanks @bdjben, @liaoandi, and @thewilloftheshadow. - PDF/tools: use ClawPDF for PDF extraction, support encrypted PDF extraction, and surface MCP structured content in agent tool results. (#87670, #87751) - Providers: add Claude Opus 4.8 support, Fal Krea image model schemas, NVIDIA featured model catalogs, MiniMax streaming music responses, and provider-backed voice model catalogs. (#87845, #87890, #80775, #84764, #87794) Thanks @eleqtrizit and @vincentkoc. - Codex/GitHub: add the GitHub Copilot agent runtime and the Codex Supervisor plugin package. - Plugins: externalize GitHub Copilot and Tokenjuice as official install-on-demand plugins with npm and ClawHub publish metadata. - Workboard: add agent coordination tools for tracking and handing off active agent work. - Discord: show commentary in progress drafts so live Discord runs expose useful in-progress context. (#85200) - Plugin SDK: add a reply payload sending hook for plugins that need to deliver channel-owned replies and flatten package types for SDK declarations. (#82823, #87165) Thanks @piersonr and @RomneyDa. - Policy: add policy comparison, ingress-channel conformance, and sandbox-posture conformance checks. (#85572, #85744, #86768) ### Fixes - Agents: fall back to local config pruning when the optional `agents delete` Gateway probe cannot authenticate, so offline installs can still delete agents without removing shared workspaces. - Tighten phone-control mutation authorization [AI]. (#87150) Thanks @pgondhi987. - Clarify directive persistence authorization policy [AI]. (#86369) Thanks @pgondhi987. - Agents/Codex: keep spawned agent cwd/workspace state separated, forward ACP spawn attachments, keep hook context prompt-local, release session locks on timeout abort and runtime teardown without deleting live OpenClaw-owned locks during cleanup, avoid session event queue self-wait, clean up exec abort listeners, stream assistant deltas incrementally, recover raw missing-thread compaction failures, preserve rotated compaction session identity, keep compaction-timeout snapshots continuable, preserve shared app-server state across startup or helper failures, keep native hook relay alive across restarts and prune stale bridge files, close native hook relay replacement races, keep Claude live tool progress visible for watchdog recovery, suppress abandoned requester completion handoff, route workspace memory through tools, resolve Codex runtime models first, report quarantined dynamic tools, format `skills` command output, bind node auto-review to prepared plans, retry Claude CLI transcript probes, and bound compaction/steering retries. (#87218, #86875, #86123, #88129, #87399, #87375, #72574, #87383, #87400, #83022, #87671, #87738, #87747, #87706, #87546, #87541, #81048) Thanks @mbelinky, @Alix-007, @luoyanglang, @yetval, @sjf, @joshavant, @benjamin1492, @c19354837, @fuller-stack-dev, @pfrederiksen, and @dodge1218. - Codex Supervisor: keep real-home app-server MCP session listing on the loaded state path, bound stored history scans, and close WebSocket probes cleanly. - Channels: thread canonical session keys into outbound hooks, preserve Matrix room-id case, keep fallback tool warnings mention-inert, retain delivered Slack final replies during late cleanup, continue iMessage polling after denied reactions, suppress duplicate native exec approvals, resolve Gateway message actions against the active runtime config, preserve Telegram SecretRef prompt config and polling keepalives, preserve WhatsApp profile auth roots, QR display, document filenames, and plugin hook config, suppress Discord recovered tool warnings, preserve the Discord voice outbound helper, cap Discord/Signal/Zalo channel request and container timeouts, and block untrusted Teams service URLs while keeping TeamsSDK patterns aligned. (#73706, #75670, #87366, #87451, #87465, #87334, #84535, #76262, #83304, #82492, #87581, #77114, #86426, #85529, #87160) Thanks @zeroaltitude, @lukeboyett, @jarvis-mns1, @xiaotian, @funmerlin, @joshavant, @eleqtrizit, @heyitsaamir, @amittell, @lidge-jun, @liorb-mountapps, @masatohoshino, @bladin, and @giodl73-repo. - CLI/auth/doctor/providers: reject malformed numeric/timeout/subcommand-version inputs, ignore workspace dotenv provider credentials, wait for respawn child shutdown, bound heartbeat defaults plus Codex, GitHub Copilot, OpenAI, Anthropic, Google, Feishu, LM Studio, MiniMax, Xiaomi TTS, and local-provider OAuth/token/model requests, harden Codex auth probes, label auth health by agent, preserve explicit agentRuntime pins during Codex model migration, warm provider auth off the main thread, honor Codex response timeouts, stop migrating current Claude Haiku 4.5 profiles to Sonnet, bound local service startup, resolve GPT-5.5 without cached catalog, migrate legacy memory auto-provider config, rewrite non-canonical `api_key` auth profiles, and make doctor restart follow-ups actionable. (#87398, #86281, #87361, #88133, #83655, #87559, #87719, #88088, #85924, #84362) Thanks @Patrick-Erichsen, @samzong, @giodl73-repo, @alkor2000, @mmaps, @nxmxbbd, and @vincentkoc. - Gateway/security/session state: expire browser tokens after auth rotation, scope assistant idempotency dedupe, drain probe client closes, avoid stale restart continuation reuse, preserve retry-after fallbacks and stale rate-limit cooldown probes, bound webchat image and artifact transcript scans, include seconds in inbound metadata timestamps, clear completed session active runs, clear stale chat stream buffers, and evict current plugin-state namespaces at row caps. (#87810, #87833, #75089) Thanks @joshavant and @litang9. - Config/parsing/network: reject partial numeric parsing, parse provider/Discord retry headers and dates strictly, honor IPv6 and bare IPv6 `no_proxy` entries, preserve empty plugin allowlists, canonicalize secret target array indexes, and reject malformed media content lengths, inspected TCP ports, marketplace content lengths, cron epochs, sandbox stat fields, unsafe duration values, empty config path segments, noncanonical schema array refs, unsafe Telegram callback pages, and invalid Teams attachment-fetch DNS targets. (#87883) Thanks @zhangguiping-xydt. - Browser/input hardening: reject invalid tab indexes, excessive viewport resizes, explicit zero CDP ports, malformed geolocation options, unsafe screenshot or permission-grant timeouts, loose response-body limits, invalid cookie expiries, and non-finite Browser tool delays/timeouts. - Cron/automation: retry recurring jobs after transient model rate limits before waiting for the next scheduled slot, and preflight model fallbacks before skipping scheduled work. (#82887) Thanks @chen-zhang-cs-code. - Auto-reply/directives: respect provider and relayed channel metadata during directive persistence so channel-originated decisions keep their intended context. (#87683) - WhatsApp: resolve the auth directory from the active profile so profile-scoped WhatsApp installs do not drift to the wrong credential root. (#82492) Thanks @lidge-jun. - Gateway/session state: clear completed session active runs, avoid cold-loading providers for MCP inventory, cache single-session child indexes, cap handshake timers, and bound preauth, auth-guard, media, transcript, readiness, and port options. - Channels/replies: preserve channel-owned progress callbacks when verbose output is off, keep group-room progress suppression intact, prefer external session delivery context, escape Discord component id delimiters, force final TUI chat repaints, show Slack reasoning previews, and normalize Discord/Matrix/Mattermost channel numeric options. (#87476, #87423) - Agents/tool args: harden smart-quoted argument repair for edit arrays and exact escaped arguments so model-produced tool calls recover without corrupting valid input. (#86611) Thanks @ferminquant. - Providers/agents: preserve seeded Anthropic signatures, preserve signed thinking payloads, concatenate signature-delta chunks, preserve DeepSeek `reasoning_content` replay across tier suffixes, apply OpenRouter strict9 ids to Mistral routes, promote Ollama plain-text tool calls, load NVIDIA featured model catalogs, stream MiniMax music generation responses, and recover empty preflight compaction. (#87593, #87493, #80775, #84764) Thanks @Pluviobyte and @eleqtrizit. - Media/images: skip CLI image cache refs when resolving generated images, allow trusted generated HTML attachments, and bound generated video downloads so stale refs and slow providers fail cleanly. (#87523, #87982) - File transfer: handle late tar stdin pipe errors after archive validation or unpacking has already settled. - Performance: trust install-record caches between reloads, prefer native JSON parsing, reuse unchanged tool-search catalogs, reuse gateway session and plugin metadata paths, skip unchanged store serialization, patch single-entry session writes, add precomputed session patch writers, reduce store clone allocations, cache manifest model catalog rows and auto-enabled plugin config, avoid full session snapshots for entry reads, defer configured Slack full startup, prefer bundled plugin dist entries, and slim current metadata identity caches. (#87760) - Docker/release/QA: package runtime workspace templates, stream cross-OS served artifacts, preserve sparse Crabbox run artifacts, isolate npm plugin installs per package, reject incompatible package plugin API installs, drop the leftover root Sharp dependency from package manifests after the Rastermill migration, bound OpenClaw instance logs, plugin gauntlet relay logs, MCP channel buffers, kitchen-sink scans, agent-turn assertions, QA-Lab credential broker calls, QA Matrix substrate requests, and release scenario logs, and keep release/google live guards current. (#87647, #87477) Thanks @rohitjavvadi and @vincentkoc. - Release/CI: bound manual git fetches, ClawHub verifier responses, ClawHub owner metadata, dependency-guard error bodies, Parallels limits, startup/test/memory budget parsing, and diffs viewer build warnings so release lanes fail with useful proof instead of hanging. (#87839) ## 2026.5.27 ### Highlights - Safer local/runtime boundaries: OpenClaw now rejects unsafe command wrappers, malformed CLI numeric options, unsafe Node runtime env overrides, no-auth Tailscale exposure, and non-admin device-role pairing approvals before they can affect live runs. (#87308, #87305, #87292, #87146) - Matrix and auto-reply delivery are steadier: mention previews stay inert, final mention replies deliver normally, shared-DM notices are awaited, MXID parsing ignores filenames, and reasoning-prefixed `NO_REPLY` responses stay suppressed. - Provider and agent reliability improved across OpenAI-compatible embeddings, cached token usage, Anthropic/Codex/Claude runtime state, unsupported tool-schema quarantine, heartbeat templates, and session fallback errors. (#85269, #82062, #85416, #86855) - Plugin and package release paths got tighter: Pixverse ships as an external video plugin with region selection, package exclusions and shrinkwrap inventory match the published npm shape, and release/package smoke commands fail bounded instead of hanging. - Gateway hot paths do less rediscovery by reusing current plugin metadata fingerprints, stable plugin index fingerprints, read-only session metadata, active working stores, status fast paths, and auth/env snapshots. (#86439) ### Changes - Memory: add a core OpenAI-compatible embedding provider for local and hosted OpenAI-style endpoints, with config, doctor, and docs support. (#85269) Thanks @dutifulbob. - Plugin SDK: mark memory-specific embedding provider registration as deprecated compatibility and surface non-bundled usage in plugin compatibility diagnostics. (#85072) Thanks @mbelinky. - Pixverse: add video generation provider support, API region selection, and external plugin publishing. - Plugins: expose approval action metadata for plugin-driven approval surfaces. ### Fixes - Security/CLI/runtime: harden hostname normalization for repeated trailing dots, block side-effecting command wrappers, reject unsafe Node runtime env overrides, reject loose numeric CLI and gateway options, require admin approval for node device-role pairing, and reject no-auth Tailscale exposure. (#87305, #87292, #87308, #87146) Thanks @pgondhi987. - Doctor: validate runtime tool schemas for every configured embedded agent while skipping ACP-only profiles, so bad non-default plugin or MCP tools are reported before assistant turns. - Telegram: route `sendMessage` action replies through durable outbound delivery so completed agent responses remain retryable when the gateway send path times out. (#87261) Thanks @mbelinky. - Matrix/auto-reply: keep draft previews mention-inert, preserve final mention delivery, send mention finals normally, await shared DM notices, ignore filename-embedded MXIDs, and suppress reasoning-prefixed `NO_REPLY` responses. - Agents/providers: add OpenAI-compatible cache retention, forward cached token usage in chat completions, preserve runtime context before active user turns, strip stale Anthropic thinking, load Claude CLI OAuth for Pi auth profiles, avoid false Codex runtime live switches, and quarantine unsupported tool schemas. (#82062, #87167, #86855) - Gateway/performance: cache plugin metadata fingerprints and stable plugin index fingerprints, borrow read-only session metadata safely, keep the active session working store hot, keep status on a bounded fast path, and preserve model auth profile suffixes. (#86439) - Package/install/release: align npm package exclusions and inventory, omit unpacked test helpers, skip Homebrew until macOS packages need it, cap tsdown heap in containers, bound install/release smoke waits, and harden post-publish verification. - Codex/Auth: bound ChatGPT OAuth token exchange and refresh requests, and honor cancellation across Codex and Anthropic OAuth login flows. - QA/E2E/CI: bound Telegram, kitchen-sink, Open WebUI, ClawHub, MCP, Discord, realtime, labeler, and GitHub API waits; fail empty explicit test, live-media, gateway CPU, startup benchmark, plugin gauntlet, and beta-smoke runs instead of false-greening. - Agents/Codex: keep spawned agent bootstrap files rooted in the agent workspace while running task commands, transcripts, and compaction from the requested cwd. (#87218) Thanks @mbelinky. ## 2026.5.26 ### Highlights - Faster Gateway and replies: startup avoids repeated plugin, channel, session, usage-cost, warning, scheduled-service, and filesystem scans; visible replies separate user-facing sends from slower follow-up work; Gateway runtime/session caches churn less under load. - Transcripts are core: transcript-backed meeting summaries, source-provider chunks, cleaned user turns, media provenance, Codex mirrors, WebChat replies, and CLI/TUI replay now use one more reliable transcript path. - More channels are production-ready: Telegram keeps typing/progress context and forum topics, iMessage handles attachment roots, remote media staging, and duplicate local Messages sources, WhatsApp restores group/media behavior, Discord improves voice playback and model picking, and Signal/iMessage/WhatsApp get reaction approvals. - Better voice and Talk: realtime Talk runs can be inspected, steered, cancelled, or followed up from Web UI and Discord voice; wake-name handling is more tolerant without letting ambient speech trigger agents. - Safer content boundaries: Browser snapshot reads honor SSRF policy, system-event text cannot spoof nested prompt markers, fetched file text is wrapped as external content, ClickClack inbound sender allowlists run before agent dispatch, stale device tokens are rejected, and serialized tool-call text is scrubbed from replies. - Providers, Codex, and local models are steadier: named auth profiles, OpenAI sampling params, Codex app-server resume/timeout/usage-limit recovery, dynamic tool-schema guards, xAI usage-limit surfacing, Ollama top-p normalization, and local approval resolution reduce provider-specific dead ends. - More reliable install/update/release paths: Alpine installs, trusted runtime fallback roots, stable update channels, Docker/package timeouts, Windows Scheduled Tasks, Windows/macOS proof lanes, Testbox/Crabbox delegation, plugin publish checks, and macOS runner bootstraps all got hardened. - Better observability: Activity tab, gateway secret-prep traces, tool/model stream progress, explicit fast-mode status, systemd Gateway hygiene, OpenTelemetry LLM spans, release performance evidence, and richer telemetry signals make failures easier to inspect. ### Changes - Transcripts: add core transcript capture and source-provider support for transcript-backed meeting summaries, including the renamed Transcripts docs, CLI surface, source-provider chunks, and cleaned user-turn persistence. - Auth: add named model login profiles and supported credential migration for Hermes, OpenCode, and Codex auth profiles, with explicit opt-out and non-interactive controls. (#85667) Thanks @fuller-stack-dev. - Diagnostics: trace gateway secret preparation, classify skill/tool usage, surface model stream progress, add OpenTelemetry LLM content spans, and expose alertable telemetry for blocked tools, failover, stale sessions, liveness, oversized payloads, and webhook ingress. (#83019, #80370, #86191) - Channels: add Signal reaction approvals, iMessage thumb approval reactions, and WhatsApp thumb approval reaction support so mobile approval flows work without textual `/approve` commands. (#85894, #85952, #85477) - Agents/API: forward OpenAI sampling params through the Gateway and expose estimated context-budget status for active agent runs. (#84094) - TUI/status: queue prompts submitted while an agent is busy and show explicit fast-mode state plus richer systemd Gateway hygiene in status output. (#86722, #87115, #86976) - Exec approvals: hide durable approval actions that are unavailable for the current prompt and keep approval runtime tokens local-only so stale prompts cannot offer misleading controls. (#86270, #86359) - Plugin SDK: add reaction approval helpers and keep diagnostic event root exports discoverable across function-name and alias-bound module graphs. (#86735, #87084) - Android/iOS: add the Android pair-new-gateway action and improve mobile Talk mode surfaces, including iOS realtime Talk mode and Android offline voice/gateway recovery. (#86798, #86355) Thanks @ngutman. - Performance: cache plugin metadata snapshots, package realpaths, stable gateway metadata, model cost indexes, channel resolution, usage-cost indexes, and session/auth hot-path facts so common Gateway and reply paths do less rediscovery. (#84649, #85843, #86517, #86678) - Voice: expose shared realtime turn-context tracking through the realtime voice SDK and reuse it for Discord speaker attribution and wake-name context recovery. - Voice: reuse shared realtime output activity tracking in Google Meet command and node audio bridges, including recent-output checks for local barge-in detection. - Voice: expose shared realtime output activity tracking through the realtime voice SDK and reuse it for Discord playback activity and barge-in decisions. - Voice: expose shared realtime consult question matching, speakable-result extraction, and alias-aware forced-consult coordination through the realtime voice SDK, then reuse it in Gateway Talk, Voice Call, and Discord voice paths. - Voice: share activation-name matching and consult-transcript screening through the realtime voice SDK so Discord, browser voice, and meeting surfaces can reuse one implementation. - Cron: default `cron.maxConcurrentRuns` to 8 so scheduled automations and their isolated agent turns can make progress in parallel without explicit configuration. - QA-Lab: add `qa coverage --match ` so focused proof selection can discover matching scenarios from existing metadata before running live or remote lanes. - Discord/model picker: surface an alpha-bucket select (e.g. `A–G (12) · H–N (18) · O–Z (5)`) when the provider list or a provider's model list exceeds 25 items, so configs with `provider/*` wildcards stay one click from the right page instead of paginating through prev/next; falls back to numeric chunks when every item shares the same first letter. (#86181) Thanks @rendrag-git. - Control UI: add an ephemeral Activity tab for sanitized live tool activity summaries without persisting raw telemetry. Fixes #12831. Thanks @BunsDev. - Build: include `ui:build` in the `full` and `ciArtifacts` profiles of `scripts/build-all.mjs` so `pnpm build` always rebuilds `dist/control-ui` after `tsdown` cleans `dist`, removing the second-command requirement and the missing-asset failure mode for source/runtime installs and CI artifact uploads. (#85206) - iOS: improve Talk mode with direct realtime voice sessions, compact toolbar status, and responsive voice waveform feedback. (#86355) Thanks @ngutman. - Media: replace the Sharp image backend with Rastermill for metadata, resizing, EXIF orientation, and PNG alpha-preserving optimization so OpenClaw no longer installs Sharp or the WhatsApp Jimp fallback for image processing. (#86437) - Codex: update the bundled Codex CLI to 0.134.0 and keep native compaction disabled for budget-triggered app-server turns so OpenClaw owns the recovery boundary. (#86772) ### Fixes - Memory/security: reject prompt-like text submitted through the explicit `memory_store` tool before embedding or storage, matching the existing auto-capture prompt-injection filter. (#87142) - Gateway/security: enable the default auth rate limiter for remote non-browser and HTTP gateway auth failures when `gateway.auth.rateLimit` is unset, while preserving the loopback exemption. (#87148) - Prompt hardening: route untrusted group prompt metadata through sanitized untrusted structured context while preserving trusted operator-configured group system prompts and aligning the plugin SDK docs/test helpers. (#87144) - Security/content boundaries: validate Browser snapshot tab URLs against SSRF policy before ChromeMCP or direct CDP reads, sanitize queued system-event text so untrusted plugin/channel labels cannot spoof nested prompt markers, wrap fetched file text and metadata as external content, apply ClickClack `allowFrom` sender allowlists before agent dispatch, reject RPCs from invalidated device-token clients during rotation, require staged sandbox media refs, and scrub serialized tool-call text from replies. (#78526, #87094, #87062, #83741, #70707, #86924) Thanks @zsxsoft, @ttzero25, and @mmaps. - Transcripts/user turns: persist CLI, WebChat, media, follow-up, hook, and Codex-mirror user turns to the admitted session target; keep cleaned transcript text, inline image routing, provenance metadata, replay hooks, and fallback paths idempotent when runtimes fail or restart. - TUI/status/onboarding/UI: queue busy TUI prompts instead of dropping them, preserve the configured default model during onboarding, show failed tool results as errors, show config-open failures in Control UI, keep status JSON plugin scans healthy, preserve xAI usage-limit errors locally, and expose explicit fast-mode/systemd state. (#86722, #87000, #85786, #87108, #87001, #86614, #87115, #86976) - Plugin commands/SDK: preserve plugin LLM command auth, bind native plugin command dispatch to the host agent's LLM auth, keep `onDiagnosticEvent` exports discoverable through `Function.name`, stabilize diagnostic event root aliases, correlate pathless read diagnostics, suppress transient runner failures in channel command paths, and repair local approval resolution. (#85936, #87084, #86977, #87069, #86771) - Codex/providers: keep WebChat delivery hints out of user prompts, avoid false queued-terminal idle timeouts, share the native hook relay registry, quarantine unsupported dynamic tool schemas, preserve Claude resumed-session system prompts, normalize greedy Ollama `top_p`, preserve per-agent thinking defaults for ingress runs, and avoid native compaction takeover on budget-triggered Codex turns. (#87096, #73950, #87049, #86689, #86772) - Gateway/perf/release: reuse startup-warning metadata and prepared auth stores, avoid cloning live-switch and lifecycle session caches on read paths, defer warning and scheduled-service fallback imports, trim Gateway session/startup/runtime CPU churn, skip duplicate turn session touches, stop chat timeout fallback cascades, drop stale subagent announce history, bound benchmark/watch/kitchen-sink teardown waits, bound macOS/package/onboarding/plugin smoke commands, bound install finalization probes, resolve Parallels npm-update commands from guest `PATH`, and bootstrap raw AWS macOS Node/pnpm commands through `/usr/bin/env`. (#86997) - Reply/perf: reduce visible reply delivery latency by preserving Telegram typing/progress context, lazy-loading slash-command startup metadata, avoiding hot-path model hydration, flag-gating Codex profiler timing, deferring context compaction maintenance, and tracking delivery timing. (#86989, #86990, #86991, #86992, #86993, #86994) Thanks @keshavbotagent. - Reply/source delivery: keep TUI, Control UI, media, TTS, transcript, and Codex source-reply finals live without duplicate terminal events or stale replay artifacts. - Agents/replay: repair legacy tool results before replay, preserve `sessions_spawn` transcript payloads, restore current guard checks, stage sandboxed workspace media, and keep duplicate transcripts tool display metadata from reappearing. (#82203, #86934, #87025) Thanks @martingarramon, @vincentkoc, and @joshavant. - Agents/sessions: handle active-fallback failures in `sessions_send` so fallback routing reports the real failure and does not leave callers with an ambiguous dropped send. (#86638) - Agents/hooks/subagents: enforce default hook agent allowlists, recover failed subagent lifecycle completions, and keep node task lifecycle cleanup from closing the Gateway listener. (#86101) - Codex: project newer OpenClaw chat history into resumed app-server threads and keep Codex turn timeouts inside the Codex runtime boundary so timeouts do not poison shared app-server clients or fall through to unrelated provider fallback. (#86677, #86476) Thanks @TurboTheTurtle and @pashpashpash. - Config/doctor/update: narrow profiled tool-section doctor repair, keep runtime-injected legacy web-search provider config out of user-authored config validation, and keep prerelease tags excluded from stable updater resolution. (#87030, #86818, #86559) Thanks @joshavant, @luoyanglang, and @stevenepalmer. - Doctor/runtime: validate active bundled MCP tool schemas through the same runtime projection path so unsupported MCP input schemas are reported and quarantined instead of poisoning assistant startup. - CLI/Windows: add a Windows-only stack-size respawn for stack-heavy startup paths, default CLI logs to local timestamps, and validate timeout/banner TTY state more strictly. (#87031, #85387) Thanks @giodl73-repo and @vincentkoc. - Locking/security: require owner identity proof before stale plugin lock removal, memoize session lock owner arguments, and avoid writing default exec approval stores unless policy state actually changed. (#86814, #86964) Thanks @Alix-007 and @vincentkoc. - Install/release: bound Docker package build, inventory, pack, and tarball preparation with process-group timeouts; pin shrinkwrap patch drift to the pnpm lock; harden macOS restart and dSYM packaging; and run release Docker/live timeout wrappers in the foreground so child processes cannot wedge gates. - QA/Telegram: bound Telegram user credential tar and broker calls so live proof setup fails with a timeout instead of waiting for the outer Crabbox job deadline. - QA/Tool Search: bound gateway E2E HTTP probes, run only the fixture plugin, and clean up temporary fixture trees after the compact tool-catalog proof completes. - Telegram/network: treat `ENETDOWN` as a transient pre-connect network failure so Telegram sends, gateway unhandled-rejection handling, and cron network retries follow the same recovery path as sibling network outages. (#86762) Thanks @TurboTheTurtle. - Telegram: preserve inbound text entities, overlapping DM replies, account topic cache sidecars, outbound reply context, targeted bot-command mentions, durable group retry targets, forum topic names, and native progress callbacks. (#83873, #85361, #85555, #85656, #85709, #86299, #86553) Thanks @SebTardif, @luoyanglang, and @neeravmakwana. - iMessage: read image attachments from local Messages attachment roots, dedupe duplicate local Messages-source accounts, seed direct DM history, fix image/group media attachment commands, advance catchup cursors after live handling, and keep slash-command acknowledgements in the source conversation. (#82642, #85475, #86569, #86705, #86706, #86770) Thanks @homer-byte, @TurboTheTurtle, @swang430, and @OmarShahine. - WhatsApp/QQ/Twitch/IRC/Slack: restore WhatsApp ack identity and group-drop warnings, make QQ Bot media respect `OPENCLAW_HOME`, serialize Twitch auth disconnects, store IRC channel routes canonically, and keep Slack downloaded files out of reply media. (#83833, #85309, #85777, #85794, #85906, #86318, #86697) Thanks @sliverp, @neeravmakwana, and @Kailigithub. - Discord/voice: improve voice playback and wake replies, bucket large model picker menus, merge media captions into one message, route metadata through configured proxies, restore numeric channel sends, suppress self-reply echoes, and tighten wake matching without breaking fuzzy wake phrases. (#80227, #86238, #86487, #86571, #86595, #86601) - Codex: preserve native web-search metadata, keep oversized native thread reuse, bridge CLI API-key auth into the app server, preserve sandbox bootstrap path style, recover context-window prompt errors, honor yolo approval policy, disable native thread personality, and route compaction through Codex auth. (#85378, #85542, #85891, #85909, #86408) - Agents/runtime: enforce session lock max-hold reclaim, release embedded-attempt locks on all exits, treat aborted subagent runs as terminal, avoid runtime model hydration on hot paths, disclose scoped session list counts, derive overflow budgets from provider errors, and keep fallback errors scoped to the active model candidate. (#70473, #85764, #86014, #86134, #86427, #86944) Thanks @openperf, @fuller-stack-dev, @zhangguiping-xydt, and @ferminquant. - Config/update/doctor: retry config recovery after failed backup restore, skip shell env fallback on Windows, exclude prerelease tags from the stable git channel, support deep config edits, warn instead of aborting on unreadable cron stores, prune stale bundled plugin paths, and avoid duplicate restart prompts when the Gateway is already healthy. (#85739, #85787, #86060, #86260, #86384, #86533) Thanks @liaoyl830. - Install/release: support Alpine CLI installs and runtime floors, prefer trusted startup argv runtime fallback roots, reject stale CLI node runtimes, avoid npm `min-release-age` installer failures, bound npm/package/Docker install phases, restore config parent ownership in Docker, seed Docker lockfile package tarballs before prune, make release/plugin prerelease checks fail closed instead of hanging or false-greening, and use host-visible Crabbox local work roots for Docker-backed proof. (#85491) - Windows daemon: keep Scheduled Task gateway launches running on battery power and avoid workgroup-machine prompts for a domain user during task installation. (#59299) - Security: avoid printing Gateway tokens in Docker, validate plugin model-pattern regexes safely, escape transcript metadata field names, harden session allowlist glob matching, audit Claude permission overrides under YOLO, and require explicit allow for ACP auto approvals. (#85849, #85934, #86046, #86557) - Media/images: replace Sharp with Rastermill, keep EXIF normalization best-effort, normalize HEIC/HEIF before image descriptions, route Codex image API keys through OpenAI, preserve image compression metadata, and auto-scale live tool result caps. (#85776, #86037, #86437, #86857, #86923) - Memory: prevent semantic vector indexes from silently degrading when embeddings are unavailable, stop doctor OOMs on large session stores, preserve sidecar hooks/artifacts, write fallback dream diaries, use CJK-aware dreaming dedupe, and avoid per-file watcher FD fan-out. (#80613, #82928, #85060, #85704, #85967, #86701) Thanks @brokemac79, @openperf, and @yaaboo-gif. - Agents/sessions: include visibility metadata on restricted `sessions_list` results so scoped counts are clearly reported without widening access or exposing hidden-session counts. (#86944) Thanks @ferminquant. - Gateway/DNS: validate wide-area discovery domains before deriving zone paths or writing zone files, so invalid `discovery.wideArea.domain` and `dns setup --domain` values fail with a DNS-name diagnostic instead of falling through to unrelated configuration errors. Thanks @mmaps. - Agents/BTW: route fallback side-question streams through the embedded stream resolver so Anthropic-compatible MiniMax requests use the same capped transport as normal chat. (#86312) Thanks @neeravmakwana. - Telegram: treat `/command@TargetBot` bot-command entities as explicit mentions for the addressed bot so `requireMention` groups no longer drop targeted commands or captions. Fixes #84462. (#86553) Thanks @luoyanglang. - CI: bound Docker/Bash E2E tarball npm installs with `OPENCLAW_E2E_NPM_INSTALL_TIMEOUT` so package, onboarding, plugin, and upgrade lanes fail instead of hanging on a stuck npm install. - CI: fail Parallels npm-update smoke jobs after the guest command timeout and cleanup backstop instead of only logging a timeout line. - CI: bound kitchen-sink RPC HTTP probes so stalled gateway readiness or response bodies fail and retry instead of wedging the walker. - CI: bound Telegram user Crabbox proof Bot API calls so stalled Telegram responses fail instead of wedging credential and desktop proof cleanup. - CI: bound MCP channel stdio client initialization so Docker channel proof fails and closes the bridge transport instead of waiting for the outer job timeout. - CI: keep `OPENCLAW_TESTBOX=1 pnpm check:changed` delegating to Blacksmith Testbox through Crabbox without forwarding local Testbox or worker env into the remote command. - CI: send KILL after the TERM grace period for manual checkout fetch timeouts so stuck Testbox and workflow checkout retries cannot hang behind a wedged `git fetch`. - CI: send KILL after the TERM grace period for Bun global install smoke command timeouts so trapped `openclaw` child processes cannot wedge the scheduled install smoke. - iMessage: thread current channel/account inbound attachment roots into the image tool so iMessage-saved attachments under `~/Library/Messages/Attachments` (including the wildcard `/Users/*/Library/Messages/Attachments` root) are read through the existing inbound path policy instead of being rejected as `path-not-allowed`. Literal `localRoots` stays workspace-scoped. Fixes #30170. (#86569) - QQ Bot: respect `OPENCLAW_HOME` for outbound media path resolution so `` sends no longer silently fail when `HOME` and `OPENCLAW_HOME` differ (Docker / multi-user hosts). Persisted QQ Bot data (sessions, known users, refs) stays anchored on the OS home for upgrade compatibility. Fixes #83562. Thanks @sliverp. - Update: report the primary malformed `openclaw.extensions` payload error without adding a duplicate missing-main diagnostic. (#86596) Thanks @ferminquant. - Control UI: keep host-local Markdown file paths inert while preserving app-relative links. (#86620) Thanks @BryanTegomoh. - Gateway: dampen repeated unauthenticated device-required probes per URL while preserving explicit-auth and paired recovery paths. (#86575) Thanks @ferminquant. - IRC: store inbound channel routes with the canonical `channel:#name` target and join transient channel sends before writing. (#85906) Thanks @Kailigithub. - Usage: surface unknown all-zero model pricing as missing cost entries instead of a confident `$0` total. (#85882) Thanks @MichaelZelbel. - Agents/Codex: honor yolo app-server approval policy only for the full `never` plus `danger-full-access` case. (#85909) Thanks @earlvanze. - Gateway/Gmail: clear Gmail watcher renewal intervals on re-entry so hot reloads do not leak lifecycle timers. (#82947) Thanks @SebTardif. - Logging: exit cleanly on broken stdout/stderr pipes without masking existing failure exit codes. (#80059) Thanks @pavelzak. - Gateway/security: escape transcript metadata field names while extracting oversized session line prefixes. (#85934) Thanks @SebTardif. - Plugins/security: validate manifest model pattern regexes with the safe-regex compiler so unsafe patterns are ignored before matching. (#86046) Thanks @SebTardif. - Discord: route gateway metadata REST lookups through the configured Discord proxy so proxied accounts do not fall back to direct `discord.com` connections before opening the WebSocket. Fixes #80227. Thanks @Clivilwalker. - Agents/media: hydrate current-turn image attachments from filename-derived MIME types so active vision can see generated or forwarded images whose source omitted an image content type. (#84812) Thanks @marchpure. - Agents/fs: point workspace-only scratch-path guidance at in-workspace temp directories while keeping host-root writes rejected by the tool guard. (#86501) Thanks @tianxiaochannel-oss88. - Agents/media: keep async cron media completions scoped to their run session while preserving direct delivery for stale generated-media success and failure notifications. (#86529) Thanks @ai-hpc. - Gateway: emit plugin `session_end`/`session_start` hooks when `agent.send` rotates or replaces a session id, keeping hook lifecycle state aligned with `sessions.changed` notifications. Fixes #83507. (#85875) Thanks @brokemac79. - OpenShell/SSH: reject malformed generated exec commands before sandbox/session setup so unresolved workflow placeholders fail fast instead of reaching the remote shell. Fixes #72373. Thanks @brokemac79. - Google: stop normalizing `gemini-3.1-flash-lite` to the retired preview endpoint and update Flash Lite alias guidance to the GA model id. Fixes #86151. (#86240) Thanks @SebTardif. - Installer: make Alpine apk installs cover Git, verify the Node runtime floor, try `nodejs-current`, and report Alpine version guidance when repositories only provide older Node packages. - Agents/status: prefer the active Claude CLI OAuth auth label over an unused Anthropic env API-key label for equivalent runtime aliases. Fixes #80184. (#86570) Thanks @brokemac79. - Agents/media: send direct fallback for generated media still missing after an active requester wake fails. (#85489) Thanks @fuller-stack-dev. - Agents: derive overflow compaction budgets from provider-reported and synthetic over-budget token counts so confirmed context overflows compact before retrying. (#70473) Thanks @fuller-stack-dev. - Agents/Codex: recover Codex context-window prompt errors through overflow compaction and surface reset guidance when recovery is exhausted. (#85542) Thanks @fuller-stack-dev. - Agents/Codex: allow Codex app-server runs to bootstrap from `CODEX_API_KEY` or `OPENAI_API_KEY` when no Codex auth profile is configured. - Agents/Codex: keep selected Codex runtime routing on OpenAI-Codex while preserving direct OpenAI API-key compaction fallback. (#86408) Thanks @funmerlin and @VACInc. - Agent transcript: include OpenClaw agent session logs when finding local transcript candidates. - Crabbox: bootstrap raw AWS macOS shell commands wrapped in absolute `time` paths so RSS probes can run Node and pnpm on fresh macOS runners. - Crabbox: bootstrap raw AWS macOS shell commands even when setup statements precede Node or pnpm usage. - TUI/local: skip unnecessary secret resolution, gateway model catalog loading, bootstrap, and skill scans in explicit local-model runs so startup reaches the model request faster. - Sessions/doctor: load large session stores without clone amplification during read-only doctor checks and reclaim stale `sessions.json.*.tmp` sidecars. Fixes #56827. Thanks @openperf. - Tests: clean successful plugin gateway gauntlet isolated temp roots while keeping an explicit preservation switch for failed/debug runs. - Plugins/perf: reuse derived plugin metadata snapshots for the lifetime of the process so reply-time skill setup no longer rescans plugin metadata on every turn. - Discord/OpenAI voice: keep wake-name master consults using the current speaker context after ignored ambient transcripts and shorten the default capture silence grace. - Doctor: skip redundant Gateway restart prompts when a recent supervisor restart leaves the Gateway healthy. Fixes #86518. (#86533) Thanks @liaoyl830. - Cron: restore suspended cron lanes to the configured/default concurrency instead of falling back to one after quota or circuit-breaker auto-resume. - Gateway: keep session-only Control UI tool-start mirrors flowing during diagnostic queue pressure instead of silently dropping non-terminal tool updates. - Agents/memory: return optional not-found context for missing date-only daily memory reads instead of logging benign first-run `ENOENT` failures. Fixes #82928. Thanks @galiniliev. - Discord: merge streamed text captions into following media block replies so captions and attachments send as one message. (#86487) Thanks @neeravmakwana. - Gateway: avoid sending duplicate tool-event frames to Control UI connections that are subscribed by both run and session. - Discord/OpenAI voice: accept broader edge-position fuzzy wake-name transcripts while keeping ambient speech gated. - Discord/OpenAI voice: accept longer leading wake-name mistranscripts such as "Open Club" for OpenClaw. - Agents/OpenAI-compatible: stop ModelStudio-compatible chat requests before sending system/tool-only payloads that have no usable user or assistant turn. (#86177) Thanks @TurboTheTurtle. - Gateway/plugins: reuse plugin package realpath checks while building installed plugin indexes so startup avoids repeated filesystem resolution work. - Kilo Gateway: send string `stop` sequences as arrays so Kilo accepts OpenAI-compatible chat completions. (#86461) Thanks @SebTardif. - Discord/OpenAI voice: accept leading fuzzy wake-name transcripts such as "Monty" or "Moti" for a Molty agent while keeping ambient speech gated. - Media understanding: convert HEIC and HEIF images to JPEG before image description providers run so iPhone photos work in direct and configured image-description flows. (#86037) - Agents: release embedded-attempt session locks from outer teardown so post-prompt exceptions cannot wedge later requests behind `SessionWriteLockTimeoutError`. Fixes #86014. Thanks @openperf. - Discord/OpenAI voice: rotate Realtime sessions at provider max duration without logging the expected session-expiry event as an error. - Sessions: skip metadata-only entries during QMD-slugified session lookup so one incomplete row does not block transcript hit resolution. (#86327) Thanks @abnershang. - Agents/media: derive bundled plugin local-media trust from plugin tool metadata instead of importing the full plugin registry on subscription paths. (#84409) Thanks @samzong. - Image tool: keep config-backed custom-provider API keys usable for auto-discovered vision models, including deferred image-tool execution without env keys or auth profiles. (#85733) - Memory/local embeddings: run local GGUF embeddings in an isolated worker sidecar and degrade to configured fallback or keyword search on worker failure so native embedding crashes do not take down the Gateway. (#85348) Thanks @osolmaz. - Gateway: clear the runtime config snapshot before `SIGUSR1` in-process restarts so config changes survive the next gateway loop. (#86388) Thanks @XuZehan-iCenter. - Models: show OAuth delegation markers as configured `models.json` auth while keeping runtime route usability checks strict. (#86378) Thanks @rohitjavvadi. - Cron: seed active scheduled and manual cron task rows with a progress summary so status surfaces do not look blank while jobs run. (#86313) Thanks @ferminquant. - Cron: preserve unsupported persisted cron payload rows during routine store writes while keeping those rows non-runnable. Fixes #84922. (#86415) Thanks @IWhatsskill. - Updater: exclude prerelease git tags from stable channel resolution so source updates do not check out newer alpha/rc/preview/canary tags. (#86260) Thanks @stevenepalmer. - Security/Audit: flag webhook `hooks.token` reuse of active Gateway password auth in `openclaw security audit` while keeping password-mode startup compatibility. (#84338) Thanks @coygeek. - QQBot: derive the outbound reply watchdog from configured agent and provider timeouts so slow local model replies are not cut off at five minutes. Fixes #85267. (#85271) Thanks @SymbolStar. - Agents/heartbeat: stop heartbeat turns after the first valid `heartbeat_respond` so repeated response loops do not burn tokens. (#86357) Thanks @udaymanish6. - Tasks: keep retained lost tasks out of default status health counts, explain their cleanup window during maintenance, and prune lost task records after 24 hours instead of the general 7-day terminal retention. - Memory-core: keep REM dreaming focused on live light-staged memories and mark staged entries as considered so old recall history no longer dominates fresh candidates. (#86302) Thanks @SebTardif. - Memory: abort sync instead of downgrading an existing semantic vector index to FTS-only when the configured embedding provider is temporarily unavailable. (#85704) Thanks @yaaboo-gif. - Telegram: propagate forum topic names through the account-scoped topic cache for native command context and topic create/edit actions. (#86299) Thanks @SebTardif. - Slack: keep downloaded read-only files out of reply media so Slack file reads do not echo files back to the conversation. (#86318) Thanks @neeravmakwana. - Cron: accept leading-plus relative durations such as `+5m` for one-shot `--at` schedules. (#86341) Thanks @mushuiyu886. - Agents/media: preserve async-started media tool metadata so background generation starts no longer surface generic incomplete-turn warnings while replay stays unsafe. (#85933) Thanks @fuller-stack-dev. - Docker E2E: dedupe scheduler lane resources so npm/service package lanes are not over-counted and serialized unnecessarily. - QA/diagnostics: add a collector-backed OpenTelemetry smoke lane, make the OTLP payload leak check scenario-aware, and keep source QA builds from failing on optional dependency imports resolved through pnpm's temp module path. - Crabbox: bootstrap Git metadata for sparse remote changed gates so raw synced workspaces can run `pnpm check:changed` from the intended diff. - xAI/LM Studio: avoid buffering ordinary bracketed or `final` prose until stream completion while watching for plain-text tool-call fallbacks. - Doctor: warn and continue when the cron job store exists but cannot be read so later health checks still run. Fixes #86102. (#86384) Thanks @1052326311. - Discord: suppress a bot's previous reply body and referenced media from prompt context when a user replies to that bot message, while keeping reply metadata for routing. (#86238) Thanks @fuller-stack-dev. - Discord: restore bare numeric channel IDs for outbound message-tool sends while keeping explicit DM targets unambiguous. (#86571) Thanks @joshavant. - Docker E2E: avoid rebuilding the Control UI twice while preparing the shared OpenClaw package tarball for package-backed scenario runs. - Tests: avoid rebuilding the Control UI twice during the installer Docker smoke now that `pnpm build` includes `ui:build`. - Tests: give QA config mutation RPCs enough native Windows budget to finish gateway config writes and restart settle after hot scenario runs. - Tests: keep the gateway restart-inflight QA scenario focused on restart recovery on native Windows by allowing expected embedded prompt handoff errors and using the Windows-safe timeout budget. - QA-Lab: make the synthetic OpenAI provider honor generic `reply exactly:` directives after required kickoff reads so restart-recovery scenarios do not fall through to generic repo-summary prose. - Gateway: abort active `agent` RPC runs during forced restart shutdown so stale in-process turns cannot keep writing a session after the Gateway lifecycle restarts. - Crabbox: sync clean sparse worktrees through a temporary full checkout even when reusing an existing lease so tracked build-time files are not omitted. - Build: route `scripts/ui.js` through the shared pnpm runner and keep Control UI chunking helpers in sparse-included source so native Windows Corepack builds can produce `dist/control-ui`. - Tests: give the memory fallback QA scenario enough turn budget to exercise native Windows gateway runs instead of failing on the client timeout while the mock agent is still dispatching. - Tests: collect QA gateway CPU/RSS metrics on native Windows and give the channel baseline enough turn budget to report slow gateway runs instead of timing out before proof. - Install/update: bypass npm `min-release-age` policies with `--min-release-age=0` instead of `--before` so hosted installers keep working on npm versions that reject the combined config. (#84749) Thanks @TeodoroRodrigo. - Diagnostics: reclaim wedged session lanes when stale active-run bookkeeping blocks queued work despite no forward progress. Fixes #85639. Thanks @openperf. - WebChat: keep message-tool replies visible in the chat while still summarizing internal tool results for the model. Fixes #86347. Thanks @shakkernerd. - Gateway/perf: fail startup benchmark samples when the Gateway process exits before benchmark teardown, including signal deaths after readiness probes. - Gateway/perf: fail restart benchmark samples when the Gateway exits before benchmark teardown, including clean exits and signal deaths after successful restart probes. - Agents/tests: keep model catalog visibility on static selection helpers so catalog visibility checks avoid the broad model-selection barrel import. - Agents/commitments: serialize commitment store load-modify-save writes so concurrent heartbeat and CLI updates no longer lose dismissal, sent, or attempt state. (#81153) Thanks @ai-hpc. - xAI/LM Studio: promote plain-text tool-call fallbacks into structured tool calls and strip leaked internal tool syntax before user-facing delivery. (#86222) Thanks @fuller-stack-dev. - CLI: suppress benign self-update version-skew warnings during package post-update finalization. - Gateway/perf: tighten restart and startup benchmark failure handling so long profiling runs, failed probes, and fresh Linux runners no longer produce false passing or `n/a` results. - Checks: keep intentional Knip unused-file findings optional so full CI and sparse proof workspaces stay aligned. - Docker: restore writable `~/.config` in runtime images. Fixes #85968. Thanks @hkoessler and @Bartok9. - Plugin SDK: keep legacy root diagnostic subscriptions connected when built plugin SDK aliases resolve diagnostic helpers through a separate module graph. - Diagnostics: export alertable OTel and Prometheus signals for blocked tools, model failover, stale sessions, liveness warnings, oversized payloads, and webhook ingress while fixing shared OTLP endpoints with query strings. - Tests: normalize macOS canonical temp paths in exec allowlists, fs-safe trash assertions, installed plugin matching, Telegram topic-name stores, and built ACPX MCP server expectations so native macOS proof runners cover the intended behavior. - Codex/app-server: preserve message-tool-only source reply delivery mode on active runs so sub-agent completion wakeups can steer the active Codex turn instead of being rejected. (#86287) Thanks @ferminquant. - Tests: sample the Windows kitchen-sink RPC gateway directly and serialize RSS probes so native runs keep the memory guard active. - Tests: normalize bundled plugin lifecycle probe paths and state-root lookup so native Windows release sweeps accept valid packaged plugin installs. - Agents/Claude CLI: route live native Bash permission requests through OpenClaw exec policy so Claude turns no longer stall on `control_request`, and document that OpenClaw exec policy is authoritative. Fixes #80819. (#86330, from #81971) Thanks @guthirry and @sallyom. - Security audit: warn when YOLO OpenClaw exec policy overrides a restrictive raw Claude `--permission-mode` for managed live sessions. (#86557) Thanks @sallyom. - Config: keep benign legacy metadata write anomalies out of default doctor and config command output while preserving explicit anomaly logging for diagnostics. - Codex: log when implicit app-server `never` approvals are promoted for OpenClaw tool policy, including whether the trigger was a `before_tool_call` hook or trusted tool policy. - Codex harness: make subscription usage-limit errors without reset times explain that OpenClaw cannot determine the reset and point users to wait until Codex is available, use another Codex account, or switch to another configured model/provider. Thanks @amknight. - Google Vertex: support production ADC modes such as Workload Identity Federation, service-account credentials, and metadata-server ADC for the native Vertex transport. (#83971) Thanks @damianFelixPago. - Telegram: route normal `[telegram][diag]` polling diagnostics through `runtime.log` while keeping non-diag warnings and persistence failures on `runtime.error`, so healthy polling startup no longer looks like an error. Fixes #82957. (#82958) Thanks @galiniliev. - Providers/Ollama: strip inline Kimi cloud reasoning prefixes from streamed and final visible replies while keeping ordinary Kimi answers append-only. (#86286) Thanks @jason-allen-oneal. - Gateway: require Talk secret authority before setup-code handoff can include Talk secrets. (#85690) Thanks @ngutman. - Agents: keep fallback error reporting scoped to the active model candidate so stale prior-provider quota/auth text is not reported for later fallback attempts. (#86134) Thanks @zhangguiping-xydt. - iMessage: dedupe watcher startup when `channels.imessage.accounts` lists both `default` and a named account that point at the same local Messages source, so the gateway no longer spawns two `imsg rpc` processes or doubles inbound replies; the dedupe is scoped to watcher startup, leaving duplicate accounts addressable for outbound sends, status, and capability listings, and `openclaw doctor` flags the redundant account with a rebinding hint. Fixes #65141. (#86705) Thanks @swang430. ## 2026.5.22 ### Changes - Gateway/perf: reuse process-stable channel catalog reads, avoid repeated bundled-channel boundary checks, and rotate gateway watch CPU profiles so benchmark runs do not accumulate unbounded artifacts. - Gateway/perf: reuse immutable plugin metadata snapshots across startup, config, model, channel, setup, and secret metadata readers so hot paths avoid repeated plugin file stats and manifest registry reloads. - Gateway/perf: lazy-load startup-idle plugin work, core gateway method handlers, and the embedded ACPX runtime so Gateway health and ready signals no longer wait on unused handler trees or ACPX probes. - Gateway/perf: cache plugin SDK public-surface alias maps and skip irrelevant macOS Linuxbrew PATH probes so Gateway startup avoids repeated filesystem walks and slow missing-directory stats. - Transcripts: add the initial transcript capture and source-provider foundation, including auto-start capture config, manual transcript imports, read-only transcript access, and Discord voice as the first live source. - Docs/channels/config: add Signal `configPath`, Telegram wildcard topic defaults, local-time backup archive names, Termux home fallback, include-path validation, secret-scanner-safe placeholder guidance, Gemini CLI/Antigravity media guidance, and macOS VM auto-login guidance. Thanks @NorseGaud, @yudistiraashadi, @huangqian8, @VibhorGautam, @maweibin, @tianxingleo, @IgnacioPro, and @xzcxzcyy-claw. - Docs: clarify model-usage portability, Codex migration prerequisites, status bootstrap wording, thread-bound subagent limits, hook ownership, and config-preserving safety guidance. Thanks @aniruddhaadak80, @leno23, @TomDjerry, @matthewxmurphy, @vincentkoc, and @stablegenius49. - Docs: clarify README onboarding and Gateway startup paths, WhatsApp QR/408 recovery, cron output language prompts, skill advanced features, gateway upstream 403 troubleshooting, and plugin fallback override guidance. Thanks @deepujain, @Zacxxx, @Jah-yee, @neyric, @usimic, @Renu-Cybe, @BigUncle, and @SeashoreShi. - Docs: clarify context-pruning ratio bounds, local dashboard recovery, CLI env markers, remote onboarding token behavior, and Peekaboo Bridge permissions for subprocess agents. Thanks @ayesha-aziz123, @dishraters, @hougangdev, and @brandonlipman. - Docs: clarify browser CDP diagnostics, Plugin SDK allowlist imports, status-reaction timing defaults, queue steering behavior, limited-tool troubleshooting, cron HEARTBEAT handling, Telegram multi-agent groups, Bitwarden SecretRef setup, and EasyRunner deployments. Thanks @Quratulain-bilal, @mbelinky, @Mickey-, @vancece, @xenouzik, @posigit, @surlymochan, @janaka, and @choiking. - Crabbox/Testbox: run clean sparse-checkout Testbox syncs from a temporary full checkout and route remote changed gates through Corepack pnpm. - Docs: clarify IPv4-only Gateway BYOH binding, trusted-proxy scope clearing, Android pairing approval, macOS Accessibility grants, Zalo profile env vars, password-store SecretRef setup, and Chinese memory navigation. Thanks @itskai-dev, @gwh7078, @longstoryscott, @MoeJaberr, and @yuaiccc. - Docs: consolidate GLM under Z.AI, add the Upstash Box install guide and Gateway exposure runbook, clarify MEDIA directives, Copilot and Voyage setup, config path quoting, real behavior proof, and memory-file write guidance. Thanks @BobDu, @alitariksahin, @Jefsky, @musaabhasan, @OmerZeyveli, @leno23, @WuKongAI-CMU, @luoyanglang, and @majin1102. - Docs: clarify media provider credentials, Codex/OpenClaw code-mode boundaries, Slack and Telegram ack reactions, Feishu dynamic agents, secrets plaintext boundaries, memory guidance, and Chinese glossary terms. Thanks @nielskaspers, @cosmopolitan033, @drclaw-iq, @alexgduarte, @zccyman, @chengoak, and @cassthebandit. - Packaging: exclude documentation images and assets from the npm tarball, reducing published package size without affecting runtime docs search or CLI behavior. Thanks @SebTardif. - Media understanding: stop auto-probing Gemini CLI and use Antigravity CLI only as a lower-priority image/video fallback after configured provider APIs. - Agents/subagents: limit default sub-agent bootstrap context to `AGENTS.md` and `TOOLS.md`, keeping persona, identity, user, memory, heartbeat, and setup files out of delegated workers by default. (#85283) Thanks @100yenadmin. - Maintainer skills: exclude plugin SDK/API boundary work from `openclaw-landable-bug-sweep` so bugbash sweeps stay focused on small paper-cut fixes. - QA-Lab/diagnostics: extend the OpenTelemetry smoke harness to prove trace, metric, and log export, and add first-class Prometheus and observability smoke aliases. - Plugin SDK: add a generic channel-message poll sender so channel plugins can expose poll delivery without depending on channel-specific SDK facades. - Crabbox: keep the local wrapper's provider validation synced with the installed Crabbox binary while preserving supported aliases such as `docker` and `blacksmith`. (#85302) Thanks @hxy91819. - Maintainer skills: add `openclaw-landable-bug-sweep` for producing five small, reviewed, CI-green OpenClaw bugfix PRs from issue/PR sweeps. - Control UI/chat: add search and Load More pagination to the chat session picker, keeping initial session loads bounded while making older conversations reachable. (#85237) Thanks @amknight. - CLI/onboarding: start classic onboarding when bare `openclaw` runs before an authored config exists, while keeping configured installs on Crestodian. (#72343) Thanks @fuller-stack-dev. - Agents/runtime: internalize the former Pi agent runtime into OpenClaw, remove legacy package dependencies, and keep Pi-named SDK aliases only as deprecated plugin compatibility. - Discord: allow configuring a bounded `agentComponents.ttlMs` callback registry lifetime for long-running component workflows, with per-account overrides and a 24-hour cap. (#84189) Thanks @100menotu001. - xAI/Grok: reuse xAI OAuth auth profiles for Grok `web_search`, thread active-agent auth through web search, add Grok model aliases, and let media providers declare default operation timeouts. (#85182) Thanks @fuller-stack-dev. - Plugin SDK: add row-level session workflow helpers and deprecate `loadSessionStore` so plugins can read and patch sessions without depending on the legacy whole-store shape. (#84693) Thanks @efpiva. - Gateway/plugins: reuse a compatible Gateway startup plugin registry during dispatch so safe plugin dispatches avoid redundant registry loading. (#84324) Thanks @ai-hpc. - Plugins/SDK: add a general `embeddingProviders` capability contract and registration API so embeddings can become a reusable provider surface outside memory-specific adapters. - Dependencies: refresh provider, plugin, UI, and tooling packages, update `protobufjs` to 8.4.0 to clear the current npm advisory, and carry the Claude ACP completion patch forward to `@agentclientprotocol/claude-agent-acp` 0.36.1. - Agents/tools: remove the old sender-owner tool gating path so configured tools stay visible for trusted sessions while command and channel-action auth still carry real sender identity. - QA-Lab: add curated mock JSONL replay fixtures and first-drift reporting for runtime-parity audits. (#80323, refs #80176) Thanks @100yenadmin. - QA-Lab: add a QA bus tool-trace visibility scenario for sanitized tool-call assertions. - QA-Lab: replace generic evidence framing in seeded scenario prompts with concrete observed QA behavior. - QA-Lab: list named scenario packs in the coverage report so personal-agent privacy coverage stays visible in audits. - QA-Lab: list live transport lane membership in the coverage report so real transport checks stay separate from seeded qa-channel scenarios. - Release/package: run package integrity checks before package acceptance lanes so public install/update validation fails before private QA assets can leak into the package. - QA-Lab: include the optional 100-turn runtime parity soak in release-soak artifacts so long-run Codex/Pi transcript drift stays visible outside the default gate. (#80395) Thanks @100yenadmin. - QA-Lab: add a live-only long-context progress watchdog scenario for Codex app-server timeout and stalled-run sentinels. (#80323) Thanks @100yenadmin. - QA-Lab: tag gateway restart recovery and streaming final-integrity scenarios as live-only runtime parity lanes. (#80323) Thanks @100yenadmin. - QA-Lab: add a personal-agent failure recovery scenario that checks honest partial status, retry boundaries, and local recovery artifacts. (#83872) Thanks @iFiras-Max1. - QA-Lab: include an opt-in `update.run` package self-upgrade sentinel for destructive latest-package recovery checks. - QA-Lab: add Codex plugin lifecycle and auth-profile fixture coverage for missing installs, pinned-version drift, first-turn install ordering, and doctor migration safety. (#80323, refs #80174) Thanks @100yenadmin. - Models/perf: pre-warm the provider auth-state map at gateway startup so `/models` and every model-listing call short-circuits the per-provider plugin / external-CLI discovery on the hot path. Per-call cost drops from ~20 s to ~5 ms (~4,100×); the one-time startup warm resets and re-warms after hot reloads. (#84816) Thanks @sjf. - Release/security: ship the root npm package and OpenClaw-owned npm plugins with generated shrinkwrap, support bundled plugin runtime dependencies for suitable plugin tarballs, and require review for lockfile/shrinkwrap changes so published installs use locked dependency graphs. - Tests/perf: isolate doctor core health check unit coverage from real skills/workspace discovery so `doctor-core-checks` no longer dominates unit perf while keeping one real skills-readiness smoke. (#84493) Thanks @frankekn. ### Fixes - WebChat: summarize internal message-tool source replies so tool cards no longer duplicate the visible reply body. (#84773) Thanks @jason-allen-oneal. - Gateway: preserve deferred lifecycle-error cleanup across later non-terminal events so provider timeouts can persist failed session state instead of leaving sessions stuck running. (#85256, fixes #63819) Thanks @samzong. - Agents/subagents: report tool-only child progress during timeout summaries instead of showing no visible output. - Telegram/ACP: preserve explicit `:topic:` conversation suffixes when inbound ACP targets do not carry a separate thread id. - Browser/proxy: bypass the managed proxy for the exact local managed Chrome CDP readiness and DevTools WebSocket endpoints, so `openclaw browser start` works when the operator proxy blocks loopback egress. (#83255) Thanks @lightcap. - Ollama: bypass the managed proxy for configured local embedding origins while keeping SSRF guardrails on unconfigured targets. Thanks @Kaspre. - OpenAI/images: route Codex API-key image generation through the native OpenAI Images API instead of the Codex OAuth streaming backend, avoiding 401s from valid API keys. - Agents/OpenAI completions: omit empty tool payload fields for proxy-like OpenAI-compatible endpoints so strict vLLM-style servers accept tool-free turns. (#85835) Thanks @rendrag-git. - Checks/Windows: route full `pnpm check` stage commands through the managed child runner so Windows avoids Node shell-argv deprecation warnings there too. - Checks/Windows: run managed child commands through explicit `cmd.exe` wrapping instead of Node shell mode with argv, avoiding Node 24 subprocess deprecation warnings during changed checks. - Gateway: omit internal stream-error placeholder entries from agent prompt history so failed assistant turns are not replayed as model-authored text. (#85652) Thanks @anyech. - Sessions: enforce the session write-lock max-hold policy during lock acquisition so long-held locks can be reclaimed before the stale-lock window. (#85764) Thanks @njuboy11. - Models: prune retired Groq, GitHub Copilot, OpenAI, xAI, and old Claude catalog entries, with doctor migration to upgrade existing configs to current provider refs. - Doctor/update: recognize junction-backed source checkouts as git installs by comparing canonical paths before showing package-manager update guidance. Fixes #82215. Thanks @igormf. - Channels: honor `/verbose on` for tool/progress summaries across direct chats, groups, channels, and forum topics while preserving quiet default behavior. (#85488) Thanks @kurplunkin. - CLI/skills: show an all-ready note with next-step commands when skill setup has no missing dependencies to install. (#85032) Thanks @aniruddhaadak80. - Microsoft Foundry: route DeepSeek V4 Pro and Flash models through the Foundry Responses API while keeping older DeepSeek models on their existing path. (#85549) Thanks @roslinmahmud. - Status/usage: show configured cost estimates for AWS SDK models in full usage output while keeping token-only usage replies cost-free. (#85619) Thanks @ItsOtherMauridian. - Agents/OpenAI Responses: retry non-visible reasoning-only turns for OpenAI Responses API families instead of treating them as empty failed turns. (#85603) Thanks @SebTardif. - Directive tags: preserve message and content-part object identity when display stripping makes no directive-tag changes. (#85682) Thanks @willamhou. - Telegram: send local `path`/`filePath` and structured attachment media from `sendMessage` actions instead of dropping them or sending text-only messages. (#85219) Thanks @keshavbotagent. - Sessions/status: show the estimated context budget when fresh provider usage is unavailable and clear stale estimates across session resets and compaction boundaries. (#84830) Thanks @giodl73-repo. - Gateway/config: pin relative `OPENCLAW_STATE_DIR` overrides to an absolute path at startup so later working-directory changes cannot retarget gateway state. (#52264) Thanks @PerfectPan. - Release/package: run npm release, prepublish, and postpublish verification through Windows-safe npm command shims so native Windows checks can execute `npm.cmd` instead of treating it as a binary. - Agents/harness: pass CLI runtime aliases through harness selection so provider-owned CLI aliases no longer get rejected before reaching the right runtime. (#85631) Thanks @potterdigital. - Secrets: show the irreversible apply warning after interactive `secrets configure` confirmation so confirmed migrations still get the final safety prompt. (#85638) Thanks @alkor2000. - Agents/CLI output: ignore cumulative Claude `stream-json` result usage when assistant usage events are present, preventing inflated cache-read accounting. (#85625) Thanks @zhouhe-xydt. - CLI: keep `waitForever()` alive by leaving its keep-alive interval ref'd so the public helper no longer exits immediately with Node's unsettled-await code. (#85694) Thanks @m1qaweb. - Agents/bootstrap: guard bootstrap name checks against missing file names so malformed bootstrap entries warn and truncate instead of crashing. Fixes #85523. (#85615) Thanks @zhouhe-xydt. - CLI/tasks: reject partially numeric `openclaw tasks audit --limit` values so audit limits must be real positive integers instead of accepting strings like `5abc`. (#84901) Thanks @jbetala7. - Status/diagnostics: bound deep Docker audit probes so `openclaw status --deep` reports slow container checks instead of hanging behind unbounded inspection. (#85476) Thanks @giodl73-repo. - Providers/Anthropic: migrate 1M context handling to GA-capable Claude 4.x models by sizing eligible models at 1M without the retired `context-1m-2025-08-07` beta, ignoring that retired beta in older configs, and preserving OAuth-required Anthropic beta headers. (#45613) Thanks @haoyu-haoyu. - Cron/Telegram: parse forum-topic delivery targets through the Telegram plugin instead of cron core, including `:topic:` and `:topicId` forms for announce delivery. Thanks @etticat. - Twitch: keep stale message-handler cleanup callbacks from removing newer handler registrations for the same account, preserving inbound message delivery after reconnects. Fixes #83888. (#85425) Thanks @alkor2000. - Memory/LanceDB: expose public memory artifacts through the active memory provider bridge so memory-wiki imports durable memory files, daily notes, dream reports, and event logs without depending on memory-core internals. Fixes #83604. (#85060) Thanks @brokemac79. - Crabbox: keep AWS hydration compatible with local Actions replay by inlining the hydrate workflow's Node/pnpm setup instead of invoking repo-local composite actions. - Agents/subagents: simplify native sub-agent completion handoff so children report their latest visible assistant result to the requester without using `message`, while keeping parent-owned message-tool delivery policy intact. Fixes #85070. (#85089) Thanks @brokemac79. - Docker setup: stop printing the Gateway bearer token in setup logs and printed follow-up commands. - Agents: let embedded compaction fallback retries proceed when PI-compatible candidates do not need agent harness plugin preparation. - Agents/tools: honor configured custom provider API keys when deciding whether media, image-generation, video-generation, music-generation, and PDF tools are available. (#85570) - StepFun: stop advertising stale generic API key auth choices so onboarding only offers runtime-backed Standard and Step Plan choices. - Diagnostics: keep OpenTelemetry log bodies behind explicit content capture and scrub scoped agent-session keys from OpenTelemetry and Prometheus labels while preserving bounded queue-lane prefixes. - Windows installer: fail Git checkout installs when `pnpm install` or `pnpm build` fails instead of writing a wrapper to a missing CLI build. - Sessions: surface previous-transcript archive failures during `/new` rotation so disk rename errors are logged instead of silently hiding stranded transcript files. Fixes #81984. (#85586, from #82081) Thanks @0xghost42. - TUI/agents: mirror internal-ui message-tool replies into final chat output so message-tool-only agents remain visible in `openclaw tui`. Fixes #85538. Thanks @danpolasek. - Agents: keep parallel OpenAI-compatible tool-call deltas in separate argument buffers so interleaved tool calls no longer corrupt streamed arguments. (#82263) Thanks @luna-system. - Memory/doctor: report missing or unusable QMD workspace directories as workspace failures instead of generic binary failures. (#63167) Thanks @sercada. - Debug proxy: record CONNECT client-socket errors and destroy the paired upstream socket so abrupt client disconnects no longer leak tunnel resources. (#82444) Thanks @SebTardif. - Diffs: continue hydrating later diff cards when one card fails so a single broken card no longer blanks the whole diff viewer. (#84775) Thanks @cosmopolitan033. - Mac app: use the native settings sidebar window chrome so the sidebar toggle stays on the left and content no longer clips under oversized titlebar padding. - QA-Lab/Codex: bundle auth/plugin fixture imports for flow scenarios and let terminal async media tools end Codex app-server turns without timing out. (#80397, refs #80323) Thanks @100yenadmin. - Gateway/agents: preserve fresh session overrides and metadata when stale cached agent-session entries race with store updates, so subagent model/provider overrides and routing policy survive concurrent writes. (#19328) Thanks @CodeReclaimers. - Control UI/chat: keep chat session search inline with the session selector so the header no longer shows a duplicate standalone search row. - Control UI/chat: collapse focused-mode header chrome and suppress hidden-header scroll updates so focus mode no longer jumps while scrolling. Thanks @amknight. - Codex app-server: restart the native app-server and retry once when server-side compaction times out, so preflight compaction stalls recover instead of failing every dispatch. (#85500) - Restore Control UI gateway token pairing [AI]. (#85459) Thanks @pgondhi987. - OpenAI video: honor configured provider request private-network opt-in for local/custom video endpoints so explicitly trusted mock and self-hosted providers are not blocked. Thanks @shakkernerd. - OpenAI video: send uploaded video edit requests to the documented `/videos/edits` endpoint with a `video` file instead of posting MP4 references to `/videos`. Thanks @shakkernerd. - Agents/channels: preserve message-tool delivery evidence through gateway agent completion handoffs so successful generated media sends are not followed by false failure messages. Thanks @shakkernerd. - CLI/update: repair managed npm plugin `openclaw` peer links during post-core convergence and reject stale or wrong-target peer links before restart. (#83794) Thanks @fuller-stack-dev. - CLI/agents: default new omitted-account bindings to all accounts when the channel has multiple configured accounts, and clarify account-scope docs. (#49769) Thanks @Gcaufy. - Codex app-server: let authorized `/codex` control commands such as `/codex detach` escape plugin-owned conversation bindings while keeping unknown or unauthorized slash text routed to the bound plugin. Fixes #85157. (#85188) Thanks @TurboTheTurtle. - Auto-reply/models: keep `/models` browse replies fast by sharing the bounded read-only catalog path with Gateway model listing. (#84735) Thanks @safrano9999. - Codex app-server: disable native Code Mode when the effective exec host is `node` and keep OpenClaw `exec`/`process` available, so `/exec host=node` routes shell commands through the selected node instead of the gateway. Fixes #85012. (#85090) Thanks @sahilsatralkar. - Agents: bound embedded auto-compaction session write-lock watchdogs to the compaction timeout instead of the full run timeout, so stuck compaction cannot hold the live session lock for the whole run window. (#84949) Thanks @luoyanglang. - Gateway/agents: return phase-aware `agent.wait` timeout attribution and only cool auth profiles on provider-started timeouts. Refs #65504. Thanks @100yenadmin. - Gateway: defer provider auth-state prewarm until after startup readiness so early gateway tool/session requests are not blocked by provider auth discovery. (#85272) Thanks @dutifulbob. - Gateway/models: coalesce provider auth-state rewarms after auth-profile failures and log event-loop delay for warm/rewarm work, so provider auth bursts no longer stack full auth sweeps behind channel replies. - Gateway/models: stop cancelled provider auth-state prewarms from continuing full provider sweeps, so reload and auth-failure bursts no longer keep startup busy. - Agents/Codex: show the first plan update as a transient chat status notice without counting it as final assistant content. - CLI/update: walk the macOS process ancestry and honor the inherited Gateway runtime PID before package updates stop the managed Gateway service, so nested in-band updater children can refuse instead of killing the LaunchAgent-supervised Gateway that owns them. Fixes #85120. - Gateway/LaunchAgent: wait for launchd reload bootout to finish and fall back to kickstart when bootstrap races, so reload handoff does not leave the service deregistered. Fixes #84630. (#84641) Thanks @NianJiuZst. - Gateway/LaunchAgent: treat a concurrent launchd bootstrap as a successful restart when the service is already loaded, avoiding false macOS Gateway restart failures. Fixes #84721. (#84722) Thanks @googlerest. - Gateway/service: include the active `openclaw` command bin directory in managed service PATH generation and doctor audit expectations for npm-global macOS installs. Fixes #84201. (#84475) Thanks @jbetala7. - Control UI/chat: disable the thinking selector for known non-reasoning models instead of showing duplicate Off choices. Fixes #84069. Thanks @DrippingMellow. - Memory: expand `~` in configured extra memory paths before resolving them, so home-relative folders are not treated as workspace-relative. Fixes #58026. Thanks @stadman. - Skills: treat `openclaw.os: macos` as Darwin when checking skill requirements, so macOS-only skills no longer report as missing on macOS hosts. Fixes #61338. Thanks @Jessecq1995. - Control UI/logs: strip ANSI escape sequences from displayed Gateway log messages so color codes no longer appear as raw text. Fixes #64399. Thanks @guguangxin-eng. - Docker: pre-create the workspace and auth-profile config mount points with `node` ownership so first-run named volumes do not start root-owned. Fixes #85076. Thanks @Noerr. - Telegram: pass configured markdown table mode through outbound markdown chunking so chunked sends render tables consistently. Fixes #85085. Thanks @ShuaiHui. - CLI/update: preserve managed Gateway service environment during package cutovers so macOS LaunchAgent repair/restart reads the pre-update service state instead of caller shell state. (#83026) - Agents/providers: honor per-model `api` and `baseUrl` overrides in custom provider auth hooks and transport selection. Fixes #80487. (#80488) Thanks @huveewomg. - Gateway/restart: eager-load the lifecycle runtime before in-place upgrade signal handling so package replacement does not deadlock restart imports. (#84890) Thanks @myps6415. - CLI/update: start managed Gateway update handoff helpers from a stable existing directory and tolerate deleted cwd/package roots during macOS LaunchAgent handoff. Fixes #83808. (#83875) Thanks @jason-allen-oneal. - Skills: watch each shared skill directory once across agent workspaces instead of once per agent, preventing file-descriptor exhaustion (`EMFILE`) that disposed bundle-mcp processes and stalled sessions on multi-agent gateways. Fixes #84968. (#85130) Thanks @openperf. - Release/security: keep generated npm shrinkwrap package versions inside the pnpm lock graph so published package locks cannot bypass pnpm dependency age and override policy. - Cron: honor `cron.retry.retryOn: ["network"]` for common network error codes such as `EAI_AGAIN`, `EHOSTUNREACH`, and `ENETUNREACH`. - Gateway chat: broadcast returned agent-run error payloads after an agent starts so ACP/WebChat clients receive terminal idle-timeout errors. Fixes #84945. - Gateway chat display: preserve OpenAI-compatible `prompt_tokens`, `completion_tokens`, and `total_tokens` usage fields in sanitized chat history so llama.cpp sessions keep context counts. Fixes #77992. Thanks @MarTT79. - Dashboard/CLI: allow macOS browser launching through `open` even when SSH environment variables are present, while preserving Linux SSH no-display protection. Fixes #67088. Thanks @theglove44. - Codex app-server: keep native web search observations out of mirrored chat transcripts while preserving tool progress telemetry. Fixes #85109. Thanks @ugitmebaby. - OpenCode Go: strip unsupported Kimi reasoning replay fields before provider requests so repeated `kimi-k2.6` turns do not fail schema validation. Fixes #83812. Thanks @Sleeck. - Browser/CDP: add a WSL2 portproxy self-loop hint when Chrome DevTools endpoints accept connections but return an empty HTTP reply. Fixes #59209. Thanks @Owlock. - Agents/OpenAI: preserve structured provider error code, type, and redacted body metadata on boundary-aware transport failures. - Doctor/Codex: point native Codex asset warnings at the canonical `openclaw migrate plan codex` preview command. Fixes #84948. Thanks @markoa. - CLI/models: make `capability model auth logout --agent` remove auth profiles from the selected non-default agent store. Fixes #85092. Thanks @islandpreneur007. - Gateway/models: reuse prepared provider auth metadata during model-listing auth checks so repeated lookups avoid broad plugin discovery while preserving synthetic local auth. - CLI/status: suppress systemd user-service setup hints when `openclaw status --deep` can already reach a running Gateway RPC service. Fixes #85094. Thanks @islandpreneur007. - CLI/devices: recover local approval when a same-device repair request replaces the request ID being approved. - CLI/agents: retry transient normal-close Gateway handshakes before falling back to embedded `openclaw agent` execution. - CLI/update: keep managed Gateway service stop/restart status lines out of `openclaw update --json` stdout so package-update automation can parse the JSON payload. - Plugins: resolve OpenClaw plugin SDK subpaths for native external plugin runtimes without mutating package installs or broadening process-wide module resolution. - Agents/OpenAI: preserve Responses and Chat Completions `reasoning_tokens` usage metadata without double-counting it in aggregate output tokens. (#85319) - Control UI/chat: convert pasted `data:image/...;base64,...` clipboard text into an image attachment instead of dumping the payload into the composer. Fixes #62604. Thanks @cpwilhelmi. - Providers/Gemini: strip fractional seconds from web-search time range filters so Gemini accepts freshness-bound search requests. (#85071) Thanks @Noerr. - OpenAI Codex: preserve image input support for sparse `openai-codex/gpt-5.5` catalog rows. (#85095) Thanks @sercada. - CLI/models: add a piped or pasted API-key path for OpenAI Codex auth and warn when API keys are pasted into token-mode auth. (#85533) Thanks @joshavant. - Telegram: dead-letter missing-harness isolated ingress failures so a poisoned spooled update no longer blocks later same-lane messages. Fixes #85470. (#85605) Thanks @joshavant. - Plugins/discovery: strip `-plugin` package suffixes when deriving plugin id hints so package names line up with manifest ids. (#85170) Thanks @JulyanXu. - Tlon: stop advertising a non-existent agent tool contract in the plugin manifest. - Telegram: preserve fenced code block languages through Markdown rendering so Telegram receives `language-*` code classes. (#85209) Thanks @leno23. - Windows installer: run npm and Corepack command shims from a Windows-local directory so installs launched from WSL2 UNC paths do not fail before OpenClaw is installed. - Windows updates: roll back git-backed updates to the previous checkout when dependency install, build, UI build, or doctor repair fails. - Windows installer: persist user-local portable Git on PATH and activate the repo-pinned pnpm version for git-backed installs and updates. - Windows installer: bootstrap a user-local portable Node.js when native Windows has no Node and no winget, Chocolatey, or Scoop, so first-run installs can continue on raw hosts. - Windows installer: extract the downloaded portable Node.js directory with native `tar` before falling back to .NET zip extraction, avoiding PowerShell 5.1 archive and path-length failures. - fix(integrations): enforce channel read target allowlists [AI]. (#84982) Thanks @pgondhi987. - Agents/heartbeat: route single-owner `session.dmScope=main` direct-message exec and cron event wakes back to the agent main session so async completions no longer strand context in orphan direct-DM queues. Fixes #71581. (#83743) Thanks @Kaspre. - Agents/code-mode: expose outer code-mode `exec` source through the `command` hook alias with `toolKind`/`toolInputKind` discriminators so exec-shaped policies can distinguish code-mode cells. (#83483) Thanks @Kaspre. - Agents/code mode: return structured timeout and runtime-unavailable error codes for known worker failures. Fixes #83389. (#83444) Thanks @Kaspre. - QA-Lab: isolate multi-scenario suite workers when scenarios need startup config patches, preventing message-routing config from leaking into unrelated scenarios. - QA-Lab: make the commitments heartbeat-target-none scenario request an immediate heartbeat instead of waiting for the next scheduled heartbeat. - Codex/Plugin SDK: deliver Codex-native subagent completions through a generic harness task runtime so harness-backed plugins can mirror durable task lifecycle and completion delivery without Codex-specific SDK imports. (#83445) Thanks @bryanpearson. - Gateway CLI: surface local post-challenge connect assembly failures immediately instead of waiting for the wrapper timeout. Fixes #68944. (#85253) Thanks @samzong. - Messages: strip unsupported web-search citation control markers from outbound replies before they reach WebChat or external channels. Fixes #85193. (#85204) Thanks @neeravmakwana. - Agents/exec: treat denied exec approvals as terminal instead of feeding them back into agent follow-up work, and recognize Chinese stop phrases in abort handling. Fixes #69386. (#85194) Thanks @samzong. - CLI/agents: abort accepted Gateway-backed `openclaw agent` runs on SIGINT/SIGTERM so cron and supervisor timeouts do not leave remote agent work alive. Fixes #71710. (#84381) Thanks @Kaspre. - Codex app-server: retry replay-safe stdio client-close turns once using structured failure metadata, while surfacing idle `turn/completed` timeouts instead of blindly replaying active shared-server turns. Thanks @VACInc. - Codex app-server: reject command overrides that embed Node or package-manager arguments and point users to `appServer.args`, so Windows startup avoids shell parsing failures. (#84417) Thanks @TurboTheTurtle. - Agents/Copilot: drop unsafe GitHub Copilot Responses reasoning replay items before send so Telegram direct sessions no longer fail on overlong replay IDs. Fixes #85197. (#85198) Thanks @galiniliev. - UI: add accessible tooltips to the topbar color-mode buttons so System, Light, and Dark choices are labeled on hover and focus. (#85227) Thanks @amknight. - fix: constrain Windows task script names [AI]. (#85064) Thanks @pgondhi987. - Control UI: keep the chat session picker from hiding older or cross-agent configured conversations while preserving the bounded configured-agent refresh. (#85211) Thanks @amknight. - Agents/Anthropic: preserve unsafe integer tool-call input values in streamed Anthropic tool-use JSON, preventing Discord-style IDs from being rounded before dispatch. Fixes #47229. (#83063) Thanks @leno23. - Agents/Codex: estimate tool-heavy prompt pressure at the LLM boundary before provider submission, so persistent sessions compact before overflowing context windows. (#85541) Thanks @fuller-stack-dev and @joshavant. - Agents/hooks: wait for local one-shot CLI and Codex `agent_end` plugin hooks before process cleanup so terminal observability flushes reliably. (#85007) - Providers/Google: preserve Gemini 3 cron `thinkingDefault: "low"` when stale catalog metadata says `reasoning:false`, so scheduled runs keep provider-supported thinking instead of downgrading to off. (#85185) Thanks @neeravmakwana. - CLI/agents: allow `openclaw agent --session-key` to target explicit session keys, including agent-scoped legacy keys. (#85121) Thanks @Kaspre. - Auto-reply/ACP: wait for same-channel block reply delivery before starting tool work, while still honoring ACP dispatch aborts so stopped turns do not wait on slow channel sends. (#83722) Thanks @IWhatsskill. - Codex/ACP: mark required child-run completions that only report progress, omit a final deliverable, or fail requester delivery as blocked while preserving real final reports. (#85110) Thanks @IWhatsskill. - Channels: treat bare abort messages such as `stop`, `abort`, and `wait` as immediate control commands in inbound debounce paths so stop requests are not delayed behind pending message coalescing. (#83348) Thanks @IWhatsskill. - Channels/message tool: resolve configured external channel plugins during in-agent channel selection, so `openclaw agent --local` message-tool sends no longer report an available channel as unavailable. (#85022) Thanks @Kaspre. - Agents/heartbeat: honor group/channel `message_tool` visible-reply policy and model-specific Codex runtime config for scheduled heartbeat runs, so failed internal tool output stays private. Fixes #85310. (#85357) Thanks @neeravmakwana. - Gateway/ACP: close child ACP sessions spawned via `sessions_spawn` when their parent session is reset or deleted, instead of leaving orphaned `claude-agent-acp` processes that accumulate and exhaust memory. Fixes #68916. (#85190) Thanks @openperf. - Codex app-server: block native execution paths when OpenClaw exec resolves to a node host while preserving the first-party CLI node binding path. Fixes #85012. (#85534) Thanks @joshavant. - Diagnostics: bound cleanup timeout detail logs, emit drop summaries when async diagnostic bursts exceed the queue cap, and surface async queue drops through diagnostic telemetry. - Agents/subagents: surface blocked child-run completions as errors instead of successful subagent finishes. (#80886) Thanks @TurboTheTurtle. - Context engines: fail closed with a descriptive error when the selected agent runtime cannot satisfy declared context-engine host requirements. - Agents/Pi: treat accepted embedded `sessions_spawn` child-session handoffs as terminal progress so parent turns no longer report false non-deliverable failures. (#85054) Thanks @samzong. - CLI/models: resolve `openclaw models set` aliases from the runtime config while keeping authored aliases ahead of runtime-only defaults. (#83262) Thanks @IWhatsskill. - Doctor: show personal Codex CLI asset notices as info instead of warnings. Fixes #84859. - WhatsApp: update Baileys to `7.0.0-rc13` and drop the obsolete logger type patch. - CLI/update: pre-pack GitHub/git package update targets before the staged npm install, restoring `openclaw update --tag main` for one-off package updates. (#81296) Thanks @fuller-stack-dev. - Gateway: mirror successful same-source message-tool sends into session transcripts so delivered replies stay in later history/context. (#84837) Thanks @iFiras-Max1. - Media generation: keep image, music, and video completion delivery from duplicating or losing task ownership when generated media finishes through active session replies. (#84006) Thanks @fuller-stack-dev. - Infra/json: retry transient `File changed during read` races while loading JSON state so config and state reads recover instead of failing the turn. (#84285) - Plugins/providers: fail closed for workspace provider plugins during setup-mode discovery unless explicitly trusted, preventing untrusted workspace plugin code from running during provider setup. (#81069) Thanks @mmaps. - Providers/Ollama: resolve configured Ollama Cloud `OLLAMA_API_KEY` markers to the real discovery key so cloud provider entries keep authenticated model catalog access. (#85037) - Discord: keep persistent component registry fallback warnings actionable by forwarding structured error and cause metadata through the runtime logger. Fixes #84185. (#84190) Thanks @100menotu001. - Gateway/sessions: preserve compatible session auth profile overrides when switching models within the same provider, including provider-auth aliases. Fixes #81837. (#81886) Thanks @TurboTheTurtle. - Gateway/status: surface inbound delivery telemetry counters and transport-liveness warnings in `openclaw status --all`. Fixes #49577. (#72724) - Docker: prune package-excluded plugin source workspaces and dependency closures so runtime images do not keep packages for plugins that were not opted in. - Providers/Ollama: treat Docker/OrbStack host aliases as local Ollama endpoints so `ollama-local` marker auth works when OpenClaw runs inside a VM/container and Ollama runs on the host. Fixes #84875. - QA-Lab: keep explicitly searchable/deferred OpenClaw dynamic tool rows report-only by default so tool-coverage gates do not treat mock discovery gaps as hard product failures. (#80319) Thanks @100yenadmin. - Agents/config: keep non-Google provider model refs from being rewritten by Google Gemini preview-id normalization. (#84762) Thanks @zhangguiping-xydt. - Installer: require a real controlling terminal before launching onboarding so headless `curl | bash` installs finish cleanly after installing the CLI. - Agents/Codex: promote a completed final assistant response when a prompt timeout races Codex app-server completion instead of returning an empty timeout envelope. Refs #84516. - Codex app-server: keep interrupted turn statuses from being treated as OpenClaw aborts by themselves, so tool-only turns remain eligible for no-visible-answer recovery. Fixes #84492. - Agents: cap heartbeat model bleed context hints by the stored session window when runtime model metadata is unavailable, so overflow recovery advice does not suggest a larger window than the active session actually has. - Control UI/Web Push: use `https://openclaw.ai` as the generated default VAPID subject instead of the old localhost mailbox so iOS PWA push setup uses an Apple-acceptable subject when `OPENCLAW_VAPID_SUBJECT` is unset. Fixes #83134. (#83317) Thanks @IWhatsskill. - Control UI: distinguish inherited thinking-off settings from explicit Off selections so the thinking selector no longer shows two identical Off rows. (#85223) Thanks @amknight. - Agents/Pi: keep embedded session transcript writes from tripping false takeover detection after packaged npm onboarding agent turns. - Codex/TUI: surface Codex-native post-turn compaction failures instead of continuing uncompacted, and keep successful native compaction serialized before local idle/next-turn handling. Fixes #84305. (#85160) Thanks @joshavant. - Memory/search: stop recall tracking from writing dreaming side-effect artifacts when `dreaming.enabled=false`, while preserving normal search results. Fixes #84436. (#84444) Thanks @NianJiuZst. - Diffs: render viewer toolbar icons from a closed icon-name map instead of HTML strings, removing the toolbar icon XSS sink. (#83955) Thanks @tanshanshan. - QA: keep `pnpm qa:e2e` self-check runs inside the private QA runtime envelope even when inherited shell env disables bundled plugins. - fix(config): validate browser sandbox bind sources [AI]. (#84799) Thanks @pgondhi987. - doctor: constrain legacy plugin cleanup paths [AI]. (#84801) Thanks @pgondhi987. - Update/doctor: prune stale local bundled plugin install records that point at old compiled bundled output so current bundled plugin schemas win after upgrade. (#84863) Thanks @fuller-stack-dev. - Providers/Ollama: preserve native Ollama tool-call IDs across assistant replay so Gemini over Ollama Cloud can keep its hidden function-call thought-signature handle. - Discord: keep session recovery and `/stop` abort ownership on the source dispatch lane while bound ACP turns continue routing to their target session, so stalled pre-run work and late replies are cleared instead of leaking after stop. Fixes #84477. (#85100) Thanks @joshavant. - Codex app-server: mark missing turn completion after observed execution as replay-unsafe and release the session so follow-up turns can run. Fixes #84076. (#85107) Thanks @joshavant. - Codex app-server: give visible `message` dynamic tool sends a longer timeout budget so slow channel delivery can return its own result or error instead of hitting the 30-second Codex wrapper. (#85216) Thanks @amknight. - Codex app-server: add a dedicated post-tool raw assistant completion idle timeout config so trusted heavy turns can wait longer after tool handoff without weakening final assistant release. - Matrix: keep explicitly configured two-person rooms on the room route before stale `m.direct` or strict two-member DM fallback can bypass mention gating. Fixes #85017. (#85137) Thanks @joshavant. - Agents/subagents: require explicit subagent allowlist targets to be configured agents so stale deleted-agent ids are omitted from `agents_list` and rejected by `sessions_spawn`. Fixes #84811. (#85154) Thanks @joshavant. - PDF tool: time out idle remote PDF body reads after 120 seconds so stalled remote documents return an error instead of wedging the session. Fixes #68649. (#84768) Thanks @luoyanglang. - Diagnostics/OpenTelemetry plugin: suppress handled OTLP exporter promise rejections so collector shutdowns no longer crash the Gateway. (#81085) Thanks @luoyanglang. - Agents/exec: omit raw command text and env values from denied exec failure logs while keeping safe correlation metadata. Fixes #85049. (#85140) Thanks @joshavant. - Media/audio: skip empty structured sherpa-onnx transcripts instead of treating the raw JSON payload as spoken text. (#84667) Thanks @TurboTheTurtle. - Agents/exec: preserve inherited XDG base-directory environment values for subprocesses while still rejecting agent-supplied XDG overrides. Fixes #84854. (#85139) Thanks @joshavant. - Node/Linux: keep `OPENCLAW_GATEWAY_TOKEN` out of generated systemd unit files by writing node service token values to a node-specific env file. (#84408) - Memory-core/dreaming: reuse stable narrative subagent session keys per workspace and phase while keeping per-run idempotency and bounded cleanup, so stale `dreaming-narrative-*` sessions do not accumulate. Fixes #68252, #69187, and #70402. (#70464) Thanks @chiyouYCH. - Trajectory/support: tolerate partial skill snapshot entries when building support metadata so rejected skill path scans no longer abort trajectory capture. (#71185) Thanks @lukeboyett. - TUI: coalesce repeated idle Esc abort notices into a single `no active run xN` system row instead of appending duplicate rows. - Telegram: honor `channels.telegram.pollingStallThresholdMs` in the default isolated polling path, restarting silent workers instead of leaving inbound updates wedged. Fixes #83950. (#84861) Thanks @joshavant. - Telegram: dedupe replayed message dispatches by Telegram chat/message identity so isolated-ingress replays do not trigger duplicate model dispatches. Fixes #84886. (#85208) Thanks @joshavant. - Slack: suppress reasoning payloads before reply delivery and dispatch accounting, so Slack monitor, slash-command, fallback, and direct reply paths do not leak model reasoning. Fixes #84319. (#84322) Thanks @ffluk3 and @joshavant. - Slack: deliver native plugin approval prompts and updates when Slack native approvals are enabled, while keeping plugin approval authorization separate from exec approvers. - Slack: keep native plugin approval prompts in the originating app conversation thread when the live Slack turn source is a `D...` conversation. - Agents/Pi: disable the embedded pi-coding-agent runtime auto-retry so OpenClaw's own retry and failover loop does not replay failed tool calls through a nested SDK retry. Fixes #73781. (#74434) Thanks @yelog. - CLI/perf: keep `setup --help`, `onboard --help`, and `configure --help` out of the full wizard runtime while preserving the existing help output. (#84488) Thanks @frankekn. - CLI/perf: keep `agents --help` out of agents action/runtime imports so help, completion, and command discovery paths avoid loading the full agents runtime. (#84483) Thanks @frankekn. - CLI/perf: keep `secrets --help` and `nodes --help` on the precomputed help path so parent help avoids loading action-heavy command runtime modules. (#84818) Thanks @frankekn. - CLI/perf: serve `doctor`, `gateway`, `models`, and `plugins` parent help from startup metadata so common subcommand help avoids full CLI program construction. (#84786) Thanks @frankekn. - Codex/Lossless: keep context-engine history on the canonical run session when Telegram DMs use per-peer runtime policy keys. Fixes #84936. (#84954) Thanks @neeravmakwana. - Codex: keep heartbeat response tool schemas durable without exposing dynamic tools disabled by turn policy, so heartbeat wakeups can reuse threads while scoped tool allowlists stay enforced. (#84681) Thanks @jalehman. - Auth/OAuth: skip the refresh adapter when a stored OAuth credential has no refresh token so agent turns fail fast on missing-key instead of waiting on the 120s refresh timeout. Thanks @RomneyDa. - Auth/Codex: load legacy OAuth sidecar credentials in the embedded runner's secrets-runtime auth loaders so Telegram replies, cron-triggered turns, and other isolated sub-agent lanes can reach the existing #83312 refresh-and-rewrite migration instead of failing with `No API key found for provider "openai-codex"` until the user runs `openclaw doctor`. Thanks @Totalsolutionsync and @RomneyDa. - Codex/failover: classify `deactivated_workspace` as a permanent auth failure so configured fallback models can advance when a Codex workspace is deactivated. (#55893) Thanks @litang9. - Exec: keep configured `tools.exec.pathPrepend` entries ahead of user shell startup PATH changes on POSIX gateway runs. (#81403) Thanks @medns. - Gateway/sessions: allow shared-secret bearer callers to read and stream session history without an explicit scope header. (#81815) Thanks @medns. - Agents/embedded runner: classify HTML auth provider responses as `auth_html` and return a re-authentication hint instead of the CDN-blocked copy that `upstream_html` returns. Cloudflare Access login pages, nginx basic-auth challenges, and gateway login walls all produce HTML auth bodies that were previously misdiagnosed as transient CDN blocks. (#79900) Thanks @martingarramon. - TUI/streaming watchdog: dismiss the `This response is taking longer than expected` notice as soon as a chat event for the same run arrives, so the message no longer sits next to the recovered response when the run was only briefly silent. Refs #67052, #69081 (closed), prior attempt #69026. Thanks @jpruit20 and @RomneyDa. - Agents/auth profiles: replace the bare `No available auth profile for (all in cooldown or unavailable)` TUI error with plain-language copy that explains what happened in user terms (sign-in expired, provider asking us to slow down, billing issue on the account, etc.) and suggests the matching `openclaw models auth login --provider ` recovery command for sign-in and billing causes, while falling back to the underlying provider error for cases without a clear recovery path. Thanks @RomneyDa. - Agents/Pi: tolerate OpenClaw-owned transcript writes while embedded prompts are released for model I/O, keeping long-running Feishu, Slack, Telegram, and cron turns from failing with false session-takeover errors. Fixes #84059. (#84250) Thanks @tianxiaochannel-oss88. ## 2026.5.20 ### Changes - Exec approvals: remove the old `cat SKILL.md && printf ... && ` allowlist compatibility path so skill files must be loaded with the read tool and only the real skill executable is auto-allowed. - Discord: let voice sessions follow configured Discord users into voice channels, with allowed-channel checks, multi-user handoff, bounded reconciliation, and DAVE recovery preservation. (#84264) Thanks @fuller-stack-dev. - Discord/voice: include bounded `IDENTITY.md`, `USER.md`, and `SOUL.md` profile context in realtime voice session instructions by default, with `voice.realtime.bootstrapContextFiles: []` available to disable it. (#84499) Thanks @fuller-stack-dev. - Dependencies: bump the bundled Codex harness to `@openai/codex` `0.132.0` and refresh the app-server model-list docs for the new catalog. - CLI/policy: add the bundled Policy plugin for policy-backed channel conformance checks, doctor lint findings, and opt-in workspace repair. (#80407) Thanks @giodl73-repo. - Agents/config: allow `agents.list[].experimental.localModelLean` so lean local-model mode can be enabled for one configured agent instead of globally. (#84073) Thanks @dutifulbob. - Providers/xAI: add device-code OAuth login so remote and headless setups can authorize xAI without a localhost browser callback. (#84005) Thanks @fuller-stack-dev. - Providers/OpenRouter: honor provider-level `params.provider` routing policy for OpenRouter requests, with model and agent params overriding the defaults. Thanks @amknight. ### Fixes - Agents: validate a forced plugin harness against the candidate provider/model before pinning it, so unsupported fallback-chain candidates fail with a clear harness error instead of producing a late `Model provider X not found` from the underlying harness. Codex harness `supports()` now also accepts the canonical `openai` and `openai-codex` routing ids so documented Codex configs keep working. Thanks @cathrynlavery. - Control UI/WebChat: keep selected external-channel sessions live by mirroring Codex prompts at turn start, streaming hidden runs only to exact selected-session subscribers, and deduplicating accumulated stream snapshots around tool cards. Fixes #83528, #82611, refs #83949. Thanks @BunsDev. - CLI/tasks: include stale-running task maintenance decisions in `openclaw tasks maintenance --json` so retained and reconcile candidates explain backing-session, cron, CLI, and wedged-subagent state. (#84691) Thanks @efpiva. - Codex app-server: keep system-prompt reports working when bootstrap hooks provide workspace files with only a path and content, so hook-supplied SOUL/IDENTITY/TOOLS/USER context still reports injected characters correctly. (#84736) Thanks @JARVIS-Glasses. - Providers/MiniMax music: stop advertising `durationSeconds` control and remove prompt-injected duration hints, so `music_generate` reports MiniMax duration as an unsupported override instead of suggesting MiniMax can enforce track length. Fixes #84508. Thanks @neeravmakwana. - Doctor: warn when sandbox tool policy hides configured MCP server tools before provider requests. (#84699) Thanks @nxmxbbd. - WhatsApp: update Baileys to `7.0.0-rc12`. - Build: suppress per-locale `rolldown-plugin-dts:fake-js` CommonJS dts warnings emitted while bundling the intentionally-inlined `zod/v4/locales/*.d.cts` files, so `pnpm build` output stays readable after the 0.25.1 plugin bump. Thanks @RomneyDa. - CLI/nodes: route lazy plugin-registration logs to stderr for JSON-mode `openclaw nodes` commands so stdout stays parseable. (#84684) Thanks @TurboTheTurtle. - Approvals: route manual `/approve` decisions through the trusted approval runtime so active exec and plugin approvals no longer look unknown or expired. - Mac app: update the About settings copyright year to 2026. (#84385) Thanks @pejmanjohn. - Dependencies: update `@openclaw/fs-safe` to `0.2.7` so OpenClaw's default Python-helper-off policy keeps best-effort Node write fallbacks for private stores, secret writes, run logs, and media attachments on Linux/macOS. - Infra/secrets: restore the fail-closed contract for `tryReadSecretFileSync` so credential loaders that pass `rejectSymlink: true` (Telegram, LINE, Zalo, IRC, Nextcloud Talk tokens) refuse symlinked credential files instead of silently accepting them, and the infra-state CI shard's secret-file symlink test passes again. Thanks @RomneyDa. - Browser: honor the configured image sanitization limit for screenshots and labeled snapshots so browser-captured images follow the same resize policy as other image results. (#84595) - Doctor: remove unrecognized `models.providers.*.models[*].compat.thinkingFormat` values during `doctor --fix` so stale provider model config can validate after upgrade. Fixes #77803. - Doctor: warn when `openclaw.json` stores plaintext secret-bearing config fields, including model provider API keys and sensitive provider headers. (#84718) Thanks @lukaIvanic. - Status: show the configured default, session-selected model, reason, clear hint, and docs link when a session remains pinned to a model that differs from `agents.defaults.model.primary`. - WebChat: clear stale typing indicators when session change events mark the active chat run complete. - Mac app: keep local packaging signed with a stable app identity for permission testing and fix Control UI production builds under current Vite/Highlight.js exports. - macOS app: update the embedded Peekaboo bridge to 3.2.1 so OpenClaw-hosted UI automation works with current Peekaboo CLI capture flows. - Cron: deliver preferred final assistant output for successful scheduled runs when trailing plain tool warnings remain in diagnostics instead of marking the run failed. - fix(mattermost): fail closed on missing channel type [AI]. (#84091) Thanks @pgondhi987. - Recheck rebuilt system.run argv [AI]. (#84090) Thanks @pgondhi987. - CLI: keep the private QA subcommand out of exported command descriptors unless `OPENCLAW_ENABLE_PRIVATE_QA_CLI=1`, so root help and subcommand markers match runtime registration. (#84519) - CLI/cron: bound `openclaw cron show` job lookup pagination so non-advancing or unbounded `cron.list` responses fail instead of hanging the command. Fixes #83856. (#83989) - Agents/messages: stop message-tool-only turns after a successful source-channel `message` send while keeping transcript mirrors under the session write lock. (#84289) - Agents: filter silent heartbeat response-tool transcript artifacts out of embedded context snapshots so later user turns are not polluted by heartbeat no-op messages. (#83477) Thanks @fuller-stack-dev. - Agents/OpenAI: log repeated strict tool-schema downgrade diagnostics once per provider/model/tool signature, reducing duplicate debug noise while preserving `strict=false` fallback behavior. Fixes #82930. (#82933) Thanks @galiniliev. - Agents/code mode: spell out the `exec` tool's JavaScript/TypeScript, no Node module, and catalog-bridge constraints in model-visible schema text so agents can use enabled tools without trial-and-error. (#84269) Thanks @Kaspre. - Codex: give `image_generate` dynamic-tool calls a 120s default watchdog when no per-call or configured image timeout is set, so image generation no longer falls back to the generic 30s bridge timeout. (#84254) Thanks @moritzmmayerhofer. - Codex: avoid duplicate dynamic tool terminal diagnostics while large diagnostic backlogs drain without blocking tool responses. (#82937) Thanks @galiniliev. - CLI/message: include a stable top-level `messageId` in `openclaw message --json` output when channel sends return one. (#84191) Thanks @100menotu001. - Cron: preserve legacy top-level array `jobs.json` stores when loading or adding scheduled jobs so old cron jobs are no longer treated as an empty store during upgrade. Fixes #60799. (#84433) Thanks @IWhatsskill. - Gateway/agents: use an agent's `identity.name` in Gateway agent summaries when `agents.list[].name` is unset, so configured agent labels remain visible in clients. (#84355; refs #57835) Thanks @luoyanglang. - Channels/replies: keep normal `/verbose` failed-tool progress compact in message-tool replies and prevent late text-only tool output from appearing after the final answer. (#84303) Thanks @VACInc. - Plugins/hooks: apply a default 30-second timeout to `before_compaction` and `after_compaction` hooks so a hung plugin handler no longer blocks compaction completion. (#84153) - Discord: preserve reusable presentation buttons through portable conversion and Discord component registration. (#84187) Thanks @100menotu001. - Discord: preserve disabled presentation buttons when adapting and rendering Discord message controls. (#84188) Thanks @100menotu001. - Twitch: add a test-only client-manager registry reset helper so non-isolated Twitch tests can clear cached managers between cases. Fixes #83887. (#84244) Thanks @hclsys. - Cron: run main-session scheduled work on a cron-owned wake lane while preserving reply delivery context, so background cron turns no longer block human main-session chat. Fixes #82766. (#82767) Thanks @galiniliev. - Auto-reply/slash commands: require a word boundary after the matched prefix in `parseSlashCommandActionArgs` so `/config-check ` (or any skill that shares a built-in command prefix) is no longer captured by the shorter built-in handler. Fixes #84572. Thanks @infracore. - Cron: use structured embedded-run denial metadata for isolated scheduled tasks so blocked exec requests fail the job without treating ordinary assistant prose as a denial. (#84067) Thanks @abnershang. - Cron: keep recovered tool warnings diagnostic for successful scheduled runs so final cron output is delivered instead of being replaced by a post-processing warning. (#84045) Thanks @abnershang. - Plugins/perf: thread explicit plugin discovery results through `loadBundledCapabilityRuntimeRegistry`, `resolveBundledPluginSources`, and `listChannelCatalogEntries` so callers that already hold a discovery result skip redundant filesystem walks. Thanks @SebTardif. - harden update restart script creation [AI]. (#84088) Thanks @pgondhi987. - Android/Control UI Talk: split realtime voice transcript turns, queue PCM playback writes, and add opt-in OpenClaw consult routing for Gateway relay when a realtime provider skips `openclaw_agent_consult`. (#84181) Thanks @VACInc. - Docker: keep the bundled Codex plugin in official release image keep lists so the default OpenAI agent harness remains available after Docker pruning. Fixes #83613. (#83626) Thanks @YuanHanzhong. - CLI/channels: preserve the first line of `openclaw channels logs` output when the rolling tail window starts exactly on a line boundary, mirroring the already-fixed `readLogSlice` behavior in `src/logging/log-tail.ts`. - Control UI: treat terminal session status as authoritative over stale active-run flags so completed terminal runs stop showing abort/live UI. (#84057) - CLI: preserve embedded equals signs in inline root option values instead of truncating after the second separator. (#83995) Thanks @ThiagoCAltoe. - Matrix/config: accept `messages.queue.byChannel.matrix` queue overrides and keep queue provider schema/type keys aligned for Matrix, Google Chat, and Mattermost. Thanks @bdjben. - CLI: format `openclaw acp client` failures through the shared error formatter so object-shaped errors stay readable instead of printing `[object Object]`. Fixes #83904. (#84080) - Agents/message-tool: normalize non-canonical message body aliases (`SendMessage`, `content`, `text`) to `message` before send validation so model-emitted tool calls with aliased body keys are delivered instead of rejected. (#84079) - Providers/Ollama: default unknown-capabilities models to tool-capable so discovered native Ollama models can use tools when `/api/show` omits capabilities. (#84055) Thanks @dutifulbob. - Codex app-server: disable native Code Mode, user MCP, and app-backed plugin execution while OpenClaw sandboxing is active, routing shell access through `sandbox_exec`/`sandbox_process` instead. (#84388) Thanks @joshavant. - Installer/Windows: launch `install.ps1` onboarding as an attached child process so fresh native Windows installs do not freeze visibly at `Starting setup...` or corrupt the wizard's terminal rendering. - CLI/update: keep restart health checks working across one-version CLI/Gateway protocol skew and use the managed Gateway service Node for all follow-up commands even when the package root is unchanged, so `openclaw update` no longer silently switches the gateway to a different Node binary when multiple Node installations are present. Thanks @amknight. - CLI/gateway: include the running Gateway version in `gateway status` JSON output, preserving existing server metadata while falling back to status RPC data for read probes. Fixes #56222. Thanks @galiniliev. - Memory/search: close local embedding providers when active-memory searches time out so pending local model loads and embedding contexts are aborted and released. (#83858) Thanks @brokemac79. - CLI/nodes: request pending node surface approval scopes before `openclaw nodes approve` so exec-capable node approval can use admin-scoped Gateway credentials instead of failing with `missing scope: operator.admin`. (#84392) Thanks @joshavant. - Gateway: reject slow node event sends before outbound buffers grow unbounded and log the rejected payload diagnostic. (#84387) Thanks @samzong. - Agents: include bounded trajectory queued-writer diagnostics in `pi-trajectory-flush` timeout warnings so flush stalls show pending writes, queued bytes, and append state. Fixes #82961. (#82962) Thanks @galiniliev. - Agents/subagents: recover stale completion announces by retrying unsupported transcript-wait wakes without transcript waiting and forcing a message-tool handoff when the requester run is already stale. Fixes #83699. (#83700) Thanks @galiniliev. - Agents/subagents: constrain wildcard subagent target allowlists to configured agents while preserving explicitly listed compatibility targets. Fixes #84040. (#84357) Thanks @joshavant. - Providers/Anthropic: route Anthropic model refs selected with Claude CLI auth through the Claude CLI runtime so shorthand refs such as `anthropic/opus-4.7` no longer fall back to embedded Anthropic billing. Fixes #84222. (#84374) Thanks @joshavant. - Agents: honor explicit `models.providers..timeoutSeconds` values above the default idle watchdog for cloud and self-hosted providers, so long first-token waits no longer fall back at ~120s when the provider timeout is higher. (#83979) Thanks @yujiawei. - Agents/Codex: keep encrypted Responses reasoning replay provenance-bound so stale mirrored Codex transcripts drop invalid encrypted content before request assembly while preserving matching same-session replay. Fixes #83836. (#84367) Thanks @joshavant. - Agents/subagents: skip stale embedded-run wake probes for dormant completion requesters, so late subagent completions go straight to requester-agent/direct handoff instead of producing `reason=no_active_run` queue noise. (#82964) Thanks @galiniliev. - CLI: retry config snapshot reads after a transient failure so one rejected read no longer poisons later commands in the same process. (#83931) Thanks @honor2030. - TUI: handle German-layout Kitty keyboard input by ignoring printable release events and accepting AltGr-produced printable characters such as `@` and `€`. Fixes #48897. - Media: decode URL path basenames before using them as remote media fallback filenames, so files like `My%20Report.pdf` are surfaced as `My Report.pdf`. Fixes #84050. (#84052) Thanks @jbetala7. - WhatsApp: clarify inbound group diagnostics so observed but unregistered groups point to `channels.whatsapp.groups` without changing routing or sender authorization. (#83846) Thanks @neeravmakwana. - WhatsApp: drain pending outbound deliveries on a 30s periodic timer in addition to the reconnect handler, so messages enqueued while the provider is already connected no longer wait for the next reconnect to send. (#79083) Thanks @Oviemudiaga. - CLI/TUI: include gateway plugin slash commands in TUI autocomplete, so connected sessions can suggest plugin-owned commands exposed by the running Gateway. (#83640) Thanks @se7en-agent. - Gateway/mobile: restore QR setup-code handoff of bounded operator tokens for iOS and Android onboarding while keeping admin and pairing scopes out of bootstrap. (#83684) Thanks @ngutman. - iOS: repair Release archive compilation for the TestFlight build. (#84255) Thanks @ngutman. - Agents/compaction: bound plugin-owned CLI transcript compaction with the host safety timeout so a hung context engine can no longer stall post-turn cleanup. (#84083) Thanks @100yenadmin. - Control UI/usage: truncate long context skill, tool, and file names in the usage panel while keeping the full name available on hover. (#42197) Thanks @Rain120. - Codex: respect explicit `models auth order set` and `config.auth.order` precedence over stale `lastGood` in `/codex account`, and show `no working credential` when every explicit-order profile is ineligible instead of marking a lower-ranked profile as active. Fixes #84386. (#84412) Thanks @openperf. - Agents: honor `messages.suppressToolErrors` for mutating tool failures so configured chat surfaces do not receive separate warning payloads. (#81561) Thanks @moeedahmed. - Agents/fallback: surface billing guidance for mixed rate-limit plus billing fallback exhaustion instead of generic failure copy. Fixes #79396. (#79489) Thanks @aayushprsingh. ## 2026.5.19 ### Changes - Agents: clarify that fixes should default to clean bounded refactors, lean internals, and explicit plugin SDK/API deprecation paths. - Agents/tools: normalize Swagger/OpenAPI refs and OpenAPI schema annotations when preparing tool parameter schemas. - Dependencies: update `@openclaw/proxyline` to 0.3.3. - Dependencies: update Pi packages to 0.75.1 and raise the minimum supported Node.js 22 line to 22.19. - Docker/Podman: add `OPENCLAW_IMAGE_APT_PACKAGES` as the runtime-neutral image build arg for extra apt packages while keeping `OPENCLAW_DOCKER_APT_PACKAGES` as a legacy fallback. (#62431) Thanks @urtabajev. - Gateway/ACPX: attribute startup probe, config, runtime, and resource-count costs in restart traces without changing readiness behavior. (#83300) Thanks @samzong. - Gateway: overlap startup logging and plugin-service startup with channel sidecars to reduce restart ready latency while preserving `/readyz` sidecar gating. (#83301) Thanks @samzong. - Plugins/admin-http-rpc: allow trusted admin HTTP RPC clients to start and wait for web QR login flows. (#83259) Thanks @liorb-mountapps. - Mac app: redesign Settings pages with consistent card layouts, cached navigation, cleaner permissions/voice/skills/cron/exec/debug panes, and steadier spacing around the native sidebar. - Mac app: refine Voice & Talk recognition-language and wake-phrase settings so they use the same compact card rows as the rest of Settings. - Skills: rename the repo-local Codex closeout review skill and helper to `autoreview` while preserving the Codex-first fallback behavior. - Skills: add a meme-maker skill for curated template search, local SVG/PNG rendering, Imgflip hosted rendering, and Know Your Meme provenance links. - Skills CLI: allow `openclaw skills install` and `openclaw skills update` to target shared managed skills with `--global`. (#74466) Thanks @Marvae. - Browser: surface pending and recently handled modal dialogs in snapshots, return `blockedByDialog` when an action opens a modal, and allow `browser dialog --dialog-id` to answer pending dialogs. - Browser CLI: add `openclaw browser evaluate --timeout-ms` so long-running page functions can extend both the evaluate action and request timeout budgets. (#83447) Thanks @eefreenyc. - Codex app-server: scope OpenClaw prompt guidance by runtime surface so native Codex keeps Codex-owned base/personality instructions while OpenClaw contributes only runtime context, delivery guidance, and explicitly scoped command hints. (#83454) Thanks @100yenadmin. - Docker/Podman: add `OPENCLAW_IMAGE_PIP_PACKAGES` for opt-in Python package installation in local image builds. (#83771) Thanks @stephenredmond-straiteis. - Agents/tools: shorten built-in tool descriptions and schema hints across media, messaging, sessions, cron, Gateway, web, image/PDF, TTS, nodes, and plan tools while preserving routing guardrails. - Skills: add node inspector debugging, fused diagram generation, and throwaway spike workflow skills. - CLI/plugins: add `defineToolPlugin` plus `openclaw plugins build`, `validate`, and `init` for typed simple tool plugins with generated manifest metadata, optional tool declarations, and context factories. - Agents/skills: tighten bundled skill prompts and metadata, quote skill descriptions, refresh current CLI/API guidance, and update embedded sherpa-onnx runtime downloads. - Skills: update the Obsidian skill to target the official `obsidian` CLI and require its registered binary instead of the third-party `obsidian-cli`. - Skills: add a Python debugging skill for pdb, breakpoint(), post-mortem inspection, and debugpy remote attach. - Codex: add `/codex plugins list`, `enable`, and `disable` for managing configured native Codex plugins from chat without editing config by hand. - Plugins/messages: add presentation capability limits for channel renderers, adapt rich message controls before native rendering, and mark legacy `interactive`/Slack directive producer APIs as deprecated. - Plugins/subagents: store channel delivery routes as canonical session metadata and deprecate ad hoc subagent hook delivery-origin fields in favor of core route projection. - Proxy: support HTTPS managed forward-proxy endpoints and scoped `proxy.tls.caFile` CA trust for proxy endpoint TLS. (#79171) Thanks @jesse-merhi. - QA-Lab: add first-hour 20-turn and optional 100-turn runtime parity scenarios, with tier metadata for standard and soak QA gates. Fixes #80338; refs #80337. Thanks @100yenadmin. - QA-Lab: add `openclaw qa suite --runtime-parity-tier` and wire the standard Codex-vs-Pi tier into release checks separately from optional/live-only/soak lanes. Fixes #80337. Thanks @100yenadmin. - QA-Lab: add a live-only Codex Pi-shaped Read vocabulary canary so runtime parity catches native workspace-read prompt compatibility drift. (#80323) Thanks @100yenadmin. - QA-Lab: add live-only harness self-health scenarios for plugin hook crashes, manifest contract errors, and WebChat direct-reply self-message routing. (#80323) Thanks @100yenadmin. - QA-Lab: add runtime tool fixture scenarios and coverage reporting for Codex-native workspace tools, OpenClaw dynamic tools, and optional plugin-backed tools. Fixes #80173. Thanks @100yenadmin. - QA-Lab: expose runtime tool fixture coverage through `openclaw qa coverage --tools`, with optional suite-summary evaluation for parity gate artifacts. Thanks @100yenadmin. - QA-Lab: schedule a live-frontier Codex-vs-Pi runtime token-efficiency artifact lane in the all-lanes QA workflow. Fixes #80175. Thanks @100yenadmin. - QA-Lab: hard-gate required OpenClaw dynamic runtime-tool drift in the standard Codex-vs-Pi tier with a blocking release-check verifier and publish the tool coverage report artifact. Fixes #80339; refs #80319. Thanks @100yenadmin. - QA-Lab: add the personal-agent approval-denial scenario so the benchmark pack verifies denied local reads stop cleanly without tool progress or fixture leaks. (#83150) Thanks @iFiras-Max1. - QA-Lab: extend the personal-agent benchmark pack with a local task followthrough scenario for proof-backed pending, blocked, and done status reporting. Thanks @iFiras-Max1. - QA-Lab: add a report-only dreaming shadow-trial scenario so candidate memory promotion can be evaluated without mutating `MEMORY.md`. Thanks @iFiras-Max1. - Gateway/performance: add `pnpm test:restart:gateway` benchmark tooling for repeated restart readiness, downtime, trace, and resource-slope evidence. (#83299) Thanks @samzong. - Android: switch Talk Mode to realtime Gateway relay voice sessions with streaming mic input, realtime audio playback, tool-result bridging, and on-screen transcripts. (#83130) Thanks @sliekens. - Gateway/config: expose config lookup reload metadata so tools can distinguish restart-required, hot-reloadable, and no-op fields before applying config edits. Fixes #81409. (#81612) Thanks @LLagoon3. - Telegram: add allowlisted native DM draft previews for transient tool progress while keeping final answers on the normal persistent delivery path. (#83622) Thanks @akrimm702. - QA-Lab: add a personal-agent share-safe diagnostics artifact scenario so support handoffs keep useful status while omitting raw personal content. Thanks @iFiras-Max1. - QA-Lab: add a personal-agent no-fake-progress scenario so completion claims stay tied to local evidence instead of unsupported external progress. (#83824) Thanks @iFiras-Max1. ### Fixes - Agents/exec approvals: return approved WebChat gateway exec output inline after native approval instead of leaving the model waiting for an async follow-up. (#82019) Thanks @Zac-W. - CLI/node: reject invalid explicit `node run --port` values instead of silently falling back to the configured or default port. Fixes #83923. Thanks @davinci282828. - CLI: reject explicit port numbers above 65535 before they reach Gateway or Node bind paths. Fixes #83900. (#84008) Thanks @hclsys. - Codex app-server: preserve plugin tool auth profiles when Codex owns model transport so OpenClaw dynamic tools can resolve their provider credentials. (#83603) Thanks @rubencu. - Memory/search: scan the JS-side fallback vector path (used when the sqlite-vec index is unavailable or has a mismatched dimension) in bounded rowid batches and yield to the event loop between batches so large chunk tables can no longer pin the Node.js main thread for multi-second windows. Also keeps the SQL prepared statement rooted in a local so node:sqlite cannot finalize it mid-scan under heap pressure. Fixes #81172. Thanks @dev23xyz-oss. - Telegram: preserve inbound bold, italic, code, preformatted, strikethrough, underline, spoiler, and text-link entities as markdown in the agent-facing prompt body. Fixes #52859. - Backup: dereference hardlinks during archive creation and reject unsafe hardlink targets during verification so archives that pass `backup verify` do not fail broad extraction on macOS tar. Fixes #54242. Thanks @jason-allen-oneal. - Memory Wiki: preserve fs-safe diagnostics when bridge source page writes fail for non-symlink filesystem safety reasons, so directory collisions are reported with the underlying error code. (#83776) Thanks @TurboTheTurtle. - Telegram: keep forum topics from blocking sibling topic traffic by routing inbound serialization, media/text buffers, and account API queues on topic-aware lanes. (#83829) - Telegram: keep queued forum-topic follow-up messages from inheriting superseded source abort signals, so later same-topic user turns can still run and reply after an active turn is replaced. (#83827) Thanks @VACInc. - CLI/update: bypass npm freshness filters consistently during managed package and plugin installs so freshly published release plugins remain installable. Thanks @jalehman. - CLI/update: guide root-owned npm install EACCES recovery by stopping the managed Gateway before manual package replacement, then reinstalling and restarting the service. Fixes #83747. (#83757) Thanks @brokemac79. - Twitch: register refreshing chat tokens with Twurple's chat intent so automatic token refresh keeps chat access available. (#83750) Thanks @TurboTheTurtle. - Agents/subagents: keep collect-mode announce queues batching unresolved-origin items with compatible same-route messages and resume collection after a true cross-channel drain when a later compatible batch remains. Fixes #83577. - CLI/config: preserve numeric-looking record keys such as Discord guild IDs when creating missing config containers with `config set`. (#83769) Thanks @TurboTheTurtle. - Skills: refresh existing session skill snapshots when watched skill roots change, so changed extra skill directories take effect without starting a new session. Fixes #83782. (#83800) Thanks @hclsys. - Providers/Anthropic: preserve native image input for current Claude model rows when stale local catalog data marks them text-only. (#83756) Thanks @TurboTheTurtle. - Providers/Anthropic: preserve Claude 4 image capability when configured model refs resolve through a stale local catalog row. (#83756) Thanks @TurboTheTurtle. - Providers/DeepSeek: normalize MCP tool schemas with `anyOf`/`oneOf` unions before normal and compaction requests reach DeepSeek, preventing union-shaped parameters from being rejected. (#83766) Thanks @TurboTheTurtle. - Control UI: render live tool progress from session-scoped `session.tool` Gateway events so externally started runs show their tool cards in the active session. (#83734) Thanks @TurboTheTurtle. - Outbound: resolve send-capable channel plugins from the active runtime registry when the pinned startup registry only has setup metadata. (#83733) Thanks @TurboTheTurtle. - Discord: preserve streamed reply previews when recovered tool-warning finals are delivered before or after the assistant's final reply. (#84169) Thanks @neeravmakwana. - Control UI: keep the chat delete confirmation popover clamped inside the visible viewport on small screens. (#83804) Thanks @ThiagoCAltoe. - Browser: enforce current-tab URL allowlist checks for `/act` evaluate/batch actions and `/highlight` routes while leaving tab-management actions unblocked. (#78523) - CI: require real-behavior-proof verdict markers to come from the ClawSweeper GitHub App before accepting exact-head proof. (#83692) - Models: show the effective OpenAI/Codex auth profile in `/models` provider headers instead of falling back to the OpenAI env-key label. (#83697) Thanks @yu-xin-c. - CLI: include active bundled loopback MCP tools in CLI system prompts and reset provider-side CLI sessions when that prompt-visible tool surface changes. (#83785) Thanks @TurboTheTurtle. - Browser: keep a profile `cdpPort` when its `cdpUrl` omits a port, while still letting explicitly written URL ports win. (#82166) Thanks @Marvae. - Agents/image generation: allow distinct `image_generate` prompts to start separate session-backed background tasks while same-prompt retries still return the active task status. (#83614) Thanks @Elarwei001. - Gateway/WebChat: honor configured `channels.webchat.textChunkLimit` and `chunkMode` overrides when chunking WebChat replies. (#83713) - Control UI: stop the chat reading indicator from sticking after an assistant response finishes. (#83515) Thanks @njuboy11. - Skills: reject empty or whitespace-only skill names and descriptions during quick validation. (#27061) - Sessions: skip trailing custom transcript entries when checking tail assistant replies so embedded CLI gap-fill does not duplicate canonical assistant output. (#83635) Thanks @yaoyi1222. - Memory Wiki: keep `wiki_lint` tool output path-safe by reporting vault-internal lint reports as relative paths in tool text and details while preserving absolute report paths for CLI/file callers. (#83439) Thanks @LLagoon3. - Telegram: keep verbose tool progress visible without mirroring non-final progress into active session transcripts, preventing embedded provider replies from aborting mid-run. (#83631) Thanks @kurplunkin. - Telegram: log successful outbound text and media deliveries with account, chat, message, operation, thread, reply, silent, and chunk metadata while keeping message bodies out of logs. Fixes #83196. (#83247) Thanks @jrwrest. - Cron: link isolated scheduled task runs to their stable cron session so task status and cleanup can follow the backing agent run. (#83606) Thanks @jai. - Codex app-server: mark Codex-native subagent task mirrors terminal when blocked or failed spawn-agent calls arrive with stale initializing child state, preventing task registry entries from staying running. Fixes #83852. (#83945) Thanks @joshavant. - CLI: enforce the documented Node.js 22.19 runtime floor in the source launcher. - Release stability: repair broad-gate regressions in requester-agent completion handoff, QA-Lab mock spawn attribution, Slack monitor test isolation, plugin uninstall peer fixtures, and Node-floor launcher contract coverage. - Agents/replies: persist queued follow-up user messages and assistant error stubs only once across model-fallback retries, preventing repeated provider rejections from corrupted same-role session transcripts. Fixes #83404. (#83417) Thanks @yetval. - Telegram: preserve reply-target context for bare mention replies on runtime-only turns so the model sees the replied-to message body. Fixes #83767. (#83953) Thanks @joshavant. - ClawHub: preserve configured base URL path prefixes when building API request URLs, so self-hosted ClawHub instances mounted under a subpath keep routing correctly. (#83982) Thanks @ThiagoCAltoe. - Slack: persist delivered inbound message IDs and fail closed when same-channel thread replies lose their thread context, preventing delayed duplicate replies and accidental channel-root posts. Fixes #83521. Thanks @shannon0430. - Codex app-server: complete OpenClaw dynamic tool diagnostics at the request boundary so successful, failed, timed out, aborted, and blocked tool calls do not leave active tool state behind. Fixes #83474. Thanks @rozmiarD. - Doctor/Codex: warn when Linux host policy blocks the Codex bwrap user or network namespace path used by sandboxed app-server turns, with Ubuntu/AppArmor repair guidance. Refs #83018. - Gateway/config: keep config writes from failing on unrelated unresolved auth-profile SecretRefs while preserving live auth-profile runtime snapshots. - Gateway/sessions: clear stored CLI provider resume bindings on non-subagent `/reset` so the next turn starts a fresh provider-side CLI conversation instead of resuming old context. (#83448) Thanks @jasonyliu. - Doctor: preserve legacy whole-agent Claude CLI intent by moving matching Anthropic model selections to model-scoped runtime policy before removing stale runtime pins. Fixes #83491. Thanks @danielcrick. - Discord/OpenAI: keep realtime Discord voice sessions hearing follow-up turns with OpenAI realtime and prebuffer assistant playback to avoid choppy starts. (#80505) Thanks @Solvely-Colin. - LM Studio: resolve env-template API keys like `${LMSTUDIO_API_KEY}` through the standard SecretInput path instead of sending the raw template as the bearer token, and preserve header-auth and discovery-key precedence when the template is unset. Fixes #80495. (#80568) Thanks @MonkeyLeeT. - Discord/subagents: route the initial reply from thread-bound delegated sessions into the bound Discord thread instead of the parent channel. Fixes #83170. (#83172) Thanks @100menotu001. - Gateway/sessions: rotate failed agent sessions when their transcript file is missing instead of wedging per-channel lanes. Fixes #83488. (#83553) Thanks @LLagoon3. - Agents: refresh final-delivery routing from fresh session state before declaring a no-send failure, keeping recovered runs on the normal durable delivery path. (#83835) Thanks @joshavant. - Agents: guard final-delivery fresh session routing against mismatched logical sessions before reusing recovered delivery context. (#83928) Thanks @joshavant. - Media: prevent image metadata probing from invoking external decoder delegates on unrecognized image bytes, and stop fallback chaining after real processing errors. - Media: install Sharp with the root package and fall back to sips, Windows native imaging, ImageMagick, GraphicsMagick, or ffmpeg for image resizing/conversion when Sharp is unavailable. Fixes #83401. Thanks @scotthuang. - Channels/bundled: append `openclaw doctor --fix` guidance to the bundled-channel load warnings emitted on `ERR_MODULE_NOT_FOUND` / `MODULE_NOT_FOUND` (including those wrapped on `.cause` by the native-require loader), so users hitting unstaged plugin runtime deps (e.g. `nostr-tools`) see an actionable repair hint instead of a bare module-not-found warning. (#76974) Thanks @BSG2000. - Telegram: deliver generated media completions back into forum topics by preserving topic IDs across requester-agent handoff. (#83556) Thanks @fuller-stack-dev. - Gateway: defer update-check startup until after readiness so package update checks no longer block sidecar-ready startup, while preserving update broadcasts and shutdown cleanup. (#83520) Thanks @samzong. - Telegram: keep `/btw` and read-only status commands from aborting active runs, and avoid retaining raw update payloads in timed-out spool tombstones. Refs #83272. - Agents: log strict-agentic execution contract diagnostics only when the planning-only retry path actually triggers. - Agents: stop embedded session takeover and session write-lock errors from consuming model fallbacks while preserving provider fallback metadata. Fixes #83510. Thanks @luyao618. - Agents/video: hide `video_generate` reference-audio parameters unless a registered video provider supports audio inputs. - Plugins: fall back to npm for official ClawHub updates when artifact downloads are unavailable, including beta-to-default fallback and dry-run version reporting. - Plugins/xAI: echo PKCE challenge fields during OAuth authorization-code token exchange for xAI token-endpoint compatibility. (#83499) Thanks @fuller-stack-dev. - Codex app-server: hydrate current inbound image attachments before queued runs so Responses-backed agents receive Discord and other channel images as native vision input. Fixes #83466. Thanks @iannwu. - Codex app-server: keep native code mode available without forcing code-mode-only so OpenClaw dynamic tool turns complete through the app-server tool bridge. Fixes #83109. Thanks @daswass. - Codex app-server: expose OpenClaw's sandbox-routed shell as `sandbox_exec`/`sandbox_process` for non-Docker sandbox backends so SSH sandbox agents keep a correctly routed shell path without shadowing Codex native shell. Fixes #80322. Thanks @keramblock. - Release stability: recover stale session diagnostics and Codex OAuth fallback state so stuck runs and reused refresh tokens clear without blocking follow-up work. (#83503) Thanks @100yenadmin. - Messages/TTS: apply TTS directives before message-tool sends reach core, gateway, or plugin delivery so opt-in message-tool rooms and proactive sends attach voice notes instead of leaking raw tags. Fixes #81598. Thanks @CG-Intelligence-Agent-Jack and @CoronovirusG10. - Messages/Codex: keep Codex direct/source chats on message-tool visible delivery by default while documenting and testing `messages.visibleReplies: "automatic"` as the old-mode opt-out; channel wildcard model overrides now apply to direct chats before harness delivery defaults. - Memory/QMD: keep archived session transcript hits visible after QMD export while preserving normal `.md` session ids that only resemble archive names. (#83518; fixes #83506) Thanks @tanshanshan. - Codex app-server: preserve network access for sandboxed Codex code-mode turns when the OpenClaw sandbox allows outbound egress. Fixes #83347. Thanks @YusukeIt0. - Codex app-server: honor writable Docker bind mounts for sandboxed workspace-write turns while disabling native Code Mode when container-path aliases or read-only bind shadows cannot be represented safely host-side. Fixes #83737. (#83849) Thanks @joshavant. - QA-Lab: keep the OTLP smoke decoder independent of removed OpenTelemetry generated-root internals. - Messages: default group/channel visible replies to automatic final delivery again, keeping `message_tool` opt-in for ambient/shared rooms and tool-reliable models. - CLI/TUI: force standalone `/exit` runs to terminate after `runTui` returns so onboarding-launched TUI children do not stay alive invisibly. (#83501) Thanks @fuller-stack-dev. - Agents/code mode: honor per-agent code-mode config in schema, runtime catalog activation, and model payload filtering. Fixes #83388. Thanks @Kaspre. - Agents/code mode: preserve agent, session, run, and channel context in `before_tool_call` hooks for top-level `exec`/`wait` dispatches. Fixes #83387. - QQBot: shorten C2C typing indicators to a 10-second window renewed every 5 seconds, capped to keep a final passive-reply slot available. (#83469) - Replies: keep final payload delivery after live preview updates so channels can finalize or send the completed answer instead of losing preview-only drafts. (#83468) - Discord: deliver final replies in progress-mode preview streams instead of deduplicating the final visible message. (#83443) Thanks @compoodment. - Providers/Xiaomi: replay MiMo Anthropic-compatible `reasoning_content` as provider-required thinking blocks even when OpenClaw thinking is disabled, fixing follow-up tool turns for `mimo-v2-flash`. Fixes #83407. Thanks @Xgenious7. - Agents/exec approvals: forward approval-runtime credentials on agent-owned Gateway approval calls so approved async commands complete through the existing runtime path instead of stalling on unauthenticated follow-up calls. Thanks @IWhatsskill, @Patrick-Erichsen, and @jesse-merhi. - Gateway/skills: preflight remote macOS skill-bin refreshes with a WebSocket connectivity check so stale node sessions skip quickly instead of logging slow `system.which` timeout warnings. - CLI/config: keep broken discovered plugins that are not referenced by active config from failing `openclaw config validate`, while preserving fatal errors for explicitly configured plugin entries. - GitHub Copilot: drop unsafe native Responses reasoning replay items with non-replayable IDs before dispatch, preventing affected Copilot sessions from failing with `invalid_request_body`. Fixes #83220. Thanks @galiniliev. - Agents/Codex: fail closed when an explicitly requested Codex harness is not registered instead of silently trying configured model fallbacks. Fixes #83349. Thanks @r2-vibes. - QA-Lab: make runtime tool coverage fail on missing required tool exercise instead of treating pass/pass parity envelope drift as missing coverage. - Core/plugins: harden clawpatch-reported edge cases across gateway auth cleanup, Claude session id paths, plugin activation policy, apply-patch hunk handling, diagnostic redaction, and plugin metadata validation. - UI: show reasoning choices as plain labels instead of leaking internal override wording in session and chat pickers. - Mac app: avoid repeating the Configuration heading inside channel quick settings. - Mac app: keep the Settings sidebar always visible and remove the redundant titlebar hide/show control. - Mac app: normalize Settings pane content margins so pages share the same left and right rail. - Mac app: prefer explicit private/Tailscale/LAN Gateway endpoints over SSH tunnels, preserve legacy loopback tunnel configs, persist transport choices, and show captured SSH stderr when tunneling really fails. - Gateway/sessions: keep ACP/acpx and runtime child sessions visible in configured-only session lists when their owner or parent session belongs to a configured agent. - Mac app: keep app-level menu commands and Dashboard failure states reachable when the remote Gateway is disconnected. - Mac app: allow longer Gateway and Context errors to wrap in the menu instead of truncating the useful failure detail. - Mac app: tighten remote Gateway fields in Settings so the Connection pane keeps readable labels and full action button text. - Mac app: keep custom Settings card rows left-aligned and full-width so Discovery and status sections no longer appear centered or detached. - Mac app: align Location permission controls to the same trailing column as the rest of Settings. - Mac app: add Dashboard, Chat, Canvas, and Settings shortcuts to the Dock icon menu. - Mac app: replace the Settings window's native split-view sidebar with an explicit layout so page content keeps its leading gutter when the sidebar is shown or hidden. - Mac app: render channel quick config as aligned Settings rows and hide schema-only variants that cannot be edited safely from the quick pane. - Gateway/webchat: hide internal runtime-context and other `display: false` transcript messages from Chat history and live message events. Fixes #83216. Thanks @EmpireCreator. - CLI/help: keep `gateway`, `doctor`, `status`, and `health` help registration out of action/runtime imports so subcommand `--help` stays lightweight in constrained terminals. Fixes #83228. Thanks @dfguerrerom. - CLI/help: show plugin-owned command help based on the active memory slot so LanceDB memory users see `ltm` instead of unavailable `memory` commands. Fixes #83745. (#83841) Thanks @joshavant. - Cron/Discord: keep explicit announce runs in message-tool-only source-reply mode so scheduled agent turns post once instead of also echoing through automatic visible replies. Fixes #83261. Thanks @Theralley. - Telegram: preserve forum-topic origin targets in inbound, audio-preflight, and skipped-message hook contexts so follow-up delivery stays bound to the originating topic. Fixes #83302. Thanks @M00zyx. - Telegram: retry HTTP 421 Misdirected Request send failures on a fresh fallback transport so transient edge-node routing errors no longer drop outbound replies. Fixes #48892. (#48908) Thanks @MarsDoge. - Telegram: fail topic sends closed when Telegram reports `message thread not found` instead of retrying without `message_thread_id` into the base chat. Refs #83302. - Config/subagents: remove ignored agent-model `timeoutMs` keys, keep subagent model config to primary/fallback selection, and clean shipped stale config through doctor. Fixes #83291. Thanks @giodl73-repo. - Mac app: align the Sessions settings pane with the standard Settings page gutter and row spacing. - OpenAI/Codex: stop rejecting available `openai-codex` GPT-5.1, GPT-5.2, and GPT-5.3 model refs during config validation, while keeping removed Spark aliases suppressed. Fixes #83303. - Plugins/xAI: complete OAuth-backed xAI login and sidecar auth fixes, including guarded loopback callback CORS handling, video generation polling/defaults, and native-host User-Agent attribution. (#83322) Thanks @Jaaneek. - Codex app-server: preserve streamed native command output in mirrored transcripts and trajectory exports when final snapshots omit aggregated output. (#83200) Thanks @rozmiarD. - Codex app-server: fail closed when chat or sender policy denies tools, disabling native code, app, environment, and user MCP surfaces for restricted turns. (#82374) Thanks @VACInc. - Codex app-server: keep recent context-engine messages when oversized projected history is truncated, so short follow-ups in long channel sessions do not fall back to stale earlier turns. (#83127) Thanks @VACInc. - Codex app-server: keep OpenClaw session spawning searchable while steering Codex-native delegation through native subagents, avoiding duplicate direct subagent surfaces. (#83329) Thanks @fuller-stack-dev. - Codex app-server: recover stale childless Codex-native subagent task mirrors during maintenance and allow their registry rows to be cancelled without an OpenClaw child session. (#82836) Thanks @yshimadahrs-ship-it and @joshavant. - Feishu: return bound subagent delivery origins from session thread setup so Feishu subagent completions route back to the same DM or topic. (#83190) Thanks @100menotu001. - CLI/update: tailor post-update Gateway recovery hints by platform, showing systemd, LaunchAgent, Scheduled Task, or generic service-manager guidance instead of macOS-only recovery text. (#83096) Thanks @rubencu. - Plugins: apply a default 15-second timeout to legacy `before_agent_start` hooks so hung plugin handlers no longer block agent startup. Fixes #48534. (#83136) Thanks @therahul-yo. - Feishu: refresh inbound session delivery context for DM, group, and broadcast turns so later replies do not inherit stale WebChat routing. Fixes #78274. - Agents/subagents: require the initial subagent registry save before reporting spawn accepted, returning a spawn error instead of losing an untracked run when the registry write fails. (#83146) Thanks @yetval. - QA-Lab/qa-channel: attach redacted agent tool-start traces to outbound `QaBusMessage` records so scenarios can assert actual tool use instead of relying only on reply text. Fixes #67637. Thanks @100yenadmin. - QA-Lab: fail live runtime parity reports when assistant-message usage is missing, preventing `0 vs 0` live token rows from being reported as passing proof. Fixes #80411. Thanks @100yenadmin. - QA-Lab: add a runtime token-efficiency sidecar report that classifies Codex savings separately from regressions and fails only positive Codex-over-Pi live token deltas above threshold. Fixes #81093. Thanks @100yenadmin. - QA-Lab: fail Codex-backed OpenAI live runtime-pair runs before launching isolated workers when no portable Codex auth is available, while staging API-key fallbacks and configured Codex keys for isolated QA agents. Fixes #80412. Thanks @100yenadmin. - QA-Lab: refresh parity gates, mock frontier fixtures, model scenarios, and workflow artifact lanes to compare GPT-5.5 against Claude Opus 4.7. Fixes #74262. Thanks @100yenadmin. - QA-Lab: make mock parity dispatch provider-aware for source discovery and subagent scenarios so OpenAI and Anthropic lanes no longer share identical canned plans. Fixes #64879. Thanks @100yenadmin. - QA-Lab: stop returning Control UI bearer tokens from unauthenticated bootstrap payloads and bind Docker harness ports to loopback-only host addresses. (#66355) Thanks @pgondhi987. - Mac app: avoid a SwiftUI metadata crash when rendering the Cron Jobs settings pane. - Agents/subagents: preserve run-mode keep subagent registry entries past the session sweep TTL, so kept subagent runs remain visible after cleanup completes. Fixes #83132. (#83168) Thanks @yetval. - Agents/OpenAI streams: yield via `setTimeout(0)` instead of `setImmediate` between bursty Responses chunks so abort timers can fire during the yield, keeping cancel-on-timeout responsive on hot streams. Refs #82462. - Agents/Codex: keep legacy `oauthRef`-backed OAuth profiles usable while `openclaw doctor --fix` migrates them back to inline credentials, without creating new sidecar credentials. (#83312) Thanks @joshavant. - Agents/Codex: load the selected provider owner alongside the Codex harness runtime so `openai-codex` models resolve when plugin allowlists scope runtime loading. Fixes #83380. (#83519) Thanks @joshavant. - Telegram: fail stalled isolated-ingress handlers into tombstones and abort same-lane reply work before restarting, so later same-chat updates drain after a hung turn. Fixes #83272. (#83505) Thanks @joshavant. - CLI/config: send SecretRef diagnostics to stderr so JSON command stdout remains parseable. - CLI/doctor: seed Control UI allowed origins when migrating legacy non-loopback gateway bind host aliases like `0.0.0.0`. Fixes #83286. Thanks @giodl73-repo. - CLI/plugins: ship the bundled memory CLI as a package entry so package-installed `openclaw memory` commands register correctly. - CLI/update: defer doctor-time plugin package installs during package swaps and seed post-core repair from the updated install registry, preventing duplicate reinstall failures. - CLI/update: preserve old-parent-readable config metadata during legacy package handoffs, fall back only to official `@openclaw/*` npm plugin packages when ClawHub plugin artifacts are unavailable, and keep managed service package roots authoritative during updates. - Feishu: detect SecretRef top-level credentials as a configured default account instead of treating object-backed app secrets as missing. - Gateway/restart: keep ordinary unmanaged SIGUSR1/config restarts in-process instead of detach-spawning an orphaned child, preserving custom supervisor PID tracking while leaving update restarts on the fresh-process path. Fixes #65668. - CLI/completion: resolve concrete PowerShell profile paths and reload commands during setup and doctor completion installation. Fixes #44296. (#83059) Thanks @yu-xin-c. - Telegram: keep isolated long polling below the hard `getUpdates` request guard so idle bot accounts with high `timeoutSeconds` do not false-disconnect and restart-loop. Fixes #83264. Thanks @riccodecarvalho. - Providers/Google: preserve and recover Gemini 3 tool-call thought signatures during native replay so function-calling turns no longer fail with missing `thought_signature` 400s. Fixes #72879. (#80358) Thanks @abnershang. - Telegram: skip transcript-only delivery mirrors and gateway-injected rows when resolving latest assistant text, preventing retained previews from replacing final replies with stale fragments. Fixes #83159. (#83362) Thanks @joshavant. - Memory/QMD: keep lexical search on raw hyphenated queries while normalizing semantic QMD sub-searches, avoiding fallback to the builtin index for dashed identifiers and dates. Fixes #81328. - Memory-core: distinguish sqlite-vec load failures from missing semantic vector embeddings in degraded `memory index` warnings, so vector recall diagnostics point at unresolved dimensions instead of blaming sqlite-vec when the store is ready. Fixes #75624. (#83056) Thanks @xuruiray and @Noah3521. - Agents/subagents: preserve sandbox-peer controller ownership while routing completion announcements back to the originating run session, keeping subagent control and completion delivery scoped correctly. Fixes #80201. (#80242) Thanks @Jerry-Xin. - Gateway: continue restarting remaining channels when one hot-reload channel restart fails, while still reporting aggregate reload failure and rolling back plugin pre-replace stops. Fixes #83054. Thanks @zqchris. - Gateway/plugins: bind admin HTTP RPC dispatch to the accepting gateway instance so multi-gateway processes cannot execute plugin HTTP control-plane calls against another live gateway. Fixes #83486. (#83487) Thanks @coygeek. - Telegram: keep hot-reload restarts from marking polling accounts manually stopped and restart isolated ingress cleanly after worker shutdown, preserving Telegram replies across config reloads. Fixes #83008. (#83410) Thanks @joshavant. - Telegram/Ollama: pass current Telegram image attachments into native PI/Ollama vision turns so live photo prompts reach Ollama as native images. Fixes #83023. (#83516) Thanks @joshavant. - Gateway/secrets: split the lightweight secrets runtime state and auth-store cache from the full secrets runtime and take a startup fast path when the gateway startup config has no SecretRef values, speeding up secrets startup while preserving cleanup and refresh semantics. - Codex app-server: rotate oversized native Codex threads before resume and cap dynamic tool-result text entering native Codex sessions, preventing stale oversized context from surviving OpenClaw compaction. (#82981) Thanks @hansolo949. - Gateway/restart: drain pending replies and active chat runs during restart shutdown before sockets and channels close, aborting timed-out chat runs through the normal cleanup path. (#69121) Thanks @alexlomt. - Agents/Codex: use the Codex runtime context window for OpenAI-model preflight compaction and memory flush checks, so GPT-5.5 Codex sessions compact before hitting the smaller native context limit. Fixes #82982. Thanks @vliuyt. - QA-Lab: clean orphaned gateway temp roots when a suite parent exits and wait on gateway plus transport readiness after config restarts, reducing stale `qa-channel` noise from interrupted runs. Fixes #65506. Thanks @100yenadmin. - QA-Lab: wake qa-bus long polls that arrive with stale future cursors after a bus restart, preserving reconnect readiness for harness clients. (#67142) Thanks @hxy91819. - QA-Lab: stage Multipass transfer scripts under OpenClaw's preferred temp root instead of raw OS temp paths, keeping the VM runner inside temp-path guardrails. (#64098) Thanks @ImLukeF. - Agents/replies: keep surviving reply media and append a warning when other media references fail, so partial media normalization no longer drops failures silently. Thanks @Jerry-Xin. - Config/models: accept `thinkingFormat: "together"` in model compat config so Together routes can opt into the Together-specific thinking response shape. - Plugins/tokenjuice: bump the bundled tokenjuice runtime to 0.7.1, bringing Codex hook approval compatibility, pre-tool command wrapping fixes, and Rolldown/Vitest output compaction improvements into the OpenClaw plugin. - Agents/OpenAI: stop post-processing GPT-5 final replies with hardcoded brevity caps, preserving full channel responses instead of appending synthetic ellipses, and log when strict-agentic GPT-5 execution activates. Fixes #82910. - Mac app: refine the Settings General and Connection panes with cleaner status panels, card rows, and a single native titlebar sidebar toggle. - Agents/media: deliver failed async image, music, and video generation completions directly when requester-session completion handoff fails, so channel users see provider errors instead of silent fallback stalls. - Browser/CDP: keep loopback proxy bypass active across both `NO_PROXY` casings and redact home-relative Chrome MCP profile paths in attach-failure diagnostics. - Agents/music: steer song, jingle, beat, anthem, and instrumental requests toward `music_generate` audio creation instead of lyric-only replies, and reserve `lyrics` for exact sung words. - Codex app-server: record native Codex tool calls and results into trajectory artifacts so debug/trajectory exports capture the full Codex-native tool history, not just OpenClaw-bridged turns. Thanks @vyctorbrzezowski. - Codex/app-server: keep bound conversation sessions on the owning agent runtime so native Codex control and follow-up turns do not fall back to the default agent client. Fixes #82954. (#82993) - CLI/infer: run gateway model probes in fresh explicit sessions so one-shot provider checks do not inherit default agent transcript state. (#82861) Thanks @Kaspre. - Providers/Together: send video-generation requests to Together's v2 video API even when shared text-model config still points at the v1 base URL. (#82992) - Browser CLI: preserve browser-level options on nested commands, skip option values during lazy command registration, and keep long-running wait/download/dialog hooks open for their advertised wait window. - CLI/sessions: accept `openclaw sessions list` as an alias for `openclaw sessions`, matching other list-style commands. Fixes #81139. (#81163) Thanks @YB0y. - Channels/stream previews: widen compact progress draft lines and cut prose at word boundaries while preserving command/path suffixes, with `streaming.progress.maxLineChars` for channel-specific tuning. - CLI/plugins: have `openclaw plugins doctor` warn when a configured runtime needs a missing owner plugin, sharing the same install mapping as `openclaw doctor --fix`. Fixes #81326. (#81674) Thanks @Zavianx. - Agents/Codex: route OpenAI runs that resolve to `openai-codex` through the Codex provider and bootstrap OpenClaw's stored OAuth profile into the Codex harness when the harness owns transport, so `openai/*` model refs no longer fail with `No API key found for openai-codex` despite an existing Codex OAuth profile. (#82864) Thanks @ragesaq. - Agents/ACP: distinguish prompt-submitted and runtime-active child stalls from true interactive waits, including redacted proxy-env diagnostics for Codex ACP no-output runs. Fixes #44810. - Agents/memory: explain that memory-triggered compaction exposes only `read` and append-only `write` when configured core tools are unavailable in `tools.allow` warnings. Fixes #82941. Thanks @galiniliev. - Agents/OpenAI: preserve deterministic tool payload ordering for prompt-cache reuse across OpenAI Responses and chat completions calls. (#82940) Thanks @galiniliev. - ACP/Codex: honor terminal ACP turn results so failed Codex/acpx runs are not recorded as successful after only progress text. Fixes #79522. Thanks @dudaefj. - Telegram: warn when a media group drops photos that fail to download, including albums where every photo is skipped. Fixes #55216. (#82987) Thanks @eldar702. - Agents/diagnostics: treat repeated same-handle embedded-run cleanup as idempotent while preserving true replacement-handle mismatch diagnostics. Fixes #82959. (#82960) Thanks @galiniliev. - Agents/subagents: preserve high-priority `AGENTS.md` policy in bootstrap context when oversized files are trimmed, and warn agents to read the full policy file before relying on scoped rules. Fixes #82920. (#82921) Thanks @galiniliev. - Agents/skills: apply the full effective tool policy pipeline to inline `command-dispatch: tool` skill dispatch before owner-only filtering, preserving configured allow, deny, sandbox, sender, group, and subagent restrictions. (#78525) - Codex: avoid spawning native hook relay subprocesses for post-tool/finalize events with no registered hook handlers while preserving pre-tool safety and approval relays. Fixes #76552. (#78004) Thanks @evgyur. - Channel accounts: keep top-level default channel accounts visible when named accounts are added alongside default credential material, so mixed legacy/new account configs keep resolving `default` instead of silently dropping it. - Agents/CLI: reject empty successful CLI subprocess replies as `empty_response` and keep them out of shared auth-profile health, so blank Claude CLI results no longer become green no-payload turns. Fixes #83231. (#83421) Thanks @joshavant. - Codex/Telegram: synthesize native Codex tool progress from final turn snapshots so Telegram `/verbose` stays visible when command events arrive only at completion. - Codex/Telegram: deliver Codex verbose tool summaries in direct message-tool-only turns while suppressing message-send and activity-log noise. (#83186) Thanks @kurplunkin. - Mac app: make Channels settings open faster by deferring config-schema work, avoiding startup channel probes, caching decoded channel status rows, and showing only compact quick settings instead of the full generated channel schema. - Control UI: include the Control UI and Gateway protocol versions in protocol-mismatch errors so stale app/dashboard pairings identify which side needs rebuilding or restarting. - Gateway/protocol: restore Gateway WS protocol v4 and keep `message.action` room-event metadata on the existing `inboundTurnKind` wire field while preserving internal inbound-event classification. - Agents/tools: prefer non-webchat session-key routes when the message tool has stale webchat context, so message-tool-only replies keep delivering to the originating channel. Fixes #82911. (#83004) Thanks @joshavant. - Channels: keep direct-message last-route writes on isolated `per-channel-peer` sessions instead of contaminating the agent main session with channel delivery context. Fixes #36614. Thanks @aspenas. - Mac app: move the Settings sidebar toggle into the native titlebar and tighten the General pane width. - Mac app: keep visited Settings panes mounted so switching tabs no longer blanks and reloads their content. - Mac app: make Config settings open from shallow schema lookups and load selected paths on demand instead of fetching and rendering the full generated config schema up front. - Codex: sanitize inline image payloads before Codex app-server and OpenAI Responses replay, and clear poisoned Codex thread bindings after invalid image errors. Fixes #82878. - Providers/GitHub Copilot: request identity-encoded Copilot API responses across token exchange, catalog, model calls, usage, and embeddings so compressed Business-account error payloads no longer reach JSON parsers as gzip bytes. Fixes #82871. Thanks @tonyfe01. - Telegram: redact nested raw-update identifiers and user metadata before verbose raw update logging, preserving useful update/message ids without exposing chat, user, command, or profile details. (#82945) Thanks @galiniliev and @joshavant. - Telegram: preserve replied-to bot messages, captions, and media metadata in group reply chains so follow-up replies understand what the user is reacting to. (#82863) - Providers/Together: update PI runtime packages to 0.74.1 and emit Together-style `reasoning.enabled`/`max_tokens` controls for reasoning-capable OpenAI-completions models. - Agents/diagnostics: split slow embedded-run `attempt-dispatch` startup summaries into workspace, prompt, runtime-plan, and final dispatch subspans so traces identify the delayed setup phase. Fixes #82782. (#82783) Thanks @galiniliev. - Agents/Codex: flatten nested tool-result middleware blocks into bounded text so successful message sends are no longer replaced with `Tool output unavailable due to post-processing error`. Fixes #82912. Thanks @joeykrug. - CLI/media: accept HTTP(S) URLs in `openclaw infer image describe --file`, fetching remote images through the guarded media path instead of treating URLs as local files. Fixes #82837. (#82854) Thanks @neeravmakwana. - Agents/subagents: keep session-backed parent runs active when the child wait call times out before the child session has actually settled, so late subagent completions are reconciled instead of being lost. Fixes #82787. Thanks @ramitrkar-hash. - Control UI: advertise shared Gateway protocol constants in browser connect frames, fixing protocol mismatch handshakes after protocol constant drift. Fixes #82882. Thanks @galiniliev. - Gateway: add rollback protocol-mismatch diagnostics, including client protocol ranges in Gateway logs and deep status/doctor hints for stale client processes. Fixes #82841. (#82908) - Agents/subagents: keep successful keep-mode completion payloads pending after final-delivery retry exhaustion, so requester recovery no longer loses final subagent results. Fixes #82583. (#82999) Thanks @joshavant. - Gateway/auth: allow same-host trusted-proxy callers to use the documented local direct `gateway.auth.password` fallback after revisiting the #78684 fail-closed policy, while keeping token fallback rejected and forwarded-header requests on the trusted-proxy path. Fixes #82607. (#82953) Thanks @joshavant. - Agents/subagents: wait for queued completion handoffs to reach the parent transcript before marking them announced, preventing busy parent runs from cleaning up before observing child results. Fixes #82913. (#83039) Thanks @joshavant. - Agents/subagents: route group/channel subagent completions through message-tool-only handoffs when required and keep active-requester wake failures from dropping completion delivery. Fixes #82803. Thanks @galiniliev, @yozakura-ava, and @moeedahmed. - Memory-core: scan persisted memory source sessions on startup, comparing on-disk transcripts against the index and marking only missing/newer/resized files dirty for incremental sync. Fixes #82341. (#82341) Thanks @giodl73-repo. - Telegram: keep the top-level default account in the account list when named accounts or bindings are added alongside top-level credentials, preserving default polling while still letting named-only configs resolve to a single account. Fixes #82794. (#82794) Thanks @giodl73-repo. - CLI/models: reuse command-scoped plugin metadata across model listing, provider catalog, auth, and synthetic-auth checks, restoring fast `openclaw models` runs for plugin-heavy installs. Fixes #82881. (#83033) Thanks @joshavant. - CLI/channels: show configured official external channels such as Discord in `openclaw channels list` when their plugin package is missing, including the install and doctor repair command instead of reporting no configured channels. Fixes #82813. - Signal: preserve mixed-case group IDs through routing and session persistence so group auto-replies keep delivering after updates. Fixes #82827. - Agents/tools: keep the `message` tool available in embedded runs when it is explicitly allowed through `tools.alsoAllow` or runtime tool allowlists, so channel plugins with custom reply delivery can still use configured message sends. Fixes #82833. Thanks @cn1313113. - WhatsApp: honor forced document delivery for outbound image, GIF, and video media so `forceDocument`/`asDocument` sends preserve original media bytes instead of using compressed media payloads. (#79272) Thanks @itsuzef. - WhatsApp: reject symlinked Web credential files across auth checks and socket startup so unsafe `creds.json` paths cannot be read through. Thanks @mcaxtr. - WhatsApp: name outbound document attachments from their MIME type when no filename is provided, so PDF and CSV sends arrive as `file.pdf` and `file.csv` instead of an extensionless `file`. Thanks @mcaxtr. - Process/diagnostics: report active lane blockers in lane wait warnings so `queueAhead=0` no longer hides commands waiting behind active work. Fixes #82791. (#82792) Thanks @galiniliev. - Process/diagnostics: stop counting the active processing turn as queued backlog in liveness warnings so transient max-only event-loop spikes do not surface as gateway warnings. - Agents/replies: classify provider conversation-state rejections and return a clear message-channel error instead of auto-resetting or falling back to a generic runner failure. (#82616) Thanks @dutifulbob. - Browser plugin: trust managed Chrome CDP diagnostics when launch HTTP probes race cold-start readiness, avoiding false startup failures. Fixes #82904. (#82986) Thanks @kmanan and @hclsys. - Android: prompt before replacing a changed Gateway TLS thumbprint, showing the old and new SHA-256 fingerprints so users can accept expected certificate rotations instead of hard failing on pin mismatch. (#83077) Thanks @sliekens. - CLI/status: render extra gateway-like service diagnostics as warning/info output instead of error output. Fixes #46930. (#82922) thanks @giodl73-repo. - Agents/failover: classify Moonshot/Kimi exhausted-balance HTTP 429 payloads as billing instead of generic rate limits, preserving billing guidance and fallback behavior. Fixes #43447. (#83079) Thanks @leno23. - Plugin SDK: bundle `openclaw/plugin-sdk/zod` into the published package artifact and verify the packed zod subpath stays self-contained, so pnpm global installs can register plugins without a package-local `zod` symlink. Fixes #78398. (#78515) Thanks @ggzeng. - Providers/Google: drop compaction-truncated Gemini thought signatures before replay so malformed Base64 no longer aborts the next assistant turn. (#82995) Thanks @wAngByg. - Gateway/mobile: allow paired iOS and Android clients to refresh same-family OS metadata on authenticated reconnect instead of requiring a new approval. (#83490) Thanks @ngutman. - WhatsApp: treat `upload-file` as a supported media send intent by lowering path/URL uploads through the channel's normal send-media transport. (#81883) Thanks @ngutman. - iOS: end Live Activities when OpenClaw is connected, idle, or disconnected, and show compact attention states for approval-required reconnects. (#83597) Thanks @ngutman. - Control UI: hide child nav items when collapsing the active sidebar group. Fixes #42167. (#42223) Thanks @Aroool. - CI/proof: skip the real-behavior-proof gate for private org maintainers by minting a least-privilege (`members: read`) GitHub App token and checking active membership in the `maintainer` team, instead of treating `author_association=CONTRIBUTOR` as definitively external. (#83418) Thanks @RomneyDa. ## 2026.5.17 ### Changes - Control UI: move settings-only destinations into the Settings workspace and add sidebar recent-session shortcuts plus a one-click new-session action. - Control UI: speed up scoped settings pages by loading required config before schema refreshes, caching burst schema responses, and opening Communications on lighter message settings first. - Control UI: simplify the Cron Jobs workspace with modal job creation, collapsed filters, and an empty state aimed at first-time setup. - Security/audit: add `security.audit.suppressions` for intentionally accepted audit findings, keeping suppressed matches out of the active summary while preserving them in JSON output with an active suppression notice. (#76949) Thanks @100menotu001. - Agents/subagents: label delegated task and subagent completion handoffs as ready for parent review, and tell requester agents to review/verify results before calling them done. (#78985) Thanks @100menotu001. - Providers/media: add fal and OpenRouter music-generation providers for the shared `music_generate` tool, including fal MiniMax/ACE/Stable Audio endpoints and OpenRouter Lyria audio output. - Maintainer tooling: warn before running JS package commands on raw Crabbox AWS boxes, pointing maintainers to Actions hydration or Blacksmith Testbox for CI-like proof. - Control UI: show provider quota usage in the Overview card and Chat header, and recover stale Chat in-progress state after missed terminal events. (#82647) - Mac app remote setup can now be preconfigured from `openclaw-mac configure-remote`, skips onboarding when config is already complete, supports direct LAN/Tailnet gateway URLs, allows private same-origin Control UI loads, and owns the SSH tunnel process when SSH is selected. - Providers/xAI: add xAI Grok OAuth login for SuperGrok subscribers, letting `xai/*` models and xAI media/tool providers authenticate without `XAI_API_KEY`. - CLI/cron: add `openclaw cron run --wait` with timeout and poll interval controls, plus exact `cron.runs --run-id` filtering so automation can block on one queued manual run. (#81929) Thanks @ificator. - Maintainer tooling: route Crabbox skill defaults through the repo brokered AWS config, leaving Blacksmith Testbox as an explicit opt-in instead of the broad-proof default. - CLI/onboarding: localize the setup wizard and bundled channel setup flows for English, Simplified Chinese, and Traditional Chinese. (#80645) Thanks @GaosCode. - Agents/skills: cache hydrated `resolvedSkills` across warm gateway turns while keying reuse by the redacted effective config, reducing redundant skill snapshot rebuilds without crossing config-gated skill boundaries. (#81451) Thanks @solodmd. - Group chat: add core inbound event classification with opt-in `messages.groupChat.unmentionedInbound: "room_event"`, so always-on unmentioned room chatter can run as quiet context and speak visibly only via the message tool. (#81317) Thanks @obviyus. - Codex/context engines: bind thread-bootstrap projection epochs to Codex app-server threads, carry redacted tool-result context into fresh threads, and rotate backend threads when projection state changes. (#82351) Thanks @jalehman. - Agents/media: run `image_generate` through the shared async media-generation task lifecycle in session-backed chats, with task status, duplicate guarding, and message-tool completion delivery matching music/video. - Gateway: add opt-in restart trace logs for restart signal, active-work drain, close, next-start, ready, and memory spans. (#82396) Thanks @samzong. - Gateway/performance: split startup benchmark HTTP-listen timing from full gateway-ready timing and add post-bind plugin and sidecar diagnostics to restart-readiness traces. (#82603) Thanks @samzong. - QA-Lab: add a deterministic local personal-agent scenario pack covering reminders, threaded replies, scoped memory recall, redaction, and safe tool followthrough. (#78219) Thanks @iFiras-Max1. - QA-Lab: add `--pack personal-agent` for `openclaw qa suite` so maintainers can run the accepted personal-agent scenario pack by selector. (#82760) Thanks @iFiras-Max1. - QA-Lab: add a private Codex-vs-Pi runtime parity axis with runtime-pair suite runs, parity reports, and release-check wiring. (#80238) Thanks @100yenadmin. - Slack: add Slack assistant thread lifecycle support with assistant view manifest entries, suggested prompts, thread-scoped assistant sessions, and Slack-provided assistant context. Fixes #80787. Thanks @mobybot27. ### Fixes - Codex/app-server: cover `/btw` side-question native hooks and app-server command approvals without relying on unsupported turn-scoped hook config. (#82559) Thanks @Kaspre. - Gateway/Docker: fail closed for non-loopback gateway starts without explicit shared-secret or trusted-proxy auth, and stop the image default command from bypassing config validation. Fixes #82865. (#82866) Thanks @coygeek. - Agents/followups: route queued followup turns through CLI runtime backends instead of embedded harness lookup, preventing `claude-cli`/`google-gemini-cli` followups from failing before delivery. Fixes #82847. (#82857) Thanks @hclsys. - CLI/sessions: let `openclaw sessions cleanup --fix-missing` prune malformed rows with unresolvable transcript metadata instead of throwing. Fixes #80970. (#82745) Thanks @IWhatsskill. - Gateway/usage: refresh large session usage summaries in the background and reuse durable transcript metadata so `sessions.usage` no longer blocks Gateway requests on full transcript rescans. Fixes #82773. (#82778) Thanks @hclsys. - CLI/MiniMax media: let `openclaw infer image describe --file` accept HTTP(S) image URLs without treating them as local paths, and keep automatic MiniMax image understanding routed through `MiniMax-VL-01` even when legacy MiniMax M2.x chat metadata claims image input. Fixes #82837. Thanks @mGaolin. - TUI: restore the submitted draft when chat is busy instead of clearing it or queueing another run. Fixes #45326. (#82774) Thanks @hyspacex. - Cron/memory: treat claimed `before_agent_reply` cron hooks as execution progress, so long memory dreaming promotion jobs are not aborted by the isolated-run pre-execution watchdog. Fixes #82811. - Discord: recover transcript-backed full answers when progress-mode final payloads are ellipsis-truncated, so long replies fall back to normal chunked delivery instead of replacing the preview with a shortened message. Fixes #82807. Thanks @blueberry6401. - Browser plugin: redact attach-details from Chrome MCP diagnostics and keep raw Chrome launch error output around long enough to surface in user reports without leaking sensitive paths. - System prompts: clarify MEMORY guidance over generic TTS hints in the embedded speech-core/system-prompt scaffolding so agents prefer memory-store usage over speech defaults. Fixes #81930. Thanks @giodl73-repo. - Agents/auth: include the checked credential source in missing API key errors, so users can see which env var, profile, or config path to fix. Fixes #82785. Thanks @loeclos. - Providers/GitHub Copilot: hash Responses replay item ids with sha256 instead of a weak 32-bit hash and build same-provider Copilot tool-call ids distinctly, so concurrent tool-call replays no longer collide and reject follow-up turns. - Agents/replay: normalize malformed assistant replay content before transport conversion while preserving empty-stop replay repair, so bad provider history no longer crashes with non-iterable content. Fixes #43795. (#82748) Thanks @IWhatsskill. - Gateway/macOS: write LaunchAgent stdout under `~/Library/Logs/openclaw`, suppress stderr, and attach stdin to `/dev/null` so launchd startup avoids symlinked state-dir log failures and silent module-evaluation hangs. Fixes #40207 and #46153. Thanks @dhruvkelawala and @frankr. - CLI/configure: let model-only section setup enter provider auth directly instead of first asking where the Gateway runs, unblocking OAuth/token setup in terminals where that unrelated prompt is unresponsive. Fixes #39223. Thanks @LevityLeads. - Providers/Anthropic-messages: extract `reasoning_content` from `thinking` blocks during assistant replay so proxy providers that route through the Anthropic-messages transport preserve reasoning context across tool-call follow-up turns. Thanks @Sunnyone2three. - Agents/GitHub Copilot: normalize replayed Responses tool-call IDs before dispatch so resumed sessions with historical overlong tool IDs continue instead of failing Copilot schema validation. (#82750) Thanks @galiniliev. - CLI/infer: resolve plugin-scoped web search and fetch SecretRefs on the exact command credential surface, keeping non-selected and unrelated plugin secrets inactive. Fixes #82621. (#82699) Thanks @leno23. - Providers/Anthropic Vertex: resolve installed provider public surfaces from package-local `dist/`, restoring `anthropic-vertex/*` model calls after plugin externalization. Fixes #82781. Thanks @0L1v3DaD. - Gateway/exec approvals: bind path-shaped allowlists, safe-bin trust, skill auto-allow, Allow Always persistence, and approval audit metadata to the executable realpath so symlinked binaries cannot keep approvals after retargeting. Fixes #45595. Thanks @jasonftl. - Mac app: reorganize Settings around a grouped sidebar, with separate Connection and Exec Approvals pages so everyday permissions and app toggles are easier to scan. - Mac app: redraw the animated menu bar critter to match the rounded app mascot with antennae, side arms, two feet, and smoother template rendering. - Mac app: cache settings config schema/drafts and load channel config in parallel with channel probes, making repeated Channels and Config tab switches responsive over remote tunnels. - Control UI: negotiate the Gateway protocol from shared constants so rebuilt dashboards connect to current gateways instead of reporting a protocol mismatch. - Mac app: let menu gateway/session error text wrap across a few lines and stop rebuilding dynamic Context/Gateway menu rows while the menu is open, reducing flicker. - QA-Lab: expose Codex runtime tools during private parity runs and treat completed structural/tool-shape runtime drift as advisory, while preserving real runtime failures as lane blockers. - Mac app: make device pairing approval sheets friendlier, with concise Mac/device copy, shortened identifiers, friendly scope labels, and Approve as the primary action. - Providers/Qwen: honor session thinking level for `qwen-chat-template` payloads so `/think off` disables nested llama.cpp chat-template thinking controls. Fixes #82768. Thanks @bfox55. - Feishu/wiki: reject numeric wiki space IDs before creating Lark clients and keep numeric-looking IDs documented as quoted opaque strings, preventing JavaScript precision loss in knowledge base calls. Fixes #45301. (#82769) Thanks @hyspacex. - Control UI: simplify Talk settings to Voice, Model, and Sensitivity defaults, with provider, transport, exact VAD, and timing controls behind Advanced. - Telegram: let catch-all mention patterns match captionless group photos, so media-only group messages reach the agent when the group is intentionally configured to respond to all messages. Fixes #44833. (#82756) Thanks @IWhatsskill. - Gateway/pairing: reject forged loopback Control UI origins from non-local proxy paths, and keep mobile pairing setup on Tailscale bind mode pointing users to Tailscale Serve/Funnel instead of cleartext tailnet WebSockets. - Telegram/Gateway: persist isolated polling offsets only after main-thread dispatch and preserve gateway caller scopes for Telegram message actions, fixing consumed-but-unrouted polling updates and recursive CLI send scope approvals. Fixes #82277. (#82705) Thanks @udaymanish6. - Memory-core: abort timed-out embedding provider calls so remote embedding HTTP requests do not continue running after memory query or indexing timeouts. Fixes #82732. Thanks @adityarya24. - Channels/stream previews: contain rejected background draft-stream flushes so preview send failures do not surface as fatal unhandled rejections. Fixes #82712. (#82713) Thanks @coygeek. - Codex/app-server: keep shared native app-server clients isolated per agent runtime key so starting one agent no longer closes another agent's active Codex turn. Fixes #82758. Thanks @PashaGanson. - Providers/OpenAI Codex: include base `gpt-5.5` and `gpt-5.4` reasoning metadata in the bundled Codex catalog so `/think xhigh` remains available for those models. Fixes #82744. - Providers/OpenAI Codex: keep the native hook relay as the final Codex app-server thread config patch so hook-backed approvals stay enabled even when lower-priority config disables hooks. Thanks @solomonneas. - Providers/MiniMax: declare CN endpoint auth aliases in the plugin manifest so `minimax-cn` and `minimax-portal-cn` reuse the correct base auth profiles instead of falling back to unrelated models after 401s. Fixes #63823. Thanks @kamusis. - Secrets/audit: treat `$VAR` auth-profile values as env SecretRefs and stop reporting env-ref credentials as plaintext, including mixed `keyRef` plus env-ref profile states. Fixes #53998. Thanks @schirloc and @artwalker. - Agents/model fallback: suppress fallback notices when the active OpenAI Codex runtime reports the same canonical OpenAI model. - Agents/music generation: remove model-controlled request timeouts, default internal provider requests to five minutes, and keep configured timeouts at a 120-second floor. - Cron: let isolated best-effort deliveries send the parent result immediately while fire-and-forget subagents keep running, avoiding false run timeouts. Fixes #44428. Thanks @amknight. - Agents/media generation: stop logging delivered failure summaries as missing message-tool delivery when no generated media was expected. - Agents/sessions: prioritize manual user turns ahead of queued cron and maintenance work in the same session lane, so visible follow-ups no longer wait behind background runs. Fixes #82764. (#82765) Thanks @galiniliev. - Agents/edit tool: honor `file_path` and related path aliases when resolving edit-recovery targets, so post-write errors no longer surface false edit failures after the file actually changed. Fixes #81909. Thanks @giodl73-repo. - QQBot: treat only explicit truthy `QQBOT_DEBUG` values as enabling debug logs, so false-like values such as `0` no longer expose debug output. Fixes #82644. (#82697) Thanks @leno23. - Agents/session_status: resolve implicit no-arg status lookups against the live run session, so `/think` changes report the current thinking level instead of stale sandbox state. Fixes #82669. (#82696) Thanks @leno23. - Discord: keep progress drafts visible for message-tool-only guild replies under the default coding tool profile. Fixes #82747. Thanks @eliranwong. - Agents: prefer current structured assistant final answers when assembling final reply payloads, reducing reliance on streamed preview fragments after channel transcript recovery. (#82850) Thanks @joshavant. - Discord: keep unmentioned room-event history until a visible Discord send succeeds, so quiet ambient context does not disappear before message-tool delivery. (#82573) Thanks @obviyus. - CLI/setup: order the model/auth provider picker as OpenAI, Anthropic, xAI, Google, then the remaining providers alphabetically. - Diagnostics/usage/voice-call: treat explicit zero and non-finite limits as empty results and reject invalid voice-call numeric CLI flags. Fixes #82646, #82650, #82651, and #82653. (#82679) Thanks @leno23. - CLI/config: avoid redundant startup config/plugin checks for the guided `openclaw config` flow and show progress while source checkout CLI artifacts build or load. - Config/Mac app: accept `gateway.remote.remotePort` in core config validation so Mac SSH remote setup stays compatible with the CLI. - Gateway/diagnostics: add opt-in critical memory pressure stability snapshots with gateway logs, V8 heap, cgroup, active-resource, and redacted large session-file evidence. Fixes #82518. - Doctor/Gateway: avoid treating unrelated macOS LaunchAgents as legacy gateways just because their environment values mention old checkout paths. - Gateway/heartbeat: defer heartbeat runs while the target reply operation is queued or active, preventing heartbeat prompts from interleaving with WebChat responses before the streaming lane starts. Fixes #82722. Thanks @Andy-Xie-1145. - CLI/setup: collapse raw gateway config keys in existing-config summaries into friendly `Model` and `Gateway` rows. - CLI/config: show concise human config-write output with an indented backup path instead of printing checksum-heavy overwrite audit details by default. - Skills/onboarding: hide brew-only dependency installers in Linux containers without Homebrew and show container-specific guidance instead of a broken install path. Fixes #14593. Thanks @amknight. - CLI/docs: call the canonical lowercase docs MCP search tool and surface MCP errors instead of returning empty search results. Fixes #82702. (#82704) Thanks @hclsys. - QA-Lab: add gateway log sentinels for plugin hook failures, Codex app-server stalls/timeouts, cron allowlist drift, live quota blockers, and direct-reply self-message transcripts so harness proof fails on self-health regressions. (#80323) Thanks @100yenadmin. - QA-Lab: ignore heartbeat-only operational transcripts when capturing runtime parity cells so background checks cannot replace the scenario reply. (#80323) Thanks @100yenadmin. - QA-Lab: pin threaded-memory parity runs to `memory-core`, keep bundled plugin resolution enabled for QA commands, and retry transient session-store lock reads. (#72045) Thanks @WuKongAI-CMU. - QA-Lab/qa-channel: keep mock memory ranking, inbound media notes, and opened-file realpath checks stable for mock OpenAI qa-channel runs. (#66826) Thanks @gumadeiras. - Gateway/exec approvals: wait for accepted async approval follow-up runs instead of direct-fallback sending duplicate completions when retries use different nonce keys. Fixes #82711. (#82717) Thanks @udaymanish6. - Agents/subagents: mark completed subagent handoffs as ready for parent review so requester agents verify results and continue required follow-up work before reporting done. (#82724) Thanks @100menotu001. - QA-Lab: validate Capture saved views loaded from browser storage so malformed local state cannot poison Capture inspector filters or layout controls. (#77722) Thanks @AsaZhou923. - Agents/performance: reuse prepared plugin manifest metadata across local CLI turns, model catalog normalization, auth lookups, and tool capability checks, restoring fast pre-provider startup for plugin-heavy installs. Thanks @shakkernerd. - CLI/config: add `--dry-run` support to `openclaw config unset`, with `--json` output and allow-exec validation parity with `config set`/`config patch` dry-run handling. (#81895) Thanks @giodl73-repo. - CLI/infer: resolve command SecretRefs before local provider-backed capability runs, so web search/fetch and other local infer commands can use plugin-scoped credential refs. Fixes #82621. (#82798) Thanks @joshavant. - Memory-core: retry disabled dreaming cron cleanup until cron is available after startup, so persisted managed dreaming jobs are removed after restart. Fixes #82383. (#82389) Thanks @neeravmakwana. - Providers/xAI: keep retired Grok 3, Grok 4 Fast, Grok 4.1 Fast, and Grok Code slugs out of model pickers while preserving compatibility resolution for existing configs. - Providers/xAI: replace the retired `grok-imagine-image-pro` image model with `grok-imagine-image-quality` in the bundled image-generation provider and docs. (#81399) Thanks @KateWilkins. - Providers/OAuth: let browser-hosted identity provider pages read successful localhost callback responses, preventing xAI Grok OAuth from showing a false connection failure after OpenClaw completes login. - Gateway/security: reject malformed HTTP and WebSocket request targets with the existing auth failure response instead of letting invalid URL parsing crash the Gateway. Fixes GHSA-6hc3-f4rg-377m. - Browser/CDP: redact credential-bearing Chrome MCP and managed Chrome launch diagnostics, and require exact loopback entries before treating `NO_PROXY` as already covering local CDP proxy bypasses. - Gateway/auth: reuse prepared startup auth SecretRef snapshots when the gateway startup config is unchanged, avoiding duplicate runtime secret preparation. (#82991) Thanks @samzong. - Gateway/diagnostics: redact credential-bearing gateway target URLs and client diagnostics while preserving raw connection URLs for programmatic use, so connect-failure logs no longer surface embedded tokens. - Gateway/auth: honor `OPENCLAW_GATEWAY_TOKEN` as the remote interactive fallback when no remote token is configured, keeping remote TUI setup aligned with documented auth precedence. - Providers/xAI: continue polling video generations while xAI reports in-flight jobs as `pending`, so Grok video requests no longer fail before the final `done` response. (#82610) Thanks @Manzojunior. - Logs: redact raw Basic auth and named security headers from `logs.tail` output before returning lines to read-scoped clients. Fixes #66832. Thanks @Magicray1217. - CLI/gateway: emit structured JSON for gateway transport close/timeout failures when `--json` is requested by health, gateway health, and devices list commands. Fixes #79108. Thanks @TurboTheTurtle. - Agents/Telegram: retry Bedrock non-visible terminal turns and mark non-deliverable attempts as trajectory errors instead of silent success. Fixes #82394. (#82905) Thanks @joshavant. - Telegram: normalize announce group targets via a new `resolveSessionTarget` channel hook so scheduled announcements resolve consistently against the same Telegram session conversation registry as inbound turns. Fixes #81229. Thanks @giodl73-repo. - QA/RTT: let `pnpm rtt` lease Convex-backed Telegram credentials while preserving RTT sample counts, sample timeouts, and result stats on the RTT harness path. - Discord: bind delayed gateway `identify` retries to the originating socket generation so retries triggered after a reconnect do not identify against a fresh socket. Fixes #82225. Thanks @giodl73-repo. - ACP/control plane: refresh cached runtime handles when agent config changes so ACP sessions stop using stale runtimes after `agents.defaults` edits. Fixes #82237. Thanks @giodl73-repo. - Gateway/sessions: scope session data lookups by agent id so multi-agent gateway state cannot cross-leak session records across configured agents. (#81386) Thanks @pgondhi987. - Gateway/restart: mark active main sessions as restart-aborted before forced restarts so startup recovery can resume interrupted turns instead of leaving them stranded as running. Fixes #82433. (#82772) Thanks @joshavant. - Gateway/heartbeat: report heartbeat runner failures with background-specific copy instead of foreground `/new` recovery guidance. Fixes #82708. (#82848) Thanks @joshavant. - Agents/media: require generated music/video completion agents to use the message tool for visible delivery and stop merging generated image attachments into message-tool-only source reply mirrors, avoiding direct fallback posts that can duplicate media the model already sent. - Agents/media: accept generated media attachments on internal completion events and report delivery-loss failures as errors, so completed background music/video tasks do not disappear after provider success. - Matrix/approvals: release in-flight reaction bindings when the channel approval handler stops mid-delivery, preventing stale approval targets after restart. Fixes #82485. (#82482) Thanks @Feelw00. - Matrix/E2EE: stop requesting MSC4222 `state_after` sync responses so homeservers with incomplete state-after data do not leave fresh encrypted rooms without outbound room encryptors. Fixes #82515. Thanks @nickdecooman. - TUI: update the displayed model in real time when an auto-fallback resolution swaps in a different model mid-turn, so the status line reflects the actual model handling the run. Fixes #82296. Thanks @giodl73-repo. - Gateway/sessions: estimate context usage from local/OpenAI-compatible transcripts when provider usage telemetry is missing, so status no longer shows empty usage for real local-model sessions. Fixes #73990. (#82317) Thanks @giodl73-repo. - Update/installers: override npm `min-release-age` quarantine for OpenClaw-managed package installs, so `openclaw update`, plugin updates, and hosted installer scripts can install the requested latest release immediately. - Agents/sessions: preserve fresh post-compaction token snapshots across stale usage updates, preventing repeated auto-compaction after every message. Fixes #82576. (#82578) Thanks @njuboy11. - Agents/replies: preserve active inbound reply context at the LLM boundary so Discord referenced-message turns do not answer from stale session history. Fixes #82608. (#82801) Thanks @joshavant. - Agents/sessions: expose session transcript lock stale and max-hold tuning, and release the embedded run's coarse transcript lock before model I/O while locking persistence and cleanup separately. Fixes #13744. Thanks @amknight. - Agents/OpenAI Responses: log redacted diagnostics for detail-less `response.failed` events while preserving failed response ids, so operators can correlate provider-side failures. Fixes #82558. - Agents/OpenRouter: strip non-replayable Anthropic/xAI reasoning provenance tags from follow-up requests, preventing poisoned thinking signatures from breaking second turns. Fixes #82335. (#82380) Thanks @hclsys. - Providers/xAI: send configurable reasoning effort only for Grok 4.3, preserving xAI's default low reasoning while omitting unsupported controls for Grok 4.20 reasoning models. (#81227) Thanks @jason-allen-oneal. - Image generation: raise Google, OpenRouter, and xAI hosted provider default timeouts to 180 seconds so slow hosted image requests have more time to complete. (#75337) - Agents/auth: redact OAuth refresh failure causes against in-memory, attempted, and reloaded credentials before generic token masking while ensuring failed ACP dispatch cleanup closes initialized runtimes. - Google/Gemini CLI OAuth: add provider-owned refresh support for `google-gemini-cli` so expired Gemini CLI tokens refresh in OpenClaw instead of falling through to the generic unknown-provider path. Fixes #42541. Thanks @jason-allen-oneal. - Agents/Anthropic transport: replay `reasoning_content` from compatible thinking blocks for Xiaomi/MiMo-style Anthropic Messages routes, preventing follow-up turns from losing required reasoning context. Fixes #81261. Thanks @Sunnyone2three. - Telegram: cache successful startup bot identity by account and token fingerprint for up to 24 hours, so restarts can skip redundant `getMe` probes during Telegram API slow periods without permanently pinning renamed bots. Refs #82525. - Telegram: keep streamed text replies in place when delayed TTS audio arrives, sending the audio as a follow-up instead of deleting the preview. Fixes #82570. (#82820) Thanks @joshavant. - Channels/TTS: deliver TTS supplements across live-preview channels without duplicating text replies, covering WebChat, Telegram, Discord, Slack, Mattermost, and Matrix. (#82935) Thanks @joshavant. - Gateway/sessions: discard stale metadata when recreating dead main session rows, so replacement sessions do not inherit old labels or transcript paths. - Codex app-server: mark native context compaction completion events as successful, preventing false "Compaction incomplete" notices after successful Codex-managed compaction. Fixes #82470. (#81593) Thanks @Kyzcreig. - Codex app-server: keep long-running turns alive while current-turn approvals, user input, dynamic tools, and notifications make progress, and carry that progress into the outer run timeout. (#82601) Thanks @100yenadmin. - Gateway/channels: hand off traced channel account startup outside the startup diagnostic phase so long-lived channel tasks do not keep liveness warnings pinned to channel startup. Refs #82398. - Gateway/restart: queue restart and shutdown signals received while the gateway startup loop is still returning its server handle, so startup-time restarts are not dropped during update churn. (#82660) Thanks @samzong. - Gateway/restart: carry operator restart intent reasons into macOS LaunchAgent restart traces, so cascade diagnostics identify `gateway.restart` instead of a bare SIGTERM. - GitHub Copilot: route device-login requests through the plugin SSRF guard with a GitHub-only policy. - Group/channel replies: keep message-tool-preferred final replies private when the agent misses the message tool, and log suppressed payload metadata in the gateway debug log for quieter diagnosis. - Gateway/WebChat: route image attachments through a configured vision-capable `imageModel` plan before inlining images, and carry that image-model fallback chain through runtime retries. (#82524) Thanks @frankekn. - macOS app: open the Dashboard in a native WebKit window with standard macOS traffic-light controls, keep the Dock icon visible by default, and reuse the app's connected gateway auth for automatic Control UI login. - WebChat: show progress while manual `/compact` is running by streaming a session operation event to subscribed Control UI clients. Fixes #82407. Thanks @Conan-Scott. - Codex app-server: limit canonical OpenAI Codex app-server attribution rewrites to local transcript and trajectory records, leaving runtime/tool routing on the selected OpenAI model metadata so OpenAI API-key backup profiles keep their billing path. - Codex app-server: hide native tool-search control tools from dynamic tool exposure while preserving the message tool. - Android/chat: make bare and markdown URLs in chat messages tappable by preserving Compose URL annotations in rendered markdown. Fixes #82187. (#82392) Thanks @neeravmakwana. - Plugins/doctor: migrate legacy top-level plugin `tools` declarations into `contracts.tools`, so `openclaw doctor --fix` repairs local plugins for the manifest tool contract. (#81112) Thanks @100yenadmin. - Slack: guide agents to use stable `<@USER_ID>` mention tokens from context instead of plain `@name` text, so user mentions link and notify correctly. Fixes #82090. (#82152) Thanks @neeravmakwana. - Auth: serialize provider login writes through the auth-profile lock for OpenAI Codex, Anthropic, Cloudflare AI Gateway, GitHub Copilot, and z.ai, preserving upsert semantics so a live Gateway cannot overwrite freshly refreshed OAuth credentials with an expired in-memory snapshot. - Auth/Codex: remove runtime support for `oauthRef` sidecar-backed OAuth profiles and add a doctor repair that migrates affected Codex profiles back to inline `auth-profiles.json` credentials. (#82777) Thanks @joshavant. - Slack: keep DM thread replies on the main direct-message session instead of routing them to invisible thread-scoped sessions. Refs #82390. (#82418) Thanks @kagura-agent. - Auth/macOS: avoid creating the OAuth profile master key in Keychain automatically, falling back to the file-backed secret key so headless agents do not trigger a Keychain prompt. - Codex app-server: release raw assistant completions when `turn/completed` is missing while keeping commentary/status items as progress, preventing completed Codex runs from hanging until timeout. Fixes #82343. (#82403) Thanks @IWhatsskill. - Codex app-server: keep a bounded terminal guard after post-tool raw assistant completions so missing `turn/completed` events fail fast instead of leaving embedded runs stuck. Fixes #82775. (#82816) Thanks @joshavant. - Agents/sessions: remove the transient `*.bak--` backup written by `repairSessionFileIfNeeded` once the atomic replace succeeds, so a stuck session with a persistently malformed JSONL line no longer accumulates one snapshot per repair invocation. Fixes #80960. (#80969) Thanks @100yenadmin. Co-authored by @tynamite. - CLI/status: show plain empty-state messages instead of empty Channels and Sessions tables when no channels or sessions exist. - CLI/dashboard: probe Gateway readiness before handing out the dashboard URL, prompting to start or install the managed service when the Gateway is stopped and printing recovery commands instead of opening a dead browser tab. - CLI/dashboard: treat Gateway `device identity required` probes as proof that the dashboard listener is reachable, so `openclaw dashboard` can still open the Control UI. - CLI: hide decorative startup and status emoji on terminals that are unlikely to render them correctly, keeping semantic message and identity emoji intact. - CLI/gateway: recover the Linux user systemd bus environment when `openclaw dashboard` starts the Gateway from stripped desktop shells such as VNC terminals. - Gateway/WebSocket: log expected startup `1013 gateway starting` retry closes at debug instead of warn while preserving WARN for unexpected pre-connect failures. Fixes #76361. (#82457) Thanks @IWhatsskill. - Providers/Xiaomi: strip synthetic empty array `items` from MiMo tool schemas while preserving typed array items, avoiding strict OpenAI-compatible schema rejection. - Telegram: send the transcript-backed full final answer after progress-mode tool drafts when the dispatcher final payload is an ellipsis-truncated snapshot. Fixes #82409. Thanks @PashaGanson. - Providers/Ollama: omit truthy native `think` payloads for models marked non-reasoning while preserving supported thinking models and explicit `think: false`. (#82445) Thanks @leno23. - Update/channels: preserve pre-update channel config through package-swap doctor and post-core plugin repair so externalized channel upgrades do not drop configured chat channels. Fixes #82533. Thanks @imbaig. - Update/doctor: repair configured externalized plugin installs during legacy 2026.4.x upgrades so configured Discord channels remain available after 2026.5.x package updates. Fixes #82813. (#82859) Thanks @joshavant. - CLI/context engines: bootstrap and finalize non-legacy context engines for CLI turns while preserving transcript snapshots and deferred maintenance ownership. (#81869) Thanks @sahilsatralkar. - Telegram: persist polling updates through restart replay so queued same-topic messages resume in order instead of losing context after a gateway restart. (#82256) Thanks @VACInc. - Gateway/Gmail: abort in-flight Gmail watcher startup and hot-reload restarts before shutdown so reloads cannot spawn `gog serve` after the Gateway is closing. Thanks @frankekn. - Agents/Codex: fall back to the embedded PI runner when OpenAI's implicit Codex harness preference cannot find a registered Codex plugin, preventing OpenAI-compatible gateway requests from failing with an unregistered harness error. Fixes #82437. - Agents/OpenAI: honor `openai-codex:*` entries placed ahead of API-key backups in `auth.order.openai` for explicit OpenAI PI runs, and accept `models auth login --provider openai-codex --device-code` for headless sign-in. Fixes #82521. (#82605) - CLI/channels: install missing externalized same-id channel plugins during `channels add --channel `, so recovery for WhatsApp and other externalized stock channels does not require a separate `plugins enable` step. Fixes #82533. - Windows node install: launch the node host through a hidden Windows launcher so login startup does not leave a persistent `cmd` window open. Fixes #81254. - MCP plugin tools: forward host MCP `tools/call` `AbortSignal` through `createPluginToolsMcpHandlers().callTool` into plugin `tool.execute`, so host cancellation actually cancels in-flight plugin tool calls instead of letting them run to completion. Fixes #82424. (#82443) Thanks @joshavant. - Agents/sandbox: honor explicit Docker sandbox env variables with credential-looking names during container creation, and recreate affected sandbox containers when the effective env policy changes. Fixes #82695. (#82763) Thanks @joshavant. - Plugins: accept deprecated `api.on("deactivate")` registrations as a dated compatibility alias for `gateway_stop`, so external plugin cleanup handlers run on Gateway shutdown while authors get migration guidance. - Plugins: resolve bundled entry, dist-runtime, package-state, and public artifact paths from packaged roots, so bundled plugin probes and hardlinked public surfaces no longer fall back to source files or fail during restart. Fixes #78462. Fixes #75797. Refs #76865. Thanks @ginishuh and @ymebosma. - Media: ignore image MIME and filename hints when bytes sniff as generic containers, so zip/octet-stream payloads mislabeled as images do not become local image media or keep image file extensions when staged. - Update/doctor: avoid materializing `groupAllowFrom` for channel schemas that reject it, so package-swap doctor repairs do not fail on externalized Slack configs. - Gateway/media: prevent image filenames from overriding generic non-image byte sniffing, so zip/octet-stream payloads mislabeled as images are offloaded or rejected before they become inline image attachments. - Plugins/web search: downgrade stale optional provider installs to warnings so Gateway and doctor repair paths keep running after startup provider selection. Refs #82313. Thanks @crackmac. - Telegram/Gateway: route targeted Telegram `/stop@bot` messages onto the control lane without cached bot metadata and match gateway stop requests across raw/canonical session aliases. (#82298) Thanks @VACInc. - MS Teams/media: sniff inline `data:image/*` attachment bytes before staging them, skipping payloads that are not actually images. - WebChat/media: require trusted local-media provenance before preserving local audio reply paths for display, so untrusted audio-looking paths go through normal staging and read-policy checks. - WebChat: trust local Auto-TTS audio on block-streamed replies, including ACP-dispatched tails, so synthesized browser audio renders instead of being silently dropped. Fixes #82628. (#82701) Thanks @leno23. - Agents/tool media: preserve trusted local-media provenance when merging generated tool attachments into final reply payloads, so trusted audio/media survives outbound display normalization. - Anthropic/Claude CLI: write model-scoped `claude-cli` runtime policy when reusing local Claude CLI auth, so upgraded Telegram and Dashboard gateway turns keep using the CLI backend instead of falling through to Anthropic API billing. Fixes #82344. Thanks @amknight. - Update: let package-swap `doctor --fix` persist core config repairs while plugin schemas are still converging, preventing update failures on externalized channel configs. - Update: carry plugin-validation bypasses into config mutation pre-write reads, so package update doctor repairs can finish while externalized plugin schemas are converging. - Update/doctor: keep plugin-validation bypasses on the top-level `$include` config write path, so package repair can update included plugin config files without flattening them into the root config. - Agents/subagents: warn and continue completion announce cleanup when lifecycle cleanup fails, preventing ended subagent runs from becoming silent ghosts. Fixes #82306. Thanks @SebTardif. - Telegram: let authorized text `/stop` commands use the fast-abort path before queued agent work, so active turns stop immediately instead of processing the abort after the turn finishes; foreign-bot `/stop@otherbot` mentions now stay on the regular topic lane instead of being routed into our control lane. Fixes #82162. Thanks @civiltox. - Sessions: drop persisted entries with invalid session ids and strip malformed transcript file metadata before hydrating session runtime state. - Auth/device: normalize malformed persisted device-auth token metadata before returning or preserving token entries. - Pairing: skip malformed persisted pending pairing requests before approving valid channel pairing codes. - Commitments: strip malformed optional reminder scope metadata from persisted commitments before matching pending follow-ups. - Config persistence: normalize malformed auth profile credential fields/state, skip JSON-valid garbage transcript checkpoint rows, and let `openclaw doctor --fix` remove unrepairable cron job rows. - Cron: skip persisted job rows with malformed schedule or payload shapes in memory, leaving the store for `openclaw doctor --fix` instead of hydrating them into runtime state. - Cron: keep legacy string schedules and blank system-event jobs available for runtime repair/skip handling instead of dropping them as malformed persisted rows. - Task persistence: drop malformed array/scalar requester-origin JSON from task and task-flow SQLite sidecars instead of restoring it as delivery metadata. - Agents/timeouts: clarify model idle-timeout errors and docs so provider `timeoutSeconds` is shown as bounded by the whole agent/run timeout ceiling. - Agents/OpenAI streams: yield cooperatively while processing bursty Completions and Responses chunks, keeping aborts, channel liveness timers, and startup heartbeats responsive under noisy model output. Refs #82462. - Media/images: avoid broad model/plugin discovery while preparing image requests, preventing Windows event-loop stalls that could block Telegram polling. Fixes #82338. (#82799) Thanks @joshavant. - Release tooling: align the published launcher Node floor, `npm start`, package script checks, sharded lint locking, Vitest root project coverage, and plugin-SDK declaration build cache metadata so release/package validation does not silently skip or ship stale surfaces. - Cron/agents: honor configured subagent model fallbacks for isolated scheduled runs and forward that fallback policy into embedded agent timeout failover. Fixes #74985. Thanks @chrisgwynne. - Codex app-server/MCP: scope user MCP servers to specific OpenClaw agent ids through an optional `mcp.servers..codex.agents` list and accept `codex.defaultToolsApprovalMode` (`auto`/`prompt`/`approve`) for native Codex approval defaults; OpenClaw strips the `codex` block before handing `mcp_servers` config to Codex. (#82180) Thanks @sercada. - Agents/OpenAI Responses: clamp `input_tokens - cached_tokens` at zero and reconstruct `totalTokens` from input + output + cached components so Responses-API streams report consistent usage when providers under-report `input_tokens` relative to `cached_tokens`. - Agents: mark adapter-caught tool execution failures as error tool results in embedded Pi sessions, so models can retry recoverable edit failures instead of seeing a successful tool result. Fixes #81546. (#81564) Thanks @najef1979-code and @MonkeyLeeT. - Plugins: reject malformed `package.json` `openclaw.extensions` metadata during install, discovery, and post-update payload smoke instead of silently dropping invalid entries. - Plugins: reject package metadata records whose `package.json` resolves outside the plugin root instead of trusting persisted or reconstructed registry snapshots. - Plugins: ignore malformed persisted package channel/install metadata instead of crashing catalog reconstruction or leaking invalid install hints. - Plugin releases: reject package `files` negations that would omit advertised package-local runtime entries from npm plugin tarballs. - Media/files: sniff `input_file` bytes before trusting declared MIME headers, rejecting spoofed image or zip payloads before they become agent-visible text. - Plugins/dependencies: scrub stale managed-root `openclaw` ownership metadata without deleting a linked active host package, preventing plugin installs from downgrading npm-global hosts. Fixes #79462. Thanks @lisandromachado. - Gateway/update: keep shutdown hook-runner imports on a stable dist entry and ship a legacy chunk alias so package swaps do not strand running gateways on missing shutdown chunks. Fixes #81819. Thanks @najef1979-code. - Config persistence: ignore malformed array/scalar auth profile, cron job state, and session store entries instead of hydrating them into numeric profile ids, crashed cron rows, or invalid session records. - Config persistence: strip malformed pending final-delivery session fields on load so replay/recovery paths skip poisoned reply metadata instead of crashing on raw objects. - Config persistence: strip malformed plugin extension state and promoted session-slot ownership on load so corrupted session rows do not leak poisoned plugin metadata into replay/projection paths. - Gateway/sessions: ignore malformed compaction checkpoint rows during session projection so corrupted stores do not crash session list/describe responses or show bogus checkpoint counts. - Gateway/sessions: keep reachable transcript history when imported tree transcripts reference missing or legacy parent rows, preventing session history reads from going empty after a partial import. - Trajectory export: report incomplete transcript parent chains and stop cyclic branch walks so malformed imports cannot hang `/export-trajectory`. - Session replay: skip malformed user/assistant-shaped transcript rows during silent session resets instead of copying invalid entries into the fresh transcript. - Transcript state: skip malformed persisted JSONL entries before compaction/rewrite helpers choose the active leaf. - Backup verify: report malformed archive manifests with a stable error instead of leaking raw JSON parser details. - Session export: report skipped malformed transcript JSONL rows instead of silently omitting them from exported HTML archives. - Providers: reject malformed successful Runway, BytePlus, and Ollama embedding responses with provider-owned errors instead of raw parser/type failures, silent bad vectors, or long bogus polling. - Providers/images: reject malformed successful OpenAI-compatible, OpenAI, Google, fal, and OpenRouter image responses with provider-owned errors instead of raw shape failures, silent invalid base64 skips, or empty image results. - Providers/videos: reject malformed successful xAI, OpenRouter, and fal video create, poll, and result responses with provider-owned errors instead of raw parser failures or long bogus polling. - Providers/videos: let selected-model capability overlays clear inherited `providerOptions`, so fallback skips models that explicitly accept no provider-specific options instead of forwarding unsupported knobs. - TTS/providers: honor preferred provider aliases when routing model override directives, so alias-selected speech providers receive unqualified `[[tts:*]]` overrides. - Providers/audio: reject malformed successful OpenAI-compatible, ElevenLabs, and Deepgram speech responses with provider-owned errors instead of raw parser failures, wrong-shaped transcripts, or JSON/text bodies treated as audio. - Providers/embeddings: reject malformed successful OpenAI-compatible, Google Gemini, and Amazon Bedrock embedding responses instead of silently returning empty or coerced vectors. - Providers/catalogs: reject malformed successful LM Studio, GitHub Copilot, DeepInfra, Vercel AI Gateway, and Kilocode model-list responses with provider-owned errors instead of raw parser/type failures or silent fallback catalogs. - Providers/polling: reject array, null, or scalar successful operation status responses with provider-owned malformed JSON errors instead of waiting until timeout. - ACPX/Codex: reap plugin-local Codex ACP adapter orphans on startup after wrapper crashes while keeping direct adapter commands out of launch-lease injection. Fixes #82364. (#82459) Thanks @joshavant. - Agents/model fallback: periodically probe the configured primary for auto-pinned fallback sessions, announce fallback/recovery transitions, and clear the pin when it recovers, preventing sessions from staying on a fallback model indefinitely. Fixes #82544. Thanks @crpol. - Telegram: send presentation-only payloads by rendering fallback text and inline buttons instead of treating them as empty. Fixes #82404. (#82449) Thanks @joshavant. - Providers/Kimi: preserve Kimi Coding `reasoning_content` replay and backfill assistant tool-call placeholders when thinking is enabled, so `kimi-for-coding` follow-up tool turns no longer fail after prior tool use. Fixes #82161. Thanks @amknight. - Providers/search tools: reject malformed successful xAI, Gemini, and Kimi web/code search responses with provider-owned errors instead of silent `No response` payloads or ungrounded fallback state. - Trajectory export: skip and report malformed session/runtime JSONL rows in `manifest.json` instead of letting wrong-shaped session rows crash support bundle export. - Voice calls: persist rejected inbound-call replay keys so duplicate carrier webhook retries stay ignored after a Gateway restart. - Config/doctor: copy fallback-enabled channel `allowFrom` entries into explicit `groupAllowFrom` allowlists during `openclaw doctor --fix`, preserving current group access without adding runtime fallback-transition flags. - Config/doctor: replace source-only official Brave and Slack plugin installs from trusted catalog metadata during `openclaw doctor --fix`, unblocking externalized stock plugin recovery after upgrade. (#82425) Thanks @joshavant. - Config/memory: warn instead of rejecting configs that select the official external `memory-lancedb` slot before the plugin is installed, with an explicit no-persistent-memory startup warning and install hint. Fixes #82428. (#82438) Thanks @giodl73-repo. - Agents/bootstrap: ignore stale completed root `BOOTSTRAP.md` context after workspace setup cleanup fails, preventing channel agent turns from treating it as a directory. (#82463) Thanks @joshavant. - Update/doctor: re-enable the Codex plugin during `openclaw doctor --fix` when configured OpenAI agent models require the Codex runtime, preventing upgraded configs from failing with an unregistered Codex harness. Fixes #82368. (#82502) Thanks @joshavant. - Configure: show one OpenAI provider entry with ChatGPT/Codex sign-in and API key choices, and keep browsed Codex models in the saved `/model` picker allowlist. - Agents/model fallback: preserve auto fallback chains across deferred config reloads when session fallback provenance survives but `modelOverrideSource` is missing. Fixes #81982. Thanks @joshavant. - Hooks: raise bounded gateway lifecycle hook wait budgets to 5 seconds for shutdown and 10 seconds for pre-restart, giving short restart notification handlers time to finish before shutdown continues. (#82273) Thanks @bryanbaer. - Plugin releases: require external package compatibility metadata in the npm plugin publish plan, matching the ClawHub package contract before packages ship. - Agents/OpenAI-compatible: honor per-model `max_completion_tokens`/`max_tokens` params in embedded OpenAI-completions runs so high-token Kimi-style routes keep their configured completion cap. Fixes #82230. Thanks @albert-zen. - Agents/local: install a local gateway request scope around trusted `openclaw agent --local` runs, so subagent completion announces can use in-process gateway dispatch without crashing. Fixes #82140. Thanks @Kushmaro. - Cron: keep failed isolated-agent runs from marking successful result delivery when only the failure notification was delivered. Fixes #72985. Thanks @Allenbluff. - Discord: validate message-read results before normalizing channel history and report unexpected payloads with a Discord boundary error instead of `map is not a function`. Fixes #82252. Thanks @jessewunderlich. - Agents/runtime: apply `agents.defaults.models["provider/*"].agentRuntime` as provider-wide model runtime policy while preserving exact model runtime precedence. Fixes #82243. Thanks @rendrag-git. - Model picker: show the effective Codex runtime first for official OpenAI routes while keeping Pi available as an alternate and preserving Pi-first custom OpenAI-compatible providers. Fixes #82269. Thanks @rendrag-git. - Agents/auto-reply: restrict `NO_REPLY` prompt guidance to automatic group/channel replies, remove legacy silent-reply rewrites, and suppress accidental direct-chat silent tokens instead of delivering fallback text. Fixes #82254. Thanks @absol89. - Telegram: retain a longer partial-stream preview when a final callback only carries an ellipsis-truncated snapshot, preventing the visible answer and transcript mirror from being replaced by the short preview. Fixes #82239. Thanks @crash2kx. - Telegram/active-memory: run blocking memory recall through the Telegram provider for direct-message turns even when the hook context carries the raw chat id, preventing embedded recall from launching against an invalid numeric channel. Fixes #82177. Thanks @cslash-zz. - Control UI/WebChat: keep optimistic image messages from embedding large inline `data:` previews and preserve image-only user turns in chat history, avoiding browser stack overflows when sending image attachments. Fixes #82182. Thanks @ExploreSheep. - Agents/media: preserve message-tool-only delivery for generated music and video completion handoffs, so group/channel completions do not finish without posting the generated attachment. - Telegram: drain queued outbound deliveries after polling reconnect confirms fresh `getUpdates` activity, so stale-socket and network recovery do not leave failed replies stranded. Fixes #50040. Refs #82175. Thanks @dmitriiforpost-commits and @shellyrocklobster. - Gateway/model auth: abort active provider runs when saved auth is removed through the Gateway control plane, refresh live runtime auth snapshots, and surface `stopReason: "auth-revoked"` to clients. Fixes #81987. (#82346) Thanks @joshavant. - Codex app-server: keep the raw tool-output idle watchdog armed after `custom_tool_call_output` notifications, so post-tool stream silence fails fast instead of waiting for the terminal idle timeout. Fixes #82274. (#82378) Thanks @joshavant. - Codex app-server: enforce OpenClaw `before_tool_call` policy for Codex-native app-server shell and approval paths, preventing native tool execution from bypassing plugin policy. Fixes #82372. (#82496) Thanks @joshavant. - Telegram: mark isolated polling ingress unhealthy when a spooled inbound backlog stalls while Bot API polling still succeeds, so gateway/channel health no longer stays green after Telegram DM processing wedges. Fixes #82175. Thanks @shellyrocklobster. - Telegram: drop expired approval callbacks from isolated polling after approval id expiry so stale inline-button updates do not retry forever across restarts. Fixes #82347. (#82455) Thanks @joshavant. - Agents: strip Gemini/Gemma `` tags with attributes or self-closing syntax from delivered replies, including strict final-tag streaming enforcement. Fixes #65867. Thanks @grizdum. - macOS/update: disarm legacy `ai.openclaw.update.*` LaunchAgents when `openclaw update` starts from one, preventing KeepAlive relaunch loops that repeatedly restart the Gateway and replay update continuations. Fixes #82167. Thanks @DougButdorf. - Agents/replay: strip internal runtime-context metadata and `NO_REPLY` sentinels from provider replay and pending final-delivery recovery so restart and heartbeat resumes do not feed control text back to the model. Fixes #76629. Thanks @fuyizheng3120, @bryan-chx, and @cael-dandelion-cult. - Agents/replay: skip malformed transcript tail rows when deduping embedded assistant gap-fill, preventing truncated JSONL from duplicating the final assistant reply during replay recovery. - LINE: acknowledge signed webhook events before agent processing so slow model replies do not cause LINE `request_timeout` delivery failures. Fixes #65375. Thanks @myericho. - LINE: stop cron recovery from inferring lowercased LINE recipients from canonical session keys, so long-running task replies do not silently retry undeliverable push targets. Fixes #81628. (#81704) Thanks @edenfunf. - TTS: preserve channel-derived voice-note delivery for `/tts audio` replies even when the provider output is not natively voice-compatible. (#82174) Thanks @xuruiray. - Codex app-server: preserve inbound sender metadata and source-channel provenance on mirrored user prompts, including failure snapshots, so channel history keeps the original sender identity. (#82184) Thanks @zknicker. - Codex app-server: yield projector work to the event loop between embedded-run notifications while preserving pre-turn rate-limit capture, reducing gateway stalls from account and MCP status notifications. Fixes #81936. (#82333) Thanks @joshavant. - Plugins/web search: start the configured web_search provider plugin during gateway startup, including auto-enabled external providers behind allowlists. Fixes #82313. (#82376) Thanks @joshavant. - Codex account/status: treat metadata-only rate-limit buckets as returned but empty so `/codex status` and `/codex account` report `none returned` instead of counting phantom limits. - Codex/Lossless: keep Codex explicit compaction on native app-server threads while allowing Lossless through the context-engine slot; `openclaw doctor --fix` now migrates legacy `compaction.provider: "lossless-claw"` config to `plugins.slots.contextEngine`. - Cron/doctor: report scheduled jobs with explicit `payload.model` overrides, including provider namespace counts and default-model mismatches, so stale cron model pins are visible during auth or billing investigations. Fixes #82151. Thanks @mgonto. - Codex app-server: keep the short turn-completion idle watchdog armed after the last non-assistant current-turn item completes, so a quiet Codex app-server releases the OpenClaw session lane before the outer attempt timeout. Fixes #82171. (#82172) Thanks @funmerlin. - Providers/OpenRouter: stop adding empty DeepSeek V4 `reasoning_content` placeholders to assistant tool-call replay messages and strip empty replay artifacts before follow-up Chat Completions requests, so `openrouter/deepseek/deepseek-v4-pro` no longer fails after tool use. Fixes #82150. (#82158) Thanks @luyao618 and @Suquir0. - OpenAI-compatible providers: honor streaming-usage compatibility metadata when deciding whether to send `stream_options.include_usage`, while keeping bundled Volcengine routes opted in to Ark streaming usage. Refs #44845. (#82181) Thanks @xuruiray. - Gateway/approvals: treat `turnSourceTo` as optional in `canBridgeNoDeviceChatApprovalFromBackend`, matching the existing optional handling of `turnSourceAccountId` and `turnSourceThreadId`. Channels without a recipient concept (webchat, control-ui) leave `turnSourceTo` null on both the approval snapshot and the replay params, so the prior required-string check rejected every backend replay with `APPROVAL_CLIENT_MISMATCH`. Cross-channel replay is still gated by the required `turnSourceChannel` and `sessionKey` checks. Fixes #82132. (#82136) Thanks @ottodeng. - OC Path: add `openclaw path set --dry-run --diff` so addressed edits can be reviewed as a unified diff before writing. - Cron: load runtime plugins before isolated cron model and delivery resolution so external channels can be selected for scheduled runs. (#82111) Thanks @medns. - Cron: mirror successful direct scheduled deliveries into the resolved destination session transcript while preserving isolated-delivery awareness policy. (#80786) Thanks @cavit99. - Cron: preserve rotated transcript identity after session-bound scheduled runs compact, so `sessionTarget: "current"` keeps the next user message on the same conversation. Fixes #82164. Thanks @weissfl. - Twitch: keep gateway accounts running until shutdown instead of treating successful monitor startup as a clean channel exit, preventing immediate auto-restart loops. Fixes #60071. (#81853) Thanks @edenfunf. - Agents/auto-reply: honor `agents.defaults.silentReply` and per-surface group silent-reply policy when generic agent-run failure fallbacks decide whether to send visible fallback text. Fixes #82060. (#82086) Thanks @taozengabc. - Discord: render channel topic context as structured untrusted metadata in reply prompts and stop duplicating inbound message bodies or exposing raw `EXTERNAL_UNTRUSTED_CONTENT` envelopes. Fixes #82168. Thanks @ronan-dandelion-cult. - Codex app-server: arm the short idle watchdog as soon as Codex accepts a turn, so accepted turns with no current-turn progress release the OpenClaw session lane before the outer model timeout. Fixes #82129. Thanks @Francois3d. - Agents/replies: also strip `` workflow output when it becomes visible after an adjacent stripped tool-call XML block, closing the remaining sanitizer leak from #47444. Thanks @5toCode. - Control UI/WebChat: focus the composer when users click the visible input chrome and restore larger, labeled desktop composer controls while preserving compact mobile taps. Fixes #45656. Thanks @BunsDev. - Discord: suppress generated link embeds on outbound messages by default so agent-sent URLs stay as plain links unless `channels.discord.suppressEmbeds` is disabled. - System events: keep owner downgrades in structured metadata while rendering queued prompt text as plain `System:` lines, preserving least-privilege wakeups without prompt-visible trust labels. (#82067) - Gateway/agents: abort active embedded runs when diagnostics detect a stale native tool call, preventing nested agent sessions from staying deadlocked through restart recovery. Fixes #81976. (#82369) Thanks @joshavant. - Slack: default outbound bot link unfurls off so agent-sent URLs no longer expand into inline previews unless `channels.slack.unfurlLinks` is enabled. (#82123) Thanks @kibi-bsp. - Slack: keep finalized draft-preview replies visible when a later same-turn tool warning is delivered normally instead of clearing the edited answer. Fixes #81903. (#81979) Thanks @neeravmakwana. - Providers/Xiaomi: preserve MiMo `reasoning_content` on multi-turn tool-call replay, including custom Xiaomi-compatible proxy routes, so follow-up turns no longer fail with `400 Param Incorrect`. Fixes #81419. (#81589) Thanks @lovelefeng-glitch and @jimdawdy-hub. - Slack/plugins: route plugin-owned modal `view_submission` and `view_closed` events through Slack interactive handlers before compacting the agent-visible system event, so plugins can persist full submitted form state while the transcript stays compact. Fixes #82102. Thanks @shannon0430. - Providers/Xiaomi: promote legacy MiMo V2 reasoning-only final answers to visible text, including Xiaomi-compatible proxy routes, so `mimo-v2-pro` and `mimo-v2-omni` replies no longer appear blank when the answer arrives in `reasoning_content`. Fixes #60261. (#60304) Thanks @HiddenPuppy. - Providers: preserve required `reasoning_content` replay for Kimi K2.6/K2 thinking and MiMo V2.6 OpenAI-compatible tool-call follow-up turns while keeping the stock OpenAI/Qwen strip path intact. Fixes #82139. Thanks @yimao. - Memory search: stop using chokidar write-stability polling for memory and QMD watchers so large Markdown extraPath trees no longer build up regular file descriptors; changed files now settle through the existing debounced sync queue. Fixes #77327 and #78224. (#81802) Thanks @frankekn, @loyur, and @JanPlessow. - Message tool: rename the Discord channel-create schema field exposed to models from `type` to `channelType`, avoiding NVIDIA NIM JSON Schema parser failures while still accepting legacy `type` tool calls. (#78920) Thanks @YashSaliya. - Feishu: send CardKit streaming cards as delivered deltas and retry failed updates, preventing duplicated or dropped streamed text. Fixes #82417. (#82419) Thanks @hclsys. - WhatsApp: accept `group:`-prefixed group JIDs for outbound targets so `whatsapp:group:@g.us` resolves to the canonical group JID. Thanks @mcaxtr. - Gateway/Gmail: stop queued post-ready Gmail sidecars before hot reload and abort stale Tailscale setup, so cancelled watcher restarts cannot rewrite an old public hook target or report abort-killed commands as success. (#82395) Thanks @samzong. ## 2026.5.14 ### Changes - Channels/SDK: add normalized command turn facts to channel turn construction and expose command-turn helpers for plugin inbound contexts. - Agents/config: support per-agent bootstrap profile overrides for `contextInjection`, `bootstrapMaxChars`, and `bootstrapTotalMaxChars`, inheriting from `agents.defaults` when omitted. Fixes #69966. Thanks @BunsDev. - Dependencies: route root ambient Node proxy agents through `@openclaw/proxyline` and drop root `proxy-agent`, `https-proxy-agent`, and `minimatch` dependencies. - Canvas: lazy-load HTTP host, hosted media resolver, CLI implementation, and tool runtime modules so Gateway startup only pays Canvas implementation cost on first use. (#82001) Thanks @samzong. - Control UI/i18n: add a `pnpm ui:i18n:report` baseline report for hardcoded-copy focus areas and locale fallback metadata. (#81320) Thanks @samzong. - Maintainer tooling: add a repo-local `codex-review` skill for Codex closeout reviews, including local dirty-work and PR-branch review helpers that rerun until no accepted/actionable findings remain and avoid unsupported inline prompts with `--base`. - Maintainer tooling: fail CI when pull requests add package patch files or pnpm patched dependencies, preserving the upstream-and-bump dependency workflow. - Codex app-server: stream commentary preambles into editable channel progress drafts without promoting them to final answers. - Codex migration: remove the bundled `codex-cli` backend and repair legacy `codex-cli/*` model refs to the Codex app-server route on `openai/*`. - Gateway/plugins: add a descriptor-backed gateway method registry so plugin-owned RPC methods carry scope metadata, preserve hidden core collision checks, and keep advertised method lists separate from internal core handlers. (#82063) - Gateway/startup: add owner-level startup trace attribution for auth, plugin loading, lookup counts, and plugin sidecar services. (#81738) Thanks @samzong. - Plugins/hooks: expose the resolved effective `contextTokenBudget` plus source/reference metadata on `llm_output` and sanitized `model_call_*` hook events/contexts so plugin cost and context-health alerts can use agent-level context caps. Fixes #64327. Thanks @BunsDev. - Channels/status reactions: wire `StatusReactionController` into WhatsApp message turns (queued → thinking → tool → done/error lifecycle, on par with Telegram and Discord), add `deploy`/`build`/`concierge` emoji categories with tool-token routing, and replace the status reaction defaults with self-explanatory emoji (🧠 thinking, 🛠️ tool, 💻 coding, 🌐 web, ⏳ stallSoft, ⚠️ stallHard, ✅ done, ❌ error, 🗜️ compacting) so stall and lifecycle reactions read as status indicators instead of emotional commentary. Fixes #59077. (#80612) Thanks @gado-ships-it. - Control UI: add a browser-local Text size setting in Appearance and Quick Settings, scaling chat and dense UI text while keeping inputs above the mobile Safari focus-zoom threshold. Fixes #8547. Thanks @BunsDev. - Gateway/plugins: add a default-off `admin-http-rpc` plugin for selected control-plane methods, with security docs and no core endpoint config. (#81806) Thanks @liorb-mountapps. - Docs: add a dedicated ds4 provider page with local DeepSeek V4 Flash config, on-demand startup, context sizing, and live verification steps. - Release validation: add a package-installed Docker user-journey lane that verifies onboarding, mocked model setup, external plugin install/uninstall, ClickClack outbound/inbound messaging, Gateway restart survival, and doctor. - Release validation: add package-installed Docker lanes for real TTY onboarding, media and memory persistence, published-package upgrade journeys, and local marketplace plugin install/update/uninstall coverage. - Maintainers: add a Clawdtributor skill for Discrawl-backed contributor PR triage, live status checks, and compact review formatting. - Telegram: support Mini App `web_app` buttons in generic message presentation payloads, allowing `openclaw message send --presentation` to render Telegram Web App inline buttons for private chats. (#81356) Thanks @jzakirov. - Scripts: add `OPENCLAW_HEAVY_CHECK_LOCK_SCOPE=worktree` so high-capacity local worktrees can use independent heavy-check locks while shared locks remain the default. Fixes #80729. (#80734) Thanks @samzong. - Agents/subagents: deliver native `sessions_spawn` tasks in the child session's first visible `[Subagent Task]` message instead of hiding the task in the sub-agent system prompt, keeping delegation auditable without duplicating tokens. Fixes #78592. Thanks @bradestes and @stainlu. - Messages/queue: make mid-turn prompts steer active runs by default via `/queue steer`, preserve `/queue followup` and `/queue collect` for users who want messages to queue by default, and make `/steer` continue as a normal prompt when steering is unavailable. (#77023) Thanks @fuller-stack-dev. - Voice Call/Telnyx: add realtime media-streaming call support for conversational voice calls. (#81024) Thanks @dynamite-bud. - Dependencies: add release dependency evidence reports, npm advisory gating, and PR dependency-change awareness so maintainers can review dependency risk before and during releases. Thanks @joshavant. - Gateway: expose optional `isHeartbeat` metadata on agent event payloads so clients can distinguish scheduled heartbeat runs from ordinary chat runs. (#80610) Thanks @medns. - Agents: add `agents.defaults.runRetries` and `agents.list[].runRetries` config for embedded Pi runner retry loop limits. (#80661) Thanks @medns. - Codex: add node-backed Codex CLI session listing and binding so an OpenClaw conversation can continue an existing Codex CLI session running on a paired node. ### Fixes - Models/providers: trust the exact configured custom/local provider `baseUrl` origin for guarded model HTTP requests, so loopback, LAN, tailnet, and private DNS endpoints work without broad private-network access while different ports and metadata/link-local pivots remain blocked. Fixes #80732. (#80751) Thanks @Kaspre and @msitarzewski. - Bind shell script operands after combined options [AI]. (#81882) Thanks @pgondhi987. - fix(canvas): validate snapshot response formats [AI]. (#81881) Thanks @pgondhi987. - Constrain provider catalog entry paths [AI]. (#81884) Thanks @pgondhi987. - Require canonical node platform IDs [AI]. (#81880) Thanks @pgondhi987. - Agents/Azure OpenAI Responses: default unset Azure OpenAI API versions to `preview` so `/openai/v1/responses` calls use Azure's current Responses API route. (#82026) Thanks @leoge007. - Control UI/WebChat: compact the desktop chat header controls into a single aligned row so the session, model, thinking, and action controls no longer waste vertical space. Thanks @BunsDev. - Control UI/settings: widen the Personal quick-settings card to a 3/1 desktop split and keep Appearance/Automations below it on narrower layouts. Thanks @BunsDev. - Agents/model catalog: reuse manifest model-id normalization metadata while loading persisted read-only catalog rows, avoiding repeated metadata scans. - Agents: retry empty final turns for generic `anthropic-messages` providers instead of limiting non-visible recovery to Kimi, so custom/proxied Anthropic-compatible routes can recover with a visible answer. Addresses #46080. Thanks @wmgx, @w1tv, and @iFwu. - Agents/replies: strip workflow `` scaffolding from user-visible sanitizer paths so raw tool output does not leak into chat history, transcript mirrors, or channel replies. Fixes #47444. Thanks @5toCode. - Agents/media: deliver generated image, music, and video results through structured attachments, keep message-tool-only Codex completions on the message tool, and fail completion handoff when expected media is not actually sent. - Diagnostics/Codex: recover stalled embedded Codex app-server runs after the shorter default stalled-run window so queued turns resume sooner. - Codex app-server: fall back to same-account Codex CLI OAuth tokens at runtime when the local OpenAI Codex refresh token is rejected, without overwriting the canonical OpenClaw auth profile. Fixes #82069. Thanks @aaajiao. - Control UI: rotate browser service-worker caches per build so updated Gateways are less likely to keep serving stale dashboard bundles that trigger protocol mismatch errors. - Gateway/protocol: lazy-compile protocol validators on first use instead of compiling every AJV schema during cold import, reducing startup CPU and RSS. (#82064) Thanks @samzong. - File transfer: lazy-load node.invoke policy enforcement so gateway startup only registers static command metadata until file-transfer commands run. (#82211) Thanks @samzong. - Discord: report unresolved configured bot-token SecretRefs during startup instead of treating the account as unconfigured. (#82009) Thanks @giodl73-repo. - Discord: pass an explicit Ogg muxer to ffmpeg when transcoding voice-message audio through staged temp files, restoring TTS voice-message delivery. Fixes #82074. Thanks @hwlbb. - Discord/Feishu: allow Discord voice uploads through RFC2544 fake-IP proxy DNS and pass Feishu's voice ffmpeg transcode through an explicit Ogg muxer. (#82088) Thanks @hwlbb and @6peng888. - Audio/STT: pass explicit WAV/Ogg muxers to ffmpeg for whisper-cli and WhatsApp staged temp outputs so `.part` filenames do not break transcription or voice-message delivery. Fixes #82094. (#82110) Thanks @civiltox. - CLI/config: preserve numeric-looking object keys such as Discord guild IDs during `config patch` recursive merges. (#81999) Thanks @giodl73-repo. - Gateway/OpenAI-compatible HTTP: forward `response_format` from `/v1/chat/completions` requests through agent stream params to upstream Chat Completions and Responses transports, restoring structured-output support. Fixes #82003. (#82004) Thanks @Lellansin. - Control UI/WebChat: let sidebar markdown code-block Copy buttons use the same delegated clipboard handler as chat messages. (#58709) Thanks @tikitoki. - Discord/streaming: only mark partial draft previews delivered after final edit or fallback delivery succeeds, so failed finalization cleanup removes stale truncated drafts instead of leaving them as the visible reply. Fixes #82035. Thanks @compoodment. - macOS/Gateway: surface leftover `ai.openclaw.update.*` launchd updater jobs in `openclaw gateway status --deep` and doctor so post-update launchd loops point at the stale job cleanup. Fixes #81859. Thanks @BKF-Gitty. - macOS/screen snapshots: reject malformed `screen.snapshot` params before capture, bound base64 results against the projected `node.invoke.result` frame, and preserve stable caller-facing errors for oversized payloads and capture failures. Fixes #68181. Thanks @shaun0927 and @BunsDev. - Config/doctor: rotate capped `.clobbered.*` repair snapshots by artifact timestamp so repeated repairs keep the newest forensic copy instead of preserving only the first capped set. (#82012) Thanks @Kaspre. - Telegram: initialize the bot before isolated polling drains spooled updates so default isolated polling no longer retries every update with `Bot not initialized` and stalls replies. Fixes #81973. (#81975) Thanks @neeravmakwana. - Codex app-server: keep Codex-runtime compaction on native Codex threads, warn when stale OpenClaw compaction summarizer overrides are ignored, and let doctor remove those unsupported overrides, avoiding public OpenAI Responses summarization with Codex OAuth tokens. Fixes #82008. (#82027) Thanks @pashpashpash. - Telegram: apply method-aware Bot API request timeouts to direct message/action clients so `openclaw message delete --channel telegram` no longer waits on grammY's 500-second default when the API request wedges. Fixes #81908. Thanks @DashLabsDev. - Cron: treat attempt dispatch and assembled context as execution-start milestones so isolated agent jobs that have reached backend dispatch are governed by their configured job timeout instead of the 60s pre-execution watchdog. Fixes #81368. (#81871) Thanks @alexph-dev. - Doctor/auth: warn about stale per-agent OAuth auth profile shadows and let `openclaw doctor --fix` remove the local shadow so agents inherit the fresher main-agent credential. - Status/channels: show configured channels whose plugin setup failed to load as `plugin load failed: dependency tree corrupted; run openclaw doctor --fix` instead of silently dropping them from `openclaw status`. - Status/update: show pending or failed update restart handoffs in `openclaw status` and make `openclaw update` print explicit gateway restart verified, skipped, or failed guidance. - QA/update: add an E2E corrupt plugin dependency lane that verifies `status --all` guidance, `doctor --fix` cleanup, and channel status recovery. - Discord/channels: make `openclaw channels list --all` prefer reachable Gateway runtime account status and mark configured-but-unavailable credentials, avoiding false `not configured` output when Discord is running from service-only env. Fixes #79343. Thanks @EricY019. - WhatsApp: mark text slash commands as command turns so authorized group command replies stay visible under message-tool-only group reply mode. (#81972) Thanks @barbarhan. - Providers/OpenCode Go: stop sending unsupported reasoning parameters to Kimi K2.5/K2.6, avoiding OpenCode Go payload-validation failures while preserving DeepSeek V4 reasoning support. - Providers/OpenRouter: normalize invalid Chat Completions reasoning replay fields while preserving valid OpenRouter reasoning pass-back, avoiding follow-up turn 500s without affecting stock OpenAI calls. (#82101) Thanks @sliverp. - Installer: handle noninteractive git installs from moving refs without tag-fetch conflicts, while keeping immutable refs on frozen lockfile installs. (#81875) Thanks @keshavbotagent. - Codex app-server: inject native client factories per run and compaction attempt instead of using module-scope test state, avoiding temporal-dead-zone reads during cyclic startup. (#81148) Thanks @bdjben. - Plugin skills: replace generated Windows plugin-skill directories before publishing the current skill link, avoiding repeated `EINVAL` warnings from stale non-symlink entries. Fixes #81432. (#81446) Thanks @hclsys and @vincentkoc. - Channels/config: treat channel entries with only `enabled: true` as configured state so plugin-backed channels can auto-enable from an explicit on switch. Fixes #81323. (#81331) Thanks @EvanYao826 and @vincentkoc. - CLI/update: add an update finalization path for externally swapped core runtimes, running update-time doctor repair and plugin convergence from post-doctor config and install-record state before reporting completion. Thanks @shakkernerd. - CLI/update: refresh config after package-update doctor repairs before post-update plugin sync, avoiding stale-hash conflicts during package upgrade journeys. - macOS/Gateway: hand managed LaunchAgent package self-updates to the post-exit CLI path and report handoff failures through the update restart sentinel instead of leaving agent-invoked updates pending. Fixes #81894. (#81945) Thanks @BKF-Gitty. - Agents/WebChat: stop a successful assistant turn whose stale `errorMessage` matches a billing, auth, or rate-limit pattern from rotating profiles, falling back, or surfacing a hard `FailoverError` unless the current attempt has a real failover failure. (#70900) Thanks @truffle-dev. - Control UI/usage: remove the duplicated inner Usage page heading so the shared dashboard header is the only page title. Thanks @BunsDev. - Control UI/WebChat: keep mobile PWA composer controls above the iOS home indicator when standalone safe-area insets under-report. Fixes #77408. Thanks @BunsDev. - Control UI/logs: make the Gateway Logs stream height responsive to the viewport with a minimum height floor, so larger screens can show substantially more log lines without collapsing on shorter viewports. (#53916) Thanks @extrasmall0. - ACP/Codex: surface redacted Codex wrapper stderr for generic ACP internal failures and preserve safe Codex model/provider routing in isolated `CODEX_HOME`, making `sessions_spawn(runtime="acp", agentId="codex")` failures actionable. Fixes #80079. (#80718) Thanks @leoge007. - Agents/trace: mark execution traces as fallback-used when merged fallback attempts prove a primary model failed before the winning attempt, keeping `/trace raw` and agent JSON telemetry consistent. Addresses fallback telemetry in #81213. Thanks @BKF-Gitty. - ACP: treat rejected timeout config options as best-effort hints so ACP turns continue with adapters that do not support `session/set_config_option` timeout keys. Fixes #81250. (#81603) Thanks @qkal. - Cron/Codex: default exact-command scheduled agent turns to lightweight bootstrap context so automation runs the command before loading workspace identity or memory context. - Codex cron: disable native Codex project-doc loading for lightweight app-server cron turns so scheduled jobs avoid project-doc injection after OpenClaw suppresses bootstrap context. (#81822) Thanks @jalehman. - Codex plugin/Gateway: strip unpaired UTF-16 surrogates from Codex app-server JSON-RPC payloads and let stale reply-work recovery abort stalled reply runs, preventing malformed media turns from wedging gateway lanes. - Codex app server: force OAuth refresh requests to perform a real token refresh instead of reusing unchanged inherited auth-profile tokens after refresh failures. (#80738) Thanks @simplyclever914. - Control UI/WebChat: render `/tts audio` replies as playable audio attachments through the assistant-media ticket path, with structured-audio compatibility for older live payloads. (#81722) Thanks @Conan-Scott. - Bind gateway approval access to requester metadata [AI]. (#81380) Thanks @pgondhi987. - Telegram: let isolated polling drain independent topics, DMs, and status/control commands concurrently while preserving same-lane order. (#81849) Thanks @VACInc. - Telegram: derive readable plain-text retries from HTML fallback sends so parse failures show `label (url)` links instead of raw anchors. (#81764) Thanks @alexph-dev. - Ollama/Doctor: copy explicit native Ollama `contextWindow` or `maxTokens` provider/model budgets into `params.num_ctx` during `openclaw doctor --fix`, preserving large-context configs after native Ollama stopped inferring per-request `num_ctx`. Fixes #81878. (#81928) Thanks @joshavant and @ArthurusDent. - Discord: honor `threadName` on `message send` to existing threads by renaming the thread after successful delivery, and warn when the rename cannot be applied. Fixes #81836. (#81933) Thanks @joshavant. - Build: keep externalized Slack, OpenShell sandbox, and Anthropic Vertex runtime dependency declarations out of the root dist artifact build. - ClawHub: include Amazon Bedrock and Bedrock Mantle provider packages in the published registry metadata so the externalized providers are discoverable from ClawHub as well as npm. - Codex account/status: hide empty rate-limit buckets and show server-reported usage-limit blocks without calling them available. - Auto-reply/Claude CLI: bridge CLI-runtime assistant text-delta agent events into the chat reasoning preview through `onReasoningStream`, mirroring the existing assistant-text (#76914) and tool-event (#80046) bridges and adding gating so non-CLI runtimes are unaffected. Thanks @anagnorisis2peripeteia and @pashpashpash. - Mantis: keep QA evidence in Actions artifacts only and stop publishing evidence files to Git-backed artifact branches. - CLI/migrate: handle delayed Codex plugin marketplace responses so warnings, next-steps, and conflict states render with ⚠️ glyphs and post-install migration retries the marketplace fetch instead of silently skipping plugin items. (#81625) Thanks @sjf. - Channels/Weixin: bump the bundled `@tencent-weixin/openclaw-weixin` external entry to `2.4.3` (from `2.4.1`) so onboarding and `openclaw channels add` install the current Tencent Weixin (personal WeChat) plugin release. (#81730) Thanks @scotthuang. - CLI: lazy-load model, plugin, and device runtime helpers and keep channel option help on generated startup metadata or generic fallback text so parent/help output renders without importing those runtime paths. - CLI: route `plugins list --json` through the parsed command fast path and cover it in response budgets so plugin JSON inventory avoids full CLI registration work. - Control UI/Overview: render recent session rows through the shared session display resolver so label/displayName priority, key-equivalent labels, and channel fallbacks stay consistent with the chat selector. (#50696) Thanks @Maple778 and @BunsDev. - Gateway/network: keep OpenClaw-installed undici dispatchers on HTTP/1.1 and treat destroyed HTTP/2 session errors as recoverable network teardown, preventing `ERR_HTTP2_INVALID_SESSION` from crashing active gateway turns. Fixes #81627. (#81838) Thanks @joshavant. - Memory/daily-files: widen the daily-memory file matcher used by Dreaming, rem-backfill, rem-harness, the doctor sweep, and short-term promotion so `memory/YYYY-MM-DD-.md` files written by the bundled session-memory hook (and any future slugged variants) are discovered alongside the date-only `memory/YYYY-MM-DD.md` shape. Date extraction still uses the leading `YYYY-MM-DD` capture group, so per-day ingestion/promotion semantics are unchanged for existing date-only files; slugged files now flow through the same paths instead of being silently skipped. Fixes #69536. Thanks @jack-stormentswe. - macOS/Gateway: fail managed LaunchAgent stop and restart when the configured gateway port remains busy after cleanup instead of reporting success while a listener survives. Fixes #73132. Thanks @BunsDev. - Telegram: reuse the sticky IPv4 Bot API transport for periodic getMe health checks, so IPv4-working hosts with broken IPv6 egress stop logging repeated probe timeouts. Fixes #76852. (#76856) Thanks @SymbolStar. - Telegram: ship the isolated polling worker at the root dist path used by the bundled worker loader, avoiding startup failures looking for `dist/telegram-ingress-worker.runtime.js`. - Control UI/Gateway: stop stale token-mismatch reconnect loops when no trusted device-token retry is available, and cap rendered chat history by raw tool-output size so dashboard auth/history work cannot keep degrading channel sockets. Fixes #72139. Thanks @BunsDev. - Memory/daily-files: prioritize the canonical `memory/YYYY-MM-DD.md` daily note before same-day slugged session captures during capped live ingestion and historical seeding, preserving existing daily-note behavior when slugged files exist. - Gateway/OpenAI-compatible HTTP: parse shared JSON endpoint paths without trusting malformed Host headers, avoiding 500s before `/v1/chat/completions`, `/v1/responses`, and `/v1/embeddings` request handling. - Telegram: resolve plugin native commands with the active runtime config so commands like `/codex ...` stay on the native command path. - Voice-call webhooks: parse webhook and realtime upgrade paths without trusting malformed Host headers, avoiding 500s before provider signature checks or path rejection. - Media store: reject malformed redirect `Location` headers as media-download failures instead of letting URL parsing escape the async response callback. - ClickClack: skip malformed realtime websocket frames instead of stopping the channel monitor on a single bad JSON event. - Browser tool: treat malformed node proxy `payloadJSON` responses as browser proxy failures instead of leaking raw JSON parser errors. - Gateway HTTP: match models, session kill, and session history route paths without trusting malformed Host headers, avoiding pre-auth 500s on those endpoints. - Google Meet/Codex: report malformed node proxy `payloadJSON` responses with plugin-owned errors instead of leaking raw JSON parser failures. - Debug proxy: reject malformed relative-form proxy targets with a controlled 400 response instead of letting URL parsing escape the request handler. - File transfer: reject malformed inline `file_write` base64 before computing hashes or invoking paired nodes, avoiding Node's lenient base64 decoder. - QA channel: skip malformed inline inbound attachment base64 instead of staging silently corrupted media for agent turns. - Microsoft Teams: reject malformed inline HTML image base64 padding instead of decoding corrupted `data:` image attachments. - Voice-call realtime: ignore malformed provider media-frame base64 before forwarding audio into bridge and transcription paths. - QQBot: reject malformed stored cron payload base64 before JSON decoding structured reminder data. - Telnyx voice-call: use the raw `client_state` fallback when webhook state is malformed base64 instead of using silently corrupted decoded text. - Google Meet: report malformed node-host params JSON with plugin-owned errors instead of leaking raw JSON parser failures. - CLI/export-trajectory: report malformed encoded request JSON with a stable CLI error instead of leaking raw parser output. - ComfyUI: report malformed workflow API JSON responses with owned errors instead of leaking raw parser failures. - DeepInfra video: report malformed successful API JSON responses with provider-owned errors instead of leaking raw parser failures. - Brave Search: report malformed web and LLM-context API JSON with provider-owned errors instead of leaking raw parser failures. - xAI tools: report malformed web search, X search, and code execution JSON with provider-owned errors instead of leaking raw parser failures. - Nextcloud Talk: report malformed room-info and bot-admin JSON with channel-owned errors instead of leaking raw parser failures. - Microsoft Teams: report malformed Graph and delegated OAuth JSON with channel-owned errors instead of leaking raw parser failures. - Google Chat: report malformed Chat API and certificate JSON with channel-owned errors instead of leaking raw parser failures. - Firecrawl: report malformed search and scrape API JSON with provider-owned errors instead of leaking raw parser failures. - Tavily: report malformed search and extract API JSON with provider-owned errors instead of leaking raw parser failures. - Perplexity: report malformed Search API and chat completion JSON with provider-owned errors instead of leaking raw parser failures. - Exa: report malformed search API JSON with a provider-owned error instead of leaking raw parser failures. - Memory host SDK: report malformed remote JSON with caller-scoped errors for POST and batch file upload responses instead of leaking raw parser failures. - Media providers: report malformed operation-poll and audio-transcription JSON with provider-owned errors instead of leaking raw parser failures. - MiniMax, Gemini, Kimi, and Ollama web search: report malformed API JSON with provider-owned errors instead of leaking raw parser failures. - Image and video generation: reject malformed base64 payloads from OpenAI-compatible image responses, DeepInfra video data URLs, and MiniMax image responses instead of accepting Node's lenient decoder output. - Media MIME sniffing: reject malformed base64 payloads before sniffing chat/tool image MIME types instead of accepting Node's lenient decoder output. - Web search: mark the managed `web_search` `query` argument as required in the advertised tool schema, so schema-following local models stop emitting `queries` payloads that fail at execution. Fixes #82097. Thanks @SpidFightFR. - Twilio voice-call: report malformed successful API JSON responses with provider-owned errors instead of leaking raw parser failures. - Voice-call provider APIs: report malformed successful guarded JSON responses with provider-prefixed errors instead of leaking raw parser failures. - Realtime transcription: report malformed provider websocket JSON frames with owned parser errors instead of leaking raw `SyntaxError` objects. - Microsoft Foundry: report malformed Azure CLI token JSON with owned auth errors instead of leaking raw parser failures. - Gateway/model pricing: report malformed external pricing catalog JSON with source-owned errors instead of leaking raw parser failures. - QA Lab: report malformed model-catalog subprocess JSON with an owned error and ignore invalid catalog rows. - Google Meet: report malformed browser-control status JSON with plugin-owned errors instead of leaking raw parser failures. - Google provider: report malformed SSE stream JSON with provider-owned errors instead of leaking raw parser failures. - Node host: report malformed built-in invoke `paramsJSON` with stable invalid-request errors instead of leaking raw parser failures. - Amazon Bedrock embeddings: report malformed provider response JSON with provider-owned errors instead of leaking raw parser failures. - QQBot: report malformed access-token JSON with provider-owned errors instead of leaking raw parser failures. - OpenAI embeddings: report malformed batch output JSONL with provider-owned errors instead of leaking raw parser failures. - Synology Chat: report malformed JSON webhook payloads with stable channel-owned parser errors. - Mattermost: report malformed interaction callback JSON with stable channel-owned parser errors. - Twilio voice-call: report malformed media stream WebSocket JSON with an owned parser error instead of logging raw parser failures. - Tlon/Urbit: report malformed SSE event JSON with an owned parser error instead of logging raw parser failures. - Signal: return a stable installer error when GitHub release metadata is malformed JSON. - ClawHub: report malformed successful marketplace JSON responses with owned errors instead of leaking raw parser failures. - Provider usage: report malformed successful usage JSON responses with stable provider errors instead of leaking raw parser failures. - Tlon/Urbit: report malformed scry response JSON with owned errors instead of leaking raw parser failures. - LM Studio: report malformed model list and model load JSON with owned errors instead of leaking raw parser failures. - Matrix: ignore malformed percent-encoding in optional location URI parameters instead of letting a bad `geo:` event abort inbound message handling. - Web search: auto-detect Brave through its legacy `tools.web.search.apiKey` compatibility fallback while keeping doctor migration to `plugins.entries.brave.config.webSearch.apiKey` as the canonical repair, so allowlisted isolated cron runs do not report `web_search` unavailable before migration. Fixes #81538. Thanks @atomicmonk. - Plugins: memoize repeated in-process plugin metadata snapshots and keep vanished managed-install residue from forcing full derived discovery, reducing gateway/status startup scans under large plugin sets. Fixes #81143 and #79806. (#81570) Thanks @Kaspre, @holgergruenhagen, @JanPlessow, and @mjamiv. - CLI/plugins: route lazy plugin command-registration chatter to stderr only during JSON-output command registration, keeping plugin-backed `--json` stdout parseable without changing parse-only or pass-through `--json` behavior. Fixes #81535. (#81536) Thanks @ScientificProgrammer and @vincentkoc. - Plugins: treat git plugin install refs as refs instead of checkout flags, so option-like selectors fail checkout instead of silently installing the default branch. Fixes #79898. (#79901) Thanks @afurm and @vincentkoc. - Doctor/memory: stop warning that no memory plugin is active when an enabled alternate memory plugin explicitly owns the memory slot, while preserving the warning for missing or disabled slot entries. Fixes #78540. (#78557) Thanks @carladams1299-lab and @vincentkoc. - Plugins: keep derived plugin metadata snapshots uncached when the persisted registry is missing, disabled, or stale, so newly added plugins are discovered without restarting. (#81064) Thanks @Kaspre. - Plugins: discover provider plugins from `setup.providers[].envVars` credentials during provider discovery while keeping the deprecated `providerAuthEnvVars` fallback. (#81542) Thanks @JARVIS-Glasses. - Docs/Codex harness: clarify that per-agent `CODEX_HOME` isolates `~/.codex` while inherited `HOME` intentionally keeps `.agents` discovery and subprocess user-home state available. - CLI/plugins: keep bare plugin and parent-command help on the lightweight path, avoiding plugin registry discovery before rendering help. - Auth: reclaim dead-owner stale file locks before retrying locked writes, so crashed OAuth refreshes no longer wedge `auth-profiles.json` until manual cleanup. - CLI tables: preserve muted/color styling on wrapped continuation lines after multiline cells, keeping `openclaw plugins list` descriptions readable. - Process execution: collapse case-insensitive duplicate child environment keys on Windows so caller-provided overrides such as `PATH` cannot be shadowed by host `Path`. - Browser CLI: request the existing `operator.admin` gateway scope explicitly for browser control commands, avoiding unnecessary scope-upgrade approval loops. Fixes #81555. (#81716) Thanks @joshavant. - Web: honor explicitly configured global `web_search` providers during provider ownership resolution while keeping sandboxed `web_fetch` limited to bundled providers. - Plugins/doctor: repair configured legacy npm declaration stubs by reinstalling their npm packages into the managed plugin root instead of loading workspace `node_modules`, and warn when discovery sees those stubs. Fixes #79632. Thanks @Dylanzhang1128 and @vincentkoc. - Channels: keep configured third-party channel plugins visible in `openclaw channels list` when their manifest declares `channels` but has not added `channelConfigs` metadata yet. Fixes #81334. (#81340) Thanks @AllynSheep and @vincentkoc. - Agents: skip bootstrap file and hook preload work on completed `continuation-skip` turns when no workspace bootstrap is pending, reducing isolated-agent prep latency without changing first-turn bootstrap behavior. Fixes #81548. Thanks @delizaran-unpa. - Config: validate JSON dry-runs against plugin-owned channel schemas, so external channel fields are not rejected by stale bundled schemas. Fixes #77887. (#81504) Thanks @giodl73-repo. - iOS: restore first-use Contacts, Calendar, and Reminders permission prompts and add Privacy & Access status/actions in Settings. Thanks @BunsDev. - Canvas: return not found for malformed percent-encoded Canvas/A2UI/document asset paths and keep decoded parent traversal blocked before path normalization. - Telegram: allow trusted local Bot API media files whose filenames start with dots instead of falling back to remote download. - Agents/Codex app-server: remap injected context files under dot-dot-prefixed workspace directories when a run switches to an effective sandbox workspace. - Control UI/i18n: use the installed workspace pi runtime for locale refreshes, update the fallback package pin, and skip scheduled refreshes with invalid provider credentials instead of failing main. - CI/performance: authenticate the clawgrit report repository remote during both checkout and publish so performance report pushes do not fail after benchmarks complete. - Hooks: load workspace-relative legacy hook modules from dot-dot-prefixed directories without treating the filename prefix as parent traversal. - Plugins: preserve installed package metadata and persisted registry freshness checks for plugin package paths under dot-dot-prefixed directories. - Agents: allow dot-dot-prefixed filenames such as `..note.txt` through sandbox FS bridge, remote sandbox reads, and apply_patch summaries without mistaking the name for parent traversal. - CLI/migrate: hide per-item source/plugin hints on non-conflicting Codex skill and plugin selection prompts, keeping the hint text reserved for rows that actually need attention. Thanks @sjf. - Codex harness: treat high-confidence app-server OAuth refresh invalidation as a terminal auth-profile failure, stopping repeated raw token-refresh errors without turning entitlement or usage-limit payloads into re-auth prompts. - CLI/migrate: humanize Codex conflict-status messaging across the migrate UI so selection prompts and plan/result rows say "Codex skill already installed in workspace" instead of surfacing internal `MIGRATION_REASON_*` codes. Thanks @sjf. - CLI/migrate: render migrate result rows with distinct glyphs for manual-review (🔍) and archive (📖) items instead of the misleading "skipped" and "migrated" checkmarks, so users can see which entries still need attention versus which were filed away. Thanks @sjf. - CLI/migrate: split Codex migrate output into separate preview and result phases so the Before plan and After result render through clack with independently tunable copy. Thanks @sjf. - Codex app-server: project bundle and user MCP servers into Codex threads, rotate threads when an MCP server is disabled, scope bundle MCP injection to bundled servers, and resend user MCP config on resume so MCP changes take effect mid-session without restarting the agent. (#81551) Thanks @jalehman. - Codex migration: invoke the managed Codex binary instead of a stale system `codex` for source-config migration plans, so users running the bundled Codex runtime get plan output that matches the binary the gateway will actually use. (#81582) Thanks @fuller-stack-dev. - Subagents/maintenance: preserve pending subagent registry sessions during session-store cleanup, pruning, and disk-budget enforcement so in-flight subagent runs are not deleted by background maintenance before they complete. (#81498) Thanks @ai-hpc. - Control UI/chat: reconcile terminal and reconnect run cleanup with cached session activity, stale compaction/fallback indicators, and a compact composer run-status chip so completed or interrupted turns do not leave Stop active. Fixes #76874 and #64220; refs #71630. Thanks @BunsDev. - Maintainer tooling: clarify which pnpm test/check commands are safe locally versus inside Codex worktrees, routing linked-worktree gates through node wrappers and Crabbox/Testbox. - Auto-reply: preserve same-key ordering when debounced inbound work falls back to immediate flushes, so follow-up turns cannot overtake an active buffered flush. - Telegram/WhatsApp: keep Telegram same-chat replies ordered behind active no-delay turns without blocking WhatsApp follow-up message dispatch. - Codex migration: avoid duplicate cached plugin bundle warnings when app-server plugin inventory is available. - Agents: suppress aborted embedded assistant partials, reasoning text, reply directives, and stale prior replies before user-facing delivery while preserving clean timeout/error payloads. Fixes #48241. Thanks @BunsDev, @andyliu, and @yassinebkr. - Agents: allow dot-dot-prefixed filenames such as `..file.txt` inside workspace and sandbox path policy while still rejecting real parent traversal. - Native image input: detect Windows drive image paths in plain prompts so `C:\...\screenshot.png` references are not missed. - Media: normalize Windows-style filename hints before staging attachments, remote media, audio transcodes, and saved-media display names, so POSIX hosts do not preserve drive or directory text in generated filenames. - Media references: resolve first-level inbound media files whose IDs start with dots instead of treating names like `..photo.png` as parent traversal. - iOS/chat: resize PhotosPicker image attachments to capped JPEGs before staging and sending, stripping source metadata and keeping oversized camera photos under the chat upload budget. Fixes #68524. Thanks @BunsDev. - Control UI: keep shared form, config, and usage text-entry controls at 16px on touch-primary devices while preserving chat composer input sizing, so iOS Safari no longer auto-zooms focused fields. Fixes #64651; carries forward #64673. Thanks @NianJiuZst and @BunsDev. - Agents/trajectory: make the trajectory flush cleanup timeout configurable with `OPENCLAW_TRAJECTORY_FLUSH_TIMEOUT_MS`, preserving the 10s default while slower stores drain. Refs #75839. Thanks @BunsDev. - Skills: load ClawHub and local-manager skill-directory symlinks from managed `~/.openclaw/skills` and personal `~/.agents/skills` roots while keeping workspace, extra, bundled, and per-skill `SKILL.md` containment fail-closed. Fixes #44051. Refs #59219. Thanks @Devattom, @ArthurNie, and @luoxiao6645. - Config: return the canonical persisted config from `config.set`, `config.apply`, and `config.patch` responses after write-time shaping. Fixes #77455. - Codex auth: accept OAuth profiles backed by `oauthRef` during runtime auth selection, so official Codex OAuth logins are used by app-server agent runs. (#81633) Thanks @obviyus. - Telegram: release stopped polling leases after the gateway stop grace so in-process restarts can reuse the same bot token without weakening active duplicate-poller protection. Fixes #81507. (#81890) Thanks @joshavant. - ACP: preserve redacted numeric JSON-RPC `RequestError` details in runtime failure text, so backend diagnostics are visible instead of only `Internal error`. Fixes #81126. (#81188) Thanks @vyctorbrzezowski. - Agents: cache unchanged PI model discovery stores and model lookups, reducing repeated model-resolution startup latency under large model configs. Fixes #78851. - Onboarding: carry returned Codex plugin migration config through the OpenAI model wizard so accepted plugin migrations are saved with the final config write. - Security/Windows ACL audit: classify Anonymous Logon, Guests, Interactive, Local, and Network SIDs as world-equivalent principals so broadly writable paths stay critical instead of being downgraded to group-writable. Fixes #74350. (#74383) Thanks @dwc1997. - Media-understanding: retry transient remote attachment fetch failures before audio or vision processing, so Discord voice notes are not lost after one network/CDN blip. Fixes #74316. Thanks @vyctorbrzezowski and @gabrielexito-stack. - Control UI: order timestamped live stream and tool items before untimestamped history fallbacks, keeping chat history in visible time order. Fixes #80759. (#81016) Thanks @akrimm702. - ClawHub: cancel stalled archive body reads for skill, package, and ClawPack downloads instead of leaving installs hanging after headers arrive. Fixes #52073. Refs #80006. Thanks @xinhuagu and @stainlu. - macOS/Chat: render persisted assistant provider failures from `errorMessage` in refreshed chat history while keeping stale non-error provider details hidden. (#65689) Thanks @javierdici. - Control UI/config: discard stale redacted placeholders from form-mode config saves while preserving restorable saved secrets, so unrelated settings changes no longer submit `__OPENCLAW_REDACTED__` as real data. Fixes #60917. Thanks @giodl73-repo and @BunsDev. - OpenAI plugin: clarify remote Codex OAuth login copy so tunneled users know sign-in may finish automatically before they paste the redirect URL. (#81301) Thanks @rubencu. - SGLang: preserve replayed reasoning history for OpenAI-compatible chat completions, keeping thinking-capable local models from losing prior reasoning turns. (#81091) Thanks @akrimm702. - Plugins/install: derive managed peer dependency pins from npm's lockfile planner instead of recursively scanning `node_modules`, while keeping OpenClaw host peers out of managed root ownership and preserving active root-managed runtimes. Thanks @fuller-stack-dev. - OC Path: restore YAML/YML/.lobster support through the bundled YAML document parser and add `$first` positional addressing alongside `$last`. - Control UI/WebChat: keep short assistant replies clear of in-bubble copy/open action buttons by applying the existing reserved action spacing in the grouped chat renderer. Fixes #79509. (#81244) Thanks @JARVIS-Glasses. - Codex harness: make the live test wrapper portable to Windows and defer locked temp cleanup so native Windows and WSL2 live runs complete. - Telegram: discard legacy long-poll update offsets that cannot be tied to the current bot token, so token rotation no longer leaves bots silently skipping new messages. (#80671) Thanks @sxxtony. - browser: enforce navigation checks for act interactions [AI]. (#81070) Thanks @pgondhi987. - Validate node exec event provenance [AI]. (#81071) Thanks @pgondhi987. - Gateway: keep active reply runs visible to stuck-session diagnostics and clear no-active-work recovery state, preventing stale queued lanes after compaction or tool failures. Fixes #80677. (#81302) - Codex app-server: rotate incompatible context-engine-managed native threads so Lossless-managed sessions do not resume stale hidden Codex history. (#81223) Thanks @jalehman. - Codex cron: execute scheduled command-style automation payloads before workspace bootstrap or memory review, preserving existing isolated cron jobs after Codex harness migration. (#81510) Thanks @jalehman. - Plugin LLM completions: honor Codex agent-runtime policy for canonical OpenAI model refs, so context-engine summarizers can use Codex OAuth instead of requiring direct `OPENAI_API_KEY` auth. (#81511) Thanks @jalehman. - Gateway/OpenAI HTTP: return OpenAI-compatible 400 errors for invalid sampling params and provider validation failures instead of collapsing them to 500s. (#81275) Thanks @Lellansin. - Telegram: publish plugin and skill command description localizations to native command menus while filtering unsupported locale codes and preserving Telegram command limits. (#81351) Thanks @jzakirov. - Limit hook CLI tool authority [AI]. (#81065) Thanks @pgondhi987. - Require admin scope for node device token management [AI]. (#81067) Thanks @pgondhi987. - Restrict chat sender allowlist matching [AI]. (#80898) Thanks @pgondhi987. - Update: suppress the false newer-config warning during restart health probing after an update handoff, while keeping future-version mutation guards intact. (#78652) - Claude CLI: clear a reused stored session id after aborts or non-expired failover errors so the next turn does not resume a poisoned CLI session. Fixes #78785. - Sessions: redact persisted tool result detail metadata before writing transcripts so diagnostic secrets do not survive tool output redaction. (#80444) Thanks @nimbleenigma. - Codex runtime: allow the official installed `@openclaw/codex` package to use its private task-runtime and MCP projection SDK helpers, fixing `MODULE_NOT_FOUND` during migrated OpenAI/Codex beta runs. - Codex migration: make Enter activate the highlighted checkbox row before continuing, so `Skip for now` and bulk-selection rows work even when planned items start preselected. - Link understanding: fetch page content through the SSRF guard before running configured CLI summarizers, preventing curl/wget-style link fetchers from reaching private redirect or DNS-rebound targets. - fix: harden safe-bin argument validation [AI]. (#80999) Thanks @pgondhi987. - Codex/status: align `/codex status` rate-limit wording with `/status` by showing remaining quota and compact reset durations instead of used quota and raw ISO timestamps. Thanks @MatthewSchleder. - Mattermost: log a structured `mattermost no-visible-reply` diagnostic when a substantive (non-reasoning) final reply payload reaches `deliverMattermostReplyPayload` but the underlying `deliverTextOrMediaReply` returns `"empty"` — previously the run completed with a misleading `delivered reply to ` log even though no Mattermost API send happened, masking silent completions in channel/thread contexts. No behavior change; the diagnostic surfaces the failure so operators can detect it instead of seeing the agent appear to go silent. Fixes #80501. Thanks @robbyproc87. - Telegram: limit concurrent startup `getMe` probes across multi-account bots so large Telegram configs do not fan out all account probes at once during gateway startup. Refs #80695. (#80986) Thanks @stainlu. - fix(config): reject auto-managed meta.lastTouched\* paths in config set/unset (#80856). Thanks @ai-hpc - Test state: seed isolated auth-profile secret keys for generated homes, preventing helper-backed proof runs from falling back to host Keychain secrets. (#81393) Thanks @altaywtf. - Plugins/update: clear stale allow/deny entries and selected plugin slots when disabling a plugin after update failure, keeping failed external plugin updates from leaving half-disabled config. (#81512) Thanks @JARVIS-Glasses. - Memory/LanceDB: make auto-capture recognize short CJK memory phrases and configurable literal triggers, so Chinese, Japanese, and Korean users can capture memories without regex or LLM intent detection. Fixes #75680. Thanks @vyctorbrzezowski and @guokewuming. - Plugins doctor: report stale plugin config warnings and avoid claiming full plugin health when config warnings remain. (#81515) Thanks @BKF-Gitty. - Sessions: display `model: "-acp"` / `modelProvider: "acpx"` (ACP-runtime sentinel) for ACP control-plane sessions in `openclaw sessions` output, instead of the agent's configured model which was misleading. Catalog finding 20. (#79543) - Slack: normalize message read `before` and `after` timestamp bounds before calling Slack history or thread reply APIs. Fixes #80835. (#81338) Thanks @honor2030. - Gateway: throttle assistant/thinking agent event fanout during streaming bursts without dropping buffered deltas. (#80335) Thanks @samzong. - Models: restore authenticated CLI runtime providers in the `/models` picker while keeping legacy runtime aliases hidden from setup/default model choices. Closes #81212. (#81239) Thanks @anagnorisis2peripeteia. - Changelog gates: reject bot/app handles as `Thanks` attribution and require explicit human credit for bot/app-authored changelog entries. (#81357) Thanks @hxy91819. - Agents/heartbeat: fix seven layered issues that broke multi-agent heartbeat cadence — (1) fan out the scheduler broadcast wake across agents in parallel via `Promise.all` instead of awaiting each `runOnce` sequentially, so one agent doing real work no longer starves every later agent in iteration order; (2) scope `skipWhenBusy` to lanes attributable to the firing agent via session-key parsing of `session:agent::…` / `nested:agent::…` lane names, instead of consulting the global `subagent` lane, so a single stuck subagent on one agent no longer silently disables every other agent's heartbeat; (3) always append workspace `HEARTBEAT.md` directives (everything outside an optional `tasks:` block) to the dispatch prompt, so prose-runbook `HEARTBEAT.md` files reach the model directly instead of being silently dropped unless periodic tasks are declared; (4) race the initial stream-establishment promise inside `streamWithIdleTimeout` against the same watchdog timer that previously only guarded inter-token gaps, so SDK requests stuck at TCP/TLS handshake or before the first response byte no longer hang indefinitely (the stalled-session diagnostic's `recovery=none` case); (5) emit an `openclaw doctor` warning when `heartbeat.session` pins a session key that has no entry in the agent's session store, so silently-dropped heartbeat deliveries surface at config-validation time; (6) also route the commitment-only task dispatch path (tasks configured, none due) through `appendHeartbeatFileDirectives` so prose directives outside the `tasks:` block reach the model on this path as well; (7) wrap the synchronous `baseFn(...)` invocation inside `streamWithIdleTimeout` in a try/catch that clears the connect watchdog timer before rethrowing, so a provider stream function that throws during setup no longer leaves a live timer that can fire `onIdleTimeout` later with a stale error and keep the process open past the real failure. Thanks @zeroaltitude. - Matrix: stop running `npm install`/`pnpm install` at runtime from a parent-derived plugin path; missing Matrix runtime dependencies now fail with repair guidance instead of mutating the wrong `node_modules` tree. Fixes #80758. (#80876) Thanks @kinjitakabe. - Agents/memory-flush: surface non-abort memory-flush failures (provider timeout, transport error, generic agent failure) as visible reply payloads so the outer reply loop short-circuits and isolated cron runs propagate the error into `meta.error` instead of completing silently with `status: "ok"` and an empty payload. Previously only the specific "Memory flush writes are restricted to ..." message was surfaced. Fixes #80755. Thanks @nailujac. - Channels/loop-guard: enforce shared per-pair bot loop protection in the core channel-turn kernel, with Discord, Slack, Matrix, and Google Chat supplying bot-pair facts where they can reliably identify accepted bot-authored messages. The generic guard keys on `(scope, conversation, participant pair)`, suppresses every additional bot-to-bot event in either direction once a pair crosses the configured budget, and lifts suppression after `cooldownSeconds`. Defaults are `maxEventsPerWindow: 20`, `windowSeconds: 60`, and `cooldownSeconds: 60` whenever a channel lets bot-authored messages reach dispatch; they can be set globally via `channels.defaults.botLoopProtection` and overridden per channel/account or supported per-conversation config. Fixes #58789. Thanks @pandadev66. - Agents/memory-flush: surface non-abort memory-flush failures (provider timeout, transport error, generic agent failure) as visible reply payloads so the outer reply loop short-circuits and isolated cron runs propagate the error into `meta.error` instead of completing silently with `status: "ok"` and an empty payload. Previously only the specific "Memory flush writes are restricted to ..." message was surfaced. Refs #80755. Thanks @kinjitakabe and @nailujac. - Codex harness: use the active Codex runtime context window for OpenAI-selected budgeting, manual `/compact`, and `/status`, so stale OpenAI session metadata no longer overstates context limits. (#81906) thanks @jalehman. ## 2026.5.12 ### Changes - Amazon Bedrock: externalize the Bedrock and Bedrock Mantle provider packages so core installs no longer pull AWS SDK dependencies unless those providers are installed. - Plugins: externalize Slack, OpenShell sandbox, and Anthropic Vertex so their runtime dependency cones install only when those plugins are installed. - Control UI/WebChat: add a persisted auto-scroll mode selector so users can keep the current near-bottom behavior, always follow streaming output, or turn automatic streaming scroll off and use the New messages button manually. Fixes #7648 and #81287. Thanks @BunsDev. - ACP: add `acp.fallbacks` so ACP turns can try configured backup runtime backends when the primary backend is unavailable before any output is emitted. (#69542) Thanks @kaseonedge. - Gateway/OpenAI HTTP: honor `max_completion_tokens` and `max_tokens` on inbound `/v1/chat/completions` requests so client-provided token caps reach the upstream provider via `streamParams.maxTokens`, with `max_completion_tokens` taking precedence when both are sent. Thanks @Lellansin. - Models/OpenAI CLI auth: make `openclaw models auth login --provider openai` start the ChatGPT/Codex account login by default, while `--method api-key` remains the explicit OpenAI API-key setup path. - Google/Gemini: normalize retired Gemini 3 Pro Preview ids inside explicit SDK OAuth auth-result config patches, so provider helpers emit `google/gemini-3.1-pro-preview` for Gemini 3.1 testing. - Google/Gemini: normalize retired Gemini 3 Pro Preview ids inside SDK OAuth auth-result default config patches, so helper-built provider auth flows emit `google/gemini-3.1-pro-preview` for Gemini 3.1 testing. - Google/Gemini: normalize retired Gemini 3 Pro Preview ids returned by direct `openclaw models auth login --set-default` provider auth flows before writing config, so Gemini testing targets `google/gemini-3.1-pro-preview`. - Google/Gemini: normalize retired Gemini 3 Pro Preview ids in per-agent config defaults and auth patches, so agent-specific emitted config keeps targeting `google/gemini-3.1-pro-preview`. - Google/Gemini: normalize retired Gemini 3 Pro Preview ids in provider catalog rows when API-key onboarding only reapplies the agent default, so emitted config keeps testing `google/gemini-3.1-pro-preview`. - Google/Gemini: normalize retired Gemini 3 Pro Preview ids in `config set` mutation output for agent overrides and provider catalog rows, so current config emits `google/gemini-3.1-pro-preview`. - Google/Gemini: canonicalize provider-qualified retired Gemini 3 Pro Preview refs during Google forward-compatible model resolution, so emitted config uses `google/gemini-3.1-pro-preview` for Gemini 3.1 testing. - Google/Gemini: normalize proxy-prefixed retired Gemini 3 Pro Preview catalog rows, so emitted configs use `google/gemini-3.1-pro-preview` for Gemini 3.1 testing. - Google/Gemini: normalize retired Gemini 3 Pro Preview ids inside per-agent model overrides before writing config, so agent-specific config emits `google/gemini-3.1-pro-preview` for Gemini 3.1 testing. - Google/Gemini: normalize retired Gemini 3 Pro Preview ids in subagent, heartbeat, compaction, and subagent-tool model config during writes, so current config keeps emitting `google/gemini-3.1-pro-preview`. - Docs/subagents: document `agents.defaults.subagents.announceTimeoutMs` in the sub-agent and configuration references. (#75509) Thanks @akrimm702. - Cron: add direct `cron.get`, `openclaw cron get `, and agent-tool `get` support for inspecting one stored cron job by id. (#75117) Thanks @samzong. - Agents/tools: add per-sender tool policies with canonical channel-scoped sender keys, so operators can restrict dangerous tools by requester identity across global, agent, group, core, bundled, and plugin tool surfaces. (#66933) Thanks @JerranC. - ACP: expose Gateway session lineage metadata through ACP session listings and session info snapshots so clients can render subagent graphs without private Gateway side channels. (#73458) Thanks @samzong. - Channels/iMessage: add `openclaw channels status --channel ` filtering and document the BlueBubbles-to-imsg cutover path so operators can probe iMessage without starting both channel monitors. (#80706) Thanks @omarshahine. - CI: add a non-blocking `plugin-inspector-advisory` artifact to Plugin Prerelease so release runs capture bundled plugin compatibility triage without changing the blocking gate. - Runtime/Fly: detect Fly Machines as container environments from their runtime env vars, so gateway bind and Bonjour defaults match remote container launches. (#80209) Thanks @liorb-mountapps. - Providers/fal: route GPT Image 2 and Nano Banana 2 reference-image edit requests to `/edit` with `image_urls` array, enforce NB2 edit geometry using `aspect_ratio` and `resolution` params, lift Fal edit mode input-image caps to 10 for GPT Image 2 and 14 for Nano Banana 2, and allow aspect-ratio hints in edit mode. (#77295) Thanks @leoge007. - Control UI: show a plain HTML recovery panel when the app module never registers, giving blank dashboard pages a retry path and browser-extension troubleshooting link. Fixes #44107. Thanks @BunsDev. - Docs: rename the broad tools nav to Capabilities, keep automation and agent coordination as sections, and keep the tools overview focused on tools, skills, and plugins. https://docs.openclaw.ai/tools - Build: enable additional low-churn oxlint rules for promise, TypeScript, and runtime footgun checks. - Build: enable stricter Vitest lint rules for focused, disabled, conditional, hook, matcher, and expectation hazards. - Build: pin explicit oxfmt defaults in the shared formatter config to keep formatting behavior stable across upgrades. - TypeScript: enable stricter compiler checks for implicit returns, side-effect imports, overrides, and unused production code. - Logging: add targeted model transport, payload, SSE, and code-mode diagnostics with redacted URL handling. - Agents/code mode: add opt-in generic QuickJS-WASI code mode that exposes `exec`/`wait` while hiding enabled tools behind a catalog bridge. - Agents: allow `session.agentToAgent.maxPingPongTurns` up to 20 while keeping the default at 5 for longer agent-to-agent reply chains. Fixes #52382. (#52400) Thanks @thirumaleshp. - Agents: add per-agent `tools.message.crossContext` overrides so sandboxed/public agents can restrict message sends to the current conversation without changing the global bot policy. - Agents: add per-agent `tools.message.actions.allow` overrides so sandboxed/public agents can expose and enforce send-only message tools. - Agents: omit the sandbox workspace marker from compact command progress previews while keeping internal sandbox diagnostics unchanged. - Agents: widen progress draft command preview lines by 50% so Discord inline tool updates preserve more useful command context. - Codex app-server: retire timed-out app-server clients after bounded turn interrupts so Discord agents do not reuse a CPU-spinning Codex process after an attempt timeout. - Codex app-server: default migrated native plugin destructive-action policy to enabled while preserving explicit global and per-plugin false overrides. - Build: upgrade workspace package management to pnpm 11 and keep Docker, install, update, and release workflows on the pnpm 11 config surface. (#79414) Thanks @altaywtf. - Build: align Telegram QA workflows and git source installs with the pnpm 11 workspace build allowlist surface. (#80588) Thanks @altaywtf. - Models: add provider-level `localService` startup for on-demand local model servers before OpenAI-compatible requests, including one-shot model probes. - Agents: trim default system prompt guidance and send-only message tool schemas to reduce prompt tokens while preserving GPT-5 personality guidance. - Context: add `/context map` to send a treemap image of the current session context contributors. (#79867) - Slack: add `unfurlLinks` and `unfurlMedia` config for bot `chat.postMessage` replies, including per-account overrides, so Slack link and media previews can be suppressed without workspace-wide settings. Fixes #48435. (#80145) Thanks @esegev1 and @HemantSudarshan. - Slack: add explicit `replyBroadcast` support for text and Block Kit thread replies so agents can opt into Slack's parent-channel `reply_broadcast` behavior. (#64365) Thanks @tony88331. - Slack: preserve mention target/source metadata in inbound prompt context so agents can distinguish direct bot mentions from implicit thread wakes that mention someone else. Fixes #79025. (#75356) Thanks @tmimmanuel. - Slack: canonicalize outbound delivery-mirror routes for native DM channel IDs to the peer user session so `message.send` calls to `D...` targets do not split the same Slack DM thread into a channel session. Fixes #80091. (#80111) Thanks @bek91. - Plugin SDK: deprecate public subpaths that existed for at least one month and have no bundled extension production imports, keep legacy barrel/test/zod subpath package exports for backwards compatibility, and track both sets in the SDK surface report. - Plugin SDK: deprecate public subpaths currently used by only one or two bundled plugin owners, keeping them importable while steering new plugin code to focused shared SDK seams or plugin-owned APIs. - Plugin SDK: remove the owner-specific `provider-auth-login` public subpath after moving Chutes, GitHub Copilot, and OpenAI Codex auth flows back to provider-owned modules. - Plugin SDK: remove provider-specific model, stream, and xAI compatibility helpers from public exports after moving bundled callers to provider-owned modules. - Plugin SDK: expose runtime-supplied active model metadata to native plugin tool factories for diagnostics and plugin-owned policy decisions. Fixes #77857. Thanks @jamiezigelbaum. - QA/Mantis: add Telegram live PR evidence automation with Convex-leased credentials, Crabbox transcript capture, motion GIF previews, and inline PR comments. - QA/Mantis: add a Telegram desktop scenario builder that leases Crabbox, installs native Telegram Desktop, configures an OpenClaw Telegram gateway with leased bot credentials, and records VNC screenshot/video artifacts. - Discord/voice: add realtime voice diagnostics for speaker turns, playback resets, barge-in detection, and audio cutoff analysis. - Talk: add `talk.realtime.instructions` so operators can append realtime voice style instructions while preserving OpenClaw's built-in agent-consult guidance. (#79081) Thanks @VACInc. - Discord/voice: default test and source installs to the pure-JS `opusscript` decoder by ignoring optional native `@discordjs/opus` builds, avoiding slow native addon compiles outside dedicated voice-performance lanes. - Discord/voice: add an opt-in native `@discordjs/opus` install script and decoder preference for live voice-performance lanes without charging unrelated Docker/tests for native addon builds. - Discord/voice: add `voice.allowedChannels` to restrict voice joins and bot voice-state moves to configured channels while preserving open voice behavior when unset. - Gateway/skills: add an opt-in private skill archive upload install path gated by `skills.install.allowUploadedArchives`, so trusted Gateway clients can stage and install zip-backed skills only when operators explicitly enable the code-install surface. (#74430) Thanks @samzong. - Codex app-server: enable Codex native code-mode-only for harness threads so deferred OpenClaw dynamic tools run through Codex's own searchable code execution surface instead of a PI-style wrapper. - Dependencies: refresh workspace pins and patch targets, including ACPX `@agentclientprotocol/claude-agent-acp` `0.33.1`, Codex ACP `0.14.0`, Baileys `7.0.0-rc10`, Google GenAI `2.0.1`, OpenAI `6.37.0`, AWS SDK `3.1045.0`, Kysely `0.29.0`, Tlon skill `0.3.6`, Aimock `1.19.5`, and tsdown `0.22.0`. - Dependencies: refresh workspace pins for Anthropic SDK, Smithy shared ini loading, Playwright, YAML, Aimock, TypeScript native preview, Vitest, Oxlint/Oxfmt, Vite, and pnpm 11.1.0. - Dependencies: hard-pin non-peer direct dependency specs across bundled packages and add a changed-check guard so runtime installs resolve the exact versions tested by maintainers. - Dependencies: move embedded Pi packages to the `@earendil-works` namespace, refresh Twitch Twurple packages, and move `@openclaw/fs-safe` from the GitHub release pin to the published npm package. - Build: route Testbox changed-check delegation through Crabbox and remove the OpenClaw-specific Blacksmith Testbox helper scripts. - Agents/compaction: preserve scoped background exec/process session references across embedded compaction and after-turn runtime contexts without exposing sessions from unrelated scopes. Fixes #79284. (#79307) Thanks @TurboTheTurtle. - Agents/process: tell agents to inspect background sessions with `process log` before sending interactive input and to use `waitingForInput`/`stdinWritable` hints from `log`/`poll`. - CLI/onboarding: improve setup, onboarding, configure, and channel command wayfinding so terminal flows explain the next useful command instead of relying on terse setup labels. - Agents/Codex: remove the configurable Codex dynamic-tools profile so Codex app-server always owns workspace, edit, patch, exec, process, and plan tools while OpenClaw integration tools remain available. - macOS app: update the Peekaboo bridge dependency to Peekaboo 3.0.0. - Dependencies: refresh workspace pins and move the WhatsApp plugin from `@whiskeysockets/baileys` to `baileys` while keeping the `7.0.0-rc10` runtime. - Plugin SDK: add bundled-plugin session actions, `sendSessionAttachment`, and Cron-backed `scheduleSessionTurn`/tag cleanup under the grouped session namespace. Replaces #75578/#75581/#75588 and part of #73384/#74483. Thanks @100yenadmin. - Plugin SDK/media-understanding: add `extractStructuredWithModel(...)` plus the optional provider-side `extractStructured(...)` seam so trusted plugins can run bounded image-first structured extraction with optional supplemental text context through provider-owned runtimes such as Codex. - Exec approvals: add `tools.exec.commandHighlighting` so parser-derived command highlighting in approval prompts can be enabled globally or per agent. (#79348) Thanks @jesse-merhi. - Codex app-server: mirror native Codex subagent spawn lifecycle events into Task Registry so app-server child agents appear in task/status surfaces without relying on transcript text. (#79512) Thanks @mbelinky. - Skills: add `skills.load.allowSymlinkTargets` so intentional symlinked skill folders can resolve into trusted sibling repos without disabling root containment. - Agents/tools: add core Tool Search so agents can search and call large OpenClaw, MCP, and client tool catalogs through one compact PI bridge. - Doctor: warn when a per-agent model config omits the `fallbacks` key and `agents.defaults.model.fallbacks` is non-empty. Covers both string-form (`"model": "..."`) and partial-object form (`"model": { "primary": "..." }`) — both silently clobber the defaults chain at runtime. Use `"fallbacks": []` to explicitly opt out of fallbacks, or add `"fallbacks": [...]` to inherit or override. Fixes #79369. - Chat commands: add `/think default` and `/fast default` to clear session overrides and inherit configured/provider defaults. (#79385) Thanks @VACInc. - Dependencies: refresh workspace dependency pins and lockfile, including `@openai/codex` `0.130.0`, `acpx` `0.7.0`, AWS SDK `3.1044.0`, OpenTelemetry `0.217.0`, `typebox` `1.1.38`, `vite` `8.0.11`, `oxfmt` `0.48.0`, and `oxlint` `1.63.0`, and update the Codex harness model snapshot for the new bundled app-server catalog. - Plugins/install: add guarded plugin install overrides so onboarding and repair tests can route specific plugins to registry specs or local `npm pack` artifacts via environment variables. - Tests/Docker: add Codex on-demand install and live plugin-tool dependency E2E lanes for packaged onboarding and npm-pack plugin proof. - Plugins/ACPX: accept an optional `args` array in `agents.` config so paths and flag values containing spaces stay intact when spawning ACP agent processes. Thanks @TheArchitectit and @BunsDev. - Agents: inject the current provider/model identity into system prompts, including configured prompt overrides and CLI hook prompt replacements, so agents can answer model-identity questions from the actual runtime selection. - Agents/subagents: add prompt-only `agents.defaults.subagents.delegationMode` and per-agent overrides with `suggest`/`prefer` modes, and centralize config-backed system prompt resolution across embedded, CLI, compaction, and command-export prompt surfaces. - Agents/subagents: add stronger delegation orchestration guidance, `sessions_yield` wait guidance, stable `taskName` aliases, and active-child runtime prompt context for spawned sub-agent work. - Plugins/CLI: add the optional bundled `oc-path` plugin, providing `openclaw path` for surgical `oc://` access to markdown, JSONC, and JSONL workspace files. - Plugins/SDK: add unified model catalog registration for text, image, video, and music providers, including `providerCatalogEntry` manifests, shared media list help, live catalog caching, and per-model video capability overlays. - Plugin SDK: add presentation helpers for controls-only interactive rendering and opt-in empty fallback text so rich channel renderers can share `MessagePresentation` semantics without duplicating native cards or components. - CLI: make parser, startup, config, guardrail, channel, agent, task, session, and MCP failures explain what happened and point to the next recovery command. - GitHub Copilot: refresh the model catalog from `${baseUrl}/models` so per-account entitlement and accurate context windows surface at runtime; static manifest catalog (now including `gpt-5.5`) remains the fallback when discovery is disabled or the API is unreachable. - Active Memory: support concrete `plugins.entries.active-memory.config.toolsAllow` recall tool names for custom memory plugins while keeping the built-in memory-core default on `memory_search`/`memory_get` and preserving `memory_recall` automatically for `plugins.slots.memory: "memory-lancedb"`. - Active Memory: report normal `NONE` recall decisions as `status=no_relevant_memory`, keep unavailable and failed recall paths distinct, and avoid caching no-summary recall results so ordinary no-context turns no longer look like broken `status=empty` memory. Fixes #79812. (#80015) Thanks @TurboTheTurtle. - Telegram: share the grammY API throttler across polling and ad hoc send clients for the same bot token, so visible draft previews and CLI sends use one quota gate. Thanks @anagnorisis2peripeteia. - Feishu: resolve group policy/tool context from the trusted chat target for group turns while keeping the speaker in `From`, so @mention replies do not drop the configured group id. Fixes #79457. Thanks @greyxiong. - Telegram/Feishu: honor configured per-agent and global `reasoningDefault` values when deciding whether channel reasoning previews should stream or stay hidden, addressing the preview-default part of #73182. Thanks @anagnorisis2peripeteia. - QQBot: mark recognized framework slash commands as text-command turns before reply dispatch so `/models`, `/status`, and `/new` responses stay visible in QQ Bot C2C conversations. Fixes #79310. Thanks @rollingshmily. - Docker: run the runtime image under `tini` so long-lived containers reap orphaned child processes and forward signals correctly. (#77885) Thanks @VintageAyu. - Logging/redaction: redact quoted HTTP client secret fields and auth/cookie headers in shared log and formatted error output. Related #71211 and #65623. (#75033) Thanks @liaoandi. - Gateway/SDK: document and stabilize the task ledger RPC surface for `tasks.list`, `tasks.get`, and `tasks.cancel`, including generated Swift model typing for optional task summaries. Thanks @BunsDev. - Google/Gemini: normalize retired `google/gemini-3-pro-preview` and `google-gemini-cli/gemini-3-pro-preview` selections to `google/gemini-3.1-pro-preview` before they are written to model config. - Google/Gemini: emit canonical `google/gemini-3.1-pro-preview` ids from configured provider catalog rows so model list and selection paths can test Gemini 3.1 instead of retired Gemini 3 Pro. - Google/Gemini: normalize nested proxy-provider catalog ids like `google/gemini-3-pro-preview` to `google/gemini-3.1-pro-preview`, so Kilo-style configured catalogs test Gemini 3.1 instead of the retired Gemini 3 Pro id. - Google/Gemini: canonicalize provider-onboarding model alias maps so setup flows preserve settings under `google/gemini-3.1-pro-preview` instead of re-emitting retired Gemini 3 Pro config keys. - Google/Gemini: canonicalize retired Gemini 3 Pro Preview ids inside Google dynamic model resolution so runtime clones also use `google/gemini-3.1-pro-preview`. - Google/Gemini: canonicalize provider-auth default model results before setup hooks and picker returns so auth flows do not re-emit retired `google/gemini-3-pro-preview` selections. - Amazon Bedrock: support `serviceTier` parameter for Bedrock models, configurable via `agents.defaults.params.serviceTier` or per-model in `agents.defaults.models`. Valid values: `default`, `flex`, `priority`, `reserved`. (#64512) Thanks @mobilinkd. - Control UI: read the Quick Settings exec policy badge from `tools.exec.security` instead of the non-schema `agents.defaults.exec.security` path, so configured `full`/`deny` values render accurately. Fixes #78311. Thanks @FriedBack. - Control UI/usage: add transcript-backed historical lineage rollups for rotated logical sessions, with current-instance vs historical-lineage scope controls and long-range presets so usage history stays visible after restarts and updates. Fixes #50701. Thanks @dev-gideon-llc and @BunsDev. - Agents/failover: harden state-aware lane suspension by persisting quota resume transitions, restoring configured lane concurrency, preserving non-quota failure reasons, and exporting model failover events through diagnostics OTLP. Thanks @BunsDev. - Control UI/Windows: add the SPA-side WebView2 bridge for native hosts so draft text can update the chat composer and the ready handshake is wired through the app lifecycle. (#69633) Thanks @AlexAlves87. - Channels/streaming: make progress draft labels scroll away with other progress lines, render structured tool rows as compact emoji/title/details, show web-search queries from provider-native argument shapes, and skip empty Discord apply-patch starts until a patch summary exists. (#79146) - Runtime/performance: avoid full-array sorting while auto-selecting providers, resolving supported thinking levels, picking node last-seen timestamps, and extracting Codex usage-limit messages. Thanks @shakkernerd. - Plugins/doctor: avoid full-array sorting while selecting ClawHub search/archive results and bounded dreaming doctor entries. Thanks @shakkernerd. - Agents/compaction: keep contributor diagnostics to a bounded top-three selection without sorting the full history. Thanks @shakkernerd. - Sessions/UI: avoid full-array sorting while selecting ACPX leases, Google Meet calendar events, and latest chat sessions. Thanks @shakkernerd. - Plugin SDK: mark direct `deliverOutboundPayloads` and legacy reply-dispatch bridges as deprecated compatibility substrate, enrich `sendDurableMessageBatch` with explicit durable send outcomes, migrate bundled send/turn paths off deprecated APIs, and enforce the split with `check:deprecated-api-usage`. - OpenAI/Talk: add browser realtime Talk controls, Google Meet `test_speech` support for `mode: "bidi"`, and the `gpt-realtime-2` default. Correction: the announced `openai-codex` OAuth fallback does not have a supported public realtime transport; Talk, Gateway relay/Voice Call, and realtime transcription require OpenAI Platform credentials. Thanks @Solvely-Colin. - Telegram: preserve the channel-specific 10-option poll cap in the unified outbound adapter so over-limit polls are rejected before send. (#78762) Thanks @obviyus. - Telegram/streaming: continue over-limit draft previews in a new message instead of stopping when rendered preview text crosses Telegram's message limit. (#74508) Thanks @anagnorisis2peripeteia. - Slack: route handled top-level channel turns in implicit-conversation channels to thread-scoped sessions when Slack reply threading is enabled, keeping the root turn and later thread replies on one OpenClaw session. (#78522) Thanks @zeroth-blip. - Telegram: re-probe the primary fetch transport after repeated sticky fallback success so transient IPv4 or pinned-IP fallback promotion can recover without a gateway restart. Fixes #77088. (#77157) Thanks @MkDev11. - Agents/harness: skip tool-result middleware validation when no handler is registered, and sanitize incoming tool result `details` (functions, symbols, bigints, cycles, oversized payloads) before middleware sees them. Tool emitters legitimately produce raw dependency payloads on `details`, and the harness owes any registered middleware a JSON-safe view of that payload; otherwise a no-op middleware (e.g. bundled `tokenjuice` on the `pi` runtime) causes the validator to reject every tool result and silently substitute a failure sentinel, dropping outbound Discord messages, exec output, cron results, and any other tool whose payload carries non-serializable values. Thanks @solomonneas. - Runtime/install: raise the supported Node 22 floor to `22.16+` so native SQLite query handling can rely on the `node:sqlite` statement metadata API while continuing to recommend Node 24. (#78921) - Discord/voice: make duplicate same-guild auto-join entries resolve to the last configured channel so moving an agent between voice channels does not keep joining the stale channel. - Discord/voice: add realtime `/vc` modes so Discord voice channels can run as STT/TTS, a realtime talk buffer with the OpenClaw agent brain, or a bidi realtime session with `openclaw_agent_consult`. - Discord/voice: add bounded realtime gateway logs for voice channel joins, realtime model/voice selection, transcripts, consult routing/answers, and playback start, allow OpenAI realtime Discord sessions to disable input-triggered response interruption for echo-heavy rooms while keeping explicit Discord barge-in available for new and already-active speakers, and allow voice turns to target an existing Discord channel agent session. - Discord/voice: add `voice.realtime.minBargeInAudioEndMs` and let the realtime provider own playback clearing, so speaker echo no longer cuts OpenAI realtime model audio at `audioEndMs=0` while low-echo rooms can opt back into immediate barge-in with `0`. - Discord/voice: make `agent-proxy` the default voice mode so realtime voice acts as the microphone/speaker extension of the routed OpenClaw agent session, with `stt-tts` remaining available as an explicit fallback. - Discord/voice: route default `agent-proxy` realtime turns through the OpenClaw consult handoff with owner-level tool access and a forced-consult transcript fallback, matching the Codex-style voice front end while keeping the routed agent authoritative. - Discord/voice: keep OpenAI realtime bidi consults quiet while the supervisor agent is still working, accept Codex-style `conversation.item.done` function-call events, and preserve continuing tool results through the gateway relay so the OpenAI realtime bridge reliably routes consults before speaking the final answer. - Discord/voice: include a bounded one-line STT transcript preview in verbose voice logs so live voice debugging shows what speakers said before the agent reply. - Codex app-server: pin the managed Codex harness and Codex CLI smoke package to `@openai/codex@0.129.0`, defer OpenClaw integration dynamic tools behind Codex tool search by default, and accept current Codex service-tier values so legacy `fast` settings survive the stable harness upgrade as `priority`. - Codex app-server: annotate message-tool-only direct chat turns in the dynamic `message` tool spec so visible replies are sent through `message(action="send")` instead of staying private. (#79704) - Agents/PI: route explicit OpenAI Codex Responses runs through PI's native WebSocket-capable transport and remove OpenClaw's custom OpenAI Responses WebSocket stack while preserving auth injection, run abort signals, and prompt cache boundary stripping. - Models/config: allow `compat.thinkingFormat` values `qwen` and `qwen-chat-template` for configured OpenAI-compatible Qwen models, preserving them through catalog normalization and mapping `/think` levels to `enable_thinking` or `chat_template_kwargs.enable_thinking`. Fixes #79677. (#79777) Thanks @indulgeback. - Codex app-server: default implicit local stdio app-server permissions to guardian when Codex system requirements disallow the YOLO approval, reviewer, or sandbox value, including hostname-scoped remote sandbox entries, avoiding turn-start failures on managed hosts that permit only reviewed approval or narrower sandboxes. - Plugins/install: run managed npm-root install, uninstall, prune, and repair commands from the managed root without a redundant `--prefix .`, avoiding npm 10.9.3 Arborist crashes on native Windows WhatsApp plugin installs. Fixes #78514. (#78902) Thanks @melihselamett-stack. - Config/schema/Windows: detect direct execution of the base config schema generator with `pathToFileURL` so Windows paths with backslashes still run the `--check` and `--write` command body. (#52989) Thanks @easyteacher. - Discord/voice: stream ElevenLabs TTS directly into Discord playback and send ElevenLabs latency optimization as the documented query parameter so spoken replies can start sooner. - Discord/voice: keep TTS playback running when another user starts speaking, ignore new capture during playback to avoid feedback loops, and downgrade expected receive-stream aborts to verbose diagnostics. - iMessage: expose native private-API message actions through `imsg rpc` for reactions, edits, unsends, replies, rich sends, attachments, and group management when `imsg status --json` reports the required bridge capabilities. - Gateway/tasks: reconcile stale CLI run-context tasks whose live run context disappeared even when a child session row remains, and apply the default bounded reload deferral timeout to channel hot reloads so stale task records cannot block Discord/Slack/Telegram reloads forever. - Gateway/heartbeat: keep stripped `HEARTBEAT_OK` acknowledgements out of pending final-delivery replay and let recent ack-only pending state proceed to the next heartbeat run instead of creating a self-refreshing requests-in-flight loop. Fixes #79258. Thanks @haumanto. - Gateway/sessions: keep session-store index writes atomic while skipping durable fsync inside the writer lock, reducing cron and channel-turn starvation on slow filesystems and addressing the session-store strand of #73655. Thanks @mmartoccia. - Discord/voice: make `openclaw channels capabilities --channel discord --target channel:` and `channels status --probe` audit voice-channel permissions, including auto-join targets, so missing Connect/Speak/Read Message History permissions show up before `/vc join`. - Gateway/restart: expose `skipDeferral` on the `gateway.restart.request` RPC and add `openclaw gateway restart --safe --skip-deferral` so operators can bypass the safe-restart deferral gate when a pinned task run prevents the OpenClaw-aware restart from draining. Surfaces the existing internal `scheduleGatewaySigusr1Restart({ skipDeferral })` semantics added in #71637 to a public surface, complementing `gateway.reload.deferralTimeoutMs`. Refs #76162. Thanks @solomonneas. - Discord/streaming: default Discord replies to progress draft previews so tool/work activity appears in one edited Discord message unless `channels.discord.streaming.mode` is set to `off`. - OpenAI/realtime: default realtime voice to `gpt-realtime-2`, use the GA Realtime WebSocket session shape for backend OpenAI bridges, and cover backend, WebRTC, Google Live, and Gateway relay paths in the live Talk smoke. (#79130) - Update/Windows: spawn the post-core-update child process with `stdio:"pipe"` on Windows so PowerShell/CMD console handles are not inherited, preventing the terminal from hanging after `openclaw update` completes. Fixes #78445. (#78483) Thanks @Beandon13. - Plugins/install: add `npm-pack:` installs so local npm pack artifacts run through the same managed npm-root install, lockfile verification, dependency scan, and install-record path as registry npm plugins. - Channels/plugins: show configured official external channels as missing-plugin status rows and send errors with exact install/doctor repair commands after raw package-manager upgrades leave Feishu or WhatsApp uninstalled. Fixes #78702 and #78593. Thanks @MarkMa84 and @mkupiainen. - Matrix: move the Matrix channel back to an official external ClawHub/npm plugin so core installs no longer need Matrix SDK runtime dependencies. - Matrix: attach `com.openclaw.presentation` metadata to semantic presentation replies so OpenClaw-aware Matrix clients can render rich buttons, selects, context rows, and dividers while stock clients keep the plain text fallback. (#73312) Thanks @kakahu2015. - Codex app-server: disarm the short post-tool completion watchdog after current-turn activity, expose `appServer.turnCompletionIdleTimeoutMs`, and include raw assistant item context in idle-timeout diagnostics so status-only post-tool stalls stop failing as idle. Fixes #77984. Thanks @roseware-dev and @rubencu. - Codex app-server: release the session lane after a completed assistant message item goes quiet without `turn/completed`, and stop global rate-limit notifications from keeping stuck turns alive. - Plugin skills/Windows: publish plugin-provided skill directories as junctions on Windows so standard users without Developer Mode can register plugin skills without symlink EPERM failures. Fixes #77958. (#77971) Thanks @hclsys and @jarro. - Process tool: show input-wait hints from `log` and `poll` for idle interactive background sessions so operators can inspect stuck CLIs and resume them with existing input actions. Fixes #33957. Thanks @bitloi and @vincentkoc. - Shell env/Windows: hide the login-shell environment probe child window so gateway startup and shell-env refreshes do not flash a console on Windows. Fixes #78159. (#78266) Thanks @BradGroux. - MS Teams: surface blocked Bot Framework egress by logging JWKS fetch network failures and adding a Bot Connector send hint for transport-level reply failures. Fixes #77674. (#78081) Thanks @Beandon13. - Windows/restart: skip duplicate scheduled-task `/Run` calls when the gateway task is already running, using a locale-stable PowerShell task-state probe before retrying. Fixes #52044. (#52487) Thanks @andyk-ms. - Media/host-read: allow buffer-verified ZIP archives in the host-local media validator so agents can send ZIP attachments via the message tool. Fixes #78057. (#78292) Thanks @Linux2010. - Gateway/sessions: fast-path already-qualified model refs while building session-list rows so `openclaw sessions` and Control UI session lists avoid heavyweight model resolution on large stores. (#77902) Thanks @ragesaq. - Contributor PRs: remind external contributors to redact private information like IP addresses, API keys, phone numbers, and non-public endpoints from real behavior proof. Thanks @pashpashpash. - ACP bridge: relay Gateway exec approval prompts from active ACP turns to the ACP client's `session/request_permission` handler before resolving the Gateway approval. Thanks @amknight. - Codex/plugins: enable migrated source-installed `openai-curated` Codex plugins in the same Codex harness thread with explicit `codexPlugins` config, cached app readiness, and fail-closed destructive-action policy. Thanks @kevinslin. - Codex/plugins: enforce native plugin destructive-action policy with Codex app-level `destructive_enabled` config instead of OpenClaw-maintained per-tool deny lists, leave plugin app `open_world_enabled` on by default, and invalidate existing plugin app thread bindings so old generated app config is rebuilt. Thanks @kevinslin. - QQBot/Skills: translate QQBot skill descriptions surfaced in the Skills UI so English-language users no longer see Chinese metadata. Fixes #77810. Thanks @eabase. - Image generation: include enabled generation providers such as fal in provider discovery even when another image provider is already active. Fixes #78141. Thanks @leoge007. - Slack: keep Socket Mode's native reconnect enabled so transient ping/pong misses can recover without forcing a full provider rebuild. Fixes #77933. Thanks @bmoran1022 and @brokemac79. - Cron: preserve cron timeout results when an isolated agent turn's `cron-nested` lane watchdog fires, preventing internal command-lane or model-fallback timeout text from being persisted. Fixes #77703. (#78168) Thanks @brokemac79 and @transxtech. - PR triage: mark external pull requests with `proof: supplied` when Barnacle finds structured real behavior proof, keep stale negative proof labels in sync across CRLF-edited PR bodies, and let ClawSweeper own the stronger `proof: sufficient` judgement. - ACPX/Codex: preserve trusted Codex project declarations when launching isolated Codex ACP sessions, avoiding interactive trust prompts in headless runs. Thanks @Stedyclaw. - ACPX/Codex: reap stale OpenClaw-owned ACPX/Codex ACP process trees on startup and after ACP session close, preventing orphaned harness processes from slowing the Gateway. Thanks @91wan. - ACP bridge: implement stable session list, resume, and close handlers so ACP clients can page Gateway sessions, rebind existing sessions without replay, and close bridge sessions cleanly. Thanks @amknight. - ACP bridge: replay complete ledger-backed ACP sessions on load, including user prompts, tool updates, session metadata, and usage snapshots, while keeping older sessions on the existing transcript fallback. Thanks @amknight. - ACP sessions: allow parent agents to inspect and message their own spawned cross-agent ACP sessions without enabling broad agent-to-agent visibility. Thanks @barronlroth. - Talk/voice: unify realtime relay, transcription relay, managed-room handoff, Voice Call, Google Meet, VoiceClaw, and native clients around a shared Talk session controller and add the Gateway-managed `talk.session.*` RPC surface. - Diagnostics/Talk: export bounded Talk lifecycle/audio metrics and session recovery metrics through OpenTelemetry and Prometheus without exposing transcripts, audio payloads, room ids, turn ids, or session ids. - Logging/Talk: route shared Talk lifecycle events into bounded file and OTLP log records while keeping transcript text, audio payloads, turn ids, call ids, and provider item ids out of logs. - Voice Call/realtime: add opt-in OpenClaw agent voice context capsules and consult-cadence guidance so Gemini/OpenAI realtime calls can sound like the configured agent without consulting the full agent on every ordinary turn. Thanks @scoootscooob. - Telegram/streaming: keep draft preview rotation from reusing a pre-tool assistant preview after visible tool or media output lands between compaction replay and the next assistant message. Thanks @vincentkoc. - Telegram/performance: skip non-forum topic-cache setup, defer status reaction variant work until reactions are needed, and reuse ack reaction gating during message context assembly. Thanks @vincentkoc. - Telegram/performance: reduce command-menu CPU and allocation work when many native, plugin, and custom commands are registered. (#79717) Thanks @drsolveit. - CLI/migrate: add bulk on/off and skip controls to interactive Codex skill migration, leaving conflicting skill copies unchecked by default. (#77597) Thanks @kevinslin. - CLI/migrate: show native Codex plugin names before truncated plan items and prompt for plugin activation explicitly during interactive Codex migration instead of silently keeping every planned plugin. Thanks @kevinslin. - CLI/migrate: leave already configured target Codex plugins unchecked in the interactive plugin selector and show a `plugin exists` conflict hint while keeping new plugin activations selected by default. Thanks @kevinslin. - CLI/migrate: return cleanly without apply confirmation when interactive Codex migration leaves both skill copies and native plugin activations unselected. Thanks @kevinslin. - Gateway/sessions: extend the per-call sessions-list `rowContext` cache with memoization for `resolveSessionDisplayModelIdentityRef`, thinking metadata, and `resolveModelCostConfig` so deterministic per-row resolvers run once per unique `(provider, model[, agentId])` tuple instead of once per session. Cuts CPU on `sessions.list` for stores with many sessions sharing a small set of model tuples; behavior is unchanged for callers that pass no `rowContext`. Thanks @rolandrscheel. - Cron CLI: add `openclaw cron list --agent `, normalize the requested agent id, and include jobs without a stored agent id under the configured default agent while keeping `cron list` unfiltered when no agent is supplied. Fixes #77118. Thanks @zhanggttry. - Slack/performance: reduce message preparation, stream recipient lookup, and thread-context allocation overhead on Slack reply hot paths. Thanks @vincentkoc. - Control UI/chat: strip untrusted sender metadata from live streams and transcript display, preserve canvas preview anchors, and stop operator UI clients from injecting their internal client id as sender identity. Fixes #78739. Thanks @tmimmanuel, @guguangxin-eng, @hclsys, and @BunsDev. - Control UI/chat: collapse consecutive duplicate text messages into one bubble with a count so repeated text-only messages stay compact without hiding nearby context. - Control UI/chat and Sessions: label inherited thinking defaults separately from explicit overrides while preserving provider-supplied option labels. Fixes #77581. Thanks @BunsDev and @Beandon13. - Agents/runtime: add prepared runtime foundation contracts for carrying provider, model, tool, TTS, and outbound runtime facts through later reply-path migrations. Thanks @mcaxtr. - Control UI/WhatsApp: keep Show QR available for unlinked WhatsApp accounts while switching linked accounts to the explicit Relink action and showing Wait for scan only when a QR is active. Thanks @BunsDev. - Gateway/performance: reuse the compatible plugin metadata snapshot across dashboard and channel agent turns so auto-enabled runtime config does not repeatedly rescan plugin metadata before provider calls. Thanks @shakkernerd. - Gateway/performance: reuse current plugin metadata for provider activation, auth/env candidate lookup, and bundle settings during dashboard and channel agent turns while keeping the configless secret-target cache unscoped and refusing stale unscoped reuse when plugin discovery roots differ. Thanks @shakkernerd. - Gateway/performance: avoid resolving plugin auto-enable metadata twice in one runtime config pass, reducing repeated dashboard turn metadata scans. Thanks @shakkernerd. - Control UI/performance: pre-scope config tab schemas before rendering, load Channels with cached/runtime status before manual probes, preserve channel rows through failed status summaries, and keep stale slow probes from replacing newer snapshots. Thanks @BunsDev. - Auth/providers: pass `config` and `workspaceDir` lookup context through to provider-id resolution so workspace-scoped auth aliases resolve correctly when no explicit alias map is supplied. Thanks @shakkernerd. - Gateway/diagnostics: add startup phase spans, active work labels, stale terminal bridge markers, and opt-in sync-I/O tracing in `pnpm gateway:watch` so slow Gateway turns are easier to attribute from logs and stability diagnostics. - QA/Mantis: add an opt-in Discord thread attachment before/after scenario that creates a real thread, calls `message.thread-reply` with `filePath`, and captures baseline/candidate screenshot evidence. - Discord: preserve `filePath` and `path` attachments when replying to a thread with the message tool. - QA/Mantis: add visual desktop tasks with Crabbox MP4 recording, screenshot capture, and optional image-understanding assertions, and preserve video artifacts in Mantis before/after reports. - QA/WhatsApp: add `pnpm openclaw qa whatsapp` for live DM canary and pairing-gate coverage using two pre-linked WhatsApp Web sessions from the QA credential pool. - CI/Crabbox: default owned AWS fallback to `standard` multi-region capacity with broker hints enabled, reserving `beast` for explicit CPU-bound maintainer lanes. - Plugins/install: run managed npm-root install, rollback, repair, and uninstall mutations with legacy peer resolution so removing one plugin cannot rehydrate a stale registry `openclaw` package into the shared root. Thanks @vincentkoc. - Plugin SDK: add `openclaw/plugin-sdk/channel-message` lifecycle helpers for `defineChannelMessageAdapter`, `deliverInboundReplyWithMessageSendContext`, send/receive/live/state contracts, durable final-delivery capability derivation, capability proof helpers, and normalized message receipts. - Plugin SDK: add `createChannelMessageAdapterFromOutbound` so channel plugins can derive durable message adapters from proven outbound adapters without duplicating send/receipt bridge code. - Plugin SDK: add `actions.prepareSendPayload(...)` so channel plugins can shape message-tool sends into durable payloads while core owns queueing, hooks, retry, recovery, and acknowledgements. - Plugin SDK: make the legacy `channel-reply-pipeline` subpath a compatibility wrapper over the shared reply core while steering root compat deprecations toward `plugin-sdk/channel-message`. - Plugin SDK: move Discord, Slack, Mattermost, and Matrix live-preview finalization onto `plugin-sdk/channel-message` and attach message receipts to Telegram finalized previews plus Teams native stream finals, so preview edits and stream finals are represented in the message lifecycle instead of draft-only helpers. - Telegram: persist the polling restart watermark after successful update dispatch instead of at handler entry, leaving failed updates retryable while still coalescing completed offsets safely. - Plugin SDK/fs-safe: expose reusable atomic replacement, sibling-temp writes, and cross-device move fallback helpers through `plugin-sdk/security-runtime`, and move OpenClaw's duplicated safe filesystem write paths onto the shared `@openclaw/fs-safe` package. - Plugin SDK/fs-safe: route browser, media, channel, and QA external output producers through staged fs-safe writes before final publication. (#78768) - Plugin SDK/fs-safe: rename the public temp workspace helpers to `tempWorkspace`, `withTempWorkspace`, `tempWorkspaceSync`, and `withTempWorkspaceSync`, matching the cleaner `@openclaw/fs-safe` API before the package is published. - Core/performance: trim reply payload routing, heartbeat filtering, tool display, core tool assembly, channel directory, task status, and Slack approval formatting helper chains with direct bounded scans. Thanks @vincentkoc. - Control UI/performance: keep chat, config, and channel refreshes responsive by decoupling slow history/schema/status work, reducing the client history window, and logging over-budget chat/config renders. Refs #77060, #45698, #47979, #44107. Thanks @BunsDev. - QA/Mantis: reuse Crabbox desktop/browser capture tooling and pnpm store caches during Slack desktop smoke runs, reducing per-scenario setup work before screenshots and videos are captured. - QA/Mantis: add Slack desktop hydrate modes and per-phase timing reports so warm prehydrated VNC leases can skip source install/build while cold runs still prove the full source checkout. - QA/Mantis: pass the runtime env through desktop-browser Crabbox and artifact-copy child commands, so embedded Mantis callers can provide Crabbox credentials without mutating the parent process. Thanks @vincentkoc. - QA/Mantis: return the copied Slack desktop screenshot path even when remote Slack QA fails, so the CLI still prints the failure screenshot artifact. Thanks @vincentkoc. - QA/Mantis: accept Blacksmith Testbox `tbx_...` lease ids from desktop smoke warmup, so provider overrides do not fail before inspect/run. Thanks @vincentkoc. - Plugins/SDK: add bounded `before_agent_finalize` retry instructions so workflow plugins can request one more model pass. Thanks @100yenadmin. - Plugin SDK: add plugin-owned `SessionEntry` slot projection and scoped trusted-policy session extension reads. (#75609; replaces part of #73384/#74483) Thanks @100yenadmin. - Plugin SDK/Gateway: add scoped `plugins.sessionAction` dispatch and plugin-attributed `emitAgentEvent` support so plugins can expose typed session actions and workflow events to trusted clients. (#75578; replaces part of #73384/#74483) Thanks @100yenadmin. - Plugins/SDK: expose host-derived tool target paths to `before_tool_call` and trusted policy hooks so workflow plugins can reason about known file targets without reparsing tool envelopes. (#75605) Thanks @100yenadmin. - Control UI/WebChat: show a persistent compact context usage indicator from fresh session token data before the high-pressure warning state, while keeping the existing compaction prompt threshold. Fixes #46398; refs #45048, #50071, and #73744. Thanks @walterwkchoy, @AxelrodAI, @Brissux, @vincentkoc, and @BunsDev. - Contributor PRs: require external pull requests to include after-fix real behavior proof from a real OpenClaw setup, with terminal screenshots, console output, redacted runtime logs, linked artifacts, and copied live output treated as valid evidence while unit tests, mocks, lint, typechecks, snapshots, and CI remain supplemental only. - Plugins/catalog: add an `@tencent-weixin/openclaw-weixin` external entry pinned to `2.4.1` so onboarding and `openclaw channels add` can install the Tencent Weixin (personal WeChat) channel by default. (#77269) Thanks @pumpkinxing1. - Developer tooling: add checked-in VS Code Gateway debugging configs and an opt-in `OUTPUT_SOURCE_MAPS=1` source-map build path for breakpoints in TypeScript source. (#45710) Thanks @SwissArmyBud. - Managed proxy: add `proxy.loopbackMode` for Gateway loopback control-plane traffic, allowing operators to keep the default Gateway loopback bypass, force loopback Gateway traffic through the proxy, or block it. (#77018) Thanks @jesse-merhi. - Telegram/native commands: show the current thinking level above the `/think` level picker so users can see the active setting before changing it. (#78278) Thanks @obviyus. - Plugins/hooks: add a `before_agent_run` pass/block gate that can stop a user prompt before model submission while preserving a redacted transcript entry for the user, and clarify that raw conversation hooks require `hooks.allowConversationAccess=true`. (#75035) Thanks @jesse-merhi. - Config/Nix: keep startup-derived plugin enablement, gateway auth tokens, control UI origins, and owner-display secrets runtime-only instead of rewriting `openclaw.json`; in Nix mode, config writers, mutating `openclaw update`, plugin lifecycle mutators, and doctor repair/token-generation now refuse with agent-first nix-openclaw guidance. (#78047) Thanks @joshp123. - Plugin SDK: add a generic `api.runtime.llm.complete` host completion helper with runtime-derived caller attribution, config-gated model/agent overrides, session-bound context-engine access, request-scoped config, audit metadata, and normalized usage attribution. (#64294) Thanks @DaevMithran. - Control UI/exec approvals: highlight parsed shell command fragments that may deserve extra review in approval prompts. (#77153) Thanks @jesse-merhi. - Channels/iMessage: honor `channels.imessage.groups..systemPrompt` (and the `groups["*"]` wildcard) by forwarding it as `GroupSystemPrompt` on inbound group turns, mirroring the byte-identical resolver semantic from WhatsApp where defining the key as an empty string on a specific group suppresses the wildcard fallback. Brings iMessage to parity with the per-group `systemPrompt` pattern already supported by Discord, Telegram, IRC, Slack, GoogleChat, and the retired BlueBubbles channel. Fixes #78285. (#79383) Thanks @omarshahine. - iMessage: add opt-in inbound catchup that replays messages received while the gateway was offline (crash, restart, mac sleep) on next startup. Enable with `channels.imessage.catchup.enabled: true`; tunables for `maxAgeMinutes`, `perRunLimit`, `firstRunLookbackMinutes`, and `maxFailureRetries`. Persists a per-account cursor under the OpenClaw state dir (`/imessage/catchup/`), replays each row through the live dispatch path so allowlists/group policy/dedupe behave identically on replayed and live messages, and force-advances past wedged guids after `maxFailureRetries` to prevent stuck cursors. Extends the persisted echo-cache retention window so the agent's own outbound rows from before a gap are not re-fed as inbound on replay. Includes a regenerated `src/config/bundled-channel-config-metadata.generated.ts` so the runtime AJV schema accepts the new `channels.imessage.catchup` block. Fixes #78649. (#79387) Thanks @omarshahine. - Channels/Yuanbao: bump the bundled `openclaw-plugin-yuanbao` npm spec from `2.11.0` to `2.13.0` in the official external channel catalog and refresh the pinned integrity hash, so fresh installs and catalog-driven reinstalls pick up the newer Yuanbao channel plugin release. (#79620) Thanks @loongfay. - Gateway/OpenAI-compatible Chat Completions: support function `tools`, `tool_choice`, `tool_calls`, and `role: "tool"` follow-up turns while keeping tool-call stream finalization aligned with the command result and reporting client-tool name conflicts as invalid requests. (#66278) Thanks @Lellansin. - Providers/Mistral: add `mistral-medium-3-5` to the bundled catalog with reasoning support. Thanks @sliekens. - Docs/Mistral: document Medium 3.5 setup, local infer smoke usage, adjustable reasoning, and the Mistral HTTP 400 caveat for `reasoning_effort="high"` with `temperature: 0`. ### Breaking - Channels/iMessage: remove the bundled BlueBubbles channel surface and deprecate BlueBubbles-backed iMessage setup in OpenClaw. Existing `channels.bluebubbles` configs must migrate to `channels.imessage` using `imsg` on a signed-in Mac or an SSH wrapper, and non-macOS default `imsg` configs now report remote-Mac wrapper guidance. - Proxy: replace OpenClaw managed HTTP/WebSocket/fetch interception internals with Proxyline while preserving Gateway loopback routing policy. (#79857) Thanks @jesse-merhi. ### Fixes - Agents: honor `OPENCLAW_WORKSPACE_DIR` when resolving the default agent workspace, preserving explicit config precedence while keeping env-backed deployments out of the system prompt fallback path. Fixes #66786. - Doctor/Codex: stop warning that the message tool is unavailable for source-reply paths where OpenClaw grants `message` at runtime, keeping update and doctor output aligned with the OpenAI happy path. Thanks @pashpashpash. - Channels/Weixin: bump the external Weixin catalog entry to `@tencent-weixin/openclaw-weixin@2.4.3` with the matching package integrity. (#81730) Thanks @scotthuang. - Agents/subagents: apply `agents.defaults.subagents.model` before target agent primary models during `sessions_spawn`, so model-scoped runtimes such as `claude-cli` stay attached to default child runs. Fixes #81395. (#81783) Thanks @joshavant. - Telegram: keep Bot API polling alive during main event-loop stalls by moving ingress to an isolated worker with a durable local spool. Fixes #81132. (#81746) Thanks @joshavant. - Telegram: preserve rendered HTML formatting through lazy cron announce delivery so Markdown links stay clickable instead of falling back to literal anchor tags. Fixes #81742. (#81758) - Telegram: skip unmentioned group media before download when `requireMention` is active, avoiding failed media-download replies for messages that should be ignored. Fixes #81181. (#81785) Thanks @joshavant. - CLI/plugins: keep bare plugin and parent-command help on the lightweight path, avoiding plugin registry discovery before rendering help. - Gateway/session history: carry monotonic transcript message sequence through live updates and refresh SSE history when stale sequence input would otherwise append bad incremental state. (#81474) Thanks @samzong. - Security/sandbox: include Windows `USERPROFILE` in the sandbox blocked home roots so credential-bearing binds (such as `.codex`, `.openclaw`, or `.ssh` under the Windows user profile) are denied even when `HOME` points at a different shell home. (#63074) Thanks @luoyanglang. - Models config/auth: stop inferring provider env-var markers from broad `^[A-Z_][A-Z0-9_]*$` strings, and resolve config-backed provider `apiKey` values only through structured env SecretRefs (`secrets.providers[id]` / `secrets.defaults`), so unrelated env vars cannot accidentally become provider credentials. Thanks @sallyom. - Media fetch: skip allocating and buffering the response body for bodyless media responses (HEAD probes and 204-style empty bodies), avoiding wasted heap on streams that carry no payload. Thanks @shakkernerd. - CLI/onboarding: forward provider-specific auth flags (e.g. `--openai-api-key`) through the onboarding wizard so they reach provider auth methods via `ctx.opts`, letting `--openai-api-key "$OPENAI_API_KEY"` skip the redundant "use existing env var?" prompt in non-interactive harnesses. (#81669) Thanks @sjf. - CLI/migrate: drop trailing periods from Codex migrate item messages and `REASON_CODE_MESSAGES` strings so plan/result rows read as labels instead of sentence fragments. (#81705) Thanks @sjf. - Slack: treat malformed private-file redirect `Location` headers as unfollowable redirects instead of failing Slack media downloads. - Plugins: discover provider plugins from `setup.providers[].envVars` credentials during provider discovery while keeping the deprecated `providerAuthEnvVars` fallback. (#81542) Thanks @JARVIS-Glasses. - Docs/Codex harness: clarify that per-agent `CODEX_HOME` isolates `~/.codex` while inherited `HOME` intentionally keeps `.agents` discovery and subprocess user-home state available. - Auth: reclaim dead-owner stale file locks before retrying locked writes, so crashed OAuth refreshes no longer wedge `auth-profiles.json` until manual cleanup. - CLI tables: preserve muted/color styling on wrapped continuation lines after multiline cells, keeping `openclaw plugins list` descriptions readable. - Process execution: collapse case-insensitive duplicate child environment keys on Windows so caller-provided overrides such as `PATH` cannot be shadowed by host `Path`. - Gateway/diagnostics: suppress cold-start liveness warnings during the startup grace window while still sampling liveness metrics. Fixes #79915. (#81699) Thanks @joshavant. - Codex harness: keep `oauthRef`-backed Codex OAuth profiles usable and stop high-confidence app-server OAuth refresh invalidation from retry-spamming raw token-refresh errors without turning entitlement or usage-limit payloads into re-auth prompts. - Browser CLI: request the existing `operator.admin` gateway scope explicitly for browser control commands, avoiding unnecessary scope-upgrade approval loops. Fixes #81555. (#81716) Thanks @joshavant. - Plugin SDK: restore the deprecated `openclaw/plugin-sdk/memory-core` package subpath as an alias of `memory-host-core`, so published memory companion plugins that still import it resolve on current hosts. - Control UI/i18n: use the installed workspace pi runtime for locale refreshes, update the fallback package pin, prefer the Anthropic CI provider when available, and skip invalid provider credentials instead of failing main. - Codex harness: classify native app-server token-refresh logout and relogin failures as authentication refresh errors, so users get re-authentication guidance instead of a raw runtime failure. - Codex startup: treat selectable configured OpenAI agent models as Codex runtime requirements during plugin auto-enable, startup planning, and doctor install repair, so Anthropic-primary configs can still switch to OpenAI/Codex cleanly. - Agents: preserve source-reply delivery metadata when merging tool-returned media into the final reply, keeping message-tool-only replies deliverable and mirrored. Thanks @pashpashpash and @vincentkoc. - Replies: treat rich presentation, interactive controls, and channel-native payload data as outbound content across follow-up, heartbeat, cron, ACP, and block-streaming delivery paths, preventing card/button-only replies from being dropped as empty. - WebChat/TUI: route Codex `tools.message` source replies to the active internal UI turn and mirror them to session history, so message-tool-only harness replies, including rich presentation and button-only replies, no longer disappear while WebChat and TUI remain non-targetable outbound channels. (#81586) Thanks @pashpashpash. - Replies: deliver rich-only block replies even when block-streaming coalescing is enabled, keeping card and button payloads from being dropped by the text coalescer. Thanks @pashpashpash. - macOS/companion: require system TLS trust before pinning a first-use direct `wss://` gateway certificate and honor `gateway.remote.tlsFingerprint` as the explicit pin for remote node-mode sessions, so fresh endpoints fail closed when macOS cannot trust the certificate unless configured out of band. Fixes #50642. Thanks @BunsDev. - Update: snapshot config before update-time repair and restart writes, preserve plugin install records through doctor cleanup, and keep update-time config size drops from blocking the update while pointing users to the pre-update backup. Fixes #80077. (#80257) Thanks @Jerry-Xin and @vincentkoc. - Sessions/status: classify ACP spawn-child sessions as `kind: "spawn-child"` instead of `"direct"` in `openclaw sessions` and status output; extract the duplicated session-kind classifier into a shared helper (`src/sessions/classify-session-kind.ts`) so both surfaces stay in sync. Fixes catalog #19. (#79544) - Sessions/Gateway: report `agentRuntime.id: "acpx"` (or stored backend id) with `source: "session-key"` for ACP control-plane session rows in `openclaw sessions --json`, `openclaw status`, and Gateway session RPC responses instead of the incorrect `"auto"` / `"pi"` implicit fallback. Fixes catalog #18. (#79550) - Telegram: delete tool-progress-only draft bubbles before rotating to the real answer, preventing orphaned progress messages in streamed replies. - Codex app-server: keep per-agent `CODEX_HOME` isolation without rewriting `HOME` by default, so Codex-run subprocesses can still find normal user-home config, tokens, and CLI state unless the launch explicitly overrides `HOME`. Thanks @pashpashpash. - iMessage: stop sending visible `` placeholder text for media-only native image sends while preserving the internal echo key that prevents self-echo duplicate replies. (#81209) Thanks @homer-byte. - Agents/sessions: create configured agent main sessions before first `sessions_send` or gateway send, so agent-to-agent messages no longer fail when the target agent has not started yet. - Google models: honor configured `reasoning: false` when resolving thinking policy, preventing non-thinking Google/Gemma models from advertising `thinking=medium`. Fixes #81424. - gateway: pass Talk session scope to resolver [AI]. (#81379) Thanks @pgondhi987. - Gateway protocol: require v4 clients and stream explicit chat `deltaText`/`replace` frames so SDK clients can consume assistant updates without local diffing. (#80725) Thanks @samzong. - GitHub Copilot: exchange OAuth tokens for Copilot API tokens on image understanding requests and route Gemini image payloads through Chat Completions, fixing Copilot Gemini image descriptions. (#80393, #80442) Thanks @afunnyhy. - Gateway: hide pending Node pairing commands, capabilities, and permissions until approval, and refresh the live approved surface when pairings change. (#80741) Thanks @samzong. - Plugins/Feishu/WhatsApp/Line: enforce inbound media size caps while reading download streams, avoiding full buffering of oversized attachments. (#81044, #81050) Thanks @samzong. - Plugins/install: limit install-time code safety scans to plugin-owned runtime entrypoints while keeping dependency manifest denylist checks, so trusted packages with large dependency trees no longer get blocked or warned on third-party runtime internals. - Config: serialize and retry semantic config mutations centrally, so concurrent commands can rebase safe changes instead of clobbering or hand-rolling command-local retry loops. (#76601) - Installer: honor `--no-git-update` for existing git checkouts before resolving release refs, preventing pinned source installs from moving during reinstall. - Plugins/install: refresh OpenClaw-managed peer dependency pins when installed plugin peer ranges change, while preserving user-owned dependency pins. - Require approval for setup-code device pairing [AI]. (#81292) Thanks @pgondhi987. - Plugins/install: preserve third-party peer dependencies in the managed npm root when later plugin installs or updates recalculate the shared dependency tree. Thanks @shakkernerd. - Plugins/memory: prefer the npm-installed memory-lancedb plugin over the bundled fallback during duplicate resolution, keeping Active Memory's `memory_recall` tool visible after managed installs. Fixes #81193. Thanks @julio-arcila. - Plugins/uninstall: prune managed third-party peer dependencies after their owning npm plugin is removed, without blocking plugin cleanup on peer-prune failures. - Docker: pin setup-time container paths so stale host `.env` OpenClaw paths cannot leak into Linux containers. Fixes #80381. (#81105) Thanks @brokemac79. - Channels/WeCom: refresh the official onboarding install to `@wecom/wecom-openclaw-plugin@2026.5.7` and update existing managed npm installs instead of failing on the package directory. Fixes #79884. (#80390) Thanks @brokemac79. - Anthropic: reseed Claude CLI fresh-session retries from bounded OpenClaw transcript history after session rotation, preventing conversation amnesia. Fixes #80905. (#80934) Thanks @bitloi. - Require explicit browser device pairing [AI]. (#81289) Thanks @pgondhi987. - Require Control UI pairing before proxy-scoped access [AI]. (#81288) Thanks @pgondhi987. - Installer: honor `--version` for git installs and install from the checked-in lockfile, preventing recent dependency pins from tripping pnpm's minimum-release-age gate during tag installs. - Agents: deliver same-process subagent completion handoffs through the in-process agent dispatcher instead of opening a Gateway RPC loopback. - Harden trusted-proxy source validation [AI]. (#81290) Thanks @pgondhi987. - Agents: add permissive item schemas to array tool parameters before provider submission, preventing OpenAI-compatible schema validation from rejecting plugin tools that omit `items`. Fixes #81175. (#81217) Thanks @JARVIS-Glasses. - Agents: escalate LLM idle watchdog timeouts through profile rotation and configured model fallback instead of leaving agent turns stuck after a silent model stream. Fixes #76877. (#80449) Thanks @jimdawdy-hub. - Discord voice: treat OpenAI Realtime startup auth failures as fatal, suppress duplicate realtime error logs, and stop autoJoin from retrying the same broken voice channel until credentials are fixed. - ACPX: stop forwarding unsupported timeout config options to Claude ACP while preserving OpenClaw's own turn timeout. (#80812) Thanks @sxxtony. - Session transcripts: redact sensitive message content in the centralized JSONL append path so CLI turns, gateway transcript injection, transcript mirrors, and guarded tool results use the same configured redaction behavior. Fixes #73565. Refs #73563. (#79645) Thanks @Ziy1-Tan. - Channels/iMessage: ignore Apple link-preview plugin payload attachments when users paste URLs, keeping the URL text while avoiding phantom media context. (#79374) Thanks @homer-byte. - Telegram: detect polling stalls from `getUpdates` liveness only, so outbound API calls no longer mask dead inbound polling; log polling-cycle starts after transport rebuilds. Fixes #78473. - fix: scan plugin runtime entries during install [AI]. (#80998) Thanks @pgondhi987. - fix(plugins): scan installed dependency runtime code [AI]. (#81066) Thanks @pgondhi987. - Inherit tool restrictions for delegated sessions [AI]. (#80979) Thanks @pgondhi987. - Telegram: discard legacy long-poll update offsets that cannot be tied to the current bot token, so token rotation no longer leaves bots silently skipping new messages. (#80671) Thanks @sxxtony. - browser: enforce navigation checks for act interactions [AI]. (#81070) Thanks @pgondhi987. - Validate node exec event provenance [AI]. (#81071) Thanks @pgondhi987. - Gateway: keep active reply runs visible to stuck-session diagnostics and clear no-active-work recovery state, preventing stale queued lanes after compaction or tool failures. Fixes #80677. (#81302) - Codex app-server: rotate incompatible context-engine-managed native threads so Lossless-managed sessions do not resume stale hidden Codex history. (#81223) Thanks @jalehman. - Codex cron: execute scheduled command-style automation payloads before workspace bootstrap or memory review, preserving existing isolated cron jobs after Codex harness migration. (#81510) Thanks @jalehman. - Plugin LLM completions: honor Codex agent-runtime policy for canonical OpenAI model refs, so context-engine summarizers can use Codex OAuth instead of requiring direct `OPENAI_API_KEY` auth. (#81511) Thanks @jalehman. - Gateway/OpenAI HTTP: return OpenAI-compatible 400 errors for invalid sampling params and provider validation failures instead of collapsing them to 500s. (#81275) Thanks @Lellansin. - Telegram: publish plugin and skill command description localizations to native command menus while filtering unsupported locale codes and preserving Telegram command limits. (#81351) Thanks @jzakirov. - Limit hook CLI tool authority [AI]. (#81065) Thanks @pgondhi987. - Require admin scope for node device token management [AI]. (#81067) Thanks @pgondhi987. - Restrict chat sender allowlist matching [AI]. (#80898) Thanks @pgondhi987. - Update: suppress the false newer-config warning during restart health probing after an update handoff, while keeping future-version mutation guards intact. (#78652) - Bundled MCP: inline local `$ref` parameter schemas before exposing tools, so Notion-style `oneOf` inputs validate through the bridge. Fixes #78737. - Sessions: redact persisted tool result detail metadata before writing transcripts so diagnostic secrets do not survive tool output redaction. (#80444) Thanks @nimbleenigma. - Codex runtime: allow the official installed `@openclaw/codex` package to use its private task-runtime and MCP projection SDK helpers, fixing `MODULE_NOT_FOUND` during migrated OpenAI/Codex beta runs. - Codex migration: make Enter activate the highlighted checkbox row before continuing, so `Skip for now` and bulk-selection rows work even when planned items start preselected. - Codex harness: keep auth-profile-backed media tools such as `image_generate` available when OpenAI auth lives in the agent's auth-profile store instead of environment variables. - WhatsApp/install: allow Baileys' pinned libsignal git subdependency under pnpm 11 so source installs and local checks can complete. - Require auth for sandbox browser CDP relay [AI]. (#81002) Thanks @pgondhi987. - fix: detect carried exec command forms [AI]. (#81000) Thanks @pgondhi987. - Reject truncated exec approval commands [AI]. (#81001) Thanks @pgondhi987. - Enforce inline shell wrapper payload matching [AI]. (#80978) Thanks @pgondhi987. - fix(node-pairing): replace changed pending requests [AI]. (#80894) Thanks @pgondhi987. - Rate limit Google Chat webhook requests [AI]. (#80974) Thanks @pgondhi987. - Docker: mount the auth-profile secret key directory so OAuth-backed auth profiles survive container rebuilds. (#80991) - Onboarding: accept Codex auth profiles for canonical OpenAI model checks, avoiding false missing-auth warnings. (#80913) Thanks @rubencu. - fix(feishu): normalize webhook rate-limit client keys [AI]. (#80975) Thanks @pgondhi987. - fix(auth): prevent bootstrap pairing scope changes [AI]. (#80976) Thanks @pgondhi987. - Validate Control UI loopback retry endpoints [AI]. (#80900) Thanks @pgondhi987. - Harden exported markdown link rendering [AI]. (#80902) Thanks @pgondhi987. - fix(gateway): honor minimal discovery mode for wide-area DNS-SD [AI]. (#80903) Thanks @pgondhi987. - slack: enforce reaction notification policy [AI]. (#80907) Thanks @pgondhi987. - Enforce gateway command scopes by caller context [AI]. (#80891) Thanks @pgondhi987. - Telegram/groups: in single-account setups, treat an explicit empty `accounts..groups: {}` map the same as undefined so the root `channels.telegram.groups` allowlist still applies, instead of silently dropping every group update under the default `groupPolicy: "allowlist"`. Multi-account semantics are unchanged so per-account explicit-empty groups still scope-disable a single account without affecting siblings; the explicit way to block all groups for any account remains `groupPolicy: "disabled"`. Fixes #79427. (#81030) Thanks @kinjitakabe. - Codex (app-server): project user-configured `mcp.servers` into new Codex thread configs, matching the codex-cli runtime's existing `-c mcp_servers=...` behavior so app-server-runtime agents see the same user MCP servers the CLI runtime already exposes. Plugin-curated apps remain attached via the separate `apps` config patch. Fixes #80814. Thanks @kinjitakabe. - Enforce Slack plugin approval button authorization [AI]. (#80899) Thanks @pgondhi987. - Recognize PowerShell -ec inline commands [AI]. (#80893) Thanks @pgondhi987. - fix(qqbot): authorize approval button callbacks [AI]. (#80892) Thanks @pgondhi987. - Telegram: render supported HTML tags in streamed and durable replies instead of showing literal markup. (#80977) - Scrub streamable MCP redirect headers [AI]. (#80906) Thanks @pgondhi987. - fix(memory-wiki): require admin scope for ingest [AI]. (#80897) Thanks @pgondhi987. - memory-wiki: require write scope for Obsidian search [AI]. (#80904) Thanks @pgondhi987. - WhatsApp: externalize the channel as a ClawHub/npm plugin outside the core npm runtime bundle, and bump Baileys to `7.0.0-rc11` so libsignal resolves from the registry instead of a GitHub tarball. - WhatsApp: keep optional audio decoding dependencies local to the external plugin so the core npm install no longer pulls WhatsApp-only media helpers. - Build: skip copied metadata for bundled plugins that are excluded from build entries, preventing update/status rebuilds from advertising missing QQ Bot runtime files. (#80925) - Control UI/sessions: nest subagent sessions under their parent session in the session picker dropdown using a visual `└─ ` prefix, making the parent-child relationship clear. Fixes #77628. (#78623) Thanks @chinar-amrutkar. - Auto-reply: surface a visible error when the configured model backend fails and fallback produces no visible reply, while preserving intentional silent turns and side-effect-only deliveries. (#80917) Thanks @dutifulbob. - Agents/exec: skip redundant heartbeat wake-ups for subagent session exec completions, preventing spurious LLM invocations on parent sessions. Fixes #66748. (#66749) Thanks @ggzeng. - Provider streams: keep OpenAI-compatible SSE and JSON fallback streams draining across split chunks and fail Azure Responses streams with a bounded first-event diagnostic instead of stalling. Refs #80926. (#80927) Thanks @galiniliev and @CaptainTimon. - Agents: rewrite generic provider internal errors with support request IDs into user-friendly transient error copy. (#49401) Thanks @y471823206. - WhatsApp: finish handling pending debounced inbound messages before closing the socket. (#81246) Thanks @mcaxtr. - CLI/commitments: write `--json` output to stdout instead of diagnostic logs so automation can parse commitment list and dismiss results. (#81215) Thanks @giodl73-repo. - Update: allow pnpm GitHub-source OpenClaw updates to approve the OpenClaw package build, so source installs complete their prepare/prepack lifecycle. (#81294) Thanks @fuller-stack-dev. - Telegram: preserve supported HTML tags in visible replies and durable mirrors so formatted messages render correctly instead of degrading to escaped text. (#80977) Thanks @obviyus. - Plugins/runtime: attribute deprecated runtime config load/write warnings to the plugin id and source that triggered them so logs and plugin doctor runs are actionable. Refs #81394. (#81425) Thanks @BKF-Gitty. - Agents/cron: honor a cron payload's explicit `timeoutSeconds` for the LLM idle watchdog even when it numerically equals `agents.defaults.timeoutSeconds`, preserving explicit per-run timeout intent and preventing stalled streaming replies from being cut to the implicit 120s cap. (#79426) Thanks @legolaz8451. - Codex app-server: keep the short post-tool completion watchdog armed across dynamic tool completion bookkeeping so embedded Codex runs fail fast and release their session lane when Codex goes quiet after a tool result. (#81697) Thanks @mbelinky. - Control UI/WebChat: wrap long inline code tokens inside chat bubbles instead of clipping them at the bubble edge. Fixes #81932. (#81931) Thanks @galiniliev. - CLI/media: render terminal QR codes with full-block characters by default so the bundled `qrcode` terminal renderer does not emit a pathologically dense ANSI final row in compact half-block mode that breaks scanning in some terminals. Fixes #77820. Thanks @KrasimirKralev. - Agents/compaction: read post-compaction AGENTS.md refresh context from the queued run workspace instead of the runner process cwd, so CLI-backed follow-up turns re-inject the correct workspace startup rules after compaction. Fixes #70541. (#75532) Thanks @vyctorbrzezowski. - Agents/read tool: treat positive offsets beyond EOF as empty ranges instead of surfacing the upstream read error, so stale pagination cursors no longer crash tool calls while unrelated read failures still fail loud. Fixes #62466. (#75536) Thanks @vyctorbrzezowski. - Google/Gemini: normalize retired Gemini 3 Pro Preview refs left in Google API-key onboarding model allowlists and fallbacks, so setup-emitted config keeps testing `google/gemini-3.1-pro-preview` instead of `google/gemini-3-pro-preview`. - Telegram/context: bound selected topic context to the active session so messages from before `/new` or `/reset` are not replayed into later turns. (#80848) Thanks @VACInc. - Docs/providers/openai: clarify that OpenAI Realtime voice goes through the OpenAI Platform Realtime API and requires Platform credits — Codex/ChatGPT subscription quota does not cover this route. Fixes #76498. Thanks @lonexreb. - Google/Gemini: normalize retired nested Gemini 3 Pro Preview ids when resolving exact configured proxy-provider refs, so `kilocode/google/gemini-3-pro-preview` resolves to `kilocode/google/gemini-3.1-pro-preview` for Gemini 3.1 testing. - CLI: strip generic OSC terminal escape payloads from sanitized output fields, preventing clipboard/title escape bodies from leaking into commitment tables and other terminal-safe text. Thanks @shakkernerd. - Codex app-server: match connector-backed plugin approval elicitations by stable connector id so enabled destructive actions no longer fall through to display-name-only rejection. - Build: replace selected build utility `tsx` preloads with Node native type stripping so Node 26 build paths no longer emit `DEP0205` module loader deprecation warnings. (#78584) Thanks @keshavbotagent. - Media generation: honor configured music and video generation timeouts when tool calls omit `timeoutMs`, matching image generation behavior. (#80687) - CLI/update/status: label beta-channel plugin fallback and model-pricing refresh failures as warnings, keeping mixed beta/latest plugin cohorts visible without making core update or Gateway reachability look failed. Fixes #80689. Thanks @BKF-Gitty. - Doctor/plugins: relink managed npm plugin `openclaw` peer dependencies during `doctor --fix`, while refusing to follow package-local `node_modules` symlinks outside the plugin package. (#77412) Thanks @TheCrazyLex. - iMessage: route inbound tapbacks as reaction system events instead of normal messages, defaulting to bot-authored-message notifications while allowing `reactionNotifications: "off" | "own" | "all"` overrides. Fixes #60274; refs #39031 and #39322. Thanks @hyperclaw. - Control UI/performance: scope Nodes polling to the active Nodes tab, debounce stale session-list reconciliation, and bound chat-side session refreshes so long-running dashboards avoid background reload churn. Thanks @BunsDev. - Plugins/channels: explain bundled channel entry files that reach the legacy plugin loader as setup-runtime loader mismatches instead of generic missing-register failures. Thanks @chinar-amrutkar. - Plugins/session-end: fire a typed `session_end` plugin hook with reason `shutdown` (or `restart` when a restart is expected) for every session that was still active when the gateway process stops. Previously SIGTERM/SIGINT/restart paths closed the gateway without enumerating active sessions, leaving downstream `session_end` plugins (e.g. claude-mem) with ghost rows accumulating across restarts. The new shutdown finalizer drains an in-memory tracker that is populated by `session_start` and forgotten by replace / reset / delete / compaction emitters, so previously-finalized sessions are never double-fired. The drain is bounded to a 2 s total budget so a slow plugin cannot block process exit. Adds `"shutdown"` and `"restart"` to `PluginHookSessionEndReason`. Fixes #57790. Thanks @pandadev66. - Codex app-server: clamp Codex code-mode sandboxing to workspace-write when an OpenClaw sandbox is active, preventing Docker gateway socket access from becoming a danger-full-access Codex turn. - TUI: exit immediately on Ctrl+C/SIGINT after gateway disconnect and bound shutdown drain so terminal teardown cannot strand sessions. Fixes #75379. (#75381) Thanks @udaymanish6. - Matrix: default outbound markdown tables to bullet lists instead of fenced code blocks. Fixes #78990. (#80890) Thanks @kinjitakabe. - Bonjour/Gateway: treat active ciao probing and fresh name-conflict renames as in-progress so the mDNS watchdog waits for probe settlement before retrying, preventing rapid re-advertise loops on Windows, WSL, and other multicast-hostile hosts. (#74778) Refs #74242. Thanks @fuller-stack-dev. - Providers/MiniMax: send a minimal Anthropic-compatible user fallback when message conversion filters a turn to an empty payload, so MiniMax M2.7 no longer returns `chat content is empty` after tool-heavy sessions. Fixes #74589. Thanks @neeravmakwana and @DerekEXS. - Tools/media: preserve implicit allow-all semantics from `tools.alsoAllow`-only policies when preconstructing built-in media generation and PDF tools, so configured media tools become live without forcing `tools.allow: ["*", ...]`. Fixes #77841. Thanks @trialanderrorstudios. - Codex/Telegram: separate code-mode tool progress from final replies, render bridged tool calls with native tool labels, and repair persisted missing tool results for safer follow-up turns. (#80663) Thanks @jalehman. - Memory/search: load the platform-specific `sqlite-vec--` variant directly when the meta `sqlite-vec` package is missing from a global install, so vector recall keeps working on `npm install -g openclaw@latest` upgrades where optionalDependencies left only the platform variant on disk. Fixes #77838. Thanks @corevibe555 and @Simon2256928. - Cron: keep long manual cron runs active in the task registry until completion, preventing transient `lost` markers before durable recovery reconciles. Fixes #78233. (#78243) Thanks @Feelw00. - Doctor/GitHub CLI: surface a `GH_CONFIG_DIR` hint when the GitHub skill is usable but `gh` auth lives under a different operator HOME than the agent process, without warning for disabled or filtered skills. Fixes #78063. (#78095) Thanks @tmimmanuel. - Gateway: dedupe concurrent `send`, `poll`, and `message.action` requests while delivery is still in flight, preventing duplicate outbound work for the same idempotency key. (#68341) Thanks @thesomewhatyou. - Cron: keep main-session `systemEvent` heartbeat wakes on their bound session route for both direct and queued wake paths by dropping inherited explicit heartbeat destinations when forcing `target: "last"`. Fixes #73900. Thanks @richardmqq. - Telegram: honor forced document delivery for video media so `--force-document` sends MP4s as documents instead of typed videos. Fixes #80389. (#80405) Thanks @jbetala7. - Gateway: clear speculative node wake state when APNs registration is missing, preventing unregistered or mistyped node IDs from retaining wake throttle entries. Fixes #68847. (#68848) Thanks @Feelw00. - Auto-reply: keep late follow-up queue drain finalizers from deleting a replacement queue registered after `/stop`, preventing immediate follow-up messages from being orphaned. Fixes #68838. (#68839) Thanks @Feelw00. - Feishu: make manual App ID/App Secret setup the default channel-binding path while keeping QR scan-to-create as an optional best-effort flow, and document the manual fallback for domestic Feishu mobile clients that do not react to the QR code. Fixes #80591. Thanks @wei-wei-zhao. - Memory: cap dreaming promotion writes to `MEMORY.md` by compacting oldest auto-promoted sections while preserving user-authored notes, keeping active memory below the bootstrap budget. Fixes #73691. (#74088) Thanks @YB0y. - Telegram: show resolved thinking defaults in native `/status` and `/think` menus while preserving explicit session overrides. (#80341) Thanks @VACInc. - Channels: cache selected channel registry lookups against the active fallback snapshot so pinned-empty registries refresh native command and alias routing after active registry swaps. (#80333) Thanks @samzong. - Codex app-server: reuse native Codex CLI OAuth for isolated app-server harness login, refresh, and app inventory cache keys so ChatGPT-authenticated Codex runs no longer fall back to unauthenticated OpenAI API calls. (#79877) Thanks @jeffjhunter. - Gateway: scope `sessions.resolve` sessionId and label store loads to the requested agent so large unrelated agent stores are not parsed for scoped lookups. Fixes #51264. (#79474) Thanks @samzong. - Gateway: share serialized streaming event envelopes across eligible WebSocket and node subscribers while preserving per-client sequence numbers. (#80299) Thanks @samzong. - Gateway: consolidate duplicate `openclaw doctor` service config panels while preserving the declined-repair `--force` hint. Fixes #80287. (#78688) Thanks @YB0y. - Browser: report Chrome MCP existing-session page readiness in browser status without letting status probes exceed the client timeout. Fixes #80268. (#80280) Thanks @ai-hpc. - WhatsApp: route opening-phase Baileys 428 connectionClosed through the WhatsApp reconnect policy and keep post-open 428 closes retryable, so transient setup socket closes retry with WhatsApp diagnostics instead of escaping as a bare `channel exited` error. Fixes #75736; mitigates #77443. Thanks @dataCenter430. - Agents: disable Pi's default filesystem resource discovery for embedded runs while keeping OpenClaw inline extension factories active, avoiding Windows event-loop stalls during first WhatsApp-triggered agent startup. Fixes #77443. Thanks @dataCenter430. - Providers/self-hosted: read model-scoped llama.cpp runtime context from `/props.default_generation_settings.n_ctx` while keeping top-level `n_ctx` as a fallback, so session budgeting reflects the loaded context window. Fixes #73664. (#74057) Thanks @brokemac79. - Memory: reject symlinked directory components in configured extra memory paths before reading Markdown files. (#80331) Thanks @samzong. - Sessions/transcripts: replace whole-file `readFile` scans with shared streaming helpers (`streamSessionTranscriptLines` and `streamSessionTranscriptLinesReverse`) for idempotency lookup, latest/tail assistant text reads, delivery-mirror dedupe, and compaction fork loading, so long-running sessions no longer materialize the full transcript in memory. Forward scans use `readline` over a bounded `createReadStream`; reverse scans read bounded chunks from the file end and decode complete JSONL lines newest-first without a fixed tail cap. Synthetic 200 MiB transcript: peak RSS delta drops from +252 MiB to +27 MiB while preserving malformed-line tolerance and idempotency-key return semantics. Fixes #54296. Thanks @jack-stormentswe. - Browser/CDP: filter browser-internal targets from raw CDP and persistent Playwright tab selection so navigation opens real page tabs. Fixes #55734. Thanks @Demine4. - WhatsApp: apply hot-reloaded `dmPolicy` and `allowFrom` settings to the active Web listener before processing new inbound DMs. Fixes #80538. Thanks @Ampaskopi129. - Plugins: let `openclaw doctor --fix` repair managed plugin installs whose package entrypoints fail package-directory boundary validation after local state moves. Fixes #80592. Thanks @wei-wei-zhao. - Voice-call: resume voice-originated exec approval follow-ups as internal non-delivery turns instead of rejecting them as `unknown channel: voice`. Fixes #80540. Thanks @patrickmch. - Control UI: preserve the composer draft when Stop is tapped during an active chat run, preventing accidental prompt loss on mobile. Fixes #80586. Thanks @KCALLC. - Infra/retry: keep jittered retry delays at or above server-supplied Retry-After lower bounds when the hint can be honored. Fixes #68541. (#68543) Thanks @Feelw00. - Docs: clarify that `/model provider/model` is an exact session route, while duplicate bare model ids only use configured fallback order on non-session override paths. Refs #80562. Thanks @gaodaabao. - Redact persisted secret-shaped payloads [AI]. (#79006) Thanks @pgondhi987. - Agents: label `.openclaw/sandboxes` exec workdirs as sandbox runs in compact tool summaries instead of showing the full path. - OpenAI Codex: surface browser OAuth and device-code login failures instead of treating failed logins as empty successful auth results. Refs #80363. - CLI agents: carry runtime-only current-turn sender/reply context into CLI model prompts while keeping prompt-build hook input and transcript text clean. - Control UI: keep workspace file presence checks from treating `fs-safe` stat helper failures as missing files, restoring Agents file status for existing Windows workspace files. Fixes #79953. Thanks @lovelefeng-glitch. - Microsoft Foundry: report an explicit error when the Azure subscription prompt returns an id that is not present in the enabled subscription list, instead of continuing from an unsafe subscription assertion. (#62742) Thanks @oliviareid-svg. - fix(matrix): gate name-based allowlist resolution [AI]. (#79007) Thanks @pgondhi987. - Slack: include the bot's own root/parent message in new thread sessions so in-thread replies reach the agent with the parent text the user is responding to, instead of only `reply_to_id` metadata. Fixes #79338. Thanks @sxxtony. - Docker: keep image builds on the source pnpm workspace policy so pnpm 11 can prune production dependencies without a Docker-only workspace rewrite. - Agents/compaction: restore info-level gateway logs for embedded compaction start, completion, and incomplete outcomes. (#71961) Thanks @rubencu. - Telegram: build reply-aware inbound turns through the shared channel context path so agents see the current reply target inline with the current message. - Telegram: recover legacy message cache files that mixed JSON-array and line-delimited entries so restarted gateways preserve reply-window context. (#80567) - Telegram: update the reply-context cache when messages are edited, so streamed bot replies appear in later agent context with their final text instead of the first draft. - Skills/Windows: normalize compacted skill prompt locations to forward slashes after home-prefix compaction so Windows skill paths remain readable by model file tools. (#52200) Thanks @chienchandler. - Control UI/Windows: update `@openclaw/fs-safe` so agent workspace file presence checks fall back correctly on Windows, preventing existing AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md, and MEMORY.md files from showing as missing. Fixes #79953. Thanks @lovelefeng-glitch. - Memory: skip managed dreaming cron reconciliation warnings for ordinary cron and heartbeat hook contexts that cannot manage Gateway cron. (#77027) Thanks @rubencu. - Cron: treat Codex app-server turn acceptance, CLI process spawn, and tool starts as execution milestones, preventing isolated runs from tripping the early startup watchdog after work has begun. - Codex app-server: treat current-turn `` raw markers as terminal so interrupted native-tool turns release Discord agent sessions instead of waiting for the outer timeout. - Yuanbao: bump `openclaw-plugin-yuanbao` to 2.13.1 to support `sourceReplyDeliveryMode: "automatic"` for group chat. (#79814) Thanks @loongfay. - Memory: keep `memory_search` result `corpus` labels aligned with the hit source, so session transcript hits surface as `sessions` and memory-file hits stay `memory`. Fixes #72885. (#71898, #72886) Thanks @rubencu. - Codex app-server: default native plugin app tool approvals to automatic so non-destructive read tools run when destructive actions are disabled. - Plugins: allow untracked local source plugins in the global extensions directory to load TypeScript package entries while keeping managed installs strict about compiled runtime output. Fixes #80503. Thanks @Kaspre. - Google/Gemini: normalize retired nested Gemini 3 Pro Preview ids while converting manifest catalog rows into emitted provider config, so `google/gemini-3.1-pro-preview` is used for testing instead of `google/gemini-3-pro-preview`. - Google/Gemini: normalize retired nested Gemini 3 Pro Preview ids inside saved model allowlists and fallback chains, so proxy routes like `openrouter/google/gemini-3-pro-preview` are persisted as Gemini 3.1 Pro Preview. - Google/Gemini: normalize retired nested Gemini 3 Pro Preview ids in configured proxy/provider-auth model catalogs, so regenerated config keeps testing `google/gemini-3.1-pro-preview` instead of `google/gemini-3-pro-preview`. - Google/Gemini: normalize retired nested Gemini 3 Pro Preview ids while onboarding provider catalog presets, so setup-emitted proxy configs test `google/gemini-3.1-pro-preview` instead of `google/gemini-3-pro-preview`. - Google/Gemini: normalize retired Gemini 3 Pro Preview ids in provider catalog rows during generic config writes, so unrelated config changes keep testing `google/gemini-3.1-pro-preview`. - Models: keep configured fallback chains ahead of configured primary models for override selections with duplicate model ids, preventing fallback jumps to the wrong provider. Fixes #80562. - Native apps: advertise the Gateway protocol compatibility range so chat and node sessions can connect to v3 gateways after additive v4 client updates. - Gateway/agents: keep stale `sessions_send` ACP manager and `web_fetch` runtime chunks importable after package updates, preventing live gateways from breaking before restart. Fixes #78804. Thanks @Gomesy72. - Gateway/install: preserve service environment value-source metadata in `openclaw gateway install`, so systemd reinstall paths keep env-file-backed secrets out of inline unit metadata. Refs #77406, #77427. Thanks @stainlu and @brokemac79. - Auto-reply/reset: include inbound sender context in bare `/new` and `/reset` model prompts while keeping startup instructions out of transcript prompts, so agents see sender identity on the first reset turn. Fixes #77360. Thanks @srb11e. - Gateway: avoid synchronous restart-sentinel state probes during post-attach startup, preventing slow Windows or redirected state directories from blocking channel turns. Fixes #79264. Thanks @liyi58. - Agents/auth: update successful model auth profile status with one locked store write, reducing post-model reply latency from duplicate `auth-profiles.json` saves. Thanks @mcaxtr. - Agents/image: honor explicit `image` tool model overrides even when `agents.defaults.imageModel` is unset, restoring one-off vision calls for configured multimodal providers. Fixes #79341. Thanks @haumanto. - Doctor/update: leave live systemd gateway units unchanged during noninteractive update-mode service repair, so update-time doctor does not silently overwrite operator-owned unit directives. Refs #80462. - Update: accept optional leading `v` prefixes when verifying exact npm package install targets, so `openclaw update --tag v2026...` does not roll back after installing the matching bare package version. Refs #74069; #80480. Thanks @Kaspre. - Doctor: treat missing plugin ids in `plugins.deny` as stale config warnings instead of fatal validation errors, and remove them during stale plugin cleanup so update repair does not restore last-known-good config for deny-only stale plugin refs. Refs #77802. Thanks @Kaspre. - Codex app-server: preserve prompt-local current-turn context through context-engine prompt projection, so replied-to Telegram messages stay visible to the Codex model input. - Telegram: pass agent-scoped media roots through gateway message actions so workspace-local media from the active agent is not rejected as cross-agent access. Thanks @frankekn. - CLI/gateway: keep `gateway status --deep` plugin-aware so configured plugin manifest warnings, including missing channel config metadata, stay visible during install and update smoke checks. - Doctor/status: clarify gateway token source conflict warnings and suppress them inside the managed Gateway service credential context. - Feishu: accept Schema 2 card callbacks whose operator identity is nested under `operator.user_id`, so card buttons dispatch instead of being dropped as malformed. Fixes #71670. (#71787) Thanks @rubencu. - Feishu: fall back to a top-level group send when normal group quoted replies target a withdrawn or missing message, preventing replies from disappearing silently while preserving native topic safety. Fixes #79349. Thanks @arlen8411. - Doctor: stop flagging the live compatibility agent directory as orphaned when the configured default agent is not `main`. Fixes #74313. (#74438) Thanks @carlos4s. - Auth/Claude CLI: persist fresher managed external CLI OAuth credentials back to `auth-profiles.json`, preventing stale `anthropic:claude-cli` profiles from repeatedly bootstrapping and flooding debug logs. Fixes #80129. Thanks @Caulderein. - Context: render `/context map` only from actual run context and persist Codex app-server run reports without counting deferred tool-search schemas as prompt-loaded tool schemas. - Codex app-server: report Codex-native tool execution to diagnostics so long-running native `bash`, web, file, and MCP tools no longer look like stale embedded runs to the watchdog. (#80217) - Codex app-server: refresh Codex account rate limits after subscription usage-limit failures so Discord and other channel replies can show the next reset time instead of saying Codex returned none. Thanks @pashpashpash. - Agents/auth: let Codex-backed OpenAI agent turns use `auth.order.openai` entries for Codex-compatible OAuth and API-key profiles while keeping existing `openai-codex` profile ordering valid. - Codex app-server: emit async `after_tool_call` observations for native tool completions not covered by the native hook relay so observability plugins can record Codex-native tools. (#80372) Thanks @VACInc. - Tasks: route group and channel task completions through the requester session so the parent agent can send the visible summary instead of stopping at a generic task-status line. Fixes #77251. (#77365) Thanks @funmerlin. - Telegram: preserve blank lines between manually indented bullet blocks and following numbered sections in rendered replies. Fixes #76998. Thanks @evgyur. - Agents/sandbox: allow read-only sandbox sessions to read the `/agent` workspace mount while keeping write/edit/apply_patch workspace-only guarded, restoring `read /agent/...` for `workspaceAccess: "ro"`. Fixes #39497. Thanks @stainlu and @teosborne. - Slack: pass configured agent identity through draft preview sends so partial streaming replies keep custom username/avatar on the initial Slack message. Fixes #38235. (#38237) Thanks @lacymorrow. - Slack: support `allowBots: "mentions"` for bot-authored messages that mention the receiving bot, matching the documented Discord-style mode without accepting every bot message. Fixes #43587. (#43588) Thanks @raw34. - Slack: refresh private file URLs with `files.info` when inbound DM file events omit or stale attachment URLs, preventing file attachments from being dropped before media hydration. Fixes #50129. (#50200) Thanks @smartchainark. - Slack: add scoped message-tool formatting hints so agents use Markdown for plain sends and direct mrkdwn for Block Kit fields. Fixes #34609. (#50979) Thanks @carrotRakko. - Slack: describe `download-file` file ids separately from message timestamps and return a targeted recovery error when agents pass `messageId` instead of `fileId`. (#74155) Thanks @jarvis-ai-gregmoser. - Slack: retain processed room messages for `requireMention=false` channels so always-on Slack rooms keep recent conversation context between turns. (#38658) Thanks @syedamaann. - Slack: compile interactive reply directives for direct outbound sends without bypassing the `interactiveReplies` capability gate, preserving Block Kit for Slack CLI and cron deliveries. (#78220) Thanks @kazamak. - Slack: keep DM last-route updates scoped to the active non-main DM session, including threaded DM turns, so isolated Slack DM sessions do not overwrite the shared main route. (#73085) Thanks @clawSean. - Slack/ACP: route Slack channel and DM messages through configured ACP bindings when no runtime binding exists, keeping bound thread replies pinned to the persistent ACP session and dropping unavailable configured targets instead of falling back to `main`. (#73101) Thanks @Raasl. - Slack: mark unresolved thread replies as ambiguous and skip them instead of treating them as root channel messages, keeping thread continuation on the SDK-backed participation store. (#75630) Thanks @soichiyo. - Slack: let same-channel message tool sends opt out of inherited thread context with `topLevel: true` or `threadId: null`, allowing agents to post a new parent-channel message from inside a Slack thread. Fixes #79807. Thanks @vexclawx31. - Slack: prefer full rich-text block content over truncated socket-mode message previews so long inbound Slack messages reach agents intact. Fixes #79027. Thanks @BobAccentWebDev. - Slack: include structured Slack API error details in setup, probe, streaming, and reply logs while preserving token redaction. (#53966) Thanks @deucemask. - Gateway/agents: keep structured reasons when active-run queueing fails and deprecate the legacy boolean queue helper, so steering and subagent wake diagnostics distinguish completed, non-streaming, and compacting runs. Fixes #80156. Thanks @markus-lassfolk. - System events: dedupe keyed events across the queue while preserving unkeyed, delivery-route, and trust-boundary event identity. (#73040) Thanks @statxc. - Agents/UI: compact exec and tool progress rows by hiding redundant shell tool names, replacing known workspace paths with short context markers, and preserving Discord trace scrubbing for compact command lines. - ACPX: run and await the embedded ACP backend startup probe by default so the gateway `ready` signal no longer fires before the acpx runtime has either become usable or reported a probe failure; set `OPENCLAW_ACPX_RUNTIME_STARTUP_PROBE=0` to restore lazy startup. Fixes #79596. Thanks @bzelones. - Gateway/status: surface model-pricing bootstrap and refresh failures as degraded health/status warnings while keeping Gateway liveness healthy. Fixes #79599. Thanks @bzelones. - OpenAI-compatible models: strip prior assistant reasoning fields from replayed Chat Completions history by default, preventing oMLX/vLLM Qwen follow-up turns from rejecting or stalling on stale `reasoning` payloads. Fixes #46637. Thanks @zipzagster and @lexhoefsloot. - CLI/onboarding: give non-Azure custom providers a safe generated context window and heal legacy 4k wizard entries without overwriting explicit valid small model limits, preventing first-turn compaction loops. Fixes #79428. (#79911) Thanks @Jefsky. - OpenAI-compatible models: add `compat.strictMessageKeys` to strip Chat Completions replay messages to `role` and `content` for strict providers that reject OpenAI-style tool and metadata keys. Fixes #50374. Thanks @choutos. - Bedrock Mantle: add `plugins.entries.amazon-bedrock-mantle.config.discovery.enabled=false` to suppress automatic Mantle discovery and IAM bearer-token generation while keeping the plugin enabled. Fixes #67288. Thanks @kanekoh. - Ollama: stop native `/api/chat` requests from copying catalog `contextWindow` or `maxTokens` into `options.num_ctx` unless `params.num_ctx` is explicitly configured, avoiding pathological prompt-ingestion latency on local large-context models. Fixes #62267. Thanks @BenSHPD. - Ollama: keep the model idle watchdog enabled for `*:cloud` models routed through a local Ollama host, so cloud-backed tool-loop stalls fail over visibly instead of inheriting local-model no-idle behavior. Fixes #79350. Thanks @geek111. - Voice/Ollama: honor routed voice agent `tools.allow` for classic embedded voice responses, including empty allowlists, so no-tool Ollama agents do not receive tool schemas. Fixes #79506. Thanks @donkeykong91. - Agents/doctor: warn when channel-routed agents cannot call the `message` tool, so operators can fix tool policy mismatches before explicit channel actions such as attachments or thread replies fail. Refs #80128. Thanks @jeffjhunterai. - Gateway: reread config from disk after the first in-process restart loop startup, preventing SIGUSR1 restarts from reusing a stale startup snapshot and dropping config written after boot. Fixes #79947. Thanks @TheLevti. - Codex app-server: deliver native image-generation outputs from Codex `savedPath` events as reply media, so blank-text image generation turns still attach the generated file. Thanks @keshavbotagent. - Network/SSRF: keep pinned automatic DNS lookups on IPv4 when dual-stack hosts also publish AAAA records, and treat `EADDRNOTAVAIL` as a transient gateway network failure instead of a fatal crash. Fixes #80078. Thanks @takamasa-aiso. - Control UI: show compact one-line live/idle/terminal run status badges in the Sessions table and rename the active-minute filter to its updated-within meaning. Fixes #78307. Thanks @BunsDev. - Control UI: scope chat session-list refreshes by agent and skip disk-only agent store discovery for configured-only lists, preventing post-first-message session switching stalls on large Windows stores. Fixes #79675. Thanks @lovelefeng-glitch, @BunsDev. - Control UI: allow Appearance tweakcn theme imports through the served CSP so browser-local custom theme links no longer fail with a `connect-src` violation. Fixes #78504. Thanks @BunsDev. - Control UI/config: remove plugin allowlist entries that the form auto-added when a plugin enable toggle is reverted before saving, so reverting the visible toggle clears dirty state without persisting unintended allowlist changes. (#78329) Thanks @samzong. - Gateway/mobile: reuse bootstrap-issued device-token scopes on handoff reconnects and surface device-token scope mismatches separately from token mismatches while preserving full shared-token dashboard/native sessions. Fixes #79292. Thanks @BunsDev. - Media/host-read: allow buffer-verified gzip, tar, and 7z archives in the shared host-local media validator alongside ZIP and document attachments. - Plugins/install: retry managed npm plugin installs without npm alias overrides after npm's `Invalid comparator: npm:` failure, so older npm versions can install official plugins instead of aborting. (#80539) Thanks @rubencu. - Plugins/doctor: invalidate persisted plugin registry snapshots when plugin diagnostics point at deleted source paths, so `openclaw doctor` stops repeating stale warnings after a local extension is replaced by a managed npm plugin. Fixes #80087. (#80134) Thanks @hclsys. - Doctor/OpenAI Codex: preserve Codex auth intent when auto-repairing legacy `openai-codex/*` model refs to canonical `openai/*` by adding provider/model-scoped Codex runtime policy, preventing repaired configs from falling through to direct OpenAI API-key auth. Fixes #78533 and #78570. Thanks @superck110 and @Azmodump. - CLI/agents: surface durable message delivery status from `sendDurableMessageBatch` in `deliverAgentCommandResult` and `openclaw agent --json --deliver`, preserving suppressed hook outcomes as terminal no-retry results while exposing partial and failed sends for automation. Supersedes #53961 and #57755. Thanks @Kaspre. - Agents: apply the LLM idle watchdog while provider stream setup is still pending, preventing silent pre-stream model hangs from waiting for the full agent timeout. - Cron: let isolated self-cleanup runs inspect their own job run history while keeping other cron jobs and mutation actions blocked. Fixes #80019. Thanks @hclsys. - Cron: report isolated agent-turn setup and pre-model stalls with phase-specific timeout errors instead of waiting for the full job budget when no model call starts. Fixes #74803. Thanks @jeffsteinbok-openclaw and @dgkim311. - CLI/plugins: treat arbitrary unknown subcommands outside plugin CLI metadata as normal unknown commands instead of suggesting `plugins.allow`, while preserving allowlist guidance for real plugin command roots. Fixes #80109. (#80123) Thanks @kagura-agent. - CLI/config: persist explicit `config set` and `config patch` values that equal runtime defaults instead of reporting success while dropping them. Fixes #79856. (#80106) Thanks @abodanty and @hclsys. - OpenAI/realtime voice: accept Codex-compatible legacy audio and transcript event aliases so provider protocol drift does not drop assistant audio or captions. - Discord/voice: keep default agent-proxy realtime sessions from auto-speaking filler before the forced OpenClaw consult answer, finish Discord playback on realtime response completion, and queue later exact-speech answers until playback idles to avoid mid-sentence replacement. - Gateway: return deterministic `400 invalid_request_error` responses for malformed encoded session-kill HTTP paths instead of letting route-shaped requests fall through to later Gateway handlers. (#72439) Thanks @rubencu. - Control UI: serve root PWA and favicon assets from `/__openclaw__/` SPA routes so tab icons, install metadata, and the service worker do not 404 after internal navigation. Fixes #80072. Thanks @CodeNovice2017. - Exec/safe bins: compare trusted safe-bin dirs with path-specific case folding on case-insensitive filesystems so Windows and default macOS paths match without weakening case-sensitive mounts. (#42131) Thanks @hkochar. - OpenAI/realtime voice: honor disabled input-audio interruption locally so server VAD speech-start events do not clear Discord playback after operators set `interruptResponseOnInputAudio: false`. - Telegram: keep no-response DM turns quiet instead of rewriting them into visible silent-reply chatter. Fixes #78188. (#78228) Thanks @Beandon13. - Telegram: handle managed select button callbacks before the raw callback fallback while preserving delimiter-containing option values such as `env|prod`. (#79816) Thanks @moeedahmed. - OpenAI-compatible models: handle JSON chat-completion bodies returned to streaming requests, preserving reasoning fields and visible text instead of completing an empty agent turn. Fixes #77870. - Discord/models: defer model picker component interactions before loading route, model, and preference data, preventing "This interaction failed" timeouts under gateway load. Fixes #77283. Thanks @colin-chang. - xAI: expose `/think low|medium|high` for reasoning-capable Grok models and keep `reasoning.effort` on native Responses payloads while preserving off-only behavior for non-reasoning routes. Fixes #79210. Thanks @colinmcintosh. - CLI/media: let explicit image description model refs use bundled static provider catalogs and generic model-backed image hooks, so `openclaw infer image describe --model zai/glm-4.6v` works like direct model runs and Anthropic auth probes avoid stale Claude 3 Haiku catalog entries. - Models/Anthropic: add `anthropic/claude-haiku-4-5` to Anthropic API-key agent allowlist defaults when an Anthropic default model is configured, so cron model overrides can select the current Haiku alias. Fixes #78000. - Agents/compaction: initialize built-in context engines before CLI transcript compaction resolves the default engine, preventing clean-process `legacy` engine registration failures during CLI session persistence. Fixes #79446. Thanks @TurboTheTurtle. - Agents/Anthropic-compatible: strip replayed thinking blocks for custom Anthropic-compatible models that explicitly declare `supportsReasoningEffort: false`, preventing Kimi-compatible providers from resending unsupported `thinking` content. Fixes #47452. - Kimi: keep Anthropic-compatible thinking streams valid by supplying required thinking budgets and enough output room for hidden reasoning plus final text. (#80481) Thanks @InTheCloudDan. - Browser: wait longer for existing-session Chrome MCP status and non-deep doctor probes so slow first attaches do not falsely report offline while keeping raw CDP status probes short. (#77473) Thanks @rubencu. - Gateway/logging: install console capture before foreground Gateway fast-path parsing and suppress known libsignal session dumps even in verbose mode, preventing raw terminal logs from printing WhatsApp session key material. (#76306) Thanks @rubencu. - Exec approvals: keep `exec.approval.list` on the lightweight policy-summary path so listing pending approvals no longer loads the rich tree-sitter command explainer. (#76943) Thanks @rubencu. - Agents: surface concise default-visible warnings when `exec`/`bash` tool calls fail after the assistant claims success, while keeping raw stderr hidden unless verbose details are enabled. Fixes #60497. (#80003) Thanks @jbetala7. - Channels/iMessage: keep redacted failed probe details in non-sensitive health snapshots so Full Disk Access failures no longer appear as configured/OK in status output. Fixes #79795. - Agents: stop blank model-emitted tool calls before dispatch while preserving id-based tool-name recovery, preventing Kimi/NVIDIA blank-name retry loops without creating a callable `_blank` sentinel. Fixes #34129. (#56391) Thanks @smartchainark. - Agents/Telegram: deliver the canonical final assistant answer instead of replaying accumulated pre-tool text blocks, preventing duplicate Telegram replies and raw-looking tool-output fragments from leaking into chat delivery. Fixes #79621 and #79986. Thanks @nonzeroclaw and @dudaefj. - Auto-reply/TUI: keep fallback timeout recovery deliverable after a primary model lifecycle error by emitting fallback progress and deferring terminal TUI errors until recovery has a chance to finish. Fixes #80000. (#80009) Thanks @TurboTheTurtle. - Heartbeat: clear stale auto fallback model overrides when the configured default model changes, so heartbeat runs follow updated `agents.defaults.model.primary` without requiring a manual reset. Fixes #74284. Thanks @brtkwr and @bitloi. - CLI/agent: let `openclaw agent --model` use the backend/admin Gateway scope without cached device-token scopes silently downscoping the request. (#78837) Thanks @VACInc. - CLI/help: keep help and version invocations configless while improving shared port, channel, plugin, task, session, message, pairing, and auth recovery text. - CLI/config: explain strict JSON parse failures with a valid example and the plain-string escape hatch. - CLI/secrets: turn offline Gateway reload failures into actionable recovery text. - CLI/channels: explain missing or ambiguous channel selections with next commands. - CLI/channels: defer guided channel status collection until a channel is selected, keeping `openclaw channels add` first screen quieter. - CLI/channels: exit guided channel setup cleanly on cancellation instead of printing the internal wizard error. - Plugins/CLI: route disabled Matrix and LanceDB memory command roots to plugin-enable guidance instead of generic unknown-command errors. - Browser/Docker: detect Playwright-managed Chromium from `PLAYWRIGHT_BROWSERS_PATH` and the default Playwright cache on Linux, so Docker installs that persist `/home/node/.cache/ms-playwright` no longer need `browser.executablePath`. - Ollama: keep DeepSeek V4 cloud models thinking-capable even when Ollama Cloud `/api/show` omits the `thinking` capability, so `/think high` no longer rejects `ollama/deepseek-v4-*:cloud`. - ACPX/Claude ACP: keep foreground prompts waiting for their own result when autonomous task-notification results arrive during the same session, and retarget the patch for Claude Agent ACP `0.33.1`. - WhatsApp: keep Baileys media uploads from passing non-Dispatcher agents to undici in `7.0.0-rc10`, and patch the bundled Baileys declaration so the latest tsdown build stays warning-clean. - Build: keep tsdown `0.22.0` warning-clean by externalizing known third-party declaration edges and replacing relative channel config module augmentations with explicit built-in channel fields. - ACP sessions: map canonical runtime options to backend-advertised ACP config keys like Claude's `effort` while keeping persisted OpenClaw state canonical. (#79926) Thanks @InTheCloudDan. - Models/Discord: support `provider/*` entries in `agents.defaults.models` so `/model`, `/models`, and model pickers can show dynamically discovered models for selected providers without exact model allowlists. Fixes #79485. Thanks @rendrag-git. - Gateway/watch: rebuild or restage missing bundled-plugin dist and runtime-postbuild outputs before launching the Gateway from a source checkout, preventing incomplete watch-mode runtime trees. (#70805) Thanks @rubencu. - CLI/update: allow restart health probes from the previous gateway protocol during self-update, and make plugin dry-runs report exact npm target versions instead of `unknown` while preserving unchanged status. - OpenAI/Codex: forward persisted `openai-codex` OAuth profile metadata into Codex plugin harness attempts after canonical `openai/*` migration, so OAuth-only installs keep using native Codex auth instead of falling through to direct OpenAI API-key auth. Fixes #79978. - OpenAI/Codex: point gateway missing-key recovery and wizard docs at the canonical `openai/gpt-5.5` plus Codex OAuth route, and fix trajectory export errors so they suggest the valid `openclaw sessions` command. - Google/Gemini: normalize retired `google/gemini-3-pro-preview` primary, fallback, and model-map refs during config load and unrelated config writes so saved config keeps targeting Gemini 3.1 Pro Preview. - Google/Gemini: normalize retired Gemini 3 Pro Preview ids inside emitted Google provider model config, so regenerated models.json rows test `google/gemini-3.1-pro-preview`. - Google/Gemini: normalize retired Gemini 3 Pro Preview ids for explicit OpenAI-compatible Google and Gemini CLI provider configs, so emitted config targets `google/gemini-3.1-pro-preview`. - Google/Gemini: normalize retired Gemini 3 Pro Preview ids preserved from existing merged models.json providers so config emission keeps targeting `google/gemini-3.1-pro-preview`. - Google/Gemini: normalize retired Gemini 3 Pro Preview ids inside provider auth config patches so setup-emitted provider catalogs test `google/gemini-3.1-pro-preview`. - GitHub Copilot: mint short-lived Copilot API tokens with the same `vscode-chat` integration identity used by runtime requests, and refresh legacy cached tokens missing that identity so image-capable Copilot models no longer inherit the `copilot-language-server` scope. Fixes #79946, #80074. Thanks @TurboTheTurtle. - Plugins/doctor: drop stale managed npm install records when `openclaw doctor --fix` removes npm packages that shadow bundled plugins, so the rebuilt registry no longer resurrects the removed package metadata. - Doctor: warn when a per-agent model config omits the `fallbacks` key and `agents.defaults.model.fallbacks` is non-empty. Covers both string-form (`"model": "..."`) and partial-object form (`"model": { "primary": "..." }`) — both silently clobber the defaults chain at runtime. Use `"fallbacks": []` to explicitly opt out of fallbacks, or add `"fallbacks": [...]` to inherit or override. Fixes #79369. Thanks @Kaspre. - Discord/voice: reuse or suppress late realtime consult tool calls without stealing newer speaker context or speaking forced fallback answers twice. - Discord/voice: skip likely incomplete realtime forced-consult transcript fragments and non-actionable closings so stale partial speech does not queue delayed answers over the next turn. - Discord/voice: keep realtime forced consults from clearing active exact-speech playback, so back-to-back voice answers queue instead of cutting each other off. - Discord/voice: synthesize realtime playback timestamps from emitted Discord PCM so OpenAI realtime barge-in truncation no longer sees `audioEndMs=0` and skips legitimate interruptions. - Plugin SDK: keep activated linked plugin runtime facades loadable when bundled plugin fallback is disabled. Thanks @shakkernerd. - Feishu: auto-thread `message(action="send")` replies inside the topic when the active session is group_topic or group_topic_sender, and propagate `replyInThread` through text, card, and media outbound adapters so topic-scoped sessions no longer post at the group root. Fixes #74903. (#77151) Thanks @ai-hpc. - WhatsApp: pass routing context into voice-note transcript echo preflight so echoed transcripts can deliver to the originating chat. Fixes #79778. (#79788) Thanks @hclsys. - Cron/failover: classify structured OpenAI-compatible `server_error` payloads as `server_error`, expose that reason in cron state, and let one-shot cron retry policy honor `retryOn: ["server_error"]` without requiring raw `5xx` text. (#45594) Thanks @clovericbot. - Slack: wake the resolved thread session after interactive reply button/select clicks and carry Slack delivery context through the queued interaction event, so clicks continue the visible conversation. Fixes #79676 and #61502. (#79836) Thanks @velvet-shark, @tianxiaochannel-oss88, and @Saicheg. - WhatsApp/streaming: send only the new suffix when text-end block replies repeat prior preambles across tool-call cycles, preventing cumulative WhatsApp preamble messages. Fixes #78946. (#79120) Thanks @brokemac79 and @papawattu. - Tests/security audit: sandbox `audit-exec-surface.test.ts` under a per-case OpenClaw home tempdir, redirecting `OPENCLAW_HOME` (which wins over `HOME`/`USERPROFILE` in `resolveRawHomeDir`) alongside `HOME` and `USERPROFILE`, so its `saveExecApprovals(...)` calls never touch the live `~/.openclaw/exec-approvals.json` on the host running the suite. Sibling exec-approvals tests already used the tempdir pattern; this file did not, so running `pnpm test` against a contributor's local checkout was silently truncating their real approvals to `{ "version": 1, "agents": {} }`. (#79885) Thanks @omarshahine. - ACP/gateway: preserve `AcpRuntimeError` cause chain (code/method/JSON-RPC detail) through the lifecycle boundary so gateway logs, telegram replies, and tool-result text show the actual upstream failure instead of opaque `Internal error`/`[object Object]`, with redaction applied before the chain reaches log or reply surfaces. - Channels/iMessage: wire `action: "reply"` attachments through `imsg send-rich --file` when the installed imsg build advertises that capability (probed once via `imsg send-rich --help` and cached on the private-API status). Reply now hydrates `media`/`mediaUrl`/`fileUrl`/`mediaUrls[0]`/`filePath`/`path`/base64 `buffer`+`filename` through the shared outbound resolver, stages buffers via the existing `withTempFile` helper, rejects `http(s)://` URL attachments with a targeted error pointing callers at `send`'s full attachment-resolver pipeline, and falls back to the explicit `imsg#114 not landed yet` error on older imsg builds. Depends on the upstream `openclaw/imsg#114` capability landing in an installable release; until then the new path stays gated and users see the same explicit fallback `#79822` introduced. (#79864) Thanks @omarshahine. - Telegram: preserve the first-preview debounce while appending true partial-stream deltas, so edited draft previews no longer duplicate earlier text when providers emit incremental output. (#80045) Thanks @TurboTheTurtle. - Agents/Anthropic: report 1M session context for Claude Opus/Sonnet 4 models even when local model config still advertises 200k, matching model discovery and preventing premature status/UI overflow. Fixes #66766. - Models/OpenRouter: hide missing-auth direct provider rows in `/model status` when they are only duplicated by a nested OpenRouter model id such as `openrouter/google/...`, while preserving explicitly configured direct providers. Fixes #62317. - Models: preserve an explicitly selected provider/model such as `opencode-go/deepseek-v4-pro` when another provider owns the same bare model alias. Fixes #79325. - Models/config: explain missing `models.providers..models[]` registration when a model exists only in `agents.defaults.models`, instead of returning a bare unknown-model error. Fixes #80089. - MCP/tools: prefix bundle MCP server/tool fragments that would start with digits, keeping generated tool names valid for Moonshot/Kimi and other strict providers. Fixes #79179. - Models/OpenRouter: treat `403 API key budget limit exceeded` as billing so model fallback advances instead of retrying the exhausted primary. Fixes #60191. Thanks @omgitsgela. - Models/OpenRouter: repair stale session overrides that lost the outer `openrouter/` provider wrapper, so sessions return to the configured OpenRouter model instead of failing as an unknown direct-provider model. Fixes #78161. Thanks @hjamal7-bit. - Google/Gemini: default API-key onboarding back to `google/gemini-3.1-pro-preview` so fresh Gemini test configs exercise Gemini 3.1 Pro Preview. - Telegram: show full provider/model labels for nested OpenRouter model ids in the model picker, so `openrouter/openai/gpt-5.4-mini` no longer displays as `openai/gpt-5.4-mini`. Fixes #67792. (#72752) Thanks @iot2edge. - Models/OpenRouter: preserve live `supported_parameters` tool support metadata so non-tool Perplexity Sonar models no longer receive agent tool payloads and fall back unnecessarily. Fixes #64175. Thanks @Catfish-75. - Models/OpenRouter: add MoonshotAI Kimi K2.5 to the bundled OpenRouter catalog so onboarding/model pickers can offer it without waiting for live discovery. Fixes #14601. - Models/OpenRouter: keep keyRef/tokenRef-backed auth profiles visible to read-only PI model discovery, so OpenRouter models stay available in model pickers without storing plaintext keys. Fixes #58106. Thanks @ThalynLabs. - Models/list: include explicit configured provider rows and read-only auth-backed catalog rows in the default configured view without loading PI's full registry, keeping Control UI pickers aligned with usable model auth. Refs #79381. Thanks @ismael-81. - Security/audit: honor `tools.byProvider["provider/model"].deny` when reporting small-model web/browser exposure, so per-model OpenRouter mitigations clear the `models.small_params` exposure signal. Fixes #80118. - Models/Moonshot: accept direct `moonshotai/...` and `moonshot-ai/...` refs as aliases for canonical `moonshot/...`, so copied OpenRouter Kimi ids no longer fail as unknown direct models. Fixes #73876. (#74946) Thanks @jeffrey701. - Kimi Code: use Kimi's stable `kimi-for-coding` API model id in bundled catalog, onboarding, and docs while normalizing legacy `kimi-code` and `k2p5` refs. Fixes #79965. - Telegram: render cached reply targets and nearby group chatter as one selected conversation context window, so stale replies no longer split JSON reply chains from local chat context. - Volcengine/Kimi: strip provider-unsupported tool schema length and item constraint keywords for direct and coding-plan models so hosted Kimi runs do not reject message tools with `minLength`. Fixes #38817. - DeepSeek: backfill V4 `reasoning_content` replay fields for unowned OpenAI-compatible proxy providers, preventing follow-up request failures outside the bundled DeepSeek and OpenRouter routes. Fixes #79608. - iMessage: emit a WARN log when an action is blocked because the imsg private API bridge is not attached, so operators see the silent-drop in `~/.openclaw/logs/openclaw.log` instead of having to read per-session trajectory JSONL `tool.result` payloads. Common after a gateway restart un-injects the dylib from Messages.app. (#80035) Thanks @omarshahine. - Codex: cross-fill missing `thread.id` and `thread.sessionId` before schema validation so live Codex app-server responses that omit `sessionId` no longer fail `thread/start` or `thread/resume`. Fixes #80124. (#80137) Thanks @kagura-agent. - Agents/Pi: wait for embedded abort cleanup to settle before releasing the session write lock, preventing follow-up turns from racing previous prompt teardown. (#80239) Thanks @samzong. - WhatsApp: downgrade OpenClaw watchdog-triggered Web reconnects from runtime errors to recovery warnings and clear the recovered reconnect status after the next healthy connection. (#77026) Thanks @rubencu. - ACPX/Windows: hide the MCP proxy target child process window on Windows so ACP-backed agents do not flash or fail because of terminal window handling. Fixes #60672. (#60678) Thanks @KChow-ctrl. - Agents: abort generic repeated no-progress tool loops at the critical threshold when identical calls keep returning identical outcomes. (#80668) Thanks @frankekn. - Exec approvals: omit generated command highlights for non-POSIX Windows and shell-wrapper approval commands until those command languages have native highlighting support. (#80566) Thanks @jesse-merhi. - Telegram: keep verbose tool progress and result drafts separate from the final assistant answer so tool output no longer blends into the final Telegram message. (#80294) Thanks @jalehman. - Plugin SDK/Windows: enable the native require fast path for root `openclaw/plugin-sdk` dist aliases instead of forcing Jiti transforms. (#80878) Thanks @medns. - Agents/compaction: keep the recent tail after manual `/compact` when Pi returns an empty or no-op compaction summary, preventing blank checkpoints from replacing the live context. - Native commands: handle slash commands before workspace and agent-reply bootstrap so Telegram `/status` and other command-only native replies do not wait behind full agent turn setup. - Telegram/groups: include the recent local chat window and nearby reply-target window as generic inbound context so stale reply ancestry does not overshadow the live group conversation. - Plugins/Nix: allow externally configured plugin roots under `/nix/store` to load in `OPENCLAW_NIX_MODE=1` while keeping normal external plugin hardlink rejection unchanged. Thanks @joshp123. - Nextcloud Talk: include the required bot `response` feature in setup, explain missing `--feature response` on rejected sends, and surface missing response capability in doctor/status checks. Fixes #78935. (#79657) Thanks @joshavant. - Cron/diagnostics: emit the existing `message.queued`, `session.state` (processing/idle), and `message.processed` lifecycle events for isolated-cron agent turns in `runCronIsolatedAgentTurn`, matching the dispatch and embedded-runner paths so subscribers (diagnostics OTLP, OTel exporters, custom observability plugins) get per-run session attribution instead of bucketing isolated cron LLM calls under static fallback ids. Events are gated on `isDiagnosticsEnabled(cfg)` so the documented `diagnostics.enabled: false` master toggle continues to silence the recorder. (#79214) Thanks @arniesaha. - fix(discord): gate user allowlist name resolution [AI]. (#79002) Thanks @pgondhi987. - fix(msteams): gate startup user allowlist resolution [AI]. (#79003) Thanks @pgondhi987. - Infra/fetch-timeout: pass `operation` and `url` context to `buildTimeoutAbortSignal` from the music-generate reference fetch and the Matrix guarded redirect transport, so the `fetch timeout reached; aborting operation` warning carries actionable structured fields instead of a bare line. Fixes #79195. Thanks @pandadev66. - Harden macOS shell wrapper allowlist parsing [AI]. (#78518) Thanks @pgondhi987. - macOS/config: reject stale or destructive app fallback config writes before direct replacement and keep rejected payloads as private audit artifacts, so `gateway.mode`, metadata, and auth are not silently clobbered. Fixes #64973 and #74890. Thanks @BunsDev. - Gateway/macOS: include Apple Silicon Homebrew bin and sbin directories in generated LaunchAgent service PATHs and service-audit expectations so `openclaw gateway restart` keeps Homebrew Node installs reachable. Fixes #79232. Thanks @BunsDev and @TurboTheTurtle. - Doctor/OpenAI: stop pinning migrated `openai-codex/*` routes to the Codex runtime so mixed-provider agents keep automatic PI routing for MiniMax, Anthropic, and other non-OpenAI model switches. - Doctor/OpenAI: remove stale whole-agent Codex runtime pins while repairing legacy OpenAI-Codex routes, so upgraded agents do not force an unregistered Codex harness before provider/model routing can choose the right runtime. - Gateway/macOS: `openclaw gateway stop` now uses `launchctl bootout` by default instead of unconditionally calling `launchctl disable`, so KeepAlive auto-recovery still works after unexpected crashes; use the new `--disable` flag to opt into the persistent-disable behavior when a manual stop should survive reboots. Fixes #77934. Thanks @bmoran1022. - Gateway/macOS: `repairLaunchAgentBootstrap` no longer kickstarts an already-running LaunchAgent, preventing unnecessary service restarts and session disconnects when repair runs against a healthy gateway. Fixes #77428. Thanks @ramitrkar-hash. - Gateway/macOS: `openclaw gateway stop --disable` now persists the LaunchAgent disable bit even after a previous bootout left the service not loaded, keeping the explicit stay-down path reliable. (#78412) Thanks @wdeveloper16. - CLI/status: keep lean `openclaw status --json` off manifest-backed channel discovery so configured-channel checks do not repeatedly rescan plugin metadata. Fixes #79129. - Gateway/Tailscale: add opt-in `gateway.tailscale.preserveFunnel` so when `tailscale.mode = "serve"` and an externally configured Tailscale Funnel route already covers the gateway port, OpenClaw skips re-applying `tailscale serve` on startup and skips the `resetOnExit` teardown for that run, keeping operator-managed Funnel exposure alive across gateway restarts. Fixes #57241. Thanks @RenzoMXD. - Control UI/chat: hide retired and non-public Google Gemini model IDs from chat model catalogs and route the bare `gemini-3-pro` alias to Gemini 3.1 Pro Preview instead of the shut-down Gemini 3 Pro Preview. Thanks @BunsDev. - CLI/infer: canonicalize case-only catalog model refs in `infer model run --model` so mixed-case provider/model strings resolve to the canonical catalog entry instead of failing with `Unknown model`. (#78940) Thanks @ai-hpc. - CLI/infer: allow explicit local `infer model run --model ` probes to use exact bundled static catalog rows before the provider is written to config, surfacing missing credentials as auth errors instead of `Unknown model`. - CLI/install: revert the beta-only global root-refusal guard so existing root-managed VPS installs keep working; the DigitalOcean split-brain protection will move to a narrower image/install-specific path. Refs #67478 and #67509. Thanks @vincentkoc. - Auto-reply/media: resolve `scp` from `PATH` when staging sandbox media so nonstandard OpenSSH installs can copy remote attachments. - Agents/PI: route PI-native OpenAI-compatible default streams through OpenClaw boundary-aware transports so local-compatible model runs keep API-key injection and transport policy. - Gateway/media: require authenticated owner or admin context for managed outgoing image bytes instead of trusting requester-session headers. - Doctor/gateway: avoid duplicate Node runtime warnings when the daemon install plan already selected a supported Node runtime. - Gateway/nodes: ignore malformed non-string capability entries from live nodes instead of throwing while listing the node catalog. - Gateway/pairing: preserve deliberately narrowed role-token scopes when approving device scope upgrades instead of regranting the whole approved baseline. - Telegram/ACP: keep chat-bound ACP replies durable by delivering final-only ACP output as final text instead of transient Telegram preview blocks. Thanks @shakkernerd. - Telegram: hydrate replied-to messages as a persisted nearest-first reply chain so agents can see observed parent text, media refs, captions, senders, timestamps, and nested replies instead of guessing from a shallow reply id. - Telegram: skip the rewritten silent-reply fallback when the dispatcher reports a final reply was queued in the same turn so a "No extra answer from me." filler cannot race ahead of the actual reply when lane delivery state never observes the send. Fixes #78929. - Gateway/watch: leave `OPENCLAW_TRACE_SYNC_IO` disabled by default in `pnpm gateway:watch:raw` so watch mode avoids noisy Node sync-I/O stack traces unless explicitly requested. - Codex app-server: close stdio stdin before force-killing the managed app-server, matching Codex single-client shutdown behavior and avoiding unsettled CLI exits after successful runs. - CLI/Codex: dispose registered agent harnesses during short-lived CLI shutdown so successful Codex-backed `agent --local` runs do not leave app-server child processes alive. - Agents/Codex: auto-enable the Codex harness plugin for one-shot OpenAI model overrides so `openclaw agent --local --model openai/...` does not fail with an unregistered `codex` harness. - Gateway/live tests: avoid full model-registry enumeration for explicit provider-qualified live model filters, preventing `.profile` OpenAI gateway profile runs from hanging before provider dispatch. - Gateway/status: surface CLI and gateway runtime versions, warn about stale PATH/global wrappers when they differ, and add stale-wrapper checks to the newer-config warning. Refs #79091. Thanks @RamaAditya49 and @sallyom. - Google/Gemini: retry stalled Gemini 3 preview direct API-key streams with a lean first-response payload and share Gemini tool-schema cleanup across direct Google and Gemini CLI providers, so main sessions with coding tools can recover before the LLM idle watchdog fires. (#79668) Thanks @joshavant. - Update/plugins: run a mandatory post-core convergence pass after `openclaw update` swaps the core package and before the gateway restarts, repairing missing configured plugin payloads, validating active install records including `openclaw.extensions`, and exiting with structured repair guidance instead of restarting the gateway with broken plugins. (#79143) Thanks @BKF-Gitty. - Providers: preserve non-OK `text/event-stream` response bodies so provider HTTP errors keep their JSON detail instead of collapsing to generic streaming failures. Fixes #78180. - Gateway/auth: make explicit `trusted-proxy` mode fail closed instead of accepting local password fallback credentials after trusted-proxy identity checks fail. Fixes #78684. - Active memory: treat Google Chat `spaces/...` conversation ids as scoped targets instead of runnable channel names so recall runs no longer fail bundled-plugin dirName validation. Fixes #78918. - Active memory: make `/active-memory status` honor the configured agent allowlist instead of reporting on for agents where recall is disabled. Fixes #78986. - Mistral: normalize structured OpenAI-compatible completions content blocks so thinking objects are not persisted as `[object Object]` visible reply text. Fixes #78846. - Tools/session status: render the active heartbeat/run model for `session_status({"sessionKey":"current"})` instead of falling back to the persisted session default. Fixes #77493. - Doctor/secrets: allow safe inherited exec SecretRef `passEnv` names such as `HOME` while still blocking dangerous runtime env hooks. Fixes #78216. - Chat commands: make `/model default` reset the session model override instead of treating it as a literal model name. Fixes #78182. - Cron: make rejected `payload.model` errors show the configured `agents.defaults.models` allowlist instead of echoing the rejected model twice. Fixes #79058. - Agents/subagents: retry parent wake announces when the announce-summary model run fails with fallback cooldown exhaustion instead of dropping the wake on the first transient provider overload. Refs #78581. - Providers/network: honor IPv4 CIDR and octet-wildcard `NO_PROXY` entries such as `100.64.0.0/10` and `100.64.*` before enabling trusted env-proxy mode for model-provider requests. Fixes #79030. - Skills: cap skills watcher directory traversal at the same depth used by skill discovery so large non-skill trees under configured skill roots do not exhaust file descriptors on startup. Fixes #75501. Thanks @wzq-xzwj. - Docs/Docker: document a local Compose override for Docker Desktop DNS failures in the shared-network `openclaw-cli` sidecar, keeping the default compose setup hardened while unblocking `openclaw plugins install` when users opt in. Fixes #79018. Thanks @Jason-Vaughan. - Installer: when npm installs `openclaw` outside the parent shell PATH, print follow-up commands with the resolved binary path instead of telling users to run `openclaw` from a shell that will report `command not found`. Fixes #72382. Thanks @jbob762. - Plugins/runtime: share MIME and JSON Schema helpers across bundled plugins while preserving canonical media MIME inference, browser URL wildcard semantics, migration home-path resolution, QA request-limit responses, and extensionless text file previews. - Agents/memory flush: persist the pre-increment compaction counter after flush-triggered compaction so consecutive eligible compaction cycles run memoryFlush instead of alternating. Fixes #12590. Refs #12760, #26145, and #46513. Thanks @Kaspre, @lailoo, @drvoss, @Br1an67, and @dial481. - Status: treat CLI runtime aliases such as `claude-cli/` as the canonical selected provider route in `/status`, avoiding spurious fallback/unknown-auth display and preserving fresh context usage from CLI usage snapshots. Fixes #79015. Thanks @ItsThierry. - Agents/subagents: stop the `sessions_spawn` accepted note from recommending `sessions_yield` as the default wait path in push-based chat and CLI flows. Fixes #78913. Thanks @oiGaDio. - Compute plugin callback authorization dynamically [AI]. (#78866) Thanks @pgondhi987. - Telegram: deduplicate media attachments in non-streaming mode so block-delivered images are not resent in the final reply, and clear legacy `mediaUrl` fallback when all media URLs are filtered. Fixes #78372. - Gateway/auth: allow `gateway.auth.mode: "none"` loopback backend RPC clients to skip device identity only for local non-browser backend connections, restoring subagent spawns and gateway tools without opening remote or browser-origin bypasses. Fixes #75780. Thanks @yozakura-ava. - Canvas plugin: keep legacy root `canvasHost` configs valid until `openclaw doctor --fix` migrates them into `plugins.entries.canvas.config.host`, move Canvas/A2UI clients to gateway protocol v4 plugin surfaces, and refresh the generated A2UI bundle hash so normal builds stay clean. - feishu: honor config write policy for dynamic agents [AI]. (#78520) Thanks @pgondhi987. - fix(skill-workshop): honor pending approval for tool suggestions [AI]. (#78516) Thanks @pgondhi987. - BytePlus: mark Kimi K2.5 and Kimi K2 Thinking catalog entries as reasoning-capable, raise their output cap to 32k tokens, and fill Kimi cache-read pricing. Fixes #54149. - Control UI/chat: wait for an in-flight model dropdown patch before sending the next chat message, so immediate sends use the selected session model instead of racing the previous override. Fixes #54240. - Native chat: decode gateway-provided thinking metadata for the iOS/macOS picker so provider-specific levels such as `adaptive`, `xhigh`, and `max` appear without leaking unsupported default-model options. Thanks @BunsDev. - Agents/compaction: cap summarization output reserve tokens to the selected model's `maxTokens` so 1M-context Anthropic compactions do not request more output than the API permits. Fixes #54383. - Control UI/login: replace raw connection failures with structured, actionable login guidance for auth, pairing, insecure HTTP, origin, protocol, and transport failures. Thanks @BunsDev. - Agents/tools: fail `exec host=node` before `system.run` when the selected node is known to be disconnected, with an actionable reconnect message instead of a raw node invoke failure. Thanks @BunsDev. - Agents/tool-result guard: ignore internal tool-result `details` when estimating model-visible context, so large diagnostic metadata no longer triggers unnecessary truncation or compaction even though the provider boundary already strips `details` before model conversion. (#75525) Thanks @zqchris. - Agents/models: accept legacy `anthropic-cli/*` model refs as Claude CLI runtime refs instead of failing model resolution with `Unknown model`. Thanks @BunsDev. - Agents/tools: keep restrictive-profile tool-section warnings scoped to the configured sections whose tools are still missing from `alsoAllow`, so already re-allowed filesystem tools do not make exec-only fixes look broader than they are. Thanks @BunsDev. - Agents/tools: avoid warning messaging-only agents about inherited global `tools.exec` or `tools.fs` sections when the agent profile did not configure those tool sections itself. Thanks @BunsDev. - Codex dynamic tools: normalize runtime `toolsAllow` entries the same way as Pi tool policy, so aliases like `bash` and `apply-patch` still expose the intended OpenClaw tools. Thanks @BunsDev. - Memory/dreaming: read OpenAI-style `output_text` assistant parts from narrative subagent transcripts, so light-phase Dream Diary entries are not dropped as empty. Thanks @BunsDev. - OpenAI-compatible providers: honor `compat.supportsTools=false` by stripping tool payload fields before dispatch to chat-only endpoints. Fixes #74664. - OpenAI-compatible providers: apply model-declared unsupported tool-schema keyword stripping to native OpenAI transport payloads and mark Fireworks Kimi K2.5 as rejecting `not` schemas. Fixes #75467. - OpenAI-compatible gateway: sanitize images supplied through request content even when the prompt text contains no image file references, preventing oversized attachment payloads from bypassing the resize/drop pipeline. Fixes #59913. - Auth profiles: normalize inline API keys and tokens loaded from `auth-profiles.json` so masked or rich-text credential artifacts fail as auth errors instead of crashing HTTP header construction. Fixes #77624. - llm-task: resolve configured model aliases before embedded dispatch so `model="gemini-flash"` and other aliases route to the intended provider instead of the agent default. Fixes #54166. - Media generation: resolve slash-containing model-only overrides like `fal-ai/flux/dev` through registered provider model metadata so FAL image/video models do not get misparsed as provider `fal-ai`. Fixes #77444. - CLI backends: keep versioned OAuth identity matches reusable when auth profile ids rotate, so Claude CLI sessions do not reset and lose continuity during same-account OAuth refresh/profile alias changes. Fixes #78541. - Amazon Bedrock: refresh shared AWS profile/config file credentials before Bedrock model, discovery, and embedding requests so long-running Gateway processes pick up renewed profile credentials without restart. Fixes #77551. - Amazon Bedrock: treat named `aws-sdk` auth profiles as config routing metadata instead of stored credentials, and let `doctor --fix` move legacy markers out of `auth-profiles.json`. Fixes #69708. - Anthropic: reject uppercase provider-prefixed forward-compat model ids locally instead of sending malformed dynamic ids upstream. Fixes #73715. - OpenAI/embeddings: pass configured output dimensionality through single and batched embedding requests so memory embedding indexes can request smaller vectors. Fixes #55126. - CLI/infer: normalize HEIC/HEIF image files to JPEG before model-run requests, avoiding providers that reject Apple image container formats. Fixes #50081. - CLI/infer: fall back to macOS `sips` when optional image tooling cannot decode HEIC/HEIF input files before model-run requests. Refs #50081. - OpenRouter: keep the default `openrouter/auto` model ref canonical while preventing TUI and Control UI catalog pickers from displaying or submitting `openrouter/openrouter/auto`. Fixes #62655. - Status/Claude CLI: show `oauth (claude-cli)` for working Claude CLI OAuth runtime sessions instead of `unknown` when no local auth profile exists. Fixes #78632. Thanks @gorkem2020. - Memory search: preserve keyword-only hybrid FTS matches when vector scoring is unavailable or below the configured minimum score, so exact lexical hits are not dropped by weighted min-score filtering. - Heartbeat/async exec: remap cron-run session keys to agent-main (or `"global"` under `session.scope=global`) at the bash exec, ACP, gateway node-event, and CLI watchdog enqueue sites, and treat cron-run descendants as ephemeral for retention pruning, so async exec completion events land in the same queue the heartbeat drains instead of being stranded under the ephemeral cron-run key. Refs #52305. Thanks @Kaspre. - Wake protocol/system event CLI: type an optional `sessionKey` on `WakeParamsSchema`, add `--session-key` to `openclaw system event`, and keep cron enqueue/wake adapters resolving session-key-only targets symmetrically so callers can target a specific session for async-task completion relays instead of always hitting the agent's main session. Refs #52305. Thanks @Kaspre. - Exec approvals/node: let trusted backend node invokes complete no-device Control UI approvals after the original request connection changes, while keeping node, command, cwd, env, and allow-once replay bindings enforced. Fixes #78569. Thanks @naturedogdog. - Agents/subagents: keep background completion delivery on the requester-agent handoff/queue-retry path instead of raw-sending child results directly, and strip child-result wrapper or OpenClaw runtime-context scaffolding from queued outbound retries. Fixes #78531. Thanks @EthanSK. - Sandbox: recreate cached browser bridges when JavaScript-evaluation permission changes, keep failed prune removals tracked for retry, and make cross-device directory moves copy-then-commit without partially emptying the source on failure. - CLI/completion: guard the shell-profile source line written by `openclaw completion --install` with a file existence check (`[ -f ... ] && source ...` for bash/zsh, `test -f ...; and source ...` for fish) so uninstalling OpenClaw no longer makes new login shells error on a missing completion cache. (#78659) Thanks @sjf. - Telegram: fail private-topic sends instead of retrying them as plain DMs when Telegram rejects the topic id, keeping private-topic `message_thread_id` routing intact. Fixes #79455. (#78575) Thanks @tmimmanuel. - Discord/groups: instruct group-chat agents to stay silent when a message is addressed to someone else, replying only when invited or correcting key facts. (#78615) - Discord/groups: tell Discord-channel agents to wrap bare URLs as `` so link previews do not expand into uninvited embeds. (#78614) - Agents/fallback: fail fast on session write-lock timeouts instead of trying fallback models for local file contention. Fixes #66646. Thanks @sallyom. - Browser/SSRF: stop closing user-owned Chrome tabs when a read-only operation (snapshot/screenshot/interactions) is rejected by the SSRF guard — only OpenClaw-initiated navigations now close on policy denial. Thanks @scotthuang. - iMessage: stage native inbound attachments into OpenClaw-managed media and convert HEIC/HEIF images to JPEG before dispatch, so image tools can read photos sent over native iMessage without requiring BlueBubbles. - Agents/Gateway: throttle and cap live exec command-output events so noisy tool runs cannot flood Gateway WebSocket clients or starve RPC handling. (#78645) Thanks @joshavant. - Memory Wiki: skip empty and whitespace-only source pages when refreshing generated Related blocks, preventing blank pages from being rewritten into Related-only stubs. Fixes #78121. Thanks @amknight. - Telegram: keep duplicate message-tool-only Codex turns from posting generic silent-reply fallback text, so private finals stay private after inbound dedupe. Thanks @rubencu. - Telegram/sessions: gap-fill delivered embedded final replies into the session JSONL even when the runner trace is missing, so Telegram answers after tool calls do not vanish from the durable transcript. Fixes #77814. (#78426) Thanks @obviyus, @ChushulSuri, and @DougButdorf. - Cron/heartbeat: let restricted cron-triggered runs read their own status and current-job list metadata again, preventing heartbeat STATUS freshness checks from going stale while preserving self-remove-only mutation limits. Fixes #78208. Thanks @amknight. - Channels/cron: ignore stale runtime conversation bindings that point at completed isolated cron run sessions, so follow-up DMs fall back to their normal route instead of reusing a closed cron task prompt. Fixes #78074. Thanks @amknight. - ACP: preserve streamed chunk boundaries in background-task progress summaries so CJK text, paths, URLs, and identifiers are no longer split with synthetic spaces. Fixes #78312. Thanks @amknight. - Agents/DeepSeek: suppress provider-private DSML transport syntax (tool-use-error, tool-call, function-call shadow blocks) so it never leaks into assistant-visible text; native `delta.tool_calls` remains the only authoritative tool-call source. (#78331) Thanks @samzong. - Agents/subagents: preserve the delegated task prompt when a spawned target agent uses `systemPromptOverride`, so `sessions_spawn(mode: "run")` child runs still see their assigned task. Fixes #77950. Thanks @amknight. - Node/Windows: fall back to the Startup-folder launcher when Spanish-localized `schtasks` reports `Acceso denegado`, matching the existing access-denied fallback path. Fixes #77993. Thanks @jackonedev. - Plugins/diagnostics: make source-only TypeScript package warnings actionable by explaining that missing compiled runtime output is a publisher packaging issue and pointing users to update/reinstall or disable/uninstall the plugin. Fixes #77835. Thanks @googlerest. - Control UI/chat: keep persisted assistant progress text visible when the same transcript turn also contains tool-use metadata, so chat.history reloads no longer make those replies vanish after the next user message. Fixes #77374. Thanks @BunsDev. - Cron: repair persisted future `nextRunAtMs` values that no longer line up with the cron schedule, so daily timezone-aware jobs do not stay jumped to stale future dates. Fixes #77867. Thanks @hongfangsong. - Agents/memory: keep error payloads visible during silent maintenance turns, so restricted memory-flush tool writes surface as chat errors instead of disappearing behind a silent run. Fixes #77821. Thanks @praxstack. - TUI: skip the generic CLI respawn wrapper for interactive launches, exit cleanly on terminal loss, and refuse to restore heartbeat sessions as the remembered chat session, preventing stale heartbeat history and orphaned `openclaw-tui` processes on first boot. Thanks @vincentkoc. - Doctor/sessions: move heartbeat-poisoned default main session store entries to recovery keys and clear stale TUI restore pointers, so `doctor --fix` can repair instances already stuck on `agent:main:main` heartbeat history. Thanks @vincentkoc. - Agents/context engines: keep hidden OpenClaw runtime-context custom messages out of context-engine assemble, afterTurn, and ingest hooks so transcript reconstruction plugins only see conversation messages. Thanks @vincentkoc. - Agents/compaction: treat visible custom-message, bash, and branch-summary entries as real conversation anchors so safeguard mode does not write empty fallback summaries for cron and split-turn sessions with substantive tool work. Fixes #78300. Thanks @amknight. - Network/runtime: avoid importing Undici's package dispatcher during no-proxy timeout bootstrap so external channel plugin fetch requests with explicit Content-Length keep working. Fixes #78007. Thanks @shakkernerd. - Status/doctor: treat a single healthy OpenClaw Gateway listener on loopback, LAN, or wildcard bind as the expected configured gateway instead of warning that the port is already in use. Fixes #77939. Thanks @GitHoubi and @brokemac79. - Agents/TTS: send media-bearing block replies directly when block streaming is off, so agent `tts` tool audio attached to a final text reply is delivered instead of being consumed before final Telegram/media delivery. Thanks @Conan-Scott. - Doctor: avoid crashing on partial Linux environments when the legacy crontab probe or terminal note wrapper receives missing or non-string output. Fixes #77773. Thanks @brokemac79 and @blackflame7983. - Gateway/performance: reuse the current compatible plugin metadata snapshot across hot read-only status, channel, auth, skills, and embedded agent settings paths, avoiding repeated synchronous plugin metadata scans during Gateway activity. Fixes #77983. Thanks @shakkernerd. - Tasks/maintenance: prune stale cron run session registry entries while preserving running cron jobs and non-cron sessions. Fixes #73867. Thanks @brokemac79. - Plugins: dispatch cached descriptor-backed tools by the resolved runtime tool name for unnamed factories, fixing multi-tool plugins whose shared manifest contracts exposed sibling tools but failed at execution. Fixes #78671. Thanks @zanni098. - Plugins/update: repair plugin-local `openclaw` peer links for all recorded npm plugins after any npm update mutates the shared managed npm tree, so targeted or batch updates cannot leave Codex, Discord, or Brave with pruned SDK imports. (#77787) Thanks @ProspectOre. - Codex harness: honor `models.providers.openai-codex.models[].contextTokens` for native `openai/*` Codex runtime runs and `/status` context reporting, so subscription-backed Codex agents use the configured OAuth context cap without inflating past the runtime model window. Fixes #77858. Thanks @lilesjtu. - Sessions cleanup: add `openclaw sessions cleanup --fix-dm-scope` so operators who return `session.dmScope` to `main` can dry-run and retire stale direct-DM session rows while preserving transcripts as deleted archives. Fixes #47561 and #45554. Thanks @BunsDev. - Doctor/Codex: repair legacy `openai-codex/*` routes and cron payload model refs to canonical `openai/*`, keep OpenAI agent turns on Codex by default, ignore stale whole-agent/session runtime pins, preserve explicit provider/model runtime policy, and migrate legacy runtime model refs to model-scoped runtime entries. Thanks @vincentkoc. - Video generation: wait up to 20 minutes for slow fal/MiniMax queue-backed jobs, stop forwarding unsupported Google Veo generated-audio options, and normalize MiniMax `720P` requests to its supported `768P` resolution with the usual override warning/details instead of failing fallback. - Channels/durable delivery: preserve channel-specific final reply semantics when using durable sends, including Telegram selected quotes and silent error replies plus WhatsApp message-sending cancellations. - Channels/message lifecycle: build legacy channel delivery results from message receipts and add receipts to BlueBubbles, Feishu, Google Chat, iMessage, IRC, LINE, Nextcloud Talk, QQ Bot, Signal, Synology Chat, Tlon, Twitch, WhatsApp, Zalo, and Zalo Personal send results and owner-path reply delivery plus Discord, Matrix, Mattermost, Slack, and Teams send results while preserving existing message id compatibility. - iMessage: run durable final replies through the iMessage outbound sanitizer before sending, matching direct auto-reply delivery and preventing assistant-internal scaffolding from leaking through queued delivery. - CLI/plugins: handle closed stdin during `plugins uninstall` confirmation prompt and exit 1 with actionable `--force` guidance instead of crashing with Node exit 13 unsettled top-level await. Fixes #73562. (#73566) Thanks @ai-hpc. - Control UI/Sessions: hide disk-discovered unregistered-agent sessions by default and fall back from restored unconfigured agent session keys before chat refresh, preventing deleted-agent stores from reopening the wrong workspace. Fixes #41685. Thanks @BunsDev. - Slack: keep health-monitor recovery stops from poisoning manual-stop state after channel stop timeouts, allowing Socket Mode accounts to reconnect after event-loop stalls instead of staying dead until Gateway restart. Fixes #77651. Thanks @Gusty3055. - Codex app-server: ignore account and rate-limit notifications when measuring active-turn liveness and suppress duplicate generic timeout replies after a visible messaging-tool delivery, so lost completion signals no longer keep Telegram/Discord turns active behind a delivered reply. (#79667) Thanks @joshavant. - Control UI/Gateway: preserve verified trusted-proxy operator scopes for browser WebSocket sessions so nginx/Authelia deployments can load chat history, models, sessions, nodes, and logs instead of failing with missing operator.read. Fixes #78508. (#79643) Thanks @joshavant. - Cloudflare AI Gateway: preserve boundary-aware Anthropic Messages transport when runtime auth creates a custom session stream, keeping the upstream x-api-key header intact for Gateway runs. (#79673) Thanks @joshavant. - Webhooks/Gmail/Windows: resolve `gcloud`, `gog`, and `tailscale` PATH/PATHEXT shims before setup and watcher spawns, using the Windows-safe `.cmd` wrapper for long-lived `gog serve` processes. (#74881, fixes #54470) Thanks @Angfr95. - Control UI/chat: suppress `HEARTBEAT_OK` acknowledgement history, streams, deltas, and final events before they enter the transcript view, so repeated heartbeat no-op turns do not stack noisy bubbles. Thanks @BunsDev. - Agents/skills: require exact `` skill paths for both single-skill and multi-skill prompt selection, so agents do not guess or hard-code skill file paths. (#74161) Thanks @lanzhi-lee. - Agents/skills: rebuild sandboxed non-rw run skill prompts from the sandbox workspace copy, so `` no longer points at host-only `~/.openclaw/skills` paths. Fixes #50590. Thanks @kidroca and @sallyom. - Agents/media: tell async music and video completion agents when normal final replies are private, and send completion fallbacks directly to message-tool-only group/channel routes when the completion agent still only writes a private final reply, so generated media does not disappear behind the delivery contract. - CLI/update: report corrupt or unloadable managed plugins as post-update warnings instead of disabling them or turning a successful OpenClaw package update into a failed update result. Thanks @vincentkoc and @Patrick-Erichsen. - Update/restart: probe managed Gateway restarts with the service environment and add a Docker product lane that exercises candidate-owned `openclaw update --yes --json` restarts, so SecretRef-backed local gateway auth cannot regress behind mocked restart checks. Thanks @vincentkoc. - Gateway/sessions: cache selected model override resolution while building session-list rows so `openclaw sessions` and Control UI session lists stay responsive on model-heavy stores. (#77650) Thanks @ragesaq. - Gateway/diagnostics: make stuck-session recovery outcome-driven and generation-guarded, add `diagnostics.stuckSessionAbortMs`, and emit structured recovery requested/completed events so stale or skipped recovery no longer looks like a successful abort. - Messaging: queue assembled channel-turn final replies before sending to reduce response loss when the gateway restarts between assistant completion and channel delivery. Refs #77000. - Agents/replay-history: drop trailing assistant turns whose content is empty or carries only the stream-error sentinel before sending the transcript to the provider, so prefill-strict providers (such as github-copilot/claude-opus-4.6) no longer reject the request with `400 The conversation must end with a user message` after a session whose last turn errored before producing content. Refs #77228. (#77287) Thanks @openperf. - Agents/session-file-repair: drop `type: "message"` entries with a missing, `null`, or blank role during the on-disk repair pass so sessions that accumulated null-role JSONL corruption (such as the 935+ corrupt entries in #77228) get fully cleaned up rather than carried forward into the repaired file. Refs #77228. (#77288) Thanks @openperf. - Doctor/device pairing: stop suggesting `openclaw devices rotate --role ` for stale local cached device auth when that role is no longer approved by the gateway pairing record, so doctor no longer points users at a command that must be denied. (#77688) Thanks @Conan-Scott. - Ollama/thinking: expose the lightweight Ollama provider thinking profile through the public provider-policy artifact too, so reasoning-capable Ollama models such as `ollama/deepseek-v4-pro:cloud` keep `/think max` available even before the full plugin runtime activates. (#77617, fixes #77612) Thanks @rriggs and @yfge. - Codex/app-server: stabilize transcript mirror dedupe across re-mirrored turns so reordered snapshots no longer drop reasoning entries or duplicate the assistant reply. Refs #77012. (#77046) Thanks @openperf. - Agents/auth-profiles: do not record request-shape (`format`) rejections as auth-profile health failures, so a single per-session transcript-shape error (such as a prefill-strict 400 "conversation must end with a user message") no longer triggers a profile-wide cooldown that blocks every other healthy session sharing the same auth profile. Refs #77228. (#77280) Thanks @openperf. - CLI/update: stop dev-channel source updates immediately when `git fetch` fails, so tag conflicts cannot keep preflight, rebase, or build steps running against stale refs while the Gateway is still on the old runtime. (#77845) Thanks @obviyus. - Config/recovery: chmod restored `openclaw.json` back to owner-only (`0600`) after suspicious-read backup recovery on POSIX hosts, so a previously world-readable config mode cannot persist into a freshly restored credential-bearing config. (#77488) Thanks @drobison00. - Memory/dreaming: persist last dreaming-ingestion calendar day per daily note in `daily-ingestion.json` so unchanged notes are still re-ingested once per dreaming day for promotion signals toward deep thresholds. Fixes #76225. (#76359) Thanks @neeravmakwana. - Agents/embed: keep message_end safety delivery armed when a silent text_end chunk produces no block reply, fixing dropped Telegram/forum replies. Fixes #77833. (#77840) Thanks @neeravmakwana. - Install/postinstall: skip noisy compile-cache prune warnings when `EACCES`/`EPERM` prevent removing shared `/tmp/node-compile-cache` entries owned by another user. Fixes #76353. (#76362) Thanks @RayWoo and @neeravmakwana. - Agents/messaging: surface CLI subprocess watchdog/turn timeout messages to chat users when verbose failures are off, instead of collapsing them into generic external-run failure copy. Fixes #77007. (#77015) Thanks @neeravmakwana. - Agents/sessions: after embedded Pi runs, append assistant-visible reply text to session JSONL only when Pi did not already persist an equivalent tail assistant entry, without re-mirroring the user prompt Pi owns. Fixes #77823. (#77839) Thanks @neeravmakwana. - Plugins/CLI: load the install-records ledger when listing channel-catalog entries, so npm-installed third-party channel plugins resolve through `openclaw channels login`/`channels add` instead of failing with `Unsupported channel`. (#77269) Thanks @pumpkinxing1. - Memory wiki/Security: enforce session visibility on shared-memory `wiki_search` and `wiki_get` so sandboxed subagents cannot read transcript content from sibling or parent sessions. Fixes GHSA-72fw-cqh5-f324. Thanks @zsxsoft. - Exec approvals: enforce allowlist `argPattern` argument restrictions on Linux and macOS as well as Windows, so an entry like `{ pattern: "python3", argPattern: "^safe\.py$" }` no longer silently relaxes to a path-only match on non-Windows hosts. (#75143) Thanks @eleqtrizit. - Security/exec allowlist: collapse `.` and `..` segments in wildcard exec allowlist match targets and canonicalize absolute executable path candidates before regex matching, so a target like `/usr/bin/../../bin/sh` no longer string-matches a `/usr/bin/**` allowlist entry while resolving outside the declared root. (#75723) Thanks @eleqtrizit and @zsxsoft. - Agents/compaction: disable Pi auto-compaction whenever OpenClaw effectively owns safeguard compaction, including provider-backed safeguard mode, so Pi and OpenClaw no longer fight over long-session compaction. Fixes #73003. (#73839) Thanks @bradhallett. - Telegram/streaming: finalize text replies by stopping the edited stream message instead of sending a second answer bubble, so Telegram turns cannot duplicate the streamed final response. (#77947) Thanks @obviyus. - web_search/Brave: fix provider selection when Brave is installed as an external plugin and `tools.web.search.provider: "brave"` is explicitly configured — a redundant provider re-resolution at startup could race and return an empty list, causing a spurious `WEB_SEARCH_PROVIDER_INVALID_AUTODETECT` warning and treating the explicitly configured provider as absent. Fixes #77676. Thanks @openperf. - Doctor/plugins: discover doctor contracts from load-path channel plugins during `openclaw doctor --fix`, so plugin-owned legacy config repair runs before validation. (#77477) Thanks @jalehman. - Dependencies: bump transitive `basic-ftp` to 5.3.1 so the runtime lockfile no longer includes the vulnerable 5.3.0 build flagged by the production dependency audit. (#78637) Thanks @sallyom. - Hooks/cron: log returned `/hooks/agent` isolated-run errors and failed cron jobs with cron diagnostic summaries, so rejected `payload.model` values are visible instead of looking like accepted-but-missing runs. Fixes #78597. (#78655) Thanks @kevinslin. - Managed proxy/security: classify raw socket callsites and proxy runtime mutations in boundary checks so new direct egress or unmanaged proxy-state changes cannot land without explicit review. (#77126) Thanks @jesse-merhi. - Memory indexing: propagate memory directory creation failures immediately instead of reporting an unusable directory as ready. Thanks @he-yufeng. - Channels/iMessage: surface the silent group-allowlist drop at default log level by emitting a one-time `warn` per account at monitor startup when `channels.imessage.groupPolicy: "allowlist"` is set without a `channels.imessage.groups` block, plus a one-time `warn` per `chat_id` when the runtime gate drops a specific group, naming the exact `channels.imessage.groups[...]` key to add to allow it. Fixes #78749. (#79190) Thanks @omarshahine. - WhatsApp: stop Gateway-originated outbound echoes from advancing inbound activity in `openclaw channels status`, so outbound self-sends no longer look like handled inbound messages. Fixes #79056. (#79057) Thanks @ai-hpc and @bittoby. - Gateway/nodes: preserve the live node registry session and invoke ownership when an older same-node WebSocket closes after reconnecting. (#78351) Thanks @samzong. - Browser/downloads: route explicit and managed browser download output directories through `fs-safe` validation before staging final files, so symlinked output roots are rejected before writes. (#78780) Thanks @jesse-merhi. - Agents/PI: skip the idle wait during aborted embedded-run cleanup, so stopped or timed-out runs clear pending tool state and release the session lock promptly. (#74919) Thanks @medns. - Agents/current-time: split UTC into a separate `Reference UTC:` prompt line so local `Current time:` stays anchored to the user's timezone. (#42654) Thanks @chencheng-li. - Agents/reasoning: keep embedded reasoning deltas raw for correct same-line streaming while preserving formatted Telegram, Feishu, Discord, and heartbeat delivery at the channel edge. (#78397) Thanks @medns. - Agents/failover: rotate auth profiles before deferred cooldown marking on rate-limit failures, so file-lock contention cannot stall profile failover. Fixes #57281. (#57283) Thanks @jeremyknows. - Gateway/sessions: when `session.dmScope: "main"` is configured, route a bare webchat `/new` against the agent's main session (`sessions.create` with `emitCommandHooks=true`) to an in-place reset instead of creating a parallel `dashboard:` child, matching `/new` behavior on Telegram/Discord. Fixes #77434. (#71170) Thanks @statxc. - Scripts/UI/Windows: launch `.cmd` and `.bat` UI runners through the shared cmd.exe escaping path with shell mode disabled, avoiding Node.js v24 DEP0190 warnings while preserving argument boundaries. (#62910) Thanks @nandanadileep. - Agents/CLI runner: disable supervisor stdout/stderr capture for prepared CLI runs while keeping bounded diagnostics and incremental JSONL output parsing, preventing long CLI output from being retained in memory. (#79617) Thanks @samzong. - Telegram: treat a DM binding that carries the chat id in both `conversationId` and `parentConversationId` as a direct conversation instead of a topic, so reverse delivery for Telegram DMs is not misrouted through a topic-shaped target. (#79700) Thanks @TSHOGX. ## 2026.5.7 ### Fixes - Release/plugin publishing: retry transient ClawHub CLI dependency install failures, keep preview-passing plugins publishable when one preview cell flakes, and verify every expected ClawHub package version after publish so maintenance releases are faster to recover and less likely to hide partial plugin publishes. - OpenAI: support `openai/chat-latest` as an explicit direct API-key model override for trying the moving ChatGPT Instant API alias without changing the stable default model. - Cron CLI: include computed `status` in `cron list --json` and `cron show --json` output so external tooling can read disabled/running/ok/error/skipped/idle state without reimplementing cron status derivation. (#78701) Thanks @aweiker. - Channels CLI: make `openclaw channels list` channel-only, add `--all` for bundled and catalog channels, render installed/configured/enabled state, and move model auth/usage details to `openclaw models auth list`, `openclaw status`, and `openclaw models list`. (#78456) Thanks @sliverp. - Native commands: honor owner enforcement for native command handlers. (#78864) Thanks @pgondhi987. - Active Memory: require admin scope for global memory toggles. (#78863) Thanks @pgondhi987. - Gateway/sessions: clear cached skills snapshots during `/new` and `sessions.reset` so long-lived channel sessions rebuild the visible skill list after skills change. (#78873) Thanks @Evizero. - Auto-reply: gate inline skill tool dispatch through before-tool-call authorization hooks. (#78517) Thanks @pgondhi987. - Tavily: resolve dedicated `tavily_search` and `tavily_extract` tool credentials from the active runtime config snapshot, so `exec` SecretRef-backed API keys do not reach the tools unresolved. (#78610) Thanks @VACInc. - Plugins/install: use the same absolute POSIX npm lifecycle shell for managed plugin install, rollback, repair, and uninstall npm operations as staged package updates, preventing restricted PATH shells from breaking cleanup. Thanks @vincentkoc. - Agents/context engine: invalidate cached assembled context views when source history shrinks or assembly fails, preventing stale pre-reset history from being reused. Fixes #77968. (#78163) Thanks @brokemac79 and @ChrisBot2026. - Discord/message: parse provider-prefixed targets like `discord:channel:` as channel sends instead of legacy Discord DM targets, so cross-channel agent `message(action="send")` calls no longer misroute channel IDs into misleading `Unknown Channel` failures. Fixes #78572. - Agents/compaction: clamp compaction summary reserve tokens to each model's output limit so high-context compaction no longer requests invalid `max_tokens` values. (#54392) Thanks @adzendo. - Commands/BTW: show the `/btw` missing-question usage placeholder with brackets so outbound channel sanitization keeps it visible. Fixes #62877. Thanks @RajvardhanPatil07. - Cron/doctor: repair persisted cron jobs whose `payload.model` was stored as `"default"`, `"null"`, blank, or JSON `null` by removing the bad override during `openclaw doctor --fix` while keeping cron runtime model validation strict. Fixes #78549. Thanks @bizzle12368239. - Telegram: honor `accessGroup:*` sender allowlists for DMs, groups, native commands, and callback authorization before applying Telegram's numeric sender-ID checks. Fixes #78660. Thanks @manugc. - Agent delivery: report `deliverySucceeded=false` when outbound delivery returns no adapter result, so claimed/empty delivery paths no longer masquerade as successful sends. Fixes #78532. Thanks @joeyfrasier. - Cron/isolated runs: fail implicit announce delivery before model execution when `delivery.channel=last` has no previous route, so recurring jobs do not spend tokens before hitting a permanent delivery-target error. Fixes #78608. Thanks @sallyom. - Gateway/sessions: persist a new generated transcript file when daily gateway-agent session rollover changes the session id, while preserving custom transcript paths. Fixes #78607. Thanks @nailujac, @zerone0x, and @sallyom. - Doctor/Codex OAuth: preserve working `openai-codex/*` PI routes during `doctor --fix` and recover 2026.5.5-rewritten `openai/*` GPT-5 routes when only Codex OAuth auth is available, so update repair does not break subscription-auth setups. Fixes #78407. Thanks @shakkernerd. - Telegram: keep the polling watchdog tied to `getUpdates` liveness so unrelated outbound Bot API calls cannot mask a wedged inbound poller. Fixes #78422. Thanks @ai-hpc. - Agents/subagents: have completed session-mode subagent registry rows honor `agents.defaults.subagents.archiveAfterMinutes` instead of a hardcoded 5-minute TTL, so registry-backed surfaces keep one retention knob across spawn modes. (#78263) Thanks @arniesaha. - Plugins/channel setup: forward `setChannelRuntime` from non-bundled external plugin setup entries so deferred external channel runtime initializers are installed before startup polling. Fixes #77779. (#77799) Thanks @openperf. - Telegram: treat successful same-chat `message` tool outbound sends during an inbound Telegram turn as delivered when deciding whether to emit the rewritten silent reply fallback. (#78685) Thanks @neeravmakwana. - Gateway/tasks: reconcile stale CLI run-context tasks whose live run context disappeared and bound channel hot-reload deferrals so stale task records cannot block Discord/Slack/Telegram reloads forever. - Discord/voice: audit Discord voice-channel permissions in `channels capabilities` and `channels status --probe`, including auto-join targets, so missing Connect/Speak/Read Message History permissions show up before `/vc join`. - Discord/voice: make voice capture less choppy by extending the default post-speech silence grace to 2.5s, add `voice.captureSilenceGraceMs` for noisy Discord sessions, and tighten the spoken-output prompt around live STT fragments. Thanks @vincentkoc. - WhatsApp: route proactive phone-number sends through Baileys LID forward mappings when available, so LID-addressed contacts receive agent messages instead of creating sender-only ghost chats. Fixes #67378. (#74925) Thanks @edenfunf. - WhatsApp: send captioned `MEDIA:` directive auto-replies once instead of emitting an empty media message before the captioned media reply. (#78770) Thanks @ai-hpc. - Codex/approvals: in Codex approval modes, stop installing the pre-guardian native `PermissionRequest` hook by default so Codex's reviewer can approve safe commands before OpenClaw surfaces an approval, remember `allow-always` decisions for identical Codex native `PermissionRequest` payloads within the active session window, and make plugin approval requests validate/render their actual allowed decisions so Telegram and other native approval UIs cannot offer stale actions. Thanks @shakkernerd. - Model providers: normalize APNG sniffed PNG uploads, preserve Gemini 3 tool-call thought-signature replay with fallback signatures, accept legacy `__env__:VAR` custom-provider keys, and repair snake_case tool-call transcript sanitization. Fixes #51881, #48915, #77566, and #42858. - Telegram/models: parse provider ids containing dots in `/models` callback buttons so `hf.co` model lists render as inline keyboard buttons. Fixes #38745. ## 2026.5.6 ### Fixes - Doctor/OpenAI config: keep the 2026.5.6 release branch clear of the legacy Codex route rewrite that could change OpenAI model config during `doctor --fix`, preserving existing OpenAI routes unless a supported repair path applies. - Plugins/runtime fetch: drop third-party symbol metadata from plain request header dictionaries before passing them into native `fetch` or `Headers`, so SDK and guarded/proxy fetch paths do not reject otherwise valid plugin requests. Fixes #77846. Thanks @shakkernerd. - Debug proxy: normalize captured fetch header dictionaries before replaying requests so symbol metadata from caller-owned header objects cannot make debug-proxy fetches fail. - Web fetch: bound guarded dispatcher cleanup after request timeouts so timed-out fetches return tool errors instead of leaving Gateway tool lanes active. (#78439) Thanks @obviyus. ## 2026.5.5 ### Fixes - Telegram/Codex: generate DM topic labels with Codex-compatible simple-completion requests so auto-created private topics can be renamed instead of staying `New Chat`. - Doctor/Codex OAuth: preserve working `openai-codex/*` PI routes during `doctor --fix`, recover 2026.5.5-rewritten `openai/*` GPT-5 routes when only Codex OAuth auth is available, and warn without rewriting mixed Codex OAuth plus direct OpenAI PI routes, so update repair does not break subscription-auth setups. Fixes #78407. Thanks @shakkernerd. - Plugins/runtime fetch: drop third-party symbol metadata from plain request header dictionaries before passing them into native `fetch` or `Headers`, so SDK and guarded/proxy fetch paths do not reject otherwise valid plugin requests. Fixes #77846. Thanks @shakkernerd. - Web fetch: bound guarded dispatcher cleanup after request timeouts so timed-out fetches return tool errors instead of leaving Gateway tool lanes active. (#78439) Thanks @obviyus. - Mattermost/setup: prompt for and persist the server base URL after the bot token in `openclaw setup --wizard`, instead of failing validation before `--http-url` is collected. Fixes #76670. Thanks @jacobtomlinson. - Gate Slack startup user allowlist resolution [AI]. (#77898) Thanks @pgondhi987. - OpenAI/Codex: suppress stale `openai-codex` GPT-5.1/5.2/5.3 model refs that ChatGPT/Codex OAuth accounts now reject, keeping model lists, config validation, and forward-compat resolution on current 5.4/5.5 routes. Fixes #67158. Thanks @drpau. - CLI/update: keep pnpm package updates on the running custom global install root and pass pnpm's `--global-dir` so `openclaw update` does not create a second default-prefix install when `OPENCLAW_HOME` or the shell points at a custom OpenClaw directory. Fixes #78377. Thanks @amknight. - Google Meet/Voice Call: wait longer before playing PIN-derived Twilio DTMF for Meet dial-in prompts and retire stale delegated phone sessions instead of reusing completed calls. - PDF/Codex: include extraction-fallback instructions for `openai-codex/*` PDF tool requests so Codex Responses receives its required system prompt. Fixes #77872. Thanks @anyech. - Gateway/startup: keep the Gateway running when a configured optional plugin-owned capability such as a web_search provider or channel points at a known installable plugin that is currently unavailable; startup now logs a config warning and leaves `openclaw doctor --fix` to install or enable the plugin. (#78642) Thanks @joshavant. - Onboard/channels: recover externalized channel plugins from stale `channels.` config by falling back to `ensureChannelSetupPluginInstalled` via the trusted catalog when the plugin is missing on disk, so leftover `appId`/token entries no longer dead-end onboard with " plugin not available." (#78328) Thanks @sliverp. - Codex/app-server: forward the OpenClaw workspace bootstrap block through Codex `developerInstructions` instead of `config.instructions`, so persona/style guidance reaches the behavior-shaping app-server lane. Fixes #77363. Thanks @lonexreb. - MS Teams: route proactive channel sends with stored thread roots through the configured threaded reply path instead of forcing every CLI/message-tool send into a new top-level post. Fixes #78298. Thanks @amknight. - CLI/infer: pass minimal instructions to local `openai-codex/*` model probes and surface provider error details when `infer model run` returns no text. Fixes #76464. Thanks @lilesjtu. - Dependencies: override transitive `ip-address` to `10.2.0` so the runtime lockfile no longer includes the vulnerable `10.1.0` build flagged by Dependabot alert 109. Thanks @vincentkoc. - Plugins/install: apply OpenClaw's npm security overrides inside managed external plugin npm roots so hoisted plugin dependencies inherit the host package hardening. Thanks @vincentkoc. - Plugins/install: skip npm peer resolution in managed plugin roots so installing peer-based plugins such as Opik cannot pull a stale registry `openclaw` copy beside Codex/Discord/WhatsApp and trigger `ERESOLVE`. Thanks @vincentkoc. - Plugins/uninstall: run managed npm cleanup even when a plugin package directory is already missing, preventing stale package manifests from reinstalling removed plugins on the next npm install. - Feishu: hydrate missing native topic starter thread IDs before session routing so first turns and follow-ups stay in the same topic session. Fixes #78262. Thanks @joeyzenghuan. - LINE: reject `dmPolicy: "open"` configs without wildcard `allowFrom` so webhook DMs fail validation instead of being acknowledged and silently blocked before inbound processing. Fixes #78316. - Telegram/Codex: keep message-tool-only progress drafts visible and render native Codex tool progress once per tool instead of duplicating item/tool draft lines. Fixes #75641. (#77949) - Providers/xAI: stop sending OpenAI-style reasoning effort controls to native Grok Responses models, so `xai/grok-4.3` no longer fails live Docker/Gateway runs with `Invalid reasoning effort`. - Providers/xAI: clamp the bundled xAI thinking profile to `off` so live Gateway runs cannot send unsupported reasoning levels to native Grok Responses models. - Matrix/approvals: retry approval delivery up to 3 times with a short backoff so transient Matrix send failures do not strand pending approval prompts. (#78179) Thanks @Patrick-Erichsen. - Discord/gateway: measure heartbeat ACK timeouts from the actual heartbeat send, preventing late initial heartbeats from triggering false reconnect loops while the channel is still awaiting readiness. Fixes #77668. (#78087) Thanks @bryce-d-greybeard and @NikolaFC. - Discord/guilds: route plain text control commands such as `/steer` through the normal authorization and mention gate instead of silently dropping them before an agent session can see them. Fixes #78080. Thanks @ramitrkar-hash. - Control UI/Sessions: make the compaction count a compact `N Checkpoint(s)` disclosure and show expanded session-level details with modern checkpoint history cards across responsive table layouts. Thanks @BunsDev. - Control UI/performance: keep chat and channel tabs responsive while history payloads and channel probes are slow, label partial channel status, and record slow chat/config render timings in the event log. Thanks @BunsDev. - Control UI/sessions: fire the documented `/new` command and lifecycle hooks only for explicit Control UI session creation, restoring session-memory and custom hook capture without changing SDK parent-session creates. Fixes #76957. Thanks @BunsDev. - Exec approvals: fall back to a guarded copy when Windows rejects rename-overwrite for `exec-approvals.json`, while preserving symlink, hard-link, and owner-only permission safeguards. Fixes #77785. (#77907) Thanks @Alex-Alaniz and @MilleniumGenAI. - Status/session store: derive `totalTokens` for CLI backends from `agentMeta.lastCallUsage` (and set it on Claude CLI runs) so `/status` context usage is not shown as `?` while cache/token lines are populated. Fixes #78194. Thanks @neeravmakwana. - Slack: preserve Socket Mode SDK error context and structured Slack API fields in reconnect logs, so startup failures no longer collapse to a bare `unknown error`. - iOS pairing: allow setup-code and manual `ws://` connects for private LAN and `.local` gateways while keeping Tailscale/public routes on `wss://`, and prefer explicit gateway passwords over stale bootstrap tokens in mixed-auth reconnects. Fixes #47887; carries forward #65185. Thanks @draix and @BunsDev. - Plugins/diagnostics: make source-only TypeScript package warnings actionable by explaining that missing compiled runtime output is a publisher packaging issue and pointing users to update/reinstall or disable/uninstall the plugin. Fixes #77835. Thanks @googlerest. - Control UI/chat: keep persisted assistant progress text visible when the same transcript turn also contains tool-use metadata, so chat.history reloads no longer make those replies vanish after the next user message. Fixes #77374. Thanks @BunsDev. - Cron: repair persisted future `nextRunAtMs` values that no longer line up with the cron schedule, so daily timezone-aware jobs do not stay jumped to stale future dates. Fixes #77867. Thanks @hongfangsong. - TUI: skip the generic CLI respawn wrapper for interactive launches, exit cleanly on terminal loss, and refuse to restore heartbeat sessions as the remembered chat session, preventing stale heartbeat history and orphaned `openclaw-tui` processes on first boot. Thanks @vincentkoc. - Doctor/sessions: move heartbeat-poisoned default main session store entries to recovery keys and clear stale TUI restore pointers, so `doctor --fix` can repair instances already stuck on `agent:main:main` heartbeat history. Thanks @vincentkoc. - Agents/context engines: keep hidden OpenClaw runtime-context custom messages out of context-engine assemble, afterTurn, and ingest hooks so transcript reconstruction plugins only see conversation messages. Thanks @vincentkoc. - Gateway/shutdown: cancel delayed post-ready maintenance during close and suppress maintenance/cron startup after quick restarts, preventing orphaned background timers. Thanks @vincentkoc. - Agents/generated media: treat attachment-style message tool actions as completed chat sends, preventing duplicate fallback media posts when generated files were already uploaded. - Control UI/sessions: show each session's agent runtime in the Sessions table and allow filtering by runtime labels, matching the Agents panel runtime wording. Thanks @vincentkoc. - Discord/streaming: show live reasoning text in progress drafts instead of a bare `Reasoning` status line. - Gateway/status: avoid marking fast repeated health/status samples as event-loop degraded from CPU/utilization alone until the Gateway has accumulated a sustained sampling window. Thanks @shakkernerd. - Plugins/update: keep installed official npm and ClawHub plugins such as Codex, Discord, WhatsApp, and diagnostics plugins synced during host updates even when disabled or previously exact-pinned, while preserving third-party plugin pins. Thanks @vincentkoc. - Doctor/status: warn when `OPENCLAW_GATEWAY_TOKEN` would shadow a different active `gateway.auth.token` source for local CLI commands, while avoiding false positives when config points at the same env token. Fixes #74271. Thanks @yelog. - Gateway/HTTP: avoid loading managed outgoing-image media handlers for unrelated requests, so disabled OpenAI-compatible routes return 404 without waiting on lazy media sidecars. Thanks @vincentkoc. - Gateway/OpenAI-compatible: send the assistant role SSE chunk as soon as streaming chat-completion headers are accepted, so cold agent setup cannot leave `/v1/chat/completions` clients with a bodyless 200 response until their idle timeout fires. - Agents/media: avoid direct generated-media completion fallback while the announce-agent run is still pending, so async video and music completions do not duplicate raw media messages. (#77754) - WebChat/Codex media: stage Codex app-server generated local images into managed media before Gateway display, so Codex-home image paths no longer hit `LocalMediaAccessError` while keeping Codex home out of the display allowlist. Thanks @frankekn. - TUI/sessions: bound the session picker to recent rows and use exact lookup-style refreshes for the active session, so dusty stores no longer make TUI hydrate weeks-old transcripts before becoming responsive. Thanks @vincentkoc. - Doctor/gateway: report recent supervisor restart handoffs in `openclaw doctor --deep`, using the installed service environment when available so service-managed clean exits are visible in guided diagnostics. Thanks @shakkernerd. - Gateway/status: show recent supervisor restart handoffs in `openclaw gateway status --deep`, including JSON details, so clean service-managed restarts are reported as restart handoffs instead of opaque stopped-service diagnostics. Thanks @shakkernerd. - Providers/Fireworks: expose Kimi models as thinking-off-only and keep K2.5/K2.6 requests on `thinking: disabled`, so manual model switches do not send Fireworks-rejected `reasoning*` parameters. Refs #74289. Thanks @frankekn. - WhatsApp responsiveness: stop only verified stale local TUI clients when they degrade the Gateway event loop and delay replies. Thanks @vincentkoc. - Plugins/update: repair stale managed npm-root `openclaw` peer packages before plugin installs, so beta-channel official plugin updates are not downgraded by old core package-lock state. Thanks @vincentkoc. - Plugins/install: reassert managed npm plugin `openclaw` peer links after shared-root npm installs, updates, and uninstalls, so mutating one plugin does not leave previously installed SDK-using plugins unable to resolve `openclaw/plugin-sdk/*`. - Hooks/session-memory: add collision suffixes to fallback memory filenames so repeated `/new` or `/reset` captures in the same minute do not overwrite the earlier session archive. Thanks @vincentkoc. - Agents/config: remove the ambiguous legacy `main` agent dir helper from runtime paths; model, auth, gateway, bundled plugin, and test helpers now resolve default/session agent dirs through `agents.list`/agent-scope helpers while plugin SDK keeps a deprecated compatibility export. - CLI/status: show the selected agent runtime/harness in `openclaw status` session rows so terminal status matches the `/status` runtime line. Thanks @vincentkoc. - CLI/sessions: prune old unreferenced transcript, compaction checkpoint, and trajectory artifacts during normal `sessions cleanup`, so gateway restart or crash orphans do not accumulate indefinitely outside `sessions.json`. Fixes #77608. Thanks @slideshow-dingo. - Doctor/Codex: repair legacy `openai-codex/*` routes in primary models, fallbacks, heartbeat/subagent/compaction overrides, hooks, channel overrides, and stale session pins to canonical `openai/*`, selecting `agentRuntime.id: "codex"` only when the Codex plugin is installed, enabled, contributes the `codex` harness, and has usable OAuth; otherwise select `agentRuntime.id: "pi"`. Thanks @vincentkoc. - Plugins/update: keep installed official npm and ClawHub plugins such as Codex, Discord, WhatsApp, and diagnostics plugins synced during host updates even when disabled or previously exact-pinned, while preserving third-party plugin pins. Thanks @vincentkoc. - Video generation: accept provider-specific aspect-ratio and resolution hints at the tool boundary, normalize `720P` to MiniMax's supported `768P`, and stop sending Google `generateAudio` on Gemini video requests so provider fallback can recover from model-specific parameter differences. Thanks @vincentkoc. - Status: show compact Gateway process uptime and host system uptime in `/status`, making restart and host-lifetime checks visible from chat. Thanks @vincentkoc. - WhatsApp responsiveness: stop only verified stale local TUI clients when they degrade the Gateway event loop and delay replies. Thanks @vincentkoc. - Hooks/session-memory: run reset memory capture off the command reply path and make model-generated memory filename slugs opt-in with `llmSlug: true`, so `/new` and `/reset` no longer block WhatsApp and other message-channel reset replies on hook housekeeping or a nested model call. Thanks @vincentkoc. - CLI/gateway: pause non-TTY stdin after full CLI command completion and stop `openclaw agent` from falling back to embedded mode after gateway request/auth failures, so parent help commands exit cleanly and scoped delivery probes surface the real Gateway error immediately. Thanks @vincentkoc. - Gateway/model catalog: cache empty read-only model catalog results until reload, so TUI and control-plane refresh loops cannot hammer plugin metadata reads when no usable models are currently discovered. Thanks @vincentkoc. - Hooks/session-memory: add collision suffixes to fallback memory filenames so repeated `/new` or `/reset` captures in the same minute do not overwrite the earlier session archive. Thanks @vincentkoc. - TUI/sessions: bound the session picker to recent rows and use exact lookup-style refreshes for the active session, so dusty stores no longer make TUI hydrate weeks-old transcripts before becoming responsive. Thanks @vincentkoc. - Agents/context engines: keep hidden OpenClaw runtime-context custom messages out of context-engine assemble, afterTurn, and ingest hooks so transcript reconstruction plugins only see conversation messages. Thanks @vincentkoc. - TUI: skip the generic CLI respawn wrapper for interactive launches, exit cleanly on terminal loss, and refuse to restore heartbeat sessions as the remembered chat session, preventing stale heartbeat history and orphaned `openclaw-tui` processes on first boot. Thanks @vincentkoc. - Doctor/sessions: move heartbeat-poisoned default main session store entries to recovery keys and clear stale TUI restore pointers, so `doctor --fix` can repair instances already stuck on `agent:main:main` heartbeat history. Thanks @vincentkoc. - Gateway/shutdown: report structured shutdown warnings and HTTP close timeout warnings through `ShutdownResult` while preserving lifecycle hook hardening. Carries forward #41296. Thanks @edenfunf. - CLI/update: make dev-channel preflight lint opt-in and constrained when enabled, so `openclaw update --channel dev` no longer walks back otherwise-good main commits when Ubuntu hosts OOM-kill or fail parallel oxlint shards. Thanks @vincentkoc. - CLI/channels: skip config, proxy, channel-option catalog, banner-config, and plugin startup bootstrap for the bare `openclaw channels` parent-help command, so it exits promptly after printing help instead of loading configured channel plugins. Thanks @vincentkoc. - Gateway/shutdown: cancel delayed post-ready maintenance during close and suppress maintenance/cron startup after quick restarts, preventing orphaned background timers. Thanks @vincentkoc. - CLI/status: show the selected agent runtime/harness in `openclaw status` session rows so terminal status matches the `/status` runtime line. Thanks @vincentkoc. - Sessions CLI: show the selected agent runtime in the `openclaw sessions` table so terminal output matches the runtime visibility already present in JSON/status surfaces. Thanks @vincentkoc. - Control UI/sessions: show each session's agent runtime in the Sessions table and allow filtering by runtime labels, matching the Agents panel runtime wording. Thanks @vincentkoc. - Docker/Gateway: harden the gateway container by dropping `NET_RAW` and `NET_ADMIN` capabilities and enabling `no-new-privileges` in the bundled `docker-compose.yml`. Thanks @VintageAyu. - OpenAI/Gateway: flush the initial chat stream chunk correctly so first-token streaming is visible instead of being delayed behind later chunks. - Gateway/media: skip media sidecar handling for unrelated HTTP routes so non-media requests do not pay the media route behavior. - Discord: show reasoning text in progress drafts so streaming replies expose useful thinking/progress instead of blank draft updates. - Auth profiles: avoid putting providers on cooldown for format-level rejections, so fallback profiles can still be tried when a model name is unsupported. - Update/plugins: tolerate corrupt managed plugin records during update so core package updates can still complete and report the plugin repair path. - Update: stop dev-channel updates cleanly after a fetch failure instead of continuing into later update steps. - Agents/generated media: treat attachment-style message tool actions as completed chat sends, preventing duplicate fallback media posts when generated files were already uploaded. ## 2026.5.4 ### Highlights - Google Meet/Voice Call: make Twilio dial-in joins speak through the realtime Gemini voice bridge with paced audio streaming, backpressure-aware buffering, barge-in queue clearing, and no TwiML fallback during realtime speech, giving Meet participants a much snappier OpenClaw voice agent. (#77064) Thanks @scoootscooob. ### Changes - Gateway/Windows: bind the default loopback gateway listener only to `127.0.0.1` on Windows so libuv's dual-stack `::1` behavior cannot wedge localhost HTTP requests. (#69701, fixes #69674) Thanks @SARAMALI15792. - Plugins/migration: emit catalog-backed install hints when `plugins.entries` or `plugins.allow` references an official external plugin that is not installed, so upgraded configs point operators to `openclaw plugins install ` instead of telling them to remove valid plugin config. (#77483) Thanks @hclsys. - OpenAI/Codex media: advertise Codex audio transcription in runtime and manifest metadata and route active Codex chat models to the OpenAI transcription default instead of sending chat model ids to audio transcription. Thanks @vincentkoc. - Dependencies: refresh runtime and provider packages including Pi 0.73.0, ACPX adapters, OpenAI, Anthropic, Slack, and TypeScript native preview, while keeping the Bedrock runtime installer override pinned below the Windows ARM Node 24 npm resolver failure. - Agents/performance: pass the resolved workspace through BTW, compaction, embedded-run model generation, and PDF model setup so explicit agent-dir model refreshes can reuse the current workspace-scoped plugin metadata snapshot instead of falling back to cold plugin metadata scans. (#77519, #77532) - Plugins/performance: let unscoped model catalog and manifest-contract readers reuse the current workspace-compatible plugin metadata snapshot, avoiding repeated cold plugin metadata scans on hot control-plane paths while preserving env/config/workspace compatibility checks. (#77519, #77532) - Config/plugin auto-enable: prefer the claiming plugin manifest id over a built-in channel alias when auto-allowlisting a configured channel, so WeCom/Yuanbao-style aliases resolve to the installed plugin id. Thanks @Beandon13. - Secrets/apply: preserve auth-profile `keyRef` and `tokenRef` fields when scrubbing provider-target secrets, so the canonical SecretRef metadata survives `secrets apply` without keeping plaintext values. Thanks @Beandon13. - Plugins/active-memory: skip session-store channel entries that contain `:` when resolving the recall subagent's channel, so QQ c2c agent IDs (e.g. `c2c:10D4F7C2…`) and other scoped conversation IDs do not reach bundled-plugin `dirName` validation and crash the recall run. The same guard already applied to explicit `channelId` params (#76704); this extends it to store-derived channels. (#77396) Thanks @hclsys. - Secrets/external channel contracts: also look in `/dist/` when resolving the `secret-contract-api` sidecar, so npm-published externalized channel plugins (e.g. `@openclaw/discord` since 2026.5.2) whose compiled artifacts live under `dist/` actually contribute their channel SecretRef contracts to the runtime snapshot. Without this, env-backed `channels.discord.token` SecretRefs silently failed to resolve at gateway start on 2026.5.3, leaving the channel `not configured` even though #76449 had landed the generic external-contract loader. Thanks @mogglemoss. - Models/auth: add `openclaw models auth list [--provider ] [--json]` so users can inspect saved per-agent auth profiles without dumping secrets or hitting the old “too many arguments” path. Thanks @vincentkoc. - Control UI/header: show the active agent name in dashboard breadcrumbs without adding the current session key, keeping non-chat views oriented without crowding the topbar. - Control UI/cron: make the New Job sidebar collapsible so the jobs list can reclaim space while keeping the form one click away. Thanks @BunsDev. - Gateway/startup: keep model-catalog test helpers, run-session lookup code, QR pairing helpers, and TypeBox memory-tool schema construction out of hot startup import paths, reducing default gateway benchmark plugin-load and memory pressure. - Control UI/performance: record browser long animation frame or long task entries in the debug event log when supported, making slow dashboard renders easier to attribute from the UI. - Slack/streaming: add `streaming.progress.render: "rich"` for Block Kit progress drafts backed by structured progress line data. - Slack/streaming: keep the newest rich progress lines when Block Kit limits trim long progress drafts. Thanks @vincentkoc. - Channels/streaming: cap progress-draft tool lines by default so edited progress boxes avoid jumpy reflow from long wrapped lines. - Agents/verbose: use compact explain-mode tool summaries for `/verbose` and progress drafts by default, with `agents.defaults.toolProgressDetail: "raw"` and per-agent overrides for debugging raw command/detail output. - Control UI/chat: add an agent-first filter to the chat session picker, keep chat controls/composer responsive across phone/tablet/desktop widths, keep desktop chat controls on one row, avoid duplicate avatar refreshes during initial chat load, and hide that row while scrolling down the transcript. Thanks @BunsDev. - Control UI/chat: collapse consecutive duplicate text messages into one bubble with a count so no-op heartbeat acknowledgements stay compact without hiding nearby context. - Agents/subagents: preserve every grouped child result when direct completion fallback has to bypass the requester-agent announce turn. Thanks @vincentkoc. - TTS/telephony: honor provider voice/model overrides in telephony synthesis providers so Google Meet agent speech logs match the backend that actually produced the audio. Thanks @vincentkoc. - Voice Call/realtime: bound the paced Twilio audio queue and close overloaded realtime streams before provider audio can pile up behind the websocket backpressure guard. Thanks @vincentkoc. - Docs: clarify that IRC uses raw TCP/TLS sockets outside operator-managed forward proxy routing, so direct IRC egress should be explicitly approved before enabling IRC. Thanks @jesse-merhi. - Gateway/performance: defer non-readiness sidecars until after the ready signal, avoid hot-path channel plugin barrel imports, and fast-path trusted bundled plugin metadata during Gateway startup. - Gateway/performance: avoid importing `jiti` on native-loadable plugin startup paths, so compiled bundled plugin surfaces do not pay source-transform loader cost unless fallback loading is actually needed. - Gateway/diagnostics: add startup phase spans, active work labels, stale terminal bridge markers, and default sync-I/O tracing in `pnpm gateway:watch` so slow Gateway turns are easier to attribute from logs and stability diagnostics. - Plugins/loader: preserve real compiled plugin module evaluation errors on the native fast path instead of treating every thrown `.js` module as a source-transform fallback miss. Thanks @vincentkoc. - QA/Mantis: add `pnpm openclaw qa mantis slack-desktop-smoke` to run Slack live QA inside a Crabbox VNC desktop, open Slack Web, and capture desktop screenshots beside the Slack QA artifacts. - QA/Mantis: pass the runtime env through desktop-browser Crabbox and artifact-copy child commands, so embedded Mantis callers can provide Crabbox credentials without mutating the parent process. Thanks @vincentkoc. - QA/Mantis: return the copied Slack desktop screenshot path even when remote Slack QA fails, so the CLI still prints the failure screenshot artifact. Thanks @vincentkoc. - QA/Mantis: accept Blacksmith Testbox `tbx_...` lease ids from desktop smoke warmup, so provider overrides do not fail before inspect/run. Thanks @vincentkoc. - QA/Codex harness: add targeted live Docker/Testbox diagnostics, auth preflight checks, cache mount fixes, and app-server protocol checkout discovery so maintainer harness failures are easier to reproduce. Thanks @vincentkoc. - Plugins/update: treat official externalized bundled npm migrations and ClawHub-to-npm fallbacks as trusted source-linked installs, so prerelease-only official plugin packages can migrate from bundled builds without being rejected as unsafe prerelease resolutions. Thanks @vincentkoc. - Plugins/update: move ClawHub-preferred externalized plugin installs back to ClawHub after an earlier npm fallback once the ClawHub package becomes available. Thanks @vincentkoc. - Plugins/update: clean stale bundled load paths for already-externalized pinned npm and ClawHub plugin installs, so release-channel sync does not leave removed bundled paths ahead of the installed external package. Thanks @vincentkoc. - Telegram: accept plugin-owned numeric forum-topic targets in the agent message tool and keep reply-dispatch provider chunks behind a real stable runtime alias during in-place package updates. Fixes #77137. Thanks @richardmqq. - Google Meet: preserve `realtime.introMessage: ""` so realtime Chrome joins can stay silent instead of restoring the default spoken intro. Thanks @vincentkoc. - Plugins/SDK: add bounded `before_agent_finalize` retry instructions so workflow plugins can request one more model pass. Thanks @100yenadmin. - Discord/status: add degraded Discord transport and gateway event-loop starvation signals to `openclaw channels status`, `openclaw status --deep`, and fetch-timeout logs so intermittent socket resets do not look like a healthy running channel. (#76327) Thanks @joshavant. - Providers/OpenRouter: add opt-in response caching params that send OpenRouter's `X-OpenRouter-Cache`, `X-OpenRouter-Cache-TTL`, and cache-clear headers only on verified OpenRouter routes. Thanks @vincentkoc. - Providers/OpenRouter: expand app-attribution categories so OpenClaw advertises coding, programming, writing, chat, and personal-agent usage on verified OpenRouter routes. Thanks @vincentkoc. - Providers/OpenRouter: add inbound audio STT support to media-understanding via OpenRouter's JSON `/audio/transcriptions` contract, including default audio model metadata and auto-selection priority. (#77490) Thanks @remdev. - Plugins/update: make package upgrades swap pnpm/npm-prefix installs cleanly, keep legacy plugin install runtime chunks working, and on the beta channel fall back default-line npm plugins to default/latest when plugin beta releases are missing or fail install validation. Thanks @vincentkoc and @joshavant. - Channels/WhatsApp: support explicit WhatsApp Channel/Newsletter `@newsletter` outbound message targets with channel session metadata instead of DM routing. Fixes #13417; carries forward the narrow outbound target idea from #13424. Thanks @vincentkoc and @agentz-manfred. - Exec approvals: add a tree-sitter-backed shell command explainer for future approval and command-review surfaces. (#75004) Thanks @jesse-merhi. - Agents/sandbox: store sandbox container and browser registry entries as per-runtime shard files, reducing unrelated session lock contention while `openclaw doctor --fix` migrates legacy monolithic registry files. (#74831) Thanks @luckylhb90. - Plugins/ClawHub: annotate 429 errors from ClawHub with the reset window from `RateLimit-Reset`/`Retry-After` and append a `Sign in for higher rate limits.` hint when the request was unauthenticated, so users can see when downloads will recover and how to lift the cap. Thanks @RomneyDa. - Plugins/runtime state: add `registerIfAbsent` for atomic keyed-store dedupe claims that return whether a plugin successfully claimed a key without overwriting an existing live value. Thanks @amknight. - Plugin SDK: add plugin-owned `SessionEntry` slot projection and scoped trusted-policy session extension reads. (#75609; replaces part of #73384/#74483) Thanks @100yenadmin. - Sandbox/Windows: accept drive-absolute Docker bind sources while keeping sandbox blocked-path and allowed-root policy comparisons Windows-case-insensitive. (#42174) Thanks @6607changchun. ### Fixes - Browser/chrome-mcp: read Chrome DevTools MCP screenshot output from the extension-suffixed path, fixing ENOENT on screenshot capture. Fixes #77222. (#74685) Thanks @barbarhan. - Agents/OpenAI: honor `compat.supportsTools: false` for OpenAI Completions models so chat-only compatible endpoints do not receive `tools`, `tool_choice`, or tool-history fallback payloads. Fixes #74664. Thanks @yelog. - macOS/launchd: set generated Gateway LaunchAgent plists to `ProcessType=Interactive` so the gateway keeps timely execution during idle periods. Fixes #58061; refs #62294 and closed duplicate #66992. (#62308) Thanks @bryanpearson and @zssggle-rgb. - Plugins/install: honor the beta update channel for onboarding and doctor-managed plugin installs by requesting floating npm and ClawHub specs with `@beta` while keeping persistent install records on the catalog default. Thanks @vincentkoc. - WhatsApp/onboarding: canonicalize setup and pairing allowlist entries to WhatsApp's digit-only phone ids while still accepting E.164, JID, and `whatsapp:` inputs, so personal-phone allowlists match WhatsApp Web sender ids after setup. Thanks @vincentkoc. - Gateway/startup: load provider plugins that own explicitly configured image, video, or music generation defaults so generation tools become live after gateway restart instead of remaining catalog-only. Fixes #77244. Thanks @buyuangtampan, @Nikoxx99, and @vincentkoc. - Slack/subagents: keep resumed parent `message.send` calls in the originating Slack thread when ambient session thread context is present, and suppress successful silent child completion rows from follow-up findings. Thanks @bek91. - Slack/mentions: record thread participation for successful visible threaded Slack sends, including message-tool and media delivery paths, so unmentioned replies in bot-participated threads can bypass mention gating as documented. Fixes #77648. Thanks @bek91. - Infra/Windows: skip the POSIX `/tmp/openclaw` preferred path on Windows in `resolvePreferredOpenClawTmpDir` so log files, TTS temp files, and other writes land in `%TEMP%\openclaw-` instead of `C:\tmp\openclaw`. Fixes #60713. Thanks @juan-flores077. - Media/Windows: open saved attachment temp files read/write before fsync so Windows WebChat and `chat.send` media offloads no longer fail with EPERM during durability flush. (#76593) Thanks @qq230849622-a11y. - Agents/tools: honor narrow runtime tool allowlists when constructing embedded-runner tool families and bundled MCP/LSP runtimes, so cron/subagent runs that request tools such as `update_plan`, `browser`, `x_search`, channel login tools, or `group:plugins` no longer start with missing tools or unrelated bootstrap work. (#77519, #77532) - Codex plugin: mirror the experimental upstream app-server protocol and format generated TypeScript before drift checks, keeping OpenClaw's `experimentalApi` bridge compatible with latest Codex while preserving formatter gates. - Telegram/media: derive no-caption inbound media placeholders from saved MIME metadata instead of the Telegram `photo` shape, so non-image and mixed attachments no longer reach the model as ``. Fixes #69793. Thanks @aspalagin. - Telegram/streaming: reuse the active preview as the first chunk for long text finals, so multi-chunk replies no longer create a transient extra bubble that appears and then disappears. Thanks @vincentkoc. - Agents/cache: keep per-turn runtime context out of ordinary chat system prompts while still delivering hidden current-turn context, restoring prompt-cache reuse on chat continuations. Fixes #77431. Thanks @Udjin79. - Gateway/startup: include resolved thinking and fast-mode defaults in the `agent model` startup log line, defaulting unset startup thinking to `medium` without mixing in reasoning visibility. - Gateway/update: resolve local gateway probe auth from the installed config during post-update restart verification, so token/device-authenticated VPS gateways are not misreported as unhealthy port conflicts after a package swap. Thanks @vincentkoc. - Agents/Tools: add post-compaction loop guard in `pi-embedded-runner` that arms after auto-compaction-retry and aborts the run with `compaction_loop_persisted` when the agent emits the same `(tool, args, result)` triple `windowSize` times (default 3) within that window. Disable via existing `tools.loopDetection.enabled`; tune via `tools.loopDetection.postCompactionGuard.windowSize`. Targets the failure mode where context-overflow + compaction does not break a tool-call loop. Refs #77474; carries forward #21597. Thanks @efpiva. - Gateway/watch: suppress sync-I/O trace output during `pnpm gateway:watch --benchmark` unless explicitly requested, so CPU profiling no longer floods the terminal with stack traces. - Gateway/watch: when benchmark sync-I/O tracing is explicitly enabled, tee trace blocks to the benchmark output log and filter them from the terminal pane while keeping normal Gateway logs visible. - Plugins/runtime-deps: include `json5` in the memory-core plugin runtime dependency set so packaged `memory_search` sandboxes can resolve generated OpenClaw runtime chunks that parse JSON5 config. Fixes #77461. - Plugins/Windows: show a Git install hint when npm plugin installation fails with `spawn git ENOENT`, and document the WhatsApp plugin's Git-on-PATH requirement for Baileys/libsignal installs. - Codex harness: preserve app-server usage-limit reset details and deliver OpenClaw-owned runtime failure notices through tool-only source-reply mode, so Telegram and other chat channels tell users when Codex subscription limits or API failures block a turn instead of going silent. (#77557) Thanks @pashpashpash. - Agents/OpenAI: default direct OpenAI Responses models to the SSE transport instead of WebSocket auto-selection, preventing pi runtime chat turns from hanging on servers where the WebSocket path stalls while the OpenAI HTTP stream works. Thanks @vincentkoc. - Plugins/update: repair missing plugin-local `openclaw` peer links before skipping unchanged npm plugin updates, so current external Codex installs can recover `openclaw/plugin-sdk/*` resolution during OTA repair. (#77544) Thanks @ProspectOre. - Discord/replies: treat failed final reply delivery as a failed turn instead of counting it as a delivered automatic visible reply, so guild/channel turns no longer show done when the final message was dropped. Fixes #77520. Thanks @Patrick-Erichsen. - Discord: prefer IPv4 for Discord REST and gateway WebSocket startup paths so IPv4-only networks no longer stall before Gateway READY and inbound message dispatch. Fixes #77398; refs #77526. Thanks @Beandon13. - Channels/plugins: key bundled package-state probes, env/config presence, and read-only command defaults by channel id instead of manifest plugin id, preserving setup and native-command detection for channel plugins whose package id differs from the channel alias. Thanks @vincentkoc. - Docker: prune package-excluded plugin dist directories from runtime images unless the build explicitly opts that plugin in, so official external plugins such as Feishu stay install-on-demand instead of shipping partial metadata without compiled runtime output. Fixes #77424. Thanks @vincentkoc. - Model switching: include the exact additive allowlist repair command when `/model ... --runtime ...` targets a blocked model, and make Telegram's model picker say that it changes only the session model while leaving the runtime unchanged. Thanks @vincentkoc. - Mattermost: clarify that the model picker only changes the session model and that runtime switches require `/oc_model --runtime `. Thanks @vincentkoc. - Doctor/config: keep active `auth.profiles` metadata intact when `doctor --fix` strips stale secret fields from configs, repairing legacy `:default` API-key profile metadata when model fallbacks or explicit `model@profile` refs still depend on it. Fixes #77400. - Doctor/plugins: include `plugins.allow`-only official plugin ids in the release configured-plugin repair set, so `doctor --fix` installs official external plugins that are configured but not yet loaded instead of removing them as stale allow entries. Fixes #77155. Thanks @hclsys. - Doctor/sessions: clear auto-created stale session routing state from the sessions store when `doctor --fix` sees plugin-owned model/runtime/auth/session bindings outside the current configured route, while leaving explicit user model choices for manual review. Refs #68615. - CLI/update: disable and skip plugins that fail package-update plugin sync, so a broken npm/ClawHub/git/marketplace plugin cannot turn a successful OpenClaw package update into a failed update result. Thanks @vincentkoc. - CLI/update: use an absolute POSIX npm script shell during package-manager updates, so restricted PATH environments can still run dependency lifecycle scripts while updating from `--tag main`. Fixes #77530. Thanks @PeterTremonti. - Diagnostics: grant the internal diagnostics event bus to official installed diagnostics exporter plugins, so npm-installed `@openclaw/diagnostics-prometheus` can emit metrics without broadening the capability to arbitrary global plugins. Fixes #76628. Thanks @RayWoo. - Browser: enforce strict SSRF current-URL checks before existing-session screenshots, matching existing-session snapshot handling. Thanks @vincentkoc. - Active Memory: give timeout partial transcript recovery enough abort-settle headroom so temporary recall summaries are returned before cleanup. Thanks @vincentkoc. - Gateway/chat: clear the active reply-run guard before draining queued same-session follow-up turns, so sequential `chat.send` calls no longer trip `ReplyRunAlreadyActiveError` every other request. Fixes #77485. Thanks @bws14email. - Agents/media: avoid sending generated image, video, and music attachments twice when streamed reply text arrives before the final `MEDIA:` directive. - CLI/sessions: cap `openclaw sessions` output to the newest 100 rows by default and add `--limit ` plus JSON pagination metadata, so repeated machine polling of large session stores cannot fan out into unbounded per-row enrichment/output work. Fixes #77500. Thanks @Kaotic3. - Doctor/config: restore legacy group chat config migrations for `routing.allowFrom`, `routing.groupChat.*`, and `channels.telegram.requireMention` so upgrades keep WhatsApp, Telegram, and iMessage group mention gates and history settings instead of leaving configs invalid or silently blocked. Thanks @scoootscooob. - CLI/update: make package-update follow-up processes write completion results and exit explicitly, so Windows packaged upgrades do not hang after the new package finishes post-core plugin work. Thanks @vincentkoc. - Release validation: skip Slack live QA unless Slack credentials are explicitly configured, so release gates can keep proving non-Slack surfaces while Slack is still local and credential-gated. Thanks @vincentkoc. - Plugins/update: treat OpenClaw CalVer correction versions like `2026.5.3-1` as satisfying base plugin API ranges, so correction builds can install plugins that require the base runtime API. Fixes #77293. (#77450) Thanks @p3nchan. - Discord/Gateway startup: retry Discord READY waits with backoff, defer startup `sessions.list` and native approval readiness failures until sidecars recover, and preserve component-only Discord payloads when final reply scrubbing removes all text. (#77478) Thanks @NikolaFC. - CLI/launcher: forward termination signals to compile-cache respawn children, so killing a wrapper process no longer leaves the security audit worker orphaned. Fixes #77458. Thanks @jaikharbanda. - Plugins/registry: recover managed-npm external plugins from the owned npm root when a stale persisted registry would otherwise hide them after package-manager upgrades. Fixes #77266. Thanks @p3nchan. - fix(gateway): clamp unbound websocket auth scopes [AI]. (#77413) Thanks @pgondhi987. - Diffs plugin: accept `defaults.ttlSeconds` as a plugin-wide artifact lifetime default, so LAN-viewable diff links can keep their configured six-hour TTL without doctor quarantining the plugin entry. (#77456) Thanks @VACInc. - Gate zalouser startup name matching [AI]. (#77411) Thanks @pgondhi987. - Active Memory: send a bounded latest-message search query to the recall worker so channel/runtime metadata does not become the memory search string. Fixes #65309. Thanks @joeykrug, @westley3601, @pimenov, and @tasi333. - Memory/QMD: report missing or invalid agent workspace directories as workspace probe failures in doctor/QMD availability checks instead of sending operators toward binary-install fixes. Fixes #63158. Thanks @sercada. - fix(device-pair): require pairing scope for pair command [AI]. (#76377) Thanks @pgondhi987. - Providers/OpenRouter: keep DeepSeek V4 `reasoning_effort` on OpenRouter-supported values, mapping stale `max` thinking overrides to `xhigh` so `openrouter/deepseek/deepseek-v4-pro` no longer fails with OpenRouter's invalid-effort 400. Fixes #77350. (#77423) Thanks @krllagent, @mushuiyu886, and @sallyom. - fix(qqbot): keep private commands off framework surface [AI]. (#77212) Thanks @pgondhi987. - Claude CLI: honor non-off `/think` levels by passing Claude Code's session-scoped `--effort` flag through the CLI backend seam, so chat bridges no longer show an inert thinking control. Fixes #77303. Thanks @Petr1t. - Agents/subagents: refresh deferred final-delivery payloads when same-session completion output changes, so retried parent notifications use the final child summary instead of stale progress text. Thanks @vincentkoc. - Agents/media: route async music and video completion results back through the requester agent, preserving automatic replies while requiring the message tool only for message-tool-only group/channel delivery. - active-memory: skip the memory sub-agent gracefully instead of logging a confusing allowlist error when no memory plugin (`memory-core` or `memory-lancedb`) is loaded, so active-memory with no memory backend no longer produces misleading "No callable tools remain" warnings in the gateway log. Fixes #77506. Thanks @hclsys. - Memory/wiki: preserve representation from both corpora in `corpus=all` searches while backfilling unused result capacity, so memory hits are not starved by numerically higher wiki integer scores. Fixes #77337. Thanks @hclsys. - Docker/compose: pin container-side `OPENCLAW_CONFIG_DIR` and `OPENCLAW_WORKSPACE_DIR` on both gateway and CLI services so the host paths written into `.env` by `scripts/docker/setup.sh` (used as Compose bind-mount sources) cannot leak into runtime code via the `env_file` import. Fixes regressions on macOS Docker setups where the first agent reply died with `EACCES: permission denied, mkdir '/Users'` because the host-style workspace path got persisted into `agents.defaults.workspace`. Fixes #77436. Thanks @lonexreb. - Telegram: clean up tool-only draft previews after assistant message boundaries so transient `Surfacing...` tool-status bubbles do not linger when no matching final preview arrives. Thanks @BunsDev. - Telegram: cool down repeatedly failing Bot API transport fallbacks so long polling stops hammering a blackholed Telegram route. Fixes #77900. Thanks @bryce-d-greybeard. - Slack: report `unknown error` instead of `undefined` in socket-mode startup retry logs and label the retry reason explicitly. - Telegram: let explicit forum-topic `requireMention` settings override persisted `/activate` and `/deactivate` state, so per-topic mention gates work consistently. Fixes #49864. Thanks @Panniantong. - Cron: surface failed isolated-run diagnostics in `cron show`, status, and run history when requested tools are unavailable, so blocked cron runs report the actual tool-policy failure instead of a misleading green result. Fixes #75763. Thanks @RyanSandoval. - TUI/escape abort: track the in-flight runId after `chat.send` resolves so pressing Esc during the gap before the first gateway event aborts the run instead of repeatedly printing `no active run`. Fixes #1296. Thanks @Lukavyi and @RomneyDa. - TUI/render: stop the long-token sanitizer from injecting literal spaces inside inline code spans, fenced code blocks, table borders, and bare hyphenated/dotted identifiers, so copied package names, entity IDs, and shell line-continuations stay byte-for-byte intact while narrow-terminal protection still chunks unidentifiable long prose tokens. Fixes #48432, #39505. Thanks @DocOellerson, @xeusoc, @CCcassiusdjs, @akramcodez, @brokemac79, @RomneyDa. - Plugin skills: publish plugin-declared skills through the generated plugin skills directory (`~/.openclaw/plugin-skills/`) while keeping direct prompt loading intact, so agent file-based discovery paths find plugin skill `SKILL.md` files and inactive plugin links are cleaned up. Fixes #77296. (#77328) Thanks @zhangguiping-xydt. - Gateway/status: label Linux managed gateway services as `systemd user`, making status output explicit about the user-service scope instead of implying a system-level unit. Thanks @vincentkoc. - Plugins/install: remove the previous managed plugin directory when a reinstall switches sources, so stale ClawHub and npm copies no longer keep duplicate plugin ids in discovery after the new install wins. Thanks @vincentkoc. - Plugins/install: let official plugin reinstall recovery repair source-only installed runtime shadows, so `openclaw plugins install npm:@openclaw/discord --force` can replace the bad package instead of stopping at stale config validation. Thanks @vincentkoc. - CLI/update: stage pnpm-detected npm-layout global package updates through a clean npm prefix swap, keep plugin install runtime imports behind a stable alias, and ship legacy install-runtime aliases back to `2026.3.22`, preventing stale overlay chunks from breaking plugin post-update sync. Thanks @vincentkoc. - Plugins/commands: allow the official ClawHub Codex plugin package to keep reserved `/codex` command ownership, matching the existing npm-managed Codex package behavior. Thanks @vincentkoc. - Auth/OpenAI Codex: rewrite invalidated per-agent Codex auth-order and session profile overrides toward a healthy relogin profile, so revoked OAuth accounts do not stay pinned after signing in again. Thanks @BunsDev. - Plugins/commands: scope QQBot framework slash commands to the QQBot channel so `/bot-*` command handlers and native specs do not leak onto unrelated chat surfaces. Thanks @vincentkoc. - fix: harden backend message action gateway routing [AI]. (#76374) Thanks @pgondhi987. - Gate QQBot streaming command auth [AI]. (#76375) Thanks @pgondhi987. - Plugins/discovery: ignore managed npm plugin packages that only expose TypeScript source entries without compiled runtime output, so stale/broken installs cannot hide a working bundled or reinstallable channel plugin during setup. Thanks @vincentkoc. - CLI/update: treat OpenClaw stable correction versions like `2026.5.3-1` as newer than their base stable release, so package updates no longer ask for downgrade confirmation. Thanks @vincentkoc. - Plugins/install: suppress dangerous-pattern scanner warnings for trusted official OpenClaw npm installs, so installing `@openclaw/discord` no longer prints credential-harvesting warnings for the official package. Thanks @vincentkoc. - Plugins/commands: suppress dangerous-pattern scanner warnings for trusted catalog npm installs from owner-gated `/plugins install` commands, so chat-driven installs match the CLI install trust path. Thanks @vincentkoc. - Plugins/release: make the published npm runtime verifier reject blank `openclaw.runtimeExtensions` entries instead of treating them as absent and passing via inferred outputs. Thanks @vincentkoc. - Plugins/security: ignore inline and block comments when matching source-rule context in plugin install scans, so comment-only `fetch`/`post` references near environment defaults do not block clean plugins. Thanks @vincentkoc. - Doctor/plugins: remove stale managed install records for bundled plugins even when the bundled plugin is not explicitly configured, so doctor cleanup cannot leave orphaned install metadata behind. Thanks @vincentkoc. - Web fetch: scope provider fallback cache entries by the selected fetch provider so config reloads cannot reuse another provider's cached fallback payload. Thanks @vincentkoc. - Web search: honor late-bound `tools.web.search.enabled: false` during tool execution so config reloads cannot leave an already-created `web_search` tool runnable. Thanks @vincentkoc. - Plugins/packages: reject inferred built runtime entries that exist but fail package-boundary checks instead of falling back to TypeScript source for installed packages. Thanks @vincentkoc. - Plugins/loader: do not retry native-loaded JavaScript plugin modules through the source transformer after native evaluation has already reached a missing dependency, avoiding duplicate top-level side effects. Thanks @vincentkoc. - Plugins/packages: reject blank `openclaw.runtimeExtensions` entries instead of silently ignoring them and falling back to inferred TypeScript runtime entries. Thanks @vincentkoc. - Doctor/plugins: remove stale managed npm plugin shadow entries from the managed package lock as well as `package.json` and `node_modules`, so future npm operations do not keep referencing repaired bundled-plugin shadows. Thanks @vincentkoc. - Plugins/runtime state: keep the key being registered when namespace eviction runs in the same millisecond as existing entries, so `register` and `registerIfAbsent` do not report success while evicting their own fresh value. Thanks @vincentkoc. - Plugins/providers: make bundled provider discovery honor restrictive `plugins.allow` by default for new configs, while doctor migrates legacy restrictive allowlist configs to `plugins.bundledDiscovery: "compat"` to preserve upgrade behavior. Thanks @dougbtv. - Control UI/Talk: make failed Talk startup errors dismissable and clear the stale Talk error state when dismissed, so missing realtime voice provider configuration does not leave a permanent chat banner. Fixes #77071. Thanks @ijoshdavis. - Control UI/Talk: stop and clear failed realtime Talk sessions when dismissing runtime error banners, so the next Talk click starts a fresh session instead of only stopping the stale one. Thanks @vincentkoc. - Control UI/Talk: retry from a failed realtime Talk session on the next Talk click instead of requiring a separate stale-session stop click first. Thanks @vincentkoc. - Canvas host: preserve the Gateway TLS scheme in browser canvas host URLs and startup mount logs, so direct HTTPS gateways do not advertise insecure canvas links. Thanks @vincentkoc. - WhatsApp/login: route login success and failure messages through the injected runtime, so setup/onboarding surfaces capture all login output instead of only the QR. Thanks @vincentkoc. - Google Chat: create an isolated Google auth transport per auth client, so google-auth-library interceptor mutations do not accumulate across webhook verification and access-token clients. Thanks @vincentkoc. - Doctor/plugins: remove orphaned or recovered managed npm copies of bundled `@openclaw/*` plugins during `doctor --fix`, so stale package manifests cannot shadow the current bundled plugin config schema. - Control UI/performance: cap long-task and long-animation-frame diagnostics in the shared event log, so slow-render telemetry does not evict gateway/plugin events from the Debug and Overview views. Thanks @vincentkoc. - Gateway/startup: log the canvas host mount only after the HTTP server has bound, so startup logs no longer report the canvas host as mounted before it can serve requests. - Control UI/i18n: render the Sessions active filter tooltip with the configured minute count in every locale and make the i18n check reject placeholder drift. Thanks @BunsDev. - Web fetch: late-bind `web_fetch` config and provider fallback metadata from the active runtime snapshot, matching `web_search` so long-lived tools do not use stale fetch provider settings. Thanks @vincentkoc. - Discord: clear stale startup probe bot/application status when the async bot probe throws, not just when it returns a degraded probe result. Thanks @vincentkoc. - Web search: scope explicit bundled `web_search` provider runtime loading through manifest ownership, so selecting DuckDuckGo/Gemini/etc. does not import unrelated bundled providers or log their optional dependency failures. Thanks @vincentkoc. - Plugins/discovery: demote the source-only TypeScript runtime check on already-installed `origin: "global"` plugin packages from a config-blocking error to a warning and let the runtime fall through to the TypeScript source via jiti, so a single broken installed package no longer blocks `plugins install` for unrelated plugins; install-time rejection of newly-installed source-only packages is unchanged. Thanks @RomneyDa. - Providers/OpenAI Codex: stop the OAuth progress spinner before showing the manual redirect paste prompt, so callback timeouts do not spam `Browser callback did not finish` across terminals. - Providers/OpenAI Codex: fail closed on malformed `/codex` control commands and diagnostics confirmations before changing bindings, permissions, model overrides, active turns, or feedback uploads. Thanks @vincentkoc. - Providers/OpenAI Codex: sanitize Codex app-server command readouts, failure replies, approval prompts, elicitation prompts, and `request_user_input` text before posting them back into chat. Thanks @vincentkoc. - Providers/OpenAI Codex: preserve local bound-turn image paths, reject stale same-thread turn notifications, enforce option-only user input prompts, and return failed dynamic tool results to Codex as unsuccessful tool calls. Thanks @vincentkoc. - Providers/DeepSeek: expose DeepSeek V4 `xhigh` and `max` thinking levels through the lightweight provider-policy surface, so Control UI `/think` pickers keep showing the max reasoning options when the runtime plugin registry is not active. Fixes #77139. Thanks @bittoby. - Release/beta smoke: resolve the dispatched Telegram beta E2E run from `gh run list` when `gh workflow run` returns no run URL, so the maintainer helper does not fail immediately after dispatch. Thanks @vincentkoc. - Media/images: keep HEIC/HEIF attachments fail-closed when optional Sharp conversion is unavailable instead of sending originals that still need conversion. Thanks @vincentkoc. - Google Meet: fork the caller's current agent transcript into agent-mode meeting consultant sessions, so Meet replies inherit the context from the tool call that joined the meeting. - iOS/mobile pairing: reject non-loopback `ws://` setup URLs before QR/setup-code issuance and let the iOS Gateway settings screen scan QR codes or paste full setup-code messages. Thanks @BunsDev. - Control UI: keep Gateway Access inputs and locale picker contained inside the card at narrow and tablet widths. - Agents/trajectory: bound runtime trajectory capture and yield queued sidecar writes so oversized traces stop recording instead of monopolizing Gateway cleanup. Fixes #77124. Thanks @loyur. - Telegram/streaming: sanitize tool-progress draft preview backticks before shared compaction, so long backtick-heavy progress text still renders inside the safe code-formatted preview instead of collapsing to an ellipsis. - UI/chat: remove the unsupported `line-clamp` declaration from the chat queue text rule to eliminate Firefox console noise without changing visible truncation behavior. Thanks @ZanderH-code. - Control UI: add explicit feedback for repeated actions by announcing session switches, flashing the active session selector, showing inline Save/Apply/Update progress, and distinguishing filtered-empty session lists from genuinely empty session stores. Thanks @BunsDev. - Agents/Pi: suppress persistence for synthetic mid-turn overflow continuation prompts, so transcript-retry recovery does not write the "continue from transcript" prompt as a new user turn. Thanks @vincentkoc. - Agents/tools: strip reasoning text from visible rich presentation titles, blocks, buttons, and select labels before message-tool sends, so structured channel payloads cannot leak hidden planning. Thanks @vincentkoc. - Telegram: keep reply-dispatch lazy provider runtime chunks behind stable dist names and delete `/reasoning stream` previews after final delivery so package updates and live reasoning drafts do not leave Telegram turns broken or noisy. Thanks @BunsDev. - Discord: start the gateway monitor without waiting for the startup bot/application probe, so WSL2 hosts with a slow `/users/@me` REST path still bring the channel online while status enrichment finishes asynchronously. Fixes #77103. Thanks @Suited78. - Exec approvals: detect `env -S` split-string command-carrier risks when `-S`/`-s` is combined with other env short options, so approval explanations do not miss split payloads hidden behind `env -iS...`. Thanks @vincentkoc. - Google Meet: log the concrete agent-mode TTS provider, model, voice, output format, and sample rate after speech synthesis, so Meet logs show which voice backend spoke each reply. - Voice Call: mark realtime calls completed when the realtime provider closes normally, so Twilio/OpenAI/Google realtime stop events do not leave active call records behind. Thanks @vincentkoc. - Gateway/update: keep the shutdown close path behind a stable runtime chunk and ship compatibility aliases for recent `server-close-*` hashes, so manual npm package replacement cannot leave an already-running Gateway unable to shut down cleanly. Fixes #77087. Thanks @westlife219. - Control UI/media: mint short-lived scoped tickets for assistant media fetches and render ticketed URLs instead of exposing long-lived auth tokens in chat image URLs. Fixes #70830 and #77097. Thanks @hclsys. - Exec approvals: treat POSIX `exec` as a command carrier for inline eval, shell-wrapper, and eval/source detection, so approval explanations and command-risk checks do not miss payloads hidden behind `exec`. Thanks @vincentkoc. - Google Meet: log the resolved audio provider model when starting Chrome and paired-node Meet talk-back bridges, so agent-mode joins show the STT model and bidi joins show the realtime voice model. - Diagnostics: handle missing session-tail files in cron recovery context without tripping extension test typecheck. Thanks @vincentkoc. - QA/Slack: update the Slack dispatch preview fallback test SDK mock for structured progress draft helpers, so the rich progress draft regression suite covers the new imports instead of failing before assertions run. Thanks @vincentkoc. - Release validation: allow focused QA live reruns to select Matrix and Telegram without running Slack, so known Slack credential-pool outages do not block non-Slack live proof. Thanks @vincentkoc. - Plugins/loader: keep bundled plugin package `test-api.js` aliases behind private QA mode, so source transforms do not expose test-only public surfaces during normal plugin loading. Thanks @vincentkoc. - Gateway/startup: start cron and record the post-ready memory trace even when deferred maintenance timers fail after readiness, so a non-fatal timer setup issue does not silently leave scheduled jobs idle. Thanks @vincentkoc. - Exec approvals: unwrap BSD/macOS `env -P ` carrier commands before approval-command and strict inline-eval checks, so `/approve` shell execution and inline interpreter payloads are still blocked behind that env form. - Agents/session status: keep semantic `session_status({ sessionKey: "current" })` on the live run session even before that run has a persisted session-store entry, instead of falling back to the sandbox policy key. Thanks @vincentkoc. - QA/Slack: resolve bundled official plugin public-surface package aliases during source-mode QA runs, so release Slack live validation can load `@openclaw/slack/api.js` without workspace symlinks. Thanks @vincentkoc. - Codex: pass the live run session key into app-server dynamic tools when sandbox policy uses a separate session key, so `session_status({ sessionKey: "current" })` reports the active run instead of the sandbox policy key. Thanks @vincentkoc. - Web search: keep first-class assistant `web_search` auto-detect and configured runtime providers visible when active runtime metadata or the active plugin registry is incomplete. Fixes #77073. Thanks @joeykrug. - Plugins/tools: mark manifest-optional sibling tools as optional even when they come from a shared non-optional factory, so cached/status/MCP metadata keeps opt-in tool policy accurate. Thanks @vincentkoc. - Matrix: keep `streaming.progress.toolProgress` scoped to progress draft mode, so partial and quiet Matrix previews do not lose tool progress unless `streaming.preview.toolProgress` is disabled. Thanks @vincentkoc. - Gateway/validation: isolate gateway server validation files, ignore unrelated startup logs in request-trace coverage, and fail fast on stuck shared-auth sockets, reducing false main-branch CI failures for contributors. Thanks @amknight. - Channels/streaming: keep `streaming.progress.toolProgress` scoped to progress draft mode, so disabling compact progress lines does not silence partial/block preview tool updates. Thanks @vincentkoc. - Plugins/update: treat OpenClaw stable correction versions like `2026.5.3-1` as stable releases for npm installs, plugin updates, and bundled-version comparisons, so `latest` can advance official plugins without prerelease opt-in. Thanks @vincentkoc. - Control UI: point the Appearance tweakcn browse action and docs at the live tweakcn editor route instead of the removed `/themes` page. Fixes #77048. - Control UI: render Dream Diary prose through the sanitized markdown pipeline, so diary bold/italic/header markdown no longer appears as literal source text. Fixes #62413. - Control UI: render tool results whose output arrives as text-block arrays and give expanded tool output a scrollable block, so read/exec output remains visible in WebChat. Fixes #77054. - MCP: include serialized conversation/message payloads in the primary text content for `conversations_list` and `messages_read`, while preserving `structuredContent` for capable clients. Fixes #77024. - Media: treat `EPERM` from the post-write media fsync step as best-effort, allowing WebChat and channel uploads to finish on Windows filesystems that reject `fsync` after a successful write. Fixes #76844. - Media/Telegram: send in-limit original images when optional image optimization is unavailable, so Telegram MEDIA replies and message-tool image sends do not fail just because `sharp` is missing. Fixes #77081. (#77117) Thanks @pfrederiksen. - Diagnostics: include last progress, cron job/run ids, stopped cron job name, and the last assistant transcript snippet in stalled-session and stuck-session recovery logs so cron stalls show what was stopped. - Streaming channels: add `streaming.preview.commandText: "status"` / `streaming.progress.commandText: "status"` to hide command/exec text in preview progress lines while keeping the released raw command text default. Fixes #77072. - Agents/cron: let explicit cron `timeoutSeconds` drive both CLI no-output and embedded LLM idle watchdogs instead of being capped by resume defaults. Fixes #76289. - Plugins/catalog: suppress missing `channelConfigs` compatibility diagnostics for external channel plugins that are disabled, denied, or outside a restrictive allowlist. Fixes #76095. - Diagnostics: keep webhook/message OTEL attributes and Prometheus delivery labels low-cardinality and omit raw chat/message IDs from spans, so progress-draft and message-tool modes do not leak high-cardinality messaging identifiers. - Google Meet: stop advertising legacy `mode: "realtime"` to agents and config UIs, while keeping it as a hidden compatibility alias for `mode: "agent"`, so new joins use the STT -> OpenClaw agent -> TTS path instead of selecting the direct realtime voice fallback. - Google Meet: add `chrome.audioBufferBytes` for generated command-pair SoX audio commands and lower the default buffer from SoX's 8192 bytes to 4096 bytes to reduce Chrome talk-back latency. - Google Meet: split realtime provider config into agent-mode transcription and bidi-mode voice providers, and migrate legacy Gemini Live bidi configs with `doctor --fix`, so Gemini Live can back direct bidi fallback without breaking the default OpenClaw agent talk-back path. - Google Meet: keep waiting for the Meet microphone to unmute during join intro readiness instead of permanently skipping talk-back when Meet briefly reports the local mic as muted. - Google Meet: expose `voiceCall.postDtmfSpeechDelayMs` in the plugin manifest schema and setup hints, so manifest-based config editing accepts the runtime-supported Twilio delay key. Thanks @vincentkoc. - Google Meet: keep explicit non-Google `realtime.provider` values as the transcription provider compatibility fallback when `realtime.transcriptionProvider` is unset. Thanks @vincentkoc. - Google Meet: make Twilio setup status require an enabled `voice-call` plugin entry instead of treating a missing entry as ready. Thanks @vincentkoc. - Telegram: render shared interactive reply buttons in reply delivery so plugin approval messages show inline keyboards. (#76238) Thanks @keshavbotagent. - Cron/sessions: keep cron metadata rows without an on-disk transcript non-resumable until a transcript exists, so doctor and `sessions cleanup --fix-missing` no longer report or prune pre-transcript cron rows as broken sessions. Refs #77011. - OpenAI Codex: recreate missing bound app-server threads once when a stale `/codex bind` sidecar survives a restart, preserving the selected auth profile and turn overrides before retrying the inbound turn. (#76936) Thanks @keshavbotagent. - Agents/cli-runner: drop a saved `claude-cli` resume sessionId at preparation time when its on-disk transcript no longer exists in `~/.claude/projects/`, so a stale binding from a half-installed `update.run` cannot trap follow-up runs (auto-reply / Telegram direct) in a `claude --resume` timeout loop; the run starts fresh and the new sessionId is written back through the existing post-run flow. (#77030; refs #77011) Thanks @openperf. - Release validation: install the cross-OS TypeScript harness through Windows-safe Node/npm shims so native Windows package checks reach the OpenClaw smoke suites instead of exiting before artifact capture. Thanks @vincentkoc. - Release validation: let Windows packaged-upgrade checks continue after the shipped 2026.5.2 updater hits its native-module swap cleanup fallback, verifying the fallback-installed candidate through package metadata and downstream smoke instead of crashing on the immediate update-status probe. Thanks @vincentkoc. - Doctor/plugins: skip channel-derived official plugin installs when another configured plugin is the effective owner for the same channel, so `doctor --repair` does not reinstall `feishu` while `openclaw-lark` handles `channels.feishu`. Fixes #76623. Thanks @fuyizheng3120. - Gateway/sessions: memoize repeated thinking-option enrichment and skip unused cost fallback checks while listing sessions, reducing per-row work on large multi-agent stores. Fixes #76931. - Gateway/sessions: bound default `sessions.list` RPC responses and report truncation metadata, preventing Slack-heavy long-lived stores from forcing unbounded Gateway row construction. Fixes #77062. - Agents/tools: use config-only runtime snapshots for plugin tool registration and live runtime config getters, avoiding expensive full secrets snapshot clones on the core-plugin-tools prep path. Fixes #76295. - Agents/tools: honor the effective tool denylist before constructing optional PDF/media tool factories, so `tools.deny: ["pdf"]` skips PDF setup before later policy filtering. Fixes #76997. - MCP/plugin tools: apply global `tools.profile`, `tools.alsoAllow`, and `tools.deny` policy while exposing plugin tools over the standalone MCP bridge, so ACP clients do not see policy-hidden plugin tools or miss opt-in optional tools. Thanks @vincentkoc. - Plugin tools: honor explicit tool denylists while selecting plugin tool runtimes, so denied plugin tools are not materialized for direct command or gateway surfaces before later policy filtering. Thanks @vincentkoc. - Plugin tools: filter factory-returned tools by manifest per-tool optional policy, so optional sibling tools from a shared runtime factory stay hidden unless explicitly allowed. Thanks @vincentkoc. - Agents/transcripts: retry context-overflow compaction from the current transcript only after the inbound user turn was actually persisted, and keep WebChat agent-run live delivery from writing duplicate Pi-managed assistant turns. Fixes #76424. (#77033) - Agents/bootstrap: keep pending `BOOTSTRAP.md` and bootstrap truncation notices in system-prompt Project Context instead of copying setup text or raw warning diagnostics into WebChat user/runtime context. Fixes #76946. - Gateway/install: keep `.env`-managed values in the macOS LaunchAgent env file while still tracking `OPENCLAW_SERVICE_MANAGED_ENV_KEYS`, so regenerated services do not boot without managed auth/provider keys. Fixes #75374. - Gateway/restart: verify listener PIDs by argv when `lsof` reports only the Node process name, so stale gateway cleanup can find macOS `cnode` listeners. Fixes #70664. - Gateway/logging: expand leading `~` in `logging.file` before creating the file logger, preventing startup crash loops for home-relative log paths. Fixes #73587. - Channels/CLI: keep `openclaw channels list --json` usable when provider usage fetching fails, and report per-provider usage errors without aborting the channel list. Refs #67595. - Doctor/plugins: do not treat `plugins.allow` entries as configured plugins during missing-plugin repair, so restrictive allowlists no longer install allowed-but-unused plugins. Thanks @vincentkoc. - Agents/messaging: deliver distinct final commentary after same-target `message` tool sends while still deduping text/media already sent by the tool, so short closing remarks are no longer silently dropped. Fixes #76915. Thanks @hclsys. - Agents/messaging: preserve string thread IDs when matching message-tool reply dedupe routes, avoiding precision loss on numeric-looking topic IDs before channel plugin comparison. Thanks @vincentkoc. - Channels/streaming: honor `agents.defaults.toolProgressDetail: "raw"` in Slack, Discord, Telegram, Matrix, and Microsoft Teams progress drafts, so tool-start lines include raw command/detail output when debugging. Thanks @vincentkoc. - Channels/streaming: strip unmatched inline-code backticks from compacted raw progress draft lines, avoiding stray markdown markers after long command details are shortened. Thanks @vincentkoc. - Discord/Slack/Mattermost: align draft preview tool-progress config help with the runtime behavior that hides interim tool updates when `streaming.preview.toolProgress` is false. Thanks @vincentkoc. - Feishu: use the shared channel progress formatter for streaming-card tool status lines, including raw command/detail output and message-tool filtering. Thanks @vincentkoc. - Mattermost: use the shared progress draft formatter for tool status previews, including raw command/detail output when `agents.defaults.toolProgressDetail: "raw"` is enabled. Thanks @vincentkoc. - Mattermost: suppress standalone default tool-progress messages while draft previews are active, including when draft tool lines are disabled. Thanks @vincentkoc. - Telegram: deliver button-only interactive replies by sending the shared fallback button-label text with the inline keyboard instead of dropping the reply as empty. Thanks @vincentkoc. - OpenAI Codex: honor `auth.order.openai-codex` when starting app-server clients without an explicit auth profile, so status/model probes and implicit startup use the configured Codex account instead of falling back to the default profile. Thanks @vincentkoc. - OpenAI Codex: let SSRF-guarded provider requests inherit OpenClaw's undici IPv4/IPv6 fallback policy, so ChatGPT-backed Codex runs recover on IPv4-working hosts when DNS still returns unreachable IPv6 addresses. Fixes #76857. Thanks @jplavoiemtl and @SymbolStar. - Plugin updates: do not short-circuit trusted official npm updates as unchanged when the default/latest spec still resolves to an already-installed prerelease that the installer should replace with a stable fallback. Thanks @vincentkoc. - Plugin updates: clean stale bundled load paths for already-externalized npm installs whose legacy install record only preserved the resolved package name. Thanks @vincentkoc. - Plugin tools: keep auth-unavailable optional tools hidden even when another default tool from the same plugin is available and `tools.alsoAllow` names the optional tool. Thanks @vincentkoc. - Realtime transcription: report socket closes before provider readiness as closed-before-ready failures instead of mislabeling them as connection timeouts for OpenAI, xAI, and Deepgram streaming transcription. Thanks @vincentkoc. - OpenAI/Google Meet: fail realtime voice connection attempts when the socket closes before `session.updated`, avoiding stuck Meet joins waiting on a bridge that never became ready. Thanks @vincentkoc. - Google Meet: avoid treating repeated participant words as multiple assistant-overlap matches when suppressing realtime echo transcripts. Thanks @vincentkoc. - Google Meet: make `mode: "agent"` the default Chrome talk-back path, using realtime transcription for input and regular OpenClaw TTS for speech output, while keeping direct realtime voice answers available as `mode: "bidi"` and accepting `mode: "realtime"` as an agent-mode compatibility alias. - Codex harness: keep `codex_app_server.*` telemetry publication owned by the harness instead of republishing the same callback event from core runners. Thanks @vincentkoc. - Slack/Discord: suppress standalone tool-progress chatter when partial preview streaming has `streaming.preview.toolProgress: false`, matching the documented quiet-preview behavior. Thanks @vincentkoc. - Matrix: bind native approval reaction targets before publishing option reactions, so fast approver reactions on threaded prompts are not dropped while the approval handler finishes setup. Thanks @vincentkoc. - Google Meet: make realtime talk-back agent-driven by default with `realtime.strategy: "agent"`, keep the previous direct bidirectional model behavior available as `realtime.strategy: "bidi"`, route the Meet tab speaker output to `BlackHole 2ch` automatically for local Chrome realtime joins, coalesce nearby speech transcript fragments before consulting the agent, and avoid cutting off agent speech from server VAD or stale playback pipe errors. - Google Meet: suppress queued assistant playback and assistant-like transcript echoes from the realtime input path, so the meeting does not hear the agent's own speech as a new user turn and loop or cut itself off. - Google Meet: keep Chrome realtime transport tests hermetic on Linux prerelease shards while preserving the macOS-only runtime guard. Thanks @vincentkoc. - QA/Matrix: let the live tool-progress preview and error checks verify progress replacement events without depending on the preview saying `Working`, `tool: read`, an unlabelled/pathless `read from`, or the original draft root being observed. Thanks @vincentkoc. - QA/Matrix: keep the target=both approval scenario focused on channel and DM metadata delivery by resolving the accepted approval through the gateway after both Matrix events are observed. Thanks @vincentkoc. - QA/Matrix: wait for live approval reactions to echo before starting the threaded approval decision timeout. Thanks @vincentkoc. - QA/Matrix: reuse the primed driver sync stream when confirming approval reaction echoes, avoiding missed self-reactions in live release runs. Thanks @vincentkoc. - Channels/WhatsApp: apply the shared group/channel visible-reply mode during inbound dispatch so group replies stay message-tool-only by default without overriding direct-chat harness defaults. Refs #75178 and #67394. Thanks @scoootscooob. - Plugins/Codex: preserve Codex-native OAuth routing for `/codex bind` app-server turns so bound sessions keep the selected Codex auth profile instead of falling back to public OpenAI credentials. (#76714) Thanks @keshavbotagent. - Telegram: keep status checks pointed at the active chat so asking for the current session no longer reports an old direct-message conversation. (#76708) Thanks @amknight. - Gateway/install: prefer supported system Node over nvm/fnm/volta/asdf/mise when regenerating managed gateway services, so `gateway install --force` no longer recreates service definitions that doctor immediately flags as version-manager-backed. Fixes #76339. Thanks @brokemac79 and @BunsDev. - Google Chat: normalize Google auth certificate response headers before google-auth-library reads cache-control, so inbound webhook auth no longer rejects with `res?.headers.get is not a function`. Fixes #76880. Thanks @donbowman. - WhatsApp: route terminal login QR output through the active runtime for initial and restart sockets, so `openclaw channels login --channel whatsapp` does not lose the QR behind direct stdout writes. Fixes #76213. Thanks @dougvk. - Proxy/debugging: disable debug proxy direct upstream forwarding for proxy requests and CONNECT tunnels while managed proxy mode is active unless `OPENCLAW_DEBUG_PROXY_ALLOW_DIRECT_CONNECT_WITH_MANAGED_PROXY=1` is explicitly set for approved local diagnostics. Thanks @jesse-merhi and @mjamiv. - Direct APNs: route direct HTTP/2 delivery through the active managed proxy with redacted proxy diagnostics, so push requests honor configured egress controls and `openclaw proxy validate --apns-reachable` can prove APNs is reachable through the proxy before deployment. (#74905) Thanks @jesse-merhi. - Agents/subagents: detect prefix-only completion announce replies and fall back to the captured child result so requester chats no longer lose most of long sub-agent reports silently. Fixes #76412. Thanks @inxaos and @davemorin. - TUI: replace the stale-response watchdog notice with plain user-facing copy so stalled replies no longer surface backend or streaming internals. (#77120) Thanks @davemorin. - Security/Windows: validate `SystemRoot`/`WINDIR` env values through the Windows install-root validator and add them to the dangerous-host-env policy when resolving `icacls.exe`/`whoami.exe` for `openclaw security audit`, so workspace `.env` overrides and bare command names cannot redirect Windows ACL helpers to attacker-controlled binaries. (#74458) Thanks @mmaps. - Security/Windows: pin Windows registry-probe `reg.exe` resolution to the canonical Windows install root in install-root probing, so `SystemRoot`/`WINDIR` env overrides cannot redirect registry queries during Windows host detection. (#74454) Thanks @mmaps. - QQBot: preserve the framework command authorization decision when converting framework command contexts into engine slash command contexts, so downstream slash handlers see `commandAuthorized` matching the channel's resolved `isAuthorizedSender` instead of a hardcoded `true`. (#77453) Thanks @drobison00. - Security/Windows: block `LOCALAPPDATA` from workspace `.env` and resolve Windows update-flow portable Git path prepends from the trusted process-local `LOCALAPPDATA` only, so workspace-supplied values cannot redirect `git` discovery during `openclaw update`. (#77470) Thanks @drobison00. - Browser/SSRF: enforce the existing current-tab URL navigation policy before tab-scoped debug, export, and read routes (console, page errors, network requests, trace start/stop, response body, screenshot, snapshot, storage, etc.) collect from an already-selected tab, so blocked tabs return a policy error instead of being read first and redacted only at response time. (#75731) Thanks @eleqtrizit. - Security/Windows: route the `.cmd`/`.bat` process wrapper through the shared Windows install-root resolver instead of `process.env.ComSpec`, so workspace dotenv-blocked `SystemRoot`/`WINDIR` overrides and unsafe values like UNC paths or path-lists cannot redirect `cmd.exe` selection on Windows. (#77472) Thanks @drobison00. - Agents/bootstrap: honor `BOOTSTRAP.md` content injected by `agent:bootstrap` hooks when deciding whether bootstrap is pending, so hook-provided required setup instructions are included in the system prompt. (#77501) Thanks @ificator. ## 2026.5.3-1 ### Fixes - Plugins/security: stop the install scanner from blocking official bundled plugin packages when `process.env` access and normal API sends only appear in distant parts of the same compiled bundle. Thanks @vincentkoc. ## 2026.5.3 ### Highlights - Plugins/file-transfer: add bundled file-transfer plugin with `file_fetch`, `dir_list`, `dir_fetch`, and `file_write` agent tools for binary file ops on paired nodes; default-deny per-node path policy under `plugins.entries.file-transfer.config.nodes` with operator approval, symlink traversal refused by default (opt-in `followSymlinks`), and a 16 MB byte ceiling per round-trip. (#74742) Thanks @omarshahine. - Plugins/install: harden official plugin install, uninstall, update, onboarding, ClawHub fallback, npm dependency-state reporting, and beta-channel update paths so externalized plugins behave like first-class package installs. - Gateway/performance: trim startup and Control UI hot paths by lazy-loading plugin/runtime discovery, cron, schema, shutdown, sessions, and model metadata work only when needed. - Channels/replies: improve Discord status reactions and degraded transport reporting, add WhatsApp Channel/Newsletter targets, and tighten Telegram, Feishu, Matrix, Microsoft Teams, and Slack delivery/recovery behavior. - Install/update: recover broken macOS LaunchAgent upgrades, reject source-only plugin packages before runtime load, and repair stale Gateway/plugin state during updates and doctor runs. - Agent/runtime reliability: preserve streamed provider replies, delayed A2A session replies, prompt/tool delivery, memory recall, web search provider discovery, and provider-specific thinking/model metadata across common edge cases. ### Changes - Channels/streaming: add unified `streaming.mode: "progress"` drafts with auto single-word status labels and shared progress configuration across Discord, Telegram, Matrix, Slack, and Microsoft Teams. - Agents/commands: add `/steer ` for queue-independent steering of the active current-session run without starting a new turn when the session is idle. (#76934) - Tools/BTW: add `/side` as a text and native slash-command alias for `/btw` side questions. - Doctor/config: `doctor --fix` now commits safe legacy migrations even when unrelated validation issues (e.g. a missing plugin) prevent full validation from passing, so `agents.defaults.llm` and other known-legacy keys are always cleaned up by `doctor --fix` regardless of other config problems. Fixes #76798. (#76800) Thanks @hclsys. - Agents/tools: skip optional media and PDF tool factories when the effective tool denylist already blocks them, avoiding unnecessary hot-path setup for tools that will be filtered out before model use. (#76773) Thanks @dorukardahan. - Agents/compaction: ignore pre-usage transcript metadata bytes when stale token snapshots estimate preflight compaction pressure, while still counting post-usage transcript tail pressure. Fixes #78604. Thanks @amknight. - Discord/status: let explicit reaction tool calls opt into tracking subsequent tool progress on the reacted message with `trackToolCalls: true`, and use the shared tool display emoji table for status reactions. - Gateway/config: stop Gateway startup and hot reload from auto-restoring invalid config; invalid config now fails closed and `openclaw doctor --fix` owns last-known-good repair. - Gateway/performance: lazy-load early runtime discovery and shutdown-hook helpers, defer maintenance timers until after readiness, and trim duplicate plugin auto-enable work during Gateway startup. - QA/Mantis: add a `pnpm openclaw qa mantis discord-smoke` runner and manual GitHub workflow that verify the Mantis Discord bot can see the configured guild/channel, post a smoke message, add a reaction, and upload artifacts. - QA/Slack: add a Slack live transport QA runner with canary and mention-gating coverage for the private bot-to-bot harness. Thanks @vincentkoc. - Plugins/onboarding: let Manual setup install optional official plugins, including ClawHub-backed diagnostics with npm fallback, and expose the external Codex plugin as a selectable provider setup choice. Thanks @vincentkoc. - Plugins/CLI/update: include package dependency install state in `openclaw plugins list --json`, trust official externalized npm migrations, clean stale bundled load paths for externalized installs, try plugin `@beta` updates first on the beta OpenClaw channel, and fall back to default/latest when no plugin beta release exists. - Plugins/ClawHub: annotate 429 errors with reset windows and unauthenticated higher-rate-limit hints, so operators can tell when downloads recover and when signing in helps. Thanks @RomneyDa. - Gateway/performance: lazy-load early runtime discovery, shutdown hooks, cron, channel-config schema metadata, restart sentinels, and maintenance timers after readiness; trim duplicate plugin auto-enable work and add startup CPU/profile controls. - Gateway/config: stop Gateway startup and hot reload from auto-restoring invalid config; invalid config now fails closed and `openclaw doctor --fix` owns last-known-good repair. - Discord/status: let explicit reaction tool calls opt into tracking later tool progress with `trackToolCalls: true`, share tool display emoji mapping, and surface degraded Discord transport or gateway event-loop starvation in status output. (#76327) Thanks @joshavant. - Channels/WhatsApp: support explicit WhatsApp Channel/Newsletter `@newsletter` outbound message targets with channel session metadata instead of DM routing. Fixes #13417; carries forward the narrow outbound target idea from #13424. Thanks @vincentkoc and @agentz-manfred. - Agents/tools: skip optional media and PDF tool factories when the effective tool denylist already blocks them, avoiding unnecessary hot-path setup for tools that will be filtered out before model use. (#76773) Thanks @dorukardahan. - Agents/sandbox: store sandbox container and browser registry entries as per-runtime shard files, reducing unrelated session lock contention while `openclaw doctor --fix` migrates legacy monolithic registry files. (#74831) Thanks @luckylhb90. - Tools/BTW: add `/side` as a text and native slash-command alias for `/btw` side questions. - Exec approvals: add a tree-sitter-backed shell command explainer for future approval and command-review surfaces. (#75004) Thanks @jesse-merhi. - QA/Mantis: add a `pnpm openclaw qa mantis discord-smoke` runner and manual GitHub workflow that verify the Mantis Discord bot can see the configured guild/channel, post a smoke message, add a reaction, and upload artifacts. ### Fixes - Telegram: preserve URL inline keyboard buttons in shared presentation rendering. Fixes #76255. Thanks @clawSean. - Update: repair doctor-migratable legacy config before persisting `openclaw update --channel ...`, so old Slack/Telegram streaming keys do not block switching to beta after a package update. Thanks @vincentkoc. - Plugins/bundles: preserve explicit `activation` metadata from Codex, Cursor, and Claude bundle manifests in registry records, so bundle startup opt-outs are not treated as legacy implicit startup sidecars. (#75133) Thanks @100menotu001. - Web fetch: late-bind `web_fetch` config and provider fallback metadata from the active runtime snapshot, matching `web_search` so long-lived tools do not use stale fetch provider settings. Thanks @vincentkoc. - Plugins/discovery: demote the source-only TypeScript runtime check on already-installed `origin: "global"` plugin packages from a config-blocking error to a warning and let the runtime fall through to the TypeScript source via jiti, so a single broken installed package no longer blocks `plugins install` for unrelated plugins; install-time rejection of newly-installed source-only packages is unchanged. Thanks @RomneyDa. - Providers/OpenAI Codex: stop the OAuth progress spinner before showing the manual redirect paste prompt, so callback timeouts do not spam `Browser callback did not finish` across terminals. - Channels/WhatsApp: allow `@whiskeysockets/libsignal-node` in `onlyBuiltDependencies` so pnpm v9+ `blockExoticSubdeps` no longer rejects the baileys git-tarball subdep and silences all inbound agent replies. Fixes #76539. Thanks @ottodeng and @vincentkoc. - Gateway/systemd: preserve operator-added secrets in the Gateway env file across re-stage while clearing OpenClaw-managed keys (such as `OPENCLAW_GATEWAY_TOKEN`) so a fresh staging value is never shadowed by a stale env-file copy; operator secrets are also retained when the state-dir `.env` is empty. Fixes #76860. Thanks @hclsys. - Plugin updates: do not short-circuit trusted official npm updates as unchanged when the default/latest spec still resolves to an already-installed prerelease that the installer should replace with a stable fallback. Thanks @vincentkoc. - Plugin tools: keep auth-unavailable optional tools hidden even when another default tool from the same plugin is available and `tools.alsoAllow` names the optional tool. Thanks @vincentkoc. - Realtime transcription: report socket closes before provider readiness as closed-before-ready failures instead of mislabeling them as connection timeouts for OpenAI, xAI, and Deepgram streaming transcription. Thanks @vincentkoc. - OpenAI/Google Meet: fail realtime voice connection attempts when the socket closes before `session.updated`, avoiding stuck Meet joins waiting on a bridge that never became ready. Thanks @vincentkoc. - QA/cache: require the full `CACHE-OK ` marker before live cache probes stop retrying, so suffix-only prose cannot hide a broken probe response. Thanks @vincentkoc. - Slack/Matrix: avoid creating blank progress-draft messages when `streaming.progress.label=false` and progress tool lines are disabled. Thanks @vincentkoc. - QA/Matrix: keep the mock OpenAI tool-progress provider aligned with exact-marker Matrix prompts so the hardened live preview scenario still forces a deterministic read before final delivery. Thanks @vincentkoc. - OpenAI/Google Meet: wait for realtime voice `session.updated` before treating the bridge as connected, so Meet joins do not return with audio queued behind an unconfigured realtime session. Thanks @vincentkoc. - Plugins/catalog: merge official external catalog descriptors into partial package channel config metadata, so lagging WeCom/Yuanbao manifests keep their own schema while still exposing host-supplied labels and setup text. Thanks @vincentkoc. - Plugins/catalog: supplement lagging official external WeCom and Yuanbao npm manifests with channel config descriptors and declared tool contracts from the OpenClaw catalog, so trusted package sweeps no longer fail because external package metadata trails the host contract. Thanks @vincentkoc. - Plugins/install: let trusted official `@openclaw/*` catalog installs recover when npm `latest` points at a prerelease by falling back to the newest stable version, or by selecting the newest exact prerelease for prerelease-only launch packages with a warning instead of making beta/development plugin sweeps fail at install time. Thanks @vincentkoc. - Google Meet: grant Chrome media permissions against the actual Meet tab, start the local realtime audio bridge only after Meet joins, expose realtime transcripts in status/logs, and force explicit audio responses with current OpenAI realtime output-audio events so BlackHole capture does not keep the OpenClaw participant muted or silent. - Memory/LanceDB: declare `apache-arrow` in the bundled memory plugin package so LanceDB installs include its runtime peer. Fixes #76910. Thanks @afiqfiles-max. - CLI/devices: retry explicit device-pair approval with `operator.admin` after a pairing-scope ownership denial, so existing admin-capable paired-device tokens can recover new Control UI/browser pairing after upgrades instead of requiring manual JSON edits. Fixes #76956. Thanks @neo19482. - CLI/devices: stop local pairing fallback when the active Gateway names a pending request that is absent from the local pairing store, so profile or state-dir mismatches no longer make `openclaw devices list/approve` inspect the wrong store while a real device stays blocked. Thanks @vincentkoc. - Control UI/webchat: fix streaming assistant responses causing the chat viewport to scroll upward by guarding `handleChatScroll` against scroll events triggered by the auto-scroll logic itself; introduces a `chatIsProgrammaticScroll` flag that suppresses near-bottom state updates during programmatic `scrollTo` calls so streaming output stays pinned to the bottom. Thanks @nickmopen. - Google Meet: use the local call-control microphone button instead of disabled remote participant mute buttons, and block realtime speech when the OpenClaw Meet microphone remains muted. - Google Meet: refresh realtime browser state during status and retry delayed speech after Meet finishes joining, so a just-opened in-call tab no longer leaves speech stuck behind stale `not-in-call` health. - Plugins/install: recover the install ledger from the managed npm root when `plugins/installs.json` is empty or partial, so reinstalling Discord and Codex no longer makes the other installed plugin disappear. - Google Meet: grant Meet media permissions through the Playwright browser context when CDP grants do not affect the attached Chrome page, and report in-call microphone/speaker permission problems instead of marking realtime speech ready. - QA/Slack: fail the live mention-gating scenario on any unexpected SUT reply, even when the reply does not echo the expected marker. Thanks @vincentkoc. - QA/Matrix: steer the live tool-progress preview check away from `HEARTBEAT.md` and report final preview candidates when the live marker reply misses the exact token. Thanks @vincentkoc. - QA/Matrix: let the live tool-progress preview check verify progress replacement events without depending on the preview saying `Working`. Thanks @vincentkoc. - Tlon: expose `groupInviteAllowlist` in the channel config schema and clarify that group invite auto-accept fails closed without an invite allowlist. Thanks @vincentkoc. - Telegram: let forum-topic messages that omit `chat.is_forum` use per-topic processing lanes when Telegram still marks them as topic messages, and coalesce duplicate group typing cues so cosmetic Telegram API calls do not pile up ahead of real replies during topic bursts. - Control UI/WebChat: collapse duplicate in-flight internal text sends onto the active Gateway run so rapid repeat submits do not start fresh `agent:main:main` dispatches. Fixes #75737. Thanks @dsdsddd1 and @BunsDev. - Mattermost: accept the documented `channels.mattermost.streaming` config and honor `streaming: "off"` by disabling draft preview posts. Thanks @vincentkoc. - Mattermost: expose streaming progress config labels and help text in generated channel config metadata so Control UI/docs can explain the new `channels.mattermost.streaming.progress.*` fields. Thanks @vincentkoc. - Mattermost: honor `channels.mattermost.streaming.progress.toolProgress=false` in progress draft mode so compact tool status lines stay hidden until final delivery. Thanks @vincentkoc. - Microsoft Teams: honor progress draft tool lines in native Teams progress streams and suppress standalone tool messages when `channels.msteams.streaming.progress.toolProgress=false`. Thanks @vincentkoc. - Discord: keep progress draft boundary callbacks bound during streaming replies, so extension lint stays green while progress previews transition between assistant and reasoning blocks. Thanks @vincentkoc. - Discord: resolve SecretRef-backed bot tokens from the active runtime snapshot for named accounts and keep unresolved configured tokens from crashing status or health checks. (#76987) Thanks @joshavant. - Channels/streaming: expose `streaming.progress.label`, `labels`, `maxLines`, and `toolProgress` in bundled channel config metadata so progress draft settings appear in config, docs, and control surfaces. Thanks @vincentkoc. - Channels/streaming: normalize whitespace and case for `streaming.progress.label: "auto"` so progress draft labels keep using the built-in label pool instead of rendering a literal `auto` title. Thanks @vincentkoc. - Plugins/Codex: preserve Codex-native OAuth routing for `/codex bind` app-server turns so bound sessions keep the selected Codex auth profile instead of falling back to public OpenAI credentials. (#76714) Thanks @keshavbotagent. - Gateway/install: prefer supported system Node over nvm/fnm/volta/asdf/mise when regenerating managed gateway services, so `gateway install --force` no longer recreates service definitions that doctor immediately flags as version-manager-backed. Fixes #76339. Thanks @brokemac79. - Cron/status: render explicit `delivery.mode: "none"` jobs as no-delivery previews and label cron session history distinctly instead of showing fallback delivery or direct-session rows. Fixes #76945. - Gateway/usage: serve `usage.cost` and `sessions.usage` from a durable transcript aggregate cache with lock-safe background refreshes and localized stale-cache status, so large usage views avoid repeated full scans. (#76650) Thanks @Marvinthebored. - Plugins/hooks: let `plugins.entries..hooks.timeoutMs` and `plugins.entries..hooks.timeouts` bound plugin typed hooks from operator config, so slow hooks can be tuned without patching installed plugin code. Fixes #76778. Thanks @vincentkoc. - Telegram: add `channels.telegram.mediaGroupFlushMs` at the top level and per account so operators can tune album buffering instead of being stuck with the hard-coded 500ms media-group flush window. Fixes #76149. Thanks @vincentkoc. - Config/messages: coerce boolean `messages.visibleReplies` and `messages.groupChat.visibleReplies` values to the documented enum modes so an intuitive toggle no longer invalidates config and drops channel startup. Fixes #75390. Thanks @scottgl9. - Agents/network: allow trusted web-search providers and configured model-provider hosts to work behind Surge/Clash/sing-box fake-IP DNS by accepting RFC 2544 and IPv6 ULA synthetic answers only for the request's scoped hostname, without broad private-network access. Refs #76530 and #76549. Thanks @zqchris. - Providers: honor env-proxy settings for guarded provider model fetches when no explicit dispatcher policy is configured, preserving explicit transport overrides. Fixes #70453. (#72480) Thanks @mjamiv. - Web fetch: add a default-off `tools.web.fetch.useTrustedEnvProxy` opt-in for proxy-only environments so `web_fetch` can let an operator-controlled HTTP(S) proxy resolve DNS while preserving default strict DNS pinning and hostname policy checks. Refs #58034 and #62560. Thanks @cosmicnet and @mjamiv. - Feishu: accept and honor `channels.feishu.blockStreaming` at the top level and per account, while keeping the legacy default off so Feishu cards no longer reject documented config or silently drop block replies. Fixes #75555. Thanks @vincentkoc. - Gateway/update: avoid `launchctl kickstart -k` immediately after fresh macOS update bootstraps, and unlink dangling global plugin-runtime symlinks during packaged postinstall and `doctor --fix` so upgrades no longer SIGTERM the newly booted Gateway or leave bundled plugin imports pointed at pruned `plugin-runtime-deps` trees. Completes #76261 and fixes #76466. (#76929) - Google Chat: normalize custom Google auth transport headers before google-auth/gaxios interceptors run, restoring webhook token verification when certificate retrieval expects Fetch `Headers`. Fixes #76742. Thanks @donbowman. - Doctor/plugins: reset stale `plugins.slots.memory` and `plugins.slots.contextEngine` references during `doctor --fix`, so cleanup of missing plugin config does not leave unrecoverable slot owners behind. Fixes #76550 and #76551. Thanks @vincentkoc. - Docs/WhatsApp: merge the duplicate top-level `web` objects in the gateway channel config example so copy-pasted WhatsApp config keeps both `web.whatsapp` and reconnect settings. Fixes #76619. Thanks @WadydX. - Plugins/Anthropic: expose Claude thinking profiles from the bundled provider-policy artifact so non-runtime callers keep Opus 4.7 `adaptive`, `xhigh`, and `max` instead of downgrading to `high`. Fixes #76779. Thanks @tomascupr and @iAbhi001. - Plugins/tools: honor `tools.alsoAllow` as an optional plugin tool discovery hint without treating its internal allow-all default as permission to load every manifest-marked optional plugin tool. Fixes #76616. - Discord/native commands: skip slash-command registration and cleanup REST calls when `channels.discord.commands.native=false`, letting low-power gateways start without waiting on disabled native-command lifecycle requests. Fixes #76202. Thanks @vincentkoc. - CLI/plugins: reject unowned command roots such as `openclaw foo` before managed proxy startup and full plugin CLI runtime loading while preserving manifest-owned and CLI-metadata-owned plugin commands. Fixes #75287. Thanks @neilofneils404. - CLI/message: skip local configured-channel plugin preload for explicit gateway-owned message actions, letting normalized CLI delivery delegate to the gateway without initializing channel runtime in the short-lived CLI process. Fixes #75477. - Plugins/commands: normalize empty plugin command handler results and let Telegram native plugin commands send the empty-response fallback instead of throwing when a handler returns `undefined`. Fixes #74800. Thanks @vincentkoc. - Plugins/tools: cold-load selected plugin tool registries when the active registry only has partial tool coverage, so wildcard-expanded allowlists no longer hide installed plugin tools from `tools.effective`. Fixes #76780. Thanks @lilesjtu. - Plugins/tools: compare cached and runtime plugin tool name conflicts with normalized core tool names, so case variants of core tools are blocked instead of leaking duplicate tool registrations. Thanks @vincentkoc. - Plugins/OpenRouter: advertise DeepSeek V4 thinking levels, including `xhigh` and `max`, through the runtime and lightweight provider policy surfaces so `/think` validation no longer rejects OpenRouter-routed DeepSeek V4 models. Fixes #74788. Thanks @vincentkoc. - Status/sessions: ignore malformed non-string persisted session provider/model metadata instead of throwing while rendering status summaries. Fixes #76206. Thanks @vincentkoc. - CLI/config: remove only the targeted array element for `openclaw config unset array[index]` instead of replaying the unset during config write and deleting the shifted next element. Fixes #76290. Thanks @SymbolStar and @vincentkoc. - Plugins/voice-call: treat abnormal local Gateway close code 1006 as a standalone CLI fallback case, so `voicecall smoke` and related commands can still run the provider check path when the Gateway socket closes before returning a response. - CLI/doctor: migrate legacy per-channel `streaming.progress` config into `streaming.preview.toolProgress`, so upgrades with stale Discord or Telegram streaming keys validate again instead of blocking plugin commands. - Plugins/release: reject ClawHub code-plugin packages that contain TypeScript runtime entries without compiled `dist/*.js` output, and run package-local runtime-build checks during npm and ClawHub plugin release previews. - Plugins/update: keep beta-installed OpenClaw package updates on the beta plugin channel even when config still says stable, so Discord and other externalized plugins update from compiled `@beta` packages instead of stale source-only `latest` artifacts. - Agents/tools: stop treating `tools.deny: ["write"]` as an implicit `apply_patch` deny; operators who want to block patch writes should deny `apply_patch` or `group:fs` explicitly. Fixes #76749. (#76795) Thanks @Nek-12 and @hclsys. - Plugins/release: verify published plugin npm tarballs expose compiled runtime entries after publish, catching TS-only package artifacts before release closeout. Thanks @vincentkoc. - CLI/message: exit cleanly with a nonzero status when message-command plugin registry loading fails before dispatch, preventing `openclaw-message` children from staying alive after plugin load errors. Fixes #76168. - Plugins/config: report configured plugins that are present but blocked by path-safety checks as blocked instead of stale `plugin not found` entries, and deduplicate repeated blocked-candidate warnings during discovery. Fixes #76144. Thanks @mayank6136. - Gateway/update: recover an installed-but-unloaded macOS LaunchAgent after package updates, rerun Gateway health/version/channel readiness checks, and print restart, reinstall, and rollback guidance before reporting update failure. (#76790) Thanks @jonathanlindsay. - Codex/runtime: preserve native Codex thread bindings across dynamic-tool reorder and no-tool maintenance turns, and project mirrored history when a legacy Codex run must start without a native binding, preventing follow-up requests from losing conversation context. (#76824) Thanks @VACInc. - CLI/plugins: explain when a missing plugin command alias belongs to a bundled plugin that is disabled by default, including the `openclaw plugins enable ` repair command. (#76835) - Gateway/Bonjour: auto-start LAN multicast discovery only on macOS hosts while preserving explicit `openclaw plugins enable bonjour` startup elsewhere, so Linux servers and containers that do not need LAN discovery avoid default mDNS probing and watchdog churn. Refs #74209. - Gateway/macOS: stop `doctor` and LaunchAgent recovery from running `launchctl kickstart -k` after a fresh bootstrap, avoiding an immediate SIGTERM of the just-started gateway while still nudging already-loaded launchd jobs. Fixes #76261. Thanks @solosage1. - Google Meet: route stateful CLI session commands through the gateway-owned runtime so joined realtime sessions survive after the starting CLI process exits. Fixes #76344. Thanks @coltonharris-wq. - Memory/status: split builtin sqlite-vec store readiness from embedding-provider readiness in `memory status --deep` and `openclaw status`, so local vector-store failures no longer look like provider failures and provider failures no longer hide a healthy local vector store. - Memory/core: yield between session transcript indexing batches during startup reindexing so large session corpora do not starve the gateway event loop. Fixes #76890. Thanks @bitloi. - CLI/doctor: trust a ready gateway memory probe when CLI-side active memory backend resolution is unavailable, preventing false "No active memory plugin is registered" warnings for healthy runtime setups. Fixes #76792. Thanks @som-686. - Memory/status: keep plain `openclaw memory status` and `openclaw memory status --json` on the cheap read-only path by reserving vector and embedding provider probes for `--deep` or `--index`. Fixes #76769. Thanks @daruire. - Telegram: suppress stale same-session replies when a newer accepted message arrives before an older in-flight Telegram dispatch finalizes. Fixes #76642. Thanks @chinar-amrutkar. - Auto-reply: suppress stale foreground replies when a newer same-session inbound message starts before an older in-flight dispatch finalizes. Fixes #76905. Thanks @MkDev11. - Gateway/diagnostics: throttle repeated long-running active-work session warnings so healthy cron or subagent runs no longer print the same `recovery=none` line every heartbeat. - Gateway/diagnostics: keep non-blocking active-work and transient event-loop max-spike liveness diagnostics out of the default gateway console while preserving structured diagnostic events and warnings for queued, stalled, and recovery-eligible work. - Slack: collapse routine Socket Mode pong-timeout reconnects into one OpenClaw reconnect line and suppress the duplicate Slack SDK pong warning. - Gateway/diagnostics: abort-drain embedded runs after an extended no-progress stall so a single dead session no longer leaves queued Discord/channel turns blocked behind repeated `recovery=none` liveness warnings. - Plugins/ClawHub: accept the live artifact resolver `kind`/`sha256` field names alongside the typed `artifactKind`/`artifactSha256` form so `clawhub:` installs of npm-pack and legacy ZIP packages no longer miss downloadable artifacts. Thanks @RomneyDa. - Doctor/session locks: remove fresh session write-lock files when their live PID can be read and proven to belong to a non-OpenClaw process, while preserving active or unknown owners. Fixes #76823. Thanks @renatomaluhy. - Control UI/Sessions: avoid full `sessions.list` reloads for chat-turn `sessions.changed` payloads, so large session stores no longer add multi-second delays while chat responses are being delivered. (#76676) Thanks @VACInc. - Gateway/watch: run `doctor --fix --non-interactive` once and retry when the dev Gateway child exits during startup, so stale local plugin install/config state does not leave the tmux watch session disappearing without a repair attempt. - Doctor/Telegram: warn when selected Telegram quote replies can suppress `streaming.preview.toolProgress`, and document the `replyToMode` trade-off without changing runtime delivery. Fixes #73487. Thanks @GodsBoy. - Channels/Discord: send a best-effort native typing cue immediately after an inbound DM is accepted, so slow pre-dispatch turns show Discord liveness before queueing, context assembly, model, or tool work starts. Fixes #76417. Thanks @mlopez14. - Plugins/install: reject source-only TypeScript package installs and installed plugin packages that are missing compiled runtime output, so broken npm artifacts fail at install/discovery time instead of falling through jiti and surfacing later as unavailable providers. Fixes #76720. - Plugins/config: deduplicate identical manifest compatibility diagnostics when an explicitly configured plugin overrides another discovered candidate, so external channel plugins do not print the same missing `channelConfigs` warning repeatedly during install and enable. Thanks @vincentkoc. - Discord/status: honor explicit `messages.statusReactions.enabled: true` in tool-only guild channels so queued ack reactions can progress through thinking/done lifecycle reactions instead of stopping at the initial emoji. Thanks @Marvinthebored. - Discord/native commands: compare Discord-normalized slash-command descriptions and localized descriptions during reconcile so CJK or multiline command text no longer triggers redundant startup PATCH bursts and rate-limit 429s. Fixes #76587. Thanks @zhengsx. - Agents/OpenAI Codex: align ChatGPT Codex Responses replay with the Codex wire contract by preserving session cache identity while omitting prior Responses reasoning/message/function item IDs, so tool-call turns do not feed stale item identity into later Telegram replies. (#76832) Refs #76413. Thanks @MkDev11. - Agents/OpenAI: omit Chat Completions `reasoning_effort` for `gpt-5.4-mini` only when function tools are present while preserving tool-free Chat and Responses reasoning support, preventing Telegram-routed fallback runs from hanging after OpenAI rejects tool payloads. Fixes #76176. Thanks @ThisIsAdilah and @chinar-amrutkar. - Telegram: reuse the successful startup `getMe` probe for grammY polling startup and continue into `getUpdates` after recoverable `deleteWebhook` cleanup failures, reducing high-latency Bot API control-plane calls before long polling starts. Refs #76388. Thanks @jackiedepp. - Gateway/diagnostics: merge session id/key aliases in diagnostic session state and activity tracking so completed runs no longer leave stale queued work behind that keeps liveness samples at warning level. - Agents/models: forward model `maxTokens` as the default output-token limit for OpenAI-compatible Responses and Completions transports when no runtime override is provided, preventing provider defaults from silently truncating larger outputs. (#76645) Thanks @joeyfrasier. - macOS CLI/onboarding: honor sensitive wizard text steps in `openclaw-mac wizard` with termios no-echo input, suppressing saved credential previews while preserving long API keys and gateway tokens. Fixes #76698. Thanks @anurag-bg-neu and @sallyom. - Control UI/Skills: fix skill detail modal silently failing to open in all browsers by deferring `showModal()` until the dialog element is connected to the DOM; the Lit `ref` callback fired before connection causing a `DOMException: HTMLDialogElement.showModal: Dialog element is not connected` on every skill click. Thanks @nickmopen. - fix(lsp): resolve Windows .cmd shims in LSP server spawning so npm-installed language servers (e.g. typescript-language-server) start correctly on Windows. Fixes #75352. Thanks @ElliotDrel. - Gateway/update: run `doctor --non-interactive --fix` after Control UI global package updates before reporting success, so legacy config is migrated before the gateway restart. Thanks @stevenchouai. - Gateway/cron: stop a lazy cron startup that loses a hot-reload race, preventing the old cron service from starting after reload has already replaced cron state. - CLI/plugins: warn when npm plugin installs remain shadowed by a failing config-selected source and surface the repair path in `plugins doctor`. Thanks @LindalyX-Lee. - Agents/Telegram: preserve explicit reply and quote context in embedded model prompts without letting quoted text drive prompt-local image loading. Fixes #76419. (#76659) Thanks @cheechnd. - Active Memory: apply `setupGraceTimeoutMs` to the embedded recall runner as well as the outer prompt-build watchdog, so very-cold first recalls keep the configured setup grace end-to-end. (#74480) Thanks @volcano303. - Channels/Feishu: cap how long the per-chat sequential queue blocks subsequent same-key tasks behind a single in-flight task (5 min default), so a single hung dispatch no longer leaves later same-chat messages in `queued` state until gateway restart; the stuck task continues running but is evicted from the blocking chain and a warning is logged. Fixes #70133. (#76687) Thanks @martingarramon and @bek91. - Active Memory: skip scoped Telegram forum-topic conversation ids (containing `:`) when resolving the embedded recall run channel, falling back to `messageProvider` instead, so Active Memory no longer throws a bundled-plugin dirName validation error in forum-topic sessions. Fixes #76704. - Agents/tools: defer automatic PDF model/auth resolution until the PDF tool is used, keeping agent-turn tool prep from probing auth profiles on messages without PDFs while preserving explicit PDF model registration. Fixes #76644. Thanks @hclsys. - CLI/config: keep JSON dry-run patches validating touched channel configuration against bundled channel schemas even when the patch only contains SecretRef objects. - Plugins/tools: keep disabled bundled tool plugins out of explicit runtime allowlist ownership and fall back from loaded-but-empty channel registries to tool-bearing plugin registries, so Active Memory can use bundled `memory-core` search/get tools even when `memory-lancedb` is disabled. Fixes #76603. Thanks @jwong-art. - Plugins/install: run `npm install` from the managed npm-root manifest so installing one `@openclaw/*` plugin preserves already installed sibling plugins instead of pruning them. Fixes #76571. (#76602) Thanks @byungskers and @crpol. - Plugins/context-engine: include the selected `plugins.slots.contextEngine` plugin in the gateway startup load plan so external context-engine plugins without `activation.onStartup` in their manifest are loaded before any agent turn resolves the active engine; prevents the "Context engine X is not registered; falling back to default engine legacy" warning after gateway startup. Fixes #76576. Thanks @hclsys. - Plugins/tools: restore on-demand registry load for path-based plugins (origin "config") so tool factories registered via `plugins.load.paths` are resolved at agent request time when no pre-warmed channel registry is present; prevents "unknown method" errors after gateway startup. Fixes #76598. Thanks @hclsys. - Plugins/hooks: include explicitly enabled hook-capable plugins in the Gateway startup runtime scope so embedded PI runs can see their `before_prompt_build` and `agent_end` hooks. Fixes #76649. Thanks @wwf3045 and @MkDev11. - Plugins/OpenCode: expose Claude thinking profiles through the lightweight provider policy surface so directive and session validation keep `xhigh`, `adaptive`, and `max` for `opencode/claude-opus-4-7` instead of remapping `xhigh` to `high`. Fixes #76648. Thanks @aaajiao. - Channels/QQ Bot: resolve structured `clientSecret` SecretRefs before QQ token exchange, expose the QQ Bot secret contract to secrets tooling, and reject legacy `secretref:/...` marker strings. (#74772) Thanks @xialonglee. - Agents: keep active streamed provider replies alive by refreshing guarded fetch timeouts on raw body chunks and surface true prompt stream timeouts as explicit errors instead of partial assistant fragments. Fixes #76307. (#76633) Thanks @MkDev11. - Plugins/externalization: keep official ACPX, Google Chat, and LINE install specs on production package names, leaving beta-tag probing to the explicit OpenClaw beta update channel. Thanks @vincentkoc. - CLI/doctor: keep missing-plugin repair from overriding official catalog metadata with runtime fallbacks, so ACPX repairs preserve the official npm spec during the externalization rollout. Thanks @vincentkoc. - CLI/doctor: match stale bundled-plugin install records by exact parsed package name so doctor does not remove external npm or ClawHub records that only share an OpenClaw package-name prefix. - Plugins/catalog: preserve ClawHub install specs when generating the packaged channel catalog so future storepack-first channel plugins keep their remote source instead of becoming npm-only. Thanks @vincentkoc. - Plugins/catalog: pin bare npm specs from prerelease external channel catalog entries to the catalog entry version, so beta catalogs do not silently install the latest stable package. - Plugins/update: treat catalog-matched official npm updates and OpenClaw-authored externalized-bundled npm bridges as trusted official installs so launch-code plugins can update or migrate out of the bundled tree without scanner false positives. Thanks @vincentkoc. - Plugins/onboarding: fall back from ClawHub to npm only for missing package/version errors, keeping integrity and verification failures fail-closed during storepack rollout. Thanks @vincentkoc. - CLI/onboarding: mask credential inputs (model-auth provider API keys, gateway tokens and passwords, web-search provider keys, and skill env-var values) in the interactive `openclaw onboard` wizard so pasted secrets no longer echo into terminal scrollback, `Start-Transcript` logs, or screenshots; existing tokens/passwords are preserved through a masked-preview confirm step before the sensitive prompt. Thanks @anurag-bg-neu. - Control UI/Talk: fix Talk (OpenAI Realtime WebRTC) CORS failure by stripping server-side-only attribution headers (`originator`, `version`, `User-Agent`) from browser offer headers; `api.openai.com/v1/realtime/calls` only allows `authorization` and `content-type` in its CORS preflight, so forwarding these headers caused the browser SDP exchange to fail. Fixes #76435. Thanks @hclsys. - Chat delivery: make `/verbose on|full|off` changes affect subsequent tool-use chat bubbles again, including channels with draft preview tool progress enabled, while preserving one-shot verbose directives. - CLI/logs: auto-reconnect `openclaw logs --follow` on transient gateway disconnects with bounded backoff, stderr retry warnings, `[logs] gateway reconnected` recovery notices, and JSON `notice` records while still exiting immediately on non-recoverable auth or configuration errors. Fixes #74782. (#75059, #75372) Thanks @shashank-poola and @RomneyDa. - Codex/WhatsApp: keep the `message` dynamic tool available when Codex source replies are configured for message-tool delivery, so coding-profile chat agents do not complete turns privately without a visible channel reply. Fixes #76660. (#76663) Thanks @VishalJ99. - Codex/heartbeat: send heartbeat-specific initiative guidance through Codex turn-scoped collaboration-mode instructions, keeping ordinary message-tool chat turns in Default mode without heartbeat prompt leakage. Thanks @pashpashpash. - Plugins/onboarding: trust optional official plugin and web-search installs selected from the official catalog so npm security scanning treats them like other source-linked official install paths. Thanks @vincentkoc. - Agents/web_search: keep installed runtime provider discovery enabled when web-search metadata is missing, so externally installed official providers such as Brave remain visible to agent and cron turns instead of falling back to bundled-only lookup. Fixes #76626. Thanks @amknight. - Tests/plugins: expose the Discord npm onboarding Docker lane as a package script and assert planned Docker lanes point at real scripts, so external-channel onboarding coverage can actually run. Thanks @vincentkoc. - Plugins/ClawHub: explain unreleased ClawHub plugin artifacts as a rollout-state fallback to `npm:` installs instead of leaking raw archive metadata fields. Thanks @vincentkoc. - Tests/onboarding: assert packaged channel onboarding leaves `openclaw channels status --json` and plain `openclaw status` showing the configured channel, covering the empty Channels table regression path. Thanks @vincentkoc. - Microsoft Teams: persist sent-message markers across Gateway restarts so follow-up replies to recent bot messages keep resolving the original conversation instead of dropping out after restart, with marker TTLs preserved on best-effort recovery. (#75585) Thanks @amknight. - Matrix: persist pending approval reaction targets across Gateway restarts so room approvers can still approve or deny outstanding prompts after OpenClaw comes back online. (#75586) Thanks @amknight. - Channels/onboarding: map third-party official WeCom and Yuanbao catalog entries to their published plugin ids so npm installs pass expected-plugin validation. Thanks @vincentkoc. - Plugin SDK: restore the Mattermost and Matrix compatibility subpaths used by the pinned Yuanbao channel package so external installs can module-load after npm install. Thanks @vincentkoc. - Plugins/install: keep managed npm-root security scans from treating earlier plugin `openclaw` peer links as failures, so one external plugin install cannot poison later official npm installs. Thanks @vincentkoc. - Memory LanceDB: allow installed-but-unconfigured plugin metadata to load so onboarding and setup flows can prompt for embedding config instead of failing the plugin registry first. Thanks @vincentkoc. - CLI/plugins: keep `plugins enable` and `plugins disable` from creating unconfigured channel config sections, so channel plugins with required setup fields no longer fail validation during lifecycle probes. Thanks @vincentkoc. - Doctor/config: set `messages.groupChat.visibleReplies: "message_tool"` during compatibility repair for configured-channel configs that omit a visible-reply policy, so upgrades can persist the intended tool-only group/channel reply default. Thanks @kagura-agent. - Agents/sessions: keep delayed `sessions_send` A2A replies alive after soft wait-window timeouts, while preserving terminal run timeouts and avoiding stale target replies in requester sessions. Fixes #76443. Thanks @ryswork1993 and @vincentkoc. - TUI/Control UI: fix `/think` command showing only base thinking levels when the active session uses a different model from the default, so provider-specific levels like DeepSeek V4 Pro's `xhigh` and `max` are now visible and selectable. Fixes #76482. Thanks @amknight. - CLI/sessions: keep intentional empty agent replies silent after tool-delivered channel output, instead of surfacing a misleading "No reply from agent." fallback. Thanks @vincentkoc. - Config/doctor: cap `.clobbered.*` forensic snapshots per config path and serialize snapshot writes so repeated `doctor --fix` recovery loops cannot flood the config directory. Fixes #76454; carries forward #65649. Thanks @JUSTICEESSIELP, @rsnow, and @vincentkoc. - Feishu: suppress duplicate text when replies send native voice media, preserve captions for ordinary audio files, and send fallback text plus attachment links when `audioAsVoice` transcode/upload fallback produces a generic file. - TTS/plugins: activate configured and inherited speech provider plugins during Gateway startup, so Microsoft and Local CLI voice replies work immediately after persona selection instead of staying invisible in the startup plugin set. Fixes #76481. Thanks @amknight. - Feishu: keep packaged Feishu startup from bundling the Lark SDK's ESM `__dirname` path by loading the SDK as a plugin-local runtime dependency. Fixes #76291 and #76494. (#76392) Thanks @zqchris. - Plugins/npm: build package-local runtime dist files for publishable plugins and stop listing root-package-excluded plugin sidecars in the core package metadata, so npm plugin installs such as `@openclaw/diffs` and `@openclaw/discord` no longer publish source-only runtime payloads. Fixes #76426. Thanks @PrinceOfEgypt. - Channels/secrets: resolve SecretRef-backed channel credentials through external plugin secret contracts after the plugin split, covering runtime startup, target discovery, webhook auth, disabled-account enumeration, and late-bound web_search config. Fixes #76371. (#76449) Thanks @joshavant and @neeravmakwana. - Docker/Gateway: pass Docker setup `.env` values into gateway and CLI containers and preserve exec SecretRef `passEnv` keys in managed service plans, so 1Password Connect-backed Discord tokens keep resolving after doctor or plugin repair. Thanks @vincentkoc. - Exec/security: treat configured `tools.exec.security` as authoritative for normal tool calls so model-supplied `security` arguments cannot downgrade or tighten the operator policy, while preserving explicitly granted elevated-full overrides. (#65933) Thanks @bryanpearson. - Control UI/WebChat: explain compaction boundaries in chat history and link directly to session checkpoint controls so pre-compaction turns no longer look silently lost after refresh. Fixes #76415. Thanks @BunsDev. - Agents/compaction: add an optional bundled compaction notifier hook and retry once from the compacted transcript when automatic compaction leaves a turn without a final visible reply. (#76651) Thanks @simplyclever914. - Agents/incomplete-turn: detect and surface a warning when the agent's final text after a tool-call chain is silently dropped because the post-tool assistant response was never produced, instead of completing the turn with only the pre-tool analysis text. Fixes #76477. Thanks @amknight. - Channels/WhatsApp: attach native outbound mention metadata for group text and media captions by resolving `@+` and `@` tokens against WhatsApp participant data, including LID groups. Fixes #39879; carries forward #56863. Thanks @kengi1437, @joe2643, and @fridayck. - Channels/WhatsApp: require outbound mention tokens to end at a word boundary so phone-number prefixes inside longer strings no longer trigger hidden native mentions. - Plugins/uninstall: remove empty managed git install parent directories after deleting cloned plugin repos and cover npm/git uninstall residue in Docker plugin lifecycle tests. Thanks @vincentkoc. - Plugins/install: resolve bare official external plugin IDs such as `brave` through the official catalog when no bundled source is available, so packaged installs fetch the intended scoped npm package instead of an unrelated unscoped package. Fixes #76373. Thanks @bek91 and @vincentkoc. - Plugins/install: require OpenClaw-owned install provenance before granting official npm plugin scanner trust, so direct npm package names no longer bypass launch-code scanning while catalog, onboarding, and doctor installs stay trusted. Thanks @fede-kamel and @vincentkoc. - Network proxy: preserve target TLS hostname validation for Node HTTPS requests routed through the managed HTTP proxy, so Discord-style CONNECT traffic no longer validates certificates against the local proxy host. Fixes #74809. (#76442) Thanks @jesse-merhi and @abnershang. - Gateway/sessions: keep `sessions.list` rows lightweight by bounding title/preview hydration to transcript head/tail reads and caching manifest model-id normalization plus setup fallback metadata against the active plugin snapshot. Thanks @vincentkoc and @rolandrscheel. - Gateway/performance: cache per-run verbose-level session reads, skip a redundant `lsof` scan in `gateway --force` when no listener was killed, and make the Gateway startup benchmark print usage for `--help`. - Gateway/sessions: keep agent runtime metadata on lightweight `sessions.list` rows and skip per-row transcript usage fallback, display model inference, and plugin projection, avoiding identity loss and event-loop stalls in large session stores. Thanks @Marvinthebored and @vincentkoc. - Gateway/models: keep read-only `models.list` fallbacks on persisted/current metadata, configured rows, registry-compatible fallbacks, and static auth checks while preserving full-catalog image attachment capability checks. Fixes #76382; refs #76360 and #75707. Thanks @trojy13, @RayWoo, @AnathemaOfficial, @Marvinthebored, and @vincentkoc. - CLI/plugins: reject missing plugin ids before config writes in `plugins enable` and `plugins disable` so a typo no longer persists a stale config entry. (#73554) Thanks @ai-hpc. - Agents/sessions: preserve delivered trailing assistant replies during session-file repair so Telegram/WebChat history is not rewritten to drop already-delivered responses. Fixes #76329. Thanks @obviyus. - Gateway/chat history: preserve oversized transcript turns as explicit omitted-message placeholders while avoiding large JSONL parse stalls. Thanks @Marvinthebored and @vincentkoc. - CLI/doctor: load the configured memory-slot plugin when resolving memory diagnostics so bundled `memory-core` no longer triggers a false “no active memory plugin” warning on standalone `doctor` / `status` runs. Fixes #76367. Thanks @neeravmakwana. - Gateway: preserve stack diagnostics when `chat.send` or agent attachment parsing/staging fails, improving image-send failure triage. Refs #63432. (#75135) Thanks @keen0206. - Agents/idle-timeout: add a cost-runaway breaker to the outer embedded-run retry loop that halts further attempts after 5 consecutive idle timeouts without completed model progress, so a wedged provider can no longer fan paid model calls out across the same run; completed text or tool-call progress resets the breaker, but partial tool-argument token dribbles do not. Fixes #76293. Thanks @ThePuma312. - Heartbeats/Codex: align structured heartbeat prompts with actual `heartbeat_respond` tool availability, stop sending legacy `HEARTBEAT_OK` when the tool exists, and keep tool-disabled commitment check-ins on the legacy ack path. Thanks @pashpashpash and @vincentkoc. - Agent runtimes: fail explicit plugin runtime selections honestly when the requested harness is unavailable instead of silently falling back to the embedded PI runtime. Thanks @pashpashpash. - Telegram: log inbound gateway watch messages before dispatch so watch-mode diagnostics include incoming message summaries. Thanks @rubencu. - Maintainer workflow: push prepared PR heads through GitHub's verified commit API by default and require an explicit override before git-protocol pushes can publish unsigned commits. Thanks @BunsDev. - Feishu: resolve setup/status probes through the selected/default account so multi-account configs with account-scoped app credentials show as configured and probeable. Fixes #72930. Thanks @brokemac79. - Gateway/responses: emit every client tool call from `/v1/responses` JSON and SSE responses when the agent invokes multiple client tools in a single turn, so multi-tool plans, graph orchestration calls, and similar batched flows no longer drop every call but the last. Fixes #52288. Thanks @CharZhou and @bonelli. - Gateway/agent: enforce `session.sendPolicy=deny` on gateway agent requests only when `deliver: true`, so non-delivery smoke checks and internal agent runs are no longer rejected with `send blocked by session policy` while outbound delivery remains gated. Fixes #73381. Thanks @wenxu007. - Slack/reactions: treat missing no_reaction remove responses as idempotent success and route own-reaction cleanup through the remove helper, so concurrent cleanup no longer surfaces Slack race errors. Fixes #50733. (#76304) Thanks @martingarramon and @Hollychou924. - Feishu: include media `file_key` and `image_key` values in inbound dedupe so reused message IDs still process distinct media attachments while true retries stay suppressed. Fixes #75057. Thanks @SymbolStar. - Control UI/Gateway: avoid full session-list reloads for locally applied message-phase session updates, carry known session keys through transcript-file update events, and defer media provider listing when explicit generation model config is present. Refs #76236, #76203, #76188, #76107, and #76166. Thanks @BunsDev. - Install/update: prune the obsolete `plugin-runtime-deps` state directory during packaged postinstall so upgrades from pre-2026.5.2 releases reclaim old bundled-plugin dependency caches without touching external plugin installs. - Auto-reply/queue: treat reset-triggered `/new` and `/reset` turns as interrupt runs across active-run queue handling, so steer/followup modes cannot delay a fresh session behind existing work. Fixes #74093. (#74144) Thanks @ruji9527 and @yelog. - Cron: persist repaired startup runtime state back to `jobs-state.json` so a valid future `nextRunAtMs` with missing `updatedAtMs` no longer triggers repeated external health-check repairs after Gateway restart. Fixes #76461. Thanks @vincentkoc. - Cron: preserve manual `cron.run` IDs in `cron.runs` history so manual run acknowledgements can be correlated with finished run records. Fixes #76276. - Plugin SDK/cron: expose `sessionTarget` and `agentId` as top-level fields on `cron_changed` hook events so downstream plugins can route cron completion results without digging into the optional job snapshot. Thanks @amknight. - CLI/devices: request `operator.admin` for `openclaw devices approve ` only when the exact pending device request would mint or inherit admin-scoped operator access, while keeping lower-scope approvals on the pairing scope. - Memory/embedding: broaden the embedding reindex retry classifier to include transient socket-layer errors (`fetch failed`, `ECONNRESET`, `socket hang up`, `UND_ERR_*`, `closed`) so memory reindex survives provider network hiccups instead of aborting mid-run. Related #56815, #44166. (#76311) Thanks @buyitsydney. - Memory/sessions: keep rotated and deleted transcripts (`.jsonl.reset.` / `.jsonl.deleted.`) searchable by indexing archive content, mapping archive hits back to live transcript stems, emitting transcript update events on archive rotation, and bypassing incremental delta thresholds for one-shot archive mutations while keeping backups and compaction checkpoints opaque. Refs #56131. Thanks @buyitsydney. - Memory/search: keep sqlite-vec optional in packaged installs and point missing-extension recovery at the valid `agents.defaults.memorySearch.store.vector.extensionPath` setting. Thanks @willemsej and @vincentkoc. - Gateway: keep directly requested plugin tools invokable under restrictive tool profiles while preserving explicit deny lists and the HTTP safety deny list, preventing catalog/invoke mismatches that surface as "Tool not available". Thanks @BunsDev. - Gateway/update: allow beta binaries to refresh gateway services when the config was last written by the matching stable release version, avoiding false newer-config downgrade blocks during beta channel updates. - Channels: keep Matrix and Mattermost bundled in the core package instead of advertising external npm installs before those channels are cut over. Thanks @vincentkoc. - Bonjour: disable LAN mDNS advertising after a repeated stuck-announcing recovery instead of repeatedly restarting ciao and saturating the Gateway event loop. - Channels/setup: label installable channel picker hints as remote npm installs and hide remote install hints for bundled plugins that already ship with OpenClaw. - CLI/update: refuse package updates launched from the active gateway process tree before stopping the managed Gateway service, avoiding self-terminated in-lane updates that leave old Gateway code running. Fixes #75691. (#75819) Thanks @ai-hpc. - CLI/plugins: stop treating the non-plugin `auth` command root as a bundled plugin id, so restrictive `plugins.allow` configs no longer tell users to add stale `auth` plugin entries. - Doctor/plugins: update configured plugin installs whose stale manifests still declare channels without `channelConfigs`, so beta upgrades repair old Discord-style package payloads during `doctor --fix`. - Doctor/plugins: repair configured external plugin installs whose persisted install record points at a missing package directory, so upgrades reconcile phantom npm metadata before plugin runtime validation. Thanks @vincentkoc. - Active Memory: keep non-empty `memory_search` results from being fast-failed as empty when debug telemetry reports zero hits. - Active Memory: preserve the target agent context when building embedded recall plugin tools so `memory_search` and `memory_get` stay available for explicit recall sessions. Fixes #76343. Thanks @Countermarch. - Plugins/externalization: repair missing configured plugin installs from npm by default, reserve ClawHub downloads for explicit `clawhubSpec` metadata, and cover agent-runtime/env-selected plugin repair. Thanks @vincentkoc. - Plugins/install: allow official catalog-matched npm channel plugins such as Feishu to pass the trusted install scanner path while keeping spoofed package names blocked. Thanks @vincentkoc. - Tools/llm-task: keep JSON-only embedded model runs from tripping inherited tool allowlists when tools are intentionally disabled, while preserving runtime `toolsAllow` failures. Fixes #74019. Thanks @amknight. - Tools/profiles: make `tools.profile: "full"` grant all tools including optional plugin tools such as browser, so the full profile no longer silently drops plugin-provided tools that require an explicit allowlist entry. Fixes #76507. Thanks @amknight. - Feishu: keep timeout env parsing separate from the HTTP client wrapper so package security scans no longer report a false env-harvesting hit during install. Thanks @vincentkoc. - Upgrade/config: validate configured web-search providers and statically suppressed model/provider pairs against the active plugin set at config load, so stale plugin state fails loud before runtime fallback. - Status/update: resolve beta update-channel checks from the installed version when config still says `stable`, and let `status --deep` reuse live gateway channel credential state instead of warning on command-path-only token misses. - Doctor/plugins: preserve unmanaged third-party plugin `node_modules` during `doctor --fix`, while still pruning OpenClaw-managed runtime dependency caches. - Gateway/restart: add `openclaw gateway restart --force` and `--wait `, log active task run IDs before restart deferral timers, and report timeout restarts as explicit forced restarts. - Gateway/restart: align `gateway.restart.safe` preflight with scheduled restart deferral by counting only active restart blockers (running non-ended tasks), so queued task records no longer keep "safe" restarts deferred indefinitely. (#76923) Thanks @NikolaFC. - Discord: persist slash-command deploy hashes across process restarts so unchanged command sets skip redeploy and avoid restart-loop 429s. - Providers/LM Studio: normalize binary `off`/`on` reasoning metadata from Gemma 4 and other local models to LM Studio's accepted OpenAI-compatible `reasoning_effort` values. - Plugins/externalization: keep official external install docs, update examples, and live Codex npm checks on default npm tags instead of `@beta`. Thanks @vincentkoc. - Plugins/externalization: keep ACPX, Google Chat, and LINE publishable plugin dist trees out of the core npm package file list. - Plugins/ClawHub: fall back to version metadata when the artifact resolver route is missing and keep the Docker ClawHub fixture aligned with npm-pack artifact resolution, avoiding false version-not-found failures during plugin install validation. Thanks @vincentkoc. - Providers/openai-codex: honor `providerConfig.baseUrl` in the dynamic-model synthesis fallback so codex providers configured with a custom upstream (for example a forwarding proxy) no longer silently bypass the configured URL when the registry has no template row to clone for the requested model id. (#76428) Thanks @arniesaha. - Status/channels: show configured channels in `openclaw status` and config-only `openclaw channels status` output even when the Gateway is unreachable, avoiding empty Channels tables on WSL and other no-Gateway paths. Thanks @vincentkoc. - Agents/main-session: keep pending final delivery markers until the final reply is actually routed or queued, so restart and heartbeat recovery can retry failed delivery. Refs #65037. (#75280) Thanks @MertBasar0. - Plugins/ClawHub: explain unavailable explicit ClawHub ClawPack artifact downloads with a temporary npm install hint while ClawHub artifact routing rolls out. Thanks @vincentkoc. - Media: accept home-relative `MEDIA:~/...` attachment paths while preserving existing file-read policy, traversal checks, and media type validation. Fixes #73796. Thanks @fabkury. - Onboarding/search: install official external web-search plugins such as Brave before saving provider config, and make doctor repair reconcile selected external search providers whose npm payload is missing. Thanks @vincentkoc. - Plugins/externalization: add official npm-first catalogs for externalized channel, provider, and generic plugins, keep unpublished ACPX/Google Chat/LINE bundled, and make missing-plugin repair honor npm-first metadata while ClawHub pack files roll out. Thanks @vincentkoc. - Plugins/update: detect tracked plugin install records whose package directories disappeared during `openclaw update`, reinstall them before normal plugin updates, and fail the update if any install record still points at missing disk payloads. - Plugins/registry: hash manifest and package metadata when validating persisted plugin registries so fast same-size rewrites cannot leave stale plugin metadata trusted. - Plugins/registry: canonicalize install-record provenance paths before trust diagnostics, so npm plugins installed under symlinked temp/state roots no longer warn as untracked local code. - Plugins/install: let official external Discord reinstall requests pass the invalid-config guard and run stale-channel repair, so upgrades can recover missing external plugin state directly. - CLI/infer: reject local `codex/*` one-shot model probes before simple-completion dispatch and point operators at the Codex app-server runtime path instead of ending with an empty-output error. - Agents/sessions: preserve terminal lifecycle state when final run metadata persists from a stale in-memory snapshot, preventing `main` sessions from staying stuck as running after completed or timed-out turns. - Gateway/CLI: make `openclaw gateway start` repair stale managed service definitions that point at old OpenClaw versions, missing binaries, or temporary installer paths before starting. - Heartbeat/scheduler: make heartbeat phase scheduling active-hours-aware so the scheduler seeks forward to the first in-window phase slot instead of arming timers for quiet-hours slots and relying solely on the runtime guard. Non-UTC `activeHours.timezone` values (e.g. `Asia/Shanghai`) now correctly influence when the next heartbeat timer fires, avoiding wasted quiet-hours ticks and long dormant gaps after gateway restarts. Fixes #75487. Thanks @amknight. - Providers/Arcee AI: mark Trinity Large Thinking as tool-incompatible so main-session runs use the same text-only request shape that made subagent runs recover, avoiding the remaining main-session response-shape mismatch after the #62848 transport failover fix. Fixes #62851 and #62847; carries forward #62848. Thanks @Adam-Researchh. - Plugins/SDK: harden run-scoped plugin context cleanup so finalized workflow runs do not leak per-run state. Thanks @100yenadmin. - Plugins/SDK: keep stale async registry cleanup from clearing restored plugin run context and scheduler state after a plugin registry is reactivated. (#75600) Thanks @100yenadmin. - Plugins/SDK: preserve restored plugin scheduler state when earlier delayed replacement cleanup finishes after reactivation. Thanks @100yenadmin. - Status: show the `openai-codex` OAuth profile for `openai/gpt-*` sessions running through the native Codex runtime instead of reporting auth as unknown. (#76197) Thanks @mbelinky. - Gateway: avoid repeated plugin tool descriptor config hashing so large runtime configs do not block reply startup and trigger reconnect/timeouts. (#75944) Thanks @joshavant. - Plugins/externalization: keep diagnostics ClawHub packages and persisted bundled-plugin relocation on npm-first install metadata for launch, and omit Discord from the core package now that its external package is published. Thanks @vincentkoc. - Setup/TUI: bound the Terminal hatch bootstrap run so a stalled provider request times out instead of leaving first-run hatching stuck behind the watchdog. (#76241) Thanks @joshavant. - Cron/CLI runtimes: route isolated cron jobs through configured per-agent CLI runtimes only when the resolved model provider is compatible, so OpenAI job overrides no longer inherit a mismatched Claude CLI backend. Thanks @vishutdhar. - Plugins/Codex: allow the official npm Codex plugin to install without the unsafe-install override, keep `/codex` command ownership, and cover the real npm Docker live path through managed `.openclaw/npm` dependencies plus uninstall failure proof. - Gateway/status: add concrete service, config, listener-owner, and log collection next steps when gateway probes fail and Bonjour finds no local gateway, so frozen or port-conflict reports include the data needed for root-cause triage. Refs #49012. Thanks @vincentkoc. - Codex harness: forward OpenClaw workspace bootstrap files such as `SOUL.md` through native Codex config instructions while leaving `AGENTS.md` to Codex project-doc discovery. Fixes #76273. Thanks @zknicker. - Parallels/Windows update smoke: escape the stale post-swap import regex in the generated PowerShell script so expected `ERR_MODULE_NOT_FOUND` update handoffs continue to post-update health checks. (#75315) - Slack: allow draft preview streaming in top-level DMs when `replyToMode` is `off` while keeping Slack native streaming and assistant thread status gated on reply threads. Fixes #56480. (#56544) Thanks @HangGlidersRule. - Control UI/chat: remove the delete-confirm popover outside-click listener on every dismiss path, so Cancel, Delete, outside clicks, and same-button toggles no longer leave stale document listeners behind. Refs #75590 and #69982. Thanks @Ricardo-M-L. - Memory-core: treat exhausted file watcher limits as non-fatal for builtin memory auto-sync while preserving fatal handling for unrelated disk-full errors. (#73357) Thanks @solodmd. - Providers/Ollama: restore catalog context-window forwarding as `num_ctx` for native `/api/chat` requests; fixes tool selection and context truncation regressions on models with catalog entries (qwen3, llama3, gemma3, …) when no explicit `params.num_ctx` was configured. Fixes #76117. (#76181) Thanks @openperf. - Plugins/install: pin npm plugin installs to the verified resolved version and reject package-lock version or integrity drift, so mutable tags cannot race integrity checks into accepting a different artifact. Thanks @Lucenx9. - Exec approvals: preserve trusted elevated defaults across approved command follow-up runs so same-turn elevated `on`/`ask` commands request a fresh approval instead of reporting elevated as unavailable. Fixes #75832. Thanks @jameyedwards and @bitloi. - Plugins/providers: preserve scoped cold-load fallback for enabled external manifest-contract capability providers missing from the startup registry, so providers such as Fish Audio can resolve on request without requiring `activation.onStartup` for correctness. (#76536) Thanks @Conan-Scott. - Gateway/update: carry `continuationMessage` from `update.run` into successful restart sentinels so session-scoped self-updates can resume one follow-up turn after the Gateway restarts. Refs #71178. (#74362) Thanks @100menotu001, @HeilbronAILabs, and @artnking. - Agents/fallback: suppress duplicate current-turn user-message transcript writes after embedded fallback retries while still sending the retry prompt to the model. (#63696) Thanks @dashhuang. - Channels/Telegram: force a fresh final message when a visible non-preview bubble (tool/block/error) was delivered after the active answer preview, so multi-step assistant replies no longer end up with the final answer above intermediate output. Fixes #76529. Thanks @jack-stormentswe. - Channels/Telegram: require an observed Telegram send, edit, or fallback before treating a forum-topic final as delivered, so final replies generated in transcript no longer disappear from Telegram topics. Fixes #76554. (#76764) Thanks @bubucilo and @obviyus. - Plugins/update: keep externalized bundled npm bridge updates on the normal plugin security scanner path instead of granting source-linked official trust without artifact provenance. (#76765) Thanks @Lucenx9. - Agents/reply context: label replied-to messages as the current user message target in model-visible metadata, so short replies are grounded to their explicit reply target instead of nearby chat history. (#76817) Thanks @obviyus. - Doctor/plugins: install configured missing official plugins such as Discord and Brave during doctor/update repair, auto-enable repaired provider plugins, preserve config when a download fails, and stop auto-enable from inventing plugin entries when no manifest declares a configured channel. Fixes #76872. Thanks @jack-stormentswe. - Agents/CLI runner: bridge in-flight assistant agent events into the shared `onPartialReply` callback so CLI backends (Anthropic Max plan via `claude-cli`, Codex CLI, etc.) drive the same Telegram and channel preview path the native API path uses, instead of silently delivering only the final assembled message. Fixes #76869. Thanks @jack-stormentswe. ## 2026.5.2 ### Highlights - External plugin installation now covers diagnostics, onboarding, doctor repair, channel setup, install/update records, and artifact metadata while keeping bare package installs on npm for the first cutover. Thanks @vincentkoc. - Gateway startup, session listing, task maintenance, prompt prep, plugin loading, and filesystem hot paths get targeted cache and fanout reductions for large or plugin-heavy installs. - Control UI and WebChat reliability improves across Sessions, Cron, long-running Gateway WebSockets, grouped-message width, slash-command feedback, iOS PWA bounds, selection contrast, and Talk diagnostics. - Channel and provider fixes cover Telegram topic commands and networking, Discord delivery and startup edge cases, OpenAI-compatible TTS/Realtime, OpenRouter/DeepSeek replay, Anthropic-compatible streaming, Brave/SearXNG/Firecrawl web search, and voice-call routing. ### Changes - Gateway/startup: skip plugin-backed auth-profile overlays during startup secrets preflight, reducing gateway readiness latency while keeping reload and OAuth recovery paths overlay-capable. (#68327) Thanks @JIRBOY. - Plugins/ClawHub: make diagnostics, onboarding, doctor repair, and channel setup carry ClawPack metadata through install records while keeping explicit `clawhub:` installs on ClawHub and bare package installs on npm for the launch cutover. Thanks @vincentkoc. - Plugins/runtime: scope broad runtime preloads to the effective plugin ids derived from config, startup planning, configured channels, slots, and auto-enable rules instead of importing every discoverable plugin. - Agents/runtime: reuse the startup-loaded plugin registry for request-time providers, tools, channel actions, web/capability/memory/migration helpers, and memoized provider extra-params so stable embedded-run inputs no longer repeat plugin registry resolution while model-specific transport hook patches stay isolated. Thanks @DmitryPogodaev. - Agents/runtime: memoize transcript replay-policy resolution for stable config and process-env runs while preserving custom-env provider hook behavior. Thanks @DmitryPogodaev. - Infra/path-guards: add a fast path for canonical absolute POSIX containment checks, avoiding repeated `path.resolve` and `path.relative` work in hot filesystem walkers. Refs #75895, #75575, and #68782. Thanks @Enderfga. - Tools: add a platform-level tool descriptor planner for descriptor-first visibility, generic availability checks, and executor references. Thanks @shakkernerd. - Plugins/tools: cache plugin tool descriptors captured from `api.registerTool(...)` so repeated prompt-time planning can skip plugin runtime loading while execution still loads the live plugin tool. (#76079) Thanks @shakkernerd. - Docs/Codex: clarify that ChatGPT/Codex subscription setups should use `openai/gpt-*` with `agentRuntime.id: "codex"` for native Codex runtime, while `openai-codex/*` remains the PI OAuth route. Thanks @pashpashpash. - Plugins/source checkout: load bundled plugins from the `extensions/*` pnpm workspace tree in source checkouts, so plugin-local dependencies and edits are used directly while packaged installs keep using the built runtime tree. Thanks @vincentkoc. - Plugins/beta: externalize ACPX behind the official `@openclaw/acpx` package so packaged installs keep ACP harness adapter binaries out of core until the ACP backend is installed. Thanks @vincentkoc. - Plugins/beta: externalize diagnostics OpenTelemetry behind the official `@openclaw/diagnostics-otel` package so packaged installs keep the OTEL dependency stack out of core until the plugin is installed. Thanks @vincentkoc. - Plugins/beta: prepare Google Chat, LINE, Matrix, and Mattermost for `2026.5.1-beta.2` npm and ClawHub publishing, and keep publishable plugin dist trees out of the core npm package. Thanks @vincentkoc. - Plugins/beta: prepare BlueBubbles, diagnostics Prometheus, Google Meet, Nextcloud Talk, Nostr, Zalo, and Zalo Personal for `2026.5.1-beta.2` npm and ClawHub publishing. Thanks @vincentkoc. - Plugins/beta: prepare diagnostics OpenTelemetry, Discord, Diffs, Lobster, Memory LanceDB, Microsoft Teams, QQ Bot, Voice Call, and WhatsApp for `2026.5.1-beta.1` npm and ClawHub publishing. Thanks @vincentkoc. - Plugins/beta: prepare Brave, Codex, Feishu, Synology Chat, Tlon, and Twitch for `2026.5.1-beta.1` npm and ClawHub publishing. Thanks @vincentkoc. - Providers/xAI: add Grok 4.3 to the bundled catalog and make it the default xAI chat model. - Google Meet: let API-created rooms set `accessType` and `entryPointAccess`, and add `googlemeet end-active-conference` for closing managed spaces after a call. (#74824) Thanks @BsnizND. - Google Meet: add `googlemeet test-listen` and the matching `google_meet` `test_listen` action so transcribe-mode joins wait for real caption or transcript movement before reporting listen-first health. Refs #72478. Thanks @DougButdorf. - Plugins/ClawHub: prefer versioned ClawPack artifacts when ClawHub publishes digest metadata, verifying the ClawPack response header and downloaded bytes before installing. Thanks @vincentkoc. - Plugins/ClawHub: persist ClawPack digest metadata on ClawHub plugin install and update records so registry refreshes and download verification can reuse stored artifact facts. Thanks @vincentkoc. - Plugins/ClawHub: allow official bundled-plugin cutovers to record ClawHub artifact metadata while preserving npm as the launch default for bare package specs. Thanks @vincentkoc. - Plugins/onboarding: allow install-on-demand provider setup entries to persist ClawHub artifact metadata after explicit ClawHub installs while retaining npm/local fallback paths. Thanks @vincentkoc. - Plugins/Crestodian: add ClawHub plugin search plus Crestodian plugin list/search/install/uninstall operations, with approval and audit coverage for install and uninstall. - Channels/thread bindings: replace split subagent/ACP thread-spawn toggles with `threadBindings.spawnSessions`, default thread-bound spawns on, and let `openclaw doctor --fix` migrate the legacy keys. (#75943) - Providers/OpenAI: add `extraBody`/`extra_body` passthrough for OpenAI-compatible TTS endpoints, so custom speech servers can receive fields such as `lang` in `/audio/speech` requests. Fixes #39900. Thanks @R3NK0R. - Dependencies: refresh workspace dependency pins, including TypeBox 1.1.37, AWS SDK 3.1041.0, Microsoft Teams 2.0.9, and Marked 18.0.3. Thanks @mariozechner, @aws, and @microsoft. - Discord/channels: add reusable message-channel access groups plus Discord channel-audience DM authorization, so allowlists can reference `accessGroup:` across channel auth paths. (#75813) - Crabbox/scripts: print the selected Crabbox binary, version, and supported providers before `pnpm crabbox:*` commands, and reject stale binaries that lack `blacksmith-testbox` provider support. - Agents/Codex: add committed happy-path prompt snapshots for Codex/message-tool Telegram direct, Discord group, and heartbeat turns so prompt drift can be reviewed. Thanks @pashpashpash. ### Fixes - CLI/message: skip eager model context warmup and preserve channel-declared gateway execution for Discord and Telegram message actions, avoiding Codex app-server/model discovery during simple send/read commands. Thanks @fuller-stack-dev. - Agents/exec approvals: parse exec approval result metadata with balanced parentheses so nested-paren denial and finished payloads such as `Exec denied (gateway id=req-1, approval-timeout (allowlist-miss)): ...` are matched and routed to the denied followup branch instead of falling through to the generic followup path. (#72268) Thanks @amittell. - Codex/app-server: resolve managed binaries from bundled `dist` chunks and from the `@openai/codex` package bin when installs do not provide a nearby `.bin/codex` shim, avoiding false missing-binary startup failures. - Plugins/ClawHub: use the ClawHub artifact resolver response as the install decision before downloading, keeping legacy ZIP fallback and future ClawPack npm-pack installs on the same explicit resolver path. Thanks @vincentkoc. - Plugins/ClawHub: keep bare plugin package specs on npm for the launch cutover and reserve ClawHub resolution for explicit `clawhub:` specs until ClawHub pack readiness is deployed. Thanks @vincentkoc. - Plugins/source checkout: discover source-only plugins such as Codex from the `extensions/*` workspace while using npm package excludes as the packaged-core boundary, removing the stale core-bundle metadata path. - Plugins/ClawHub: install ClawPack artifacts from the explicit npm-pack `.tgz` resolver path and persist artifact kind, npm integrity, shasum, and tarball metadata for update and diagnostics flows. Thanks @vincentkoc. - Control UI: allow deployments to configure grouped chat message max-width with a validated `gateway.controlUi.chatMessageMaxWidth` setting instead of patching bundled CSS after upgrades. Fixes #67935. Thanks @xiew4589-lang. - Control UI/Cron: ignore malformed persisted cron rows without valid payloads before they enter UI state and guard stale cron render paths, preventing blank Control UI sections after a bad cron snapshot. Fixes #55047 and #54439; supersedes #54550 and #54552. - Control UI/sessions: bound the default Sessions tab query to recent activity and fewer rows, avoiding expensive full-history loads while keeping filters editable. Fixes #76050. (#76051) Thanks @Neomail2. - Control UI/sessions: apply reliable `sessions.changed` snapshots in-place and refetch only for partial events, avoiding redundant `sessions.list` regeneration during active session updates. - Control UI/sessions: explain the Sessions filter controls with hover tooltips and raise the default list limit to 200 rows. - Control UI/sessions: expand compaction checkpoint details from checkpoint-bearing rows and keep token totals on one line. - Control UI/sessions: group Active and Limit filters together, streamline source toggles, and make the filter section collapsible. - Control UI/sessions: shorten filter tooltips and remove duplicate browser-native tooltip popovers. - Control UI/sessions: keep the expanded filter controls on one row on large screens. - Gateway/channels: cap startup fanout at four channel/account handoffs and recover from Bonjour ciao self-probe races, reducing Windows startup stalls with many Telegram accounts. Fixes #75687. - Gateway/sessions: keep `sessions.list` polling responsive on large session stores by reusing list-safe session cache/indexes and returning a lightweight compaction checkpoint preview instead of heavyweight summaries. Thanks @rolandrscheel. - Control UI/Gateway: keep long-running dashboard WebSocket sessions alive with protocol pings and keep Stop available after reconnect or reload by recovering session-scoped active-run abort state. Fixes #70991. Thanks @alexandre-leng. - CLI/update: treat inherited Gateway service markers as origin hints and only block package replacement when the managed Gateway is still live, so self-updates can stop the service and continue safely. (#75729) Thanks @hxy91819. - Agents/failover: exempt run-level timeouts that fire during tool execution from model fallback, timeout-triggered compaction, and generic timeout payload synthesis, avoiding misleading "LLM request timed out" errors after the primary model has already responded. Fixes #52147. (#75873) Thanks @simonusa. - Docker: copy Bun 1.3.13 from a digest-pinned image and keep CI on the same version. Fixes #74356. Thanks @fede-kamel and @sallyom. - Agents/compaction: keep prior context on consecutive turns against z.ai-style providers (z.ai direct, openrouter z-ai/\*, in-house GLM gateways), avoiding accidental Pi state reset after successful turns. (#76056) Thanks @openperf. - Doctor/plugins: run a one-time 2026.5.2 configured-plugin install repair based on `meta.lastTouchedVersion`, installing actively used downloadable OpenClaw plugins through the configured external source before marking the config touched for the release. - Sessions/transcripts: use one `session.writeLock.acquireTimeoutMs` policy for session transcript lock acquisitions and raise the default wait to 60 seconds, avoiding user-visible lock timeouts during legitimate slow prep, cleanup, compaction, and mirror work. Fixes #75894. Thanks @shandutta. - Control UI: contain the standalone iOS PWA viewport with safe-area-aware document locking, so Add-to-Home-Screen launches cannot scroll past the device bounds. Refs #76072. Thanks @kvncrw. - Agents/restart recovery: match cleaned transcript locks by exact transcript lock paths plus the canonical session fallback, so interrupted main sessions using topic-suffixed transcripts resume after gateway restart. Refs #76052. Thanks @anyech. - Agents/runtime: cache the stable system-prompt prefix and reuse prompt-report tool schema stats during dispatch prep, reducing repeated CPU work before streaming starts. Fixes #75999; supersedes #76061. Thanks @zackchiutw and @STLI69. - Control UI/WebChat: use high-contrast text selection colors so highlighted chat text stays visible across themes. Fixes #60850; supersedes #60854. Thanks @Badschaff and @efe-arv. - Telegram/native commands: pass persisted session files into plugin commands for topic-bound sessions, so `/codex bind` works from Telegram forum topics. Refs #75845 and #76049. Thanks @MatthewSchleder. - Security audit/plugins: ignore plugin install backup, disabled, and dependency debris directories when enumerating installed plugin roots, avoiding false-positive findings for `.openclaw-install-backups` after plugin updates. Fixes #75456. - Telegram: honor runtime conversation bindings for native slash commands in bound top-level groups, so commands like `/status@bot` route to the active non-`main` session instead of falling back to the default route. Fixes #75405; supersedes #75558. Thanks @ziptbm and @yfge. - Gateway/tasks: make task registry maintenance use pass-local backing-session lookups and fresh active child-session indexes, avoiding repeated full task snapshots and session-store clones on large stale registries. Fixes #73517 and #75708; supersedes #74406 and #75709. Thanks @Lightningxxl, @glfruit, and @jared-rebel. - Auth/sessions: JSON-clone auth-profile cache/runtime snapshots and remaining session cleanup previews instead of using `structuredClone`, preserving mutation isolation while avoiding native-memory growth on large stores. Fixes #45438. Thanks @markus-lassfolk. - Models CLI: restore `openclaw models list --provider ` catalog and registry fallback rows for unconfigured providers, so provider-specific verification commands no longer report "No models found." Fixes #75517; supersedes #75615. Thanks @lotsoftick and @koshaji. - Gateway/macOS: write LaunchAgent services with a canonical system PATH and stop preserving old plist PATH entries, so Volta, asdf, fnm, and pnpm shell paths no longer affect gateway child-process Node resolution. Fixes #75233; supersedes #75246. Thanks @nphyde2. - Slack/hooks: preserve bot alert attachment text in message-received hook content when command text is blank. Fixes #76035; refs #76036. Thanks @amsminn. - Sessions/agents: route Gateway session-store writes, CLI cleanup maintenance, and agent-delete session purges through a dedicated in-process writer and borrow the validated mutable cache during the writer slot, avoiding runtime file locks plus repeated `sessions.json` rereads and JSON clones on hot metadata updates. Refs #68554. Thanks @henkterharmsel. - Control UI/chat: show inline feedback when local slash-command dispatch is unavailable or fails unexpectedly instead of clearing the composer silently. Fixes #52105. Thanks @MooreQiao. - Memory/markdown: replace CRLF managed blocks in place and collapse duplicate marker blocks without rewriting unmanaged markdown, so Dreaming and Memory Wiki files self-heal from repeated generated sections. Fixes #75491; supersedes #75495, #75810, and #76008. Thanks @asaenokkostya-coder, @ottodeng, @everettjf, and @lrg913427-dot. - Agents/tools: return critical tool-loop circuit-breaker stops as blocked tool results instead of thrown tool failures, so models see the guardrail and stop retrying the same call. Thanks @rayraiser. - Agents/sessions: preserve pre-existing runtime model and context window after heartbeat turns so a per-run heartbeat model override does not bleed into shared-session status. Fixes #75452. Thanks @zhangguiping-xydt. - Model commands: clarify direct and inline `/model` acknowledgements for non-default selections as session-scoped. Thanks @addu2612. - Doctor/gateway: stop warning that non-existent, unconfigured user-bin directories are required in the Gateway service PATH. Fixes #76017. Thanks @xiphis. - TUI/chat: skip full provider model normalization during context-window warmup while preserving provider-owned context metadata, avoiding cold-start stalls with large model registries. Thanks @547895019. - Agents: enable malformed tool-call argument repair for Codex and Azure OpenAI Responses transports while keeping generic OpenAI Responses paths out of the repair gate. Fixes #75154. Thanks @Nimraakram22. - Memory Wiki: accept relative Markdown links that include the `.md` suffix during broken-wikilink validation, avoiding false positives for native render-mode links. Thanks @Kenneth8128. - OpenAI Codex: show the device-pairing code in the interactive SSH/headless prompt while keeping the short-lived code out of persistent runtime logs. Fixes #74212. Thanks @da22le123. - QA Lab: stop gateway children when the suite parent disappears, so interrupted local QA runs cannot leave hot orphaned gateways behind. - Codex/app-server: tolerate a second connection close during startup recovery and include retry counts plus stringified errors in the restart warning, so concurrent lanes do not fail after one shared-client race. - Plugins/CLI: cache plugin CLI registration entries per command program so completion state generation does not repeat the full plugin sweep in one invocation. Thanks @ScientificProgrammer. - Voice Call: summarize restored-call verification logs during startup while preserving expired-call cleanup, reducing duplicate per-call skip messages. Thanks @jckm14. - Plugins: reuse gateway-bindable plugin loader cache entries for later default-mode loads without serving default-built registries to gateway-bound requests, reducing repeated plugin registration during dispatch. Refs #61756. Thanks @DmitryPogodaev. - Gateway/secrets: include the caught error message in `secrets.reload` and `secrets.resolve` warning logs while keeping RPC errors generic, so operators can diagnose reload and permission failures. Thanks @davidangularme. - Providers/OpenRouter: fill DeepSeek V4 `reasoning_content` replay placeholders for `openrouter/deepseek/deepseek-v4-flash` and `openrouter/deepseek/deepseek-v4-pro`, so thinking/tool follow-up turns do not fail with DeepSeek's replay-shape error. Fixes #76018. Thanks @cloph-dsp. - Anthropic-compatible streams: recover text deltas that arrive before their matching content block, so Kimi Code and similar providers do not finish as empty `incomplete_result` replies. Fixes #76007. Thanks @vliuyt. - fix(infra): block workspace state-directory env override [AI]. (#75940) Thanks @pgondhi987. - MCP/OpenAI: normalize parameter-free tool schemas whose top-level object `properties` is missing, null, or invalid before sending tools to OpenAI, so MCP tools without params stay usable. Fixes #75362. Thanks @tolkonepiu and @SymbolStar. - Control UI/WebChat: add server-side chat-draft microphone dictation via the existing audio transcription pipeline, avoiding browser Web Speech while keeping provider credentials on the Gateway. Fixes #47311. Thanks @jmomford. - TTS: honor explicit short `[[tts:text]]...[[/tts:text]]` blocks while keeping untagged short auto-TTS suppressed, so tagged voice replies are synthesized instead of being dropped as empty voice-only payloads. Fixes #73758. Thanks @yfge. - Hooks/doctor: warn when `hooks.transformsDir` points outside the canonical hooks transform directory, so invalid workspace skill paths get a direct recovery hint before the Gateway crash-loops. Fixes #75853. Thanks @midobk. - Proxy/audio: convert standard `FormData` bodies before proxy-backed undici fetches, so audio transcription and multipart uploads no longer send `[object FormData]` when `HTTP_PROXY` or `HTTPS_PROXY` is configured. Fixes #48554. Thanks @dco5. - Discord: allow explicitly configured ack reactions in tool-only guild channels while keeping automatic lifecycle/status reactions suppressed. Fixes #74922. Thanks @samvilian and @BlueBirdBack. - Discord: enable session-backed A2A announce target lookup so `sessions_send` uses the target session's `deliveryContext.accountId` or `lastAccountId` instead of falling back to the default bot in multi-account setups. Fixes #42652; refs #51626 and #44773; supersedes #73975. Thanks @irchelper, @dpalfox, and @Lanfei. - Discord/setup: write resolved guild/channel allowlist selections to the selected guild and channel instead of falling back to the wildcard guild during setup. Supersedes #47788. Thanks @Eldersonar. - Discord: treat abort-time Carbon reconnect-exhausted events as expected shutdown during stale-socket restarts, so health-monitor restarts no longer reject the monitor lifecycle. Carries forward #58216; supersedes #73949. Thanks @Perttulands. - Discord/native commands: return an explicit warning when slash command dispatch or direct plugin execution produces no visible reply instead of a success-style completion ack. Fixes #58986; supersedes #62057. Thanks @jb510. - Discord: keep typing indicators alive during long tool runs and auto-compaction while keepalive ticks continue, so active sessions do not appear stalled before the final reply. Thanks @Squirbie. - Discord: preserve multipart Content-Type headers for attachment uploads across REST fetch paths, so generated images and other media no longer fail delivery with `CONTENT_TYPE_INVALID`. Thanks @FunJim. - Discord: preserve attachment and sticker filenames when saving inbound media, so agents can see human-readable file names instead of only UUID-based paths. Fixes #59744. Thanks @xela92 and @rockcent. - Discord: preserve non-ASCII channel names in session display labels while keeping allowlist matching on the existing ASCII slug contract. Thanks @swjeong9. - Discord/PluralKit: canonicalize proxied webhook turns to the original Discord message id for inbound dedupe, while preserving the proxy message id for reply routing. Thanks @acgh213. - Discord: only inject thread starter context on the first turn of the effective thread session, so follow-up thread replies do not repeat the starter block. Fixes #41355; supersedes #44447 and #44449. Thanks @p3nchan. - Discord: resolve thread `ownerId` and `parentId` from Discord API-style snake_case payload fields, so bot-owned autoThreads do not require unnecessary mentions. Thanks @mgh3326. - Gateway/diagnostics: include a bounded redacted startup error message in stability bundles, so crash-loop reports identify the failing plugin or contract without exposing secrets. Refs #75797. Thanks @ymebosma. - Gateway/pricing: defer optional model pricing catalog refresh until after sidecars and channels reach the ready path, so slow OpenRouter or LiteLLM pricing fetches cannot block Gateway readiness. Fixes #74128; supersedes #73486. Thanks @ctbritt and @alprclbi. - Gateway/pricing: abort in-flight model pricing catalog fetches when Gateway shutdown stops the refresh loop, and avoid post-stop cache writes or refresh timers. Fixes #72208. Thanks @rzcq. - Codex/app-server: make startup retry cleanup ownership-aware so concurrent Codex lanes cannot close another lane's freshly restarted shared app-server client. Thanks @vincentkoc. - Google Meet/Twilio: report missing dial-in details during setup and explain that Twilio cannot join Meet URLs without a phone dial plan. - Google Meet/Twilio: start the phone leg before sending Meet PIN DTMF, delay intro speech until after the post-connect dial sequence, and log each stage so operators can tell Twilio-leg audio from Meet-room audio. - Voice Call: accept provider call IDs for gateway speak/continue requests and report ended-call state from history instead of returning a generic "Call not found" for stale calls. - Control UI/Talk: allow the OpenAI Realtime WebRTC offer endpoint through the Control UI CSP, configure browser sessions with explicit VAD/transcription input settings, and surface OpenAI realtime error/lifecycle events instead of leaving Talk stuck as live with no diagnostic. Fixes #73427. - Plugins: clarify config-selected duplicate plugin override diagnostics and document manifest schema updates for bundled-plugin forks. Fixes #8582. Thanks @sachah. - CLI backends/Claude: make live-session JSONL turn caps bounded and configurable via `reliability.outputLimits`, raising the default guard for tool-heavy Claude CLI turns while preserving memory limits. Fixes #75838. Thanks @hcordoba840. - Telegram/DMs: keep incidental `message_thread_id` reply-with-quote metadata on the flat DM session by default while preserving opt-in DM topic isolation for configured topics, `dm.threadReplies`, and `direct..threadReplies`. Fixes #75975. Thanks @ProjectEvolutionEVE. - Telegram/network: raise outbound text and typing Bot API request guards to 60 seconds, keep low grammY client timeouts from preempting those guards, let higher `timeoutSeconds` configs extend safe method guards, and retry timed-out typing indicators through the transport fallback without risking duplicate messages. Fixes #76013. Thanks @iaki1206. - Telegram/native commands: register and clear command menus in both default and group-chat scopes, so `/status` and plugin commands stay available in forum topics. Fixes #74032; updates #6457. Thanks @dae-sun and @WouldenShyp. - Providers/OpenAI: resolve `keychain::` `OPENAI_API_KEY` refs before creating OpenAI Realtime browser sessions or voice bridges, with a bounded cached Keychain lookup. Fixes #72120. Thanks @ctbritt. - Discord/gateway: reconnect when the gateway socket closes while waiting for the shared IDENTIFY concurrency window, instead of silently skipping IDENTIFY and leaving the bot online but unresponsive. Fixes #74617. Thanks @zeeskdr-ai. - Voice Call: add `sessionScope: "per-call"` for fresh per-call agent memory while preserving the default per-phone caller history. Fixes #45280. Thanks @pondcountry. - Music generation: raise too-small tool timeouts to the provider-safe 10-second floor and collapse cascading abort fallback errors into a clearer root-cause summary. Thanks @shakkernerd. - Memory-core/dreaming: include the primary runtime workspace in multi-agent dreaming sweeps without mixing main-agent session transcripts into configured subagent workspaces. Fixes #70014. Thanks @ttomiczek. - Control UI: add tab/RPC timing attribution and decouple slow Overview/Cron secondary refreshes so Sessions navigation gets immediate visible feedback. Refs #64004. Thanks @WaMaSeDu. - Memory: retry transient SQLite index file swaps during atomic reindex on Windows, so brief `EBUSY`, `EPERM`, or `EACCES` locks do not fail memory rebuilds. Fixes #64187. Thanks @kunpeng-ai-lab. - Telegram/startup: use the existing `getMe` request guard for the gateway bot probe instead of a fixed 2.5-second budget, and honor higher `timeoutSeconds` configs for slow Telegram API paths. Fixes #75783. Thanks @tankotan. - Telegram/models: make model picker confirmations say selections are session-scoped and do not change the agent's persistent default. Fixes #75965. Thanks @sd1114820. - Control UI/slash commands: keep fallback command metadata on a browser-safe registry path, so provider thinking runtime imports cannot blank the Web UI with `process is not defined`. Fixes #75987. Thanks @novkien. - Heartbeat/Discord: keep async exec completion events out of the generic `System (untrusted)` prompt block and let the dedicated exec heartbeat prompt handle them, so Discord no longer receives raw exec failure tails as separate system-style messages. Fixes #66366. Thanks @Promee-ThaBossHoss. - Channels: strip plain-text MiniMax and XML tool-call scaffolding from shared user-facing reply sanitization, so messaging channels do not deliver raw model tool syntax when a provider emits it as text instead of structured tool calls. Fixes #62820. Thanks @canh0chua. - Infer/media: report missing image-understanding and audio-transcription provider configuration for `image describe`, `image describe-many`, and `audio transcribe` instead of blaming the input path when no provider is available. Fixes #73569 and supersedes #73593, #74288, and #74495. Thanks @bittoby, @tmimmanuel, @Linux2010, and @vyctorbrzezowski. - Docs/health: clarify that session listing surfaces stored conversation rows rather than Discord/channel socket liveness, and point connectivity checks at channel status and health probes. Fixes #70420. Thanks @ashersoutherncities-art and @martingarramon. - WhatsApp/Cron: keep DM pairing-store approvals out of implicit cron and heartbeat recipient fallback, so scheduled automation only uses explicit targets, active configured recipients, or configured `allowFrom` entries. Fixes #62339. Thanks @kelvinisly-collab. - Google Meet: keep the agent-facing `google_meet` tool visible on non-macOS hosts but block local Chrome realtime actions with guidance, so Linux agents can still use transcribe, Twilio, chrome-node, and artifact flows without choosing the macOS-only BlackHole path. Refs #75950. Thanks @actual-software-inc. - macOS/settings: keep opening General from rewriting `openclaw.json` during Tailscale settings hydration, preserving `gateway`, `auth`, `meta`, and `wizard` until the user changes a setting. Fixes #59545. Thanks @Tengdw. - Discord: prioritize interaction callbacks ahead of stale background REST work without polling active REST buckets, validate oversized gateway payloads and member-intent requests before send, and forward explicit component payloads from message actions. (#75363) - Active Memory: use the configured recall timeout as the blocking prompt-build hook budget by default and move cold-start setup grace behind explicit `setupGraceTimeoutMs` config, so the plugin no longer silently extends 15000 ms configs to 45000 ms on the main lane. Fixes #75843. Thanks @vishutdhar. - Plugins/web-provider: reuse the active gateway plugin registry for runtime web provider resolution after deriving the same candidate plugin ids as the loader path, avoiding a redundant `loadOpenClawPlugins` call on every request while preserving origin and scope filters. Fixes #75513. Thanks @jochen. - Crestodian/CLI: exit non-zero when interactive Crestodian is invoked without a TTY, so scripts and CI no longer treat the setup error as success. Fixes #73646 and supersedes #73928 and #74059. Thanks @bittoby, @luyao618, and @Linux2010. - Cron: keep implicit/default isolated cron announce deliveries out of the main session awareness queue, so isolated jobs do not accumulate in the main conversation. Fixes #61426. Thanks @Lihannon. - Subagents: avoid duplicate parent-visible replies when a parent uses `sessions_send` on its own persistent native subagent session, while preserving announce delivery for async sends. Fixes #73550. Thanks @sylviazhang2006-design. - Web search/Brave: add opt-in `brave.http` diagnostics for Brave request URLs/query params, response status/timing, and cache hit/miss/write events without logging API keys or response bodies. Fixes #55196. Thanks @mecampbellsoup. - Web search/Brave: add `plugins.entries.brave.config.webSearch.baseUrl` for Brave-compatible proxies, including endpoint-aware cache keys for both web and LLM Context modes. Fixes #19075. Thanks @jkoprax and @vishnukool. - Web search/config: validate explicit `tools.web.search.provider` values against bundled and installed plugin manifests, while warning for stale third-party plugin config. Fixes #53092. Thanks @TinyTb. - Web search/SearXNG: retry empty non-general category searches once with the general category, so unsupported category engines do not return empty results when general search has matches. Fixes #73552. Thanks @Loukky. - CLI/message: skip gateway-stop hooks for read-only `message read` and bound stop-hook shutdown for other message actions, so one-shot Discord reads cannot hang behind plugin lifecycle cleanup. - Plugins/web-provider: cache repeated bundled web search and web fetch provider registry loads by default while preserving explicit cache opt-outs. Supersedes #75992. Thanks @DmitryPogodaev. - Agents/sandbox: preserve existing workspace file modes when sandbox edits atomically replace files, so 0644 files do not collapse to 0600 after Write/Edit/apply_patch. Fixes #44077. Thanks @patosullivan. - Control UI/WebChat: route typed `/new` through the New Chat dashboard-session creation flow instead of `chat.send`, while keeping `/reset` as the explicit current-session reset. Fixes #69599. Thanks @WolvenRA. - Agents/models: keep legacy CLI runtime model refs such as `claude-cli/*` in the configured allowlist after canonical runtime migration, so cron `payload.model` overrides keep working. Fixes #75753. Thanks @RyanSandoval. - Codex/app-server: restart the shared Codex app-server client once when it closes during startup thread resume, preserving the existing thread binding instead of retrying `thread/start` on a closed client. Thanks @vincentkoc. - Gateway/watch: keep colored subsystem log prefixes in the managed tmux pane even when the parent shell exports `NO_COLOR`, while preserving explicit `FORCE_COLOR=0` opt-out. Thanks @vincentkoc. - Agents/compaction: submit a non-empty runtime-event marker for pre-compaction memory flush turns, so strict Anthropic providers no longer reject the silent flush as an empty user message. Fixes #75305. Thanks @sableassistant3777-source. - Plugin SDK: re-export `isPrivateIpAddress` from `plugin-sdk/ssrf-runtime`, restoring source-checkout builds for SearXNG and Firecrawl private-network guards. Thanks @vincentkoc. - Discord/message actions: advertise `upload-file` and route it through Discord's send runtime with agent-scoped media reads, so agents can discover and send file attachments. Fixes #60652 and supersedes #60808, #61087, and #61100. Thanks @claw-io, @efe-arv, @joelnishanth, and @sjhddh. - Sessions: suppress exact inter-session control replies such as `NO_REPLY` and keep agent-to-agent announce bookkeeping out of visible transcripts. Fixes #53145. Thanks @TarahAssistant. - CLI/directory: report unsupported directory operations for installed channel plugins instead of prompting to reinstall the plugin when it lacks a directory adapter. Fixes #75770. Thanks @lawong888. - Web search/SearXNG: show the JSON API `search.formats` prerequisite during SearXNG setup before prompting for the base URL. Supersedes #65592. Thanks @evanpaul14. - Web search/SearXNG: pass through `img_src` image URLs from SearXNG image-category results. Supersedes #61416. Thanks @sghael. - Web search/Kimi: fail explicitly when Moonshot returns an ungrounded chat answer instead of native web-search evidence, so Kimi no longer reports generic fallback text as a successful search. Fixes #52573. Thanks @wangwllu. - Web search: keep public provider requests on the strict SSRF guard and reserve private-network access for explicit self-hosted SearXNG/Firecrawl endpoints. Fixes #74357 and supersedes #74360. Thanks @fede-kamel. - Firecrawl: reject private, loopback, metadata, and non-HTTP(S) `firecrawl_scrape` target URLs before forwarding them to Firecrawl. Supersedes #48133. Thanks @kn1ghtc. - Web search/Firecrawl: allow self-hosted private/internal Firecrawl `baseUrl` endpoints, including HTTP for private targets, while keeping hosted Firecrawl on the strict official endpoint. Fixes #63877 and supersedes #59666, #63941, and #74013. Thanks @jhthompson12, @jzakirov, @Mlightsnow, and @shad0wca7. - CLI/models: report gateway model fallback attempts in `infer model run --json` and avoid double-prefixing provider-qualified defaults such as `openrouter/auto` in `models status`. Partially fixes #69527. Thanks @alexifra. - Providers/OpenRouter: strip trailing assistant prefill turns from verified OpenRouter Anthropic model requests when reasoning is enabled, so Claude 4.6 routes no longer fail with Anthropic's prefill rejection through the OpenAI-compatible adapter. Fixes #75395. Thanks @sbmilburn. - Voice Call: add per-number inbound routing for dialed-number greetings, response agents/models/prompts, and TTS voice overrides. Fixes #56604. Thanks @healthstatus. - Feishu: preserve Feishu/Lark HTTP error bodies for message sends, media sends, and chat member lookups, so HTTP 400 failures include vendor code, message, log id, and troubleshooter details. Fixes #73860. Thanks @desksk. - Agents/transcripts: avoid reopening large Pi transcript files through the synchronous session manager for maintenance rewrites, persisted tool-result truncation, manual compaction boundary hardening, and queued compaction rotation. Thanks @mariozechner. - Web search/Exa: accept `plugins.entries.exa.config.webSearch.baseUrl`, normalize it to the Exa `/search` endpoint, and partition cached results by endpoint. Fixes #54928 and supersedes #54939. Thanks @mrpl327 and @lyfuci. - Web search/MiniMax: include MiniMax Search in the web-search setup flow and let `MINIMAX_API_KEY` participate in MiniMax Search auto-detection. Supersedes #65828. Thanks @Jah-yee. - Plugins/ClawHub: preserve official source-linked trust through archive installs, so OpenClaw can install trusted ClawHub plugin packages that trigger the built-in dangerous-pattern scanner. Thanks @vincentkoc. - Plugins/ClawHub: install package runtime dependencies for archive-backed plugin installs, so ClawHub packages such as WhatsApp load declared dependencies after download. Thanks @vincentkoc. - Plugins/tools: cache repeated plugin tool factory results only for matching request context, reducing per-turn tool prep without leaking sandbox, session, browser, delivery, or runtime config state. Fixes #75956. Thanks @Linux2010. - Providers/LM Studio: allow `models.providers.lmstudio.params.preload: false` to skip OpenClaw's native model-load call so LM Studio JIT loading, idle TTL, and auto-evict can own model lifecycle. Fixes #75921. Thanks @garyd9. - Agents/transcripts: keep chat history, restart recovery, fork token checks, and stale-token compaction checks on bounded async transcript reads or cached async indexes instead of reparsing large session files. Thanks @mariozechner. - Telegram: inherit the process DNS result order for Bot API transport and downgrade recovered sticky IPv4 fallback promotions to debug logs, while keeping pinned-IP escalation warnings visible. Fixes #75904. Thanks @highfly-hi and @neeravmakwana. - Sessions: keep durable external conversation pointers, including group and thread-scoped chat sessions, out of age, count, and disk-budget maintenance eviction while still allowing synthetic runtime entries to age out. Fixes #58088. Thanks @drinkflav. - Web search/MiniMax: allow `MINIMAX_OAUTH_TOKEN` to satisfy MiniMax Search credentials, so OAuth-authorized MiniMax Token Plan setups do not need a separate web-search key. Fixes #65768. Thanks @kikibrian and @zhouhe-xydt. - Providers/MiniMax: derive Coding Plan usage polling from the configured MiniMax base URL, so global setups no longer query the CN usage host. Fixes #65054. Thanks @sixone74 and @Yanhu007. - Control UI/WebChat: skip assistant-media transcript supplements when stale media refs resolve to no playable media, so text-only final replies are not stored a second time as gateway-injected assistant messages. Fixes #73956. Thanks @HemantSudarshan. - Sessions: reject `sessions_send` targets that resolve to thread-scoped chat sessions, so inter-agent coordination cannot be injected into active human-facing Slack or Discord threads. Fixes #52496. Thanks @barry-p5cc. - Subagents: honor `sessions_spawn` with `expectsCompletionMessage: false` by skipping parent completion handoff delivery while still running child cleanup. Fixes #75848. Thanks @alfredjbclaw. - Media/completions: treat media-only message-tool sends as delivered async completion output, avoiding duplicate raw `MEDIA:` fallback posts after video or music generation finishes. - Gateway/logging: keep deferred channel startup logs on the subsystem logger, so Slack, Discord, Telegram, and voice-call startup messages keep timestamped prefixes. Thanks @vincentkoc. - Codex/app-server: recover JSON-RPC frames split by raw command-output newlines and include a redacted preview when malformed app-server messages still reach the console. Thanks @vincentkoc. - Replies/typing: keep typing alive for queued follow-up messages that are genuinely waiting behind an active run, instead of making chat surfaces look idle while work is queued. Fixes #65685. Thanks @papag00se. - ACP/Discord: suppress completion announce delivery for inline thread-bound ACP session runs, so Discord thread-bound ACP replies are not delivered twice. Fixes #60780. Thanks @solavrc. - Discord/threads: ignore webhook-authored copies in already-bound Discord session threads even when the webhook id differs, preventing PluralKit proxy copies from creating duplicate turn pressure. Fixes #52005. Thanks @acgh213. - Discord/threads: return the created thread as partial success when the follow-up initial message fails, so agents do not retry thread creation and create empty duplicate threads. Fixes #48450. Thanks @dahifi. - Discord/components: consume every button or select in a non-reusable component message after the first authorized click, so single-use panels cannot fire sibling callbacks. Fixes #54227. Thanks @fujiwarakasei. - macOS/config: preserve existing `gateway.auth` and unrelated config keys during app fallback writes, so dashboard or Talk settings changes cannot strand Control UI clients by dropping persisted auth. Fixes #75631. Thanks @Fuma2013. - Control UI/TUI: keep reconnecting chat sends bound to the same backing session id and let TUI relaunches resume the last selected session, avoiding silent fresh sessions after refresh, reconnect, or terminal restart. Fixes #63195, #68162, and #73546. Thanks @bond260312-cmyk, @zhong18804784882, and @mtuwei. - Plugins/tools: let plugin manifests declare static tool availability so reply startup skips unavailable plugin tool runtimes instead of importing factories that only return `null`. Thanks @shakkernerd. - Discord/reactions: skip reaction listener registration when DMs and group DMs are disabled and every configured guild has `reactionNotifications: "off"`, avoiding needless reaction-event queue work. Fixes #47516. Thanks @x4v13r1120. - CLI sessions: preserve explicit manual-attach reuse bindings so trusted CLI sessions are not invalidated on the first turn when auth, prompt, or MCP fingerprints drift. Fixes #75849. Thanks @alfredjbclaw. - Telegram/streaming: keep partial preview streaming enabled for plain reply-to replies, disabling drafts only for real native quote excerpts that require Telegram quote parameters. Fixes #73505. Thanks @choury. - Config: log the "newer OpenClaw" version warning once per process instead of once per config snapshot read. (#75927) Thanks @RomneyDa. - Telegram/message actions: treat benign delete-message 400s as no-op warnings instead of runtime errors, so stale or already-removed messages do not create noisy delete failures. Fixes #73726. Thanks @Avicennasis. - Telegram: split long default markdown sends and media follow-up text into safe HTML chunks, so outbound messages over Telegram's limit no longer fail as one oversized Bot API request. Fixes #75868. Thanks @zhengsx. - Gateway/chat history: merge Claude CLI transcript imports for Anthropic-routed sessions that still have a Claude CLI binding, so local chat history does not hide CLI JSONL turns. Fixes #75850. Thanks @alfredjbclaw. - Media: trim serialized JSON suffixes after local `MEDIA:` directive file extensions, so generated-image metadata cannot pollute the parsed media path and cause false `ENOENT` delivery failures. Fixes #75182. Thanks @TnzGit and @hclsys. - Plugins/runtime: hot-reload Gateway plugin runtime surfaces after plugin enable/disable changes while keeping source-changing plugin install, update, and uninstall operations restart-backed so loaded module code is not reused. Fixes #72097. - Cron: make scheduler reload schedule comparison tolerate malformed persisted jobs, so one bad cron entry no longer aborts the whole tick. Fixes #75886. Thanks @samfox-ai. - Doctor/channels: warn after migrations when default Telegram or Discord accounts have no configured token and their env fallback (`TELEGRAM_BOT_TOKEN` or `DISCORD_BOT_TOKEN`) is unavailable, with secret-safe migration docs for checking state-dir `.env`. Fixes #74298. Thanks @lolaopenclaw. - Gateway/diagnostics: keep idle liveness samples in telemetry instead of visible warning logs unless diagnostic work is active, waiting, or queued. Thanks @vincentkoc. - Channels/cron: reject provider-prefixed targets for the wrong channel and let prefixed announce targets such as `telegram:123` select their channel when delivery falls back to `last`, so Telegram IDs cannot be coerced into WhatsApp phone numbers. Fixes #56839. Thanks @bencoremans. - Control UI/chat: keep live replies visible when a raw session alias such as `main` sends the chat turn but Gateway emits events under the canonical session key for the same run. Fixes #73716. Thanks @teebes. - CLI/models: reject `--agent` on `openclaw models set` and `set-image` instead of silently writing agent-scoped requests to global model defaults. Fixes #68391. Thanks @derrickabellard. - CLI: stop treating the legacy singular `openclaw tool ...` token as a plugin id under restrictive `plugins.allow`, so it falls through as a normal unknown/reserved command instead of suggesting a stale allowlist entry. Fixes #64732. Thanks @efe-arv, @SweetSophia, and @hashtag1974. - Media: write inbound media buffers through same-directory temp files before rename, so failed disk writes do not leave zero-byte artifacts for later voice transcription. Fixes #55966. Thanks @OpenCodeEngineer. - TTS/Telegram: keep trusted local audio generated by the TTS tool queued for voice-note delivery even when the run-level built-in tool list omits the raw `tts` name. Fixes #74752. Thanks @Loveworld3033 and @andyliu. - TTS: require explicit user or config audio intent for the agent speech tool so dashboard chats stay text unless audio is requested. Fixes #69777. Thanks @alexandre-leng. - Plugins/config: keep bundled source-checkout plugins from being runtime-gated by install-only `minHostVersion` metadata, accept prerelease host floors, trim plugin-service startup failures to one log line, and avoid broad channel-runtime loading during base config parsing. Thanks @vincentkoc. - Heartbeat: strip legacy `[TOOL_CALL]...[/TOOL_CALL]` and `[TOOL_RESULT]...[/TOOL_RESULT]` pseudo-call blocks from heartbeat replies before channel delivery. Fixes #54138. Thanks @Deniable9570. - macOS/Voice Wake: send wake-word and Push-to-Talk transcripts through the selected macOS session target instead of always falling back to main WebChat. Fixes #51040. Thanks @carl-jeffrolc. - Providers/xAI: give Grok `web_search` a 60s default timeout, harden malformed xAI Responses parsing, and return structured timeout errors instead of aborting the tool call. Fixes #58063 and #58733. Thanks @dnishimura, @marvcasasola-svg, and @Nanako0129. - Providers/configure: preserve the existing default model when adding or reauthing a provider whose plugin returns a default-model config patch. Fixes #50268. Thanks @rixcorp-oc. - Slack/message actions: send media before the follow-up Block Kit message when Slack `send` includes a file plus presentation or interactive controls, so file attachments are no longer rejected. Fixes #51458. Thanks @HirokiKobayashi-R. - Slack/DMs: honor `dmHistoryLimit` for fresh 1:1 Slack DM sessions by backfilling recent conversation history before the current reply. Fixes #64427. Thanks @brantley-creator. - Slack/DMs: keep top-level direct messages on the stable DM session even when `replyToMode` targets Slack thread replies, preserving context across DM turns. Fixes #58832. Thanks @daye-jjeong. - Slack/delivery: preserve Slack Web API missing-scope details in outbound delivery errors, so queued retry state identifies the OAuth scope to add. Fixes #62391. Thanks @alexey-pelykh. - Slack/capabilities: read granted scopes from `auth.test` response metadata before trying legacy scope APIs, so modern bot tokens no longer report `unknown_method` for channel capabilities. Fixes #44625. Thanks @Qquanwei and @martingarramon. - Slack/DMs: send text/block-only proactive DMs directly with `chat.postMessage(channel=)` while keeping conversation resolution for uploads and threaded sends. Fixes #62042. Thanks @MarkMolina. - Slack/routing: match route bindings written with Slack target syntax such as `channel:C...`, `user:U...`, or `<@U...>`, so bound Slack peers route to the configured agent instead of `main`. Fixes #41608. Thanks @Winnsolutionsadmin. - Slack/routing: match public-channel allowlist entries written as `channel:C...` against bare Slack runtime channel IDs, so allowed channel mentions do not fail as `channel-not-allowed`. Fixes #41264 and supersedes #56530. Thanks @babutree and @Realworld404. - Slack/message actions: prefer the account bound to the outbound target peer before falling back to the agent's first channel account, so multi-workspace sends use the intended Slack account. Supersedes #66807. Thanks @rijhsinghani. - Slack/delivery: retry Slack Web API writes only when the SDK wraps a DNS request failure such as `EAI_AGAIN`, so transient resolver hiccups can recover without retrying platform errors that may duplicate messages. Fixes #68789. Thanks @sonnyb9. - Slack/message actions: forward agent-scoped media roots through the bundled upload-file action path, so workspace files can be attached without failing the local-media guard. Fixes #64625. Thanks @benpchandler. - Slack/mentions: resolve `` user-group mentions through Slack `usergroups.users.list` and treat them as explicit mentions only when the bot user is a member, so mention-gated agent channels wake for real user-group mentions without config-only allowlists. Fixes #73827. Thanks @CG-Intelligence-Agent-Jack. - Slack/message tool: let `read` fetch an exact Slack message timestamp, including a specific thread reply when paired with `threadId`, instead of returning only the parent thread or recent channel history. Fixes #53943. Thanks @zomars. - PDF/Gemini: send native PDF analysis API keys in the `x-goog-api-key` header instead of the request URL, keeping secrets out of proxy and access logs. Supersedes #60600. Thanks @garagon. - Web search/Gemini: route agent abort signals into provider fetches and log provider-side abort failures as normal tool errors instead of silently aborting the run. Fixes #72995. Thanks @RoseKongPS. - Web search: point missing-key errors to `web_fetch` for known URLs and the browser tool for interactive pages. Thanks @zhaoyang97. - Web search: late-bind managed agent `web_search` calls to the current runtime config snapshot, so existing sessions do not keep stale unresolved SecretRefs after secrets reload. Fixes #75420. Thanks @richardmqq. - Web search/Gemini: reuse `models.providers.google.apiKey` and `models.providers.google.baseUrl` as lower-priority fallbacks for Gemini web search after dedicated search config and `GEMINI_API_KEY`. Supersedes #57496. Thanks @Aoiujz. - Web search/Gemini: pass `freshness` and `date_after`/`date_before` filters through Google Search grounding time ranges. Fixes #66498. Thanks @ismael-81. - Web search/DuckDuckGo: include the keyless DuckDuckGo provider in the web search setup wizard. Fixes #65862 and supersedes #65940. Thanks @Jah-yee. - Web search: honor `baseUrl` overrides for Gemini, Grok, and x_search provider-owned config, so proxy-backed search tools no longer dial hardcoded public endpoints. Supersedes #61972. Thanks @Lanfei. - Web search/Brave: point Brave provider metadata at the canonical `/tools/brave-search` docs page and make the legacy `/brave-search` docs page a redirect stub. Fixes #65870 and supersedes #65892. Thanks @Magicray1217 and @Jah-yee. - Web search/Brave: allow `freshness` and bounded date ranges in `llm-context` mode, matching Brave's documented LLM Context API support. Supersedes #51005. Thanks @remusao. - Web fetch: resolve external plugin `webFetchProviders` for non-sandboxed `web_fetch`, while keeping sandboxed fetches limited to bundled providers. Fixes #74915. Thanks @ultrahighsuper and @mingmingtsao. - Heartbeat: strip legacy `[TOOL_CALL]...[/TOOL_CALL]` and `[TOOL_RESULT]...[/TOOL_RESULT]` pseudo-call blocks from heartbeat replies before channel delivery. Fixes #54138. Thanks @Deniable9570. - macOS/Voice Wake: send wake-word and Push-to-Talk transcripts through the selected macOS session target instead of always falling back to main WebChat. Fixes #51040. Thanks @carl-jeffrolc. - Providers/xAI: give Grok `web_search` a 60s default timeout, harden malformed xAI Responses parsing, and return structured timeout errors instead of aborting the tool call. Fixes #58063 and #58733. Thanks @dnishimura, @marvcasasola-svg, and @Nanako0129. - Slack/directory: make `openclaw directory peers/groups list --channel slack` prefer token-backed live readers and return the connected Slack account from `directory self`, so valid Slack tokens no longer produce empty directory CLI results. Fixes #50776. Thanks @pjaillon. - Slack: keep assistant typing status, temporary typing reactions, and status reactions active for group/channel turns that use message-tool-only visible replies, while still suppressing automatic source replies. Fixes #75877. Thanks @teosborne. - Slack: recover full inbound DM text from top-level rich-text blocks when Slack sends a shortened message preview, so long direct messages still reach the agent intact. Fixes #55358. Thanks @tonyjwinter. - Replies: strip legacy `[TOOL_CALL]{tool => ..., args => ...}[/TOOL_CALL]` pseudo-call text from user-facing replies and flag it in tool-call diagnostics instead of showing raw tool syntax in channels. Fixes #63610. Thanks @canh0chua. - WhatsApp: close long-lived web sockets through Baileys `end(error)` before falling back to raw websocket close, so listener teardown runs Baileys cleanup instead of leaving zombie sockets. Fixes #52442. Thanks @essendigitalgroup-cyber. - Twitch/plugins: emit a flat JSON Schema for Twitch channel config so single-account and multi-account configs validate before runtime load, and add source-checkout diagnostics for missing pnpm workspace dependencies. Thanks @vincentkoc. - Gateway/sessions: move hot transcript reads and mirror appends onto async bounded IO with serialized parent-linked writes, keeping large session histories from stalling Gateway requests and channel replies. Fixes #75656. Thanks @DerFlash. - macOS/Talk Mode: downmix multi-channel microphone buffers before handing them to Apple Speech across Push-to-Talk, Talk Mode, Voice Wake, and the wake-word tester, so pro audio interfaces no longer produce empty transcripts. Fixes #42533. Thanks @jbuecker. - macOS/Talk Mode: subscribe native WebChat to active-session transcript updates and render external spoken user turns in the chat thread instead of only showing assistant replies. Fixes #75155. Thanks @SledderBling. - macOS/Voice Wake: accept trigger-only phrases in the built-in Voice Wake test, matching the settings UI and runtime trigger-only path instead of requiring extra command text after the wake word. Fixes #64986. Thanks @zoiks65. - Cron/TTS: run cron announce payloads through the normal TTS directive transform before outbound delivery, so scheduled `[[tts]]` replies generate voice payloads instead of leaking raw tags. Fixes #52125. Thanks @kenchen3000. - WhatsApp: save downloadable quoted image media from reply context as inbound media, so agents can inspect an image that a user replied to instead of only seeing ``. Fixes #59174. Thanks @gaffner. - Sessions/store: stop persisting the runtime-only `skillsSnapshot.resolvedSkills` array inside each session entry, so `sessions.json` no longer carries a copy of every parsed `SKILL.md` body for every active session; `ensureSkillSnapshot` rehydrates the array from disk on cold resume so the embedded runner, the Claude CLI skills plugin, and the Claude live-session fingerprint all see populated skills, and legacy stores self-heal on the next save. Refs #11950, #6650, #15000. Thanks @amoghasgekar. - Doctor/WhatsApp: warn when Linux crontabs still run the legacy `ensure-whatsapp.sh` health check, which can misreport `Gateway inactive` when cron lacks the systemd user-bus environment. Fixes #60204. Thanks @mySebbe. - Slack/setup: print the generated app manifest as plain JSON instead of embedding it inside the framed setup note, so it can be copied into Slack without deleting border characters. Fixes #65751. Thanks @theDanielJLewis. - Channels/WhatsApp: route CLI logout through the live Gateway and stop runtime-backed listeners before channel removal, so removing a WhatsApp account does not leave the old socket replying until restart. Fixes #67746. Thanks @123Mismail. - Voice Call/Twilio: honor TTS directive text and provider voice/model overrides during telephony synthesis, so `[[tts:...]]` tags are not spoken literally and voiceId overrides reach OpenAI/ElevenLabs calls. Fixes #58114. Thanks @legonhilltech-jpg. - Agents/session-locks: reclaim untracked current-process session locks with matching starttime during acquisition and startup cleanup, so Gateway restarts recover from self-owned orphan `.jsonl.lock` files. Fixes #75805; refs #49603. Thanks @cdznho. - Agents/subagents: initialize built-in context engines before native `sessions_spawn` resolves spawn preparation, so cliBackend-only cold starts no longer fail with an unregistered `legacy` context engine. Fixes #73095. (#73904) Thanks @brokemac79. - Plugins/Bonjour: ship the ciao runtime dependency with packaged OpenClaw so fresh OCM envs can start default mDNS discovery without a missing-module failure. Thanks @shakkernerd. - Agents/tools: scope reply plugin-tool discovery to manifest-declared tool owners and already-active matching tool entries, avoiding broad plugin runtime loading for narrow or core-only tool allowlists. Thanks @shakkernerd. - Agents/replies: defer implicit image model discovery and keep OAuth auth-store adoption on persisted profiles during reply startup, cutting OCM MarCodex warm prep to sub-second in live checks. Thanks @shakkernerd. - Plugins/tools: enforce `contracts.tools` as the manifest ownership contract for plugin tool registration, rejecting undeclared runtime tool names and adding bundled plugin drift coverage. Thanks @shakkernerd. - Agents/Codex: stop prompting message-tool-only source turns to finish with `NO_REPLY`, so quiet turns are represented by not calling the visible message tool instead of conflicting final-text instructions. Thanks @pashpashpash. - Gateway/config: report failed backup restores as failed in logs and config observe audit records instead of marking them valid. (#70515) Thanks @davidangularme. - Compaction: use the active session model fallback chain for implicit summarization failures without persisting fallback model selection, so Azure content-filter 400s can recover. Fixes #64960. (#74470) Thanks @jalehman and @OpenCodeEngineer. - Gateway/config: allow `gateway config.patch` to update documented subagent thinking defaults. Fixes #75764. (#75802) Thanks @kAIborg24. - Plugins/CLI: keep git plugin install paths credential-free, preserve existing git checkouts until replacement succeeds, honor duplicate npm install mode, and remove managed git repos on uninstall. Thanks @vincentkoc. - Plugins/CLI: redact authenticated git URLs from git install command failure details, so failed clone or checkout output cannot leak credentials during plugin installs. Thanks @vincentkoc. - Channels/status reactions: remove stale non-terminal lifecycle reactions when a run reaches done or error, so Discord does not leave a permanent thinking emoji after completion. Fixes #75458. Thanks @davelutztx. - Discord/doctor: migrate unsupported per-channel `agentId` entries under guild channel config into top-level `bindings[]` routes, so `openclaw doctor --fix` preserves the intended agent route instead of stripping it as an unknown key. Fixes #62455. Thanks @lobster-biscuit. - Discord/DMs: set inbound direct-message `ctx.To` to the semantic `user:` target while keeping delivery routed through the DM channel, so mirror and recovery paths do not treat DMs as channel conversations. Fixes #68126. Thanks @illuminate0623. - Discord/DMs: keep no-guild inbound messages on direct-message routing when Discord channel lookup is temporarily unavailable, preventing degraded DMs from forking into channel sessions. Fixes #59817. Thanks @DooPeePey. - Discord: retry outbound API calls on HTTP 5xx, request-timeout, and transient transport failures instead of only Discord rate limits, reducing dropped cron and agent replies during short Discord or network outages. Fixes #52396. Thanks @sunshineo. - Discord: include Components v2 Text Display content from referenced replies and forwarded snapshots, so component-only messages still appear in reply context. Fixes #56228. Thanks @HollandDrive. - Discord: add configurable gateway READY timeouts for startup and runtime reconnects, so staggered multi-account setups can avoid false restart loops. Fixes #72273. Thanks @sergionsantos. - Discord: preserve native slash-command description localizations through command reconcile, so localized Discord descriptions no longer get overwritten by English defaults. Fixes #56580. Thanks @mhseo93. - Discord: add configured outbound mention aliases so known `@Name` references can be rewritten to real Discord user mentions instead of relying only on the transient directory cache. Fixes #67587. Thanks @McoreD. - Discord: avoid startup REST amplification by skipping native command deploy retries after Discord rate limits and deriving the bot id from parseable bot tokens instead of requiring a `/users/@me` lookup. Fixes #75341. Thanks @PrinceOfEgypt. - Plugins/hooks: derive hook `ctx.channelId` from the conversation target instead of the provider name, so Discord and other channel plugins can keep per-channel state isolated. Fixes #59881. Thanks @bradfreels. - Gateway/config: log config health-state write failures instead of silently hiding config observe-recovery write errors. Thanks @sallyom. - Diagnostics: reset stuck-session timers on reply, tool, status, block, and ACP progress events, and back off repeated `session.stuck` diagnostics while a session remains unchanged. Supersedes #72010. Thanks @rubencu. - Gateway/agents: avoid rebuilding core tools for plugin-only allowlists and keep the full plugin registry cache warm across scoped plugin loads, reducing per-turn latency spikes. Fixes #75882, #75907, #75906, #75887, and #75851. (#75922) Thanks @obviyus. - Agents/failover: classify bare `status: internal server error` provider messages as retryable server errors so model fallback can rotate instead of stopping. (#73844) Thanks @thesomewhatyou. - Gateway/startup: return the shared retryable startup-sidecars error for startup-gated control-plane RPCs such as sessions.create, sessions.send, sessions.abort, agent.wait, and tools.effective, so clients can retry early sidecar races. (#76012) Thanks @scoootscooob. - Providers/Google: fix Gemini 2.5 Flash-Lite `reasoning: "minimal"` rejections by raising its thinking-budget floor to 512 while preserving the existing Gemini 2.5 Pro and Flash minimal presets. (#70629) Thanks @ericberic. - Agents/status: resolve `session_status(sessionKey="current")` for sparse channel-plugin sessions after literal current lookups miss, so Scope, Slack, Discord, and other plugin-driven agents avoid retrying through `Unknown sessionKey: current`. Fixes #74141. (#72306) Thanks @bittoby. - Cron: retry recurring wake-now main-session jobs through temporary heartbeat busy skips before recording success, so queued cron events no longer appear as ok ghost runs while the main lane is still busy. Fixes #75964. (#76083) Thanks @kshetrajna12 and @xuruiray. - Providers/Google: keep Gemini thinking-signature-only stream chunks active during reasoning, so Gemini 3.1 Pro Preview replies no longer hit idle timeouts before visible text. Fixes #76071. (#76080) Thanks @marcoschierhorn and @zhangguiping-xydt. - CLI/skills: show per-agent model and command visibility in `openclaw skills check --agent`, and let doctor report or disable unavailable skills allowed for the default agent. (#75983) Thanks @mbelinky. ## 2026.4.29 ### Highlights - Messaging and automation get active-run steering by default, visible-reply enforcement, spawned subagent routing metadata, and opt-in follow-up commitments for heartbeat-delivered reminders. Thanks @vincentkoc, @scoootscooob, @samzong, and @vignesh07. - Memory grows into a people-aware wiki with provenance views, per-conversation Active Memory filters, partial recall on timeout, and bounded REM preview diagnostics. Thanks @vincentkoc, @quengh, @joeykrug, and @samzong. - Provider/model coverage expands with NVIDIA onboarding/catalogs plus faster manifest-backed model/auth paths, Bedrock Opus 4.7 thinking parity, and safer Codex/OpenAI-compatible replay and streaming behavior. Thanks @eleqtrizit, @shakkernerd, @prasad-yashdeep, @woodhouse-bot, and @LyHug. - Gateway and packaged-plugin reliability focuses on slow-host startup, reusable model catalogs, event-loop readiness diagnostics, runtime-dependency repair, stale-session recovery, and version-scoped update caches. Thanks @lpendeavors, @DerFlash, @vincentkoc, @pashpashpash, and @jhsmith409. - Channel fixes cluster around Slack Block Kit limits, Telegram proxy/webhook/polling/send resilience, Discord startup/rate-limit handling, WhatsApp delivery/liveness, and Microsoft Teams/Matrix/Feishu edge cases. Thanks @slackapi, @SymbolStar, @djgeorg3, @TinyTb, @dseravalli, @nklock, and @alex-xuweilong. - Security and operations add OpenGrep scanning, sharper GHSA triage policy, safer exec/pairing/owner-scope handling, Docker/onboarding automation, and web-fetch IPv6 ULA opt-in for trusted proxy stacks. Thanks @jesse-merhi, @pgondhi987, @mmaps, @jinjimz, and @jeffrey701. ### Changes - Dependencies: refresh bundled runtime and plugin dependency pins, including Pi 0.71.1, OpenAI 6.35.0, Codex 0.128.0, Zod 4.4.1, and Matrix 41.4.0. Thanks @mariozechner. - Agents/workspace: add `agents.defaults.skipOptionalBootstrapFiles` for skipping selected optional workspace files during bootstrap without disabling required workspace setup. (#62110) Thanks @mainstay22. - Plugins/CLI: add first-class `git:` plugin installs with ref checkout, commit metadata, normal scanner/staging, and `plugins update` support for recorded git sources. Thanks @badlogic. - Google Meet: add live caption health for Chrome transcribe mode, including caption observer state, transcript counters, last caption text, and recent transcript lines in status and doctor output. Refs #72478. Thanks @DougButdorf. - Voice Call/Google Meet: add Twilio Meet join phase logs around pre-connect DTMF, realtime stream setup, and initial greeting handoff for easier live-call debugging. Thanks @donkeykong91 and @PfanP. - macOS app: move recent session context rows into a Context submenu while keeping usage and cost details root-level, so the menu bar companion stays compact with many active sessions. Thanks @guti. - Gateway/SDK: add SDK-facing tools.invoke RPC with shared HTTP policy, typed approval/refusal results, and SDK helper support. Refs #74705. Thanks @BunsDev and @ai-hpc. - Discord: keep active buttons, selects, and forms working across Gateway restarts until they expire, so multi-step Discord interactions are less likely to break during upgrades or restarts. Thanks @amknight. - Messages/docs: clarify that `BodyForAgent` is the primary inbound model text while `Body` is the legacy envelope fallback, and add Signal coverage so channel hardening patches target the real prompt path. Refs #66198. Thanks @defonota3box. - Slack: publish a safe default App Home tab view on `app_home_opened` and include the Home tab event in setup manifests. Fixes #11655; refs #52020. Thanks @TinyTb. - Slack: keep track of bot-participated threads across restarts, so ongoing threaded conversations can continue auto-replying after the Gateway is restarted. Thanks @amknight. - Control UI/Usage: add UTC quarter-hour token buckets for the Usage Mosaic and reuse them for hour filtering, keeping the legacy session-span fallback for older summaries. (#74337) Thanks @konanok. - BlueBubbles: add opt-in `channels.bluebubbles.replyContextApiFallback` that fetches the original message from the BlueBubbles HTTP API when the in-memory reply-context cache misses (multi-instance deployments sharing one BB account, post-restart, after long-lived TTL/LRU eviction). Off by default; channel-level setting propagates to accounts that omit the flag through `mergeAccountConfig`; routed through the typed `BlueBubblesClient` so every fetch is SSRF-guarded by the same three-mode policy as every other BB client request; reply-id shape is validated and part-index prefixes (`p:0/`) are stripped before the request; concurrent webhooks for the same `replyToId` coalesce into one fetch and successful responses populate the reply cache for subsequent hits. Also promotes BlueBubbles attachment download failures from verbose to runtime error so silently-dropped inbound images are visible at default log level, and extends `sanitizeForLog` to redact `?password=…`/`?token=…` query params and `Authorization:` headers before they reach the log sink (CWE-532). (#71820) Thanks @coletebou and @zqchris. - CLI/proxy: add `openclaw proxy validate` so operators can verify effective proxy configuration, proxy reachability, and expected allow/deny destination behavior before deploying proxy-routed OpenClaw commands. (#73438) Thanks @jesse-merhi. - Agents/Codex: default Codex app-server dynamic tools to native-first, keeping OpenClaw integration tools while leaving file, patch, exec, and process ownership to the Codex harness. (#75308) Thanks @pashpashpash. - Agents/Codex: default Codex-harness direct source replies to the OpenClaw `message` tool when visible reply delivery is not explicitly configured, keeping channel-visible output as a deliberate tool call. (#75765) Thanks @pashpashpash. - Heartbeats/agents: add a structured `heartbeat_respond` tool for tool-capable heartbeat runs so agents can record quiet outcomes or explicit notification text without relying only on `HEARTBEAT_OK` parsing. (#75765) Thanks @pashpashpash. - Gateway/config: allow `$include` directives to read files from operator-approved `OPENCLAW_INCLUDE_ROOTS` directories while preserving default config-directory confinement. Thanks @ificator. - Security/tools: configured tool sections (`tools.exec`, `tools.fs`) no longer implicitly widen restrictive profiles (`messaging`, `minimal`). Users who need those tools under a restricted profile must add explicit `alsoAllow` entries; a startup warning identifies affected configs. Fixes #47487. Thanks @amknight. - Gateway/SDK: add SDK-facing artifact list/get/download RPCs and App SDK helpers with transcript provenance and download-source guardrails. Refs #74706. Thanks @tmimmanuel. - Agents/commitments: add opt-in inferred follow-up commitments with hidden batched extraction, per-agent/per-channel scoping, heartbeat delivery, CLI management, a simple `commitments.enabled`/`commitments.maxPerDay` config, and heartbeat-interval due-time clamping so magical check-ins do not echo immediately. (#74189) Thanks @vignesh07. - Messages/queue: make `steer` drain all pending Pi steering messages at the next model boundary, keep legacy one-at-a-time steering as `queue`, and add a dedicated steering queue docs page. Thanks @vincentkoc. - Messages/queue: default active-run queueing to `steer` with a 500ms followup fallback debounce, and document the queue modes, precedence, and drop policies on the command queue page. Thanks @vincentkoc. - Messages: add global `messages.visibleReplies` so operators can require visible output to go through `message(action=send)` for any source chat, while `messages.groupChat.visibleReplies` stays available as the group/channel override. Thanks @scoootscooob. - Gateway/events: surface `spawnedBy` on subagent chat and agent broadcast payloads so clients can route child session events without an extra session lookup. (#63244) Thanks @samzong. - Memory/wiki: add agent-facing people wiki metadata, canonical aliases, person cards, relationship graphs, privacy/provenance reports, evidence-kind drilldown, and search modes for person lookup, question routing, source evidence, and raw claims. Thanks @vincentkoc. - Active Memory: add optional per-conversation `allowedChatIds` and `deniedChatIds` filters so operators can enable recall only for selected direct, group, or channel conversations while keeping broad sessions skipped. (#67977) Thanks @quengh. - Active Memory: return bounded partial recall summaries when the hidden memory sub-agent times out, including the default temporary-transcript path, so useful recovered context is not discarded. (#73219) Thanks @joeykrug. - Gateway/memory: add a read-only `doctor.memory.remHarness` RPC so operator clients can preview bounded REM dreaming output without running mutation paths. (#66673) Thanks @samzong. - Providers/NVIDIA: add the NVIDIA provider with API-key onboarding, setup docs, static catalog metadata, and literal model-ref picker support so NVIDIA hosted models can be selected with their provider prefix intact. (#71204) Thanks @eleqtrizit. - Models: suppress explicitly configured openai-codex/gpt-5.4-mini inline entries so a stale models config written by `openclaw doctor --fix` cannot bypass the manifest capability block and cause repeated assistant-turn failures when the runtime switches to that model on ChatGPT-backed Codex accounts. Conditional suppressions (e.g. qwen Coding Plan endpoint guards) remain bypassable by explicit user configuration. (#74451) Thanks @0xCyda, @hclsys, and @Marvae. - Added SQLite-backed plugin state store (`api.runtime.state.openKeyedStore`) for restart-safe keyed registries with TTL, eviction, and automatic plugin isolation. Thanks @amknight. - Plugin SDK: mark remaining legacy alias exports and diffs tool/config aliases with deprecation metadata, and add a guard so future legacy alias comments require `@deprecated` tags. Thanks @vincentkoc. - CLI/QR/dependencies: internalize small terminal progress and QR wrapper helpers while keeping the real QR encoder dependency direct, reducing the default runtime dependency graph without changing QR output behavior. Thanks @vincentkoc. - Dependencies: refresh workspace runtime, plugin, and tooling packages, including ACP, Pi, AWS SDK, TypeBox, pnpm, oxlint, oxfmt, jsdom, pdfjs, ciao, and tokenjuice, while keeping patched ACP behavior and lint gates current. Thanks @mariozechner. - Gateway/dev: run `pnpm gateway:watch` through a named tmux session by default, with `gateway:watch:raw` and `OPENCLAW_GATEWAY_WATCH_TMUX=0` for foreground mode, so repeated starts respawn an inspectable watcher without trapping the invoking agent shell. Thanks @vincentkoc. - Gateway/diagnostics: emit an opt-in startup diagnostics timeline that records gateway lifecycle and plugin-load phases behind a config flag, so slow-start diagnosis no longer requires bespoke instrumentation. Thanks @shakkernerd. - Control UI/i18n: extend the locale registry with new Persian (fa), Dutch (nl), Vietnamese (vi), Italian (it), Arabic (ar), and Thai (th) entries and ship `fa`, `nl`, `vi`, and `zh-TW` docs glossaries, so the docs translation pipeline and the Control UI language picker stay aligned across surfaces. Thanks @vincentkoc. - Channels: add Yuanbao channel docs entrance so the Tencent Yuanbao bot appears in the channel listing and sidebar navigation. (#73443) Thanks @loongfay. - Channels/Yuanbao: update plugin GitHub location to YuanbaoTeam/yuanbao-openclaw-plugin and add "yuanbao" alias to channel catalog. (#74253) Thanks @loongfay. - Docker setup: add `OPENCLAW_SKIP_ONBOARDING` so automated Docker installs can skip the interactive onboarding step while still applying gateway defaults. (#55518) Thanks @jinjimz. - Security policy: classify media/base64 decode and format-conversion overhead after configured acceptance limits as performance-only for GHSA triage unless a report demonstrates a limit bypass, crash, exhaustion, data exposure, or another boundary bypass. (#74311) - Security/OpenGrep: add a precise OpenGrep rulepack, source-rule compiler, provenance metadata check, and PR/full scan workflows that validate first-party code and rulepack-only changes while uploading SARIF to GitHub Code Scanning. (#69483) Thanks @jesse-merhi. ### Fixes - Skills/OpenAI Whisper: restore executable bits for bundled Whisper and video-frame shell helpers and add a release check for non-executable bundled skill shell scripts, so packaged installs no longer fail with permission-denied errors. Fixes #9303. Thanks @nikolasdehor. - Agents/tools: skip unavailable media generation and PDF tool factories from the live reply path when Gateway metadata and the active auth store prove no configured provider can back them, while keeping explicit config and auth-backed providers on the normal factory path. Thanks @shakkernerd. - Agents/runtime: reuse the Gateway metadata startup plan when ensuring reply runtime plugins are loaded, so live agent turns do not broad-load plugin runtimes after the Gateway already scoped startup activation. Thanks @shakkernerd. - Agents/runtime: delegate scoped reply runtime registry reuse to the plugin loader cache-key compatibility checks, so config changes with the same startup plugin ids cannot keep stale runtime hooks or tools active. Thanks @shakkernerd. - Agents/runtime: let compatible wider plugin registries satisfy scoped reply runtime requests when they already contain the requested plugins, avoiding redundant runtime loading without bypassing loader cache-key freshness checks. Thanks @shakkernerd. - Agents/runtime: validate agent model allowlists against manifest model catalog metadata during reply startup, avoiding broad provider runtime catalog loading before the agent run lane starts. Thanks @shakkernerd. - Agents/runtime: keep allowlisted configured model thinking metadata available when manifest catalog rows are absent, so explicit high-reasoning levels remain valid for custom configured models. Thanks @shakkernerd. - Agents/tools: preserve plugin-declared config-only generation providers such as local Comfy workflows during reply tool pre-gating, and share manifest auth/config availability checks between the planner and final tool factories. Thanks @shakkernerd. - Agents/tools: keep Comfy generation tools visible from legacy local workflow config and cloud API-key config when no Gateway metadata snapshot is active, using plugin-declared manifest signals instead of loading provider runtimes. Thanks @shakkernerd. - Agents/tools: route media and generation capability lookups through the Gateway plugin metadata snapshot during reply tool registration, avoiding repeated manifest registry reloads on the live reply path. Thanks @shakkernerd. - Agents/tools: let plugins declare media generation auth aliases and base-url guards in manifests, preserving OpenAI Codex OAuth image generation availability without core-owned provider special cases. Thanks @shakkernerd. - Agents/tools: reuse the auth profile store already loaded for the active run when deciding media and generation tool availability, avoiding repeated provider-auth runtime discovery during reply startup. Thanks @shakkernerd. - Agents/tools: keep image, video, and music generation tool registration on manifest/auth control-plane checks instead of loading runtime provider registries during reply startup, reducing live-path tool-prep blocking while leaving provider runtime resolution for execution and list actions. Thanks @shakkernerd. - Discord: document canonical mention formatting in agent prompt hints and channel docs so outbound replies use `<@USER_ID>`, `<#CHANNEL_ID>`, and `<@&ROLE_ID>` instead of legacy nickname mentions. (#75173) - Heartbeat scheduler: gate exec-event/notification/spawn/retry wakes through a centralized cooldown so backgrounded `process.start` exit notifications can no longer self-feed runaway heartbeat runs (configured `every: "30m"` was firing every ~10s in production, pegging the gateway event loop with `eventLoopDelayMaxMs >6s` spikes that stalled control-UI asset serving and TUI handshakes). Documented wake-now paths (`manual`, `wake`, task completion, blocked-task follow-up, `/hooks/wake mode=now`, and cron `--wake now`) remain immediate; retryable busy skips no longer poison the cooldown for the next retry; per-agent flood guard caps any unexpected feedback loop at 5 runs/60s. (#64016, refs #17797 and #75436) Thanks @hexsprite. - fix: block workspace CLOUDSDK_PYTHON override and always set trusted interpreter for gcloud. (#74492) Thanks @pgondhi987. - Providers/Z.AI: move the bundled GLM catalog and auth env metadata into the plugin manifest, so `models list --all --provider zai` shows the full known catalog without duplicated runtime seed data. Thanks @shakkernerd. - Providers/Qianfan and Providers/Stepfun: declare setup auth metadata (`api-key` method, `QIANFAN_API_KEY`, `STEPFUN_API_KEY`) in the plugin manifest so onboarding and `models setup` surface the expected env var without falling back to legacy `providerAuthEnvVars` runtime seed data. Thanks @shakkernerd. - fix(infra): block ambient Homebrew env vars from brew resolution. (#74463) Thanks @pgondhi987. - Onboarding/configure: avoid staging every default plugin runtime dependency after config writes, so skipped setup flows only prepare config-selected plugin deps instead of pulling broad feature-plugin packages. Thanks @vincentkoc. - Thinking/providers: resolve bundled provider thinking profiles through lightweight provider policy artifacts when startup-lazy providers are not active, so OpenAI Codex GPT-5.x keeps xhigh available in Gateway session validation. Fixes #74796. Thanks @maxschachere. - Security/Windows: ignore workspace `.env` system-path variables and resolve stale-process `taskkill.exe` from the validated Windows install root, preventing repository-local env files from redirecting cleanup helpers. Thanks @pgondhi987. - CLI/plugins: refresh persisted plugin registry policy in place for `plugins enable` and `plugins disable`, so routine toggles no longer rebuild and hash every plugin source when the target is already indexed. Thanks @vincentkoc. - Windows/install: run npm from a writable installer temp directory and pin the Bedrock runtime dependency below a Windows ARM Node 24 npm resolver failure, so global OpenClaw installs no longer fail before onboarding. Thanks @mariozechner. - CLI/plugins: scope install and enable slot selection to the selected plugin manifest/runtime fallback, so plugin installs no longer load every plugin runtime or broad status snapshot just to update memory/context slots. Thanks @vincentkoc. - Browser/snapshot: propagate the configured snapshot timeout through the agent tool, Chrome MCP, and Playwright snapshot paths so snapshot actions honor the requested deadline instead of hanging. Fixes #72934. Thanks @masatohoshino. - Plugins/TTS: keep bundled speech-provider discovery available on cold package Gateway paths and add bundled plugin matrix runtime probes for health, readiness, RPC, TTS discovery, and post-ready runtime-deps watchdog coverage. Refs #75283. Thanks @vincentkoc. - Google Meet/Twilio: show delegated voice call ID, DTMF, and intro-greeting state in `googlemeet doctor`, and avoid claiming DTMF was sent when no Meet PIN sequence was configured. Refs #72478. Thanks @DougButdorf. - Plugins/tools: prefer built bundled plugin code during tool discovery and skip channel runtime hydration while preserving companion provider registrations, reducing per-run plugin-tool prep cost without dropping executable plugin tools. Fixes #75290. Thanks @thanos-openclaw. - Plugins/loader: scope plugin-tool registry reuse to the enabled plugin plan and stored Gateway method keys, so embedded runner tool lookup can reuse compatible startup registries without hiding enabled non-startup plugin tools. Fixes #75520. Thanks @whtoo. - Voice Call/Twilio: send notify-mode initial TwiML directly in the outbound create-call request while keeping conversation and pre-connect DTMF calls webhook-driven, so one-shot notify calls do not depend on a first-answer webhook fetch. Supersedes #72758. Thanks @tyshepps. - Discord/Slack: defer status-reaction cleanup until run finalization so queued, thinking, tool, and terminal reactions no longer flicker during normal progress updates. (#75582) - Discord/voice: leave Discord voice off for text-only configs unless `channels.discord.voice` is explicitly configured, avoiding default `GuildVoiceStates` traffic and idle gateway CPU pressure for bots that do not use `/vc`. Fixes #73753; refs #74044. Thanks @sanchezm86 and @SecureCloudProjO. - Discord/voice: rerun configured voice auto-join after Discord gateway RESUMED events and ignore already-destroyed stale voice connections during reconnect cleanup, so health-monitor account restarts can rejoin configured channels. Fixes #40665. Thanks @liz709. - Plugins/CLI: reuse the cold manifest registry while building plugin status and inspect reports, so large configured plugin sets no longer rediscover the bundled/plugin registry once per inspect row. Thanks @vincentkoc. - Discord/voice: lengthen the default voice join Ready wait, add configurable `voice.connectTimeoutMs`/`voice.reconnectGraceMs`, and warn before destroying unrecovered disconnected sessions so slow Discord voice handshakes and reconnects no longer fail silently. Fixes #63098; refs #39825 and #65039. Thanks @darealgege, @kzicherman, and @ayochim. - Gateway/health: refresh cached health RPC snapshots when channel runtime state diverges, so Discord and other channel status reads no longer report stale running or connected values until the cache TTL expires. (#75423) - Gateway/sessions: keep session-store reads from running stale prune and entry-count cap maintenance during startup, so oversized stores no longer block chat history readiness after updates while writes and `sessions cleanup --enforce` still preserve the cleanup safeguards. Fixes #70050. Thanks @tangda18. - Security/audit: keep plain `security audit` on the cold config/filesystem path and reserve plugin runtime security collectors for `--deep`, so large plugin installs cannot execute every plugin runtime during routine audits. Thanks @vincentkoc. - Discord/voice: merge configured media-understanding providers such as Deepgram into partial active provider registries, so follow-up voice turns keep transcribing after another media plugin is already active. Fixes #65687. Thanks @OneMintJulep. - WhatsApp: stage `qrcode` through root mirrored runtime dependencies so packaged QR pairing can render from staged plugin-runtime-deps installs. Fixes #75394. Thanks @FelipeX2001. - Discord/voice: apply per-channel Discord `systemPrompt` overrides to voice transcript turns by forwarding the trusted channel prompt through the voice agent run. Fixes #47095. Thanks @qearlyao. - Discord/native commands: send component-only interaction replies from slash command and status handlers instead of treating renderable Discord components as an empty response. Thanks @vincentkoc. - Slack/slash commands: send block-only slash command replies instead of dropping Slack block payloads with no plain-text fallback. Thanks @vincentkoc. - Telegram/messages: derive fallback text from interactive button/select labels before sending button-only payloads, so Telegram replies are not rejected as empty messages. Thanks @vincentkoc. - LINE/messages: send quick-reply-only payloads with fallback option text instead of accepting the payload and returning an empty delivery. Thanks @vincentkoc. - Auto-reply/docking: require `/dock-*` route switches to start from direct chats, so group or channel participants cannot reroute a shared session's future replies into a linked DM. Thanks @vincentkoc. - Discord: keep text-DM main-session route updates pinned to the configured DM owner, matching component interactions so another direct-message sender cannot redirect future main-session replies. Thanks @vincentkoc. - Mattermost/Matrix: keep direct-message main-session route updates pinned to the configured DM owner so paired or temporarily allowed senders cannot redirect future shared-session replies. Thanks @vincentkoc. - Discord: keep SecretRef-backed bot tokens discoverable for message actions without resolving the token during schema generation, and resolve scoped channel SecretRefs before outbound agent message sends even when the tool is built from a config snapshot. Fixes #75324. Thanks @slideshow-dingo and @Conan-Scott. - Updates: run package post-install doctor repair with the managed Gateway service profile and state paths when a daemon is installed, so shell/profile mismatches no longer repair the caller state while the restarted Gateway keeps stale config. Thanks @vincentkoc. - Models/DeepInfra: declare DeepInfra manifest catalog discovery and derive its runtime fallback catalog from the manifest, restoring provider-filtered `models list --all --provider deepinfra` rows without duplicated static model data. Thanks @shakkernerd. - CLI/update: verify managed gateway restarts against the installed service port instead of the caller shell port, so package updates do not report a healthy daemon as failed when profiles use different gateway ports. Thanks @vincentkoc. - Gateway/agent: reject strict `openclaw agent --deliver` requests with missing delivery targets before starting the agent run, so users do not wait for a completed turn that cannot send anywhere. Thanks @vincentkoc. - Setup/import: honor non-interactive `--import-from` onboarding flags by running the migration import path instead of silently completing normal setup without importing anything. Thanks @vincentkoc. - Discord/voice: run voice-channel turns under a voice-output policy that hides the agent `tts` tool and asks for spoken reply text, so `/vc join` sessions synthesize and play agent replies instead of ending with `NO_REPLY`. Fixes #61536. Thanks @aounakram. - Doctor/plugins: keep plain `doctor --non-interactive` from installing bundled plugin runtime dependencies, so headless health checks report missing deps while `doctor --fix` remains the explicit repair path. Thanks @vincentkoc. - Doctor/gateway: require an interactive confirmation before installing or rewriting the Gateway service, so `doctor --fix --non-interactive` can repair plugin/config drift without replacing the operator's launchd/systemd service from a temporary environment. Thanks @vincentkoc. - Plugins/runtime-deps: include packaged OpenClaw identity in bundled plugin loader cache keys, so same-path package upgrades stop reusing stale versioned runtime-deps mirrors. Fixes #75045. Thanks @sahilsatralkar. - Plugin SDK: restore reply-prefix and reply-pipeline helpers on the deprecated root/compat SDK surface so external plugins still using `openclaw/plugin-sdk` do not fail message dispatch after update. Fixes #75171. Thanks @zhangxiliang. - Plugins/runtime-deps: prune inactive same-package versioned runtime-deps roots after bundled dependency repair, so upgrades do not leave old `openclaw--` package caches behind after doctor runs. Thanks @vincentkoc. - Plugins/runtime-deps: prune legacy version-scoped plugin runtime-deps roots during bundled dependency repair and cover the path in Package Acceptance's upgrade-survivor matrix, so upgrades from 2026.4.x no longer leave stale per-plugin runtime trees after doctor runs. Thanks @vincentkoc. - Plugins/runtime-deps: keep Gateway startup plugin imports and runtime plugin fallback loads verify-only after startup/config repair planning, so packaged installs no longer spawn package-manager repair from hot paths after readiness. Refs #75283 and #75069. Thanks @brokemac79 and @xiaohuaxi. - Plugins/runtime-deps: treat package.json runtime-deps manifests as supersets when generated materialization metadata is absent, so bundled plugin activation stops restaging already-installed dependency subsets on every activation. Fixes #75429. (#75431) Thanks @loyur. - iMessage: add stdin write callback and error listener to IMessageRpcClient so async EPIPE from a closed child process rejects the pending request instead of crashing the gateway with uncaughtException. Fixes #75438. - MCP/stdio: settle MCP stdio transport send() from the write callback instead of resolving immediately on buffer acceptance, so async write errors reject the promise instead of being lost. Refs #75438. - Process/exec: add stdin error listener in runCommandWithTimeout so EPIPE from a prematurely-exited child is swallowed instead of escaping to uncaughtException. Refs #75438. - Voice Call/realtime: add default-off fast memory/session context for `openclaw_agent_consult`, giving live calls a bounded answer-or-miss path before the full agent consult. Fixes #71849. Thanks @amzzzzzzz. - Google Meet: interrupt Realtime provider output when local barge-in clears playback, so command-pair audio stops model speech instead of only restarting Chrome playback. Fixes #73850. (#73834) Thanks @shhtheonlyperson. - Gateway/config: cap oversized plugin-owned schemas in the full `config.schema` response so large installed plugin sets cannot balloon Gateway RSS or crash schema clients. Thanks @vincentkoc. - Plugins/update: skip ClawHub and marketplace plugin updates when the bundled version is newer than the recorded installed version, so `openclaw update` no longer overwrites working bundled plugins with older external packages. Fixes #75447. Thanks @amknight. - Gateway/sessions: use bounded tail reads for sessions-list transcript usage fallbacks and cap bulk title/last-message hydration, keeping large session stores responsive when rows request derived previews. Thanks @vincentkoc. - Gateway/sessions: yield during bulk transcript title/preview hydration and copy compaction checkpoints asynchronously, keeping the Gateway event loop responsive for large session stores and large transcripts. Refs #75330 and #75414. Thanks @amknight. - Gateway/sessions: stream bounded transcript reads for session detail, history, artifacts, compaction, and send/subscribe sequence paths so small Gateway requests no longer materialize large transcripts or OOM on oversized session logs. Thanks @vincentkoc. - Gateway/chat: bound chat-history transcript reads to the requested display window so large session logs no longer OOM the Gateway when clients ask for a small history page. Thanks @vincentkoc. - BlueBubbles: detect audio attachments by Apple UTIs (`public.audio`, `public.mpeg-4-audio`, `com.apple.m4a-audio`, `com.apple.coreaudio-format`) in addition to `audio/*` MIME, so iMessage voice notes whose webhook payload only carries the UTI are now classified as audio in the inbound `` placeholder instead of falling through to the generic `` tag. Thanks @omarshahine. - Active Memory: classify topic-threaded Telegram DM main session keys as direct chats, so recall and transcript persistence run for `agent:main:main:thread:{chatId}:{topicId}` sessions. Fixes #70061. (#75533) Thanks @vyctorbrzezowski. - Voice Call/Twilio: honor stored pre-connect TwiML before realtime webhook shortcuts and reject DTMF sequences outside conversation mode, so Meet PIN entry cannot be skipped or silently dropped. Thanks @donkeykong91 and @PfanP. - Docs/sandboxing: clarify that sandbox setup scripts (`sandbox-setup.sh`, `sandbox-common-setup.sh`, `sandbox-browser-setup.sh`) are only available from a source checkout, and add inline `docker build` commands for npm-installed users so sandbox image setup works without cloning the repo. Fixes #75485. Thanks @amknight. - Google Meet/Voice Call: play Twilio Meet DTMF before opening the realtime media stream and carry the intro as the initial Voice Call message, so the greeting is generated after Meet admits the phone participant instead of racing a live-call TwiML update. Thanks @donkeykong91 and @PfanP. - Google Meet/Voice Call: make Twilio setup preflight honor explicit `--transport twilio` and fail local/private Voice Call webhook URLs, including IPv6 loopback and unique-local forms, before joins. Thanks @donkeykong91 and @PfanP. - Voice Call/Twilio: retry transient 21220 live-call TwiML updates and catch answered-path initial-greeting failures, so a fast answered callback no longer crashes the Gateway or drops the Twilio greeting/listen transition. (#74606) Thanks @Sivan22. - CLI/startup: preserve `OPENCLAW_HIDE_BANNER` banner suppression for route-first startup callers that rely on the default process environment while keeping read-only status/channel paths from repairing bundled plugin runtime dependencies. Refs #75183. - Voice Call/Twilio: register accepted media streams immediately but wait for realtime transcription readiness before speaking the initial greeting, so reconnect grace handling stays live while OpenAI STT startup is no longer starved by TTS. Fixes #75197. (#75257) Thanks @donkeykong91 and @PfanP. - Voice Call CLI: run gateway-delegated `voicecall continue` through operation-id polling and protocol-shaped errors, so long conversational turns keep their transcript result without blocking a single Gateway RPC. (#75459) Thanks @serrurco and @DougButdorf. - Voice Call CLI: delegate operational `voicecall` commands to the running Gateway runtime and skip webhook startup during CLI-only plugin loading, preventing webhook port conflicts and `setup --json` hangs. Fixes #72345. Thanks @serrurco and @DougButdorf. - Agents/pi-embedded-runner: extract the `abortable` provider-call wrapper from `runEmbeddedAttempt` to module scope so its promise handlers no longer close over the run lexical context, releasing transcripts, tool buffers, and subscription callbacks when a provider call hangs past abort. (#74182) Thanks @cjboy007. - Docker: restore `python3` in the gateway runtime image after the slim-runtime switch. Fixes #75041. - Agents/session-repair: fix resumed sessions failing with repeated 400 errors on Anthropic and strict OpenAI-compatible providers (Qwen, mlx-vlm) after an interrupted conversation or blank user input. Fixes #75271 and #75313. Thanks @amknight. - CLI/Voice Call: scope `voicecall` command activation to the Voice Call plugin so setup and smoke checks no longer broad-load unrelated plugin runtimes or hang after printing JSON. Thanks @vincentkoc. - Doctor/plugins: warn when restrictive `plugins.allow` is paired with wildcard or plugin-owned tool allowlists, making the exclusive plugin allowlist behavior visible before users hit empty callable-tool runs. Refs #58009 and #64982. Thanks @KR-Python and @BKF-Gitty. - Google Meet/Voice Call: keep Twilio Meet joins in conversation mode and reuse the realtime intro prompt when no voice-call-specific intro is configured, so answered phone bridge calls speak instead of joining silently. Refs #72478. Thanks @DougButdorf. - Auto-reply/group chats: keep the `message` tool available for message-tool-only visible replies and apply group-scoped tool policy before deciding fallback delivery, so Discord/Slack-style rooms reply visibly in the correct channel after upgrades. Fixes #74842; refs #75207. Thanks @davelutztx and @aa-on-ai. - Agents/commitments: keep inferred follow-ups internal when heartbeat target is none, strip raw source text from stored commitments, disable tools during due-commitment heartbeat turns, bound hidden extraction queue growth, expire stale commitments, and add QA/Docker safety coverage. Thanks @vignesh07. - Telegram/agents: keep typing indicators and optional generation tools off the reply critical path, so fresh Telegram replies no longer stall while provider catalogs and media models load. (#75360) Thanks @obviyus. - Agents/commitments: run hidden follow-up extraction on the configured agent/default model instead of falling back to direct OpenAI, so OpenAI Codex OAuth-only gateways no longer spam background API-key failures. Fixes #75334. Thanks @sene1337. - Agents/media: keep async music generation completions on the requester-session wake path even when direct-send completion is enabled, so finished audio stays agent-mediated while video can still opt into direct channel delivery. (#75335) Thanks @vincentkoc. - Agents/media: keep image and video provider inventory internal when tool output is hidden, so shared chat surfaces no longer expose provider/model/auth-hint details from list results. Fixes #75166. Thanks @MkDev11. - Security/config-audit: redact CLI argv and execArgv secrets before persisting config audit records, covering write, observe, and recovery paths. Fixes #60826. Thanks @koshaji. - Gateway/models: keep default and configured model-list views responsive when provider catalog discovery stalls, without hiding real catalog load failures, while `--all` still waits for the exact full catalog. Fixes #75297; refs #74404. Thanks @lisandromachado and @najef1979-code. - Plugins/runtime-deps: accept already materialized package-level runtime-deps supersets as converged, so later lazy plugin activation no longer prunes and relaunches `pnpm install` after gateway startup pre-staging, reducing event-loop pressure from repeated runtime-deps repair on packaged installs. Fixes #75283; refs #75297 and #72338. Thanks @brokemac79, @lisandromachado, and @midhunmonachan. - Plugins/runtime-deps: remove OpenClaw-owned legacy runtime-deps symlinks before replacing staged bundled plugin dependencies, so updates can recover from older symlinked installs instead of failing the symlink safety guard. Thanks @goldmar. - Discord: retry queued REST 429s against learned bucket/global cooldowns and reacquire fresh voice upload URLs after CDN upload rate limits, so outbound sends recover without reusing stale single-use upload URLs. Thanks @discord. - TTS/providers: keep bundled speech-provider compat fallback available when plugins are globally disabled, so cold gateway and CLI startup can still resolve fallback speech providers instead of leaving explicit TTS provider selection with no registered providers. Refs #75265. Thanks @sliekens. - Discord: collapse repeated native slash-command deploy rate-limit startup logs into one non-fatal warning while keeping per-request REST timing in verbose output. Thanks @discord. - Discord: report native slash-command deploy aborts as REST timeouts with method, path, timeout budget, and observed duration, so startup logs explain slow Discord API calls instead of showing a generic aborted operation. Thanks @discord. - Security/logging: redact payment credential field names such as card number, CVC/CVV, shared payment token, and payment credential across default log and tool-payload redaction patterns so wallet-style MCP tools do not expose raw payment credentials in UI events or transcripts. Thanks @stainlu. - Providers/OpenAI Codex: preserve existing wrapped Codex streams during OpenAI attribution so PI OAuth bearer injection reaches ChatGPT/Codex Responses, and strip native Codex-only unsupported payload fields without touching custom compatible endpoints. (#75111) Thanks @keshavbotagent. - Plugins/runtime-deps: materialize newly required bundled plugin packages after local `openclaw onboard` and `openclaw configure` config writes, while keeping remote setup read-only, so first Gateway startup no longer discovers missing channel/provider deps after setup claimed success. Fixes #75309; refs #75069. Thanks @scottgl9 and @xiaohuaxi. - Plugins/runtime-deps: expire stale legacy install locks whose live PID cannot be tied to the current process incarnation, so Docker PID reuse no longer leaves bundled dependency repair stuck behind old `.openclaw-runtime-deps.lock` directories. Fixes #74948; refs #74950 and #74346. Thanks @dchekmarev. - Plugins/runtime-deps: recover interrupted bundled runtime-dependency installs whose package sentinels exist but generated materialization is incomplete, forcing npm/pnpm repair in Gateway startup, doctor, and lazy plugin loads instead of leaving channels crash-looping on missing packages. Fixes #75309; refs #75310, #75296, and #75304. Thanks @scottgl9. - Plugins/runtime-deps: treat no-main and export-map package sentinels without reachable entry files as incomplete, so Gateway startup, doctor, and lazy plugin loads repair interrupted bundled dependency installs instead of accepting package.json-only partial installs. Fixes #75309; refs #75183. Thanks @shakkernerd. - Plugins/runtime-deps: keep runtime inspection and channel maintenance commands from downloading bundled plugin dependencies, route explicit repairs through `openclaw plugins deps --repair`, and still allow Gateway/DO paths to repair missing deps before import. Refs #75069. Thanks @xiaohuaxi. - Updates: force non-deferred, no-cooldown update restarts after package-manager updates requested through the live Gateway control plane and fail release validation on post-swap stale chunk import crashes, so Telegram/Discord imports do not stay pointed at removed dist files. Fixes #75206. Thanks @xonaman and @faux123. - Agents/tool-result guard: use the resolved runtime context token budget for non-context-engine tool-result overflow checks, so long tool-heavy sessions no longer compact early when `contextTokens` is larger than native `contextWindow`. Fixes #74917. Thanks @kAIborg24. - Gateway/systemd: exit with sysexits 78 for supervised lock and `EADDRINUSE` conflicts so `RestartPreventExitStatus=78` stops `Restart=always` restart loops instead of repeatedly reloading plugins against an occupied port. Fixes #75115. Thanks @yhyatt. - Agents/runtime: skip blank visible user prompts at the embedded-runner boundary before provider submission while still allowing internal runtime-only turns and media-only prompts, so Telegram/group sessions no longer leak raw empty-input provider errors when replay history exists. Fixes #74137. Thanks @yelog, @Gracker, and @nhaener. - Agents/Codex: isolate local Codex app-server `CODEX_HOME` and `HOME` per agent and add a deliberate Codex migration path with selectable skill copies, so personal Codex CLI skills, plugins, config, and hooks no longer leak into OpenClaw agents unless the operator migrates them into the workspace. Thanks @pashpashpash. - Security/Nextcloud Talk: make webhook signature validation use the padded timing-safe compare path even when the supplied signature length is wrong, keep normalized header lookup behavior, and extend regression coverage for tampered bodies, wrong secrets, array-backed headers, and truncated signatures. Carries forward earlier contributor work from #50516 by teddytennant. (#58097) Thanks @gavyngong. - Plugins/runtime-deps: replace stale symlinked mirror target roots before writing runtime-mirror temp files and skip rewriting already materialized hardlinks, so cross-version container upgrades no longer crash-loop on read-only image-layer paths while warm mirrors do less churn. Fixes #75108; refs #75069. Thanks @coletebou and @xiaohuaxi. - Auto-reply/group chats: fall back to automatic source delivery when a channel precomputes message-tool-only replies but the `message` tool is unavailable, so Discord/Slack-style group turns do not silently complete without a visible reply. Fixes #74868. Thanks @kagura-agent. - Browser/gateway: share one browser control runtime across the HTTP control server and `browser.request`, and refresh browser profile config from the source snapshot, so CLI status/start honors configured `browser.executablePath`, `headless`, and `noSandbox` instead of falling back to stale auto-detection. Fixes #75087; repairs #73617. Thanks @civiltox and @martingarramon. - Agents/subagents: bound automatic orphan recovery with persisted recovery attempts and a wedged-session tombstone, and teach task maintenance/doctor to reconcile those sessions so restart loops no longer require manual `sessions.json` surgery. Fixes #74864. Thanks @solosage1. - Plugins/runtime-deps: keep bundled provider policy config loading from staging plugin runtime dependencies, so config reads no longer fail on locked-down `/var/lib/openclaw/plugin-runtime-deps` directories. Fixes #74971. Thanks @eurojojo. - Memory/runtime-deps: retain the native `node-llama-cpp` runtime only when local memory search is configured, so packaged installs can repair local embeddings without relying on unreachable global npm installs. Fixes #74777. Thanks @LLagoon3. - Gateway/startup: skip pre-bind web-fetch provider discovery for credential-free `tools.web.fetch` config, so Docker/Kubernetes gateways bind even when optional fetch limits are present. Fixes #74896. Thanks @KoykL. - Signal: match group allowlists against inbound Signal group ids as well as sender ids, and process explicitly configured Signal groups without requiring mentions unless `requireMention` is set. Fixes #53308. Thanks @minupla and @juan-flores077. - Signal: bound `signal-cli` installer release and archive downloads with explicit timeouts, declared and streamed size checks, and partial-file cleanup. Fixes #54153. Thanks @jinduwang1001-max and @juan-flores077. - Slack: require bot-authored room messages with `allowBots=true` to come from an explicitly channel-allowlisted bot or from a room where an explicit Slack owner is present, so broad bot relays cannot run unattended. Fixes #59284. Thanks @andrewhong-translucent. - Signal: derive `getAttachment` HTTP response caps from `channels.signal.mediaMaxMb` with base64 headroom, so inbound photos and videos no longer drop behind the 1 MiB RPC default. Fixes #73564. Thanks @heyhudson. - Signal: keep the long-lived receive SSE monitor open while idle instead of applying the 10s RPC/check deadline, so `signal-cli` 0.14.3 event streams no longer reconnect before inbound messages arrive. Fixes #74741. Thanks @fgabelmannjr and @k7n4n5t3w4rt. - CLI/progress: suppress nested progress spinners and line clears while TUI input owns raw stdin, so Crestodian `/status` no longer disturbs the active input row. (#75003) Thanks @velvet-shark. - Models/OpenAI Codex: restore `openai-codex/gpt-5.4-mini` for ChatGPT/Codex OAuth PI runs after live OAuth proof, and align the manifest, forward-compat metadata, docs, and regression tests so stale cron and heartbeat configs resolve again. Fixes #74451. Thanks @0xCyda, @hclsys, and @Marvae. - Plugins/runtime-deps: always write a dependency map in generated runtime-deps install manifests, so npm does not crash or prune staged bundled-plugin packages when the plan is empty. Fixes #74949. Thanks @hclsys. - Telegram: use durable message edits for streaming previews instead of native draft state, so generated replies no longer flicker through draft-to-message transitions that look like duplicates. (#75073) Thanks @obviyus. - Telegram: echo preflighted DM voice-note transcripts back to the originating chat, including Telegram DM topic thread metadata, instead of only echoing later media-understanding transcripts. Fixes #75084. Thanks @M-Lietz. - Telegram: clamp low long-polling client timeouts so configured `timeoutSeconds` values below the `getUpdates` poll window no longer force a fresh HTTPS connection every few seconds. Fixes #75114. Thanks @hpinho77. - Web search: describe `web_search` as using the configured provider instead of hard-coding Brave when DuckDuckGo or another provider is active. Fixes #75088. Thanks @sun-rongyang. - Infra/tmp: tolerate concurrent temp-dir permission repairs by rechecking directories that another process already tightened, so parallel ACP subprocess startup no longer throws `Unsafe fallback OpenClaw temp dir`. Fixes #66867. Thanks @Kane808-AI and @jarvisz8. - Agents/compaction: add an opt-in `agents.defaults.compaction.midTurnPrecheck` mid-turn precheck that detects tool-loop context pressure and triggers compaction before the next tool call instead of waiting for end-of-turn. (#73499) Thanks @marchpure and @haoxingjun. - Gateway/approvals: let loopback token/password-backed native approval clients resolve exec approvals without attaching stale paired Gateway identities, while remote and unauthenticated approval clients keep normal device identity behavior. (#74472) - Gateway/config: include rejected validation paths in foreground and service last-known-good recovery logs plus main-agent notices, so unsupported direct edits explain which key caused restore instead of looking like silent reversion. Fixes #75060. Thanks @amknight. - Plugins/runtime-deps: hash the OS-canonical `packageRoot` via `fs.realpathSync.native` (with `path.resolve` fallback) when computing the bundled runtime-deps stage key, so loader and channel `bundled-root` callers no longer derive divergent stage directories under `~/.openclaw/plugin-runtime-deps/openclaw--/` and bundled channels stop failing with `ENOENT` on shared dist chunks under Windows npm symlinks, junctions, or PM2 multi-instance worker layouts. Fixes #74963. (#75048) Thanks @openperf and @vincentkoc. - fix(logging): add redaction patterns for Tencent Cloud, Alibaba Cloud, HuggingFace and Replicate API keys (#58162). Thanks @gavyngong - Pairing: surface unexpected allowlist filesystem stat errors instead of treating the allowlist as missing, so permission and I/O failures are visible during pairing authorization checks. (#63324) Thanks @franciscomaestre. - macOS app: reserve layout space for exec approval command details so the allow dialog no longer overlaps the command, context, and action buttons. (#75470) Thanks @ngutman. - Agents/failover: carry `sessionId`, `lane`, `provider`, `model`, and `profileId` attribution through `FailoverError` and `describeFailoverError`/`coerceToFailoverError` so structured error logs (e.g. `gateway.err.log` ingestion) can attribute exhausted-fallback wrapper errors to the originating session and last-attempted provider instead of dropping the metadata after the per-profile errors. Fixes #42713. (#73506) Thanks @wenxu007. - Context Engine: treat assembled prompt as the default authority for preemptive overflow prechecks so engines that return a windowed, self-contained context no longer trigger false hard-fail compactions on huge raw history. Engines whose assembled view can hide overflow risk can opt back into the legacy behavior with `AssembleResult.promptAuthority: "preassembly_may_overflow"`. (#74255) Thanks @100yenadmin. - Mattermost: refresh current native slash command registrations before accepting callbacks so stale tokens from deleted or regenerated commands stop being accepted without a gateway restart while failed validations stay briefly cached and lookup starts are rate-limited per command, gate each callback against the resolved command's own startup token so a token leaked for one slash command cannot poison another command's failure cache, redact slash validation lookup errors, and add a body read timeout to the multi-account routing path so slow callback senders cannot tie up the dispatcher. Thanks @feynman-hou and @eleqtrizit. - Security/dotenv: block `COMSPEC` in workspace `.env` so a malicious repo cannot redirect Windows `cmd.exe` resolution, and lock in case-insensitive workspace-`.env` regression coverage for the full Windows shell trust-root family (`COMSPEC`, `PROGRAMFILES`, `PROGRAMW6432`, `SYSTEMROOT`, `WINDIR`). (#74460) Thanks @mmaps. - Gateway/install: drop stale version-manager and package-manager PATH entries preserved from old service files during `gateway install --force` and doctor repair, so the repair path no longer recreates `gateway-path-nonminimal` warnings. Fixes #75220. (#75440) Thanks @leonaIee, @renaudcerrato, and @aaajiao. ## 2026.4.29 ### Highlights - Messaging and automation get active-run steering by default, visible-reply enforcement, spawned subagent routing metadata, and opt-in follow-up commitments for heartbeat-delivered reminders. Thanks @vincentkoc, @scoootscooob, @samzong, and @vignesh07. - Memory grows into a people-aware wiki with provenance views, per-conversation Active Memory filters, partial recall on timeout, and bounded REM preview diagnostics. Thanks @vincentkoc, @quengh, @joeykrug, and @samzong. - Provider/model coverage expands with NVIDIA onboarding/catalogs plus faster manifest-backed model/auth paths, Bedrock Opus 4.7 thinking parity, and safer Codex/OpenAI-compatible replay and streaming behavior. Thanks @eleqtrizit, @shakkernerd, @prasad-yashdeep, @woodhouse-bot, and @LyHug. - Gateway and packaged-plugin reliability focuses on slow-host startup, reusable model catalogs, event-loop readiness diagnostics, runtime-dependency repair, stale-session recovery, and version-scoped update caches. Thanks @lpendeavors, @DerFlash, @vincentkoc, @pashpashpash, and @jhsmith409. - Channel fixes cluster around Slack Block Kit limits, Telegram proxy/webhook/polling/send resilience, Discord startup/rate-limit handling, WhatsApp delivery/liveness, and Microsoft Teams/Matrix/Feishu edge cases. Thanks @slackapi, @SymbolStar, @djgeorg3, @TinyTb, @dseravalli, @nklock, and @alex-xuweilong. - Security and operations add OpenGrep scanning, sharper GHSA triage policy, safer exec/pairing/owner-scope handling, Docker/onboarding automation, and web-fetch IPv6 ULA opt-in for trusted proxy stacks. Thanks @jesse-merhi, @pgondhi987, @mmaps, @jinjimz, and @jeffrey701. ### Changes - Security/tools: configured tool sections (`tools.exec`, `tools.fs`) no longer implicitly widen restrictive profiles (`messaging`, `minimal`). Users who need those tools under a restricted profile must add explicit `alsoAllow` entries; a startup warning identifies affected configs. Fixes #47487. Thanks @amknight. - Gateway/SDK: add SDK-facing artifact list/get/download RPCs and App SDK helpers with transcript provenance and download-source guardrails. Refs #74706. Thanks @tmimmanuel. - Agents/commitments: add opt-in inferred follow-up commitments with hidden batched extraction, per-agent/per-channel scoping, heartbeat delivery, CLI management, a simple `commitments.enabled`/`commitments.maxPerDay` config, and heartbeat-interval due-time clamping so magical check-ins do not echo immediately. (#74189) Thanks @vignesh07. - Messages/queue: make `steer` drain all pending Pi steering messages at the next model boundary, keep legacy one-at-a-time steering as `queue`, and add a dedicated steering queue docs page. Thanks @vincentkoc. - Messages/queue: default active-run queueing to `steer` with a 500ms followup fallback debounce, and document the queue modes, precedence, and drop policies on the command queue page. Thanks @vincentkoc. - Messages: add global `messages.visibleReplies` so operators can require visible output to go through `message(action=send)` for any source chat, while `messages.groupChat.visibleReplies` stays available as the group/channel override. Thanks @scoootscooob. - Gateway/events: surface `spawnedBy` on subagent chat and agent broadcast payloads so clients can route child session events without an extra session lookup. (#63244) Thanks @samzong. - Gateway/SDK: add read-only `environments.list` and `environments.status` RPCs so app clients can discover Gateway-local and node environment candidates without enabling provisioning. (#74708) Thanks @BunsDev. - Memory/wiki: add agent-facing people wiki metadata, canonical aliases, person cards, relationship graphs, privacy/provenance reports, evidence-kind drilldown, and search modes for person lookup, question routing, source evidence, and raw claims. Thanks @vincentkoc. - Active Memory: add optional per-conversation `allowedChatIds` and `deniedChatIds` filters so operators can enable recall only for selected direct, group, or channel conversations while keeping broad sessions skipped. (#67977) Thanks @quengh. - Active Memory: return bounded partial recall summaries when the hidden memory sub-agent times out, including the default temporary-transcript path, so useful recovered context is not discarded. (#73219) Thanks @joeykrug. - Gateway/memory: add a read-only `doctor.memory.remHarness` RPC so operator clients can preview bounded REM dreaming output without running mutation paths. (#66673) Thanks @samzong. - Providers/NVIDIA: add the NVIDIA provider with API-key onboarding, setup docs, static catalog metadata, and literal model-ref picker support so NVIDIA hosted models can be selected with their provider prefix intact. (#71204) Thanks @eleqtrizit. - Models: suppress explicitly configured openai-codex/gpt-5.4-mini inline entries so a stale models config written by `openclaw doctor --fix` cannot bypass the manifest capability block and cause repeated assistant-turn failures when the runtime switches to that model on ChatGPT-backed Codex accounts. Conditional suppressions (e.g. qwen Coding Plan endpoint guards) remain bypassable by explicit user configuration. (#74451) Thanks @0xCyda, @hclsys, and @Marvae. - Added SQLite-backed plugin state store (`api.runtime.state.openKeyedStore`) for restart-safe keyed registries with TTL, eviction, and automatic plugin isolation. Thanks @amknight. - Plugin SDK: mark remaining legacy alias exports and diffs tool/config aliases with deprecation metadata, and add a guard so future legacy alias comments require `@deprecated` tags. Thanks @vincentkoc. - CLI/QR/dependencies: internalize small terminal progress and QR wrapper helpers while keeping the real QR encoder dependency direct, reducing the default runtime dependency graph without changing QR output behavior. Thanks @vincentkoc. - Dependencies: refresh workspace runtime, plugin, and tooling packages, including ACP, Pi, AWS SDK, TypeBox, pnpm, oxlint, oxfmt, jsdom, pdfjs, ciao, and tokenjuice, while keeping patched ACP behavior and lint gates current. Thanks @mariozechner. - Gateway/dev: run `pnpm gateway:watch` through a named tmux session by default, with `gateway:watch:raw` and `OPENCLAW_GATEWAY_WATCH_TMUX=0` for foreground mode, so repeated starts respawn an inspectable watcher without trapping the invoking agent shell. Thanks @vincentkoc. - Gateway/diagnostics: emit an opt-in startup diagnostics timeline that records gateway lifecycle and plugin-load phases behind a config flag, so slow-start diagnosis no longer requires bespoke instrumentation. Thanks @shakkernerd. - Control UI/i18n: extend the locale registry with new Persian (fa), Dutch (nl), Vietnamese (vi), Italian (it), Arabic (ar), and Thai (th) entries and ship `fa`, `nl`, `vi`, and `zh-TW` docs glossaries, so the docs translation pipeline and the Control UI language picker stay aligned across surfaces. Thanks @vincentkoc. - Channels: add Yuanbao channel docs entrance so the Tencent Yuanbao bot appears in the channel listing and sidebar navigation. (#73443) Thanks @loongfay. - Channels/Yuanbao: update plugin GitHub location to YuanbaoTeam/yuanbao-openclaw-plugin and add "yuanbao" alias to channel catalog. (#74253) Thanks @loongfay. - Docker setup: add `OPENCLAW_SKIP_ONBOARDING` so automated Docker installs can skip the interactive onboarding step while still applying gateway defaults. (#55518) Thanks @jinjimz. - Security policy: classify media/base64 decode and format-conversion overhead after configured acceptance limits as performance-only for GHSA triage unless a report demonstrates a limit bypass, crash, exhaustion, data exposure, or another boundary bypass. (#74311) - Security/OpenGrep: add a precise OpenGrep rulepack, source-rule compiler, provenance metadata check, and PR/full scan workflows that validate first-party code and rulepack-only changes while uploading SARIF to GitHub Code Scanning. (#69483) Thanks @jesse-merhi. ### Fixes - Voice Call: resolve SecretRef-backed Twilio auth tokens and realtime/streaming provider API keys before initializing call providers, so SecretRef-backed voice-call credentials reach runtime as strings. (#73632) Thanks @VACInc. - Security/outbound: strip re-formed HTML tags during plain-text sanitization so nested tag fragments cannot leave a CodeQL-detected `