chore(deps): update ghcr.io/openclaw/openclaw docker tag to v2026.5.12 #61

Open
renovate-bot wants to merge 1 commits from renovate/openclaw into main
Collaborator

This PR contains the following updates:

Package Update Change
ghcr.io/openclaw/openclaw (source) minor 2026.4.262026.5.12

Release Notes

openclaw/openclaw (ghcr.io/openclaw/openclaw)

v2026.5.12

Compare Source

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 <id>, 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 <name> 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.<name> 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: let browser realtime Talk, Gateway relay/Voice Call realtime bridges, and OpenAI realtime transcription use openai-codex OAuth when no direct API key is configured, make Google Meet test_speech honor mode: "bidi", expose Control UI launch options for provider/model/voice/transport/VAD/reasoning, and update the default OpenAI realtime voice model to gpt-realtime-2. 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:<id> 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:<path.tgz> 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 <id>, 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.<chat_id>.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 (<openclawStateDir>/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 <media:image> 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)
  • 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.<id>.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.
  • 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-<platform>-<arch> 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 <turn_aborted> 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.<provider>.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.
  • 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 <provider/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/<model> 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/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 <https://example.com> 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 <location> 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 <available_skills> 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 <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.
  • 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.

v2026.5.7

Compare Source

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:<id> 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.

v2026.5.6

Compare Source

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.

v2026.5.5

Compare Source

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.<id> 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.

v2026.5.4

Compare Source

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 <spec> 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 <rootDir>/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 <id>] [--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.

  • 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-<uid> 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 <media:image>. 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 <provider/model> --runtime <runtime>. Thanks @​vincentkoc.

  • Doctor/config: keep active auth.profiles metadata intact when doctor --fix strips stale secret fields from configs, repairing legacy <provider>: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 <n|all> 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.

  • 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:@&#8203;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/@&#8203;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 <path> 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.

v2026.5.3

Compare Source

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.

v2026.5.2

Compare Source

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:<name> 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.
  • 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 <id> 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.<chatId>.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:<service>:<account> 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=<user id>) 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 <@&#8203;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 <!subteam^...> 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 <media:image>. 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:<id> 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/@&#8203;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.

v2026.4.29

Compare Source

Highlights
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/<guid>) 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
  • 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 <@&#8203;USER_ID>, <#CHANNEL_ID>, and <@&#8203;&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.

  • 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-<version>-<hash> 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 <media:audio> placeholder instead of falling through to the generic <media:attachment> 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-<version>-<hash>/ 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.

v2026.4.27

Compare Source

Highlights
  • Codex Computer Use setup now ships with status/install commands, marketplace discovery, and fail-closed MCP checks for Codex-mode desktop control. Thanks @​pash-openai.
  • DeepInfra joins the bundled provider set with model discovery, media generation/editing, TTS, embeddings, and provider-owned onboarding policy. Thanks @​ats3v.
  • Tencent Yuanbao and QQBot support expand channel coverage with Yuanbao docs/catalog entries and QQBot group chat, streaming, media upload, and pipeline refactors. Thanks @​loongfay and @​cxyhhhhh.
  • Plugin startup and model catalogs move toward manifest-first metadata, reducing Gateway boot work and making provider rows/aliases/suppressions easier to audit. Thanks @​shakkernerd.
  • Reliability fixes cover Telegram startup/sends, Slack socket/media stalls, gateway startup prewarm, session/history defaults, update sync, and Windows restart handoffs. Thanks @​joerod26, @​obviyus, @​shivasymbl, @​freerk, @​bassboy2k, @​jpreagan, @​islandpreneur007, and @​Thatgfsj.
Changes
  • Sandbox/Docker: add opt-in sandbox.docker.gpus passthrough for Docker sandbox containers so local GPU workloads can run inside sandboxed agents when the host Docker runtime supports --gpus. Fixes #​57976; carries forward #​58124. Thanks @​cyan-ember.
  • iOS/Gateway: add an authenticated node.presence.alive protocol event and node.list last-seen fields so background iOS wakes can mark paired nodes recently alive without treating them as connected. Carries forward #​63123. Thanks @​ngutman.
  • Android: publish authenticated node.presence.alive events after node connect and background transitions so paired Android nodes retain durable last-seen metadata after disconnects. Carries forward #​63123. Thanks @​ngutman.
  • Gateway/chat: accept non-image attachments through chat.send by staging them as agent-readable media paths, while keeping unsupported RPC attachment paths explicit instead of silently dropping files. Fixes #​48123. (#​67572) Thanks @​samzong.
  • Security/networking: add opt-in operator-managed outbound proxy routing (proxy.enabled + proxy.proxyUrl/OPENCLAW_PROXY_URL) with strict http:// forward-proxy validation, loopback-only Gateway bypass, and cleanup of proxy env/dispatcher state on exit. (#​70044) Thanks @​jesse-merhi and @​joshavant.
  • Dependencies: refresh provider and tooling dependencies, including AWS SDK, PI runtime packages, AJV, Feishu SDK, Anthropic SDK, tokenjuice, and native TypeScript/oxlint tooling. Thanks @​dependabot.
  • Matrix/QA: add live Matrix approval scenarios for exec metadata, chunked fallback, plugin approvals, deny reactions, thread targeting, and target: "both" delivery, with redacted artifacts preserving safe approval summaries. Thanks @​gumadeiras.
  • Diagnostics/Codex: add owner-only core /diagnostics with a sensitive-data preamble, docs link, and explicit Gateway export approval guidance; Codex harness sessions also ask before uploading Codex feedback for the attached thread and print the matching codex resume <thread-id> inspection command after confirmed upload. Thanks @​pashpashpash.
  • Trajectory export: route /export-trajectory through per-run exec approval, send group-chat approval prompts and export results only to the owner privately, and add openclaw sessions export-trajectory for the approved command path. Thanks @​pashpashpash.
  • Codex: add Computer Use setup for Codex-mode agents, including /codex computer-use status/install, marketplace discovery, optional auto-install, and fail-closed MCP server checks before Codex-mode turns start. Fixes #​72094. (#​71842) Thanks @​pash-openai.
  • Apps: consume Peekaboo 3.0.0-beta4 and ElevenLabsKit 0.1.1, align Swabble on Commander 0.2.2, and refresh macOS/iOS SwiftPM resolutions against the released dependency graph. Thanks @​Blaizzy.
  • Plugin SDK: expose shared channel route normalization, parser-driven target resolution, raw-target compact keys, parsed-target types, and route comparison helpers through openclaw/plugin-sdk/channel-route, switch native approval origin matching onto that route contract with optional delivery and match-only target normalization, and retire the internal channel-route shim behind dated compatibility aliases for legacy key/comparable-target helpers. Thanks @​vincentkoc.
  • Docs/Codex: document how Codex Computer Use, direct cua-driver mcp, and OpenClaw.app's PeekabooBridge fit together so desktop-control setup choices are clearer. Thanks @​pash-openai and @​trycua.
  • Matrix/streaming: stream tool-progress updates into live Matrix preview edits by default when preview streaming is active, with streaming.preview.toolProgress: false to keep answer previews while hiding interim tool lines. Thanks @​gumadeiras.
  • Plugins/models: wire manifest modelCatalog.aliases and modelCatalog.suppressions into model-catalog planning and built-in model suppression, with stale Spark and Qwen Coding Plan suppressions now declared in plugin manifests instead of runtime fallback hooks. Thanks @​shakkernerd.
  • Plugin SDK/models: add a shared manifest-backed provider catalog builder and move Qianfan, Xiaomi, NVIDIA, Cerebras, Mistral, Moonshot, DeepSeek, Tencent TokenHub, and StepFun provider catalogs onto their plugin manifest modelCatalog rows. Thanks @​shakkernerd.
  • Plugin SDK/models: move BytePlus and Volcano Engine standard and plan-provider catalogs into plugin manifest modelCatalog rows and remove the now-unused Volcengine-family shared catalog SDK subpath. Thanks @​shakkernerd.
  • CLI/models: move Fireworks and Together AI fixed provider catalogs into plugin manifest modelCatalog rows so provider-filtered listing can use manifest-backed static rows. Thanks @​shakkernerd.
  • CLI/models: move Groq's fixed text model catalog into the Groq plugin manifest and declare its setup auth env metadata so provider-filtered listing can use manifest-backed rows without deprecated auth metadata. Thanks @​shakkernerd.
  • CLI/models: move Venice's 41-row seed catalog into the Venice plugin manifest, derive runtime fallback rows from that manifest, and keep Venice API discovery as refreshable runtime work instead of a second hard-coded catalog. Thanks @​shakkernerd.
  • Channels/Yuanbao: register the Tencent Yuanbao external channel plugin (openclaw-plugin-yuanbao) in the official channel catalog, contract suites, and community plugin docs, with a new docs/channels/yuanbao.md quick-start guide for WebSocket bot DMs and group chats. (#​72756) Thanks @​loongfay.
  • Channels/QQBot: add full group chat support (history tracking, @​-mention gating, activation modes, per-group config, FIFO message queue with deliver debounce), C2C stream_messages streaming with a StreamingController lifecycle manager, unified sendMedia with chunked upload for large files, and refactor the engine into pipeline stages, focused outbound submodules, builtin slash-command modules, and explicit DI ports via createEngineAdapters(). (#​70624) Thanks @​cxyhhhhh.
  • Plugins/startup: migrate bundled plugin manifests to explicit activation.onStartup declarations so Gateway startup imports only the bundled plugins that intentionally register startup-time runtime surfaces. Thanks @​shakkernerd.
  • Plugins/startup: add an opt-in future-mode gate for disabling deprecated implicit startup sidecar loading while preserving explicit startup and narrower activation triggers. Thanks @​shakkernerd.
  • Plugins/startup: add plugin compatibility warnings for deprecated implicit startup loading so authors can migrate to explicit activation.onStartup metadata. Thanks @​shakkernerd.
  • Plugins/runtime: load bundled agent tool-result middleware from manifest contracts on demand so tokenjuice stays startup-lazy without losing Pi/Codex tool-output compaction. Thanks @​shakkernerd.
  • Plugins/startup: add explicit activation.onStartup metadata so plugins can declare Gateway startup import behavior while the deprecated implicit sidecar fallback remains for legacy plugins. Thanks @​shakkernerd.
  • Gateway/startup: reuse lookup-table plugin manifests when loading startup plugins so Gateway boot avoids rebuilding plugin discovery and manifest metadata. Thanks @​shakkernerd.
  • CLI/models: declare fixed Qianfan, Xiaomi, NVIDIA, Cerebras, Mistral, Chutes, Kilo, OpenAI, and OpenCode Go model catalogs in refreshable plugin manifests, keep broad models list --all on raw registry and supplement rows without runtime normalization, and avoid duplicate supplement resolution. Thanks @​shakkernerd.
  • Gateway/runtime: reuse the current plugin metadata snapshot for provider discovery so repeated model-provider discovery avoids rebuilding plugin manifest metadata. Thanks @​shakkernerd.
  • Gateway/startup: pass the plugin metadata snapshot from config validation into plugin bootstrap so startup reuses one manifest product instead of rebuilding plugin metadata. Thanks @​shakkernerd.
  • Plugin SDK/testing: move core-only channel contract fixtures under the channel contract test tree and retire the old test/helpers/channels bridge directory so plugin tests stay on focused SDK surfaces. Thanks @​vincentkoc.
  • Plugin SDK/testing: expose native agent-runtime contract fixtures through plugin-sdk/agent-runtime-test-contracts, move sandbox config fixtures into the focused generic fixture subpath, and block extension tests from importing repo-only test/helpers bridges. Thanks @​vincentkoc.
  • Plugin SDK/testing: expose generic module reload, bundled-path, Node builtin mock, channel pairing/envelope, HTTP server, temp-home, replay-policy, and live STT helpers through focused SDK test subpaths so extension tests no longer depend on repo-only helper bridges. Thanks @​vincentkoc.
  • Plugin SDK: move maintained bundled channels off the deprecated channel-config-schema-legacy subpath, add an explicit bundled-channel schema SDK surface, and track both remaining legacy test/config compatibility barrels with dated removal windows. Thanks @​vincentkoc.
  • Plugin SDK/testing: expose media provider capability assertions and provider HTTP mocks through focused SDK test subpaths, and retire the repo-only media-generation test helper bridge. Thanks @​vincentkoc.
  • Plugin SDK/testing: promote bundled plugin/provider/channel contract helpers to focused SDK test subpaths and retire the repo-only test/helpers/plugins TypeScript bridge. Thanks @​vincentkoc.
  • Plugin SDK/testing: expose generic channel action, setup, status, and directory contract helpers through plugin-sdk/channel-test-helpers so bundled extension tests no longer import repo-only channel helper bridges. Thanks @​vincentkoc.
  • Plugin SDK/testing: add plugin-sdk/channel-target-testing for shared channel target-resolution cases, document channel reaction helpers on plugin-sdk/channel-feedback, and keep the old plugin-sdk/test-utils alias as compatibility-only. Thanks @​vincentkoc.
  • Plugin SDK/testing: add a focused generic fixture subpath for CLI capture, sandbox, skill, agent-message, system-event, terminal, chunking, auth-token, and typed-case helpers. Thanks @​vincentkoc.
  • Plugin SDK/testing: add focused plugin runtime and environment fixture subpaths so plugin tests can avoid the broad plugin-sdk/testing barrel for common setup helpers. Thanks @​vincentkoc.
  • Plugin SDK/testing: add a focused plugin-sdk/plugin-test-api helper subpath and move bundled plugin registration tests off the repo-only plugin API bridge. Thanks @​vincentkoc.
  • Plugin SDK: add generic host hooks for session state, next-turn context, trusted tool policy, UI descriptors, events, scheduler cleanup, and run-scoped plugin context. (#​72287) Thanks @​100yenadmin.
  • Plugin SDK/testing: expose provider catalog, wizard, registry, manifest, public-artifact, outbound, and TTS contract helpers through documented SDK testing seams so bundled plugin tests no longer import repo src/** internals. Thanks @​vincentkoc.
  • Providers/DeepInfra: add a bundled DeepInfra provider with DEEPINFRA_API_KEY onboarding, dynamic OpenAI-compatible model discovery, image generation/editing, image/audio media understanding, TTS, text-to-video, memory embeddings, static catalog metadata, and provider-owned base URL policy. Carries forward #​53805, #​48088, #​37576, #​43896, #​11533, and #​2554. Thanks @​ats3v.
  • Matrix: attach versioned structured approval metadata to pending approval messages so capable Matrix clients can render richer approval UI while body text and reaction fallback keep working. (#​72432) Thanks @​kakahu2015.
Fixes
  • Channels/QQBot: re-evaluate routing bindings against the current runtime config on every inbound message instead of the snapshot captured at gateway start, so peer-specific bindings added via the CLI take effect without restarting the gateway. Fixes #​69546 via #​73567. Thanks @​statxc and @​F32138.
  • CLI/channel-setup: auto-skip the redundant "Install <plugin>?" confirmation when only one install source (npm or local) exists, show download from <npm-spec> hints for installable catalog channels in the picker, and suppress misleading npm hints for already-bundled channels. Fixes #​73419. Thanks @​sliverp.
  • BlueBubbles: tighten DM-vs-group routing across the outbound session route (chat_guid:iMessage;-;... DMs no longer classified as groups), reaction handling (drop group reactions that arrive without any chat identifier instead of synthesizing a "group" literal peerId), inbound chatGuid fallback (no longer fall back to the sender's DM chatGuid when resolving a group whose webhook omits chatGuid+chatId+chatIdentifier), and short message id resolution (carry caller chat context so a numeric short id reused after a long group conversation cannot silently resolve to a message in a different chat, with the same cross-chat guard applied to full GUIDs so retries cannot bypass it). Thanks @​zqchris.
  • Gateway/sessions: clone cached session stores through the persisted JSON shape instead of structuredClone, reducing native-memory growth on the remaining #​54155 Gateway RSS/session-accumulation path while keeping #​54155 as the broader tracker and carrying forward the #​45438 session-cache hypothesis. Thanks @​vincentkoc and the #​45438 reporters/commenters.
  • Agents/approvals: fail restart-interrupted sessions whose transcript tail is still approval-pending instead of replaying stale exec approval IDs into the new Gateway process after restart. Fixes #​65486. Thanks @​mjmai20682068-create.
  • CLI/Gateway: use method-specific least-privilege scopes for classified CLI Gateway calls while preserving legacy broad scopes for unclassified plugin methods, so read-only commands no longer create admin/write/pairing scope-upgrade prompts. Fixes #​68634. Thanks @​nightmusher.
  • Gateway/sessions: align chat.history and sessions.list thinking defaults with owning-agent and catalog-aware resolution so Control UI session defaults match backend runtime state. (#​63418) Thanks @​jpreagan.
  • Devices/pairing: recover array-shaped device and node pairing state files before persisting approvals, so UUID-keyed pending and paired entries no longer disappear after a malformed JSON store write. Fixes #​63035. Thanks @​sar618.
  • Gateway/auth: clear reused stale device tokens and stop reconnecting on device-token mismatch in the Control UI and Node gateway clients, avoiding rate-limit loops after scope-upgrade or token-rotation handoffs. Fixes #​71609. Thanks @​ricksayhi.
  • Gateway/approvals: treat duplicate same-decision approval resolves as idempotent during the resolved-entry grace window, including consumed allow-once approvals, while returning an explicit already-resolved error for conflicting repeats. Fixes #​59162; refs #​58479 and #​65486. Thanks @​wikithoughts, @​sajazuniga7-coder, and @​mjmai20682068-create.
  • Channels/Telegram: honor approvals.exec/plugin.targets[].accountId when routing native approvals across multi-bot Telegram accounts while preserving unscoped Telegram targets for any account. Fixes #​69916. Thanks @​joerod26.
  • Agents/exec: omit the internal session-resume fallback preface from successful async exec completion messages sent directly back to chat. Fixes #​67181. Thanks @​raistlin88.
  • Agents/media: register detached video_generate and music_generate tool run contexts until terminal status, so Discord-backed provider jobs stay live in /tasks instead of becoming lost when the parent chat run context disappears. Thanks @​vincentkoc.
  • Agents/media: prefer OpenAI image and video providers when the default model uses the OpenAI Codex auth alias, so auto media generation no longer falls through to Fal before GPT Image or Sora. Thanks @​vincentkoc.
  • Tasks/media: infer agent ownership for session-scoped task records so /tasks agent-local fallback includes session-backed video_generate and other async media jobs even when the current chat session has no linked rows. Thanks @​vincentkoc.
  • Agents/media: keep long-running video_generate and music_generate tasks fresh while provider jobs are still pending, so task maintenance does not mark active Discord media renders lost before completion. Thanks @​vincentkoc.
  • CLI/status: treat scope-limited gateway probes as reachable-but-degraded in shared status scans, so openclaw status --all no longer reports a live gateway as unreachable after missing scope: operator.read. Fixes #​49180; supersedes #​47981. Thanks @​openjay.
  • Slack/Socket Mode: use a 15s Slack SDK pong timeout by default and add channels.slack.socketMode.clientPingTimeout, serverPingTimeout, and pingPongLoggingEnabled overrides so stale-websocket handling no longer depends on app-event health heuristics. Fixes #​14248; refs #​58519, #​64009, and #​63488. Thanks @​shivasymbl and @​freerk.
  • Slack/media: bound private file and forwarded attachment downloads with idle and total timeouts while preserving placeholder fallback, so stalled Slack file_share media no longer wedges inbound message handling. Fixes #​61850. Thanks @​bassboy2k.
  • Plugins/inspector: keep bundled plugin runtime capture quiet and config-tolerant for Codex, memory-lancedb, Feishu, Mattermost, QQBot, and Tlon so plugin-inspector JSON checks can validate the full bundled set. Thanks @​vincentkoc.
  • Slack/auto-reply: keep fully consumed text reset triggers such as new session out of BodyForAgent after directive cleanup, so configured Slack reset phrases do not leak into the fresh model turn. Fixes #​73137. Thanks @​neeravmakwana.
  • Plugins/runtime deps: prune stale retained bundled runtime deps and keep doctor/secret channel contract scans on lightweight artifacts, so disabled bundled channels stop preserving old dependency trees or importing heavy plugin surfaces. Thanks @​SymbolStar and @​vincentkoc.
  • Auto-reply: bound the post-run pending tool-result delivery drain with a progress-aware idle timeout, so a never-settling tool-result task no longer leaves the session active forever while slow healthy deliveries can keep draining. Fixes #​53889; supersedes #​64733 and #​73434. Thanks @​zijunl and @​wujiaming88.
  • Gateway/startup: start chat channels without waiting for primary model prewarm, keeping model warmup bounded in the background so Slack and other channels come online promptly when provider discovery is slow. Supersedes #​73420. Thanks @​dorukardahan.
  • Gateway/install: carry env-backed config SecretRefs such as channels.discord.token into generated service environments when they are present only in the installing shell, while keeping gateway auth SecretRefs non-persisted. Fixes #​67817; supersedes #​73426. Thanks @​wdimaculangan and @​ztexydt-cqh.
  • Auto-reply/commands: stop bare /reset and /new after reset hooks acknowledge the command, so non-ACP channels no longer fall through into empty provider calls while /reset <message> and /new <message> still seed the next model turn. Fixes #​73367 and #​73412. Thanks @​hoyanhan, @​wenxu007, and @​amdhelper.
  • Providers/DeepSeek: backfill DeepSeek V4 reasoning_content on plain assistant replay messages as well as tool-call turns, so thinking sessions with prior tool use no longer fail follow-up requests with missing reasoning content. Fixes #​73417; refs #​71372. Thanks @​34262315716 and @​Bartok9.
  • Agents/gateway tool: strip full config payloads from config.patch and config.apply tool responses while preserving direct RPC responses, so config-heavy sessions no longer replay large redacted configs into transcript history. Fixes #​47610; supersedes #​73439. Thanks @​HanenVit and @​juan-flores077.
  • Auto-reply: preserve voice-note media from silent turns while continuing to suppress text and non-voice media, so NO_REPLY TTS replies still deliver the requested audio bubble. (#​73406) Thanks @​zqchris.
  • Channels/Mattermost: stop enqueueing regular inbound posts as system events, so Mattermost user messages reach the model only as user-role inbound-envelope content instead of also appearing as System: Mattermost message... directives. Fixes #​71795. Thanks @​juan-flores077.
  • Agents/media: qualify bare agents.defaults.imageModel and pdfModel refs from unique configured image-capable providers, so Ollama vision models such as moondream and qwen2.5vl:7b do not fall through to the default provider. Fixes #​38816; supersedes #​73396. Thanks @​alainasclaw and @​vincentkoc.
  • Agents/Anthropic: send implicit Anthropic beta headers only to direct public Anthropic endpoints, including OAuth, so custom Anthropic-compatible providers no longer mis-handle unsupported beta flags unless explicitly configured. Refs #​73346. Thanks @​byBrodowski.
  • Skills: require explicit skills.entries.coding-agent.enabled before exposing the bundled coding-agent skill, so installs with Codex on PATH but no OpenAI auth do not silently offer Codex delegation. Fixes #​73358. Thanks @​LaFleurAdvertising and @​Sanjays2402.
  • Plugins/startup: treat manifestless Claude bundles as valid installed-plugin registry entries instead of stale missing manifests, so workspace bundles no longer force repeated derived registry rebuilds or noisy plugins.entries.workspace warnings during Gateway startup. Fixes #​73433. Thanks @​AnneVoss.
  • Agents/subagents: preserve sessions_yield as a paused subagent state and ignore its wait text while freezing completion output, so parent sessions wait for the final post-compaction answer instead of receiving intermediate progress or (no output). Fixes #​73413. Thanks @​Ask-sola.
  • Plugins/startup: precompute bundled runtime mirror fingerprints before taking the mirror lock and keep Docker bundled plugin runtime deps/mirrors in a Docker-managed volume instead of the Windows/WSL config bind mount, so cold starts avoid slow host-volume mirror writes. Fixes #​73339. Thanks @​1yihui.
  • Plugins/runtime deps: refresh bundled runtime mirrors without deleting active import trees, so config-triggered restarts do not see transient missing plugin files during registration. Thanks @​shakkernerd.
  • Channels/LINE: persist inbound image, video, audio, and file downloads in ~/.openclaw/media/inbound/ instead of temporary files so agents can still read LINE media after /tmp cleanup. Fixes #​73370. Thanks @​hijirii and @​wenxu007.
  • CLI/plugins: keep bundled plugin installs out of plugins.load.paths while preserving install records, so install/inspect/doctor loops no longer warn about the current bundled plugin directory. Thanks @​vincentkoc.
  • CLI/plugins: scope plugins inspect <id> runtime loading to the matched plugin so single-plugin inspection does not load every plugin before checking the target. Thanks @​shakkernerd.
  • CLI/plugins: remove managed copied-path plugin directories during uninstall and plan uninstall from metadata instead of runtime-loading plugins, so plugin lifecycle commands avoid unnecessary bundled runtime-deps work. Thanks @​shakkernerd.
  • Cron tool: infer the creating session's agentId for cron.add jobs when agentId is omitted or passed as undefined, keeping scheduled agentTurn jobs routed to the session agent; #​40571 identified the guard bug and supplied the focused regression coverage. Thanks @​ChanningYul.
  • Cron/Telegram: add --thread-id to openclaw cron add and openclaw cron edit, preserving Telegram forum topic delivery targets across scheduled announcements. Carries forward #​51581, #​60373, and #​60890. Thanks @​ChunHao-dev.
  • Cron/Telegram: preserve session-derived Telegram topic thread IDs when isolated cron delivery explicitly targets the parent chat, keeping bare chat targets in the active forum topic without leaking stale topics to other chats. Carries forward #​64708. Thanks @​addelh.
  • Memory/compaction: keep pre-compaction memory-flush prompts runtime-only so session transcripts and chat.history no longer expose them as normal user turns. Fixes #​54408 and #​58956; refs #​43567. Thanks @​markgong and @​guoyuhang9.
  • Control UI/WebChat: keep large attachment payloads out of Lit state and optimistic chat messages, using object URL previews plus send-time payload serialization so PDF/image uploads no longer trigger RangeError: Maximum call stack size exceeded. Fixes #​73360; refs #​54378 and #​63432. Thanks @​hejunhui-73, @​Ansub, and @​christianhernandez3-afk.
  • Agents/Anthropic: cancel stalled Anthropic Messages SSE body reads when abort signals fire, so active-memory timeouts release transport resources instead of leaving hidden recall runs parked on reader.read(). Refs #​72965 and #​73120. Thanks @​wdeveloper16.
  • Control UI/WebChat: keep pending run and typing state attached to the active client run, so unowned inject/announce/side-result finals no longer unlock unrelated active runs while completed owned runs still clear promptly. Fixes #​57795; carries forward the narrow diagnosis from #​57887. Thanks @​haoyu-haoyu.
  • Sandbox/Docker: stop satisfying a missing default sandbox image by tagging plain Debian as openclaw-sandbox:bookworm-slim, preserving the Python tooling required by sandbox write/edit helpers and directing users to build the default image. Fixes #​51185; refs #​45108, #​51099, #​51609, and #​57713. Thanks @​dpalis, @​Tin55FoilDev, @​jbcohen2-coder, @​macminihal-cyber, and @​PraxoOnline.
  • Control UI/WebChat: confirm toolbar New Session button resets before dispatching /new while leaving typed /new and /reset commands immediate. Fixes #​45800; refs #​27065, #​56611, #​54499, and #​27110. Thanks @​aethnova, @​kosta228-huli, @​adambezemek, and @​xss925175263 (xianshishan).
  • Agents/models: keep per-agent primary models strict when fallbacks is omitted, so probe-only custom providers are not tried as hidden fallback candidates unless the agent explicitly opts in. Fixes #​73332. Thanks @​haumanto.
  • Gateway/models: add models.pricing.enabled so offline or restricted-network installs can skip startup OpenRouter and LiteLLM pricing-catalog fetches while keeping explicit model costs working. Fixes #​53639. Thanks @​callebtc, @​palewire, and @​rjdjohnston.
  • Gateway/startup: warn when legacy CLAWDBOT_* or MOLTBOT_* environment variables are still present, pointing users to OPENCLAW_* names instead of failing silently. Fixes #​53482; carries forward #​53667. Thanks @​lndyzwdxhs.
  • Onboarding: pin interactive and non-interactive health checks to the just-configured setup token/password so stale OPENCLAW_GATEWAY_TOKEN or OPENCLAW_GATEWAY_PASSWORD values do not produce false gateway-token-mismatch failures after setup. Fixes #​72203. Thanks @​galiniliev.
  • Doctor/state: require an interactive confirmation before archiving orphan transcript files, so openclaw doctor --fix no longer silently renames recoverable session history after upgrades regenerate sessions.json. Fixes #​73106. Thanks @​scottgl9.
  • Cron/Telegram: preserve explicit :topic: delivery targets over stale session-derived thread IDs when isolated cron announces to Telegram forum topics. Carries forward #​59069; refs #​49704 and #​43808. Thanks @​roytong9.
  • Build/runtime: write the runtime-postbuild stamp after pnpm build writes the build stamp, so the next CLI invocation does not re-sync runtime artifacts after a successful build. Fixes #​73151. Thanks @​bittoby.
  • Build/runtime: preserve staged bundled-plugin runtime dependency caches across source-checkout tsdown rebuilds, so local CLI and gateway-watch rebuilds no longer recreate large plugin dependency trees before starting. Refs #​73205. Thanks @​SymbolStar.
  • CLI/channels: list configured chat channel accounts from read-only setup metadata even when the standalone CLI has not loaded the runtime channel registry, so openclaw channels list shows Telegram accounts before auth providers. Fixes #​73319 and #​73322. Thanks @​mlaihk.
  • CLI/model probes: keep infer model run --gateway raw by skipping prior session transcript, bootstrap context, context-engine assembly, tools, and bundled MCP servers, so local backends can be tested without full agent-context overhead. Fixes #​73308. Thanks @​ScientificProgrammer.
  • CLI/image describe: pass --prompt and --timeout-ms through infer image describe and describe-many, so custom vision instructions and slow local model budgets reach media-understanding providers such as Ollama, OpenAI, Google, and OpenRouter. Addresses #​63700. Thanks @​cedricjanssens.
  • Providers/Ollama: reject long non-linguistic Kimi/GLM symbol runs as provider failures instead of storing them as successful visible assistant replies, so fallback or error handling can recover from garbled cloud output. Fixes #​64262; refs #​67019. Thanks @​Kloz813 and @​xiaomenger123.
  • CLI/model probes: reject empty or whitespace-only infer model run --prompt values before calling local providers or the Gateway, so smoke checks do not spend provider calls on invalid turns. Fixes #​73185. Thanks @​iot2edge.
  • Gateway/media: route text-only chat.send image offloads through media-understanding fields so agents.defaults.imageModel can describe WebChat attachments instead of leaving only an opaque media://inbound marker. Fixes #​72968. Thanks @​vorajeeah.
  • Gateway/Windows: route no-listener restart handoffs through the Windows supervisor without leaving restart tokens in flight, so failed task scheduling can be retried and successful handoffs do not coalesce later restart requests. (#​69056) Thanks @​Thatgfsj.
  • Gateway/model pricing: skip plugin manifest discovery during background pricing refreshes when plugins.enabled: false, so disabled-plugin setups do not keep rebuilding plugin metadata from the Gateway hot path. Fixes #​73291. Thanks @​slideshow-dingo and @​fishgills.
  • Ollama/thinking: validate /think commands against live Ollama catalog reasoning metadata and preserve explicit native params.think/params.thinking, so models whose /api/show capabilities include thinking expose low, medium, high, and max instead of being stuck on off. Fixes #​73366. Thanks @​cymise.
  • Gateway/sessions: remove automatic oversized sessions.json rotation backups, deprecate session.maintenance.rotateBytes, and teach openclaw doctor --fix to remove the ignored key so hot session writes no longer copy multi-MB stores. Refs #​72338. Thanks @​midhunmonachan and @​DougButdorf.
  • Channels/Telegram: fail fast when Telegram rejects the startup getMe token probe with 401, so invalid or stale BotFather tokens are reported as token auth failures instead of misleading deleteWebhook cleanup failures. Fixes #​47674. Thanks @​samaedan-arch.
  • ACPX: keep generated Codex and Claude ACP wrapper startup paths working when remote or special state filesystems reject chmod, since OpenClaw invokes the wrappers through Node instead of executing them directly. Fixes #​73333. Thanks @​david-garcia-garcia.
  • CLI/onboarding: infer image input for common custom-provider vision model IDs, ask only for unknown models, and keep --custom-image-input/--custom-text-input overrides so vision-capable proxies do not get saved as text-only configs. Fixes #​51869. Thanks @​Antsoldier1974.
  • Models/OpenAI Codex: stop listing or resolving unsupported openai-codex/gpt-5.4-mini rows through Codex OAuth, keep stale discovery rows suppressed with a clear API-key-route hint, and leave direct openai/gpt-5.4-mini available. Fixes #​73242. Thanks @​0xCyda.
  • Plugin SDK: restore the root stringEnum and optionalStringEnum exports on both the published SDK entry and runtime root-alias bridge, so older external plugins can keep building and loading while migrating to focused SDK subpaths. Fixes #​68279. Thanks @​marzliak.
  • Plugin SDK: restore the root-alias bridge for registerContextEngine and expose missing legacy compat helpers normalizeAccountId and resolvePreferredOpenClawTmpDir so older external plugins such as openclaw-weixin can keep loading while migrating to focused SDK subpaths. Fixes #​53497. Thanks @​alanxchen85.
  • Auth profiles: make openclaw doctor --fix migrate legacy flat auth-profiles.json files such as { "ollama-windows": { "apiKey": "ollama-local" } } to canonical provider default API-key profiles with a backup, so custom Ollama/OpenAI-compatible providers recover cleanly after upgrading. Fixes #​59629; supersedes #​59642. Thanks @​Xsanders555 and @​Linux2010.
  • Memory/Dreaming: retry Dream Diary once with the session default when a configured dreaming model is unavailable, while leaving subagent trust and allowlist errors visible instead of silently masking configuration problems. Refs #​67409 and #​69209. Thanks @​Ghiggins18 and @​everySympathy.
  • Feishu/inbound files: recover CJK filenames from plain Content-Disposition: filename= download headers when Feishu exposes UTF-8 bytes through Latin-1 header decoding, while leaving valid Latin-1 and JSON-derived names unchanged. (#​48578, #​50435, #​59431) Thanks @​alex-xuweilong, @​lishuaigit, and @​DoChaoing.
  • Channels/Telegram: normalize accidental full /bot<TOKEN> Telegram apiRoot values at runtime and teach openclaw doctor --fix to remove the suffix, so startup control calls no longer 404 when direct Bot API curl commands work. Fixes #​55387. Thanks @​brendanmatthewjones-cmyk, @​techfindubai-ux, and @​Sivlerback-Chris.
  • Zalo Personal: persist refreshed zca-js session cookies after QR login, session restore, and successful API calls so gateway restarts restore the freshest local session. (#​73277) Thanks @​darkamenosa.
  • Logging/security: redact sensitive tokens (sk-* keys, Bearer/Authorization values, etc.) at the subsystem console sink so createSubsystemLogger().info/warn/error output that bypasses the patched console-capture handler still applies the same redaction the file transport already does. Fixes #​73284; refs #​67953 and #​64046. Thanks @​edwin-rivera-dev.
  • Plugins/runtime deps: reuse enclosing versioned cache roots when bundled plugins resolve from nested staged paths, so plugin-runtime-deps no longer mints openclaw-unknown-* directories or loops on ENOTEMPTY. Fixes #​72956. (#​73205) Thanks @​SymbolStar.
  • Agents/failover: classify CJK provider transport, quota, billing, auth, and overload error text so Chinese-language provider failures trigger fallback and user-facing transport copy instead of surfacing as unclassified raw errors. (#​56242) Thanks @​tomcatzh.
  • Agents/failover: seed non-claude-cli fallback prompts with Claude Code session context when a claude-cli attempt fails, so fallback models do not restart cold after billing or quota failover. (#​72069) Thanks @​stainlu.
  • Agents/CLI runner: transfer bundle-MCP tempDir cleanup from the per-turn runner finally to the Claude live-session lifecycle, so persistent Claude CLI sessions keep their --mcp-config directory until the live subprocess closes. Fixes #​73244. Thanks @​edwin-rivera-dev.
  • Gateway/nodes: allow Windows companion nodes to use safe declared commands such as canvas, camera list, location, device info, and screen snapshot by default while keeping dangerous media commands opt-in. (#​71884) Thanks @​shanselman.
  • Agents/cron: clarify agent-tool and CLI cron timezone guidance so supplied tz values use local wall-clock cron fields and omitted cron tz falls back to the Gateway host local timezone. Fixes #​53669; carries forward #​46177. (#​73372) Thanks @​chen-zhang-cs-code and @​maranello-o.
  • Providers/Qwen: allow explicitly configured qwen/qwen3.6-plus to resolve on Qwen Coding Plan endpoints while keeping the built-in catalog from advertising it there. Fixes #​63654; carries forward #​63987. Thanks @​jepson-liu.
  • Channels/Telegram: keep Bot API network fallbacks sticky after failed attempts and retry timed-out startup control calls once on the fallback route, so deleteWebhook IPv6 stalls no longer trigger slow multi-account retry storms. Fixes #​73255. Thanks @​ttomiczek and @​sktbrd.
  • Gateway/agents: accept heartbeat, cron, and webhook as internal channel hints for agent runs so sessions_spawn works from non-delivery parent sessions while unknown channel hints still fail closed. Fixes #​73237. Thanks @​KeWang0622.
  • Gateway/models: merge explicit models.providers.*.models rows into the Gateway model catalog with normalized provider/model dedupe, and use normalized image-capability lookup so custom vision models keep native image attachments even when Pi discovery omits them or model ID casing differs. Fixes #​64213 and #​65165. Thanks @​billonese and @​202233a.
  • Gateway/reload: publish canonical post-write source config to in-process reloaders so simple config saves no longer create phantom plugin diffs or trigger unnecessary Gateway restarts. (#​73267) Thanks @​szsip239.
  • Gateway/Docker: keep config-triggered restarts in-process inside containers instead of spawning a detached child and exiting PID 1 cleanly, so Docker Swarm and other on-failure supervisors do not leave the service stuck at 0/1 replicas. Fixes #​73178. Thanks @​du-nguyen-IT007.
  • CLI/tasks: ship the task-registry control runtime in npm packages so openclaw tasks cancel can load ACP/subagent cancellation helpers from published builds. Fixes #​68997. Thanks @​1OAKDesign.
  • Channels/Telegram: preserve unsent generated media after partial reply streaming has already delivered the text, so image_generate outputs still reach Telegram as photos instead of being dropped from the final payload. Fixes #​73253. Thanks @​mlaihk.
  • Memory-core/dreaming: cap detached Dream Diary narrative subagents across cron sweeps so multi-workspace dreaming no longer fans out unbounded subagent sessions, lock contention, and cascading narrative timeouts. Fixes #​73198. (#​73287) Thanks @​KeWang0622.
  • CLI/agents: close local one-shot Claude live stdio sessions and bundled MCP loopback resources after embedded openclaw agent --local runs, while keeping gateway-owned MCP loopback cleanup internal to the Gateway. Thanks @​frankekn.
  • Export/session: keep inline export HTML scripts and vendor libraries injected after template formatting so generated session exports open with the app code, markdown renderer, and syntax highlighter present. Fixes #​41862 and #​49957; carries forward #​41861 and #​68947. Thanks @​briannewman, @​martenzi, and @​armanddp.
  • Agents/ACPX: stage the patched Claude ACP adapter as an ACPX runtime dependency and route known Codex/Claude ACP commands through local wrappers, so Gateway runtime no longer depends on live npx adapter resolution. Fixes #​73202. Thanks @​joerod26.
  • Memory/compaction: let pre-compaction memory flush use an exact agents.defaults.compaction.memoryFlush.model override such as ollama/qwen3:8b without inheriting the active session fallback chain, so local housekeeping can avoid paid conversation models. Fixes #​53772. Thanks @​limen96.
  • macOS/update: stop managed Gateway services before package replacement and keep LaunchAgent service secrets out of world-readable plist metadata by loading them from owner-only env files. Fixes #​72996. Thanks @​Mathewb7.
  • Google Meet: keep observe-only Chrome joins and setup checks from requiring BlackHole or audio bridge commands, avoid granting or selecting the microphone in observe-only mode, and make test_speech report fresh realtime output-byte verification instead of only confirming a queued utterance. Refs #​72478. Thanks @​DougButdorf.
  • Gateway/hooks: route non-delivered hook completion and error summaries to the target agent's main session instead of the default agent session, preserving multi-agent hook isolation. Fixes #​24693; carries forward #​68667. Thanks @​abersonFAC and @​bluesky6868.
  • Control UI/models: request the configured Gateway model-list view so dashboards with only models.providers.*.models show those configured models first instead of flooding the picker with the full built-in catalog. Fixes #​65405. Thanks @​wbyanclaw.
  • CLI/models: keep default-model and allowlist pickers on explicit models.providers.*.models entries when models.mode is replace instead of loading the full built-in catalog. Fixes #​64950. Thanks @​mrozentsvayg.
  • Media/security: tighten media-understanding MIME sanitization so parameterized MIME values stay end-anchored and malformed whitespace or suffix payloads are rejected before file-context handling. Fixes #​9795; carries forward #​68225 with related review/test context from #​61016/#​68456. Thanks @​ymaxgit, @​bluesky6868, and @​shamsulalam1114.
  • Discord: own the Carbon interaction listener and hand off Discord slash/component handling asynchronously, so compaction or long session locks no longer trip InteractionEventListener listener timeouts. Fixes #​73204. Thanks @​slideshow-dingo.
  • Compaction/diagnostics: keep unknown compaction failure classifications stable while logging sanitized detail for unclassified provider errors such as missing Ollama provider adapters. Thanks @​gzsiang.
  • Models/fallbacks: record first-class model.fallback_step trajectory events with from/to models, failure detail, chain position, and final outcome so support exports preserve the primary model failure even when a later fallback also fails. Fixes #​71744. Thanks @​nikolaykazakovvs-ux.
  • Gateway/agents: block agent exec from launching interactive openclaw channels login flows and abort active agent runs after invalid-config recovery restores last-known-good config, preventing known channel-login and reload paths from wedging replies. Refs #​72338. Thanks @​midhunmonachan.
  • Gateway/diagnostics: emit payload-free liveness warnings with event-loop delay, event-loop utilization, CPU-core ratio, active-session counts, and OTEL warning metrics/spans so live-but-stalled Gateways capture CPU-spin context in stability bundles and telemetry. Refs #​72338. Thanks @​midhunmonachan and @​DougButdorf.
  • Gateway/startup: keep value-option foreground starts on the gateway fast path and skip proxy bootstrap unless proxy env is configured, reducing normal gateway startup RSS and avoiding full CLI graph loading. Thanks @​vincentkoc.
  • Heartbeat/models: show heartbeat model bleed guidance on context-overflow resets when the last runtime model matches configured heartbeat.model, so smaller local heartbeat models point users to isolatedSession or lightContext instead of only compaction-buffer tuning. Fixes #​67314. Thanks @​Knightmare6890.
  • Subagents/models: persist sessions_spawn.model and configured subagent models as child-session model overrides before the first turn, so spawned subagents actually run on the requested provider/model instead of reverting to the target agent default. Fixes #​73180. Thanks @​danielzinhu99.
  • Channels/Telegram: keep webhook-mode local listeners alive and retry Telegram setWebhook registration after recoverable startup network failures, so transient Bot API timeouts no longer leave reverse proxies pointing at a closed listener. Fixes #​71834. Thanks @​jinon86.
  • Agents/ACPX: bundle the Codex ACP adapter and launch it from the isolated CODEX_HOME wrapper before falling back to npm, so Codex ACP startup no longer depends on live npx resolution or the stale @zed-industries/codex-acp@^0.11.1 range. Fixes #​72037; refs #​73202. Thanks @​jasonftl, @​sazora, and @​joerod26.
  • Agents/ACPX: register the embedded ACP backend at Gateway startup through a lightweight ACP backend SDK path and without importing the heavy ACPX runtime until an ACP session or explicit startup probe needs it, reducing baseline Gateway RSS. Thanks @​vincentkoc.
  • CLI/update: keep restart health polling when the restarted Gateway is reachable but has not reported its version yet, so macOS service restarts do not fail early with actual unavailable. Thanks @​ProspectOre.
  • Backup: skip installed plugin extensions/*/node_modules dependency trees while keeping plugin manifests and source files in archives, so local backups avoid rebuildable npm payload bloat. Fixes #​64144. Thanks @​BrilliantWang.
  • Cron/models: fail isolated cron runs closed when an explicit payload.model is not allowed or cannot be resolved, so scheduled jobs do not silently fall back to an unrelated agent default or paid route before configured provider proxies such as LiteLLM can run. Fixes #​73146. Thanks @​oneandrewwang.
  • Memory/QMD: back off repeated chat-turn QMD open failures while still letting memory status and CLI probes recheck immediately, so a broken sidecar dependency cannot trigger active-memory or cron retry storms. Fixes #​73188 and #​73176. Thanks @​leonlushgit and @​w3i-William.
  • Talk Mode: resolve messages.tts.providers.<id>.apiKey through the active runtime snapshot for talk.config, so Talk overlays can discover SecretRef-backed speech providers without falling back to local speech. Fixes #​73109. (#​73111) Thanks @​omarshahine.
  • Memory/Ollama: resolve memorySearch.provider custom provider ids through their configured models.providers.<id>.api owner, so multi-GPU Ollama setups can dedicate embeddings to providers such as ollama-5080 without losing the Ollama adapter or local auth semantics. Fixes #​73150. Thanks @​oneandrewwang.
  • CLI/memory: skip eager context-window warmup for openclaw memory commands so memory search does not race unrelated model metadata discovery. Fixes #​73123. Thanks @​oalansilva and @​neeravmakwana.
  • CLI/Telegram: route Telegram message send and poll actions through the running Gateway when available, so packaged installs use the staged grammy runtime deps and CLI sends return instead of hanging after the Telegram channel is active. Fixes #​73140. Thanks @​oalansilva.
  • Plugins/runtime deps: prepare staged bundled plugin dependencies before loading packaged public surfaces, so OpenClaw's Telegram runtime/test facade loads resolve grammy from the managed runtime-deps stage without copying dependencies into the global package root. Refs #​73140. Thanks @​oalansilva.
  • Agents/exec: emit (no output) for silent exec update and node-host result blocks so Anthropic-compatible providers no longer reject empty tool-result text after quiet commands. Fixes #​73117. Thanks @​pfrederiksen and @​Sanjays2402.
  • Cron/providers: preflight local Ollama and OpenAI-compatible provider endpoints before isolated cron agent turns, record unreachable local providers as skipped runs, and cache dead-endpoint probes so many jobs do not hammer the same stopped local server. Fixes #​58584. Thanks @​jpeghead.
  • Gateway/config: let config reload continue in degraded mode when invalidity is scoped to plugin entries, so incompatible plugin configs can be skipped and the Gateway restart can still pick up the rest of the config after rollbacks. Fixes #​73131. Thanks @​Adam-Researchh.
  • Doctor/channels: suppress disabled bundled-plugin blocker warnings when a trusted external plugin owns the configured channel, so Lark/Feishu installs no longer get Feishu repair noise after switching to openclaw-lark. Fixes #​56794. Thanks @​wuji-tech-dev.
  • CLI/status: show skipped fast-path memory checks as not checked and report active custom memory plugin runtime status from status --json --all without requiring built-in agents.defaults.memorySearch, so plugins such as memory-lancedb-pro and memory-cms no longer look unavailable when their own runtime is healthy. Fixes #​56968. Thanks @​Tony-ooo and @​aderius.
  • Gateway/channels: record and log unexpected clean channel monitor exits so channels that return without throwing no longer appear stopped with no error. Fixes #​73099. Thanks @​balaji1968-kingler.
  • Group/channel chats (all channels): keep group/channel replies private by default unless the agent explicitly uses the message tool, fall back to automatic visible replies when the message tool is unavailable, and have openclaw doctor warn about that policy mismatch; messages.groupChat.visibleReplies: "automatic" restores legacy auto-posting. (#​73046) Thanks @​scoootscooob.
  • Plugins/package: force nested bundled-plugin runtime dependency installs out of inherited npm dry-run mode during prepack and package smoke checks, so packed installs materialize required plugin modules instead of reporting missing bundled files. Refs #​73128. Thanks @​Adam-Researchh.
  • Discord: skip reaction events before REST channel fetch when notifications are off, guild reactions are disabled, or allowlist mode cannot match without channel overrides, reducing reconnect bursts that caused slow listener warnings. Fixes #​73133. Thanks @​isaacsummers.
  • Channels/Telegram: centralize polling update tracking so accepted offsets remain durable across restarts, same-process handler failures can still retry, and slow offset writes cannot overwrite newer accepted watermarks. Refs #​73115. Thanks @​vdruts.
  • Agents/models: classify empty, reasoning-only, and planning-only terminal agent runs before accepting a model fallback candidate, so invalid or incompatible models can advance to the next configured fallback instead of returning a 30-second terminal failure. Fixes #​73115. Thanks @​vdruts.
  • Memory/LanceDB: let embedding config use provider-backed auth profiles, environment credentials, or provider config without a separate plugin embedding.apiKey, so OAuth-capable embedding providers can power auto-recall/capture. Fixes #​68950. Thanks @​malshaalan-ai.
  • CLI/parents: invoking openclaw <parent> (memory, channels, plugins, approvals, devices, cron, mcp) without a subcommand now prints the parent's help and exits 0, matching <parent> --help and the existing agents / sessions defaults so shell && chains and pnpm wrappers no longer surface a misleading ELIFECYCLE Command failed with exit code 1. line. Fixes #​73077. Thanks @​hclsys.
  • Plugins/hooks: time out never-settling agent_end observation hooks after 30 seconds and log the plugin failure, so hung embedding endpoints no longer leave memory capture silently pending forever. Fixes #​65544. Thanks @​ghoc0099.
  • Gateway/config: serve runtime config schemas from the current plugin metadata snapshot and generated bundled channel schema metadata instead of rebuilding plugin channel config modules on every config.get/config.schema, preventing idle plugin-discovery CPU churn after upgrades. Fixes #​73088. Thanks @​sleitor and @​geovansb.
  • Memory/LanceDB: call OpenAI-compatible embedding endpoints through the raw SDK transport without sending encoding_format, then normalize float-array or base64 responses so providers such as ZhiPu and DashScope no longer fail recall with wrong vector dimensions or rejected parameters. Fixes #​63655. Thanks @​kinthaiofficial.
  • Plugins/install: run dependency installs with npm error-level logging instead of silent mode so failed plugin or hook installs surface actionable npm errors such as EUNSUPPORTEDPROTOCOL instead of npm install failed: with no detail. (#​73093) Thanks @​sanctrl.
  • Memory/LanceDB: bound memory recall embedding queries with a new recallMaxChars setting, prefer the latest user message over channel prompt metadata during auto-recall, and document the knob so small Ollama embedding models avoid context-length failures. Fixes #​56780. Thanks @​rungmc357 and @​zak-collaborator.
  • CLI/skills: resolve workspace-backed skills commands from --agent, then the current agent workspace, before falling back to the default agent, so multi-agent ClawHub installs, updates, and status checks stay scoped to the active workspace. Fixes #​56161; carries forward #​72726. Thanks @​langbowang and @​luyao618.
  • Plugin SDK: fall back from partial bundled plugin directory overrides to package source public surfaces while preserving OPENCLAW_DISABLE_BUNDLED_PLUGINS as a hard disable. (#​72817) Thanks @​serkonyc.
  • Agents/ACPX: stop forwarding Codex ACP timeout config controls that Codex rejects while preserving OpenClaw's run-timeout watchdog for ACP subagents. Fixes #​73052. Thanks @​pfrederiksen and @​richa65.
  • Memory Core: stream fallback vector search scoring with a bounded top-K result set so large indexes do not materialize every chunk embedding when sqlite-vec is unavailable. (#​73069) Thanks @​parkertoddbrooks.
  • Memory Core: stream embedding-cache seeding during safe reindex so large local caches do not materialize every row into the V8 heap before the atomic rebuild. (#​73067) Thanks @​parkertoddbrooks.
  • Memory/Ollama: add memorySearch.remote.nonBatchConcurrency for inline embedding indexing, default Ollama non-batch indexing to one request at a time, and keep batch concurrency separate from non-batch concurrency so local embedding backfills avoid timeout storms on smaller hosts. Carries forward #​57733. Thanks @​itilys.
  • macOS app: update Peekaboo, ElevenLabsKit, and MLX TTS helper dependencies, make canvas file watching and config/exec-approval state writes reliable under concurrent app/test activity, and keep the app plus helper builds warning-free. Thanks @​Blaizzy.
  • iOS app: refresh SwiftPM/XcodeGen source hygiene, make app, extension, watch, and curated shared Swift files pass the prebuild SwiftFormat and SwiftLint checks, move relay registration off deprecated StoreKit receipt APIs, and keep simulator builds and logic tests warning-free. Thanks @​ngutman.
  • Agents/models: keep models.json readiness and provider-hook caches warm across repeated agent and subagent model resolution while preserving external models.json invalidation, reducing repeated provider-plugin loads on slower ARM64 hosts. Fixes #​73075. Thanks @​jochen.
  • Docs/tools: clarify that tools.profile: "messaging" is intentionally narrow and that tools.profile: "full" is the unrestricted baseline for broader command/control access. Carries forward #​39954. Thanks @​posigit.
  • Control UI/Agents: redact tool-call args, partial/final results, derived exec output, and configured custom secret patterns before streaming tool events to the Control UI, so tool output cannot expose provider or channel credentials. Fixes #​72283. (#​72319) Thanks @​volcano303 and @​BunsDev.
  • Agents/sessions: keep sessions_history recall redaction enabled even when general log redaction is disabled, and clarify that safety-boundary UI/tool/diagnostic payloads still redact independently of logging.redactSensitive. Carries forward #​72319. Thanks @​volcano303 and @​BunsDev.
  • Providers/Codex: pass agent and workspace directories into provider stream wrappers so Codex native web_search activation can evaluate the correct auth context, and smoke-test the built status-message runtime by resolving the emitted bundle name. Carries forward #​67843; refs #​65909. Thanks @​neilofneils404.
  • Cron/models: keep payload.model as a per-job primary that can use configured fallbacks, while still letting payload.fallbacks: [] make cron runs strict and avoid hidden agent-primary retries. Refs #​73023. Thanks @​pavelyortho-cyber.
  • Models/fallbacks: treat user-selected session models as exact choices, so /model ollama/... and model-picker switches fail visibly when the selected provider is unreachable instead of answering from an unrelated configured fallback. Fixes #​73023. Thanks @​pavelyortho-cyber.
  • Codex harness: keep ChatGPT subscription app-server runs from inheriting CODEX_API_KEY or OPENAI_API_KEY, and fall back to CODEX_API_KEY / OPENAI_API_KEY app-server login only when no Codex account is available. Fixes #​73057. Thanks @​holgergruenhagen and @​pashpashpash.
  • CLI/model probes: fail local infer model run probes when the provider returns no text output, so unreachable local providers and empty completions no longer look like successful smoke tests. Refs #​73023. Thanks @​pavelyortho-cyber.
  • CLI/Ollama: run local infer model run through the lean provider completion path and skip global model discovery for one-shot local probes, so Ollama smoke tests no longer pay full chat-agent/tool startup cost or hang before the native /api/chat request. Fixes #​72851. Thanks @​TotalRes2020.
  • Doctor/gateway services: ignore launchd/systemd companion services that only reference the gateway as a dependency, suppress inactive Linux extra-service warnings, and avoid rewriting a running systemd gateway command/entrypoint during doctor repair. Carries forward #​39118. Thanks @​therk.
  • Daemon/service: only emit hard-coded version-manager paths such as ~/.volta/bin, ~/.asdf/shims, ~/.bun/bin, and fnm/pnpm fallbacks into gateway and node service PATHs when the directories exist, so openclaw doctor no longer flags gateway.path.non-minimal against a PATH the daemon just wrote. Env-driven roots and stable user-bin dirs remain unconditional. Fixes #​71944; carries forward #​71964. Thanks @​Sanjays2402.
  • CLI/startup: disable Node's module compile cache automatically for live source-checkout launchers so in-place pnpm build updates are visible to the next openclaw CLI invocation. Fixes #​73037. Thanks @​LouisGameDev.
  • Agents/group chat: keep silent-allowed empty and reasoning-only turns on the NO_REPLY path without injecting visible-answer retry prompts, and clarify the group prompt so agents use the exact silent token instead of prose. Thanks @​vincentkoc.
  • Agents/group chat: move NO_REPLY mechanics into channel-aware direct/group prompts and suppress the duplicate generic silent-reply section for auto-reply runs, so always-on group agents get one consistent stay-silent instruction. Thanks @​vincentkoc.
  • Providers/OpenAI: preserve encrypted empty-summary Responses reasoning items in WebSocket replay and request reasoning.encrypted_content on reasoning turns so GPT-5.4/GPT-5.5 sessions do not lose required rs_* state beside msg_* items. Fixes #​73053. Thanks @​odb36777.
  • Gateway/startup: treat plugins.enabled=false as an early plugin fast path, skipping plugin auto-enable discovery, gateway plugin lookup/runtime-dependency staging, and stale-plugin cleanup warnings while preserving channel blocker warnings. (#​73041) Thanks @​WuKongAI-CMU.
  • Channels/commands: make generated /dock-* commands switch the active session reply route through session.identityLinks instead of falling through to normal chat. Fixes #​69206; carries forward #​73033. Thanks @​clawbones and @​michaelatamuk.
  • Providers/Cloudflare AI Gateway: strip assistant prefill turns from Anthropic Messages payloads when thinking is enabled, so Claude requests through Cloudflare AI Gateway no longer fail Anthropic conversation-ending validation. Fixes #​72905; carries forward #​73005. Thanks @​AaronFaby and @​sahilsatralkar.
  • Gateway/startup: keep primary-model startup prewarm on scoped metadata preparation, let native approval bootstraps retry outside channel startup, and skip the global hook runner when no gateway_start hook is registered, so clean post-ready sidecar work stays off the critical path. Refs #​72846. Thanks @​RayWoo, @​livekm0309, and @​mrz1836.
  • Gateway/channels: start bundled channel accounts with a lightweight runtimeContexts surface instead of importing the full reply/routing/session channel runtime before startAccount, so Discord, Telegram, Slack, Matrix, and QQBot startup no longer block on unrelated channel helper graphs. Refs #​72846 and #​72960. Thanks @​mrz1836, @​RayWoo, and @​rollingshmily.
  • Gateway/supervisor: exit cleanly when a supervised restart finds an existing healthy gateway and bound retries when the existing gateway stays unhealthy, so stale lock contention cannot loop indefinitely. Refs #​72846. Thanks @​azgardtek.
  • Gateway/startup: scope primary-model provider discovery during channel prewarm to the configured provider owner and add split startup trace timings, so boot avoids staging unrelated bundled provider dependencies while setup discovery remains broad. Fixes #​73002. Thanks @​Schnup03.
  • Plugins/runtime deps: declare retained staged bundled plugin dependencies in the npm staging manifest while installing only newly missing packages, so Gateway restarts avoid reinstalling the full retained dependency set when one runtime dependency is absent. Fixes #​73055. Thanks @​GCorp2026.
  • CLI/status: keep default openclaw status off the heavyweight security audit, plugin compatibility, and memory-vector probes while still showing configured Telegram channels through setup metadata, so routine health checks stay fast and no longer render an empty Channels table. Fixes #​72993. Thanks @​comick1.
  • Channels/Telegram: send a best-effort native typing cue immediately after an inbound message is accepted, so slow pre-dispatch turns show Telegram liveness before queueing, compaction, model, or tool work starts. Fixes #​63759. Thanks @​alessandropcostabr.
  • Channels/Telegram: stop native approval startup auth failures from retrying every second, while still waiting through retryable Gateway auth handoffs, so Telegram approval setup problems no longer create a reconnect/log loop during channel startup. Refs #​72846 and #​72867. Thanks @​kiranvk-2011 and @​porly1985.
  • Channels/Microsoft Teams: unwrap staged CommonJS JWT runtime dependencies before Bot Connector token validation so inbound Teams messages no longer 401 after the bundled runtime-deps move. Fixes #​73026 and #​73167. Thanks @​kbrown10000 and @​mikelavrik.
  • Gateway/auth: allow local direct callers in trusted-proxy mode to use the configured gateway password as an internal fallback while keeping token fallback rejected. Fixes #​17761. Thanks @​dashed, @​vincentkoc, and @​jetd1.
  • Gateway/auth: add explicit trustedProxy.allowLoopback support for same-host loopback reverse proxies while keeping loopback trusted-proxy auth fail-closed by default and preserving required-header and allowlist checks. Fixes #​59167; carries forward #​63379. Thanks @​Matir, @​jeremyakers, and @​mrosmarin.
  • Channels/sessions: prevent guarded inbound session recording from creating route-only phantom sessions while still allowing last-route updates for sessions that already exist. Carries forward #​73009. Thanks @​jzakirov.
  • Cron: accept delivery.threadId in Gateway cron add/update schemas so scheduled announce delivery can target Telegram forum topics and other threaded channel destinations through the documented delivery path. Fixes #​73017. Thanks @​coachsootz.
  • Plugins/runtime deps: stage bundled plugin dependencies imported by mirrored root dist chunks, so packaged memory and status commands do not miss chokidar or similar root-chunk dependencies after update. Fixes #​72882 and #​72970; carries forward #​72992. Thanks @​shrimpy8, @​colin-chang, and @​Schnup03.
  • Plugins/runtime deps: reuse unchanged bundled plugin runtime mirrors instead of rebuilding plugin trees on every load, cutting avoidable writes and restart/reconnect I/O on slow storage. Fixes #​72933. Thanks @​jasonftl.
  • Agents/runtime context: deliver hidden runtime context through prompt-local system context while keeping the transcript-only custom entry out of provider user turns, and strip stale copied runtime-context prefaces from user-facing replies. Fixes #​72386; carries forward #​72969. Thanks @​jhsmith409.
  • Channels/Telegram: skip the optional webhook-info API call during polling-mode status checks and startup bot-label probes so long-polling setups avoid an unnecessary Telegram round trip. Carries forward #​72990. Thanks @​danielgruneberg.
  • CLI/message: resolve targeted openclaw message channels to their owning plugin before loading the registry, and fall back to configured channel plugins when the channel must be inferred, so scripted sends avoid full bundled plugin registry scans without assuming channel ids match plugin ids. Fixes #​73006. Thanks @​jasonftl.
  • Plugins/startup: parse strict JSON plugin manifests with native JSON first and keep JSON5 as the compatibility fallback, reducing manifest registry CPU during Gateway boot and CLI startup. Fixes #​73011. Thanks @​jasonftl.
  • CLI/models: keep route-first models status --json stdout reserved for the JSON payload by routing auth-profile and startup diagnostics to stderr. Fixes #​72962. Thanks @​vishutdhar.
  • Gateway/runtime: keep dirty-tree status calls from rebuilding live dist, clear stale task and restart state across in-process restarts, retry transient Discord lazy imports, and let channel startup continue after slow model warmup so browser, Discord, and voice-call sidecars come online. Thanks @​vincentkoc.
  • Security/CodeQL: replace file SecretRef id gateway schema regex validation with segment-aligned predicates and set empty permissions on release summary/backfill jobs so the narrowed CodeQL profile stays clean. Thanks @​vincentkoc.
  • Sessions: ignore future-dated session activity timestamps during reset freshness checks and cap future updatedAt values at the merge boundary so clock-skewed messages cannot keep stale sessions alive forever. Fixes #​72989. Thanks @​martingarramon.
  • Sessions: apply search, activity filters, and limits before gateway row enrichment so bounded session lists avoid scanning discarded transcripts. Carries forward #​72978. Thanks @​yeager.
  • Sessions: remove trajectory runtime and pointer sidecars when session maintenance prunes, caps, or disk-evicts their owning session, while preserving sidecars still referenced by live rows. Fixes #​73000. Thanks @​jared-rebel.
  • Plugins/CLI: allow managed plugin installs when the active extensions root is a symlink to a real state directory, while keeping nested target symlinks blocked and suppressing misleading hook-pack fallback errors for install-boundary failures. Fixes #​72946. Thanks @​mayank6136.
  • Providers/Ollama: mark discovered Ollama catalog models as supporting streaming usage metadata so token accounting stays enabled for local models. (#​72976) Thanks @​sdeyang.
  • Media understanding: reject malformed MIME values with trailing junk while preserving standard parameter tails before enrichment uses them. (#​72914) Thanks @​volcano303.
  • WebChat: keep bare /new and /reset prompts from producing empty transcript text by inserting the hidden session marker when the visible tail is blank. (#​72863) Thanks @​mahopan.
  • CLI/update: explain completion-cache refresh timeouts with manual refresh guidance instead of surfacing a raw low-level timeout. Fixes #​72842. (#​72850) Thanks @​iot2edge.
  • Memory-core/dreaming: give narrative generation a 60-second timeout so slower local or remote models can finish instead of timing out at 15 seconds. Fixes #​72837. (#​72852) Thanks @​RayWoo.
  • Plugins/hooks: inject each plugin's resolved config into internal hook event context without mutating the shared event object. (#​72888) Thanks @​jalapeno777.
  • Agents/ACP: pass the resolved ACP agent directory into media understanding so per-agent media caches and config are used for ACP-dispatched image turns. (#​72832) Thanks @​luyao618.
  • Gateway/Bonjour: truncate mDNS service names and host labels to the 63-byte DNS label limit at valid UTF-8 boundaries. (#​72809) Thanks @​luyao618.
  • Feishu: treat groups explicitly configured under channels.feishu.groups as admitted even when groupAllowFrom is empty, while preserving groupPolicy: "disabled" as a hard group block and keeping groups.* wildcard defaults non-admitting. Fixes #​67687. (#​72789) Thanks @​MoerAI.
  • Gateway/startup: keep hot Gateway boot paths on leaf config imports and add max-RSS reporting to the gateway startup bench so low-memory startup regressions are visible before release. Thanks @​vincentkoc.
  • WebChat: read chat.history from active transcript branches, drop stale streamed assistant tails once final history catches up, and coalesce duplicate in-flight Control UI submits, so rewritten prompts, completed replies, and rapid send events no longer render or process twice. Fixes #​72975, #​72963, and #​72974. Thanks @​dmagdici, @​lhtpluto, and @​Benjamin5281999.
  • WebChat/TTS: persist automatic final-mode TTS audio as a supplemental audio-only transcript update instead of adding a second assistant message with the same visible text. Fixes #​72830. Thanks @​lhtpluto.
  • Agents/LSP: terminate bundled stdio LSP process trees during runtime disposal and Gateway shutdown, so nested children such as tsserver do not survive stop or restart. Fixes #​72357. Thanks @​ai-hpc and @​bittoby.
  • Diagnostics/OTEL: capture privacy-safe model-call request payload bytes, streamed response bytes, first-response latency, and total duration in diagnostic events, plugin hooks, stability snapshots, and OTEL model-call spans/metrics without logging raw model content. Fixes #​33832. Thanks @​wwh830.
  • Logging: write validated diagnostic trace context as top-level traceId, spanId, parentSpanId, and traceFlags fields in file-log JSONL records so traced requests and model calls are easier to correlate in log processors. Refs #​40353. Thanks @​liangruochong44-ui.
  • Logging/sessions: apply configured redaction patterns to persisted session transcript text and accept escaped character classes in safe custom redaction regexes, so transcript JSONL no longer keeps matching sensitive text in the clear. Fixes #​42982. Thanks @​panpan0000.
  • Providers/Ollama: honor /api/show capabilities when registering local models so non-tool Ollama models no longer receive the agent tool surface, and keep native Ollama thinking opt-in instead of enabling it by default. Fixes #​64710 and duplicate #​65343. Thanks @​yuan-b, @​netherby, @​xilopaint, and @​Diyforfun2026.
  • Control UI/Agents: remount the Overview model controls when switching agents so the primary-model picker cannot retain stale per-agent selection. Fixes #​39392; carries forward #​39401, notes the duplicate #​39495 approach, and keeps #​46275/#​54724 broader stabilization out of scope. Thanks @​daijunyi002, @​SergioChan, @​aworki, and @​wsyjh8.
  • Auto-reply: poison inbound message dedupe after replay-unsafe provider/runtime failures so retries stay safe before visible progress but cannot duplicate messages after block output, tool side effects, or session progress. Fixes #​69303; keeps #​58549 and #​64606 as duplicate validation. Thanks @​martingarramon, @​NikolaFC, and @​zeroth-blip.
  • Agents/model fallback: jump directly to a known later live-session model redirect instead of walking unrelated fallback candidates, while preserving the already-landed live-session/fallback loop guard. Fixes #​57471; related loop family already closed via #​58496. Thanks @​yuxiaoyang2007-prog.
  • Gateway/Bonjour: keep @​homebridge/ciao cancellation handlers registered across advertiser restarts so late probing cancellations cannot crash Linux and other mDNS-churned gateways. Thanks @​vincentkoc.
  • Plugins/startup: load the default memory-core slot during Gateway startup when permitted so active-memory recall can call memory_search and memory_get without requiring an explicit plugins.slots.memory entry, while preserving plugins.slots.memory: "none". Thanks @​vincentkoc.
  • Gateway/plugins: resolve gateway_start cron hooks from live Gateway runtime state before the legacy deps fallback, so memory-core dreaming cron reconciliation keeps working on installs where deps.cron is not populated during service startup. Fixes #​72835. Thanks @​RayWoo.
  • Plugins/CLI: prefer native require for compiled bundled plugin JavaScript before jiti so read-only config, status, device, and node commands avoid unnecessary transform overhead on slow hosts. Fixes #​62842. Thanks @​Effet.
  • Plugins/compat: inventory doctor-side deprecation migrations separately from runtime plugin compatibility so release sweeps preserve needed repairs while enforcing dated removal windows. Thanks @​vincentkoc.
  • Plugins/compat: add missing dated compatibility records for legacy extension-api, memory registration, provider hook/type aliases, runtime aliases, channel SDK helpers, and approval/test utility shims. Thanks @​vincentkoc.
  • Plugins/CLI: refresh the persisted registry after managed plugin files are removed so ClawHub uninstall cannot leave stale plugins list entries. Thanks @​vincentkoc.
  • Plugins/CLI: make plugin install and uninstall config writes conflict-aware, clear stale denylist entries on explicit reinstall/removal, and delete managed plugin files only after config/index commit succeeds. Thanks @​vincentkoc.
  • Plugins: fail plugins update when tracked plugin or hook updates error, keep bundled runtime-dependency repair behind restrictive allowlists, and reject package installs with unloadable extension entries. Thanks @​vincentkoc.
  • WebChat/Control UI: support non-video file attachments in chat uploads while preserving the existing image attachment path and MIME-sniff fallback for generic image uploads. (#​70947) Thanks @​IAMSamuelRodda.
  • Skills/memory: restore Chokidar v5 hot reloads by watching concrete skill and memory roots with filters, including SKILL.md removals and deleted skill folders without broad workspace recursion. Fixes #​27404, #​33585, and #​41606. Thanks @​shelvenzhou, @​08820048, and @​rocke2020.
  • Gateway/chat: keep duplicate attachment-backed chat.send retries with the same idempotency key on the documented in-flight path so aborts still target the real active run. Fixes #​70139. Thanks @​Feelw00.
  • Gateway/chat: preserve repeated boundary characters while merging assistant chat stream deltas, including repeated digits, CJK characters, and markdown/table tokens. Fixes #​63769; carries forward #​63994 and #​65457. Thanks @​yon950905 and @​mohuaxiao.
  • Plugins: share package entrypoint resolution between install and discovery, reject mismatched runtimeExtensions, and cache bundled runtime-dependency manifest reads during scans. Thanks @​vincentkoc.
  • WhatsApp/Web: keep quiet but healthy linked-device sessions connected by basing the watchdog on WhatsApp Web transport activity, while retaining a longer app-silence cap so frame activity cannot mask a stuck session forever. Fixes #​70678; carries forward the focused #​71466 approach and keeps #​63939 as related configurable-timeout follow-up. Thanks @​vincentkoc and @​oromeis.
  • Discord/gateway: count failed health-monitor restart attempts toward cooldown and hourly caps, and evict stale account lifecycle state during channel reloads so repeated Discord gateway recovery cannot loop on old status. Fixes #​38596. (#​40413) Thanks @​jellyAI-dev and @​vashquez.
  • TTS/BlueBubbles: pre-transcode synthesized MP3 audio to opus-in-CAF (mono, 24 kHz — validated against macOS 15.x Messages.app's native voice-memo CAF descriptor) on macOS hosts before handing the file to BlueBubbles, so iMessage renders the result as a native voice-memo bubble with proper duration and waveform UI instead of a plain file attachment. Adds an opt-in tts.voice.preferAudioFileFormat channel capability and a magic-byte sniff for the CAF container so the host-local-media validator (which uses file-type and didn't recognize CAF natively) can verify the pre-transcoded buffer. Channels that don't opt in are unaffected. (#​72586) Fixes #​72506. Thanks @​omarshahine.
  • Feishu: retry WebSocket startup failures with monitor-owned backoff while preserving SDK-local heartbeat defaults, so persistent-connection startup failures no longer leave the monitor hung. Fixes #​68766; related #​42354 and #​55532. Thanks @​alex-xuweilong, @​120106835, @​sirfengyu, and @​tianhaocui.
  • Cron: normalize isolated job tool allowlists before granting the narrow self-removal cron tool path, keeping scheduled jobs aligned with shared tool policy normalization. (#​73028) Thanks @​jalehman.

Configuration

📅 Schedule: (in timezone America/Los_Angeles)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

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

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

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


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Mend Renovate.

This PR contains the following updates: | Package | Update | Change | |---|---|---| | [ghcr.io/openclaw/openclaw](https://openclaw.ai) ([source](https://github.com/openclaw/openclaw)) | minor | `2026.4.26` → `2026.5.12` | --- ### Release Notes <details> <summary>openclaw/openclaw (ghcr.io/openclaw/openclaw)</summary> ### [`v2026.5.12`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#2026512) [Compare Source](https://github.com/openclaw/openclaw/compare/v2026.5.7...v2026.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 [#&#8203;7648](https://github.com/openclaw/openclaw/issues/7648) and [#&#8203;81287](https://github.com/openclaw/openclaw/issues/81287). Thanks [@&#8203;BunsDev](https://github.com/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. ([#&#8203;69542](https://github.com/openclaw/openclaw/issues/69542)) Thanks [@&#8203;kaseonedge](https://github.com/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 [@&#8203;Lellansin](https://github.com/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. ([#&#8203;75509](https://github.com/openclaw/openclaw/issues/75509)) Thanks [@&#8203;akrimm702](https://github.com/akrimm702). - Cron: add direct `cron.get`, `openclaw cron get <id>`, and agent-tool `get` support for inspecting one stored cron job by id. ([#&#8203;75117](https://github.com/openclaw/openclaw/issues/75117)) Thanks [@&#8203;samzong](https://github.com/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. ([#&#8203;66933](https://github.com/openclaw/openclaw/issues/66933)) Thanks [@&#8203;JerranC](https://github.com/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. ([#&#8203;73458](https://github.com/openclaw/openclaw/issues/73458)) Thanks [@&#8203;samzong](https://github.com/samzong). - Channels/iMessage: add `openclaw channels status --channel <name>` filtering and document the BlueBubbles-to-imsg cutover path so operators can probe iMessage without starting both channel monitors. ([#&#8203;80706](https://github.com/openclaw/openclaw/issues/80706)) Thanks [@&#8203;omarshahine](https://github.com/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. ([#&#8203;80209](https://github.com/openclaw/openclaw/issues/80209)) Thanks [@&#8203;liorb-mountapps](https://github.com/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. ([#&#8203;77295](https://github.com/openclaw/openclaw/issues/77295)) Thanks [@&#8203;leoge007](https://github.com/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 [#&#8203;44107](https://github.com/openclaw/openclaw/issues/44107). Thanks [@&#8203;BunsDev](https://github.com/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 [#&#8203;52382](https://github.com/openclaw/openclaw/issues/52382). ([#&#8203;52400](https://github.com/openclaw/openclaw/issues/52400)) Thanks [@&#8203;thirumaleshp](https://github.com/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. ([#&#8203;79414](https://github.com/openclaw/openclaw/issues/79414)) Thanks [@&#8203;altaywtf](https://github.com/altaywtf). - Build: align Telegram QA workflows and git source installs with the pnpm 11 workspace build allowlist surface. ([#&#8203;80588](https://github.com/openclaw/openclaw/issues/80588)) Thanks [@&#8203;altaywtf](https://github.com/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. ([#&#8203;79867](https://github.com/openclaw/openclaw/issues/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 [#&#8203;48435](https://github.com/openclaw/openclaw/issues/48435). ([#&#8203;80145](https://github.com/openclaw/openclaw/issues/80145)) Thanks [@&#8203;esegev1](https://github.com/esegev1) and [@&#8203;HemantSudarshan](https://github.com/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. ([#&#8203;64365](https://github.com/openclaw/openclaw/issues/64365)) Thanks [@&#8203;tony88331](https://github.com/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 [#&#8203;79025](https://github.com/openclaw/openclaw/issues/79025). ([#&#8203;75356](https://github.com/openclaw/openclaw/issues/75356)) Thanks [@&#8203;tmimmanuel](https://github.com/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 [#&#8203;80091](https://github.com/openclaw/openclaw/issues/80091). ([#&#8203;80111](https://github.com/openclaw/openclaw/issues/80111)) Thanks [@&#8203;bek91](https://github.com/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 [#&#8203;77857](https://github.com/openclaw/openclaw/issues/77857). Thanks [@&#8203;jamiezigelbaum](https://github.com/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. ([#&#8203;79081](https://github.com/openclaw/openclaw/issues/79081)) Thanks [@&#8203;VACInc](https://github.com/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. ([#&#8203;74430](https://github.com/openclaw/openclaw/issues/74430)) Thanks [@&#8203;samzong](https://github.com/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 [#&#8203;79284](https://github.com/openclaw/openclaw/issues/79284). ([#&#8203;79307](https://github.com/openclaw/openclaw/issues/79307)) Thanks [@&#8203;TurboTheTurtle](https://github.com/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 [#&#8203;75578](https://github.com/openclaw/openclaw/issues/75578)/[#&#8203;75581](https://github.com/openclaw/openclaw/issues/75581)/[#&#8203;75588](https://github.com/openclaw/openclaw/issues/75588) and part of [#&#8203;73384](https://github.com/openclaw/openclaw/issues/73384)/[#&#8203;74483](https://github.com/openclaw/openclaw/issues/74483). Thanks [@&#8203;100yenadmin](https://github.com/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. ([#&#8203;79348](https://github.com/openclaw/openclaw/issues/79348)) Thanks [@&#8203;jesse-merhi](https://github.com/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. ([#&#8203;79512](https://github.com/openclaw/openclaw/issues/79512)) Thanks [@&#8203;mbelinky](https://github.com/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 [#&#8203;79369](https://github.com/openclaw/openclaw/issues/79369). - Chat commands: add `/think default` and `/fast default` to clear session overrides and inherit configured/provider defaults. ([#&#8203;79385](https://github.com/openclaw/openclaw/issues/79385)) Thanks [@&#8203;VACInc](https://github.com/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.<name>` config so paths and flag values containing spaces stay intact when spawning ACP agent processes. Thanks [@&#8203;TheArchitectit](https://github.com/TheArchitectit) and [@&#8203;BunsDev](https://github.com/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 [#&#8203;79812](https://github.com/openclaw/openclaw/issues/79812). ([#&#8203;80015](https://github.com/openclaw/openclaw/issues/80015)) Thanks [@&#8203;TurboTheTurtle](https://github.com/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 [@&#8203;anagnorisis2peripeteia](https://github.com/anagnorisis2peripeteia). - Feishu: resolve group policy/tool context from the trusted chat target for group turns while keeping the speaker in `From`, so @&#8203;mention replies do not drop the configured group id. Fixes [#&#8203;79457](https://github.com/openclaw/openclaw/issues/79457). Thanks [@&#8203;greyxiong](https://github.com/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 [#&#8203;73182](https://github.com/openclaw/openclaw/issues/73182). Thanks [@&#8203;anagnorisis2peripeteia](https://github.com/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 [#&#8203;79310](https://github.com/openclaw/openclaw/issues/79310). Thanks [@&#8203;rollingshmily](https://github.com/rollingshmily). - Docker: run the runtime image under `tini` so long-lived containers reap orphaned child processes and forward signals correctly. ([#&#8203;77885](https://github.com/openclaw/openclaw/issues/77885)) Thanks [@&#8203;VintageAyu](https://github.com/VintageAyu). - Logging/redaction: redact quoted HTTP client secret fields and auth/cookie headers in shared log and formatted error output. Related [#&#8203;71211](https://github.com/openclaw/openclaw/issues/71211) and [#&#8203;65623](https://github.com/openclaw/openclaw/issues/65623). ([#&#8203;75033](https://github.com/openclaw/openclaw/issues/75033)) Thanks [@&#8203;liaoandi](https://github.com/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 [@&#8203;BunsDev](https://github.com/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`. ([#&#8203;64512](https://github.com/openclaw/openclaw/issues/64512)) Thanks [@&#8203;mobilinkd](https://github.com/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 [#&#8203;78311](https://github.com/openclaw/openclaw/issues/78311). Thanks [@&#8203;FriedBack](https://github.com/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 [#&#8203;50701](https://github.com/openclaw/openclaw/issues/50701). Thanks [@&#8203;dev-gideon-llc](https://github.com/dev-gideon-llc) and [@&#8203;BunsDev](https://github.com/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 [@&#8203;BunsDev](https://github.com/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. ([#&#8203;69633](https://github.com/openclaw/openclaw/issues/69633)) Thanks [@&#8203;AlexAlves87](https://github.com/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. ([#&#8203;79146](https://github.com/openclaw/openclaw/issues/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 [@&#8203;shakkernerd](https://github.com/shakkernerd). - Plugins/doctor: avoid full-array sorting while selecting ClawHub search/archive results and bounded dreaming doctor entries. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Agents/compaction: keep contributor diagnostics to a bounded top-three selection without sorting the full history. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Sessions/UI: avoid full-array sorting while selecting ACPX leases, Google Meet calendar events, and latest chat sessions. Thanks [@&#8203;shakkernerd](https://github.com/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: let browser realtime Talk, Gateway relay/Voice Call realtime bridges, and OpenAI realtime transcription use `openai-codex` OAuth when no direct API key is configured, make Google Meet `test_speech` honor `mode: "bidi"`, expose Control UI launch options for provider/model/voice/transport/VAD/reasoning, and update the default OpenAI realtime voice model to `gpt-realtime-2`. Thanks [@&#8203;Solvely-Colin](https://github.com/Solvely-Colin). - Telegram: preserve the channel-specific 10-option poll cap in the unified outbound adapter so over-limit polls are rejected before send. ([#&#8203;78762](https://github.com/openclaw/openclaw/issues/78762)) Thanks [@&#8203;obviyus](https://github.com/obviyus). - Telegram/streaming: continue over-limit draft previews in a new message instead of stopping when rendered preview text crosses Telegram's message limit. ([#&#8203;74508](https://github.com/openclaw/openclaw/issues/74508)) Thanks [@&#8203;anagnorisis2peripeteia](https://github.com/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. ([#&#8203;78522](https://github.com/openclaw/openclaw/issues/78522)) Thanks [@&#8203;zeroth-blip](https://github.com/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 [#&#8203;77088](https://github.com/openclaw/openclaw/issues/77088). ([#&#8203;77157](https://github.com/openclaw/openclaw/issues/77157)) Thanks [@&#8203;MkDev11](https://github.com/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 [@&#8203;solomonneas](https://github.com/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. ([#&#8203;78921](https://github.com/openclaw/openclaw/issues/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. ([#&#8203;79704](https://github.com/openclaw/openclaw/issues/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 [#&#8203;79677](https://github.com/openclaw/openclaw/issues/79677). ([#&#8203;79777](https://github.com/openclaw/openclaw/issues/79777)) Thanks [@&#8203;indulgeback](https://github.com/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 [#&#8203;78514](https://github.com/openclaw/openclaw/issues/78514). ([#&#8203;78902](https://github.com/openclaw/openclaw/issues/78902)) Thanks [@&#8203;melihselamett-stack](https://github.com/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. ([#&#8203;52989](https://github.com/openclaw/openclaw/issues/52989)) Thanks [@&#8203;easyteacher](https://github.com/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 [#&#8203;79258](https://github.com/openclaw/openclaw/issues/79258). Thanks [@&#8203;haumanto](https://github.com/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 [#&#8203;73655](https://github.com/openclaw/openclaw/issues/73655). Thanks [@&#8203;mmartoccia](https://github.com/mmartoccia). - Discord/voice: make `openclaw channels capabilities --channel discord --target channel:<id>` 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 [#&#8203;71637](https://github.com/openclaw/openclaw/issues/71637) to a public surface, complementing `gateway.reload.deferralTimeoutMs`. Refs [#&#8203;76162](https://github.com/openclaw/openclaw/issues/76162). Thanks [@&#8203;solomonneas](https://github.com/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. ([#&#8203;79130](https://github.com/openclaw/openclaw/issues/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 [#&#8203;78445](https://github.com/openclaw/openclaw/issues/78445). ([#&#8203;78483](https://github.com/openclaw/openclaw/issues/78483)) Thanks [@&#8203;Beandon13](https://github.com/Beandon13). - Plugins/install: add `npm-pack:<path.tgz>` 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 [#&#8203;78702](https://github.com/openclaw/openclaw/issues/78702) and [#&#8203;78593](https://github.com/openclaw/openclaw/issues/78593). Thanks [@&#8203;MarkMa84](https://github.com/MarkMa84) and [@&#8203;mkupiainen](https://github.com/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. ([#&#8203;73312](https://github.com/openclaw/openclaw/issues/73312)) Thanks [@&#8203;kakahu2015](https://github.com/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 [#&#8203;77984](https://github.com/openclaw/openclaw/issues/77984). Thanks [@&#8203;roseware-dev](https://github.com/roseware-dev) and [@&#8203;rubencu](https://github.com/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 [#&#8203;77958](https://github.com/openclaw/openclaw/issues/77958). ([#&#8203;77971](https://github.com/openclaw/openclaw/issues/77971)) Thanks [@&#8203;hclsys](https://github.com/hclsys) and [@&#8203;jarro](https://github.com/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 [#&#8203;33957](https://github.com/openclaw/openclaw/issues/33957). Thanks [@&#8203;bitloi](https://github.com/bitloi) and [@&#8203;vincentkoc](https://github.com/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 [#&#8203;78159](https://github.com/openclaw/openclaw/issues/78159). ([#&#8203;78266](https://github.com/openclaw/openclaw/issues/78266)) Thanks [@&#8203;BradGroux](https://github.com/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 [#&#8203;77674](https://github.com/openclaw/openclaw/issues/77674). ([#&#8203;78081](https://github.com/openclaw/openclaw/issues/78081)) Thanks [@&#8203;Beandon13](https://github.com/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 [#&#8203;52044](https://github.com/openclaw/openclaw/issues/52044). ([#&#8203;52487](https://github.com/openclaw/openclaw/issues/52487)) Thanks [@&#8203;andyk-ms](https://github.com/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 [#&#8203;78057](https://github.com/openclaw/openclaw/issues/78057). ([#&#8203;78292](https://github.com/openclaw/openclaw/issues/78292)) Thanks [@&#8203;Linux2010](https://github.com/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. ([#&#8203;77902](https://github.com/openclaw/openclaw/issues/77902)) Thanks [@&#8203;ragesaq](https://github.com/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 [@&#8203;pashpashpash](https://github.com/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 [@&#8203;amknight](https://github.com/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 [@&#8203;kevinslin](https://github.com/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 [@&#8203;kevinslin](https://github.com/kevinslin). - QQBot/Skills: translate QQBot skill descriptions surfaced in the Skills UI so English-language users no longer see Chinese metadata. Fixes [#&#8203;77810](https://github.com/openclaw/openclaw/issues/77810). Thanks [@&#8203;eabase](https://github.com/eabase). - Image generation: include enabled generation providers such as fal in provider discovery even when another image provider is already active. Fixes [#&#8203;78141](https://github.com/openclaw/openclaw/issues/78141). Thanks [@&#8203;leoge007](https://github.com/leoge007). - Slack: keep Socket Mode's native reconnect enabled so transient ping/pong misses can recover without forcing a full provider rebuild. Fixes [#&#8203;77933](https://github.com/openclaw/openclaw/issues/77933). Thanks [@&#8203;bmoran1022](https://github.com/bmoran1022) and [@&#8203;brokemac79](https://github.com/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 [#&#8203;77703](https://github.com/openclaw/openclaw/issues/77703). ([#&#8203;78168](https://github.com/openclaw/openclaw/issues/78168)) Thanks [@&#8203;brokemac79](https://github.com/brokemac79) and [@&#8203;transxtech](https://github.com/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 [@&#8203;Stedyclaw](https://github.com/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 [@&#8203;91wan](https://github.com/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 [@&#8203;amknight](https://github.com/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 [@&#8203;amknight](https://github.com/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 [@&#8203;barronlroth](https://github.com/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 [@&#8203;scoootscooob](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Telegram/performance: reduce command-menu CPU and allocation work when many native, plugin, and custom commands are registered. ([#&#8203;79717](https://github.com/openclaw/openclaw/issues/79717)) Thanks [@&#8203;drsolveit](https://github.com/drsolveit). - CLI/migrate: add bulk on/off and skip controls to interactive Codex skill migration, leaving conflicting skill copies unchecked by default. ([#&#8203;77597](https://github.com/openclaw/openclaw/issues/77597)) Thanks [@&#8203;kevinslin](https://github.com/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 [@&#8203;kevinslin](https://github.com/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 [@&#8203;kevinslin](https://github.com/kevinslin). - CLI/migrate: return cleanly without apply confirmation when interactive Codex migration leaves both skill copies and native plugin activations unselected. Thanks [@&#8203;kevinslin](https://github.com/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 [@&#8203;rolandrscheel](https://github.com/rolandrscheel). - Cron CLI: add `openclaw cron list --agent <id>`, 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 [#&#8203;77118](https://github.com/openclaw/openclaw/issues/77118). Thanks [@&#8203;zhanggttry](https://github.com/zhanggttry). - Slack/performance: reduce message preparation, stream recipient lookup, and thread-context allocation overhead on Slack reply hot paths. Thanks [@&#8203;vincentkoc](https://github.com/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 [#&#8203;78739](https://github.com/openclaw/openclaw/issues/78739). Thanks [@&#8203;tmimmanuel](https://github.com/tmimmanuel), [@&#8203;guguangxin-eng](https://github.com/guguangxin-eng), [@&#8203;hclsys](https://github.com/hclsys), and [@&#8203;BunsDev](https://github.com/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 [#&#8203;77581](https://github.com/openclaw/openclaw/issues/77581). Thanks [@&#8203;BunsDev](https://github.com/BunsDev) and [@&#8203;Beandon13](https://github.com/Beandon13). - Agents/runtime: add prepared runtime foundation contracts for carrying provider, model, tool, TTS, and outbound runtime facts through later reply-path migrations. Thanks [@&#8203;mcaxtr](https://github.com/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 [@&#8203;BunsDev](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/shakkernerd). - Gateway/performance: avoid resolving plugin auto-enable metadata twice in one runtime config pass, reducing repeated dashboard turn metadata scans. Thanks [@&#8203;shakkernerd](https://github.com/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 [@&#8203;BunsDev](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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. ([#&#8203;78768](https://github.com/openclaw/openclaw/issues/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;77060](https://github.com/openclaw/openclaw/issues/77060), [#&#8203;45698](https://github.com/openclaw/openclaw/issues/45698), [#&#8203;47979](https://github.com/openclaw/openclaw/issues/47979), [#&#8203;44107](https://github.com/openclaw/openclaw/issues/44107). Thanks [@&#8203;BunsDev](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - QA/Mantis: accept Blacksmith Testbox `tbx_...` lease ids from desktop smoke warmup, so provider overrides do not fail before inspect/run. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugins/SDK: add bounded `before_agent_finalize` retry instructions so workflow plugins can request one more model pass. Thanks [@&#8203;100yenadmin](https://github.com/100yenadmin). - Plugin SDK: add plugin-owned `SessionEntry` slot projection and scoped trusted-policy session extension reads. ([#&#8203;75609](https://github.com/openclaw/openclaw/issues/75609); replaces part of [#&#8203;73384](https://github.com/openclaw/openclaw/issues/73384)/[#&#8203;74483](https://github.com/openclaw/openclaw/issues/74483)) Thanks [@&#8203;100yenadmin](https://github.com/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. ([#&#8203;75578](https://github.com/openclaw/openclaw/issues/75578); replaces part of [#&#8203;73384](https://github.com/openclaw/openclaw/issues/73384)/[#&#8203;74483](https://github.com/openclaw/openclaw/issues/74483)) Thanks [@&#8203;100yenadmin](https://github.com/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. ([#&#8203;75605](https://github.com/openclaw/openclaw/issues/75605)) Thanks [@&#8203;100yenadmin](https://github.com/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 [#&#8203;46398](https://github.com/openclaw/openclaw/issues/46398); refs [#&#8203;45048](https://github.com/openclaw/openclaw/issues/45048), [#&#8203;50071](https://github.com/openclaw/openclaw/issues/50071), and [#&#8203;73744](https://github.com/openclaw/openclaw/issues/73744). Thanks [@&#8203;walterwkchoy](https://github.com/walterwkchoy), [@&#8203;AxelrodAI](https://github.com/AxelrodAI), [@&#8203;Brissux](https://github.com/Brissux), [@&#8203;vincentkoc](https://github.com/vincentkoc), and [@&#8203;BunsDev](https://github.com/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. ([#&#8203;77269](https://github.com/openclaw/openclaw/issues/77269)) Thanks [@&#8203;pumpkinxing1](https://github.com/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. ([#&#8203;45710](https://github.com/openclaw/openclaw/issues/45710)) Thanks [@&#8203;SwissArmyBud](https://github.com/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. ([#&#8203;77018](https://github.com/openclaw/openclaw/issues/77018)) Thanks [@&#8203;jesse-merhi](https://github.com/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. ([#&#8203;78278](https://github.com/openclaw/openclaw/issues/78278)) Thanks [@&#8203;obviyus](https://github.com/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`. ([#&#8203;75035](https://github.com/openclaw/openclaw/issues/75035)) Thanks [@&#8203;jesse-merhi](https://github.com/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. ([#&#8203;78047](https://github.com/openclaw/openclaw/issues/78047)) Thanks [@&#8203;joshp123](https://github.com/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. ([#&#8203;64294](https://github.com/openclaw/openclaw/issues/64294)) Thanks [@&#8203;DaevMithran](https://github.com/DaevMithran). - Control UI/exec approvals: highlight parsed shell command fragments that may deserve extra review in approval prompts. ([#&#8203;77153](https://github.com/openclaw/openclaw/issues/77153)) Thanks [@&#8203;jesse-merhi](https://github.com/jesse-merhi). - Channels/iMessage: honor `channels.imessage.groups.<chat_id>.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 [#&#8203;78285](https://github.com/openclaw/openclaw/issues/78285). ([#&#8203;79383](https://github.com/openclaw/openclaw/issues/79383)) Thanks [@&#8203;omarshahine](https://github.com/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 (`<openclawStateDir>/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 [#&#8203;78649](https://github.com/openclaw/openclaw/issues/78649). ([#&#8203;79387](https://github.com/openclaw/openclaw/issues/79387)) Thanks [@&#8203;omarshahine](https://github.com/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. ([#&#8203;79620](https://github.com/openclaw/openclaw/issues/79620)) Thanks [@&#8203;loongfay](https://github.com/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. ([#&#8203;66278](https://github.com/openclaw/openclaw/issues/66278)) Thanks [@&#8203;Lellansin](https://github.com/Lellansin). - Providers/Mistral: add `mistral-medium-3-5` to the bundled catalog with reasoning support. Thanks [@&#8203;sliekens](https://github.com/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. ([#&#8203;79857](https://github.com/openclaw/openclaw/issues/79857)) Thanks [@&#8203;jesse-merhi](https://github.com/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 [#&#8203;66786](https://github.com/openclaw/openclaw/issues/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 [@&#8203;pashpashpash](https://github.com/pashpashpash). - Channels/Weixin: bump the external Weixin catalog entry to `@tencent-weixin/openclaw-weixin@2.4.3` with the matching package integrity. ([#&#8203;81730](https://github.com/openclaw/openclaw/issues/81730)) Thanks [@&#8203;scotthuang](https://github.com/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 [#&#8203;81395](https://github.com/openclaw/openclaw/issues/81395). ([#&#8203;81783](https://github.com/openclaw/openclaw/issues/81783)) Thanks [@&#8203;joshavant](https://github.com/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 [#&#8203;81132](https://github.com/openclaw/openclaw/issues/81132). ([#&#8203;81746](https://github.com/openclaw/openclaw/issues/81746)) Thanks [@&#8203;joshavant](https://github.com/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 [#&#8203;81742](https://github.com/openclaw/openclaw/issues/81742). ([#&#8203;81758](https://github.com/openclaw/openclaw/issues/81758)) - Telegram: skip unmentioned group media before download when `requireMention` is active, avoiding failed media-download replies for messages that should be ignored. Fixes [#&#8203;81181](https://github.com/openclaw/openclaw/issues/81181). ([#&#8203;81785](https://github.com/openclaw/openclaw/issues/81785)) Thanks [@&#8203;joshavant](https://github.com/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. ([#&#8203;81474](https://github.com/openclaw/openclaw/issues/81474)) Thanks [@&#8203;samzong](https://github.com/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. ([#&#8203;63074](https://github.com/openclaw/openclaw/issues/63074)) Thanks [@&#8203;luoyanglang](https://github.com/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 [@&#8203;sallyom](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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. ([#&#8203;81669](https://github.com/openclaw/openclaw/issues/81669)) Thanks [@&#8203;sjf](https://github.com/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. ([#&#8203;81705](https://github.com/openclaw/openclaw/issues/81705)) Thanks [@&#8203;sjf](https://github.com/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. ([#&#8203;81542](https://github.com/openclaw/openclaw/issues/81542)) Thanks [@&#8203;JARVIS-Glasses](https://github.com/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 [#&#8203;79915](https://github.com/openclaw/openclaw/issues/79915). ([#&#8203;81699](https://github.com/openclaw/openclaw/issues/81699)) Thanks [@&#8203;joshavant](https://github.com/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 [#&#8203;81555](https://github.com/openclaw/openclaw/issues/81555). ([#&#8203;81716](https://github.com/openclaw/openclaw/issues/81716)) Thanks [@&#8203;joshavant](https://github.com/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 [@&#8203;pashpashpash](https://github.com/pashpashpash) and [@&#8203;vincentkoc](https://github.com/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. ([#&#8203;81586](https://github.com/openclaw/openclaw/issues/81586)) Thanks [@&#8203;pashpashpash](https://github.com/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 [@&#8203;pashpashpash](https://github.com/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 [#&#8203;50642](https://github.com/openclaw/openclaw/issues/50642). Thanks [@&#8203;BunsDev](https://github.com/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 [#&#8203;80077](https://github.com/openclaw/openclaw/issues/80077). ([#&#8203;80257](https://github.com/openclaw/openclaw/issues/80257)) Thanks [@&#8203;Jerry-Xin](https://github.com/Jerry-Xin) and [@&#8203;vincentkoc](https://github.com/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 [#&#8203;19](https://github.com/openclaw/openclaw/issues/19). ([#&#8203;79544](https://github.com/openclaw/openclaw/issues/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 [#&#8203;18](https://github.com/openclaw/openclaw/issues/18). ([#&#8203;79550](https://github.com/openclaw/openclaw/issues/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 [@&#8203;pashpashpash](https://github.com/pashpashpash). - iMessage: stop sending visible `<media:image>` placeholder text for media-only native image sends while preserving the internal echo key that prevents self-echo duplicate replies. ([#&#8203;81209](https://github.com/openclaw/openclaw/issues/81209)) Thanks [@&#8203;homer-byte](https://github.com/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 [#&#8203;81424](https://github.com/openclaw/openclaw/issues/81424). - gateway: pass Talk session scope to resolver \[AI]. ([#&#8203;81379](https://github.com/openclaw/openclaw/issues/81379)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Gateway protocol: require v4 clients and stream explicit chat `deltaText`/`replace` frames so SDK clients can consume assistant updates without local diffing. ([#&#8203;80725](https://github.com/openclaw/openclaw/issues/80725)) Thanks [@&#8203;samzong](https://github.com/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. ([#&#8203;80393](https://github.com/openclaw/openclaw/issues/80393), [#&#8203;80442](https://github.com/openclaw/openclaw/issues/80442)) Thanks [@&#8203;afunnyhy](https://github.com/afunnyhy). - Gateway: hide pending Node pairing commands, capabilities, and permissions until approval, and refresh the live approved surface when pairings change. ([#&#8203;80741](https://github.com/openclaw/openclaw/issues/80741)) Thanks [@&#8203;samzong](https://github.com/samzong). - Plugins/Feishu/WhatsApp/Line: enforce inbound media size caps while reading download streams, avoiding full buffering of oversized attachments. ([#&#8203;81044](https://github.com/openclaw/openclaw/issues/81044), [#&#8203;81050](https://github.com/openclaw/openclaw/issues/81050)) Thanks [@&#8203;samzong](https://github.com/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. ([#&#8203;76601](https://github.com/openclaw/openclaw/issues/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]. ([#&#8203;81292](https://github.com/openclaw/openclaw/issues/81292)) Thanks [@&#8203;pgondhi987](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [#&#8203;81193](https://github.com/openclaw/openclaw/issues/81193). Thanks [@&#8203;julio-arcila](https://github.com/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 [#&#8203;80381](https://github.com/openclaw/openclaw/issues/80381). ([#&#8203;81105](https://github.com/openclaw/openclaw/issues/81105)) Thanks [@&#8203;brokemac79](https://github.com/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 [#&#8203;79884](https://github.com/openclaw/openclaw/issues/79884). ([#&#8203;80390](https://github.com/openclaw/openclaw/issues/80390)) Thanks [@&#8203;brokemac79](https://github.com/brokemac79). - Anthropic: reseed Claude CLI fresh-session retries from bounded OpenClaw transcript history after session rotation, preventing conversation amnesia. Fixes [#&#8203;80905](https://github.com/openclaw/openclaw/issues/80905). ([#&#8203;80934](https://github.com/openclaw/openclaw/issues/80934)) Thanks [@&#8203;bitloi](https://github.com/bitloi). - Require explicit browser device pairing \[AI]. ([#&#8203;81289](https://github.com/openclaw/openclaw/issues/81289)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Require Control UI pairing before proxy-scoped access \[AI]. ([#&#8203;81288](https://github.com/openclaw/openclaw/issues/81288)) Thanks [@&#8203;pgondhi987](https://github.com/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]. ([#&#8203;81290](https://github.com/openclaw/openclaw/issues/81290)) Thanks [@&#8203;pgondhi987](https://github.com/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 [#&#8203;81175](https://github.com/openclaw/openclaw/issues/81175). ([#&#8203;81217](https://github.com/openclaw/openclaw/issues/81217)) Thanks [@&#8203;JARVIS-Glasses](https://github.com/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 [#&#8203;76877](https://github.com/openclaw/openclaw/issues/76877). ([#&#8203;80449](https://github.com/openclaw/openclaw/issues/80449)) Thanks [@&#8203;jimdawdy-hub](https://github.com/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. ([#&#8203;80812](https://github.com/openclaw/openclaw/issues/80812)) Thanks [@&#8203;sxxtony](https://github.com/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 [#&#8203;73565](https://github.com/openclaw/openclaw/issues/73565). Refs [#&#8203;73563](https://github.com/openclaw/openclaw/issues/73563). ([#&#8203;79645](https://github.com/openclaw/openclaw/issues/79645)) Thanks [@&#8203;Ziy1-Tan](https://github.com/Ziy1-Tan). - Channels/iMessage: ignore Apple link-preview plugin payload attachments when users paste URLs, keeping the URL text while avoiding phantom media context. ([#&#8203;79374](https://github.com/openclaw/openclaw/issues/79374)) Thanks [@&#8203;homer-byte](https://github.com/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 [#&#8203;78473](https://github.com/openclaw/openclaw/issues/78473). - fix: scan plugin runtime entries during install \[AI]. ([#&#8203;80998](https://github.com/openclaw/openclaw/issues/80998)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - fix(plugins): scan installed dependency runtime code \[AI]. ([#&#8203;81066](https://github.com/openclaw/openclaw/issues/81066)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Inherit tool restrictions for delegated sessions \[AI]. ([#&#8203;80979](https://github.com/openclaw/openclaw/issues/80979)) Thanks [@&#8203;pgondhi987](https://github.com/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. ([#&#8203;80671](https://github.com/openclaw/openclaw/issues/80671)) Thanks [@&#8203;sxxtony](https://github.com/sxxtony). - browser: enforce navigation checks for act interactions \[AI]. ([#&#8203;81070](https://github.com/openclaw/openclaw/issues/81070)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Validate node exec event provenance \[AI]. ([#&#8203;81071](https://github.com/openclaw/openclaw/issues/81071)) Thanks [@&#8203;pgondhi987](https://github.com/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 [#&#8203;80677](https://github.com/openclaw/openclaw/issues/80677). ([#&#8203;81302](https://github.com/openclaw/openclaw/issues/81302)) - Codex app-server: rotate incompatible context-engine-managed native threads so Lossless-managed sessions do not resume stale hidden Codex history. ([#&#8203;81223](https://github.com/openclaw/openclaw/issues/81223)) Thanks [@&#8203;jalehman](https://github.com/jalehman). - Codex cron: execute scheduled command-style automation payloads before workspace bootstrap or memory review, preserving existing isolated cron jobs after Codex harness migration. ([#&#8203;81510](https://github.com/openclaw/openclaw/issues/81510)) Thanks [@&#8203;jalehman](https://github.com/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. ([#&#8203;81511](https://github.com/openclaw/openclaw/issues/81511)) Thanks [@&#8203;jalehman](https://github.com/jalehman). - Gateway/OpenAI HTTP: return OpenAI-compatible 400 errors for invalid sampling params and provider validation failures instead of collapsing them to 500s. ([#&#8203;81275](https://github.com/openclaw/openclaw/issues/81275)) Thanks [@&#8203;Lellansin](https://github.com/Lellansin). - Telegram: publish plugin and skill command description localizations to native command menus while filtering unsupported locale codes and preserving Telegram command limits. ([#&#8203;81351](https://github.com/openclaw/openclaw/issues/81351)) Thanks [@&#8203;jzakirov](https://github.com/jzakirov). - Limit hook CLI tool authority \[AI]. ([#&#8203;81065](https://github.com/openclaw/openclaw/issues/81065)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Require admin scope for node device token management \[AI]. ([#&#8203;81067](https://github.com/openclaw/openclaw/issues/81067)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Restrict chat sender allowlist matching \[AI]. ([#&#8203;80898](https://github.com/openclaw/openclaw/issues/80898)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Update: suppress the false newer-config warning during restart health probing after an update handoff, while keeping future-version mutation guards intact. ([#&#8203;78652](https://github.com/openclaw/openclaw/issues/78652)) - Sessions: redact persisted tool result detail metadata before writing transcripts so diagnostic secrets do not survive tool output redaction. ([#&#8203;80444](https://github.com/openclaw/openclaw/issues/80444)) Thanks [@&#8203;nimbleenigma](https://github.com/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]. ([#&#8203;81002](https://github.com/openclaw/openclaw/issues/81002)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - fix: detect carried exec command forms \[AI]. ([#&#8203;81000](https://github.com/openclaw/openclaw/issues/81000)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Reject truncated exec approval commands \[AI]. ([#&#8203;81001](https://github.com/openclaw/openclaw/issues/81001)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Enforce inline shell wrapper payload matching \[AI]. ([#&#8203;80978](https://github.com/openclaw/openclaw/issues/80978)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - fix(node-pairing): replace changed pending requests \[AI]. ([#&#8203;80894](https://github.com/openclaw/openclaw/issues/80894)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Rate limit Google Chat webhook requests \[AI]. ([#&#8203;80974](https://github.com/openclaw/openclaw/issues/80974)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Docker: mount the auth-profile secret key directory so OAuth-backed auth profiles survive container rebuilds. ([#&#8203;80991](https://github.com/openclaw/openclaw/issues/80991)) - Onboarding: accept Codex auth profiles for canonical OpenAI model checks, avoiding false missing-auth warnings. ([#&#8203;80913](https://github.com/openclaw/openclaw/issues/80913)) Thanks [@&#8203;rubencu](https://github.com/rubencu). - fix(feishu): normalize webhook rate-limit client keys \[AI]. ([#&#8203;80975](https://github.com/openclaw/openclaw/issues/80975)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - fix(auth): prevent bootstrap pairing scope changes \[AI]. ([#&#8203;80976](https://github.com/openclaw/openclaw/issues/80976)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Validate Control UI loopback retry endpoints \[AI]. ([#&#8203;80900](https://github.com/openclaw/openclaw/issues/80900)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Harden exported markdown link rendering \[AI]. ([#&#8203;80902](https://github.com/openclaw/openclaw/issues/80902)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - fix(gateway): honor minimal discovery mode for wide-area DNS-SD \[AI]. ([#&#8203;80903](https://github.com/openclaw/openclaw/issues/80903)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - slack: enforce reaction notification policy \[AI]. ([#&#8203;80907](https://github.com/openclaw/openclaw/issues/80907)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Enforce gateway command scopes by caller context \[AI]. ([#&#8203;80891](https://github.com/openclaw/openclaw/issues/80891)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Telegram/groups: in single-account setups, treat an explicit empty `accounts.<id>.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 [#&#8203;79427](https://github.com/openclaw/openclaw/issues/79427). ([#&#8203;81030](https://github.com/openclaw/openclaw/issues/81030)) Thanks [@&#8203;kinjitakabe](https://github.com/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 [#&#8203;80814](https://github.com/openclaw/openclaw/issues/80814). Thanks [@&#8203;kinjitakabe](https://github.com/kinjitakabe). - Enforce Slack plugin approval button authorization \[AI]. ([#&#8203;80899](https://github.com/openclaw/openclaw/issues/80899)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Recognize PowerShell -ec inline commands \[AI]. ([#&#8203;80893](https://github.com/openclaw/openclaw/issues/80893)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - fix(qqbot): authorize approval button callbacks \[AI]. ([#&#8203;80892](https://github.com/openclaw/openclaw/issues/80892)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Telegram: render supported HTML tags in streamed and durable replies instead of showing literal markup. ([#&#8203;80977](https://github.com/openclaw/openclaw/issues/80977)) - Scrub streamable MCP redirect headers \[AI]. ([#&#8203;80906](https://github.com/openclaw/openclaw/issues/80906)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - fix(memory-wiki): require admin scope for ingest \[AI]. ([#&#8203;80897](https://github.com/openclaw/openclaw/issues/80897)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - memory-wiki: require write scope for Obsidian search \[AI]. ([#&#8203;80904](https://github.com/openclaw/openclaw/issues/80904)) Thanks [@&#8203;pgondhi987](https://github.com/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. ([#&#8203;80925](https://github.com/openclaw/openclaw/issues/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 [#&#8203;77628](https://github.com/openclaw/openclaw/issues/77628). ([#&#8203;78623](https://github.com/openclaw/openclaw/issues/78623)) Thanks [@&#8203;chinar-amrutkar](https://github.com/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. ([#&#8203;80917](https://github.com/openclaw/openclaw/issues/80917)) Thanks [@&#8203;dutifulbob](https://github.com/dutifulbob). - Agents/exec: skip redundant heartbeat wake-ups for subagent session exec completions, preventing spurious LLM invocations on parent sessions. Fixes [#&#8203;66748](https://github.com/openclaw/openclaw/issues/66748). ([#&#8203;66749](https://github.com/openclaw/openclaw/issues/66749)) Thanks [@&#8203;ggzeng](https://github.com/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 [#&#8203;80926](https://github.com/openclaw/openclaw/issues/80926). ([#&#8203;80927](https://github.com/openclaw/openclaw/issues/80927)) Thanks [@&#8203;galiniliev](https://github.com/galiniliev) and [@&#8203;CaptainTimon](https://github.com/CaptainTimon). - Agents: rewrite generic provider internal errors with support request IDs into user-friendly transient error copy. ([#&#8203;49401](https://github.com/openclaw/openclaw/issues/49401)) Thanks [@&#8203;y471823206](https://github.com/y471823206). - WhatsApp: finish handling pending debounced inbound messages before closing the socket. ([#&#8203;81246](https://github.com/openclaw/openclaw/issues/81246)) Thanks [@&#8203;mcaxtr](https://github.com/mcaxtr). - CLI/commitments: write `--json` output to stdout instead of diagnostic logs so automation can parse commitment list and dismiss results. ([#&#8203;81215](https://github.com/openclaw/openclaw/issues/81215)) Thanks [@&#8203;giodl73-repo](https://github.com/giodl73-repo). - Update: allow pnpm GitHub-source OpenClaw updates to approve the OpenClaw package build, so source installs complete their prepare/prepack lifecycle. ([#&#8203;81294](https://github.com/openclaw/openclaw/issues/81294)) Thanks [@&#8203;fuller-stack-dev](https://github.com/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. ([#&#8203;80977](https://github.com/openclaw/openclaw/issues/80977)) Thanks [@&#8203;obviyus](https://github.com/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 [#&#8203;81394](https://github.com/openclaw/openclaw/issues/81394). ([#&#8203;81425](https://github.com/openclaw/openclaw/issues/81425)) Thanks [@&#8203;BKF-Gitty](https://github.com/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. ([#&#8203;79426](https://github.com/openclaw/openclaw/issues/79426)) Thanks [@&#8203;legolaz8451](https://github.com/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. ([#&#8203;81697](https://github.com/openclaw/openclaw/issues/81697)) Thanks [@&#8203;mbelinky](https://github.com/mbelinky). - Control UI/WebChat: wrap long inline code tokens inside chat bubbles instead of clipping them at the bubble edge. Fixes [#&#8203;81932](https://github.com/openclaw/openclaw/issues/81932). ([#&#8203;81931](https://github.com/openclaw/openclaw/issues/81931)) Thanks [@&#8203;galiniliev](https://github.com/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 [#&#8203;77820](https://github.com/openclaw/openclaw/issues/77820). Thanks [@&#8203;KrasimirKralev](https://github.com/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 [#&#8203;70541](https://github.com/openclaw/openclaw/issues/70541). ([#&#8203;75532](https://github.com/openclaw/openclaw/issues/75532)) Thanks [@&#8203;vyctorbrzezowski](https://github.com/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 [#&#8203;62466](https://github.com/openclaw/openclaw/issues/62466). ([#&#8203;75536](https://github.com/openclaw/openclaw/issues/75536)) Thanks [@&#8203;vyctorbrzezowski](https://github.com/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. ([#&#8203;80848](https://github.com/openclaw/openclaw/issues/80848)) Thanks [@&#8203;VACInc](https://github.com/VACInc). - 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 [@&#8203;shakkernerd](https://github.com/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. ([#&#8203;78584](https://github.com/openclaw/openclaw/issues/78584)) Thanks [@&#8203;keshavbotagent](https://github.com/keshavbotagent). - Media generation: honor configured music and video generation timeouts when tool calls omit `timeoutMs`, matching image generation behavior. ([#&#8203;80687](https://github.com/openclaw/openclaw/issues/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 [#&#8203;80689](https://github.com/openclaw/openclaw/issues/80689). Thanks [@&#8203;BKF-Gitty](https://github.com/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. ([#&#8203;77412](https://github.com/openclaw/openclaw/issues/77412)) Thanks [@&#8203;TheCrazyLex](https://github.com/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 [#&#8203;60274](https://github.com/openclaw/openclaw/issues/60274); refs [#&#8203;39031](https://github.com/openclaw/openclaw/issues/39031) and [#&#8203;39322](https://github.com/openclaw/openclaw/issues/39322). Thanks [@&#8203;hyperclaw](https://github.com/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 [@&#8203;BunsDev](https://github.com/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 [@&#8203;chinar-amrutkar](https://github.com/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 [#&#8203;57790](https://github.com/openclaw/openclaw/issues/57790). Thanks [@&#8203;pandadev66](https://github.com/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 [#&#8203;75379](https://github.com/openclaw/openclaw/issues/75379). ([#&#8203;75381](https://github.com/openclaw/openclaw/issues/75381)) Thanks [@&#8203;udaymanish6](https://github.com/udaymanish6). - Matrix: default outbound markdown tables to bullet lists instead of fenced code blocks. Fixes [#&#8203;78990](https://github.com/openclaw/openclaw/issues/78990). ([#&#8203;80890](https://github.com/openclaw/openclaw/issues/80890)) Thanks [@&#8203;kinjitakabe](https://github.com/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. ([#&#8203;74778](https://github.com/openclaw/openclaw/issues/74778)) Refs [#&#8203;74242](https://github.com/openclaw/openclaw/issues/74242). Thanks [@&#8203;fuller-stack-dev](https://github.com/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 [#&#8203;74589](https://github.com/openclaw/openclaw/issues/74589). Thanks [@&#8203;neeravmakwana](https://github.com/neeravmakwana) and [@&#8203;DerekEXS](https://github.com/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 [#&#8203;77841](https://github.com/openclaw/openclaw/issues/77841). Thanks [@&#8203;trialanderrorstudios](https://github.com/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. ([#&#8203;80663](https://github.com/openclaw/openclaw/issues/80663)) Thanks [@&#8203;jalehman](https://github.com/jalehman). - Memory/search: load the platform-specific `sqlite-vec-<platform>-<arch>` 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 [#&#8203;77838](https://github.com/openclaw/openclaw/issues/77838). Thanks [@&#8203;corevibe555](https://github.com/corevibe555) and [@&#8203;Simon2256928](https://github.com/Simon2256928). - Cron: keep long manual cron runs active in the task registry until completion, preventing transient `lost` markers before durable recovery reconciles. Fixes [#&#8203;78233](https://github.com/openclaw/openclaw/issues/78233). ([#&#8203;78243](https://github.com/openclaw/openclaw/issues/78243)) Thanks [@&#8203;Feelw00](https://github.com/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 [#&#8203;78063](https://github.com/openclaw/openclaw/issues/78063). ([#&#8203;78095](https://github.com/openclaw/openclaw/issues/78095)) Thanks [@&#8203;tmimmanuel](https://github.com/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. ([#&#8203;68341](https://github.com/openclaw/openclaw/issues/68341)) Thanks [@&#8203;thesomewhatyou](https://github.com/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 [#&#8203;73900](https://github.com/openclaw/openclaw/issues/73900). Thanks [@&#8203;richardmqq](https://github.com/richardmqq). - Telegram: honor forced document delivery for video media so `--force-document` sends MP4s as documents instead of typed videos. Fixes [#&#8203;80389](https://github.com/openclaw/openclaw/issues/80389). ([#&#8203;80405](https://github.com/openclaw/openclaw/issues/80405)) Thanks [@&#8203;jbetala7](https://github.com/jbetala7). - Gateway: clear speculative node wake state when APNs registration is missing, preventing unregistered or mistyped node IDs from retaining wake throttle entries. Fixes [#&#8203;68847](https://github.com/openclaw/openclaw/issues/68847). ([#&#8203;68848](https://github.com/openclaw/openclaw/issues/68848)) Thanks [@&#8203;Feelw00](https://github.com/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 [#&#8203;68838](https://github.com/openclaw/openclaw/issues/68838). ([#&#8203;68839](https://github.com/openclaw/openclaw/issues/68839)) Thanks [@&#8203;Feelw00](https://github.com/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 [#&#8203;80591](https://github.com/openclaw/openclaw/issues/80591). Thanks [@&#8203;wei-wei-zhao](https://github.com/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 [#&#8203;73691](https://github.com/openclaw/openclaw/issues/73691). ([#&#8203;74088](https://github.com/openclaw/openclaw/issues/74088)) Thanks [@&#8203;YB0y](https://github.com/YB0y). - Telegram: show resolved thinking defaults in native `/status` and `/think` menus while preserving explicit session overrides. ([#&#8203;80341](https://github.com/openclaw/openclaw/issues/80341)) Thanks [@&#8203;VACInc](https://github.com/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. ([#&#8203;80333](https://github.com/openclaw/openclaw/issues/80333)) Thanks [@&#8203;samzong](https://github.com/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. ([#&#8203;79877](https://github.com/openclaw/openclaw/issues/79877)) Thanks [@&#8203;jeffjhunter](https://github.com/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 [#&#8203;51264](https://github.com/openclaw/openclaw/issues/51264). ([#&#8203;79474](https://github.com/openclaw/openclaw/issues/79474)) Thanks [@&#8203;samzong](https://github.com/samzong). - Gateway: share serialized streaming event envelopes across eligible WebSocket and node subscribers while preserving per-client sequence numbers. ([#&#8203;80299](https://github.com/openclaw/openclaw/issues/80299)) Thanks [@&#8203;samzong](https://github.com/samzong). - Gateway: consolidate duplicate `openclaw doctor` service config panels while preserving the declined-repair `--force` hint. Fixes [#&#8203;80287](https://github.com/openclaw/openclaw/issues/80287). ([#&#8203;78688](https://github.com/openclaw/openclaw/issues/78688)) Thanks [@&#8203;YB0y](https://github.com/YB0y). - Browser: report Chrome MCP existing-session page readiness in browser status without letting status probes exceed the client timeout. Fixes [#&#8203;80268](https://github.com/openclaw/openclaw/issues/80268). ([#&#8203;80280](https://github.com/openclaw/openclaw/issues/80280)) Thanks [@&#8203;ai-hpc](https://github.com/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 [#&#8203;75736](https://github.com/openclaw/openclaw/issues/75736); mitigates [#&#8203;77443](https://github.com/openclaw/openclaw/issues/77443). Thanks [@&#8203;dataCenter430](https://github.com/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 [#&#8203;77443](https://github.com/openclaw/openclaw/issues/77443). Thanks [@&#8203;dataCenter430](https://github.com/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 [#&#8203;73664](https://github.com/openclaw/openclaw/issues/73664). ([#&#8203;74057](https://github.com/openclaw/openclaw/issues/74057)) Thanks [@&#8203;brokemac79](https://github.com/brokemac79). - Memory: reject symlinked directory components in configured extra memory paths before reading Markdown files. ([#&#8203;80331](https://github.com/openclaw/openclaw/issues/80331)) Thanks [@&#8203;samzong](https://github.com/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 [#&#8203;54296](https://github.com/openclaw/openclaw/issues/54296). Thanks [@&#8203;jack-stormentswe](https://github.com/jack-stormentswe). - Browser/CDP: filter browser-internal targets from raw CDP and persistent Playwright tab selection so navigation opens real page tabs. Fixes [#&#8203;55734](https://github.com/openclaw/openclaw/issues/55734). Thanks [@&#8203;Demine4](https://github.com/Demine4). - WhatsApp: apply hot-reloaded `dmPolicy` and `allowFrom` settings to the active Web listener before processing new inbound DMs. Fixes [#&#8203;80538](https://github.com/openclaw/openclaw/issues/80538). Thanks [@&#8203;Ampaskopi129](https://github.com/Ampaskopi129). - Plugins: let `openclaw doctor --fix` repair managed plugin installs whose package entrypoints fail package-directory boundary validation after local state moves. Fixes [#&#8203;80592](https://github.com/openclaw/openclaw/issues/80592). Thanks [@&#8203;wei-wei-zhao](https://github.com/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 [#&#8203;80540](https://github.com/openclaw/openclaw/issues/80540). Thanks [@&#8203;patrickmch](https://github.com/patrickmch). - Control UI: preserve the composer draft when Stop is tapped during an active chat run, preventing accidental prompt loss on mobile. Fixes [#&#8203;80586](https://github.com/openclaw/openclaw/issues/80586). Thanks [@&#8203;KCALLC](https://github.com/KCALLC). - Infra/retry: keep jittered retry delays at or above server-supplied Retry-After lower bounds when the hint can be honored. Fixes [#&#8203;68541](https://github.com/openclaw/openclaw/issues/68541). ([#&#8203;68543](https://github.com/openclaw/openclaw/issues/68543)) Thanks [@&#8203;Feelw00](https://github.com/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 [#&#8203;80562](https://github.com/openclaw/openclaw/issues/80562). Thanks [@&#8203;gaodaabao](https://github.com/gaodaabao). - Redact persisted secret-shaped payloads \[AI]. ([#&#8203;79006](https://github.com/openclaw/openclaw/issues/79006)) Thanks [@&#8203;pgondhi987](https://github.com/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 [#&#8203;80363](https://github.com/openclaw/openclaw/issues/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 [#&#8203;79953](https://github.com/openclaw/openclaw/issues/79953). Thanks [@&#8203;lovelefeng-glitch](https://github.com/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. ([#&#8203;62742](https://github.com/openclaw/openclaw/issues/62742)) Thanks [@&#8203;oliviareid-svg](https://github.com/oliviareid-svg). - fix(matrix): gate name-based allowlist resolution \[AI]. ([#&#8203;79007](https://github.com/openclaw/openclaw/issues/79007)) Thanks [@&#8203;pgondhi987](https://github.com/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 [#&#8203;79338](https://github.com/openclaw/openclaw/issues/79338). Thanks [@&#8203;sxxtony](https://github.com/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. ([#&#8203;71961](https://github.com/openclaw/openclaw/issues/71961)) Thanks [@&#8203;rubencu](https://github.com/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. ([#&#8203;80567](https://github.com/openclaw/openclaw/issues/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. ([#&#8203;52200](https://github.com/openclaw/openclaw/issues/52200)) Thanks [@&#8203;chienchandler](https://github.com/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 [#&#8203;79953](https://github.com/openclaw/openclaw/issues/79953). Thanks [@&#8203;lovelefeng-glitch](https://github.com/lovelefeng-glitch). - Memory: skip managed dreaming cron reconciliation warnings for ordinary cron and heartbeat hook contexts that cannot manage Gateway cron. ([#&#8203;77027](https://github.com/openclaw/openclaw/issues/77027)) Thanks [@&#8203;rubencu](https://github.com/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 `<turn_aborted>` 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. ([#&#8203;79814](https://github.com/openclaw/openclaw/issues/79814)) Thanks [@&#8203;loongfay](https://github.com/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 [#&#8203;72885](https://github.com/openclaw/openclaw/issues/72885). ([#&#8203;71898](https://github.com/openclaw/openclaw/issues/71898), [#&#8203;72886](https://github.com/openclaw/openclaw/issues/72886)) Thanks [@&#8203;rubencu](https://github.com/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 [#&#8203;80503](https://github.com/openclaw/openclaw/issues/80503). Thanks [@&#8203;Kaspre](https://github.com/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 [#&#8203;80562](https://github.com/openclaw/openclaw/issues/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 [#&#8203;78804](https://github.com/openclaw/openclaw/issues/78804). Thanks [@&#8203;Gomesy72](https://github.com/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 [#&#8203;77406](https://github.com/openclaw/openclaw/issues/77406), [#&#8203;77427](https://github.com/openclaw/openclaw/issues/77427). Thanks [@&#8203;stainlu](https://github.com/stainlu) and [@&#8203;brokemac79](https://github.com/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 [#&#8203;77360](https://github.com/openclaw/openclaw/issues/77360). Thanks [@&#8203;srb11e](https://github.com/srb11e). - Gateway: avoid synchronous restart-sentinel state probes during post-attach startup, preventing slow Windows or redirected state directories from blocking channel turns. Fixes [#&#8203;79264](https://github.com/openclaw/openclaw/issues/79264). Thanks [@&#8203;liyi58](https://github.com/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 [@&#8203;mcaxtr](https://github.com/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 [#&#8203;79341](https://github.com/openclaw/openclaw/issues/79341). Thanks [@&#8203;haumanto](https://github.com/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 [#&#8203;80462](https://github.com/openclaw/openclaw/issues/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 [#&#8203;74069](https://github.com/openclaw/openclaw/issues/74069); [#&#8203;80480](https://github.com/openclaw/openclaw/issues/80480). Thanks [@&#8203;Kaspre](https://github.com/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 [#&#8203;77802](https://github.com/openclaw/openclaw/issues/77802). Thanks [@&#8203;Kaspre](https://github.com/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 [@&#8203;frankekn](https://github.com/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 [#&#8203;71670](https://github.com/openclaw/openclaw/issues/71670). ([#&#8203;71787](https://github.com/openclaw/openclaw/issues/71787)) Thanks [@&#8203;rubencu](https://github.com/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 [#&#8203;79349](https://github.com/openclaw/openclaw/issues/79349). Thanks [@&#8203;arlen8411](https://github.com/arlen8411). - Doctor: stop flagging the live compatibility agent directory as orphaned when the configured default agent is not `main`. Fixes [#&#8203;74313](https://github.com/openclaw/openclaw/issues/74313). ([#&#8203;74438](https://github.com/openclaw/openclaw/issues/74438)) Thanks [@&#8203;carlos4s](https://github.com/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 [#&#8203;80129](https://github.com/openclaw/openclaw/issues/80129). Thanks [@&#8203;Caulderein](https://github.com/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. ([#&#8203;80217](https://github.com/openclaw/openclaw/issues/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 [@&#8203;pashpashpash](https://github.com/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. ([#&#8203;80372](https://github.com/openclaw/openclaw/issues/80372)) Thanks [@&#8203;VACInc](https://github.com/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 [#&#8203;77251](https://github.com/openclaw/openclaw/issues/77251). ([#&#8203;77365](https://github.com/openclaw/openclaw/issues/77365)) Thanks [@&#8203;funmerlin](https://github.com/funmerlin). - Telegram: preserve blank lines between manually indented bullet blocks and following numbered sections in rendered replies. Fixes [#&#8203;76998](https://github.com/openclaw/openclaw/issues/76998). Thanks [@&#8203;evgyur](https://github.com/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 [#&#8203;39497](https://github.com/openclaw/openclaw/issues/39497). Thanks [@&#8203;stainlu](https://github.com/stainlu) and [@&#8203;teosborne](https://github.com/teosborne). - Slack: pass configured agent identity through draft preview sends so partial streaming replies keep custom username/avatar on the initial Slack message. Fixes [#&#8203;38235](https://github.com/openclaw/openclaw/issues/38235). ([#&#8203;38237](https://github.com/openclaw/openclaw/issues/38237)) Thanks [@&#8203;lacymorrow](https://github.com/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 [#&#8203;43587](https://github.com/openclaw/openclaw/issues/43587). ([#&#8203;43588](https://github.com/openclaw/openclaw/issues/43588)) Thanks [@&#8203;raw34](https://github.com/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 [#&#8203;50129](https://github.com/openclaw/openclaw/issues/50129). ([#&#8203;50200](https://github.com/openclaw/openclaw/issues/50200)) Thanks [@&#8203;smartchainark](https://github.com/smartchainark). - Slack: add scoped message-tool formatting hints so agents use Markdown for plain sends and direct mrkdwn for Block Kit fields. Fixes [#&#8203;34609](https://github.com/openclaw/openclaw/issues/34609). ([#&#8203;50979](https://github.com/openclaw/openclaw/issues/50979)) Thanks [@&#8203;carrotRakko](https://github.com/carrotRakko). - Slack: describe `download-file` file ids separately from message timestamps and return a targeted recovery error when agents pass `messageId` instead of `fileId`. ([#&#8203;74155](https://github.com/openclaw/openclaw/issues/74155)) Thanks [@&#8203;jarvis-ai-gregmoser](https://github.com/jarvis-ai-gregmoser). - Slack: retain processed room messages for `requireMention=false` channels so always-on Slack rooms keep recent conversation context between turns. ([#&#8203;38658](https://github.com/openclaw/openclaw/issues/38658)) Thanks [@&#8203;syedamaann](https://github.com/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. ([#&#8203;78220](https://github.com/openclaw/openclaw/issues/78220)) Thanks [@&#8203;kazamak](https://github.com/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. ([#&#8203;73085](https://github.com/openclaw/openclaw/issues/73085)) Thanks [@&#8203;clawSean](https://github.com/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`. ([#&#8203;73101](https://github.com/openclaw/openclaw/issues/73101)) Thanks [@&#8203;Raasl](https://github.com/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. ([#&#8203;75630](https://github.com/openclaw/openclaw/issues/75630)) Thanks [@&#8203;soichiyo](https://github.com/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 [#&#8203;79807](https://github.com/openclaw/openclaw/issues/79807). Thanks [@&#8203;vexclawx31](https://github.com/vexclawx31). - Slack: prefer full rich-text block content over truncated socket-mode message previews so long inbound Slack messages reach agents intact. Fixes [#&#8203;79027](https://github.com/openclaw/openclaw/issues/79027). Thanks [@&#8203;BobAccentWebDev](https://github.com/BobAccentWebDev). - Slack: include structured Slack API error details in setup, probe, streaming, and reply logs while preserving token redaction. ([#&#8203;53966](https://github.com/openclaw/openclaw/issues/53966)) Thanks [@&#8203;deucemask](https://github.com/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 [#&#8203;80156](https://github.com/openclaw/openclaw/issues/80156). Thanks [@&#8203;markus-lassfolk](https://github.com/markus-lassfolk). - System events: dedupe keyed events across the queue while preserving unkeyed, delivery-route, and trust-boundary event identity. ([#&#8203;73040](https://github.com/openclaw/openclaw/issues/73040)) Thanks [@&#8203;statxc](https://github.com/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 [#&#8203;79596](https://github.com/openclaw/openclaw/issues/79596). Thanks [@&#8203;bzelones](https://github.com/bzelones). - Gateway/status: surface model-pricing bootstrap and refresh failures as degraded health/status warnings while keeping Gateway liveness healthy. Fixes [#&#8203;79599](https://github.com/openclaw/openclaw/issues/79599). Thanks [@&#8203;bzelones](https://github.com/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 [#&#8203;46637](https://github.com/openclaw/openclaw/issues/46637). Thanks [@&#8203;zipzagster](https://github.com/zipzagster) and [@&#8203;lexhoefsloot](https://github.com/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 [#&#8203;79428](https://github.com/openclaw/openclaw/issues/79428). ([#&#8203;79911](https://github.com/openclaw/openclaw/issues/79911)) Thanks [@&#8203;Jefsky](https://github.com/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 [#&#8203;50374](https://github.com/openclaw/openclaw/issues/50374). Thanks [@&#8203;choutos](https://github.com/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 [#&#8203;67288](https://github.com/openclaw/openclaw/issues/67288). Thanks [@&#8203;kanekoh](https://github.com/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 [#&#8203;62267](https://github.com/openclaw/openclaw/issues/62267). Thanks [@&#8203;BenSHPD](https://github.com/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 [#&#8203;79350](https://github.com/openclaw/openclaw/issues/79350). Thanks [@&#8203;geek111](https://github.com/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 [#&#8203;79506](https://github.com/openclaw/openclaw/issues/79506). Thanks [@&#8203;donkeykong91](https://github.com/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 [#&#8203;80128](https://github.com/openclaw/openclaw/issues/80128). Thanks [@&#8203;jeffjhunterai](https://github.com/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 [#&#8203;79947](https://github.com/openclaw/openclaw/issues/79947). Thanks [@&#8203;TheLevti](https://github.com/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 [@&#8203;keshavbotagent](https://github.com/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 [#&#8203;80078](https://github.com/openclaw/openclaw/issues/80078). Thanks [@&#8203;takamasa-aiso](https://github.com/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 [#&#8203;78307](https://github.com/openclaw/openclaw/issues/78307). Thanks [@&#8203;BunsDev](https://github.com/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 [#&#8203;79675](https://github.com/openclaw/openclaw/issues/79675). Thanks [@&#8203;lovelefeng-glitch](https://github.com/lovelefeng-glitch), [@&#8203;BunsDev](https://github.com/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 [#&#8203;78504](https://github.com/openclaw/openclaw/issues/78504). Thanks [@&#8203;BunsDev](https://github.com/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. ([#&#8203;78329](https://github.com/openclaw/openclaw/issues/78329)) Thanks [@&#8203;samzong](https://github.com/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 [#&#8203;79292](https://github.com/openclaw/openclaw/issues/79292). Thanks [@&#8203;BunsDev](https://github.com/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. ([#&#8203;80539](https://github.com/openclaw/openclaw/issues/80539)) Thanks [@&#8203;rubencu](https://github.com/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 [#&#8203;80087](https://github.com/openclaw/openclaw/issues/80087). ([#&#8203;80134](https://github.com/openclaw/openclaw/issues/80134)) Thanks [@&#8203;hclsys](https://github.com/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 [#&#8203;78533](https://github.com/openclaw/openclaw/issues/78533) and [#&#8203;78570](https://github.com/openclaw/openclaw/issues/78570). Thanks [@&#8203;superck110](https://github.com/superck110) and [@&#8203;Azmodump](https://github.com/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 [#&#8203;53961](https://github.com/openclaw/openclaw/issues/53961) and [#&#8203;57755](https://github.com/openclaw/openclaw/issues/57755). Thanks [@&#8203;Kaspre](https://github.com/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 [#&#8203;80019](https://github.com/openclaw/openclaw/issues/80019). Thanks [@&#8203;hclsys](https://github.com/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 [#&#8203;74803](https://github.com/openclaw/openclaw/issues/74803). Thanks [@&#8203;jeffsteinbok-openclaw](https://github.com/jeffsteinbok-openclaw) and [@&#8203;dgkim311](https://github.com/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 [#&#8203;80109](https://github.com/openclaw/openclaw/issues/80109). ([#&#8203;80123](https://github.com/openclaw/openclaw/issues/80123)) Thanks [@&#8203;kagura-agent](https://github.com/kagura-agent). - CLI/config: persist explicit `config set` and `config patch` values that equal runtime defaults instead of reporting success while dropping them. Fixes [#&#8203;79856](https://github.com/openclaw/openclaw/issues/79856). ([#&#8203;80106](https://github.com/openclaw/openclaw/issues/80106)) Thanks [@&#8203;abodanty](https://github.com/abodanty) and [@&#8203;hclsys](https://github.com/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. ([#&#8203;72439](https://github.com/openclaw/openclaw/issues/72439)) Thanks [@&#8203;rubencu](https://github.com/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 [#&#8203;80072](https://github.com/openclaw/openclaw/issues/80072). Thanks [@&#8203;CodeNovice2017](https://github.com/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. ([#&#8203;42131](https://github.com/openclaw/openclaw/issues/42131)) Thanks [@&#8203;hkochar](https://github.com/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 [#&#8203;78188](https://github.com/openclaw/openclaw/issues/78188). ([#&#8203;78228](https://github.com/openclaw/openclaw/issues/78228)) Thanks [@&#8203;Beandon13](https://github.com/Beandon13). - Telegram: handle managed select button callbacks before the raw callback fallback while preserving delimiter-containing option values such as `env|prod`. ([#&#8203;79816](https://github.com/openclaw/openclaw/issues/79816)) Thanks [@&#8203;moeedahmed](https://github.com/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 [#&#8203;77870](https://github.com/openclaw/openclaw/issues/77870). - Discord/models: defer model picker component interactions before loading route, model, and preference data, preventing "This interaction failed" timeouts under gateway load. Fixes [#&#8203;77283](https://github.com/openclaw/openclaw/issues/77283). Thanks [@&#8203;colin-chang](https://github.com/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 [#&#8203;79210](https://github.com/openclaw/openclaw/issues/79210). Thanks [@&#8203;colinmcintosh](https://github.com/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 [#&#8203;78000](https://github.com/openclaw/openclaw/issues/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 [#&#8203;79446](https://github.com/openclaw/openclaw/issues/79446). Thanks [@&#8203;TurboTheTurtle](https://github.com/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 [#&#8203;47452](https://github.com/openclaw/openclaw/issues/47452). - Kimi: keep Anthropic-compatible thinking streams valid by supplying required thinking budgets and enough output room for hidden reasoning plus final text. ([#&#8203;80481](https://github.com/openclaw/openclaw/issues/80481)) Thanks [@&#8203;InTheCloudDan](https://github.com/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. ([#&#8203;77473](https://github.com/openclaw/openclaw/issues/77473)) Thanks [@&#8203;rubencu](https://github.com/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. ([#&#8203;76306](https://github.com/openclaw/openclaw/issues/76306)) Thanks [@&#8203;rubencu](https://github.com/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. ([#&#8203;76943](https://github.com/openclaw/openclaw/issues/76943)) Thanks [@&#8203;rubencu](https://github.com/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 [#&#8203;60497](https://github.com/openclaw/openclaw/issues/60497). ([#&#8203;80003](https://github.com/openclaw/openclaw/issues/80003)) Thanks [@&#8203;jbetala7](https://github.com/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 [#&#8203;79795](https://github.com/openclaw/openclaw/issues/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 [#&#8203;34129](https://github.com/openclaw/openclaw/issues/34129). ([#&#8203;56391](https://github.com/openclaw/openclaw/issues/56391)) Thanks [@&#8203;smartchainark](https://github.com/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 [#&#8203;79621](https://github.com/openclaw/openclaw/issues/79621) and [#&#8203;79986](https://github.com/openclaw/openclaw/issues/79986). Thanks [@&#8203;nonzeroclaw](https://github.com/nonzeroclaw) and [@&#8203;dudaefj](https://github.com/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 [#&#8203;80000](https://github.com/openclaw/openclaw/issues/80000). ([#&#8203;80009](https://github.com/openclaw/openclaw/issues/80009)) Thanks [@&#8203;TurboTheTurtle](https://github.com/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 [#&#8203;74284](https://github.com/openclaw/openclaw/issues/74284). Thanks [@&#8203;brtkwr](https://github.com/brtkwr) and [@&#8203;bitloi](https://github.com/bitloi). - CLI/agent: let `openclaw agent --model` use the backend/admin Gateway scope without cached device-token scopes silently downscoping the request. ([#&#8203;78837](https://github.com/openclaw/openclaw/issues/78837)) Thanks [@&#8203;VACInc](https://github.com/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. ([#&#8203;79926](https://github.com/openclaw/openclaw/issues/79926)) Thanks [@&#8203;InTheCloudDan](https://github.com/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 [#&#8203;79485](https://github.com/openclaw/openclaw/issues/79485). Thanks [@&#8203;rendrag-git](https://github.com/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. ([#&#8203;70805](https://github.com/openclaw/openclaw/issues/70805)) Thanks [@&#8203;rubencu](https://github.com/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 [#&#8203;79978](https://github.com/openclaw/openclaw/issues/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 [#&#8203;79946](https://github.com/openclaw/openclaw/issues/79946), [#&#8203;80074](https://github.com/openclaw/openclaw/issues/80074). Thanks [@&#8203;TurboTheTurtle](https://github.com/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 [#&#8203;79369](https://github.com/openclaw/openclaw/issues/79369). Thanks [@&#8203;Kaspre](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [#&#8203;74903](https://github.com/openclaw/openclaw/issues/74903). ([#&#8203;77151](https://github.com/openclaw/openclaw/issues/77151)) Thanks [@&#8203;ai-hpc](https://github.com/ai-hpc). - WhatsApp: pass routing context into voice-note transcript echo preflight so echoed transcripts can deliver to the originating chat. Fixes [#&#8203;79778](https://github.com/openclaw/openclaw/issues/79778). ([#&#8203;79788](https://github.com/openclaw/openclaw/issues/79788)) Thanks [@&#8203;hclsys](https://github.com/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. ([#&#8203;45594](https://github.com/openclaw/openclaw/issues/45594)) Thanks [@&#8203;clovericbot](https://github.com/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 [#&#8203;79676](https://github.com/openclaw/openclaw/issues/79676) and [#&#8203;61502](https://github.com/openclaw/openclaw/issues/61502). ([#&#8203;79836](https://github.com/openclaw/openclaw/issues/79836)) Thanks [@&#8203;velvet-shark](https://github.com/velvet-shark), [@&#8203;tianxiaochannel-oss88](https://github.com/tianxiaochannel-oss88), and [@&#8203;Saicheg](https://github.com/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 [#&#8203;78946](https://github.com/openclaw/openclaw/issues/78946). ([#&#8203;79120](https://github.com/openclaw/openclaw/issues/79120)) Thanks [@&#8203;brokemac79](https://github.com/brokemac79) and [@&#8203;papawattu](https://github.com/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": {} }`. ([#&#8203;79885](https://github.com/openclaw/openclaw/issues/79885)) Thanks [@&#8203;omarshahine](https://github.com/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. ([#&#8203;79864](https://github.com/openclaw/openclaw/issues/79864)) Thanks [@&#8203;omarshahine](https://github.com/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. ([#&#8203;80045](https://github.com/openclaw/openclaw/issues/80045)) Thanks [@&#8203;TurboTheTurtle](https://github.com/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 [#&#8203;66766](https://github.com/openclaw/openclaw/issues/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 [#&#8203;62317](https://github.com/openclaw/openclaw/issues/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 [#&#8203;79325](https://github.com/openclaw/openclaw/issues/79325). - Models/config: explain missing `models.providers.<provider>.models[]` registration when a model exists only in `agents.defaults.models`, instead of returning a bare unknown-model error. Fixes [#&#8203;80089](https://github.com/openclaw/openclaw/issues/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 [#&#8203;79179](https://github.com/openclaw/openclaw/issues/79179). - Models/OpenRouter: treat `403 API key budget limit exceeded` as billing so model fallback advances instead of retrying the exhausted primary. Fixes [#&#8203;60191](https://github.com/openclaw/openclaw/issues/60191). Thanks [@&#8203;omgitsgela](https://github.com/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 [#&#8203;78161](https://github.com/openclaw/openclaw/issues/78161). Thanks [@&#8203;hjamal7-bit](https://github.com/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 [#&#8203;67792](https://github.com/openclaw/openclaw/issues/67792). ([#&#8203;72752](https://github.com/openclaw/openclaw/issues/72752)) Thanks [@&#8203;iot2edge](https://github.com/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 [#&#8203;64175](https://github.com/openclaw/openclaw/issues/64175). Thanks [@&#8203;Catfish-75](https://github.com/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 [#&#8203;14601](https://github.com/openclaw/openclaw/issues/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 [#&#8203;58106](https://github.com/openclaw/openclaw/issues/58106). Thanks [@&#8203;ThalynLabs](https://github.com/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 [#&#8203;79381](https://github.com/openclaw/openclaw/issues/79381). Thanks [@&#8203;ismael-81](https://github.com/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 [#&#8203;80118](https://github.com/openclaw/openclaw/issues/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 [#&#8203;73876](https://github.com/openclaw/openclaw/issues/73876). ([#&#8203;74946](https://github.com/openclaw/openclaw/issues/74946)) Thanks [@&#8203;jeffrey701](https://github.com/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 [#&#8203;79965](https://github.com/openclaw/openclaw/issues/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 [#&#8203;38817](https://github.com/openclaw/openclaw/issues/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 [#&#8203;79608](https://github.com/openclaw/openclaw/issues/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. ([#&#8203;80035](https://github.com/openclaw/openclaw/issues/80035)) Thanks [@&#8203;omarshahine](https://github.com/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 [#&#8203;80124](https://github.com/openclaw/openclaw/issues/80124). ([#&#8203;80137](https://github.com/openclaw/openclaw/issues/80137)) Thanks [@&#8203;kagura-agent](https://github.com/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. ([#&#8203;80239](https://github.com/openclaw/openclaw/issues/80239)) Thanks [@&#8203;samzong](https://github.com/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. ([#&#8203;77026](https://github.com/openclaw/openclaw/issues/77026)) Thanks [@&#8203;rubencu](https://github.com/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 [#&#8203;60672](https://github.com/openclaw/openclaw/issues/60672). ([#&#8203;60678](https://github.com/openclaw/openclaw/issues/60678)) Thanks [@&#8203;KChow-ctrl](https://github.com/KChow-ctrl). - Agents: abort generic repeated no-progress tool loops at the critical threshold when identical calls keep returning identical outcomes. ([#&#8203;80668](https://github.com/openclaw/openclaw/issues/80668)) Thanks [@&#8203;frankekn](https://github.com/frankekn). - Exec approvals: omit generated command highlights for non-POSIX Windows and shell-wrapper approval commands until those command languages have native highlighting support. ([#&#8203;80566](https://github.com/openclaw/openclaw/issues/80566)) Thanks [@&#8203;jesse-merhi](https://github.com/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. ([#&#8203;80294](https://github.com/openclaw/openclaw/issues/80294)) Thanks [@&#8203;jalehman](https://github.com/jalehman). - Plugin SDK/Windows: enable the native require fast path for root `openclaw/plugin-sdk` dist aliases instead of forcing Jiti transforms. ([#&#8203;80878](https://github.com/openclaw/openclaw/issues/80878)) Thanks [@&#8203;medns](https://github.com/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 [@&#8203;joshp123](https://github.com/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 [#&#8203;78935](https://github.com/openclaw/openclaw/issues/78935). ([#&#8203;79657](https://github.com/openclaw/openclaw/issues/79657)) Thanks [@&#8203;joshavant](https://github.com/joshavant). - fix(discord): gate user allowlist name resolution \[AI]. ([#&#8203;79002](https://github.com/openclaw/openclaw/issues/79002)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - fix(msteams): gate startup user allowlist resolution \[AI]. ([#&#8203;79003](https://github.com/openclaw/openclaw/issues/79003)) Thanks [@&#8203;pgondhi987](https://github.com/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 [#&#8203;79195](https://github.com/openclaw/openclaw/issues/79195). Thanks [@&#8203;pandadev66](https://github.com/pandadev66). - Harden macOS shell wrapper allowlist parsing \[AI]. ([#&#8203;78518](https://github.com/openclaw/openclaw/issues/78518)) Thanks [@&#8203;pgondhi987](https://github.com/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 [#&#8203;64973](https://github.com/openclaw/openclaw/issues/64973) and [#&#8203;74890](https://github.com/openclaw/openclaw/issues/74890). Thanks [@&#8203;BunsDev](https://github.com/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 [#&#8203;79232](https://github.com/openclaw/openclaw/issues/79232). Thanks [@&#8203;BunsDev](https://github.com/BunsDev) and [@&#8203;TurboTheTurtle](https://github.com/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 [#&#8203;77934](https://github.com/openclaw/openclaw/issues/77934). Thanks [@&#8203;bmoran1022](https://github.com/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 [#&#8203;77428](https://github.com/openclaw/openclaw/issues/77428). Thanks [@&#8203;ramitrkar-hash](https://github.com/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. ([#&#8203;78412](https://github.com/openclaw/openclaw/issues/78412)) Thanks [@&#8203;wdeveloper16](https://github.com/wdeveloper16). - CLI/status: keep lean `openclaw status --json` off manifest-backed channel discovery so configured-channel checks do not repeatedly rescan plugin metadata. Fixes [#&#8203;79129](https://github.com/openclaw/openclaw/issues/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 [#&#8203;57241](https://github.com/openclaw/openclaw/issues/57241). Thanks [@&#8203;RenzoMXD](https://github.com/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 [@&#8203;BunsDev](https://github.com/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`. ([#&#8203;78940](https://github.com/openclaw/openclaw/issues/78940)) Thanks [@&#8203;ai-hpc](https://github.com/ai-hpc). - CLI/infer: allow explicit local `infer model run --model <provider/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 [#&#8203;67478](https://github.com/openclaw/openclaw/issues/67478) and [#&#8203;67509](https://github.com/openclaw/openclaw/issues/67509). Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [#&#8203;78929](https://github.com/openclaw/openclaw/issues/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 [#&#8203;79091](https://github.com/openclaw/openclaw/issues/79091). Thanks [@&#8203;RamaAditya49](https://github.com/RamaAditya49) and [@&#8203;sallyom](https://github.com/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. ([#&#8203;79668](https://github.com/openclaw/openclaw/issues/79668)) Thanks [@&#8203;joshavant](https://github.com/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. ([#&#8203;79143](https://github.com/openclaw/openclaw/issues/79143)) Thanks [@&#8203;BKF-Gitty](https://github.com/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 [#&#8203;78180](https://github.com/openclaw/openclaw/issues/78180). - Gateway/auth: make explicit `trusted-proxy` mode fail closed instead of accepting local password fallback credentials after trusted-proxy identity checks fail. Fixes [#&#8203;78684](https://github.com/openclaw/openclaw/issues/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 [#&#8203;78918](https://github.com/openclaw/openclaw/issues/78918). - Active memory: make `/active-memory status` honor the configured agent allowlist instead of reporting on for agents where recall is disabled. Fixes [#&#8203;78986](https://github.com/openclaw/openclaw/issues/78986). - Mistral: normalize structured OpenAI-compatible completions content blocks so thinking objects are not persisted as `[object Object]` visible reply text. Fixes [#&#8203;78846](https://github.com/openclaw/openclaw/issues/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 [#&#8203;77493](https://github.com/openclaw/openclaw/issues/77493). - Doctor/secrets: allow safe inherited exec SecretRef `passEnv` names such as `HOME` while still blocking dangerous runtime env hooks. Fixes [#&#8203;78216](https://github.com/openclaw/openclaw/issues/78216). - Chat commands: make `/model default` reset the session model override instead of treating it as a literal model name. Fixes [#&#8203;78182](https://github.com/openclaw/openclaw/issues/78182). - Cron: make rejected `payload.model` errors show the configured `agents.defaults.models` allowlist instead of echoing the rejected model twice. Fixes [#&#8203;79058](https://github.com/openclaw/openclaw/issues/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 [#&#8203;78581](https://github.com/openclaw/openclaw/issues/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 [#&#8203;79030](https://github.com/openclaw/openclaw/issues/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 [#&#8203;75501](https://github.com/openclaw/openclaw/issues/75501). Thanks [@&#8203;wzq-xzwj](https://github.com/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 [#&#8203;79018](https://github.com/openclaw/openclaw/issues/79018). Thanks [@&#8203;Jason-Vaughan](https://github.com/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 [#&#8203;72382](https://github.com/openclaw/openclaw/issues/72382). Thanks [@&#8203;jbob762](https://github.com/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 [#&#8203;12590](https://github.com/openclaw/openclaw/issues/12590). Refs [#&#8203;12760](https://github.com/openclaw/openclaw/issues/12760), [#&#8203;26145](https://github.com/openclaw/openclaw/issues/26145), and [#&#8203;46513](https://github.com/openclaw/openclaw/issues/46513). Thanks [@&#8203;Kaspre](https://github.com/Kaspre), [@&#8203;lailoo](https://github.com/lailoo), [@&#8203;drvoss](https://github.com/drvoss), [@&#8203;Br1an67](https://github.com/Br1an67), and [@&#8203;dial481](https://github.com/dial481). - Status: treat CLI runtime aliases such as `claude-cli/<model>` as the canonical selected provider route in `/status`, avoiding spurious fallback/unknown-auth display and preserving fresh context usage from CLI usage snapshots. Fixes [#&#8203;79015](https://github.com/openclaw/openclaw/issues/79015). Thanks [@&#8203;ItsThierry](https://github.com/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 [#&#8203;78913](https://github.com/openclaw/openclaw/issues/78913). Thanks [@&#8203;oiGaDio](https://github.com/oiGaDio). - Compute plugin callback authorization dynamically \[AI]. ([#&#8203;78866](https://github.com/openclaw/openclaw/issues/78866)) Thanks [@&#8203;pgondhi987](https://github.com/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 [#&#8203;78372](https://github.com/openclaw/openclaw/issues/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 [#&#8203;75780](https://github.com/openclaw/openclaw/issues/75780). Thanks [@&#8203;yozakura-ava](https://github.com/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]. ([#&#8203;78520](https://github.com/openclaw/openclaw/issues/78520)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - fix(skill-workshop): honor pending approval for tool suggestions \[AI]. ([#&#8203;78516](https://github.com/openclaw/openclaw/issues/78516)) Thanks [@&#8203;pgondhi987](https://github.com/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 [#&#8203;54149](https://github.com/openclaw/openclaw/issues/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 [#&#8203;54240](https://github.com/openclaw/openclaw/issues/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 [@&#8203;BunsDev](https://github.com/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 [#&#8203;54383](https://github.com/openclaw/openclaw/issues/54383). - Control UI/login: replace raw connection failures with structured, actionable login guidance for auth, pairing, insecure HTTP, origin, protocol, and transport failures. Thanks [@&#8203;BunsDev](https://github.com/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 [@&#8203;BunsDev](https://github.com/BunsDev). - Agents/models: accept legacy `anthropic-cli/*` model refs as Claude CLI runtime refs instead of failing model resolution with `Unknown model`. Thanks [@&#8203;BunsDev](https://github.com/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 [@&#8203;BunsDev](https://github.com/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 [@&#8203;BunsDev](https://github.com/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 [@&#8203;BunsDev](https://github.com/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 [@&#8203;BunsDev](https://github.com/BunsDev). - OpenAI-compatible providers: honor `compat.supportsTools=false` by stripping tool payload fields before dispatch to chat-only endpoints. Fixes [#&#8203;74664](https://github.com/openclaw/openclaw/issues/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 [#&#8203;75467](https://github.com/openclaw/openclaw/issues/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 [#&#8203;59913](https://github.com/openclaw/openclaw/issues/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 [#&#8203;77624](https://github.com/openclaw/openclaw/issues/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 [#&#8203;54166](https://github.com/openclaw/openclaw/issues/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 [#&#8203;77444](https://github.com/openclaw/openclaw/issues/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 [#&#8203;78541](https://github.com/openclaw/openclaw/issues/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 [#&#8203;77551](https://github.com/openclaw/openclaw/issues/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 [#&#8203;69708](https://github.com/openclaw/openclaw/issues/69708). - Anthropic: reject uppercase provider-prefixed forward-compat model ids locally instead of sending malformed dynamic ids upstream. Fixes [#&#8203;73715](https://github.com/openclaw/openclaw/issues/73715). - OpenAI/embeddings: pass configured output dimensionality through single and batched embedding requests so memory embedding indexes can request smaller vectors. Fixes [#&#8203;55126](https://github.com/openclaw/openclaw/issues/55126). - CLI/infer: normalize HEIC/HEIF image files to JPEG before model-run requests, avoiding providers that reject Apple image container formats. Fixes [#&#8203;50081](https://github.com/openclaw/openclaw/issues/50081). - CLI/infer: fall back to macOS `sips` when optional image tooling cannot decode HEIC/HEIF input files before model-run requests. Refs [#&#8203;50081](https://github.com/openclaw/openclaw/issues/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 [#&#8203;62655](https://github.com/openclaw/openclaw/issues/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 [#&#8203;78632](https://github.com/openclaw/openclaw/issues/78632). Thanks [@&#8203;gorkem2020](https://github.com/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 [#&#8203;52305](https://github.com/openclaw/openclaw/issues/52305). Thanks [@&#8203;Kaspre](https://github.com/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 [#&#8203;52305](https://github.com/openclaw/openclaw/issues/52305). Thanks [@&#8203;Kaspre](https://github.com/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 [#&#8203;78569](https://github.com/openclaw/openclaw/issues/78569). Thanks [@&#8203;naturedogdog](https://github.com/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 [#&#8203;78531](https://github.com/openclaw/openclaw/issues/78531). Thanks [@&#8203;EthanSK](https://github.com/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. ([#&#8203;78659](https://github.com/openclaw/openclaw/issues/78659)) Thanks [@&#8203;sjf](https://github.com/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 [#&#8203;79455](https://github.com/openclaw/openclaw/issues/79455). ([#&#8203;78575](https://github.com/openclaw/openclaw/issues/78575)) Thanks [@&#8203;tmimmanuel](https://github.com/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. ([#&#8203;78615](https://github.com/openclaw/openclaw/issues/78615)) - Discord/groups: tell Discord-channel agents to wrap bare URLs as `<https://example.com>` so link previews do not expand into uninvited embeds. ([#&#8203;78614](https://github.com/openclaw/openclaw/issues/78614)) - Agents/fallback: fail fast on session write-lock timeouts instead of trying fallback models for local file contention. Fixes [#&#8203;66646](https://github.com/openclaw/openclaw/issues/66646). Thanks [@&#8203;sallyom](https://github.com/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 [@&#8203;scotthuang](https://github.com/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. ([#&#8203;78645](https://github.com/openclaw/openclaw/issues/78645)) Thanks [@&#8203;joshavant](https://github.com/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 [#&#8203;78121](https://github.com/openclaw/openclaw/issues/78121). Thanks [@&#8203;amknight](https://github.com/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 [@&#8203;rubencu](https://github.com/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 [#&#8203;77814](https://github.com/openclaw/openclaw/issues/77814). ([#&#8203;78426](https://github.com/openclaw/openclaw/issues/78426)) Thanks [@&#8203;obviyus](https://github.com/obviyus), [@&#8203;ChushulSuri](https://github.com/ChushulSuri), and [@&#8203;DougButdorf](https://github.com/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 [#&#8203;78208](https://github.com/openclaw/openclaw/issues/78208). Thanks [@&#8203;amknight](https://github.com/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 [#&#8203;78074](https://github.com/openclaw/openclaw/issues/78074). Thanks [@&#8203;amknight](https://github.com/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 [#&#8203;78312](https://github.com/openclaw/openclaw/issues/78312). Thanks [@&#8203;amknight](https://github.com/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. ([#&#8203;78331](https://github.com/openclaw/openclaw/issues/78331)) Thanks [@&#8203;samzong](https://github.com/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 [#&#8203;77950](https://github.com/openclaw/openclaw/issues/77950). Thanks [@&#8203;amknight](https://github.com/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 [#&#8203;77993](https://github.com/openclaw/openclaw/issues/77993). Thanks [@&#8203;jackonedev](https://github.com/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 [#&#8203;77835](https://github.com/openclaw/openclaw/issues/77835). Thanks [@&#8203;googlerest](https://github.com/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 [#&#8203;77374](https://github.com/openclaw/openclaw/issues/77374). Thanks [@&#8203;BunsDev](https://github.com/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 [#&#8203;77867](https://github.com/openclaw/openclaw/issues/77867). Thanks [@&#8203;hongfangsong](https://github.com/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 [#&#8203;77821](https://github.com/openclaw/openclaw/issues/77821). Thanks [@&#8203;praxstack](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;78300](https://github.com/openclaw/openclaw/issues/78300). Thanks [@&#8203;amknight](https://github.com/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 [#&#8203;78007](https://github.com/openclaw/openclaw/issues/78007). Thanks [@&#8203;shakkernerd](https://github.com/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 [#&#8203;77939](https://github.com/openclaw/openclaw/issues/77939). Thanks [@&#8203;GitHoubi](https://github.com/GitHoubi) and [@&#8203;brokemac79](https://github.com/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 [@&#8203;Conan-Scott](https://github.com/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 [#&#8203;77773](https://github.com/openclaw/openclaw/issues/77773). Thanks [@&#8203;brokemac79](https://github.com/brokemac79) and [@&#8203;blackflame7983](https://github.com/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 [#&#8203;77983](https://github.com/openclaw/openclaw/issues/77983). Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Tasks/maintenance: prune stale cron run session registry entries while preserving running cron jobs and non-cron sessions. Fixes [#&#8203;73867](https://github.com/openclaw/openclaw/issues/73867). Thanks [@&#8203;brokemac79](https://github.com/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 [#&#8203;78671](https://github.com/openclaw/openclaw/issues/78671). Thanks [@&#8203;zanni098](https://github.com/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. ([#&#8203;77787](https://github.com/openclaw/openclaw/issues/77787)) Thanks [@&#8203;ProspectOre](https://github.com/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 [#&#8203;77858](https://github.com/openclaw/openclaw/issues/77858). Thanks [@&#8203;lilesjtu](https://github.com/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 [#&#8203;47561](https://github.com/openclaw/openclaw/issues/47561) and [#&#8203;45554](https://github.com/openclaw/openclaw/issues/45554). Thanks [@&#8203;BunsDev](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;73562](https://github.com/openclaw/openclaw/issues/73562). ([#&#8203;73566](https://github.com/openclaw/openclaw/issues/73566)) Thanks [@&#8203;ai-hpc](https://github.com/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 [#&#8203;41685](https://github.com/openclaw/openclaw/issues/41685). Thanks [@&#8203;BunsDev](https://github.com/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 [#&#8203;77651](https://github.com/openclaw/openclaw/issues/77651). Thanks [@&#8203;Gusty3055](https://github.com/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. ([#&#8203;79667](https://github.com/openclaw/openclaw/issues/79667)) Thanks [@&#8203;joshavant](https://github.com/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 [#&#8203;78508](https://github.com/openclaw/openclaw/issues/78508). ([#&#8203;79643](https://github.com/openclaw/openclaw/issues/79643)) Thanks [@&#8203;joshavant](https://github.com/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. ([#&#8203;79673](https://github.com/openclaw/openclaw/issues/79673)) Thanks [@&#8203;joshavant](https://github.com/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. ([#&#8203;74881](https://github.com/openclaw/openclaw/issues/74881), fixes [#&#8203;54470](https://github.com/openclaw/openclaw/issues/54470)) Thanks [@&#8203;Angfr95](https://github.com/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 [@&#8203;BunsDev](https://github.com/BunsDev). - Agents/skills: require exact `<location>` skill paths for both single-skill and multi-skill prompt selection, so agents do not guess or hard-code skill file paths. ([#&#8203;74161](https://github.com/openclaw/openclaw/issues/74161)) Thanks [@&#8203;lanzhi-lee](https://github.com/lanzhi-lee). - Agents/skills: rebuild sandboxed non-rw run skill prompts from the sandbox workspace copy, so `<available_skills>` no longer points at host-only `~/.openclaw/skills` paths. Fixes [#&#8203;50590](https://github.com/openclaw/openclaw/issues/50590). Thanks [@&#8203;kidroca](https://github.com/kidroca) and [@&#8203;sallyom](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc) and [@&#8203;Patrick-Erichsen](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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. ([#&#8203;77650](https://github.com/openclaw/openclaw/issues/77650)) Thanks [@&#8203;ragesaq](https://github.com/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 [#&#8203;77000](https://github.com/openclaw/openclaw/issues/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 [#&#8203;77228](https://github.com/openclaw/openclaw/issues/77228). ([#&#8203;77287](https://github.com/openclaw/openclaw/issues/77287)) Thanks [@&#8203;openperf](https://github.com/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 [#&#8203;77228](https://github.com/openclaw/openclaw/issues/77228)) get fully cleaned up rather than carried forward into the repaired file. Refs [#&#8203;77228](https://github.com/openclaw/openclaw/issues/77228). ([#&#8203;77288](https://github.com/openclaw/openclaw/issues/77288)) Thanks [@&#8203;openperf](https://github.com/openperf). - Doctor/device pairing: stop suggesting `openclaw devices rotate --role <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. ([#&#8203;77688](https://github.com/openclaw/openclaw/issues/77688)) Thanks [@&#8203;Conan-Scott](https://github.com/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. ([#&#8203;77617](https://github.com/openclaw/openclaw/issues/77617), fixes [#&#8203;77612](https://github.com/openclaw/openclaw/issues/77612)) Thanks [@&#8203;rriggs](https://github.com/rriggs) and [@&#8203;yfge](https://github.com/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 [#&#8203;77012](https://github.com/openclaw/openclaw/issues/77012). ([#&#8203;77046](https://github.com/openclaw/openclaw/issues/77046)) Thanks [@&#8203;openperf](https://github.com/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 [#&#8203;77228](https://github.com/openclaw/openclaw/issues/77228). ([#&#8203;77280](https://github.com/openclaw/openclaw/issues/77280)) Thanks [@&#8203;openperf](https://github.com/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. ([#&#8203;77845](https://github.com/openclaw/openclaw/issues/77845)) Thanks [@&#8203;obviyus](https://github.com/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. ([#&#8203;77488](https://github.com/openclaw/openclaw/issues/77488)) Thanks [@&#8203;drobison00](https://github.com/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 [#&#8203;76225](https://github.com/openclaw/openclaw/issues/76225). ([#&#8203;76359](https://github.com/openclaw/openclaw/issues/76359)) Thanks [@&#8203;neeravmakwana](https://github.com/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 [#&#8203;77833](https://github.com/openclaw/openclaw/issues/77833). ([#&#8203;77840](https://github.com/openclaw/openclaw/issues/77840)) Thanks [@&#8203;neeravmakwana](https://github.com/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 [#&#8203;76353](https://github.com/openclaw/openclaw/issues/76353). ([#&#8203;76362](https://github.com/openclaw/openclaw/issues/76362)) Thanks [@&#8203;RayWoo](https://github.com/RayWoo) and [@&#8203;neeravmakwana](https://github.com/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 [#&#8203;77007](https://github.com/openclaw/openclaw/issues/77007). ([#&#8203;77015](https://github.com/openclaw/openclaw/issues/77015)) Thanks [@&#8203;neeravmakwana](https://github.com/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 [#&#8203;77823](https://github.com/openclaw/openclaw/issues/77823). ([#&#8203;77839](https://github.com/openclaw/openclaw/issues/77839)) Thanks [@&#8203;neeravmakwana](https://github.com/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`. ([#&#8203;77269](https://github.com/openclaw/openclaw/issues/77269)) Thanks [@&#8203;pumpkinxing1](https://github.com/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 [@&#8203;zsxsoft](https://github.com/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. ([#&#8203;75143](https://github.com/openclaw/openclaw/issues/75143)) Thanks [@&#8203;eleqtrizit](https://github.com/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. ([#&#8203;75723](https://github.com/openclaw/openclaw/issues/75723)) Thanks [@&#8203;eleqtrizit](https://github.com/eleqtrizit) and [@&#8203;zsxsoft](https://github.com/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 [#&#8203;73003](https://github.com/openclaw/openclaw/issues/73003). ([#&#8203;73839](https://github.com/openclaw/openclaw/issues/73839)) Thanks [@&#8203;bradhallett](https://github.com/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. ([#&#8203;77947](https://github.com/openclaw/openclaw/issues/77947)) Thanks [@&#8203;obviyus](https://github.com/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 [#&#8203;77676](https://github.com/openclaw/openclaw/issues/77676). Thanks [@&#8203;openperf](https://github.com/openperf). - Doctor/plugins: discover doctor contracts from load-path channel plugins during `openclaw doctor --fix`, so plugin-owned legacy config repair runs before validation. ([#&#8203;77477](https://github.com/openclaw/openclaw/issues/77477)) Thanks [@&#8203;jalehman](https://github.com/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. ([#&#8203;78637](https://github.com/openclaw/openclaw/issues/78637)) Thanks [@&#8203;sallyom](https://github.com/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 [#&#8203;78597](https://github.com/openclaw/openclaw/issues/78597). ([#&#8203;78655](https://github.com/openclaw/openclaw/issues/78655)) Thanks [@&#8203;kevinslin](https://github.com/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. ([#&#8203;77126](https://github.com/openclaw/openclaw/issues/77126)) Thanks [@&#8203;jesse-merhi](https://github.com/jesse-merhi). - 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 [#&#8203;78749](https://github.com/openclaw/openclaw/issues/78749). ([#&#8203;79190](https://github.com/openclaw/openclaw/issues/79190)) Thanks [@&#8203;omarshahine](https://github.com/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 [#&#8203;79056](https://github.com/openclaw/openclaw/issues/79056). ([#&#8203;79057](https://github.com/openclaw/openclaw/issues/79057)) Thanks [@&#8203;ai-hpc](https://github.com/ai-hpc) and [@&#8203;bittoby](https://github.com/bittoby). - Gateway/nodes: preserve the live node registry session and invoke ownership when an older same-node WebSocket closes after reconnecting. ([#&#8203;78351](https://github.com/openclaw/openclaw/issues/78351)) Thanks [@&#8203;samzong](https://github.com/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. ([#&#8203;78780](https://github.com/openclaw/openclaw/issues/78780)) Thanks [@&#8203;jesse-merhi](https://github.com/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. ([#&#8203;74919](https://github.com/openclaw/openclaw/issues/74919)) Thanks [@&#8203;medns](https://github.com/medns). - Agents/current-time: split UTC into a separate `Reference UTC:` prompt line so local `Current time:` stays anchored to the user's timezone. ([#&#8203;42654](https://github.com/openclaw/openclaw/issues/42654)) Thanks [@&#8203;chencheng-li](https://github.com/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. ([#&#8203;78397](https://github.com/openclaw/openclaw/issues/78397)) Thanks [@&#8203;medns](https://github.com/medns). - Agents/failover: rotate auth profiles before deferred cooldown marking on rate-limit failures, so file-lock contention cannot stall profile failover. Fixes [#&#8203;57281](https://github.com/openclaw/openclaw/issues/57281). ([#&#8203;57283](https://github.com/openclaw/openclaw/issues/57283)) Thanks [@&#8203;jeremyknows](https://github.com/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 [#&#8203;77434](https://github.com/openclaw/openclaw/issues/77434). ([#&#8203;71170](https://github.com/openclaw/openclaw/issues/71170)) Thanks [@&#8203;statxc](https://github.com/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. ([#&#8203;62910](https://github.com/openclaw/openclaw/issues/62910)) Thanks [@&#8203;nandanadileep](https://github.com/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. ([#&#8203;79617](https://github.com/openclaw/openclaw/issues/79617)) Thanks [@&#8203;samzong](https://github.com/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. ([#&#8203;79700](https://github.com/openclaw/openclaw/issues/79700)) Thanks [@&#8203;TSHOGX](https://github.com/TSHOGX). ### [`v2026.5.7`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#202657) [Compare Source](https://github.com/openclaw/openclaw/compare/v2026.5.6...v2026.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. ([#&#8203;78701](https://github.com/openclaw/openclaw/issues/78701)) Thanks [@&#8203;aweiker](https://github.com/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`. ([#&#8203;78456](https://github.com/openclaw/openclaw/issues/78456)) Thanks [@&#8203;sliverp](https://github.com/sliverp). - Native commands: honor owner enforcement for native command handlers. ([#&#8203;78864](https://github.com/openclaw/openclaw/issues/78864)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Active Memory: require admin scope for global memory toggles. ([#&#8203;78863](https://github.com/openclaw/openclaw/issues/78863)) Thanks [@&#8203;pgondhi987](https://github.com/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. ([#&#8203;78873](https://github.com/openclaw/openclaw/issues/78873)) Thanks [@&#8203;Evizero](https://github.com/Evizero). - Auto-reply: gate inline skill tool dispatch through before-tool-call authorization hooks. ([#&#8203;78517](https://github.com/openclaw/openclaw/issues/78517)) Thanks [@&#8203;pgondhi987](https://github.com/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. ([#&#8203;78610](https://github.com/openclaw/openclaw/issues/78610)) Thanks [@&#8203;VACInc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;77968](https://github.com/openclaw/openclaw/issues/77968). ([#&#8203;78163](https://github.com/openclaw/openclaw/issues/78163)) Thanks [@&#8203;brokemac79](https://github.com/brokemac79) and [@&#8203;ChrisBot2026](https://github.com/ChrisBot2026). - Discord/message: parse provider-prefixed targets like `discord:channel:<id>` 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 [#&#8203;78572](https://github.com/openclaw/openclaw/issues/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. ([#&#8203;54392](https://github.com/openclaw/openclaw/issues/54392)) Thanks [@&#8203;adzendo](https://github.com/adzendo). - Commands/BTW: show the `/btw` missing-question usage placeholder with brackets so outbound channel sanitization keeps it visible. Fixes [#&#8203;62877](https://github.com/openclaw/openclaw/issues/62877). Thanks [@&#8203;RajvardhanPatil07](https://github.com/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 [#&#8203;78549](https://github.com/openclaw/openclaw/issues/78549). Thanks [@&#8203;bizzle12368239](https://github.com/bizzle12368239). - Telegram: honor `accessGroup:*` sender allowlists for DMs, groups, native commands, and callback authorization before applying Telegram's numeric sender-ID checks. Fixes [#&#8203;78660](https://github.com/openclaw/openclaw/issues/78660). Thanks [@&#8203;manugc](https://github.com/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 [#&#8203;78532](https://github.com/openclaw/openclaw/issues/78532). Thanks [@&#8203;joeyfrasier](https://github.com/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 [#&#8203;78608](https://github.com/openclaw/openclaw/issues/78608). Thanks [@&#8203;sallyom](https://github.com/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 [#&#8203;78607](https://github.com/openclaw/openclaw/issues/78607). Thanks [@&#8203;nailujac](https://github.com/nailujac), [@&#8203;zerone0x](https://github.com/zerone0x), and [@&#8203;sallyom](https://github.com/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 [#&#8203;78407](https://github.com/openclaw/openclaw/issues/78407). Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Telegram: keep the polling watchdog tied to `getUpdates` liveness so unrelated outbound Bot API calls cannot mask a wedged inbound poller. Fixes [#&#8203;78422](https://github.com/openclaw/openclaw/issues/78422). Thanks [@&#8203;ai-hpc](https://github.com/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. ([#&#8203;78263](https://github.com/openclaw/openclaw/issues/78263)) Thanks [@&#8203;arniesaha](https://github.com/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 [#&#8203;77779](https://github.com/openclaw/openclaw/issues/77779). ([#&#8203;77799](https://github.com/openclaw/openclaw/issues/77799)) Thanks [@&#8203;openperf](https://github.com/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. ([#&#8203;78685](https://github.com/openclaw/openclaw/issues/78685)) Thanks [@&#8203;neeravmakwana](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;67378](https://github.com/openclaw/openclaw/issues/67378). ([#&#8203;74925](https://github.com/openclaw/openclaw/issues/74925)) Thanks [@&#8203;edenfunf](https://github.com/edenfunf). - WhatsApp: send captioned `MEDIA:` directive auto-replies once instead of emitting an empty media message before the captioned media reply. ([#&#8203;78770](https://github.com/openclaw/openclaw/issues/78770)) Thanks [@&#8203;ai-hpc](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [#&#8203;51881](https://github.com/openclaw/openclaw/issues/51881), [#&#8203;48915](https://github.com/openclaw/openclaw/issues/48915), [#&#8203;77566](https://github.com/openclaw/openclaw/issues/77566), and [#&#8203;42858](https://github.com/openclaw/openclaw/issues/42858). - Telegram/models: parse provider ids containing dots in `/models` callback buttons so `hf.co` model lists render as inline keyboard buttons. Fixes [#&#8203;38745](https://github.com/openclaw/openclaw/issues/38745). ### [`v2026.5.6`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#202656) [Compare Source](https://github.com/openclaw/openclaw/compare/v2026.5.5...v2026.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 [#&#8203;77846](https://github.com/openclaw/openclaw/issues/77846). Thanks [@&#8203;shakkernerd](https://github.com/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. ([#&#8203;78439](https://github.com/openclaw/openclaw/issues/78439)) Thanks [@&#8203;obviyus](https://github.com/obviyus). ### [`v2026.5.5`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#202655) [Compare Source](https://github.com/openclaw/openclaw/compare/v2026.5.4...v2026.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 [#&#8203;78407](https://github.com/openclaw/openclaw/issues/78407). Thanks [@&#8203;shakkernerd](https://github.com/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 [#&#8203;77846](https://github.com/openclaw/openclaw/issues/77846). Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Web fetch: bound guarded dispatcher cleanup after request timeouts so timed-out fetches return tool errors instead of leaving Gateway tool lanes active. ([#&#8203;78439](https://github.com/openclaw/openclaw/issues/78439)) Thanks [@&#8203;obviyus](https://github.com/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 [#&#8203;76670](https://github.com/openclaw/openclaw/issues/76670). Thanks [@&#8203;jacobtomlinson](https://github.com/jacobtomlinson). - Gate Slack startup user allowlist resolution \[AI]. ([#&#8203;77898](https://github.com/openclaw/openclaw/issues/77898)) Thanks [@&#8203;pgondhi987](https://github.com/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 [#&#8203;67158](https://github.com/openclaw/openclaw/issues/67158). Thanks [@&#8203;drpau](https://github.com/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 [#&#8203;78377](https://github.com/openclaw/openclaw/issues/78377). Thanks [@&#8203;amknight](https://github.com/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 [#&#8203;77872](https://github.com/openclaw/openclaw/issues/77872). Thanks [@&#8203;anyech](https://github.com/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. ([#&#8203;78642](https://github.com/openclaw/openclaw/issues/78642)) Thanks [@&#8203;joshavant](https://github.com/joshavant). - Onboard/channels: recover externalized channel plugins from stale `channels.<id>` 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 "<channel> plugin not available." ([#&#8203;78328](https://github.com/openclaw/openclaw/issues/78328)) Thanks [@&#8203;sliverp](https://github.com/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 [#&#8203;77363](https://github.com/openclaw/openclaw/issues/77363). Thanks [@&#8203;lonexreb](https://github.com/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 [#&#8203;78298](https://github.com/openclaw/openclaw/issues/78298). Thanks [@&#8203;amknight](https://github.com/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 [#&#8203;76464](https://github.com/openclaw/openclaw/issues/76464). Thanks [@&#8203;lilesjtu](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;78262](https://github.com/openclaw/openclaw/issues/78262). Thanks [@&#8203;joeyzenghuan](https://github.com/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 [#&#8203;78316](https://github.com/openclaw/openclaw/issues/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 [#&#8203;75641](https://github.com/openclaw/openclaw/issues/75641). ([#&#8203;77949](https://github.com/openclaw/openclaw/issues/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. ([#&#8203;78179](https://github.com/openclaw/openclaw/issues/78179)) Thanks [@&#8203;Patrick-Erichsen](https://github.com/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 [#&#8203;77668](https://github.com/openclaw/openclaw/issues/77668). ([#&#8203;78087](https://github.com/openclaw/openclaw/issues/78087)) Thanks [@&#8203;bryce-d-greybeard](https://github.com/bryce-d-greybeard) and [@&#8203;NikolaFC](https://github.com/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 [#&#8203;78080](https://github.com/openclaw/openclaw/issues/78080). Thanks [@&#8203;ramitrkar-hash](https://github.com/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 [@&#8203;BunsDev](https://github.com/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 [@&#8203;BunsDev](https://github.com/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 [#&#8203;76957](https://github.com/openclaw/openclaw/issues/76957). Thanks [@&#8203;BunsDev](https://github.com/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 [#&#8203;77785](https://github.com/openclaw/openclaw/issues/77785). ([#&#8203;77907](https://github.com/openclaw/openclaw/issues/77907)) Thanks [@&#8203;Alex-Alaniz](https://github.com/Alex-Alaniz) and [@&#8203;MilleniumGenAI](https://github.com/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 [#&#8203;78194](https://github.com/openclaw/openclaw/issues/78194). Thanks [@&#8203;neeravmakwana](https://github.com/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 [#&#8203;47887](https://github.com/openclaw/openclaw/issues/47887); carries forward [#&#8203;65185](https://github.com/openclaw/openclaw/issues/65185). Thanks [@&#8203;draix](https://github.com/draix) and [@&#8203;BunsDev](https://github.com/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 [#&#8203;77835](https://github.com/openclaw/openclaw/issues/77835). Thanks [@&#8203;googlerest](https://github.com/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 [#&#8203;77374](https://github.com/openclaw/openclaw/issues/77374). Thanks [@&#8203;BunsDev](https://github.com/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 [#&#8203;77867](https://github.com/openclaw/openclaw/issues/77867). Thanks [@&#8203;hongfangsong](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Gateway/shutdown: cancel delayed post-ready maintenance during close and suppress maintenance/cron startup after quick restarts, preventing orphaned background timers. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;74271](https://github.com/openclaw/openclaw/issues/74271). Thanks [@&#8203;yelog](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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. ([#&#8203;77754](https://github.com/openclaw/openclaw/issues/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 [@&#8203;frankekn](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [#&#8203;74289](https://github.com/openclaw/openclaw/issues/74289). Thanks [@&#8203;frankekn](https://github.com/frankekn). - WhatsApp responsiveness: stop only verified stale local TUI clients when they degrade the Gateway event loop and delay replies. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;77608](https://github.com/openclaw/openclaw/issues/77608). Thanks [@&#8203;slideshow-dingo](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Status: show compact Gateway process uptime and host system uptime in `/status`, making restart and host-lifetime checks visible from chat. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - WhatsApp responsiveness: stop only verified stale local TUI clients when they degrade the Gateway event loop and delay replies. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Gateway/shutdown: report structured shutdown warnings and HTTP close timeout warnings through `ShutdownResult` while preserving lifecycle hook hardening. Carries forward [#&#8203;41296](https://github.com/openclaw/openclaw/issues/41296). Thanks [@&#8203;edenfunf](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Gateway/shutdown: cancel delayed post-ready maintenance during close and suppress maintenance/cron startup after quick restarts, preventing orphaned background timers. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - CLI/status: show the selected agent runtime/harness in `openclaw status` session rows so terminal status matches the `/status` runtime line. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;VintageAyu](https://github.com/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. ### [`v2026.5.4`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#202654) [Compare Source](https://github.com/openclaw/openclaw/compare/v2026.5.3...v2026.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. ([#&#8203;77064](https://github.com/openclaw/openclaw/issues/77064)) Thanks [@&#8203;scoootscooob](https://github.com/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. ([#&#8203;69701](https://github.com/openclaw/openclaw/issues/69701), fixes [#&#8203;69674](https://github.com/openclaw/openclaw/issues/69674)) Thanks [@&#8203;SARAMALI15792](https://github.com/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 <spec>` instead of telling them to remove valid plugin config. ([#&#8203;77483](https://github.com/openclaw/openclaw/issues/77483)) Thanks [@&#8203;hclsys](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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. ([#&#8203;77519](https://github.com/openclaw/openclaw/issues/77519), [#&#8203;77532](https://github.com/openclaw/openclaw/issues/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. ([#&#8203;77519](https://github.com/openclaw/openclaw/issues/77519), [#&#8203;77532](https://github.com/openclaw/openclaw/issues/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 [@&#8203;Beandon13](https://github.com/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 [@&#8203;Beandon13](https://github.com/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 ([#&#8203;76704](https://github.com/openclaw/openclaw/issues/76704)); this extends it to store-derived channels. ([#&#8203;77396](https://github.com/openclaw/openclaw/issues/77396)) Thanks [@&#8203;hclsys](https://github.com/hclsys). - Secrets/external channel contracts: also look in `<rootDir>/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 [#&#8203;76449](https://github.com/openclaw/openclaw/issues/76449) had landed the generic external-contract loader. Thanks [@&#8203;mogglemoss](https://github.com/mogglemoss). - Models/auth: add `openclaw models auth list [--provider <id>] [--json]` so users can inspect saved per-agent auth profiles without dumping secrets or hitting the old “too many arguments” path. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;BunsDev](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;BunsDev](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;jesse-merhi](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - QA/Mantis: accept Blacksmith Testbox `tbx_...` lease ids from desktop smoke warmup, so provider overrides do not fail before inspect/run. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugins/update: move ClawHub-preferred externalized plugin installs back to ClawHub after an earlier npm fallback once the ClawHub package becomes available. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;77137](https://github.com/openclaw/openclaw/issues/77137). Thanks [@&#8203;richardmqq](https://github.com/richardmqq). - Google Meet: preserve `realtime.introMessage: ""` so realtime Chrome joins can stay silent instead of restoring the default spoken intro. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugins/SDK: add bounded `before_agent_finalize` retry instructions so workflow plugins can request one more model pass. Thanks [@&#8203;100yenadmin](https://github.com/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. ([#&#8203;76327](https://github.com/openclaw/openclaw/issues/76327)) Thanks [@&#8203;joshavant](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Providers/OpenRouter: expand app-attribution categories so OpenClaw advertises coding, programming, writing, chat, and personal-agent usage on verified OpenRouter routes. Thanks [@&#8203;vincentkoc](https://github.com/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. ([#&#8203;77490](https://github.com/openclaw/openclaw/issues/77490)) Thanks [@&#8203;remdev](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc) and [@&#8203;joshavant](https://github.com/joshavant). - Channels/WhatsApp: support explicit WhatsApp Channel/Newsletter `@newsletter` outbound message targets with channel session metadata instead of DM routing. Fixes [#&#8203;13417](https://github.com/openclaw/openclaw/issues/13417); carries forward the narrow outbound target idea from [#&#8203;13424](https://github.com/openclaw/openclaw/issues/13424). Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc) and [@&#8203;agentz-manfred](https://github.com/agentz-manfred). - Exec approvals: add a tree-sitter-backed shell command explainer for future approval and command-review surfaces. ([#&#8203;75004](https://github.com/openclaw/openclaw/issues/75004)) Thanks [@&#8203;jesse-merhi](https://github.com/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. ([#&#8203;74831](https://github.com/openclaw/openclaw/issues/74831)) Thanks [@&#8203;luckylhb90](https://github.com/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 [@&#8203;romneyda](https://github.com/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 [@&#8203;amknight](https://github.com/amknight). - Plugin SDK: add plugin-owned `SessionEntry` slot projection and scoped trusted-policy session extension reads. ([#&#8203;75609](https://github.com/openclaw/openclaw/issues/75609); replaces part of [#&#8203;73384](https://github.com/openclaw/openclaw/issues/73384)/[#&#8203;74483](https://github.com/openclaw/openclaw/issues/74483)) Thanks [@&#8203;100yenadmin](https://github.com/100yenadmin). - Sandbox/Windows: accept drive-absolute Docker bind sources while keeping sandbox blocked-path and allowed-root policy comparisons Windows-case-insensitive. ([#&#8203;42174](https://github.com/openclaw/openclaw/issues/42174)) Thanks [@&#8203;6607changchun](https://github.com/6607changchun). ##### Fixes - Browser/chrome-mcp: read Chrome DevTools MCP screenshot output from the extension-suffixed path, fixing ENOENT on screenshot capture. Fixes [#&#8203;77222](https://github.com/openclaw/openclaw/issues/77222). ([#&#8203;74685](https://github.com/openclaw/openclaw/issues/74685)) Thanks [@&#8203;barbarhan](https://github.com/barbarhan). - macOS/launchd: set generated Gateway LaunchAgent plists to `ProcessType=Interactive` so the gateway keeps timely execution during idle periods. Fixes [#&#8203;58061](https://github.com/openclaw/openclaw/issues/58061); refs [#&#8203;62294](https://github.com/openclaw/openclaw/issues/62294) and closed duplicate [#&#8203;66992](https://github.com/openclaw/openclaw/issues/66992). ([#&#8203;62308](https://github.com/openclaw/openclaw/issues/62308)) Thanks [@&#8203;bryanpearson](https://github.com/bryanpearson) and [@&#8203;zssggle-rgb](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;77244](https://github.com/openclaw/openclaw/issues/77244). Thanks [@&#8203;buyuangtampan](https://github.com/buyuangtampan), [@&#8203;Nikoxx99](https://github.com/Nikoxx99), and [@&#8203;vincentkoc](https://github.com/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 [@&#8203;bek91](https://github.com/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 [#&#8203;77648](https://github.com/openclaw/openclaw/issues/77648). Thanks [@&#8203;bek91](https://github.com/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-<uid>` instead of `C:\tmp\openclaw`. Fixes [#&#8203;60713](https://github.com/openclaw/openclaw/issues/60713). Thanks [@&#8203;juan-flores077](https://github.com/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. ([#&#8203;76593](https://github.com/openclaw/openclaw/issues/76593)) Thanks [@&#8203;qq230849622-a11y](https://github.com/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. ([#&#8203;77519](https://github.com/openclaw/openclaw/issues/77519), [#&#8203;77532](https://github.com/openclaw/openclaw/issues/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 `<media:image>`. Fixes [#&#8203;69793](https://github.com/openclaw/openclaw/issues/69793). Thanks [@&#8203;aspalagin](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;77431](https://github.com/openclaw/openclaw/issues/77431). Thanks [@&#8203;Udjin79](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;77474](https://github.com/openclaw/openclaw/issues/77474); carries forward [#&#8203;21597](https://github.com/openclaw/openclaw/issues/21597). Thanks [@&#8203;efpiva](https://github.com/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 [#&#8203;77461](https://github.com/openclaw/openclaw/issues/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. ([#&#8203;77557](https://github.com/openclaw/openclaw/issues/77557)) Thanks [@&#8203;pashpashpash](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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. ([#&#8203;77544](https://github.com/openclaw/openclaw/issues/77544)) Thanks [@&#8203;ProspectOre](https://github.com/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 [#&#8203;77520](https://github.com/openclaw/openclaw/issues/77520). Thanks [@&#8203;Patrick-Erichsen](https://github.com/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 [#&#8203;77398](https://github.com/openclaw/openclaw/issues/77398); refs [#&#8203;77526](https://github.com/openclaw/openclaw/issues/77526). Thanks [@&#8203;Beandon13](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;77424](https://github.com/openclaw/openclaw/issues/77424). Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Mattermost: clarify that the model picker only changes the session model and that runtime switches require `/oc_model <provider/model> --runtime <runtime>`. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Doctor/config: keep active `auth.profiles` metadata intact when `doctor --fix` strips stale secret fields from configs, repairing legacy `<provider>:default` API-key profile metadata when model fallbacks or explicit `model@profile` refs still depend on it. Fixes [#&#8203;77400](https://github.com/openclaw/openclaw/issues/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 [#&#8203;77155](https://github.com/openclaw/openclaw/issues/77155). Thanks [@&#8203;hclsys](https://github.com/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 [#&#8203;68615](https://github.com/openclaw/openclaw/issues/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;77530](https://github.com/openclaw/openclaw/issues/77530). Thanks [@&#8203;PeterTremonti](https://github.com/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 [#&#8203;76628](https://github.com/openclaw/openclaw/issues/76628). Thanks [@&#8203;RayWoo](https://github.com/RayWoo). - Browser: enforce strict SSRF current-URL checks before existing-session screenshots, matching existing-session snapshot handling. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Active Memory: give timeout partial transcript recovery enough abort-settle headroom so temporary recall summaries are returned before cleanup. Thanks [@&#8203;vincentkoc](https://github.com/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 [#&#8203;77485](https://github.com/openclaw/openclaw/issues/77485). Thanks [@&#8203;bws14email](https://github.com/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 <n|all>` plus JSON pagination metadata, so repeated machine polling of large session stores cannot fan out into unbounded per-row enrichment/output work. Fixes [#&#8203;77500](https://github.com/openclaw/openclaw/issues/77500). Thanks [@&#8203;Kaotic3](https://github.com/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 [@&#8203;scoootscooob](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;77293](https://github.com/openclaw/openclaw/issues/77293). ([#&#8203;77450](https://github.com/openclaw/openclaw/issues/77450)) Thanks [@&#8203;p3nchan](https://github.com/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. ([#&#8203;77478](https://github.com/openclaw/openclaw/issues/77478)) Thanks [@&#8203;NikolaFC](https://github.com/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 [#&#8203;77458](https://github.com/openclaw/openclaw/issues/77458). Thanks [@&#8203;jaikharbanda](https://github.com/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 [#&#8203;77266](https://github.com/openclaw/openclaw/issues/77266). Thanks [@&#8203;p3nchan](https://github.com/p3nchan). - fix(gateway): clamp unbound websocket auth scopes \[AI]. ([#&#8203;77413](https://github.com/openclaw/openclaw/issues/77413)) Thanks [@&#8203;pgondhi987](https://github.com/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. ([#&#8203;77456](https://github.com/openclaw/openclaw/issues/77456)) Thanks [@&#8203;VACInc](https://github.com/VACInc). - Gate zalouser startup name matching \[AI]. ([#&#8203;77411](https://github.com/openclaw/openclaw/issues/77411)) Thanks [@&#8203;pgondhi987](https://github.com/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 [#&#8203;65309](https://github.com/openclaw/openclaw/issues/65309). Thanks [@&#8203;joeykrug](https://github.com/joeykrug), [@&#8203;westley3601](https://github.com/westley3601), [@&#8203;pimenov](https://github.com/pimenov), and [@&#8203;tasi333](https://github.com/tasi333). - fix(device-pair): require pairing scope for pair command \[AI]. ([#&#8203;76377](https://github.com/openclaw/openclaw/issues/76377)) Thanks [@&#8203;pgondhi987](https://github.com/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 [#&#8203;77350](https://github.com/openclaw/openclaw/issues/77350). ([#&#8203;77423](https://github.com/openclaw/openclaw/issues/77423)) Thanks [@&#8203;krllagent](https://github.com/krllagent), [@&#8203;mushuiyu886](https://github.com/mushuiyu886), and [@&#8203;sallyom](https://github.com/sallyom). - fix(qqbot): keep private commands off framework surface \[AI]. ([#&#8203;77212](https://github.com/openclaw/openclaw/issues/77212)) Thanks [@&#8203;pgondhi987](https://github.com/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 [#&#8203;77303](https://github.com/openclaw/openclaw/issues/77303). Thanks [@&#8203;Petr1t](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;77506](https://github.com/openclaw/openclaw/issues/77506). Thanks [@&#8203;hclsys](https://github.com/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 [#&#8203;77337](https://github.com/openclaw/openclaw/issues/77337). Thanks [@&#8203;hclsys](https://github.com/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 [#&#8203;77436](https://github.com/openclaw/openclaw/issues/77436). Thanks [@&#8203;lonexreb](https://github.com/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 [@&#8203;BunsDev](https://github.com/BunsDev). - Telegram: cool down repeatedly failing Bot API transport fallbacks so long polling stops hammering a blackholed Telegram route. Fixes [#&#8203;77900](https://github.com/openclaw/openclaw/issues/77900). Thanks [@&#8203;bryce-d-greybeard](https://github.com/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 [#&#8203;49864](https://github.com/openclaw/openclaw/issues/49864). Thanks [@&#8203;Panniantong](https://github.com/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 [#&#8203;75763](https://github.com/openclaw/openclaw/issues/75763). Thanks [@&#8203;RyanSandoval](https://github.com/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 [#&#8203;1296](https://github.com/openclaw/openclaw/issues/1296). Thanks [@&#8203;Lukavyi](https://github.com/Lukavyi) and [@&#8203;romneyda](https://github.com/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 [#&#8203;48432](https://github.com/openclaw/openclaw/issues/48432), [#&#8203;39505](https://github.com/openclaw/openclaw/issues/39505). Thanks [@&#8203;DocOellerson](https://github.com/DocOellerson), [@&#8203;xeusoc](https://github.com/xeusoc), [@&#8203;CCcassiusdjs](https://github.com/CCcassiusdjs), [@&#8203;akramcodez](https://github.com/akramcodez), [@&#8203;brokemac79](https://github.com/brokemac79), [@&#8203;romneyda](https://github.com/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 [#&#8203;77296](https://github.com/openclaw/openclaw/issues/77296). ([#&#8203;77328](https://github.com/openclaw/openclaw/issues/77328)) Thanks [@&#8203;zhangguiping-xydt](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugins/install: let official plugin reinstall recovery repair source-only installed runtime shadows, so `openclaw plugins install npm:@&#8203;openclaw/discord --force` can replace the bad package instead of stopping at stale config validation. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;BunsDev](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - fix: harden backend message action gateway routing \[AI]. ([#&#8203;76374](https://github.com/openclaw/openclaw/issues/76374)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987). - Gate QQBot streaming command auth \[AI]. ([#&#8203;76375](https://github.com/openclaw/openclaw/issues/76375)) Thanks [@&#8203;pgondhi987](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugins/packages: reject blank `openclaw.runtimeExtensions` entries instead of silently ignoring them and falling back to inferred TypeScript runtime entries. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;dougbtv](https://github.com/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 [#&#8203;77071](https://github.com/openclaw/openclaw/issues/77071). Thanks [@&#8203;ijoshdavis](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;BunsDev](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;romneyda](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;77139](https://github.com/openclaw/openclaw/issues/77139). Thanks [@&#8203;bittoby](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Media/images: keep HEIC/HEIF attachments fail-closed when optional Sharp conversion is unavailable instead of sending originals that still need conversion. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;BunsDev](https://github.com/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 [#&#8203;77124](https://github.com/openclaw/openclaw/issues/77124). Thanks [@&#8203;loyur](https://github.com/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 [@&#8203;ZanderH-code](https://github.com/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 [@&#8203;BunsDev](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;BunsDev](https://github.com/BunsDev). - Discord: start the gateway monitor without waiting for the startup bot/application probe, so WSL2 hosts with a slow `/users/@&#8203;me` REST path still bring the channel online while status enrichment finishes asynchronously. Fixes [#&#8203;77103](https://github.com/openclaw/openclaw/issues/77103). Thanks [@&#8203;Suited78](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;77087](https://github.com/openclaw/openclaw/issues/77087). Thanks [@&#8203;westlife219](https://github.com/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 [#&#8203;70830](https://github.com/openclaw/openclaw/issues/70830) and [#&#8203;77097](https://github.com/openclaw/openclaw/issues/77097). Thanks [@&#8203;hclsys](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Exec approvals: unwrap BSD/macOS `env -P <path>` 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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;77073](https://github.com/openclaw/openclaw/issues/77073). Thanks [@&#8203;joeykrug](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;amknight](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Control UI: point the Appearance tweakcn browse action and docs at the live tweakcn editor route instead of the removed `/themes` page. Fixes [#&#8203;77048](https://github.com/openclaw/openclaw/issues/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 [#&#8203;62413](https://github.com/openclaw/openclaw/issues/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 [#&#8203;77054](https://github.com/openclaw/openclaw/issues/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 [#&#8203;77024](https://github.com/openclaw/openclaw/issues/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 [#&#8203;76844](https://github.com/openclaw/openclaw/issues/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 [#&#8203;77081](https://github.com/openclaw/openclaw/issues/77081). ([#&#8203;77117](https://github.com/openclaw/openclaw/issues/77117)) Thanks [@&#8203;pfrederiksen](https://github.com/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 [#&#8203;77072](https://github.com/openclaw/openclaw/issues/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 [#&#8203;76289](https://github.com/openclaw/openclaw/issues/76289). - Plugins/catalog: suppress missing `channelConfigs` compatibility diagnostics for external channel plugins that are disabled, denied, or outside a restrictive allowlist. Fixes [#&#8203;76095](https://github.com/openclaw/openclaw/issues/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Google Meet: keep explicit non-Google `realtime.provider` values as the transcription provider compatibility fallback when `realtime.transcriptionProvider` is unset. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Google Meet: make Twilio setup status require an enabled `voice-call` plugin entry instead of treating a missing entry as ready. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Telegram: render shared interactive reply buttons in reply delivery so plugin approval messages show inline keyboards. ([#&#8203;76238](https://github.com/openclaw/openclaw/issues/76238)) Thanks [@&#8203;keshavbotagent](https://github.com/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 [#&#8203;77011](https://github.com/openclaw/openclaw/issues/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. ([#&#8203;76936](https://github.com/openclaw/openclaw/issues/76936)) Thanks [@&#8203;keshavbotagent](https://github.com/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. ([#&#8203;77030](https://github.com/openclaw/openclaw/issues/77030); refs [#&#8203;77011](https://github.com/openclaw/openclaw/issues/77011)) Thanks [@&#8203;openperf](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;76623](https://github.com/openclaw/openclaw/issues/76623). Thanks [@&#8203;fuyizheng3120](https://github.com/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 [#&#8203;76931](https://github.com/openclaw/openclaw/issues/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 [#&#8203;77062](https://github.com/openclaw/openclaw/issues/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 [#&#8203;76295](https://github.com/openclaw/openclaw/issues/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 [#&#8203;76997](https://github.com/openclaw/openclaw/issues/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;76424](https://github.com/openclaw/openclaw/issues/76424). ([#&#8203;77033](https://github.com/openclaw/openclaw/issues/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 [#&#8203;76946](https://github.com/openclaw/openclaw/issues/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 [#&#8203;75374](https://github.com/openclaw/openclaw/issues/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 [#&#8203;70664](https://github.com/openclaw/openclaw/issues/70664). - Gateway/logging: expand leading `~` in `logging.file` before creating the file logger, preventing startup crash loops for home-relative log paths. Fixes [#&#8203;73587](https://github.com/openclaw/openclaw/issues/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 [#&#8203;67595](https://github.com/openclaw/openclaw/issues/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;76915](https://github.com/openclaw/openclaw/issues/76915). Thanks [@&#8203;hclsys](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Feishu: use the shared channel progress formatter for streaming-card tool status lines, including raw command/detail output and message-tool filtering. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Mattermost: suppress standalone default tool-progress messages while draft previews are active, including when draft tool lines are disabled. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;76857](https://github.com/openclaw/openclaw/issues/76857). Thanks [@&#8203;jplavoiemtl](https://github.com/jplavoiemtl) and [@&#8203;SymbolStar](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugin updates: clean stale bundled load paths for already-externalized npm installs whose legacy install record only preserved the resolved package name. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Google Meet: avoid treating repeated participant words as multiple assistant-overlap matches when suppressing realtime echo transcripts. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Slack/Discord: suppress standalone tool-progress chatter when partial preview streaming has `streaming.preview.toolProgress: false`, matching the documented quiet-preview behavior. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - QA/Matrix: wait for live approval reactions to echo before starting the threaded approval decision timeout. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - QA/Matrix: reuse the primed driver sync stream when confirming approval reaction echoes, avoiding missed self-reactions in live release runs. Thanks [@&#8203;vincentkoc](https://github.com/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 [#&#8203;75178](https://github.com/openclaw/openclaw/issues/75178) and [#&#8203;67394](https://github.com/openclaw/openclaw/issues/67394). Thanks [@&#8203;scoootscooob](https://github.com/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. ([#&#8203;76714](https://github.com/openclaw/openclaw/issues/76714)) Thanks [@&#8203;keshavbotagent](https://github.com/keshavbotagent). - Telegram: keep status checks pointed at the active chat so asking for the current session no longer reports an old direct-message conversation. ([#&#8203;76708](https://github.com/openclaw/openclaw/issues/76708)) Thanks [@&#8203;amknight](https://github.com/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 [#&#8203;76339](https://github.com/openclaw/openclaw/issues/76339). Thanks [@&#8203;brokemac79](https://github.com/brokemac79) and [@&#8203;BunsDev](https://github.com/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 [#&#8203;76880](https://github.com/openclaw/openclaw/issues/76880). Thanks [@&#8203;donbowman](https://github.com/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 [#&#8203;76213](https://github.com/openclaw/openclaw/issues/76213). Thanks [@&#8203;dougvk](https://github.com/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 [@&#8203;jesse-merhi](https://github.com/jesse-merhi) and [@&#8203;mjamiv](https://github.com/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. ([#&#8203;74905](https://github.com/openclaw/openclaw/issues/74905)) Thanks [@&#8203;jesse-merhi](https://github.com/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 [#&#8203;76412](https://github.com/openclaw/openclaw/issues/76412). Thanks [@&#8203;inxaos](https://github.com/inxaos) and [@&#8203;davemorin](https://github.com/davemorin). - TUI: replace the stale-response watchdog notice with plain user-facing copy so stalled replies no longer surface backend or streaming internals. ([#&#8203;77120](https://github.com/openclaw/openclaw/issues/77120)) Thanks [@&#8203;davemorin](https://github.com/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. ([#&#8203;74458](https://github.com/openclaw/openclaw/issues/74458)) Thanks [@&#8203;mmaps](https://github.com/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. ([#&#8203;74454](https://github.com/openclaw/openclaw/issues/74454)) Thanks [@&#8203;mmaps](https://github.com/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`. ([#&#8203;77453](https://github.com/openclaw/openclaw/issues/77453)) Thanks [@&#8203;drobison00](https://github.com/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`. ([#&#8203;77470](https://github.com/openclaw/openclaw/issues/77470)) Thanks [@&#8203;drobison00](https://github.com/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. ([#&#8203;75731](https://github.com/openclaw/openclaw/issues/75731)) Thanks [@&#8203;eleqtrizit](https://github.com/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. ([#&#8203;77472](https://github.com/openclaw/openclaw/issues/77472)) Thanks [@&#8203;drobison00](https://github.com/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. ([#&#8203;77501](https://github.com/openclaw/openclaw/issues/77501)) Thanks [@&#8203;ificator](https://github.com/ificator). ### [`v2026.5.3`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#202653-1) [Compare Source](https://github.com/openclaw/openclaw/compare/v2026.5.2...v2026.5.3) ##### 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 [@&#8203;vincentkoc](https://github.com/vincentkoc). ### [`v2026.5.2`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#202652) [Compare Source](https://github.com/openclaw/openclaw/compare/v2026.4.29...v2026.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 [@&#8203;vincentkoc](https://github.com/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. ([#&#8203;68327](https://github.com/openclaw/openclaw/issues/68327)) Thanks [@&#8203;JIRBOY](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;DmitryPogodaev](https://github.com/DmitryPogodaev). - Agents/runtime: memoize transcript replay-policy resolution for stable config and process-env runs while preserving custom-env provider hook behavior. Thanks [@&#8203;DmitryPogodaev](https://github.com/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 [#&#8203;75895](https://github.com/openclaw/openclaw/issues/75895), [#&#8203;75575](https://github.com/openclaw/openclaw/issues/75575), and [#&#8203;68782](https://github.com/openclaw/openclaw/issues/68782). Thanks [@&#8203;Enderfga](https://github.com/Enderfga). - Tools: add a platform-level tool descriptor planner for descriptor-first visibility, generic availability checks, and executor references. Thanks [@&#8203;shakkernerd](https://github.com/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. ([#&#8203;76079](https://github.com/openclaw/openclaw/issues/76079)) Thanks [@&#8203;shakkernerd](https://github.com/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 [@&#8203;pashpashpash](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugins/beta: prepare Brave, Codex, Feishu, Synology Chat, Tlon, and Twitch for `2026.5.1-beta.1` npm and ClawHub publishing. Thanks [@&#8203;vincentkoc](https://github.com/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. ([#&#8203;74824](https://github.com/openclaw/openclaw/issues/74824)) Thanks [@&#8203;BsnizND](https://github.com/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 [#&#8203;72478](https://github.com/openclaw/openclaw/issues/72478). Thanks [@&#8203;DougButdorf](https://github.com/DougButdorf). - Plugins/ClawHub: prefer versioned ClawPack artifacts when ClawHub publishes digest metadata, verifying the ClawPack response header and downloaded bytes before installing. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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. ([#&#8203;75943](https://github.com/openclaw/openclaw/issues/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 [#&#8203;39900](https://github.com/openclaw/openclaw/issues/39900). Thanks [@&#8203;R3NK0R](https://github.com/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 [@&#8203;mariozechner](https://github.com/mariozechner), [@&#8203;aws](https://github.com/aws), and [@&#8203;microsoft](https://github.com/microsoft). - Discord/channels: add reusable message-channel access groups plus Discord channel-audience DM authorization, so allowlists can reference `accessGroup:<name>` across channel auth paths. ([#&#8203;75813](https://github.com/openclaw/openclaw/issues/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 [@&#8203;pashpashpash](https://github.com/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 [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev). - 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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;67935](https://github.com/openclaw/openclaw/issues/67935). Thanks [@&#8203;xiew4589-lang](https://github.com/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 [#&#8203;55047](https://github.com/openclaw/openclaw/issues/55047) and [#&#8203;54439](https://github.com/openclaw/openclaw/issues/54439); supersedes [#&#8203;54550](https://github.com/openclaw/openclaw/issues/54550) and [#&#8203;54552](https://github.com/openclaw/openclaw/issues/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 [#&#8203;76050](https://github.com/openclaw/openclaw/issues/76050). ([#&#8203;76051](https://github.com/openclaw/openclaw/issues/76051)) Thanks [@&#8203;Neomail2](https://github.com/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 [#&#8203;75687](https://github.com/openclaw/openclaw/issues/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 [@&#8203;rolandrscheel](https://github.com/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 [#&#8203;70991](https://github.com/openclaw/openclaw/issues/70991). Thanks [@&#8203;alexandre-leng](https://github.com/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. ([#&#8203;75729](https://github.com/openclaw/openclaw/issues/75729)) Thanks [@&#8203;hxy91819](https://github.com/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 [#&#8203;52147](https://github.com/openclaw/openclaw/issues/52147). ([#&#8203;75873](https://github.com/openclaw/openclaw/issues/75873)) Thanks [@&#8203;simonusa](https://github.com/simonusa). - Docker: copy Bun 1.3.13 from a digest-pinned image and keep CI on the same version. Fixes [#&#8203;74356](https://github.com/openclaw/openclaw/issues/74356). Thanks [@&#8203;fede-kamel](https://github.com/fede-kamel) and [@&#8203;sallyom](https://github.com/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. ([#&#8203;76056](https://github.com/openclaw/openclaw/issues/76056)) Thanks [@&#8203;openperf](https://github.com/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 [#&#8203;75894](https://github.com/openclaw/openclaw/issues/75894). Thanks [@&#8203;shandutta](https://github.com/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 [#&#8203;76072](https://github.com/openclaw/openclaw/issues/76072). Thanks [@&#8203;kvncrw](https://github.com/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 [#&#8203;76052](https://github.com/openclaw/openclaw/issues/76052). Thanks [@&#8203;anyech](https://github.com/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 [#&#8203;75999](https://github.com/openclaw/openclaw/issues/75999); supersedes [#&#8203;76061](https://github.com/openclaw/openclaw/issues/76061). Thanks [@&#8203;zackchiutw](https://github.com/zackchiutw) and [@&#8203;STLI69](https://github.com/STLI69). - Control UI/WebChat: use high-contrast text selection colors so highlighted chat text stays visible across themes. Fixes [#&#8203;60850](https://github.com/openclaw/openclaw/issues/60850); supersedes [#&#8203;60854](https://github.com/openclaw/openclaw/issues/60854). Thanks [@&#8203;Badschaff](https://github.com/Badschaff) and [@&#8203;efe-arv](https://github.com/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 [#&#8203;75845](https://github.com/openclaw/openclaw/issues/75845) and [#&#8203;76049](https://github.com/openclaw/openclaw/issues/76049). Thanks [@&#8203;MatthewSchleder](https://github.com/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 [#&#8203;75456](https://github.com/openclaw/openclaw/issues/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 [#&#8203;75405](https://github.com/openclaw/openclaw/issues/75405); supersedes [#&#8203;75558](https://github.com/openclaw/openclaw/issues/75558). Thanks [@&#8203;ziptbm](https://github.com/ziptbm) and [@&#8203;yfge](https://github.com/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 [#&#8203;73517](https://github.com/openclaw/openclaw/issues/73517) and [#&#8203;75708](https://github.com/openclaw/openclaw/issues/75708); supersedes [#&#8203;74406](https://github.com/openclaw/openclaw/issues/74406) and [#&#8203;75709](https://github.com/openclaw/openclaw/issues/75709). Thanks [@&#8203;Lightningxxl](https://github.com/Lightningxxl), [@&#8203;glfruit](https://github.com/glfruit), and [@&#8203;jared-rebel](https://github.com/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 [#&#8203;45438](https://github.com/openclaw/openclaw/issues/45438). Thanks [@&#8203;markus-lassfolk](https://github.com/markus-lassfolk). - Models CLI: restore `openclaw models list --provider <id>` catalog and registry fallback rows for unconfigured providers, so provider-specific verification commands no longer report "No models found." Fixes [#&#8203;75517](https://github.com/openclaw/openclaw/issues/75517); supersedes [#&#8203;75615](https://github.com/openclaw/openclaw/issues/75615). Thanks [@&#8203;lotsoftick](https://github.com/lotsoftick) and [@&#8203;koshaji](https://github.com/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 [#&#8203;75233](https://github.com/openclaw/openclaw/issues/75233); supersedes [#&#8203;75246](https://github.com/openclaw/openclaw/issues/75246). Thanks [@&#8203;nphyde2](https://github.com/nphyde2). - Slack/hooks: preserve bot alert attachment text in message-received hook content when command text is blank. Fixes [#&#8203;76035](https://github.com/openclaw/openclaw/issues/76035); refs [#&#8203;76036](https://github.com/openclaw/openclaw/issues/76036). Thanks [@&#8203;amsminn](https://github.com/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 [#&#8203;68554](https://github.com/openclaw/openclaw/issues/68554). Thanks [@&#8203;henkterharmsel](https://github.com/henkterharmsel). - Control UI/chat: show inline feedback when local slash-command dispatch is unavailable or fails unexpectedly instead of clearing the composer silently. Fixes [#&#8203;52105](https://github.com/openclaw/openclaw/issues/52105). Thanks [@&#8203;MooreQiao](https://github.com/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 [#&#8203;75491](https://github.com/openclaw/openclaw/issues/75491); supersedes [#&#8203;75495](https://github.com/openclaw/openclaw/issues/75495), [#&#8203;75810](https://github.com/openclaw/openclaw/issues/75810), and [#&#8203;76008](https://github.com/openclaw/openclaw/issues/76008). Thanks [@&#8203;asaenokkostya-coder](https://github.com/asaenokkostya-coder), [@&#8203;ottodeng](https://github.com/ottodeng), [@&#8203;everettjf](https://github.com/everettjf), and [@&#8203;lrg913427-dot](https://github.com/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 [@&#8203;rayraiser](https://github.com/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 [#&#8203;75452](https://github.com/openclaw/openclaw/issues/75452). Thanks [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt). - Model commands: clarify direct and inline `/model` acknowledgements for non-default selections as session-scoped. Thanks [@&#8203;addu2612](https://github.com/addu2612). - Doctor/gateway: stop warning that non-existent, unconfigured user-bin directories are required in the Gateway service PATH. Fixes [#&#8203;76017](https://github.com/openclaw/openclaw/issues/76017). Thanks [@&#8203;xiphis](https://github.com/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 [@&#8203;547895019](https://github.com/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 [#&#8203;75154](https://github.com/openclaw/openclaw/issues/75154). Thanks [@&#8203;Nimraakram22](https://github.com/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 [@&#8203;Kenneth8128](https://github.com/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 [#&#8203;74212](https://github.com/openclaw/openclaw/issues/74212). Thanks [@&#8203;da22le123](https://github.com/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 [@&#8203;ScientificProgrammer](https://github.com/ScientificProgrammer). - Voice Call: summarize restored-call verification logs during startup while preserving expired-call cleanup, reducing duplicate per-call skip messages. Thanks [@&#8203;jckm14](https://github.com/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 [#&#8203;61756](https://github.com/openclaw/openclaw/issues/61756). Thanks [@&#8203;DmitryPogodaev](https://github.com/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 [@&#8203;davidangularme](https://github.com/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 [#&#8203;76018](https://github.com/openclaw/openclaw/issues/76018). Thanks [@&#8203;cloph-dsp](https://github.com/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 [#&#8203;76007](https://github.com/openclaw/openclaw/issues/76007). Thanks [@&#8203;vliuyt](https://github.com/vliuyt). - fix(infra): block workspace state-directory env override \[AI]. ([#&#8203;75940](https://github.com/openclaw/openclaw/issues/75940)) Thanks [@&#8203;pgondhi987](https://github.com/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 [#&#8203;75362](https://github.com/openclaw/openclaw/issues/75362). Thanks [@&#8203;tolkonepiu](https://github.com/tolkonepiu) and [@&#8203;SymbolStar](https://github.com/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 [#&#8203;47311](https://github.com/openclaw/openclaw/issues/47311). Thanks [@&#8203;jmomford](https://github.com/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 [#&#8203;73758](https://github.com/openclaw/openclaw/issues/73758). Thanks [@&#8203;yfge](https://github.com/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 [#&#8203;75853](https://github.com/openclaw/openclaw/issues/75853). Thanks [@&#8203;midobk](https://github.com/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 [#&#8203;48554](https://github.com/openclaw/openclaw/issues/48554). Thanks [@&#8203;dco5](https://github.com/dco5). - Discord: allow explicitly configured ack reactions in tool-only guild channels while keeping automatic lifecycle/status reactions suppressed. Fixes [#&#8203;74922](https://github.com/openclaw/openclaw/issues/74922). Thanks [@&#8203;samvilian](https://github.com/samvilian) and [@&#8203;BlueBirdBack](https://github.com/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 [#&#8203;42652](https://github.com/openclaw/openclaw/issues/42652); refs [#&#8203;51626](https://github.com/openclaw/openclaw/issues/51626) and [#&#8203;44773](https://github.com/openclaw/openclaw/issues/44773); supersedes [#&#8203;73975](https://github.com/openclaw/openclaw/issues/73975). Thanks [@&#8203;irchelper](https://github.com/irchelper), [@&#8203;dpalfox](https://github.com/dpalfox), and [@&#8203;Lanfei](https://github.com/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 [#&#8203;47788](https://github.com/openclaw/openclaw/issues/47788). Thanks [@&#8203;Eldersonar](https://github.com/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 [#&#8203;58216](https://github.com/openclaw/openclaw/issues/58216); supersedes [#&#8203;73949](https://github.com/openclaw/openclaw/issues/73949). Thanks [@&#8203;Perttulands](https://github.com/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 [#&#8203;58986](https://github.com/openclaw/openclaw/issues/58986); supersedes [#&#8203;62057](https://github.com/openclaw/openclaw/issues/62057). Thanks [@&#8203;jb510](https://github.com/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 [@&#8203;Squirbie](https://github.com/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 [@&#8203;FunJim](https://github.com/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 [#&#8203;59744](https://github.com/openclaw/openclaw/issues/59744). Thanks [@&#8203;xela92](https://github.com/xela92) and [@&#8203;rockcent](https://github.com/rockcent). - Discord: preserve non-ASCII channel names in session display labels while keeping allowlist matching on the existing ASCII slug contract. Thanks [@&#8203;swjeong9](https://github.com/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 [@&#8203;acgh213](https://github.com/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 [#&#8203;41355](https://github.com/openclaw/openclaw/issues/41355); supersedes [#&#8203;44447](https://github.com/openclaw/openclaw/issues/44447) and [#&#8203;44449](https://github.com/openclaw/openclaw/issues/44449). Thanks [@&#8203;p3nchan](https://github.com/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 [@&#8203;mgh3326](https://github.com/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 [#&#8203;75797](https://github.com/openclaw/openclaw/issues/75797). Thanks [@&#8203;ymebosma](https://github.com/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 [#&#8203;74128](https://github.com/openclaw/openclaw/issues/74128); supersedes [#&#8203;73486](https://github.com/openclaw/openclaw/issues/73486). Thanks [@&#8203;ctbritt](https://github.com/ctbritt) and [@&#8203;alprclbi](https://github.com/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 [#&#8203;72208](https://github.com/openclaw/openclaw/issues/72208). Thanks [@&#8203;rzcq](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;73427](https://github.com/openclaw/openclaw/issues/73427). - Plugins: clarify config-selected duplicate plugin override diagnostics and document manifest schema updates for bundled-plugin forks. Fixes [#&#8203;8582](https://github.com/openclaw/openclaw/issues/8582). Thanks [@&#8203;sachah](https://github.com/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 [#&#8203;75838](https://github.com/openclaw/openclaw/issues/75838). Thanks [@&#8203;hcordoba840](https://github.com/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.<chatId>.threadReplies`. Fixes [#&#8203;75975](https://github.com/openclaw/openclaw/issues/75975). Thanks [@&#8203;ProjectEvolutionEVE](https://github.com/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 [#&#8203;76013](https://github.com/openclaw/openclaw/issues/76013). Thanks [@&#8203;iaki1206](https://github.com/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 [#&#8203;74032](https://github.com/openclaw/openclaw/issues/74032); updates [#&#8203;6457](https://github.com/openclaw/openclaw/issues/6457). Thanks [@&#8203;dae-sun](https://github.com/dae-sun) and [@&#8203;WouldenShyp](https://github.com/WouldenShyp). - Providers/OpenAI: resolve `keychain:<service>:<account>` `OPENAI_API_KEY` refs before creating OpenAI Realtime browser sessions or voice bridges, with a bounded cached Keychain lookup. Fixes [#&#8203;72120](https://github.com/openclaw/openclaw/issues/72120). Thanks [@&#8203;ctbritt](https://github.com/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 [#&#8203;74617](https://github.com/openclaw/openclaw/issues/74617). Thanks [@&#8203;zeeskdr-ai](https://github.com/zeeskdr-ai). - Voice Call: add `sessionScope: "per-call"` for fresh per-call agent memory while preserving the default per-phone caller history. Fixes [#&#8203;45280](https://github.com/openclaw/openclaw/issues/45280). Thanks [@&#8203;pondcountry](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [#&#8203;70014](https://github.com/openclaw/openclaw/issues/70014). Thanks [@&#8203;ttomiczek](https://github.com/ttomiczek). - Control UI: add tab/RPC timing attribution and decouple slow Overview/Cron secondary refreshes so Sessions navigation gets immediate visible feedback. Refs [#&#8203;64004](https://github.com/openclaw/openclaw/issues/64004). Thanks [@&#8203;WaMaSeDu](https://github.com/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 [#&#8203;64187](https://github.com/openclaw/openclaw/issues/64187). Thanks [@&#8203;kunpeng-ai-lab](https://github.com/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 [#&#8203;75783](https://github.com/openclaw/openclaw/issues/75783). Thanks [@&#8203;tankotan](https://github.com/tankotan). - Telegram/models: make model picker confirmations say selections are session-scoped and do not change the agent's persistent default. Fixes [#&#8203;75965](https://github.com/openclaw/openclaw/issues/75965). Thanks [@&#8203;sd1114820](https://github.com/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 [#&#8203;75987](https://github.com/openclaw/openclaw/issues/75987). Thanks [@&#8203;novkien](https://github.com/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 [#&#8203;66366](https://github.com/openclaw/openclaw/issues/66366). Thanks [@&#8203;Promee-ThaBossHoss](https://github.com/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 [#&#8203;62820](https://github.com/openclaw/openclaw/issues/62820). Thanks [@&#8203;canh0chua](https://github.com/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 [#&#8203;73569](https://github.com/openclaw/openclaw/issues/73569) and supersedes [#&#8203;73593](https://github.com/openclaw/openclaw/issues/73593), [#&#8203;74288](https://github.com/openclaw/openclaw/issues/74288), and [#&#8203;74495](https://github.com/openclaw/openclaw/issues/74495). Thanks [@&#8203;bittoby](https://github.com/bittoby), [@&#8203;tmimmanuel](https://github.com/tmimmanuel), [@&#8203;Linux2010](https://github.com/Linux2010), and [@&#8203;vyctorbrzezowski](https://github.com/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 [#&#8203;70420](https://github.com/openclaw/openclaw/issues/70420). Thanks [@&#8203;ashersoutherncities-art](https://github.com/ashersoutherncities-art) and [@&#8203;martingarramon](https://github.com/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 [#&#8203;62339](https://github.com/openclaw/openclaw/issues/62339). Thanks [@&#8203;kelvinisly-collab](https://github.com/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 [#&#8203;75950](https://github.com/openclaw/openclaw/issues/75950). Thanks [@&#8203;actual-software-inc](https://github.com/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 [#&#8203;59545](https://github.com/openclaw/openclaw/issues/59545). Thanks [@&#8203;Tengdw](https://github.com/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. ([#&#8203;75363](https://github.com/openclaw/openclaw/issues/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 [#&#8203;75843](https://github.com/openclaw/openclaw/issues/75843). Thanks [@&#8203;vishutdhar](https://github.com/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 [#&#8203;75513](https://github.com/openclaw/openclaw/issues/75513). Thanks [@&#8203;jochen](https://github.com/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 [#&#8203;73646](https://github.com/openclaw/openclaw/issues/73646) and supersedes [#&#8203;73928](https://github.com/openclaw/openclaw/issues/73928) and [#&#8203;74059](https://github.com/openclaw/openclaw/issues/74059). Thanks [@&#8203;bittoby](https://github.com/bittoby), [@&#8203;luyao618](https://github.com/luyao618), and [@&#8203;Linux2010](https://github.com/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 [#&#8203;61426](https://github.com/openclaw/openclaw/issues/61426). Thanks [@&#8203;Lihannon](https://github.com/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 [#&#8203;73550](https://github.com/openclaw/openclaw/issues/73550). Thanks [@&#8203;sylviazhang2006-design](https://github.com/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 [#&#8203;55196](https://github.com/openclaw/openclaw/issues/55196). Thanks [@&#8203;mecampbellsoup](https://github.com/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 [#&#8203;19075](https://github.com/openclaw/openclaw/issues/19075). Thanks [@&#8203;jkoprax](https://github.com/jkoprax) and [@&#8203;vishnukool](https://github.com/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 [#&#8203;53092](https://github.com/openclaw/openclaw/issues/53092). Thanks [@&#8203;TinyTb](https://github.com/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 [#&#8203;73552](https://github.com/openclaw/openclaw/issues/73552). Thanks [@&#8203;Loukky](https://github.com/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 [#&#8203;75992](https://github.com/openclaw/openclaw/issues/75992). Thanks [@&#8203;DmitryPogodaev](https://github.com/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 [#&#8203;44077](https://github.com/openclaw/openclaw/issues/44077). Thanks [@&#8203;patosullivan](https://github.com/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 [#&#8203;69599](https://github.com/openclaw/openclaw/issues/69599). Thanks [@&#8203;WolvenRA](https://github.com/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 [#&#8203;75753](https://github.com/openclaw/openclaw/issues/75753). Thanks [@&#8203;RyanSandoval](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;75305](https://github.com/openclaw/openclaw/issues/75305). Thanks [@&#8203;sableassistant3777-source](https://github.com/sableassistant3777-source). - Plugin SDK: re-export `isPrivateIpAddress` from `plugin-sdk/ssrf-runtime`, restoring source-checkout builds for SearXNG and Firecrawl private-network guards. Thanks [@&#8203;vincentkoc](https://github.com/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 [#&#8203;60652](https://github.com/openclaw/openclaw/issues/60652) and supersedes [#&#8203;60808](https://github.com/openclaw/openclaw/issues/60808), [#&#8203;61087](https://github.com/openclaw/openclaw/issues/61087), and [#&#8203;61100](https://github.com/openclaw/openclaw/issues/61100). Thanks [@&#8203;claw-io](https://github.com/claw-io), [@&#8203;efe-arv](https://github.com/efe-arv), [@&#8203;joelnishanth](https://github.com/joelnishanth), and [@&#8203;sjhddh](https://github.com/sjhddh). - Sessions: suppress exact inter-session control replies such as `NO_REPLY` and keep agent-to-agent announce bookkeeping out of visible transcripts. Fixes [#&#8203;53145](https://github.com/openclaw/openclaw/issues/53145). Thanks [@&#8203;TarahAssistant](https://github.com/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 [#&#8203;75770](https://github.com/openclaw/openclaw/issues/75770). Thanks [@&#8203;lawong888](https://github.com/lawong888). - Web search/SearXNG: show the JSON API `search.formats` prerequisite during SearXNG setup before prompting for the base URL. Supersedes [#&#8203;65592](https://github.com/openclaw/openclaw/issues/65592). Thanks [@&#8203;evanpaul14](https://github.com/evanpaul14). - Web search/SearXNG: pass through `img_src` image URLs from SearXNG image-category results. Supersedes [#&#8203;61416](https://github.com/openclaw/openclaw/issues/61416). Thanks [@&#8203;sghael](https://github.com/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 [#&#8203;52573](https://github.com/openclaw/openclaw/issues/52573). Thanks [@&#8203;wangwllu](https://github.com/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 [#&#8203;74357](https://github.com/openclaw/openclaw/issues/74357) and supersedes [#&#8203;74360](https://github.com/openclaw/openclaw/issues/74360). Thanks [@&#8203;fede-kamel](https://github.com/fede-kamel). - Firecrawl: reject private, loopback, metadata, and non-HTTP(S) `firecrawl_scrape` target URLs before forwarding them to Firecrawl. Supersedes [#&#8203;48133](https://github.com/openclaw/openclaw/issues/48133). Thanks [@&#8203;kn1ghtc](https://github.com/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 [#&#8203;63877](https://github.com/openclaw/openclaw/issues/63877) and supersedes [#&#8203;59666](https://github.com/openclaw/openclaw/issues/59666), [#&#8203;63941](https://github.com/openclaw/openclaw/issues/63941), and [#&#8203;74013](https://github.com/openclaw/openclaw/issues/74013). Thanks [@&#8203;jhthompson12](https://github.com/jhthompson12), [@&#8203;jzakirov](https://github.com/jzakirov), [@&#8203;Mlightsnow](https://github.com/Mlightsnow), and [@&#8203;shad0wca7](https://github.com/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 [#&#8203;69527](https://github.com/openclaw/openclaw/issues/69527). Thanks [@&#8203;alexifra](https://github.com/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 [#&#8203;75395](https://github.com/openclaw/openclaw/issues/75395). Thanks [@&#8203;sbmilburn](https://github.com/sbmilburn). - Voice Call: add per-number inbound routing for dialed-number greetings, response agents/models/prompts, and TTS voice overrides. Fixes [#&#8203;56604](https://github.com/openclaw/openclaw/issues/56604). Thanks [@&#8203;healthstatus](https://github.com/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 [#&#8203;73860](https://github.com/openclaw/openclaw/issues/73860). Thanks [@&#8203;desksk](https://github.com/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 [@&#8203;mariozechner](https://github.com/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 [#&#8203;54928](https://github.com/openclaw/openclaw/issues/54928) and supersedes [#&#8203;54939](https://github.com/openclaw/openclaw/issues/54939). Thanks [@&#8203;mrpl327](https://github.com/mrpl327) and [@&#8203;lyfuci](https://github.com/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 [#&#8203;65828](https://github.com/openclaw/openclaw/issues/65828). Thanks [@&#8203;Jah-yee](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugins/ClawHub: install package runtime dependencies for archive-backed plugin installs, so ClawHub packages such as WhatsApp load declared dependencies after download. Thanks [@&#8203;vincentkoc](https://github.com/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 [#&#8203;75956](https://github.com/openclaw/openclaw/issues/75956). Thanks [@&#8203;Linux2010](https://github.com/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 [#&#8203;75921](https://github.com/openclaw/openclaw/issues/75921). Thanks [@&#8203;garyd9](https://github.com/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 [@&#8203;mariozechner](https://github.com/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 [#&#8203;75904](https://github.com/openclaw/openclaw/issues/75904). Thanks [@&#8203;highfly-hi](https://github.com/highfly-hi) and [@&#8203;neeravmakwana](https://github.com/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 [#&#8203;58088](https://github.com/openclaw/openclaw/issues/58088). Thanks [@&#8203;drinkflav](https://github.com/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 [#&#8203;65768](https://github.com/openclaw/openclaw/issues/65768). Thanks [@&#8203;kikibrian](https://github.com/kikibrian) and [@&#8203;zhouhe-xydt](https://github.com/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 [#&#8203;65054](https://github.com/openclaw/openclaw/issues/65054). Thanks [@&#8203;sixone74](https://github.com/sixone74) and [@&#8203;Yanhu007](https://github.com/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 [#&#8203;73956](https://github.com/openclaw/openclaw/issues/73956). Thanks [@&#8203;HemantSudarshan](https://github.com/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 [#&#8203;52496](https://github.com/openclaw/openclaw/issues/52496). Thanks [@&#8203;barry-p5cc](https://github.com/barry-p5cc). - Subagents: honor `sessions_spawn` with `expectsCompletionMessage: false` by skipping parent completion handoff delivery while still running child cleanup. Fixes [#&#8203;75848](https://github.com/openclaw/openclaw/issues/75848). Thanks [@&#8203;alfredjbclaw](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;65685](https://github.com/openclaw/openclaw/issues/65685). Thanks [@&#8203;papag00se](https://github.com/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 [#&#8203;60780](https://github.com/openclaw/openclaw/issues/60780). Thanks [@&#8203;solavrc](https://github.com/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 [#&#8203;52005](https://github.com/openclaw/openclaw/issues/52005). Thanks [@&#8203;acgh213](https://github.com/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 [#&#8203;48450](https://github.com/openclaw/openclaw/issues/48450). Thanks [@&#8203;dahifi](https://github.com/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 [#&#8203;54227](https://github.com/openclaw/openclaw/issues/54227). Thanks [@&#8203;fujiwarakasei](https://github.com/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 [#&#8203;75631](https://github.com/openclaw/openclaw/issues/75631). Thanks [@&#8203;Fuma2013](https://github.com/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 [#&#8203;63195](https://github.com/openclaw/openclaw/issues/63195), [#&#8203;68162](https://github.com/openclaw/openclaw/issues/68162), and [#&#8203;73546](https://github.com/openclaw/openclaw/issues/73546). Thanks [@&#8203;bond260312-cmyk](https://github.com/bond260312-cmyk), [@&#8203;zhong18804784882](https://github.com/zhong18804784882), and [@&#8203;mtuwei](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [#&#8203;47516](https://github.com/openclaw/openclaw/issues/47516). Thanks [@&#8203;x4v13r1120](https://github.com/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 [#&#8203;75849](https://github.com/openclaw/openclaw/issues/75849). Thanks [@&#8203;alfredjbclaw](https://github.com/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 [#&#8203;73505](https://github.com/openclaw/openclaw/issues/73505). Thanks [@&#8203;choury](https://github.com/choury). - Config: log the "newer OpenClaw" version warning once per process instead of once per config snapshot read. ([#&#8203;75927](https://github.com/openclaw/openclaw/issues/75927)) Thanks [@&#8203;romneyda](https://github.com/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 [#&#8203;73726](https://github.com/openclaw/openclaw/issues/73726). Thanks [@&#8203;Avicennasis](https://github.com/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 [#&#8203;75868](https://github.com/openclaw/openclaw/issues/75868). Thanks [@&#8203;zhengsx](https://github.com/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 [#&#8203;75850](https://github.com/openclaw/openclaw/issues/75850). Thanks [@&#8203;alfredjbclaw](https://github.com/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 [#&#8203;75182](https://github.com/openclaw/openclaw/issues/75182). Thanks [@&#8203;TnzGit](https://github.com/TnzGit) and [@&#8203;hclsys](https://github.com/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 [#&#8203;72097](https://github.com/openclaw/openclaw/issues/72097). - Cron: make scheduler reload schedule comparison tolerate malformed persisted jobs, so one bad cron entry no longer aborts the whole tick. Fixes [#&#8203;75886](https://github.com/openclaw/openclaw/issues/75886). Thanks [@&#8203;samfox-ai](https://github.com/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 [#&#8203;74298](https://github.com/openclaw/openclaw/issues/74298). Thanks [@&#8203;lolaopenclaw](https://github.com/lolaopenclaw). - Gateway/diagnostics: keep idle liveness samples in telemetry instead of visible warning logs unless diagnostic work is active, waiting, or queued. Thanks [@&#8203;vincentkoc](https://github.com/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 [#&#8203;56839](https://github.com/openclaw/openclaw/issues/56839). Thanks [@&#8203;bencoremans](https://github.com/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 [#&#8203;73716](https://github.com/openclaw/openclaw/issues/73716). Thanks [@&#8203;teebes](https://github.com/teebes). - CLI/models: reject `--agent` on `openclaw models set` and `set-image` instead of silently writing agent-scoped requests to global model defaults. Fixes [#&#8203;68391](https://github.com/openclaw/openclaw/issues/68391). Thanks [@&#8203;derrickabellard](https://github.com/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 [#&#8203;64732](https://github.com/openclaw/openclaw/issues/64732). Thanks [@&#8203;efe-arv](https://github.com/efe-arv), [@&#8203;SweetSophia](https://github.com/SweetSophia), and [@&#8203;hashtag1974](https://github.com/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 [#&#8203;55966](https://github.com/openclaw/openclaw/issues/55966). Thanks [@&#8203;OpenCodeEngineer](https://github.com/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 [#&#8203;74752](https://github.com/openclaw/openclaw/issues/74752). Thanks [@&#8203;Loveworld3033](https://github.com/Loveworld3033) and [@&#8203;andyliu](https://github.com/andyliu). - TTS: require explicit user or config audio intent for the agent speech tool so dashboard chats stay text unless audio is requested. Fixes [#&#8203;69777](https://github.com/openclaw/openclaw/issues/69777). Thanks [@&#8203;alexandre-leng](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Heartbeat: strip legacy `[TOOL_CALL]...[/TOOL_CALL]` and `[TOOL_RESULT]...[/TOOL_RESULT]` pseudo-call blocks from heartbeat replies before channel delivery. Fixes [#&#8203;54138](https://github.com/openclaw/openclaw/issues/54138). Thanks [@&#8203;Deniable9570](https://github.com/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 [#&#8203;51040](https://github.com/openclaw/openclaw/issues/51040). Thanks [@&#8203;carl-jeffrolc](https://github.com/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 [#&#8203;58063](https://github.com/openclaw/openclaw/issues/58063) and [#&#8203;58733](https://github.com/openclaw/openclaw/issues/58733). Thanks [@&#8203;dnishimura](https://github.com/dnishimura), [@&#8203;marvcasasola-svg](https://github.com/marvcasasola-svg), and [@&#8203;Nanako0129](https://github.com/Nanako0129). - Providers/configure: preserve the existing default model when adding or reauthing a provider whose plugin returns a default-model config patch. Fixes [#&#8203;50268](https://github.com/openclaw/openclaw/issues/50268). Thanks [@&#8203;rixcorp-oc](https://github.com/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 [#&#8203;51458](https://github.com/openclaw/openclaw/issues/51458). Thanks [@&#8203;HirokiKobayashi-R](https://github.com/HirokiKobayashi-R). - Slack/DMs: honor `dmHistoryLimit` for fresh 1:1 Slack DM sessions by backfilling recent conversation history before the current reply. Fixes [#&#8203;64427](https://github.com/openclaw/openclaw/issues/64427). Thanks [@&#8203;brantley-creator](https://github.com/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 [#&#8203;58832](https://github.com/openclaw/openclaw/issues/58832). Thanks [@&#8203;daye-jjeong](https://github.com/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 [#&#8203;62391](https://github.com/openclaw/openclaw/issues/62391). Thanks [@&#8203;alexey-pelykh](https://github.com/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 [#&#8203;44625](https://github.com/openclaw/openclaw/issues/44625). Thanks [@&#8203;Qquanwei](https://github.com/Qquanwei) and [@&#8203;martingarramon](https://github.com/martingarramon). - Slack/DMs: send text/block-only proactive DMs directly with `chat.postMessage(channel=<user id>)` while keeping conversation resolution for uploads and threaded sends. Fixes [#&#8203;62042](https://github.com/openclaw/openclaw/issues/62042). Thanks [@&#8203;MarkMolina](https://github.com/MarkMolina). - Slack/routing: match route bindings written with Slack target syntax such as `channel:C...`, `user:U...`, or `<@&#8203;U...>`, so bound Slack peers route to the configured agent instead of `main`. Fixes [#&#8203;41608](https://github.com/openclaw/openclaw/issues/41608). Thanks [@&#8203;Winnsolutionsadmin](https://github.com/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 [#&#8203;41264](https://github.com/openclaw/openclaw/issues/41264) and supersedes [#&#8203;56530](https://github.com/openclaw/openclaw/issues/56530). Thanks [@&#8203;babutree](https://github.com/babutree) and [@&#8203;Realworld404](https://github.com/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 [#&#8203;66807](https://github.com/openclaw/openclaw/issues/66807). Thanks [@&#8203;rijhsinghani](https://github.com/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 [#&#8203;68789](https://github.com/openclaw/openclaw/issues/68789). Thanks [@&#8203;sonnyb9](https://github.com/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 [#&#8203;64625](https://github.com/openclaw/openclaw/issues/64625). Thanks [@&#8203;benpchandler](https://github.com/benpchandler). - Slack/mentions: resolve `<!subteam^...>` 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 [#&#8203;73827](https://github.com/openclaw/openclaw/issues/73827). Thanks [@&#8203;CG-Intelligence-Agent-Jack](https://github.com/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 [#&#8203;53943](https://github.com/openclaw/openclaw/issues/53943). Thanks [@&#8203;zomars](https://github.com/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 [#&#8203;60600](https://github.com/openclaw/openclaw/issues/60600). Thanks [@&#8203;garagon](https://github.com/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 [#&#8203;72995](https://github.com/openclaw/openclaw/issues/72995). Thanks [@&#8203;RoseKongPS](https://github.com/RoseKongPS). - Web search: point missing-key errors to `web_fetch` for known URLs and the browser tool for interactive pages. Thanks [@&#8203;zhaoyang97](https://github.com/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 [#&#8203;75420](https://github.com/openclaw/openclaw/issues/75420). Thanks [@&#8203;richardmqq](https://github.com/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 [#&#8203;57496](https://github.com/openclaw/openclaw/issues/57496). Thanks [@&#8203;Aoiujz](https://github.com/Aoiujz). - Web search/Gemini: pass `freshness` and `date_after`/`date_before` filters through Google Search grounding time ranges. Fixes [#&#8203;66498](https://github.com/openclaw/openclaw/issues/66498). Thanks [@&#8203;ismael-81](https://github.com/ismael-81). - Web search/DuckDuckGo: include the keyless DuckDuckGo provider in the web search setup wizard. Fixes [#&#8203;65862](https://github.com/openclaw/openclaw/issues/65862) and supersedes [#&#8203;65940](https://github.com/openclaw/openclaw/issues/65940). Thanks [@&#8203;Jah-yee](https://github.com/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 [#&#8203;61972](https://github.com/openclaw/openclaw/issues/61972). Thanks [@&#8203;Lanfei](https://github.com/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 [#&#8203;65870](https://github.com/openclaw/openclaw/issues/65870) and supersedes [#&#8203;65892](https://github.com/openclaw/openclaw/issues/65892). Thanks [@&#8203;Magicray1217](https://github.com/Magicray1217) and [@&#8203;Jah-yee](https://github.com/Jah-yee). - Web search/Brave: allow `freshness` and bounded date ranges in `llm-context` mode, matching Brave's documented LLM Context API support. Supersedes [#&#8203;51005](https://github.com/openclaw/openclaw/issues/51005). Thanks [@&#8203;remusao](https://github.com/remusao). - Web fetch: resolve external plugin `webFetchProviders` for non-sandboxed `web_fetch`, while keeping sandboxed fetches limited to bundled providers. Fixes [#&#8203;74915](https://github.com/openclaw/openclaw/issues/74915). Thanks [@&#8203;ultrahighsuper](https://github.com/ultrahighsuper) and [@&#8203;mingmingtsao](https://github.com/mingmingtsao). - Heartbeat: strip legacy `[TOOL_CALL]...[/TOOL_CALL]` and `[TOOL_RESULT]...[/TOOL_RESULT]` pseudo-call blocks from heartbeat replies before channel delivery. Fixes [#&#8203;54138](https://github.com/openclaw/openclaw/issues/54138). Thanks [@&#8203;Deniable9570](https://github.com/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 [#&#8203;51040](https://github.com/openclaw/openclaw/issues/51040). Thanks [@&#8203;carl-jeffrolc](https://github.com/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 [#&#8203;58063](https://github.com/openclaw/openclaw/issues/58063) and [#&#8203;58733](https://github.com/openclaw/openclaw/issues/58733). Thanks [@&#8203;dnishimura](https://github.com/dnishimura), [@&#8203;marvcasasola-svg](https://github.com/marvcasasola-svg), and [@&#8203;Nanako0129](https://github.com/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 [#&#8203;50776](https://github.com/openclaw/openclaw/issues/50776). Thanks [@&#8203;pjaillon](https://github.com/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 [#&#8203;75877](https://github.com/openclaw/openclaw/issues/75877). Thanks [@&#8203;teosborne](https://github.com/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 [#&#8203;55358](https://github.com/openclaw/openclaw/issues/55358). Thanks [@&#8203;tonyjwinter](https://github.com/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 [#&#8203;63610](https://github.com/openclaw/openclaw/issues/63610). Thanks [@&#8203;canh0chua](https://github.com/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 [#&#8203;52442](https://github.com/openclaw/openclaw/issues/52442). Thanks [@&#8203;essendigitalgroup-cyber](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;75656](https://github.com/openclaw/openclaw/issues/75656). Thanks [@&#8203;DerFlash](https://github.com/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 [#&#8203;42533](https://github.com/openclaw/openclaw/issues/42533). Thanks [@&#8203;jbuecker](https://github.com/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 [#&#8203;75155](https://github.com/openclaw/openclaw/issues/75155). Thanks [@&#8203;SledderBling](https://github.com/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 [#&#8203;64986](https://github.com/openclaw/openclaw/issues/64986). Thanks [@&#8203;zoiks65](https://github.com/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 [#&#8203;52125](https://github.com/openclaw/openclaw/issues/52125). Thanks [@&#8203;kenchen3000](https://github.com/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 `<media:image>`. Fixes [#&#8203;59174](https://github.com/openclaw/openclaw/issues/59174). Thanks [@&#8203;gaffner](https://github.com/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 [#&#8203;11950](https://github.com/openclaw/openclaw/issues/11950), [#&#8203;6650](https://github.com/openclaw/openclaw/issues/6650), [#&#8203;15000](https://github.com/openclaw/openclaw/issues/15000). Thanks [@&#8203;amoghasgekar](https://github.com/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 [#&#8203;60204](https://github.com/openclaw/openclaw/issues/60204). Thanks [@&#8203;mySebbe](https://github.com/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 [#&#8203;65751](https://github.com/openclaw/openclaw/issues/65751). Thanks [@&#8203;theDanielJLewis](https://github.com/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 [#&#8203;67746](https://github.com/openclaw/openclaw/issues/67746). Thanks [@&#8203;123Mismail](https://github.com/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 [#&#8203;58114](https://github.com/openclaw/openclaw/issues/58114). Thanks [@&#8203;legonhilltech-jpg](https://github.com/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 [#&#8203;75805](https://github.com/openclaw/openclaw/issues/75805); refs [#&#8203;49603](https://github.com/openclaw/openclaw/issues/49603). Thanks [@&#8203;cdznho](https://github.com/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 [#&#8203;73095](https://github.com/openclaw/openclaw/issues/73095). ([#&#8203;73904](https://github.com/openclaw/openclaw/issues/73904)) Thanks [@&#8203;brokemac79](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;pashpashpash](https://github.com/pashpashpash). - Gateway/config: report failed backup restores as failed in logs and config observe audit records instead of marking them valid. ([#&#8203;70515](https://github.com/openclaw/openclaw/issues/70515)) Thanks [@&#8203;davidangularme](https://github.com/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 [#&#8203;64960](https://github.com/openclaw/openclaw/issues/64960). ([#&#8203;74470](https://github.com/openclaw/openclaw/issues/74470)) Thanks [@&#8203;jalehman](https://github.com/jalehman) and [@&#8203;OpenCodeEngineer](https://github.com/OpenCodeEngineer). - Gateway/config: allow `gateway config.patch` to update documented subagent thinking defaults. Fixes [#&#8203;75764](https://github.com/openclaw/openclaw/issues/75764). ([#&#8203;75802](https://github.com/openclaw/openclaw/issues/75802)) Thanks [@&#8203;kAIborg24](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;75458](https://github.com/openclaw/openclaw/issues/75458). Thanks [@&#8203;davelutztx](https://github.com/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 [#&#8203;62455](https://github.com/openclaw/openclaw/issues/62455). Thanks [@&#8203;lobster-biscuit](https://github.com/lobster-biscuit). - Discord/DMs: set inbound direct-message `ctx.To` to the semantic `user:<id>` target while keeping delivery routed through the DM channel, so mirror and recovery paths do not treat DMs as channel conversations. Fixes [#&#8203;68126](https://github.com/openclaw/openclaw/issues/68126). Thanks [@&#8203;illuminate0623](https://github.com/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 [#&#8203;59817](https://github.com/openclaw/openclaw/issues/59817). Thanks [@&#8203;DooPeePey](https://github.com/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 [#&#8203;52396](https://github.com/openclaw/openclaw/issues/52396). Thanks [@&#8203;sunshineo](https://github.com/sunshineo). - Discord: include Components v2 Text Display content from referenced replies and forwarded snapshots, so component-only messages still appear in reply context. Fixes [#&#8203;56228](https://github.com/openclaw/openclaw/issues/56228). Thanks [@&#8203;HollandDrive](https://github.com/HollandDrive). - Discord: add configurable gateway READY timeouts for startup and runtime reconnects, so staggered multi-account setups can avoid false restart loops. Fixes [#&#8203;72273](https://github.com/openclaw/openclaw/issues/72273). Thanks [@&#8203;sergionsantos](https://github.com/sergionsantos). - Discord: preserve native slash-command description localizations through command reconcile, so localized Discord descriptions no longer get overwritten by English defaults. Fixes [#&#8203;56580](https://github.com/openclaw/openclaw/issues/56580). Thanks [@&#8203;mhseo93](https://github.com/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 [#&#8203;67587](https://github.com/openclaw/openclaw/issues/67587). Thanks [@&#8203;McoreD](https://github.com/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/@&#8203;me` lookup. Fixes [#&#8203;75341](https://github.com/openclaw/openclaw/issues/75341). Thanks [@&#8203;PrinceOfEgypt](https://github.com/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 [#&#8203;59881](https://github.com/openclaw/openclaw/issues/59881). Thanks [@&#8203;bradfreels](https://github.com/bradfreels). - Gateway/config: log config health-state write failures instead of silently hiding config observe-recovery write errors. Thanks [@&#8203;sallyom](https://github.com/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 [#&#8203;72010](https://github.com/openclaw/openclaw/issues/72010). Thanks [@&#8203;rubencu](https://github.com/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 [#&#8203;75882](https://github.com/openclaw/openclaw/issues/75882), [#&#8203;75907](https://github.com/openclaw/openclaw/issues/75907), [#&#8203;75906](https://github.com/openclaw/openclaw/issues/75906), [#&#8203;75887](https://github.com/openclaw/openclaw/issues/75887), and [#&#8203;75851](https://github.com/openclaw/openclaw/issues/75851). ([#&#8203;75922](https://github.com/openclaw/openclaw/issues/75922)) Thanks [@&#8203;obviyus](https://github.com/obviyus). - Agents/failover: classify bare `status: internal server error` provider messages as retryable server errors so model fallback can rotate instead of stopping. ([#&#8203;73844](https://github.com/openclaw/openclaw/issues/73844)) Thanks [@&#8203;thesomewhatyou](https://github.com/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. ([#&#8203;76012](https://github.com/openclaw/openclaw/issues/76012)) Thanks [@&#8203;scoootscooob](https://github.com/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. ([#&#8203;70629](https://github.com/openclaw/openclaw/issues/70629)) Thanks [@&#8203;ericberic](https://github.com/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 [#&#8203;74141](https://github.com/openclaw/openclaw/issues/74141). ([#&#8203;72306](https://github.com/openclaw/openclaw/issues/72306)) Thanks [@&#8203;bittoby](https://github.com/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 [#&#8203;75964](https://github.com/openclaw/openclaw/issues/75964). ([#&#8203;76083](https://github.com/openclaw/openclaw/issues/76083)) Thanks [@&#8203;kshetrajna12](https://github.com/kshetrajna12) and [@&#8203;xuruiray](https://github.com/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 [#&#8203;76071](https://github.com/openclaw/openclaw/issues/76071). ([#&#8203;76080](https://github.com/openclaw/openclaw/issues/76080)) Thanks [@&#8203;marcoschierhorn](https://github.com/marcoschierhorn) and [@&#8203;zhangguiping-xydt](https://github.com/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. ([#&#8203;75983](https://github.com/openclaw/openclaw/issues/75983)) Thanks [@&#8203;mbelinky](https://github.com/mbelinky). ### [`v2026.4.29`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#2026429) [Compare Source](https://github.com/openclaw/openclaw/compare/v2026.4.27...v2026.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 [@&#8203;vincentkoc](https://github.com/vincentkoc), [@&#8203;scoootscooob](https://github.com/scoootscooob), [@&#8203;samzong](https://github.com/samzong), and [@&#8203;vignesh07](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc), [@&#8203;quengh](https://github.com/quengh), [@&#8203;joeykrug](https://github.com/joeykrug), and [@&#8203;samzong](https://github.com/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 [@&#8203;eleqtrizit](https://github.com/eleqtrizit), [@&#8203;shakkernerd](https://github.com/shakkernerd), [@&#8203;prasad-yashdeep](https://github.com/prasad-yashdeep), [@&#8203;woodhouse-bot](https://github.com/woodhouse-bot), and [@&#8203;LyHug](https://github.com/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 [@&#8203;lpendeavors](https://github.com/lpendeavors), [@&#8203;DerFlash](https://github.com/DerFlash), [@&#8203;vincentkoc](https://github.com/vincentkoc), [@&#8203;pashpashpash](https://github.com/pashpashpash), and [@&#8203;jhsmith409](https://github.com/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 [@&#8203;slackapi](https://github.com/slackapi), [@&#8203;SymbolStar](https://github.com/SymbolStar), [@&#8203;djgeorg3](https://github.com/djgeorg3), [@&#8203;TinyTb](https://github.com/TinyTb), [@&#8203;dseravalli](https://github.com/dseravalli), [@&#8203;nklock](https://github.com/nklock), and [@&#8203;alex-xuweilong](https://github.com/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 [@&#8203;jesse-merhi](https://github.com/jesse-merhi), [@&#8203;pgondhi987](https://github.com/pgondhi987), [@&#8203;mmaps](https://github.com/mmaps), [@&#8203;jinjimz](https://github.com/jinjimz), and [@&#8203;jeffrey701](https://github.com/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 [@&#8203;mariozechner](https://github.com/mariozechner). - Agents/workspace: add `agents.defaults.skipOptionalBootstrapFiles` for skipping selected optional workspace files during bootstrap without disabling required workspace setup. ([#&#8203;62110](https://github.com/openclaw/openclaw/issues/62110)) Thanks [@&#8203;mainstay22](https://github.com/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 [@&#8203;badlogic](https://github.com/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 [#&#8203;72478](https://github.com/openclaw/openclaw/issues/72478). Thanks [@&#8203;DougButdorf](https://github.com/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 [@&#8203;donkeykong91](https://github.com/donkeykong91) and [@&#8203;PfanP](https://github.com/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 [@&#8203;guti](https://github.com/guti). - Gateway/SDK: add SDK-facing tools.invoke RPC with shared HTTP policy, typed approval/refusal results, and SDK helper support. Refs [#&#8203;74705](https://github.com/openclaw/openclaw/issues/74705). Thanks [@&#8203;BunsDev](https://github.com/BunsDev) and [@&#8203;ai-hpc](https://github.com/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 [@&#8203;amknight](https://github.com/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 [#&#8203;66198](https://github.com/openclaw/openclaw/issues/66198). Thanks [@&#8203;defonota3box](https://github.com/defonota3box). - Slack: publish a safe default App Home tab view on `app_home_opened` and include the Home tab event in setup manifests. Fixes [#&#8203;11655](https://github.com/openclaw/openclaw/issues/11655); refs [#&#8203;52020](https://github.com/openclaw/openclaw/issues/52020). Thanks [@&#8203;TinyTb](https://github.com/TinyTb). - Slack: keep track of bot-participated threads across restarts, so ongoing threaded conversations can continue auto-replying after the Gateway is restarted. Thanks [@&#8203;amknight](https://github.com/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. ([#&#8203;74337](https://github.com/openclaw/openclaw/issues/74337)) Thanks [@&#8203;konanok](https://github.com/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/<guid>`) 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). ([#&#8203;71820](https://github.com/openclaw/openclaw/issues/71820)) Thanks [@&#8203;coletebou](https://github.com/coletebou) and [@&#8203;zqchris](https://github.com/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. ([#&#8203;73438](https://github.com/openclaw/openclaw/issues/73438)) Thanks [@&#8203;jesse-merhi](https://github.com/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. ([#&#8203;75308](https://github.com/openclaw/openclaw/issues/75308)) Thanks [@&#8203;pashpashpash](https://github.com/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. ([#&#8203;75765](https://github.com/openclaw/openclaw/issues/75765)) Thanks [@&#8203;pashpashpash](https://github.com/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. ([#&#8203;75765](https://github.com/openclaw/openclaw/issues/75765)) Thanks [@&#8203;pashpashpash](https://github.com/pashpashpash). - Gateway/config: allow `$include` directives to read files from operator-approved `OPENCLAW_INCLUDE_ROOTS` directories while preserving default config-directory confinement. Thanks [@&#8203;ificator](https://github.com/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 [#&#8203;47487](https://github.com/openclaw/openclaw/issues/47487). Thanks [@&#8203;amknight](https://github.com/amknight). - Gateway/SDK: add SDK-facing artifact list/get/download RPCs and App SDK helpers with transcript provenance and download-source guardrails. Refs [#&#8203;74706](https://github.com/openclaw/openclaw/issues/74706). Thanks [@&#8203;tmimmanuel](https://github.com/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. ([#&#8203;74189](https://github.com/openclaw/openclaw/issues/74189)) Thanks [@&#8203;vignesh07](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;scoootscooob](https://github.com/scoootscooob). - Gateway/events: surface `spawnedBy` on subagent chat and agent broadcast payloads so clients can route child session events without an extra session lookup. ([#&#8203;63244](https://github.com/openclaw/openclaw/issues/63244)) Thanks [@&#8203;samzong](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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. ([#&#8203;67977](https://github.com/openclaw/openclaw/issues/67977)) Thanks [@&#8203;quengh](https://github.com/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. ([#&#8203;73219](https://github.com/openclaw/openclaw/issues/73219)) Thanks [@&#8203;joeykrug](https://github.com/joeykrug). - Gateway/memory: add a read-only `doctor.memory.remHarness` RPC so operator clients can preview bounded REM dreaming output without running mutation paths. ([#&#8203;66673](https://github.com/openclaw/openclaw/issues/66673)) Thanks [@&#8203;samzong](https://github.com/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. ([#&#8203;71204](https://github.com/openclaw/openclaw/issues/71204)) Thanks [@&#8203;eleqtrizit](https://github.com/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. ([#&#8203;74451](https://github.com/openclaw/openclaw/issues/74451)) Thanks [@&#8203;0xCyda](https://github.com/0xCyda), [@&#8203;hclsys](https://github.com/hclsys), and [@&#8203;Marvae](https://github.com/Marvae). - Added SQLite-backed plugin state store (`api.runtime.state.openKeyedStore`) for restart-safe keyed registries with TTL, eviction, and automatic plugin isolation. Thanks [@&#8203;amknight](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;mariozechner](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Channels: add Yuanbao channel docs entrance so the Tencent Yuanbao bot appears in the channel listing and sidebar navigation. ([#&#8203;73443](https://github.com/openclaw/openclaw/issues/73443)) Thanks [@&#8203;loongfay](https://github.com/loongfay). - Channels/Yuanbao: update plugin GitHub location to YuanbaoTeam/yuanbao-openclaw-plugin and add "yuanbao" alias to channel catalog. ([#&#8203;74253](https://github.com/openclaw/openclaw/issues/74253)) Thanks [@&#8203;loongfay](https://github.com/loongfay). - Docker setup: add `OPENCLAW_SKIP_ONBOARDING` so automated Docker installs can skip the interactive onboarding step while still applying gateway defaults. ([#&#8203;55518](https://github.com/openclaw/openclaw/issues/55518)) Thanks [@&#8203;jinjimz](https://github.com/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. ([#&#8203;74311](https://github.com/openclaw/openclaw/issues/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. ([#&#8203;69483](https://github.com/openclaw/openclaw/issues/69483)) Thanks [@&#8203;jesse-merhi](https://github.com/jesse-merhi). ##### Fixes - 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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/shakkernerd). - Discord: document canonical mention formatting in agent prompt hints and channel docs so outbound replies use `<@&#8203;USER_ID>`, `<#CHANNEL_ID>`, and `<@&#8203;&ROLE_ID>` instead of legacy nickname mentions. ([#&#8203;75173](https://github.com/openclaw/openclaw/issues/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. ([#&#8203;64016](https://github.com/openclaw/openclaw/issues/64016), refs [#&#8203;17797](https://github.com/openclaw/openclaw/issues/17797) and [#&#8203;75436](https://github.com/openclaw/openclaw/issues/75436)) Thanks [@&#8203;hexsprite](https://github.com/hexsprite). - fix: block workspace CLOUDSDK\_PYTHON override and always set trusted interpreter for gcloud. ([#&#8203;74492](https://github.com/openclaw/openclaw/issues/74492)) Thanks [@&#8203;pgondhi987](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;shakkernerd](https://github.com/shakkernerd). - fix(infra): block ambient Homebrew env vars from brew resolution. ([#&#8203;74463](https://github.com/openclaw/openclaw/issues/74463)) Thanks [@&#8203;pgondhi987](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;74796](https://github.com/openclaw/openclaw/issues/74796). Thanks [@&#8203;maxschachere](https://github.com/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 [@&#8203;pgondhi987](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;mariozechner](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - 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 [#&#8203;75283](https://github.com/openclaw/openclaw/issues/75283). Thanks [@&#8203;vincentkoc](https://github.com/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 [#&#8203;72478](https://github.com/openclaw/openclaw/issues/72478). Thanks [@&#8203;DougButdorf](https://github.com/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 [#&#8203;75290](https://github.com/openclaw/openclaw/issues/75290). Thanks [@&#8203;thanos-openclaw](https://github.com/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 [#&#8203;75520](https://github.com/openclaw/openclaw/issues/75520). Thanks [@&#8203;whtoo](https://github.com/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 [#&#8203;72758](https://github.com/openclaw/openclaw/issues/72758). Thanks [@&#8203;tyshepps](https://github.com/tyshepps). - Discord/Slack: defer status-reaction cleanup until run finalization so queued, thinking, tool, and terminal reactions no longer flicker during normal progress updates. ([#&#8203;75582](https://github.com/openclaw/openclaw/issues/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 [#&#8203;73753](https://github.com/openclaw/openclaw/issues/73753); refs [#&#8203;74044](https://github.com/openclaw/openclaw/issues/74044). Thanks [@&#8203;sanchezm86](https://github.com/sanchezm86) and [@&#8203;SecureCloudProjO](https://github.com/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 [#&#8203;40665](https://github.com/openclaw/openclaw/issues/40665). Thanks [@&#8203;liz709](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;63098](https://github.com/openclaw/openclaw/issues/63098); refs [#&#8203;39825](https://github.com/openclaw/openclaw/issues/39825) and [#&#8203;65039](https://github.com/openclaw/openclaw/issues/65039). Thanks [@&#8203;darealgege](https://github.com/darealgege), [@&#8203;kzicherman](https://github.com/kzicherman), and [@&#8203;ayochim](https://github.com/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. ([#&#8203;75423](https://github.com/openclaw/openclaw/issues/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 [#&#8203;70050](https://github.com/openclaw/openclaw/issues/70050). Thanks [@&#8203;tangda18](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;65687](https://github.com/openclaw/openclaw/issues/65687). Thanks [@&#8203;OneMintJulep](https://github.com/OneMintJulep). - WhatsApp: stage `qrcode` through root mirrored runtime dependencies so packaged QR pairing can render from staged plugin-runtime-deps installs. Fixes [#&#8203;75394](https://github.com/openclaw/openclaw/issues/75394). Thanks [@&#8203;FelipeX2001](https://github.com/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 [#&#8203;47095](https://github.com/openclaw/openclaw/issues/47095). Thanks [@&#8203;qearlyao](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - Slack/slash commands: send block-only slash command replies instead of dropping Slack block payloads with no plain-text fallback. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/vincentkoc). - LINE/messages: send quick-reply-only payloads with fallback option text instead of accepting the payload and returning an empty delivery. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;75324](https://github.com/openclaw/openclaw/issues/75324). Thanks [@&#8203;slideshow-dingo](https://github.com/slideshow-dingo) and [@&#8203;Conan-Scott](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;shakkernerd](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;61536](https://github.com/openclaw/openclaw/issues/61536). Thanks [@&#8203;aounakram](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;75045](https://github.com/openclaw/openclaw/issues/75045). Thanks [@&#8203;sahilsatralkar](https://github.com/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 [#&#8203;75171](https://github.com/openclaw/openclaw/issues/75171). Thanks [@&#8203;zhangxiliang](https://github.com/zhangxiliang). - Plugins/runtime-deps: prune inactive same-package versioned runtime-deps roots after bundled dependency repair, so upgrades do not leave old `openclaw-<version>-<hash>` package caches behind after doctor runs. Thanks [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;75283](https://github.com/openclaw/openclaw/issues/75283) and [#&#8203;75069](https://github.com/openclaw/openclaw/issues/75069). Thanks [@&#8203;brokemac79](https://github.com/brokemac79) and [@&#8203;xiaohuaxi](https://github.com/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 [#&#8203;75429](https://github.com/openclaw/openclaw/issues/75429). ([#&#8203;75431](https://github.com/openclaw/openclaw/issues/75431)) Thanks [@&#8203;loyur](https://github.com/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 [#&#8203;75438](https://github.com/openclaw/openclaw/issues/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 [#&#8203;75438](https://github.com/openclaw/openclaw/issues/75438). - Process/exec: add stdin error listener in runCommandWithTimeout so EPIPE from a prematurely-exited child is swallowed instead of escaping to uncaughtException. Refs [#&#8203;75438](https://github.com/openclaw/openclaw/issues/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 [#&#8203;71849](https://github.com/openclaw/openclaw/issues/71849). Thanks [@&#8203;amzzzzzzz](https://github.com/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 [#&#8203;73850](https://github.com/openclaw/openclaw/issues/73850). ([#&#8203;73834](https://github.com/openclaw/openclaw/issues/73834)) Thanks [@&#8203;shhtheonlyperson](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;75447](https://github.com/openclaw/openclaw/issues/75447). Thanks [@&#8203;amknight](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;75330](https://github.com/openclaw/openclaw/issues/75330) and [#&#8203;75414](https://github.com/openclaw/openclaw/issues/75414). Thanks [@&#8203;amknight](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 `<media:audio>` placeholder instead of falling through to the generic `<media:attachment>` tag. Thanks [@&#8203;omarshahine](https://github.com/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 [#&#8203;70061](https://github.com/openclaw/openclaw/issues/70061). ([#&#8203;75533](https://github.com/openclaw/openclaw/issues/75533)) Thanks [@&#8203;vyctorbrzezowski](https://github.com/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 [@&#8203;donkeykong91](https://github.com/donkeykong91) and [@&#8203;PfanP](https://github.com/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 [#&#8203;75485](https://github.com/openclaw/openclaw/issues/75485). Thanks [@&#8203;amknight](https://github.com/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 [@&#8203;donkeykong91](https://github.com/donkeykong91) and [@&#8203;PfanP](https://github.com/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 [@&#8203;donkeykong91](https://github.com/donkeykong91) and [@&#8203;PfanP](https://github.com/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. ([#&#8203;74606](https://github.com/openclaw/openclaw/issues/74606)) Thanks [@&#8203;Sivan22](https://github.com/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 [#&#8203;75183](https://github.com/openclaw/openclaw/issues/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 [#&#8203;75197](https://github.com/openclaw/openclaw/issues/75197). ([#&#8203;75257](https://github.com/openclaw/openclaw/issues/75257)) Thanks [@&#8203;donkeykong91](https://github.com/donkeykong91) and [@&#8203;PfanP](https://github.com/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. ([#&#8203;75459](https://github.com/openclaw/openclaw/issues/75459)) Thanks [@&#8203;serrurco](https://github.com/serrurco) and [@&#8203;DougButdorf](https://github.com/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 [#&#8203;72345](https://github.com/openclaw/openclaw/issues/72345). Thanks [@&#8203;serrurco](https://github.com/serrurco) and [@&#8203;DougButdorf](https://github.com/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. ([#&#8203;74182](https://github.com/openclaw/openclaw/issues/74182)) Thanks [@&#8203;cjboy007](https://github.com/cjboy007). - Docker: restore `python3` in the gateway runtime image after the slim-runtime switch. Fixes [#&#8203;75041](https://github.com/openclaw/openclaw/issues/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 [#&#8203;75271](https://github.com/openclaw/openclaw/issues/75271) and [#&#8203;75313](https://github.com/openclaw/openclaw/issues/75313). Thanks [@&#8203;amknight](https://github.com/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 [@&#8203;vincentkoc](https://github.com/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 [#&#8203;58009](https://github.com/openclaw/openclaw/issues/58009) and [#&#8203;64982](https://github.com/openclaw/openclaw/issues/64982). Thanks [@&#8203;KR-Python](https://github.com/KR-Python) and [@&#8203;BKF-Gitty](https://github.com/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 [#&#8203;72478](https://github.com/openclaw/openclaw/issues/72478). Thanks [@&#8203;DougButdorf](https://github.com/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 [#&#8203;74842](https://github.com/openclaw/openclaw/issues/74842); refs [#&#8203;75207](https://github.com/openclaw/openclaw/issues/75207). Thanks [@&#8203;davelutztx](https://github.com/davelutztx) and [@&#8203;aa-on-ai](https://github.com/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 [@&#8203;vignesh07](https://github.com/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. ([#&#8203;75360](https://github.com/openclaw/openclaw/issues/75360)) Thanks [@&#8203;obviyus](https://github.com/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 [#&#8203;75334](https://github.com/openclaw/openclaw/issues/75334). Thanks [@&#8203;sene1337](https://github.com/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. ([#&#8203;75335](https://github.com/openclaw/openclaw/issues/75335)) Thanks [@&#8203;vincentkoc](https://github.com/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 [#&#8203;75166](https://github.com/openclaw/openclaw/issues/75166). Thanks [@&#8203;MkDev11](https://github.com/MkDev11). - Security/config-audit: redact CLI argv and execArgv secrets before persisting config audit records, covering write, observe, and recovery paths. Fixes [#&#8203;60826](https://github.com/openclaw/openclaw/issues/60826). Thanks [@&#8203;koshaji](https://github.com/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 [#&#8203;75297](https://github.com/openclaw/openclaw/issues/75297); refs [#&#8203;74404](https://github.com/openclaw/openclaw/issues/74404). Thanks [@&#8203;lisandromachado](https://github.com/lisandromachado) and [@&#8203;najef1979-code](https://github.com/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 [#&#8203;75283](https://github.com/openclaw/openclaw/issues/75283); refs [#&#8203;75297](https://github.com/openclaw/openclaw/issues/75297) and [#&#8203;72338](https://github.com/openclaw/openclaw/issues/72338). Thanks [@&#8203;brokemac79](https://github.com/brokemac79), [@&#8203;lisandromachado](https://github.com/lisandromachado), and [@&#8203;midhunmonachan](https://github.com/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 [@&#8203;goldmar](https://github.com/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 [@&#8203;discord](https://github.com/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 [#&#8203;75265](https://github.com/openclaw/openclaw/issues/75265). Thanks [@&#8203;sliekens](https://github.com/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 [@&#8203;discord](https://github.com/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 [@&#8203;discord](https://github.com/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 [@&#8203;stainlu](https://github.com/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. ([#&#8203;75111](https://github.com/openclaw/openclaw/issues/75111)) Thanks [@&#8203;keshavbotagent](https://github.com/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 [#&#8203;75309](https://github.com/openclaw/openclaw/issues/75309); refs [#&#8203;75069](https://github.com/openclaw/openclaw/issues/75069). Thanks [@&#8203;scottgl9](https://github.com/scottgl9) and [@&#8203;xiaohuaxi](https://github.com/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 [#&#8203;74948](https://github.com/openclaw/openclaw/issues/74948); refs [#&#8203;74950](https://github.com/openclaw/openclaw/issues/74950) and [#&#8203;74346](https://github.com/openclaw/openclaw/issues/74346). Thanks [@&#8203;dchekmarev](https://github.com/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 [#&#8203;75309](https://github.com/openclaw/openclaw/issues/75309); refs [#&#8203;75310](https://github.com/openclaw/openclaw/issues/75310), [#&#8203;75296](https://github.com/openclaw/openclaw/issues/75296), and [#&#8203;75304](https://github.com/openclaw/openclaw/issues/75304). Thanks [@&#8203;scottgl9](https://github.com/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 [#&#8203;75309](https://github.com/openclaw/openclaw/issues/75309); refs [#&#8203;75183](https://github.com/openclaw/openclaw/issues/75183). Thanks [@&#8203;shakkernerd](https://github.com/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 [#&#8203;75069](https://github.com/openclaw/openclaw/issues/75069). Thanks [@&#8203;xiaohuaxi](https://github.com/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 [#&#8203;75206](https://github.com/openclaw/openclaw/issues/75206). Thanks [@&#8203;xonaman](https://github.com/xonaman) and [@&#8203;faux123](https://github.com/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 [#&#8203;74917](https://github.com/openclaw/openclaw/issues/74917). Thanks [@&#8203;kAIborg24](https://github.com/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 [#&#8203;75115](https://github.com/openclaw/openclaw/issues/75115). Thanks [@&#8203;yhyatt](https://github.com/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 [#&#8203;74137](https://github.com/openclaw/openclaw/issues/74137). Thanks [@&#8203;yelog](https://github.com/yelog), [@&#8203;Gracker](https://github.com/Gracker), and [@&#8203;nhaener](https://github.com/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 [@&#8203;pashpashpash](https://github.com/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 [#&#8203;50516](https://github.com/openclaw/openclaw/issues/50516) by teddytennant. ([#&#8203;58097](https://github.com/openclaw/openclaw/issues/58097)) Thanks [@&#8203;gavyngong](https://github.com/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 [#&#8203;75108](https://github.com/openclaw/openclaw/issues/75108); refs [#&#8203;75069](https://github.com/openclaw/openclaw/issues/75069). Thanks [@&#8203;coletebou](https://github.com/coletebou) and [@&#8203;xiaohuaxi](https://github.com/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 [#&#8203;74868](https://github.com/openclaw/openclaw/issues/74868). Thanks [@&#8203;kagura-agent](https://github.com/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 [#&#8203;75087](https://github.com/openclaw/openclaw/issues/75087); repairs [#&#8203;73617](https://github.com/openclaw/openclaw/issues/73617). Thanks [@&#8203;civiltox](https://github.com/civiltox) and [@&#8203;martingarramon](https://github.com/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 [#&#8203;74864](https://github.com/openclaw/openclaw/issues/74864). Thanks [@&#8203;solosage1](https://github.com/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 [#&#8203;74971](https://github.com/openclaw/openclaw/issues/74971). Thanks [@&#8203;eurojojo](https://github.com/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 [#&#8203;74777](https://github.com/openclaw/openclaw/issues/74777). Thanks [@&#8203;LLagoon3](https://github.com/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 [#&#8203;74896](https://github.com/openclaw/openclaw/issues/74896). Thanks [@&#8203;KoykL](https://github.com/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 [#&#8203;53308](https://github.com/openclaw/openclaw/issues/53308). Thanks [@&#8203;minupla](https://github.com/minupla) and [@&#8203;juan-flores077](https://github.com/juan-flores077). - Signal: bound `signal-cli` installer release and archive downloads with explicit timeouts, declared and streamed size checks, and partial-file cleanup. Fixes [#&#8203;54153](https://github.com/openclaw/openclaw/issues/54153). Thanks [@&#8203;jinduwang1001-max](https://github.com/jinduwang1001-max) and [@&#8203;juan-flores077](https://github.com/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 [#&#8203;59284](https://github.com/openclaw/openclaw/issues/59284). Thanks [@&#8203;andrewhong-translucent](https://github.com/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 [#&#8203;73564](https://github.com/openclaw/openclaw/issues/73564). Thanks [@&#8203;heyhudson](https://github.com/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 [#&#8203;74741](https://github.com/openclaw/openclaw/issues/74741). Thanks [@&#8203;fgabelmannjr](https://github.com/fgabelmannjr) and [@&#8203;k7n4n5t3w4rt](https://github.com/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. ([#&#8203;75003](https://github.com/openclaw/openclaw/issues/75003)) Thanks [@&#8203;velvet-shark](https://github.com/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 [#&#8203;74451](https://github.com/openclaw/openclaw/issues/74451). Thanks [@&#8203;0xCyda](https://github.com/0xCyda), [@&#8203;hclsys](https://github.com/hclsys), and [@&#8203;Marvae](https://github.com/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 [#&#8203;74949](https://github.com/openclaw/openclaw/issues/74949). Thanks [@&#8203;hclsys](https://github.com/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. ([#&#8203;75073](https://github.com/openclaw/openclaw/issues/75073)) Thanks [@&#8203;obviyus](https://github.com/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 [#&#8203;75084](https://github.com/openclaw/openclaw/issues/75084). Thanks [@&#8203;M-Lietz](https://github.com/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 [#&#8203;75114](https://github.com/openclaw/openclaw/issues/75114). Thanks [@&#8203;hpinho77](https://github.com/hpinho77). - Web search: describe `web_search` as using the configured provider instead of hard-coding Brave when DuckDuckGo or another provider is active. Fixes [#&#8203;75088](https://github.com/openclaw/openclaw/issues/75088). Thanks [@&#8203;sun-rongyang](https://github.com/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 [#&#8203;66867](https://github.com/openclaw/openclaw/issues/66867). Thanks [@&#8203;Kane808-AI](https://github.com/Kane808-AI) and [@&#8203;jarvisz8](https://github.com/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. ([#&#8203;73499](https://github.com/openclaw/openclaw/issues/73499)) Thanks [@&#8203;marchpure](https://github.com/marchpure) and [@&#8203;haoxingjun](https://github.com/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. ([#&#8203;74472](https://github.com/openclaw/openclaw/issues/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 [#&#8203;75060](https://github.com/openclaw/openclaw/issues/75060). Thanks [@&#8203;amknight](https://github.com/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-<version>-<hash>/` and bundled channels stop failing with `ENOENT` on shared dist chunks under Windows npm symlinks, junctions, or PM2 multi-instance worker layouts. Fixes [#&#8203;74963](https://github.com/openclaw/openclaw/issues/74963). ([#&#8203;75048](https://github.com/openclaw/openclaw/issues/75048)) Thanks [@&#8203;openperf](https://github.com/openperf) and [@&#8203;vincentkoc](https://github.com/vincentkoc). - fix(logging): add redaction patterns for Tencent Cloud, Alibaba Cloud, HuggingFace and Replicate API keys ([#&#8203;58162](https://github.com/openclaw/openclaw/issues/58162)). Thanks [@&#8203;gavyngong](https://github.com/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. ([#&#8203;63324](https://github.com/openclaw/openclaw/issues/63324)) Thanks [@&#8203;franciscomaestre](https://github.com/franciscomaestre). - macOS app: reserve layout space for exec approval command details so the allow dialog no longer overlaps the command, context, and action buttons. ([#&#8203;75470](https://github.com/openclaw/openclaw/issues/75470)) Thanks [@&#8203;ngutman](https://github.com/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 [#&#8203;42713](https://github.com/openclaw/openclaw/issues/42713). ([#&#8203;73506](https://github.com/openclaw/openclaw/issues/73506)) Thanks [@&#8203;wenxu007](https://github.com/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"`. ([#&#8203;74255](https://github.com/openclaw/openclaw/issues/74255)) Thanks [@&#8203;100yenadmin](https://github.com/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 [@&#8203;feynman-hou](https://github.com/feynman-hou) and [@&#8203;eleqtrizit](https://github.com/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`). ([#&#8203;74460](https://github.com/openclaw/openclaw/issues/74460)) Thanks [@&#8203;mmaps](https://github.com/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 [#&#8203;75220](https://github.com/openclaw/openclaw/issues/75220). ([#&#8203;75440](https://github.com/openclaw/openclaw/issues/75440)) Thanks [@&#8203;leonaIee](https://github.com/leonaIee), [@&#8203;renaudcerrato](https://github.com/renaudcerrato), and [@&#8203;aaajiao](https://github.com/aaajiao). ### [`v2026.4.27`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#2026427) [Compare Source](https://github.com/openclaw/openclaw/compare/v2026.4.26...v2026.4.27) ##### Highlights - Codex Computer Use setup now ships with status/install commands, marketplace discovery, and fail-closed MCP checks for Codex-mode desktop control. Thanks [@&#8203;pash-openai](https://github.com/pash-openai). - DeepInfra joins the bundled provider set with model discovery, media generation/editing, TTS, embeddings, and provider-owned onboarding policy. Thanks [@&#8203;ats3v](https://github.com/ats3v). - Tencent Yuanbao and QQBot support expand channel coverage with Yuanbao docs/catalog entries and QQBot group chat, streaming, media upload, and pipeline refactors. Thanks [@&#8203;loongfay](https://github.com/loongfay) and [@&#8203;cxyhhhhh](https://github.com/cxyhhhhh). - Plugin startup and model catalogs move toward manifest-first metadata, reducing Gateway boot work and making provider rows/aliases/suppressions easier to audit. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Reliability fixes cover Telegram startup/sends, Slack socket/media stalls, gateway startup prewarm, session/history defaults, update sync, and Windows restart handoffs. Thanks [@&#8203;joerod26](https://github.com/joerod26), [@&#8203;obviyus](https://github.com/obviyus), [@&#8203;shivasymbl](https://github.com/shivasymbl), [@&#8203;freerk](https://github.com/freerk), [@&#8203;bassboy2k](https://github.com/bassboy2k), [@&#8203;jpreagan](https://github.com/jpreagan), [@&#8203;islandpreneur007](https://github.com/islandpreneur007), and [@&#8203;Thatgfsj](https://github.com/Thatgfsj). ##### Changes - Sandbox/Docker: add opt-in `sandbox.docker.gpus` passthrough for Docker sandbox containers so local GPU workloads can run inside sandboxed agents when the host Docker runtime supports `--gpus`. Fixes [#&#8203;57976](https://github.com/openclaw/openclaw/issues/57976); carries forward [#&#8203;58124](https://github.com/openclaw/openclaw/issues/58124). Thanks [@&#8203;cyan-ember](https://github.com/cyan-ember). - iOS/Gateway: add an authenticated `node.presence.alive` protocol event and `node.list` last-seen fields so background iOS wakes can mark paired nodes recently alive without treating them as connected. Carries forward [#&#8203;63123](https://github.com/openclaw/openclaw/issues/63123). Thanks [@&#8203;ngutman](https://github.com/ngutman). - Android: publish authenticated `node.presence.alive` events after node connect and background transitions so paired Android nodes retain durable last-seen metadata after disconnects. Carries forward [#&#8203;63123](https://github.com/openclaw/openclaw/issues/63123). Thanks [@&#8203;ngutman](https://github.com/ngutman). - Gateway/chat: accept non-image attachments through `chat.send` by staging them as agent-readable media paths, while keeping unsupported RPC attachment paths explicit instead of silently dropping files. Fixes [#&#8203;48123](https://github.com/openclaw/openclaw/issues/48123). ([#&#8203;67572](https://github.com/openclaw/openclaw/issues/67572)) Thanks [@&#8203;samzong](https://github.com/samzong). - Security/networking: add opt-in operator-managed outbound proxy routing (proxy.enabled + proxy.proxyUrl/OPENCLAW\_PROXY\_URL) with strict http\:// forward-proxy validation, loopback-only Gateway bypass, and cleanup of proxy env/dispatcher state on exit. ([#&#8203;70044](https://github.com/openclaw/openclaw/issues/70044)) Thanks [@&#8203;jesse-merhi](https://github.com/jesse-merhi) and [@&#8203;joshavant](https://github.com/joshavant). - Dependencies: refresh provider and tooling dependencies, including AWS SDK, PI runtime packages, AJV, Feishu SDK, Anthropic SDK, tokenjuice, and native TypeScript/oxlint tooling. Thanks [@&#8203;dependabot](https://github.com/dependabot). - Matrix/QA: add live Matrix approval scenarios for exec metadata, chunked fallback, plugin approvals, deny reactions, thread targeting, and `target: "both"` delivery, with redacted artifacts preserving safe approval summaries. Thanks [@&#8203;gumadeiras](https://github.com/gumadeiras). - Diagnostics/Codex: add owner-only core `/diagnostics` with a sensitive-data preamble, docs link, and explicit Gateway export approval guidance; Codex harness sessions also ask before uploading Codex feedback for the attached thread and print the matching `codex resume <thread-id>` inspection command after confirmed upload. Thanks [@&#8203;pashpashpash](https://github.com/pashpashpash). - Trajectory export: route `/export-trajectory` through per-run exec approval, send group-chat approval prompts and export results only to the owner privately, and add `openclaw sessions export-trajectory` for the approved command path. Thanks [@&#8203;pashpashpash](https://github.com/pashpashpash). - Codex: add Computer Use setup for Codex-mode agents, including `/codex computer-use status/install`, marketplace discovery, optional auto-install, and fail-closed MCP server checks before Codex-mode turns start. Fixes [#&#8203;72094](https://github.com/openclaw/openclaw/issues/72094). ([#&#8203;71842](https://github.com/openclaw/openclaw/issues/71842)) Thanks [@&#8203;pash-openai](https://github.com/pash-openai). - Apps: consume Peekaboo 3.0.0-beta4 and ElevenLabsKit 0.1.1, align Swabble on Commander 0.2.2, and refresh macOS/iOS SwiftPM resolutions against the released dependency graph. Thanks [@&#8203;Blaizzy](https://github.com/Blaizzy). - Plugin SDK: expose shared channel route normalization, parser-driven target resolution, raw-target compact keys, parsed-target types, and route comparison helpers through `openclaw/plugin-sdk/channel-route`, switch native approval origin matching onto that route contract with optional delivery and match-only target normalization, and retire the internal channel-route shim behind dated compatibility aliases for legacy key/comparable-target helpers. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Docs/Codex: document how Codex Computer Use, direct `cua-driver mcp`, and OpenClaw\.app's PeekabooBridge fit together so desktop-control setup choices are clearer. Thanks [@&#8203;pash-openai](https://github.com/pash-openai) and [@&#8203;trycua](https://github.com/trycua). - Matrix/streaming: stream tool-progress updates into live Matrix preview edits by default when preview streaming is active, with `streaming.preview.toolProgress: false` to keep answer previews while hiding interim tool lines. Thanks [@&#8203;gumadeiras](https://github.com/gumadeiras). - Plugins/models: wire manifest `modelCatalog.aliases` and `modelCatalog.suppressions` into model-catalog planning and built-in model suppression, with stale Spark and Qwen Coding Plan suppressions now declared in plugin manifests instead of runtime fallback hooks. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Plugin SDK/models: add a shared manifest-backed provider catalog builder and move Qianfan, Xiaomi, NVIDIA, Cerebras, Mistral, Moonshot, DeepSeek, Tencent TokenHub, and StepFun provider catalogs onto their plugin manifest `modelCatalog` rows. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Plugin SDK/models: move BytePlus and Volcano Engine standard and plan-provider catalogs into plugin manifest `modelCatalog` rows and remove the now-unused Volcengine-family shared catalog SDK subpath. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - CLI/models: move Fireworks and Together AI fixed provider catalogs into plugin manifest `modelCatalog` rows so provider-filtered listing can use manifest-backed static rows. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - CLI/models: move Groq's fixed text model catalog into the Groq plugin manifest and declare its setup auth env metadata so provider-filtered listing can use manifest-backed rows without deprecated auth metadata. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - CLI/models: move Venice's 41-row seed catalog into the Venice plugin manifest, derive runtime fallback rows from that manifest, and keep Venice API discovery as refreshable runtime work instead of a second hard-coded catalog. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Channels/Yuanbao: register the Tencent Yuanbao external channel plugin (`openclaw-plugin-yuanbao`) in the official channel catalog, contract suites, and community plugin docs, with a new `docs/channels/yuanbao.md` quick-start guide for WebSocket bot DMs and group chats. ([#&#8203;72756](https://github.com/openclaw/openclaw/issues/72756)) Thanks [@&#8203;loongfay](https://github.com/loongfay). - Channels/QQBot: add full group chat support (history tracking, @&#8203;-mention gating, activation modes, per-group config, FIFO message queue with deliver debounce), C2C `stream_messages` streaming with a `StreamingController` lifecycle manager, unified `sendMedia` with chunked upload for large files, and refactor the engine into pipeline stages, focused outbound submodules, builtin slash-command modules, and explicit DI ports via `createEngineAdapters()`. ([#&#8203;70624](https://github.com/openclaw/openclaw/issues/70624)) Thanks [@&#8203;cxyhhhhh](https://github.com/cxyhhhhh). - Plugins/startup: migrate bundled plugin manifests to explicit `activation.onStartup` declarations so Gateway startup imports only the bundled plugins that intentionally register startup-time runtime surfaces. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Plugins/startup: add an opt-in future-mode gate for disabling deprecated implicit startup sidecar loading while preserving explicit startup and narrower activation triggers. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Plugins/startup: add plugin compatibility warnings for deprecated implicit startup loading so authors can migrate to explicit `activation.onStartup` metadata. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Plugins/runtime: load bundled agent tool-result middleware from manifest contracts on demand so tokenjuice stays startup-lazy without losing Pi/Codex tool-output compaction. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Plugins/startup: add explicit `activation.onStartup` metadata so plugins can declare Gateway startup import behavior while the deprecated implicit sidecar fallback remains for legacy plugins. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Gateway/startup: reuse lookup-table plugin manifests when loading startup plugins so Gateway boot avoids rebuilding plugin discovery and manifest metadata. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - CLI/models: declare fixed Qianfan, Xiaomi, NVIDIA, Cerebras, Mistral, Chutes, Kilo, OpenAI, and OpenCode Go model catalogs in refreshable plugin manifests, keep broad `models list --all` on raw registry and supplement rows without runtime normalization, and avoid duplicate supplement resolution. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Gateway/runtime: reuse the current plugin metadata snapshot for provider discovery so repeated model-provider discovery avoids rebuilding plugin manifest metadata. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Gateway/startup: pass the plugin metadata snapshot from config validation into plugin bootstrap so startup reuses one manifest product instead of rebuilding plugin metadata. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Plugin SDK/testing: move core-only channel contract fixtures under the channel contract test tree and retire the old `test/helpers/channels` bridge directory so plugin tests stay on focused SDK surfaces. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugin SDK/testing: expose native agent-runtime contract fixtures through `plugin-sdk/agent-runtime-test-contracts`, move sandbox config fixtures into the focused generic fixture subpath, and block extension tests from importing repo-only `test/helpers` bridges. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugin SDK/testing: expose generic module reload, bundled-path, Node builtin mock, channel pairing/envelope, HTTP server, temp-home, replay-policy, and live STT helpers through focused SDK test subpaths so extension tests no longer depend on repo-only helper bridges. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugin SDK: move maintained bundled channels off the deprecated `channel-config-schema-legacy` subpath, add an explicit bundled-channel schema SDK surface, and track both remaining legacy test/config compatibility barrels with dated removal windows. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugin SDK/testing: expose media provider capability assertions and provider HTTP mocks through focused SDK test subpaths, and retire the repo-only media-generation test helper bridge. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugin SDK/testing: promote bundled plugin/provider/channel contract helpers to focused SDK test subpaths and retire the repo-only `test/helpers/plugins` TypeScript bridge. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugin SDK/testing: expose generic channel action, setup, status, and directory contract helpers through `plugin-sdk/channel-test-helpers` so bundled extension tests no longer import repo-only channel helper bridges. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugin SDK/testing: add `plugin-sdk/channel-target-testing` for shared channel target-resolution cases, document channel reaction helpers on `plugin-sdk/channel-feedback`, and keep the old `plugin-sdk/test-utils` alias as compatibility-only. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugin SDK/testing: add a focused generic fixture subpath for CLI capture, sandbox, skill, agent-message, system-event, terminal, chunking, auth-token, and typed-case helpers. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugin SDK/testing: add focused plugin runtime and environment fixture subpaths so plugin tests can avoid the broad `plugin-sdk/testing` barrel for common setup helpers. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugin SDK/testing: add a focused `plugin-sdk/plugin-test-api` helper subpath and move bundled plugin registration tests off the repo-only plugin API bridge. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugin SDK: add generic host hooks for session state, next-turn context, trusted tool policy, UI descriptors, events, scheduler cleanup, and run-scoped plugin context. ([#&#8203;72287](https://github.com/openclaw/openclaw/issues/72287)) Thanks [@&#8203;100yenadmin](https://github.com/100yenadmin). - Plugin SDK/testing: expose provider catalog, wizard, registry, manifest, public-artifact, outbound, and TTS contract helpers through documented SDK testing seams so bundled plugin tests no longer import repo `src/**` internals. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Providers/DeepInfra: add a bundled DeepInfra provider with `DEEPINFRA_API_KEY` onboarding, dynamic OpenAI-compatible model discovery, image generation/editing, image/audio media understanding, TTS, text-to-video, memory embeddings, static catalog metadata, and provider-owned base URL policy. Carries forward [#&#8203;53805](https://github.com/openclaw/openclaw/issues/53805), [#&#8203;48088](https://github.com/openclaw/openclaw/issues/48088), [#&#8203;37576](https://github.com/openclaw/openclaw/issues/37576), [#&#8203;43896](https://github.com/openclaw/openclaw/issues/43896), [#&#8203;11533](https://github.com/openclaw/openclaw/issues/11533), and [#&#8203;2554](https://github.com/openclaw/openclaw/issues/2554). Thanks [@&#8203;ats3v](https://github.com/ats3v). - Matrix: attach versioned structured approval metadata to pending approval messages so capable Matrix clients can render richer approval UI while body text and reaction fallback keep working. ([#&#8203;72432](https://github.com/openclaw/openclaw/issues/72432)) Thanks [@&#8203;kakahu2015](https://github.com/kakahu2015). ##### Fixes - Channels/QQBot: re-evaluate routing bindings against the current runtime config on every inbound message instead of the snapshot captured at gateway start, so peer-specific bindings added via the CLI take effect without restarting the gateway. Fixes [#&#8203;69546](https://github.com/openclaw/openclaw/issues/69546) via [#&#8203;73567](https://github.com/openclaw/openclaw/issues/73567). Thanks [@&#8203;statxc](https://github.com/statxc) and [@&#8203;F32138](https://github.com/F32138). - CLI/channel-setup: auto-skip the redundant "Install \<plugin>?" confirmation when only one install source (npm or local) exists, show `download from <npm-spec>` hints for installable catalog channels in the picker, and suppress misleading npm hints for already-bundled channels. Fixes [#&#8203;73419](https://github.com/openclaw/openclaw/issues/73419). Thanks [@&#8203;sliverp](https://github.com/sliverp). - BlueBubbles: tighten DM-vs-group routing across the outbound session route (`chat_guid:iMessage;-;...` DMs no longer classified as groups), reaction handling (drop group reactions that arrive without any chat identifier instead of synthesizing a `"group"` literal peerId), inbound `chatGuid` fallback (no longer fall back to the sender's DM chatGuid when resolving a group whose webhook omits chatGuid+chatId+chatIdentifier), and short message id resolution (carry caller chat context so a numeric short id reused after a long group conversation cannot silently resolve to a message in a different chat, with the same cross-chat guard applied to full GUIDs so retries cannot bypass it). Thanks [@&#8203;zqchris](https://github.com/zqchris). - Gateway/sessions: clone cached session stores through the persisted JSON shape instead of `structuredClone`, reducing native-memory growth on the remaining [#&#8203;54155](https://github.com/openclaw/openclaw/issues/54155) Gateway RSS/session-accumulation path while keeping [#&#8203;54155](https://github.com/openclaw/openclaw/issues/54155) as the broader tracker and carrying forward the [#&#8203;45438](https://github.com/openclaw/openclaw/issues/45438) session-cache hypothesis. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc) and the [#&#8203;45438](https://github.com/openclaw/openclaw/issues/45438) reporters/commenters. - Agents/approvals: fail restart-interrupted sessions whose transcript tail is still `approval-pending` instead of replaying stale exec approval IDs into the new Gateway process after restart. Fixes [#&#8203;65486](https://github.com/openclaw/openclaw/issues/65486). Thanks [@&#8203;mjmai20682068-create](https://github.com/mjmai20682068-create). - CLI/Gateway: use method-specific least-privilege scopes for classified CLI Gateway calls while preserving legacy broad scopes for unclassified plugin methods, so read-only commands no longer create admin/write/pairing scope-upgrade prompts. Fixes [#&#8203;68634](https://github.com/openclaw/openclaw/issues/68634). Thanks [@&#8203;nightmusher](https://github.com/nightmusher). - Gateway/sessions: align `chat.history` and `sessions.list` thinking defaults with owning-agent and catalog-aware resolution so Control UI session defaults match backend runtime state. ([#&#8203;63418](https://github.com/openclaw/openclaw/issues/63418)) Thanks [@&#8203;jpreagan](https://github.com/jpreagan). - Devices/pairing: recover array-shaped device and node pairing state files before persisting approvals, so UUID-keyed pending and paired entries no longer disappear after a malformed JSON store write. Fixes [#&#8203;63035](https://github.com/openclaw/openclaw/issues/63035). Thanks [@&#8203;sar618](https://github.com/sar618). - Gateway/auth: clear reused stale device tokens and stop reconnecting on device-token mismatch in the Control UI and Node gateway clients, avoiding rate-limit loops after scope-upgrade or token-rotation handoffs. Fixes [#&#8203;71609](https://github.com/openclaw/openclaw/issues/71609). Thanks [@&#8203;ricksayhi](https://github.com/ricksayhi). - Gateway/approvals: treat duplicate same-decision approval resolves as idempotent during the resolved-entry grace window, including consumed `allow-once` approvals, while returning an explicit already-resolved error for conflicting repeats. Fixes [#&#8203;59162](https://github.com/openclaw/openclaw/issues/59162); refs [#&#8203;58479](https://github.com/openclaw/openclaw/issues/58479) and [#&#8203;65486](https://github.com/openclaw/openclaw/issues/65486). Thanks [@&#8203;wikithoughts](https://github.com/wikithoughts), [@&#8203;sajazuniga7-coder](https://github.com/sajazuniga7-coder), and [@&#8203;mjmai20682068-create](https://github.com/mjmai20682068-create). - Channels/Telegram: honor `approvals.exec/plugin.targets[].accountId` when routing native approvals across multi-bot Telegram accounts while preserving unscoped Telegram targets for any account. Fixes [#&#8203;69916](https://github.com/openclaw/openclaw/issues/69916). Thanks [@&#8203;joerod26](https://github.com/joerod26). - Agents/exec: omit the internal session-resume fallback preface from successful async exec completion messages sent directly back to chat. Fixes [#&#8203;67181](https://github.com/openclaw/openclaw/issues/67181). Thanks [@&#8203;raistlin88](https://github.com/raistlin88). - Agents/media: register detached `video_generate` and `music_generate` tool run contexts until terminal status, so Discord-backed provider jobs stay live in `/tasks` instead of becoming `lost` when the parent chat run context disappears. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Agents/media: prefer OpenAI image and video providers when the default model uses the OpenAI Codex auth alias, so auto media generation no longer falls through to Fal before GPT Image or Sora. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Tasks/media: infer agent ownership for session-scoped task records so `/tasks` agent-local fallback includes session-backed `video_generate` and other async media jobs even when the current chat session has no linked rows. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Agents/media: keep long-running `video_generate` and `music_generate` tasks fresh while provider jobs are still pending, so task maintenance does not mark active Discord media renders lost before completion. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - CLI/status: treat scope-limited gateway probes as reachable-but-degraded in shared status scans, so `openclaw status --all` no longer reports a live gateway as unreachable after `missing scope: operator.read`. Fixes [#&#8203;49180](https://github.com/openclaw/openclaw/issues/49180); supersedes [#&#8203;47981](https://github.com/openclaw/openclaw/issues/47981). Thanks [@&#8203;openjay](https://github.com/openjay). - Slack/Socket Mode: use a 15s Slack SDK pong timeout by default and add `channels.slack.socketMode.clientPingTimeout`, `serverPingTimeout`, and `pingPongLoggingEnabled` overrides so stale-websocket handling no longer depends on app-event health heuristics. Fixes [#&#8203;14248](https://github.com/openclaw/openclaw/issues/14248); refs [#&#8203;58519](https://github.com/openclaw/openclaw/issues/58519), [#&#8203;64009](https://github.com/openclaw/openclaw/issues/64009), and [#&#8203;63488](https://github.com/openclaw/openclaw/issues/63488). Thanks [@&#8203;shivasymbl](https://github.com/shivasymbl) and [@&#8203;freerk](https://github.com/freerk). - Slack/media: bound private file and forwarded attachment downloads with idle and total timeouts while preserving placeholder fallback, so stalled Slack `file_share` media no longer wedges inbound message handling. Fixes [#&#8203;61850](https://github.com/openclaw/openclaw/issues/61850). Thanks [@&#8203;bassboy2k](https://github.com/bassboy2k). - Plugins/inspector: keep bundled plugin runtime capture quiet and config-tolerant for Codex, memory-lancedb, Feishu, Mattermost, QQBot, and Tlon so plugin-inspector JSON checks can validate the full bundled set. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Slack/auto-reply: keep fully consumed text reset triggers such as `new session` out of `BodyForAgent` after directive cleanup, so configured Slack reset phrases do not leak into the fresh model turn. Fixes [#&#8203;73137](https://github.com/openclaw/openclaw/issues/73137). Thanks [@&#8203;neeravmakwana](https://github.com/neeravmakwana). - Plugins/runtime deps: prune stale retained bundled runtime deps and keep doctor/secret channel contract scans on lightweight artifacts, so disabled bundled channels stop preserving old dependency trees or importing heavy plugin surfaces. Thanks [@&#8203;SymbolStar](https://github.com/SymbolStar) and [@&#8203;vincentkoc](https://github.com/vincentkoc). - Auto-reply: bound the post-run pending tool-result delivery drain with a progress-aware idle timeout, so a never-settling tool-result task no longer leaves the session active forever while slow healthy deliveries can keep draining. Fixes [#&#8203;53889](https://github.com/openclaw/openclaw/issues/53889); supersedes [#&#8203;64733](https://github.com/openclaw/openclaw/issues/64733) and [#&#8203;73434](https://github.com/openclaw/openclaw/issues/73434). Thanks [@&#8203;zijunl](https://github.com/zijunl) and [@&#8203;wujiaming88](https://github.com/wujiaming88). - Gateway/startup: start chat channels without waiting for primary model prewarm, keeping model warmup bounded in the background so Slack and other channels come online promptly when provider discovery is slow. Supersedes [#&#8203;73420](https://github.com/openclaw/openclaw/issues/73420). Thanks [@&#8203;dorukardahan](https://github.com/dorukardahan). - Gateway/install: carry env-backed config SecretRefs such as `channels.discord.token` into generated service environments when they are present only in the installing shell, while keeping gateway auth SecretRefs non-persisted. Fixes [#&#8203;67817](https://github.com/openclaw/openclaw/issues/67817); supersedes [#&#8203;73426](https://github.com/openclaw/openclaw/issues/73426). Thanks [@&#8203;wdimaculangan](https://github.com/wdimaculangan) and [@&#8203;ztexydt-cqh](https://github.com/ztexydt-cqh). - Auto-reply/commands: stop bare `/reset` and `/new` after reset hooks acknowledge the command, so non-ACP channels no longer fall through into empty provider calls while `/reset <message>` and `/new <message>` still seed the next model turn. Fixes [#&#8203;73367](https://github.com/openclaw/openclaw/issues/73367) and [#&#8203;73412](https://github.com/openclaw/openclaw/issues/73412). Thanks [@&#8203;hoyanhan](https://github.com/hoyanhan), [@&#8203;wenxu007](https://github.com/wenxu007), and [@&#8203;amdhelper](https://github.com/amdhelper). - Providers/DeepSeek: backfill DeepSeek V4 `reasoning_content` on plain assistant replay messages as well as tool-call turns, so thinking sessions with prior tool use no longer fail follow-up requests with missing reasoning content. Fixes [#&#8203;73417](https://github.com/openclaw/openclaw/issues/73417); refs [#&#8203;71372](https://github.com/openclaw/openclaw/issues/71372). Thanks [@&#8203;34262315716](https://github.com/34262315716) and [@&#8203;Bartok9](https://github.com/Bartok9). - Agents/gateway tool: strip full config payloads from `config.patch` and `config.apply` tool responses while preserving direct RPC responses, so config-heavy sessions no longer replay large redacted configs into transcript history. Fixes [#&#8203;47610](https://github.com/openclaw/openclaw/issues/47610); supersedes [#&#8203;73439](https://github.com/openclaw/openclaw/issues/73439). Thanks [@&#8203;HanenVit](https://github.com/HanenVit) and [@&#8203;juan-flores077](https://github.com/juan-flores077). - Auto-reply: preserve voice-note media from silent turns while continuing to suppress text and non-voice media, so `NO_REPLY` TTS replies still deliver the requested audio bubble. ([#&#8203;73406](https://github.com/openclaw/openclaw/issues/73406)) Thanks [@&#8203;zqchris](https://github.com/zqchris). - Channels/Mattermost: stop enqueueing regular inbound posts as system events, so Mattermost user messages reach the model only as user-role inbound-envelope content instead of also appearing as `System: Mattermost message...` directives. Fixes [#&#8203;71795](https://github.com/openclaw/openclaw/issues/71795). Thanks [@&#8203;juan-flores077](https://github.com/juan-flores077). - Agents/media: qualify bare `agents.defaults.imageModel` and `pdfModel` refs from unique configured image-capable providers, so Ollama vision models such as `moondream` and `qwen2.5vl:7b` do not fall through to the default provider. Fixes [#&#8203;38816](https://github.com/openclaw/openclaw/issues/38816); supersedes [#&#8203;73396](https://github.com/openclaw/openclaw/issues/73396). Thanks [@&#8203;alainasclaw](https://github.com/alainasclaw) and [@&#8203;vincentkoc](https://github.com/vincentkoc). - Agents/Anthropic: send implicit Anthropic beta headers only to direct public Anthropic endpoints, including OAuth, so custom Anthropic-compatible providers no longer mis-handle unsupported beta flags unless explicitly configured. Refs [#&#8203;73346](https://github.com/openclaw/openclaw/issues/73346). Thanks [@&#8203;byBrodowski](https://github.com/byBrodowski). - Skills: require explicit `skills.entries.coding-agent.enabled` before exposing the bundled coding-agent skill, so installs with Codex on PATH but no OpenAI auth do not silently offer Codex delegation. Fixes [#&#8203;73358](https://github.com/openclaw/openclaw/issues/73358). Thanks [@&#8203;LaFleurAdvertising](https://github.com/LaFleurAdvertising) and [@&#8203;Sanjays2402](https://github.com/Sanjays2402). - Plugins/startup: treat manifestless Claude bundles as valid installed-plugin registry entries instead of stale missing manifests, so workspace bundles no longer force repeated derived registry rebuilds or noisy `plugins.entries.workspace` warnings during Gateway startup. Fixes [#&#8203;73433](https://github.com/openclaw/openclaw/issues/73433). Thanks [@&#8203;AnneVoss](https://github.com/AnneVoss). - Agents/subagents: preserve `sessions_yield` as a paused subagent state and ignore its wait text while freezing completion output, so parent sessions wait for the final post-compaction answer instead of receiving intermediate progress or `(no output)`. Fixes [#&#8203;73413](https://github.com/openclaw/openclaw/issues/73413). Thanks [@&#8203;Ask-sola](https://github.com/Ask-sola). - Plugins/startup: precompute bundled runtime mirror fingerprints before taking the mirror lock and keep Docker bundled plugin runtime deps/mirrors in a Docker-managed volume instead of the Windows/WSL config bind mount, so cold starts avoid slow host-volume mirror writes. Fixes [#&#8203;73339](https://github.com/openclaw/openclaw/issues/73339). Thanks [@&#8203;1yihui](https://github.com/1yihui). - Plugins/runtime deps: refresh bundled runtime mirrors without deleting active import trees, so config-triggered restarts do not see transient missing plugin files during registration. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Channels/LINE: persist inbound image, video, audio, and file downloads in `~/.openclaw/media/inbound/` instead of temporary files so agents can still read LINE media after `/tmp` cleanup. Fixes [#&#8203;73370](https://github.com/openclaw/openclaw/issues/73370). Thanks [@&#8203;hijirii](https://github.com/hijirii) and [@&#8203;wenxu007](https://github.com/wenxu007). - CLI/plugins: keep bundled plugin installs out of `plugins.load.paths` while preserving install records, so install/inspect/doctor loops no longer warn about the current bundled plugin directory. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - CLI/plugins: scope `plugins inspect <id>` runtime loading to the matched plugin so single-plugin inspection does not load every plugin before checking the target. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - CLI/plugins: remove managed copied-path plugin directories during uninstall and plan uninstall from metadata instead of runtime-loading plugins, so plugin lifecycle commands avoid unnecessary bundled runtime-deps work. Thanks [@&#8203;shakkernerd](https://github.com/shakkernerd). - Cron tool: infer the creating session's agentId for `cron.add` jobs when `agentId` is omitted or passed as undefined, keeping scheduled agentTurn jobs routed to the session agent; [#&#8203;40571](https://github.com/openclaw/openclaw/issues/40571) identified the guard bug and supplied the focused regression coverage. Thanks [@&#8203;ChanningYul](https://github.com/ChanningYul). - Cron/Telegram: add `--thread-id` to `openclaw cron add` and `openclaw cron edit`, preserving Telegram forum topic delivery targets across scheduled announcements. Carries forward [#&#8203;51581](https://github.com/openclaw/openclaw/issues/51581), [#&#8203;60373](https://github.com/openclaw/openclaw/issues/60373), and [#&#8203;60890](https://github.com/openclaw/openclaw/issues/60890). Thanks [@&#8203;ChunHao-dev](https://github.com/ChunHao-dev). - Cron/Telegram: preserve session-derived Telegram topic thread IDs when isolated cron delivery explicitly targets the parent chat, keeping bare chat targets in the active forum topic without leaking stale topics to other chats. Carries forward [#&#8203;64708](https://github.com/openclaw/openclaw/issues/64708). Thanks [@&#8203;addelh](https://github.com/addelh). - Memory/compaction: keep pre-compaction memory-flush prompts runtime-only so session transcripts and `chat.history` no longer expose them as normal user turns. Fixes [#&#8203;54408](https://github.com/openclaw/openclaw/issues/54408) and [#&#8203;58956](https://github.com/openclaw/openclaw/issues/58956); refs [#&#8203;43567](https://github.com/openclaw/openclaw/issues/43567). Thanks [@&#8203;markgong](https://github.com/markgong) and [@&#8203;guoyuhang9](https://github.com/guoyuhang9). - Control UI/WebChat: keep large attachment payloads out of Lit state and optimistic chat messages, using object URL previews plus send-time payload serialization so PDF/image uploads no longer trigger `RangeError: Maximum call stack size exceeded`. Fixes [#&#8203;73360](https://github.com/openclaw/openclaw/issues/73360); refs [#&#8203;54378](https://github.com/openclaw/openclaw/issues/54378) and [#&#8203;63432](https://github.com/openclaw/openclaw/issues/63432). Thanks [@&#8203;hejunhui-73](https://github.com/hejunhui-73), [@&#8203;Ansub](https://github.com/Ansub), and [@&#8203;christianhernandez3-afk](https://github.com/christianhernandez3-afk). - Agents/Anthropic: cancel stalled Anthropic Messages SSE body reads when abort signals fire, so active-memory timeouts release transport resources instead of leaving hidden recall runs parked on `reader.read()`. Refs [#&#8203;72965](https://github.com/openclaw/openclaw/issues/72965) and [#&#8203;73120](https://github.com/openclaw/openclaw/issues/73120). Thanks [@&#8203;wdeveloper16](https://github.com/wdeveloper16). - Control UI/WebChat: keep pending run and typing state attached to the active client run, so unowned inject/announce/side-result finals no longer unlock unrelated active runs while completed owned runs still clear promptly. Fixes [#&#8203;57795](https://github.com/openclaw/openclaw/issues/57795); carries forward the narrow diagnosis from [#&#8203;57887](https://github.com/openclaw/openclaw/issues/57887). Thanks [@&#8203;haoyu-haoyu](https://github.com/haoyu-haoyu). - Sandbox/Docker: stop satisfying a missing default sandbox image by tagging plain Debian as `openclaw-sandbox:bookworm-slim`, preserving the Python tooling required by sandbox write/edit helpers and directing users to build the default image. Fixes [#&#8203;51185](https://github.com/openclaw/openclaw/issues/51185); refs [#&#8203;45108](https://github.com/openclaw/openclaw/issues/45108), [#&#8203;51099](https://github.com/openclaw/openclaw/issues/51099), [#&#8203;51609](https://github.com/openclaw/openclaw/issues/51609), and [#&#8203;57713](https://github.com/openclaw/openclaw/issues/57713). Thanks [@&#8203;dpalis](https://github.com/dpalis), [@&#8203;Tin55FoilDev](https://github.com/Tin55FoilDev), [@&#8203;jbcohen2-coder](https://github.com/jbcohen2-coder), [@&#8203;macminihal-cyber](https://github.com/macminihal-cyber), and [@&#8203;PraxoOnline](https://github.com/PraxoOnline). - Control UI/WebChat: confirm toolbar New Session button resets before dispatching `/new` while leaving typed `/new` and `/reset` commands immediate. Fixes [#&#8203;45800](https://github.com/openclaw/openclaw/issues/45800); refs [#&#8203;27065](https://github.com/openclaw/openclaw/issues/27065), [#&#8203;56611](https://github.com/openclaw/openclaw/issues/56611), [#&#8203;54499](https://github.com/openclaw/openclaw/issues/54499), and [#&#8203;27110](https://github.com/openclaw/openclaw/issues/27110). Thanks [@&#8203;aethnova](https://github.com/aethnova), [@&#8203;kosta228-huli](https://github.com/kosta228-huli), [@&#8203;adambezemek](https://github.com/adambezemek), and [@&#8203;xss925175263](https://github.com/xss925175263) (xianshishan). - Agents/models: keep per-agent primary models strict when `fallbacks` is omitted, so probe-only custom providers are not tried as hidden fallback candidates unless the agent explicitly opts in. Fixes [#&#8203;73332](https://github.com/openclaw/openclaw/issues/73332). Thanks [@&#8203;haumanto](https://github.com/haumanto). - Gateway/models: add `models.pricing.enabled` so offline or restricted-network installs can skip startup OpenRouter and LiteLLM pricing-catalog fetches while keeping explicit model costs working. Fixes [#&#8203;53639](https://github.com/openclaw/openclaw/issues/53639). Thanks [@&#8203;callebtc](https://github.com/callebtc), [@&#8203;palewire](https://github.com/palewire), and [@&#8203;rjdjohnston](https://github.com/rjdjohnston). - Gateway/startup: warn when legacy `CLAWDBOT_*` or `MOLTBOT_*` environment variables are still present, pointing users to `OPENCLAW_*` names instead of failing silently. Fixes [#&#8203;53482](https://github.com/openclaw/openclaw/issues/53482); carries forward [#&#8203;53667](https://github.com/openclaw/openclaw/issues/53667). Thanks [@&#8203;lndyzwdxhs](https://github.com/lndyzwdxhs). - Onboarding: pin interactive and non-interactive health checks to the just-configured setup token/password so stale `OPENCLAW_GATEWAY_TOKEN` or `OPENCLAW_GATEWAY_PASSWORD` values do not produce false gateway-token-mismatch failures after setup. Fixes [#&#8203;72203](https://github.com/openclaw/openclaw/issues/72203). Thanks [@&#8203;galiniliev](https://github.com/galiniliev). - Doctor/state: require an interactive confirmation before archiving orphan transcript files, so `openclaw doctor --fix` no longer silently renames recoverable session history after upgrades regenerate `sessions.json`. Fixes [#&#8203;73106](https://github.com/openclaw/openclaw/issues/73106). Thanks [@&#8203;scottgl9](https://github.com/scottgl9). - Cron/Telegram: preserve explicit `:topic:` delivery targets over stale session-derived thread IDs when isolated cron announces to Telegram forum topics. Carries forward [#&#8203;59069](https://github.com/openclaw/openclaw/issues/59069); refs [#&#8203;49704](https://github.com/openclaw/openclaw/issues/49704) and [#&#8203;43808](https://github.com/openclaw/openclaw/issues/43808). Thanks [@&#8203;roytong9](https://github.com/roytong9). - Build/runtime: write the runtime-postbuild stamp after `pnpm build` writes the build stamp, so the next CLI invocation does not re-sync runtime artifacts after a successful build. Fixes [#&#8203;73151](https://github.com/openclaw/openclaw/issues/73151). Thanks [@&#8203;bittoby](https://github.com/bittoby). - Build/runtime: preserve staged bundled-plugin runtime dependency caches across source-checkout tsdown rebuilds, so local CLI and gateway-watch rebuilds no longer recreate large plugin dependency trees before starting. Refs [#&#8203;73205](https://github.com/openclaw/openclaw/issues/73205). Thanks [@&#8203;SymbolStar](https://github.com/SymbolStar). - CLI/channels: list configured chat channel accounts from read-only setup metadata even when the standalone CLI has not loaded the runtime channel registry, so `openclaw channels list` shows Telegram accounts before auth providers. Fixes [#&#8203;73319](https://github.com/openclaw/openclaw/issues/73319) and [#&#8203;73322](https://github.com/openclaw/openclaw/issues/73322). Thanks [@&#8203;mlaihk](https://github.com/mlaihk). - CLI/model probes: keep `infer model run --gateway` raw by skipping prior session transcript, bootstrap context, context-engine assembly, tools, and bundled MCP servers, so local backends can be tested without full agent-context overhead. Fixes [#&#8203;73308](https://github.com/openclaw/openclaw/issues/73308). Thanks [@&#8203;ScientificProgrammer](https://github.com/ScientificProgrammer). - CLI/image describe: pass `--prompt` and `--timeout-ms` through `infer image describe` and `describe-many`, so custom vision instructions and slow local model budgets reach media-understanding providers such as Ollama, OpenAI, Google, and OpenRouter. Addresses [#&#8203;63700](https://github.com/openclaw/openclaw/issues/63700). Thanks [@&#8203;cedricjanssens](https://github.com/cedricjanssens). - Providers/Ollama: reject long non-linguistic Kimi/GLM symbol runs as provider failures instead of storing them as successful visible assistant replies, so fallback or error handling can recover from garbled cloud output. Fixes [#&#8203;64262](https://github.com/openclaw/openclaw/issues/64262); refs [#&#8203;67019](https://github.com/openclaw/openclaw/issues/67019). Thanks [@&#8203;Kloz813](https://github.com/Kloz813) and [@&#8203;xiaomenger123](https://github.com/xiaomenger123). - CLI/model probes: reject empty or whitespace-only `infer model run --prompt` values before calling local providers or the Gateway, so smoke checks do not spend provider calls on invalid turns. Fixes [#&#8203;73185](https://github.com/openclaw/openclaw/issues/73185). Thanks [@&#8203;iot2edge](https://github.com/iot2edge). - Gateway/media: route text-only `chat.send` image offloads through media-understanding fields so `agents.defaults.imageModel` can describe WebChat attachments instead of leaving only an opaque `media://inbound` marker. Fixes [#&#8203;72968](https://github.com/openclaw/openclaw/issues/72968). Thanks [@&#8203;vorajeeah](https://github.com/vorajeeah). - Gateway/Windows: route no-listener restart handoffs through the Windows supervisor without leaving restart tokens in flight, so failed task scheduling can be retried and successful handoffs do not coalesce later restart requests. ([#&#8203;69056](https://github.com/openclaw/openclaw/issues/69056)) Thanks [@&#8203;Thatgfsj](https://github.com/Thatgfsj). - Gateway/model pricing: skip plugin manifest discovery during background pricing refreshes when `plugins.enabled: false`, so disabled-plugin setups do not keep rebuilding plugin metadata from the Gateway hot path. Fixes [#&#8203;73291](https://github.com/openclaw/openclaw/issues/73291). Thanks [@&#8203;slideshow-dingo](https://github.com/slideshow-dingo) and [@&#8203;fishgills](https://github.com/fishgills). - Ollama/thinking: validate `/think` commands against live Ollama catalog reasoning metadata and preserve explicit native `params.think`/`params.thinking`, so models whose `/api/show` capabilities include `thinking` expose `low`, `medium`, `high`, and `max` instead of being stuck on `off`. Fixes [#&#8203;73366](https://github.com/openclaw/openclaw/issues/73366). Thanks [@&#8203;cymise](https://github.com/cymise). - Gateway/sessions: remove automatic oversized `sessions.json` rotation backups, deprecate `session.maintenance.rotateBytes`, and teach `openclaw doctor --fix` to remove the ignored key so hot session writes no longer copy multi-MB stores. Refs [#&#8203;72338](https://github.com/openclaw/openclaw/issues/72338). Thanks [@&#8203;midhunmonachan](https://github.com/midhunmonachan) and [@&#8203;DougButdorf](https://github.com/DougButdorf). - Channels/Telegram: fail fast when Telegram rejects the startup `getMe` token probe with 401, so invalid or stale BotFather tokens are reported as token auth failures instead of misleading `deleteWebhook` cleanup failures. Fixes [#&#8203;47674](https://github.com/openclaw/openclaw/issues/47674). Thanks [@&#8203;samaedan-arch](https://github.com/samaedan-arch). - ACPX: keep generated Codex and Claude ACP wrapper startup paths working when remote or special state filesystems reject chmod, since OpenClaw invokes the wrappers through Node instead of executing them directly. Fixes [#&#8203;73333](https://github.com/openclaw/openclaw/issues/73333). Thanks [@&#8203;david-garcia-garcia](https://github.com/david-garcia-garcia). - CLI/onboarding: infer image input for common custom-provider vision model IDs, ask only for unknown models, and keep `--custom-image-input`/`--custom-text-input` overrides so vision-capable proxies do not get saved as text-only configs. Fixes [#&#8203;51869](https://github.com/openclaw/openclaw/issues/51869). Thanks [@&#8203;Antsoldier1974](https://github.com/Antsoldier1974). - Models/OpenAI Codex: stop listing or resolving unsupported `openai-codex/gpt-5.4-mini` rows through Codex OAuth, keep stale discovery rows suppressed with a clear API-key-route hint, and leave direct `openai/gpt-5.4-mini` available. Fixes [#&#8203;73242](https://github.com/openclaw/openclaw/issues/73242). Thanks [@&#8203;0xCyda](https://github.com/0xCyda). - Plugin SDK: restore the root `stringEnum` and `optionalStringEnum` exports on both the published SDK entry and runtime root-alias bridge, so older external plugins can keep building and loading while migrating to focused SDK subpaths. Fixes [#&#8203;68279](https://github.com/openclaw/openclaw/issues/68279). Thanks [@&#8203;marzliak](https://github.com/marzliak). - Plugin SDK: restore the root-alias bridge for `registerContextEngine` and expose missing legacy compat helpers `normalizeAccountId` and `resolvePreferredOpenClawTmpDir` so older external plugins such as `openclaw-weixin` can keep loading while migrating to focused SDK subpaths. Fixes [#&#8203;53497](https://github.com/openclaw/openclaw/issues/53497). Thanks [@&#8203;alanxchen85](https://github.com/alanxchen85). - Auth profiles: make `openclaw doctor --fix` migrate legacy flat `auth-profiles.json` files such as `{ "ollama-windows": { "apiKey": "ollama-local" } }` to canonical provider default API-key profiles with a backup, so custom Ollama/OpenAI-compatible providers recover cleanly after upgrading. Fixes [#&#8203;59629](https://github.com/openclaw/openclaw/issues/59629); supersedes [#&#8203;59642](https://github.com/openclaw/openclaw/issues/59642). Thanks [@&#8203;Xsanders555](https://github.com/Xsanders555) and [@&#8203;Linux2010](https://github.com/Linux2010). - Memory/Dreaming: retry Dream Diary once with the session default when a configured dreaming model is unavailable, while leaving subagent trust and allowlist errors visible instead of silently masking configuration problems. Refs [#&#8203;67409](https://github.com/openclaw/openclaw/issues/67409) and [#&#8203;69209](https://github.com/openclaw/openclaw/issues/69209). Thanks [@&#8203;Ghiggins18](https://github.com/Ghiggins18) and [@&#8203;everySympathy](https://github.com/everySympathy). - Feishu/inbound files: recover CJK filenames from plain `Content-Disposition: filename=` download headers when Feishu exposes UTF-8 bytes through Latin-1 header decoding, while leaving valid Latin-1 and JSON-derived names unchanged. ([#&#8203;48578](https://github.com/openclaw/openclaw/issues/48578), [#&#8203;50435](https://github.com/openclaw/openclaw/issues/50435), [#&#8203;59431](https://github.com/openclaw/openclaw/issues/59431)) Thanks [@&#8203;alex-xuweilong](https://github.com/alex-xuweilong), [@&#8203;lishuaigit](https://github.com/lishuaigit), and [@&#8203;DoChaoing](https://github.com/DoChaoing). - Channels/Telegram: normalize accidental full `/bot<TOKEN>` Telegram `apiRoot` values at runtime and teach `openclaw doctor --fix` to remove the suffix, so startup control calls no longer 404 when direct Bot API curl commands work. Fixes [#&#8203;55387](https://github.com/openclaw/openclaw/issues/55387). Thanks [@&#8203;brendanmatthewjones-cmyk](https://github.com/brendanmatthewjones-cmyk), [@&#8203;techfindubai-ux](https://github.com/techfindubai-ux), and [@&#8203;Sivlerback-Chris](https://github.com/Sivlerback-Chris). - Zalo Personal: persist refreshed `zca-js` session cookies after QR login, session restore, and successful API calls so gateway restarts restore the freshest local session. ([#&#8203;73277](https://github.com/openclaw/openclaw/issues/73277)) Thanks [@&#8203;darkamenosa](https://github.com/darkamenosa). - Logging/security: redact sensitive tokens (sk-\* keys, Bearer/Authorization values, etc.) at the subsystem console sink so `createSubsystemLogger().info/warn/error` output that bypasses the patched console-capture handler still applies the same redaction the file transport already does. Fixes [#&#8203;73284](https://github.com/openclaw/openclaw/issues/73284); refs [#&#8203;67953](https://github.com/openclaw/openclaw/issues/67953) and [#&#8203;64046](https://github.com/openclaw/openclaw/issues/64046). Thanks [@&#8203;edwin-rivera-dev](https://github.com/edwin-rivera-dev). - Plugins/runtime deps: reuse enclosing versioned cache roots when bundled plugins resolve from nested staged paths, so plugin-runtime-deps no longer mints `openclaw-unknown-*` directories or loops on `ENOTEMPTY`. Fixes [#&#8203;72956](https://github.com/openclaw/openclaw/issues/72956). ([#&#8203;73205](https://github.com/openclaw/openclaw/issues/73205)) Thanks [@&#8203;SymbolStar](https://github.com/SymbolStar). - Agents/failover: classify CJK provider transport, quota, billing, auth, and overload error text so Chinese-language provider failures trigger fallback and user-facing transport copy instead of surfacing as unclassified raw errors. ([#&#8203;56242](https://github.com/openclaw/openclaw/issues/56242)) Thanks [@&#8203;tomcatzh](https://github.com/tomcatzh). - Agents/failover: seed non-claude-cli fallback prompts with Claude Code session context when a claude-cli attempt fails, so fallback models do not restart cold after billing or quota failover. ([#&#8203;72069](https://github.com/openclaw/openclaw/issues/72069)) Thanks [@&#8203;stainlu](https://github.com/stainlu). - Agents/CLI runner: transfer bundle-MCP tempDir cleanup from the per-turn runner finally to the Claude live-session lifecycle, so persistent Claude CLI sessions keep their `--mcp-config` directory until the live subprocess closes. Fixes [#&#8203;73244](https://github.com/openclaw/openclaw/issues/73244). Thanks [@&#8203;edwin-rivera-dev](https://github.com/edwin-rivera-dev). - Gateway/nodes: allow Windows companion nodes to use safe declared commands such as canvas, camera list, location, device info, and screen snapshot by default while keeping dangerous media commands opt-in. ([#&#8203;71884](https://github.com/openclaw/openclaw/issues/71884)) Thanks [@&#8203;shanselman](https://github.com/shanselman). - Agents/cron: clarify agent-tool and CLI cron timezone guidance so supplied `tz` values use local wall-clock cron fields and omitted cron `tz` falls back to the Gateway host local timezone. Fixes [#&#8203;53669](https://github.com/openclaw/openclaw/issues/53669); carries forward [#&#8203;46177](https://github.com/openclaw/openclaw/issues/46177). ([#&#8203;73372](https://github.com/openclaw/openclaw/issues/73372)) Thanks [@&#8203;chen-zhang-cs-code](https://github.com/chen-zhang-cs-code) and [@&#8203;maranello-o](https://github.com/maranello-o). - Providers/Qwen: allow explicitly configured `qwen/qwen3.6-plus` to resolve on Qwen Coding Plan endpoints while keeping the built-in catalog from advertising it there. Fixes [#&#8203;63654](https://github.com/openclaw/openclaw/issues/63654); carries forward [#&#8203;63987](https://github.com/openclaw/openclaw/issues/63987). Thanks [@&#8203;jepson-liu](https://github.com/jepson-liu). - Channels/Telegram: keep Bot API network fallbacks sticky after failed attempts and retry timed-out startup control calls once on the fallback route, so `deleteWebhook` IPv6 stalls no longer trigger slow multi-account retry storms. Fixes [#&#8203;73255](https://github.com/openclaw/openclaw/issues/73255). Thanks [@&#8203;ttomiczek](https://github.com/ttomiczek) and [@&#8203;sktbrd](https://github.com/sktbrd). - Gateway/agents: accept heartbeat, cron, and webhook as internal channel hints for agent runs so `sessions_spawn` works from non-delivery parent sessions while unknown channel hints still fail closed. Fixes [#&#8203;73237](https://github.com/openclaw/openclaw/issues/73237). Thanks [@&#8203;KeWang0622](https://github.com/KeWang0622). - Gateway/models: merge explicit `models.providers.*.models` rows into the Gateway model catalog with normalized provider/model dedupe, and use normalized image-capability lookup so custom vision models keep native image attachments even when Pi discovery omits them or model ID casing differs. Fixes [#&#8203;64213](https://github.com/openclaw/openclaw/issues/64213) and [#&#8203;65165](https://github.com/openclaw/openclaw/issues/65165). Thanks [@&#8203;billonese](https://github.com/billonese) and [@&#8203;202233a](https://github.com/202233a). - Gateway/reload: publish canonical post-write source config to in-process reloaders so simple config saves no longer create phantom plugin diffs or trigger unnecessary Gateway restarts. ([#&#8203;73267](https://github.com/openclaw/openclaw/issues/73267)) Thanks [@&#8203;szsip239](https://github.com/szsip239). - Gateway/Docker: keep config-triggered restarts in-process inside containers instead of spawning a detached child and exiting PID 1 cleanly, so Docker Swarm and other on-failure supervisors do not leave the service stuck at 0/1 replicas. Fixes [#&#8203;73178](https://github.com/openclaw/openclaw/issues/73178). Thanks [@&#8203;du-nguyen-IT007](https://github.com/du-nguyen-IT007). - CLI/tasks: ship the task-registry control runtime in npm packages so `openclaw tasks cancel` can load ACP/subagent cancellation helpers from published builds. Fixes [#&#8203;68997](https://github.com/openclaw/openclaw/issues/68997). Thanks [@&#8203;1OAKDesign](https://github.com/1OAKDesign). - Channels/Telegram: preserve unsent generated media after partial reply streaming has already delivered the text, so `image_generate` outputs still reach Telegram as photos instead of being dropped from the final payload. Fixes [#&#8203;73253](https://github.com/openclaw/openclaw/issues/73253). Thanks [@&#8203;mlaihk](https://github.com/mlaihk). - Memory-core/dreaming: cap detached Dream Diary narrative subagents across cron sweeps so multi-workspace dreaming no longer fans out unbounded subagent sessions, lock contention, and cascading narrative timeouts. Fixes [#&#8203;73198](https://github.com/openclaw/openclaw/issues/73198). ([#&#8203;73287](https://github.com/openclaw/openclaw/issues/73287)) Thanks [@&#8203;KeWang0622](https://github.com/KeWang0622). - CLI/agents: close local one-shot Claude live stdio sessions and bundled MCP loopback resources after embedded `openclaw agent --local` runs, while keeping gateway-owned MCP loopback cleanup internal to the Gateway. Thanks [@&#8203;frankekn](https://github.com/frankekn). - Export/session: keep inline export HTML scripts and vendor libraries injected after template formatting so generated session exports open with the app code, markdown renderer, and syntax highlighter present. Fixes [#&#8203;41862](https://github.com/openclaw/openclaw/issues/41862) and [#&#8203;49957](https://github.com/openclaw/openclaw/issues/49957); carries forward [#&#8203;41861](https://github.com/openclaw/openclaw/issues/41861) and [#&#8203;68947](https://github.com/openclaw/openclaw/issues/68947). Thanks [@&#8203;briannewman](https://github.com/briannewman), [@&#8203;martenzi](https://github.com/martenzi), and [@&#8203;armanddp](https://github.com/armanddp). - Agents/ACPX: stage the patched Claude ACP adapter as an ACPX runtime dependency and route known Codex/Claude ACP commands through local wrappers, so Gateway runtime no longer depends on live `npx` adapter resolution. Fixes [#&#8203;73202](https://github.com/openclaw/openclaw/issues/73202). Thanks [@&#8203;joerod26](https://github.com/joerod26). - Memory/compaction: let pre-compaction memory flush use an exact `agents.defaults.compaction.memoryFlush.model` override such as `ollama/qwen3:8b` without inheriting the active session fallback chain, so local housekeeping can avoid paid conversation models. Fixes [#&#8203;53772](https://github.com/openclaw/openclaw/issues/53772). Thanks [@&#8203;limen96](https://github.com/limen96). - macOS/update: stop managed Gateway services before package replacement and keep LaunchAgent service secrets out of world-readable plist metadata by loading them from owner-only env files. Fixes [#&#8203;72996](https://github.com/openclaw/openclaw/issues/72996). Thanks [@&#8203;Mathewb7](https://github.com/Mathewb7). - Google Meet: keep observe-only Chrome joins and setup checks from requiring BlackHole or audio bridge commands, avoid granting or selecting the microphone in observe-only mode, and make `test_speech` report fresh realtime output-byte verification instead of only confirming a queued utterance. Refs [#&#8203;72478](https://github.com/openclaw/openclaw/issues/72478). Thanks [@&#8203;DougButdorf](https://github.com/DougButdorf). - Gateway/hooks: route non-delivered hook completion and error summaries to the target agent's main session instead of the default agent session, preserving multi-agent hook isolation. Fixes [#&#8203;24693](https://github.com/openclaw/openclaw/issues/24693); carries forward [#&#8203;68667](https://github.com/openclaw/openclaw/issues/68667). Thanks [@&#8203;abersonFAC](https://github.com/abersonFAC) and [@&#8203;bluesky6868](https://github.com/bluesky6868). - Control UI/models: request the configured Gateway model-list view so dashboards with only `models.providers.*.models` show those configured models first instead of flooding the picker with the full built-in catalog. Fixes [#&#8203;65405](https://github.com/openclaw/openclaw/issues/65405). Thanks [@&#8203;wbyanclaw](https://github.com/wbyanclaw). - CLI/models: keep default-model and allowlist pickers on explicit `models.providers.*.models` entries when `models.mode` is `replace` instead of loading the full built-in catalog. Fixes [#&#8203;64950](https://github.com/openclaw/openclaw/issues/64950). Thanks [@&#8203;mrozentsvayg](https://github.com/mrozentsvayg). - Media/security: tighten media-understanding MIME sanitization so parameterized MIME values stay end-anchored and malformed whitespace or suffix payloads are rejected before file-context handling. Fixes [#&#8203;9795](https://github.com/openclaw/openclaw/issues/9795); carries forward [#&#8203;68225](https://github.com/openclaw/openclaw/issues/68225) with related review/test context from [#&#8203;61016](https://github.com/openclaw/openclaw/issues/61016)/[#&#8203;68456](https://github.com/openclaw/openclaw/issues/68456). Thanks [@&#8203;ymaxgit](https://github.com/ymaxgit), [@&#8203;bluesky6868](https://github.com/bluesky6868), and [@&#8203;shamsulalam1114](https://github.com/shamsulalam1114). - Discord: own the Carbon interaction listener and hand off Discord slash/component handling asynchronously, so compaction or long session locks no longer trip `InteractionEventListener` listener timeouts. Fixes [#&#8203;73204](https://github.com/openclaw/openclaw/issues/73204). Thanks [@&#8203;slideshow-dingo](https://github.com/slideshow-dingo). - Compaction/diagnostics: keep unknown compaction failure classifications stable while logging sanitized detail for unclassified provider errors such as missing Ollama provider adapters. Thanks [@&#8203;gzsiang](https://github.com/gzsiang). - Models/fallbacks: record first-class `model.fallback_step` trajectory events with from/to models, failure detail, chain position, and final outcome so support exports preserve the primary model failure even when a later fallback also fails. Fixes [#&#8203;71744](https://github.com/openclaw/openclaw/issues/71744). Thanks [@&#8203;nikolaykazakovvs-ux](https://github.com/nikolaykazakovvs-ux). - Gateway/agents: block agent `exec` from launching interactive `openclaw channels login` flows and abort active agent runs after invalid-config recovery restores last-known-good config, preventing known channel-login and reload paths from wedging replies. Refs [#&#8203;72338](https://github.com/openclaw/openclaw/issues/72338). Thanks [@&#8203;midhunmonachan](https://github.com/midhunmonachan). - Gateway/diagnostics: emit payload-free liveness warnings with event-loop delay, event-loop utilization, CPU-core ratio, active-session counts, and OTEL warning metrics/spans so live-but-stalled Gateways capture CPU-spin context in stability bundles and telemetry. Refs [#&#8203;72338](https://github.com/openclaw/openclaw/issues/72338). Thanks [@&#8203;midhunmonachan](https://github.com/midhunmonachan) and [@&#8203;DougButdorf](https://github.com/DougButdorf). - Gateway/startup: keep value-option foreground starts on the gateway fast path and skip proxy bootstrap unless proxy env is configured, reducing normal gateway startup RSS and avoiding full CLI graph loading. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Heartbeat/models: show heartbeat model bleed guidance on context-overflow resets when the last runtime model matches configured `heartbeat.model`, so smaller local heartbeat models point users to `isolatedSession` or `lightContext` instead of only compaction-buffer tuning. Fixes [#&#8203;67314](https://github.com/openclaw/openclaw/issues/67314). Thanks [@&#8203;Knightmare6890](https://github.com/Knightmare6890). - Subagents/models: persist `sessions_spawn.model` and configured subagent models as child-session model overrides before the first turn, so spawned subagents actually run on the requested provider/model instead of reverting to the target agent default. Fixes [#&#8203;73180](https://github.com/openclaw/openclaw/issues/73180). Thanks [@&#8203;danielzinhu99](https://github.com/danielzinhu99). - Channels/Telegram: keep webhook-mode local listeners alive and retry Telegram `setWebhook` registration after recoverable startup network failures, so transient Bot API timeouts no longer leave reverse proxies pointing at a closed listener. Fixes [#&#8203;71834](https://github.com/openclaw/openclaw/issues/71834). Thanks [@&#8203;jinon86](https://github.com/jinon86). - Agents/ACPX: bundle the Codex ACP adapter and launch it from the isolated `CODEX_HOME` wrapper before falling back to npm, so Codex ACP startup no longer depends on live `npx` resolution or the stale `@zed-industries/codex-acp@^0.11.1` range. Fixes [#&#8203;72037](https://github.com/openclaw/openclaw/issues/72037); refs [#&#8203;73202](https://github.com/openclaw/openclaw/issues/73202). Thanks [@&#8203;jasonftl](https://github.com/jasonftl), [@&#8203;sazora](https://github.com/sazora), and [@&#8203;joerod26](https://github.com/joerod26). - Agents/ACPX: register the embedded ACP backend at Gateway startup through a lightweight ACP backend SDK path and without importing the heavy ACPX runtime until an ACP session or explicit startup probe needs it, reducing baseline Gateway RSS. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - CLI/update: keep restart health polling when the restarted Gateway is reachable but has not reported its version yet, so macOS service restarts do not fail early with `actual unavailable`. Thanks [@&#8203;ProspectOre](https://github.com/ProspectOre). - Backup: skip installed plugin `extensions/*/node_modules` dependency trees while keeping plugin manifests and source files in archives, so local backups avoid rebuildable npm payload bloat. Fixes [#&#8203;64144](https://github.com/openclaw/openclaw/issues/64144). Thanks [@&#8203;BrilliantWang](https://github.com/BrilliantWang). - Cron/models: fail isolated cron runs closed when an explicit `payload.model` is not allowed or cannot be resolved, so scheduled jobs do not silently fall back to an unrelated agent default or paid route before configured provider proxies such as LiteLLM can run. Fixes [#&#8203;73146](https://github.com/openclaw/openclaw/issues/73146). Thanks [@&#8203;oneandrewwang](https://github.com/oneandrewwang). - Memory/QMD: back off repeated chat-turn QMD open failures while still letting memory status and CLI probes recheck immediately, so a broken sidecar dependency cannot trigger active-memory or cron retry storms. Fixes [#&#8203;73188](https://github.com/openclaw/openclaw/issues/73188) and [#&#8203;73176](https://github.com/openclaw/openclaw/issues/73176). Thanks [@&#8203;leonlushgit](https://github.com/leonlushgit) and [@&#8203;w3i-William](https://github.com/w3i-William). - Talk Mode: resolve `messages.tts.providers.<id>.apiKey` through the active runtime snapshot for `talk.config`, so Talk overlays can discover SecretRef-backed speech providers without falling back to local speech. Fixes [#&#8203;73109](https://github.com/openclaw/openclaw/issues/73109). ([#&#8203;73111](https://github.com/openclaw/openclaw/issues/73111)) Thanks [@&#8203;omarshahine](https://github.com/omarshahine). - Memory/Ollama: resolve `memorySearch.provider` custom provider ids through their configured `models.providers.<id>.api` owner, so multi-GPU Ollama setups can dedicate embeddings to providers such as `ollama-5080` without losing the Ollama adapter or local auth semantics. Fixes [#&#8203;73150](https://github.com/openclaw/openclaw/issues/73150). Thanks [@&#8203;oneandrewwang](https://github.com/oneandrewwang). - CLI/memory: skip eager context-window warmup for `openclaw memory` commands so memory search does not race unrelated model metadata discovery. Fixes [#&#8203;73123](https://github.com/openclaw/openclaw/issues/73123). Thanks [@&#8203;oalansilva](https://github.com/oalansilva) and [@&#8203;neeravmakwana](https://github.com/neeravmakwana). - CLI/Telegram: route Telegram `message send` and poll actions through the running Gateway when available, so packaged installs use the staged `grammy` runtime deps and CLI sends return instead of hanging after the Telegram channel is active. Fixes [#&#8203;73140](https://github.com/openclaw/openclaw/issues/73140). Thanks [@&#8203;oalansilva](https://github.com/oalansilva). - Plugins/runtime deps: prepare staged bundled plugin dependencies before loading packaged public surfaces, so OpenClaw's Telegram runtime/test facade loads resolve `grammy` from the managed runtime-deps stage without copying dependencies into the global package root. Refs [#&#8203;73140](https://github.com/openclaw/openclaw/issues/73140). Thanks [@&#8203;oalansilva](https://github.com/oalansilva). - Agents/exec: emit `(no output)` for silent exec update and node-host result blocks so Anthropic-compatible providers no longer reject empty tool-result text after quiet commands. Fixes [#&#8203;73117](https://github.com/openclaw/openclaw/issues/73117). Thanks [@&#8203;pfrederiksen](https://github.com/pfrederiksen) and [@&#8203;Sanjays2402](https://github.com/Sanjays2402). - Cron/providers: preflight local Ollama and OpenAI-compatible provider endpoints before isolated cron agent turns, record unreachable local providers as skipped runs, and cache dead-endpoint probes so many jobs do not hammer the same stopped local server. Fixes [#&#8203;58584](https://github.com/openclaw/openclaw/issues/58584). Thanks [@&#8203;jpeghead](https://github.com/jpeghead). - Gateway/config: let config reload continue in degraded mode when invalidity is scoped to plugin entries, so incompatible plugin configs can be skipped and the Gateway restart can still pick up the rest of the config after rollbacks. Fixes [#&#8203;73131](https://github.com/openclaw/openclaw/issues/73131). Thanks [@&#8203;Adam-Researchh](https://github.com/Adam-Researchh). - Doctor/channels: suppress disabled bundled-plugin blocker warnings when a trusted external plugin owns the configured channel, so Lark/Feishu installs no longer get Feishu repair noise after switching to `openclaw-lark`. Fixes [#&#8203;56794](https://github.com/openclaw/openclaw/issues/56794). Thanks [@&#8203;wuji-tech-dev](https://github.com/wuji-tech-dev). - CLI/status: show skipped fast-path memory checks as `not checked` and report active custom memory plugin runtime status from `status --json --all` without requiring built-in `agents.defaults.memorySearch`, so plugins such as memory-lancedb-pro and memory-cms no longer look unavailable when their own runtime is healthy. Fixes [#&#8203;56968](https://github.com/openclaw/openclaw/issues/56968). Thanks [@&#8203;Tony-ooo](https://github.com/Tony-ooo) and [@&#8203;aderius](https://github.com/aderius). - Gateway/channels: record and log unexpected clean channel monitor exits so channels that return without throwing no longer appear stopped with no error. Fixes [#&#8203;73099](https://github.com/openclaw/openclaw/issues/73099). Thanks [@&#8203;balaji1968-kingler](https://github.com/balaji1968-kingler). - Group/channel chats (all channels): keep group/channel replies private by default unless the agent explicitly uses the message tool, fall back to automatic visible replies when the message tool is unavailable, and have `openclaw doctor` warn about that policy mismatch; `messages.groupChat.visibleReplies: "automatic"` restores legacy auto-posting. ([#&#8203;73046](https://github.com/openclaw/openclaw/issues/73046)) Thanks [@&#8203;scoootscooob](https://github.com/scoootscooob). - Plugins/package: force nested bundled-plugin runtime dependency installs out of inherited npm dry-run mode during prepack and package smoke checks, so packed installs materialize required plugin modules instead of reporting missing bundled files. Refs [#&#8203;73128](https://github.com/openclaw/openclaw/issues/73128). Thanks [@&#8203;Adam-Researchh](https://github.com/Adam-Researchh). - Discord: skip reaction events before REST channel fetch when notifications are off, guild reactions are disabled, or allowlist mode cannot match without channel overrides, reducing reconnect bursts that caused slow listener warnings. Fixes [#&#8203;73133](https://github.com/openclaw/openclaw/issues/73133). Thanks [@&#8203;isaacsummers](https://github.com/isaacsummers). - Channels/Telegram: centralize polling update tracking so accepted offsets remain durable across restarts, same-process handler failures can still retry, and slow offset writes cannot overwrite newer accepted watermarks. Refs [#&#8203;73115](https://github.com/openclaw/openclaw/issues/73115). Thanks [@&#8203;vdruts](https://github.com/vdruts). - Agents/models: classify empty, reasoning-only, and planning-only terminal agent runs before accepting a model fallback candidate, so invalid or incompatible models can advance to the next configured fallback instead of returning a 30-second terminal failure. Fixes [#&#8203;73115](https://github.com/openclaw/openclaw/issues/73115). Thanks [@&#8203;vdruts](https://github.com/vdruts). - Memory/LanceDB: let embedding config use provider-backed auth profiles, environment credentials, or provider config without a separate plugin `embedding.apiKey`, so OAuth-capable embedding providers can power auto-recall/capture. Fixes [#&#8203;68950](https://github.com/openclaw/openclaw/issues/68950). Thanks [@&#8203;malshaalan-ai](https://github.com/malshaalan-ai). - CLI/parents: invoking `openclaw <parent>` (memory, channels, plugins, approvals, devices, cron, mcp) without a subcommand now prints the parent's help and exits `0`, matching `<parent> --help` and the existing `agents` / `sessions` defaults so shell `&&` chains and pnpm wrappers no longer surface a misleading `ELIFECYCLE Command failed with exit code 1.` line. Fixes [#&#8203;73077](https://github.com/openclaw/openclaw/issues/73077). Thanks [@&#8203;hclsys](https://github.com/hclsys). - Plugins/hooks: time out never-settling `agent_end` observation hooks after 30 seconds and log the plugin failure, so hung embedding endpoints no longer leave memory capture silently pending forever. Fixes [#&#8203;65544](https://github.com/openclaw/openclaw/issues/65544). Thanks [@&#8203;ghoc0099](https://github.com/ghoc0099). - Gateway/config: serve runtime config schemas from the current plugin metadata snapshot and generated bundled channel schema metadata instead of rebuilding plugin channel config modules on every `config.get`/`config.schema`, preventing idle plugin-discovery CPU churn after upgrades. Fixes [#&#8203;73088](https://github.com/openclaw/openclaw/issues/73088). Thanks [@&#8203;sleitor](https://github.com/sleitor) and [@&#8203;geovansb](https://github.com/geovansb). - Memory/LanceDB: call OpenAI-compatible embedding endpoints through the raw SDK transport without sending `encoding_format`, then normalize float-array or base64 responses so providers such as ZhiPu and DashScope no longer fail recall with wrong vector dimensions or rejected parameters. Fixes [#&#8203;63655](https://github.com/openclaw/openclaw/issues/63655). Thanks [@&#8203;kinthaiofficial](https://github.com/kinthaiofficial). - Plugins/install: run dependency installs with npm error-level logging instead of silent mode so failed plugin or hook installs surface actionable npm errors such as EUNSUPPORTEDPROTOCOL instead of `npm install failed:` with no detail. ([#&#8203;73093](https://github.com/openclaw/openclaw/issues/73093)) Thanks [@&#8203;sanctrl](https://github.com/sanctrl). - Memory/LanceDB: bound memory recall embedding queries with a new `recallMaxChars` setting, prefer the latest user message over channel prompt metadata during auto-recall, and document the knob so small Ollama embedding models avoid context-length failures. Fixes [#&#8203;56780](https://github.com/openclaw/openclaw/issues/56780). Thanks [@&#8203;rungmc357](https://github.com/rungmc357) and [@&#8203;zak-collaborator](https://github.com/zak-collaborator). - CLI/skills: resolve workspace-backed skills commands from `--agent`, then the current agent workspace, before falling back to the default agent, so multi-agent ClawHub installs, updates, and status checks stay scoped to the active workspace. Fixes [#&#8203;56161](https://github.com/openclaw/openclaw/issues/56161); carries forward [#&#8203;72726](https://github.com/openclaw/openclaw/issues/72726). Thanks [@&#8203;langbowang](https://github.com/langbowang) and [@&#8203;luyao618](https://github.com/luyao618). - Plugin SDK: fall back from partial bundled plugin directory overrides to package source public surfaces while preserving `OPENCLAW_DISABLE_BUNDLED_PLUGINS` as a hard disable. ([#&#8203;72817](https://github.com/openclaw/openclaw/issues/72817)) Thanks [@&#8203;serkonyc](https://github.com/serkonyc). - Agents/ACPX: stop forwarding Codex ACP timeout config controls that Codex rejects while preserving OpenClaw's run-timeout watchdog for ACP subagents. Fixes [#&#8203;73052](https://github.com/openclaw/openclaw/issues/73052). Thanks [@&#8203;pfrederiksen](https://github.com/pfrederiksen) and [@&#8203;richa65](https://github.com/richa65). - Memory Core: stream fallback vector search scoring with a bounded top-K result set so large indexes do not materialize every chunk embedding when sqlite-vec is unavailable. ([#&#8203;73069](https://github.com/openclaw/openclaw/issues/73069)) Thanks [@&#8203;parkertoddbrooks](https://github.com/parkertoddbrooks). - Memory Core: stream embedding-cache seeding during safe reindex so large local caches do not materialize every row into the V8 heap before the atomic rebuild. ([#&#8203;73067](https://github.com/openclaw/openclaw/issues/73067)) Thanks [@&#8203;parkertoddbrooks](https://github.com/parkertoddbrooks). - Memory/Ollama: add `memorySearch.remote.nonBatchConcurrency` for inline embedding indexing, default Ollama non-batch indexing to one request at a time, and keep batch concurrency separate from non-batch concurrency so local embedding backfills avoid timeout storms on smaller hosts. Carries forward [#&#8203;57733](https://github.com/openclaw/openclaw/issues/57733). Thanks [@&#8203;itilys](https://github.com/itilys). - macOS app: update Peekaboo, ElevenLabsKit, and MLX TTS helper dependencies, make canvas file watching and config/exec-approval state writes reliable under concurrent app/test activity, and keep the app plus helper builds warning-free. Thanks [@&#8203;Blaizzy](https://github.com/Blaizzy). - iOS app: refresh SwiftPM/XcodeGen source hygiene, make app, extension, watch, and curated shared Swift files pass the prebuild SwiftFormat and SwiftLint checks, move relay registration off deprecated StoreKit receipt APIs, and keep simulator builds and logic tests warning-free. Thanks [@&#8203;ngutman](https://github.com/ngutman). - Agents/models: keep `models.json` readiness and provider-hook caches warm across repeated agent and subagent model resolution while preserving external `models.json` invalidation, reducing repeated provider-plugin loads on slower ARM64 hosts. Fixes [#&#8203;73075](https://github.com/openclaw/openclaw/issues/73075). Thanks [@&#8203;jochen](https://github.com/jochen). - Docs/tools: clarify that `tools.profile: "messaging"` is intentionally narrow and that `tools.profile: "full"` is the unrestricted baseline for broader command/control access. Carries forward [#&#8203;39954](https://github.com/openclaw/openclaw/issues/39954). Thanks [@&#8203;posigit](https://github.com/posigit). - Control UI/Agents: redact tool-call args, partial/final results, derived exec output, and configured custom secret patterns before streaming tool events to the Control UI, so tool output cannot expose provider or channel credentials. Fixes [#&#8203;72283](https://github.com/openclaw/openclaw/issues/72283). ([#&#8203;72319](https://github.com/openclaw/openclaw/issues/72319)) Thanks [@&#8203;volcano303](https://github.com/volcano303) and [@&#8203;BunsDev](https://github.com/BunsDev). - Agents/sessions: keep `sessions_history` recall redaction enabled even when general log redaction is disabled, and clarify that safety-boundary UI/tool/diagnostic payloads still redact independently of `logging.redactSensitive`. Carries forward [#&#8203;72319](https://github.com/openclaw/openclaw/issues/72319). Thanks [@&#8203;volcano303](https://github.com/volcano303) and [@&#8203;BunsDev](https://github.com/BunsDev). - Providers/Codex: pass agent and workspace directories into provider stream wrappers so Codex native `web_search` activation can evaluate the correct auth context, and smoke-test the built status-message runtime by resolving the emitted bundle name. Carries forward [#&#8203;67843](https://github.com/openclaw/openclaw/issues/67843); refs [#&#8203;65909](https://github.com/openclaw/openclaw/issues/65909). Thanks [@&#8203;neilofneils404](https://github.com/neilofneils404). - Cron/models: keep `payload.model` as a per-job primary that can use configured fallbacks, while still letting `payload.fallbacks: []` make cron runs strict and avoid hidden agent-primary retries. Refs [#&#8203;73023](https://github.com/openclaw/openclaw/issues/73023). Thanks [@&#8203;pavelyortho-cyber](https://github.com/pavelyortho-cyber). - Models/fallbacks: treat user-selected session models as exact choices, so `/model ollama/...` and model-picker switches fail visibly when the selected provider is unreachable instead of answering from an unrelated configured fallback. Fixes [#&#8203;73023](https://github.com/openclaw/openclaw/issues/73023). Thanks [@&#8203;pavelyortho-cyber](https://github.com/pavelyortho-cyber). - Codex harness: keep ChatGPT subscription app-server runs from inheriting `CODEX_API_KEY` or `OPENAI_API_KEY`, and fall back to `CODEX_API_KEY` / `OPENAI_API_KEY` app-server login only when no Codex account is available. Fixes [#&#8203;73057](https://github.com/openclaw/openclaw/issues/73057). Thanks [@&#8203;holgergruenhagen](https://github.com/holgergruenhagen) and [@&#8203;pashpashpash](https://github.com/pashpashpash). - CLI/model probes: fail local `infer model run` probes when the provider returns no text output, so unreachable local providers and empty completions no longer look like successful smoke tests. Refs [#&#8203;73023](https://github.com/openclaw/openclaw/issues/73023). Thanks [@&#8203;pavelyortho-cyber](https://github.com/pavelyortho-cyber). - CLI/Ollama: run local `infer model run` through the lean provider completion path and skip global model discovery for one-shot local probes, so Ollama smoke tests no longer pay full chat-agent/tool startup cost or hang before the native `/api/chat` request. Fixes [#&#8203;72851](https://github.com/openclaw/openclaw/issues/72851). Thanks [@&#8203;TotalRes2020](https://github.com/TotalRes2020). - Doctor/gateway services: ignore launchd/systemd companion services that only reference the gateway as a dependency, suppress inactive Linux extra-service warnings, and avoid rewriting a running systemd gateway command/entrypoint during doctor repair. Carries forward [#&#8203;39118](https://github.com/openclaw/openclaw/issues/39118). Thanks [@&#8203;therk](https://github.com/therk). - Daemon/service: only emit hard-coded version-manager paths such as `~/.volta/bin`, `~/.asdf/shims`, `~/.bun/bin`, and fnm/pnpm fallbacks into gateway and node service PATHs when the directories exist, so `openclaw doctor` no longer flags `gateway.path.non-minimal` against a PATH the daemon just wrote. Env-driven roots and stable user-bin dirs remain unconditional. Fixes [#&#8203;71944](https://github.com/openclaw/openclaw/issues/71944); carries forward [#&#8203;71964](https://github.com/openclaw/openclaw/issues/71964). Thanks [@&#8203;Sanjays2402](https://github.com/Sanjays2402). - CLI/startup: disable Node's module compile cache automatically for live source-checkout launchers so in-place `pnpm build` updates are visible to the next `openclaw` CLI invocation. Fixes [#&#8203;73037](https://github.com/openclaw/openclaw/issues/73037). Thanks [@&#8203;LouisGameDev](https://github.com/LouisGameDev). - Agents/group chat: keep silent-allowed empty and reasoning-only turns on the `NO_REPLY` path without injecting visible-answer retry prompts, and clarify the group prompt so agents use the exact silent token instead of prose. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Agents/group chat: move `NO_REPLY` mechanics into channel-aware direct/group prompts and suppress the duplicate generic silent-reply section for auto-reply runs, so always-on group agents get one consistent stay-silent instruction. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Providers/OpenAI: preserve encrypted empty-summary Responses reasoning items in WebSocket replay and request `reasoning.encrypted_content` on reasoning turns so GPT-5.4/GPT-5.5 sessions do not lose required `rs_*` state beside `msg_*` items. Fixes [#&#8203;73053](https://github.com/openclaw/openclaw/issues/73053). Thanks [@&#8203;odb36777](https://github.com/odb36777). - Gateway/startup: treat `plugins.enabled=false` as an early plugin fast path, skipping plugin auto-enable discovery, gateway plugin lookup/runtime-dependency staging, and stale-plugin cleanup warnings while preserving channel blocker warnings. ([#&#8203;73041](https://github.com/openclaw/openclaw/issues/73041)) Thanks [@&#8203;WuKongAI-CMU](https://github.com/WuKongAI-CMU). - Channels/commands: make generated `/dock-*` commands switch the active session reply route through `session.identityLinks` instead of falling through to normal chat. Fixes [#&#8203;69206](https://github.com/openclaw/openclaw/issues/69206); carries forward [#&#8203;73033](https://github.com/openclaw/openclaw/issues/73033). Thanks [@&#8203;clawbones](https://github.com/clawbones) and [@&#8203;michaelatamuk](https://github.com/michaelatamuk). - Providers/Cloudflare AI Gateway: strip assistant prefill turns from Anthropic Messages payloads when thinking is enabled, so Claude requests through Cloudflare AI Gateway no longer fail Anthropic conversation-ending validation. Fixes [#&#8203;72905](https://github.com/openclaw/openclaw/issues/72905); carries forward [#&#8203;73005](https://github.com/openclaw/openclaw/issues/73005). Thanks [@&#8203;AaronFaby](https://github.com/AaronFaby) and [@&#8203;sahilsatralkar](https://github.com/sahilsatralkar). - Gateway/startup: keep primary-model startup prewarm on scoped metadata preparation, let native approval bootstraps retry outside channel startup, and skip the global hook runner when no `gateway_start` hook is registered, so clean post-ready sidecar work stays off the critical path. Refs [#&#8203;72846](https://github.com/openclaw/openclaw/issues/72846). Thanks [@&#8203;RayWoo](https://github.com/RayWoo), [@&#8203;livekm0309](https://github.com/livekm0309), and [@&#8203;mrz1836](https://github.com/mrz1836). - Gateway/channels: start bundled channel accounts with a lightweight `runtimeContexts` surface instead of importing the full reply/routing/session channel runtime before `startAccount`, so Discord, Telegram, Slack, Matrix, and QQBot startup no longer block on unrelated channel helper graphs. Refs [#&#8203;72846](https://github.com/openclaw/openclaw/issues/72846) and [#&#8203;72960](https://github.com/openclaw/openclaw/issues/72960). Thanks [@&#8203;mrz1836](https://github.com/mrz1836), [@&#8203;RayWoo](https://github.com/RayWoo), and [@&#8203;rollingshmily](https://github.com/rollingshmily). - Gateway/supervisor: exit cleanly when a supervised restart finds an existing healthy gateway and bound retries when the existing gateway stays unhealthy, so stale lock contention cannot loop indefinitely. Refs [#&#8203;72846](https://github.com/openclaw/openclaw/issues/72846). Thanks [@&#8203;azgardtek](https://github.com/azgardtek). - Gateway/startup: scope primary-model provider discovery during channel prewarm to the configured provider owner and add split startup trace timings, so boot avoids staging unrelated bundled provider dependencies while setup discovery remains broad. Fixes [#&#8203;73002](https://github.com/openclaw/openclaw/issues/73002). Thanks [@&#8203;Schnup03](https://github.com/Schnup03). - Plugins/runtime deps: declare retained staged bundled plugin dependencies in the npm staging manifest while installing only newly missing packages, so Gateway restarts avoid reinstalling the full retained dependency set when one runtime dependency is absent. Fixes [#&#8203;73055](https://github.com/openclaw/openclaw/issues/73055). Thanks [@&#8203;GCorp2026](https://github.com/GCorp2026). - CLI/status: keep default `openclaw status` off the heavyweight security audit, plugin compatibility, and memory-vector probes while still showing configured Telegram channels through setup metadata, so routine health checks stay fast and no longer render an empty Channels table. Fixes [#&#8203;72993](https://github.com/openclaw/openclaw/issues/72993). Thanks [@&#8203;comick1](https://github.com/comick1). - Channels/Telegram: send a best-effort native typing cue immediately after an inbound message is accepted, so slow pre-dispatch turns show Telegram liveness before queueing, compaction, model, or tool work starts. Fixes [#&#8203;63759](https://github.com/openclaw/openclaw/issues/63759). Thanks [@&#8203;alessandropcostabr](https://github.com/alessandropcostabr). - Channels/Telegram: stop native approval startup auth failures from retrying every second, while still waiting through retryable Gateway auth handoffs, so Telegram approval setup problems no longer create a reconnect/log loop during channel startup. Refs [#&#8203;72846](https://github.com/openclaw/openclaw/issues/72846) and [#&#8203;72867](https://github.com/openclaw/openclaw/issues/72867). Thanks [@&#8203;kiranvk-2011](https://github.com/kiranvk-2011) and [@&#8203;porly1985](https://github.com/porly1985). - Channels/Microsoft Teams: unwrap staged CommonJS JWT runtime dependencies before Bot Connector token validation so inbound Teams messages no longer 401 after the bundled runtime-deps move. Fixes [#&#8203;73026](https://github.com/openclaw/openclaw/issues/73026) and [#&#8203;73167](https://github.com/openclaw/openclaw/issues/73167). Thanks [@&#8203;kbrown10000](https://github.com/kbrown10000) and [@&#8203;mikelavrik](https://github.com/mikelavrik). - Gateway/auth: allow local direct callers in trusted-proxy mode to use the configured gateway password as an internal fallback while keeping token fallback rejected. Fixes [#&#8203;17761](https://github.com/openclaw/openclaw/issues/17761). Thanks [@&#8203;dashed](https://github.com/dashed), [@&#8203;vincentkoc](https://github.com/vincentkoc), and [@&#8203;jetd1](https://github.com/jetd1). - Gateway/auth: add explicit `trustedProxy.allowLoopback` support for same-host loopback reverse proxies while keeping loopback trusted-proxy auth fail-closed by default and preserving required-header and allowlist checks. Fixes [#&#8203;59167](https://github.com/openclaw/openclaw/issues/59167); carries forward [#&#8203;63379](https://github.com/openclaw/openclaw/issues/63379). Thanks [@&#8203;Matir](https://github.com/Matir), [@&#8203;jeremyakers](https://github.com/jeremyakers), and [@&#8203;mrosmarin](https://github.com/mrosmarin). - Channels/sessions: prevent guarded inbound session recording from creating route-only phantom sessions while still allowing last-route updates for sessions that already exist. Carries forward [#&#8203;73009](https://github.com/openclaw/openclaw/issues/73009). Thanks [@&#8203;jzakirov](https://github.com/jzakirov). - Cron: accept `delivery.threadId` in Gateway cron add/update schemas so scheduled announce delivery can target Telegram forum topics and other threaded channel destinations through the documented delivery path. Fixes [#&#8203;73017](https://github.com/openclaw/openclaw/issues/73017). Thanks [@&#8203;coachsootz](https://github.com/coachsootz). - Plugins/runtime deps: stage bundled plugin dependencies imported by mirrored root dist chunks, so packaged memory and status commands do not miss `chokidar` or similar root-chunk dependencies after update. Fixes [#&#8203;72882](https://github.com/openclaw/openclaw/issues/72882) and [#&#8203;72970](https://github.com/openclaw/openclaw/issues/72970); carries forward [#&#8203;72992](https://github.com/openclaw/openclaw/issues/72992). Thanks [@&#8203;shrimpy8](https://github.com/shrimpy8), [@&#8203;colin-chang](https://github.com/colin-chang), and [@&#8203;Schnup03](https://github.com/Schnup03). - Plugins/runtime deps: reuse unchanged bundled plugin runtime mirrors instead of rebuilding plugin trees on every load, cutting avoidable writes and restart/reconnect I/O on slow storage. Fixes [#&#8203;72933](https://github.com/openclaw/openclaw/issues/72933). Thanks [@&#8203;jasonftl](https://github.com/jasonftl). - Agents/runtime context: deliver hidden runtime context through prompt-local system context while keeping the transcript-only custom entry out of provider user turns, and strip stale copied runtime-context prefaces from user-facing replies. Fixes [#&#8203;72386](https://github.com/openclaw/openclaw/issues/72386); carries forward [#&#8203;72969](https://github.com/openclaw/openclaw/issues/72969). Thanks [@&#8203;jhsmith409](https://github.com/jhsmith409). - Channels/Telegram: skip the optional webhook-info API call during polling-mode status checks and startup bot-label probes so long-polling setups avoid an unnecessary Telegram round trip. Carries forward [#&#8203;72990](https://github.com/openclaw/openclaw/issues/72990). Thanks [@&#8203;danielgruneberg](https://github.com/danielgruneberg). - CLI/message: resolve targeted `openclaw message` channels to their owning plugin before loading the registry, and fall back to configured channel plugins when the channel must be inferred, so scripted sends avoid full bundled plugin registry scans without assuming channel ids match plugin ids. Fixes [#&#8203;73006](https://github.com/openclaw/openclaw/issues/73006). Thanks [@&#8203;jasonftl](https://github.com/jasonftl). - Plugins/startup: parse strict JSON plugin manifests with native JSON first and keep JSON5 as the compatibility fallback, reducing manifest registry CPU during Gateway boot and CLI startup. Fixes [#&#8203;73011](https://github.com/openclaw/openclaw/issues/73011). Thanks [@&#8203;jasonftl](https://github.com/jasonftl). - CLI/models: keep route-first `models status --json` stdout reserved for the JSON payload by routing auth-profile and startup diagnostics to stderr. Fixes [#&#8203;72962](https://github.com/openclaw/openclaw/issues/72962). Thanks [@&#8203;vishutdhar](https://github.com/vishutdhar). - Gateway/runtime: keep dirty-tree status calls from rebuilding live `dist`, clear stale task and restart state across in-process restarts, retry transient Discord lazy imports, and let channel startup continue after slow model warmup so browser, Discord, and voice-call sidecars come online. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Security/CodeQL: replace file SecretRef id gateway schema regex validation with segment-aligned predicates and set empty permissions on release summary/backfill jobs so the narrowed CodeQL profile stays clean. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Sessions: ignore future-dated session activity timestamps during reset freshness checks and cap future `updatedAt` values at the merge boundary so clock-skewed messages cannot keep stale sessions alive forever. Fixes [#&#8203;72989](https://github.com/openclaw/openclaw/issues/72989). Thanks [@&#8203;martingarramon](https://github.com/martingarramon). - Sessions: apply search, activity filters, and limits before gateway row enrichment so bounded session lists avoid scanning discarded transcripts. Carries forward [#&#8203;72978](https://github.com/openclaw/openclaw/issues/72978). Thanks [@&#8203;yeager](https://github.com/yeager). - Sessions: remove trajectory runtime and pointer sidecars when session maintenance prunes, caps, or disk-evicts their owning session, while preserving sidecars still referenced by live rows. Fixes [#&#8203;73000](https://github.com/openclaw/openclaw/issues/73000). Thanks [@&#8203;jared-rebel](https://github.com/jared-rebel). - Plugins/CLI: allow managed plugin installs when the active extensions root is a symlink to a real state directory, while keeping nested target symlinks blocked and suppressing misleading hook-pack fallback errors for install-boundary failures. Fixes [#&#8203;72946](https://github.com/openclaw/openclaw/issues/72946). Thanks [@&#8203;mayank6136](https://github.com/mayank6136). - Providers/Ollama: mark discovered Ollama catalog models as supporting streaming usage metadata so token accounting stays enabled for local models. ([#&#8203;72976](https://github.com/openclaw/openclaw/issues/72976)) Thanks [@&#8203;sdeyang](https://github.com/sdeyang). - Media understanding: reject malformed MIME values with trailing junk while preserving standard parameter tails before enrichment uses them. ([#&#8203;72914](https://github.com/openclaw/openclaw/issues/72914)) Thanks [@&#8203;volcano303](https://github.com/volcano303). - WebChat: keep bare `/new` and `/reset` prompts from producing empty transcript text by inserting the hidden session marker when the visible tail is blank. ([#&#8203;72863](https://github.com/openclaw/openclaw/issues/72863)) Thanks [@&#8203;mahopan](https://github.com/mahopan). - CLI/update: explain completion-cache refresh timeouts with manual refresh guidance instead of surfacing a raw low-level timeout. Fixes [#&#8203;72842](https://github.com/openclaw/openclaw/issues/72842). ([#&#8203;72850](https://github.com/openclaw/openclaw/issues/72850)) Thanks [@&#8203;iot2edge](https://github.com/iot2edge). - Memory-core/dreaming: give narrative generation a 60-second timeout so slower local or remote models can finish instead of timing out at 15 seconds. Fixes [#&#8203;72837](https://github.com/openclaw/openclaw/issues/72837). ([#&#8203;72852](https://github.com/openclaw/openclaw/issues/72852)) Thanks [@&#8203;RayWoo](https://github.com/RayWoo). - Plugins/hooks: inject each plugin's resolved config into internal hook event context without mutating the shared event object. ([#&#8203;72888](https://github.com/openclaw/openclaw/issues/72888)) Thanks [@&#8203;jalapeno777](https://github.com/jalapeno777). - Agents/ACP: pass the resolved ACP agent directory into media understanding so per-agent media caches and config are used for ACP-dispatched image turns. ([#&#8203;72832](https://github.com/openclaw/openclaw/issues/72832)) Thanks [@&#8203;luyao618](https://github.com/luyao618). - Gateway/Bonjour: truncate mDNS service names and host labels to the 63-byte DNS label limit at valid UTF-8 boundaries. ([#&#8203;72809](https://github.com/openclaw/openclaw/issues/72809)) Thanks [@&#8203;luyao618](https://github.com/luyao618). - Feishu: treat groups explicitly configured under channels.feishu.groups as admitted even when groupAllowFrom is empty, while preserving groupPolicy: "disabled" as a hard group block and keeping groups.\* wildcard defaults non-admitting. Fixes [#&#8203;67687](https://github.com/openclaw/openclaw/issues/67687). ([#&#8203;72789](https://github.com/openclaw/openclaw/issues/72789)) Thanks [@&#8203;MoerAI](https://github.com/MoerAI). - Gateway/startup: keep hot Gateway boot paths on leaf config imports and add max-RSS reporting to the gateway startup bench so low-memory startup regressions are visible before release. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - WebChat: read `chat.history` from active transcript branches, drop stale streamed assistant tails once final history catches up, and coalesce duplicate in-flight Control UI submits, so rewritten prompts, completed replies, and rapid send events no longer render or process twice. Fixes [#&#8203;72975](https://github.com/openclaw/openclaw/issues/72975), [#&#8203;72963](https://github.com/openclaw/openclaw/issues/72963), and [#&#8203;72974](https://github.com/openclaw/openclaw/issues/72974). Thanks [@&#8203;dmagdici](https://github.com/dmagdici), [@&#8203;lhtpluto](https://github.com/lhtpluto), and [@&#8203;Benjamin5281999](https://github.com/Benjamin5281999). - WebChat/TTS: persist automatic final-mode TTS audio as a supplemental audio-only transcript update instead of adding a second assistant message with the same visible text. Fixes [#&#8203;72830](https://github.com/openclaw/openclaw/issues/72830). Thanks [@&#8203;lhtpluto](https://github.com/lhtpluto). - Agents/LSP: terminate bundled stdio LSP process trees during runtime disposal and Gateway shutdown, so nested children such as `tsserver` do not survive stop or restart. Fixes [#&#8203;72357](https://github.com/openclaw/openclaw/issues/72357). Thanks [@&#8203;ai-hpc](https://github.com/ai-hpc) and [@&#8203;bittoby](https://github.com/bittoby). - Diagnostics/OTEL: capture privacy-safe model-call request payload bytes, streamed response bytes, first-response latency, and total duration in diagnostic events, plugin hooks, stability snapshots, and OTEL model-call spans/metrics without logging raw model content. Fixes [#&#8203;33832](https://github.com/openclaw/openclaw/issues/33832). Thanks [@&#8203;wwh830](https://github.com/wwh830). - Logging: write validated diagnostic trace context as top-level `traceId`, `spanId`, `parentSpanId`, and `traceFlags` fields in file-log JSONL records so traced requests and model calls are easier to correlate in log processors. Refs [#&#8203;40353](https://github.com/openclaw/openclaw/issues/40353). Thanks [@&#8203;liangruochong44-ui](https://github.com/liangruochong44-ui). - Logging/sessions: apply configured redaction patterns to persisted session transcript text and accept escaped character classes in safe custom redaction regexes, so transcript JSONL no longer keeps matching sensitive text in the clear. Fixes [#&#8203;42982](https://github.com/openclaw/openclaw/issues/42982). Thanks [@&#8203;panpan0000](https://github.com/panpan0000). - Providers/Ollama: honor `/api/show` capabilities when registering local models so non-tool Ollama models no longer receive the agent tool surface, and keep native Ollama thinking opt-in instead of enabling it by default. Fixes [#&#8203;64710](https://github.com/openclaw/openclaw/issues/64710) and duplicate [#&#8203;65343](https://github.com/openclaw/openclaw/issues/65343). Thanks [@&#8203;yuan-b](https://github.com/yuan-b), [@&#8203;netherby](https://github.com/netherby), [@&#8203;xilopaint](https://github.com/xilopaint), and [@&#8203;Diyforfun2026](https://github.com/Diyforfun2026). - Control UI/Agents: remount the Overview model controls when switching agents so the primary-model picker cannot retain stale per-agent selection. Fixes [#&#8203;39392](https://github.com/openclaw/openclaw/issues/39392); carries forward [#&#8203;39401](https://github.com/openclaw/openclaw/issues/39401), notes the duplicate [#&#8203;39495](https://github.com/openclaw/openclaw/issues/39495) approach, and keeps [#&#8203;46275](https://github.com/openclaw/openclaw/issues/46275)/[#&#8203;54724](https://github.com/openclaw/openclaw/issues/54724) broader stabilization out of scope. Thanks [@&#8203;daijunyi002](https://github.com/daijunyi002), [@&#8203;SergioChan](https://github.com/SergioChan), [@&#8203;aworki](https://github.com/aworki), and [@&#8203;wsyjh8](https://github.com/wsyjh8). - Auto-reply: poison inbound message dedupe after replay-unsafe provider/runtime failures so retries stay safe before visible progress but cannot duplicate messages after block output, tool side effects, or session progress. Fixes [#&#8203;69303](https://github.com/openclaw/openclaw/issues/69303); keeps [#&#8203;58549](https://github.com/openclaw/openclaw/issues/58549) and [#&#8203;64606](https://github.com/openclaw/openclaw/issues/64606) as duplicate validation. Thanks [@&#8203;martingarramon](https://github.com/martingarramon), [@&#8203;NikolaFC](https://github.com/NikolaFC), and [@&#8203;zeroth-blip](https://github.com/zeroth-blip). - Agents/model fallback: jump directly to a known later live-session model redirect instead of walking unrelated fallback candidates, while preserving the already-landed live-session/fallback loop guard. Fixes [#&#8203;57471](https://github.com/openclaw/openclaw/issues/57471); related loop family already closed via [#&#8203;58496](https://github.com/openclaw/openclaw/issues/58496). Thanks [@&#8203;yuxiaoyang2007-prog](https://github.com/yuxiaoyang2007-prog). - Gateway/Bonjour: keep [@&#8203;homebridge/ciao](https://github.com/homebridge/ciao) cancellation handlers registered across advertiser restarts so late probing cancellations cannot crash Linux and other mDNS-churned gateways. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugins/startup: load the default `memory-core` slot during Gateway startup when permitted so active-memory recall can call `memory_search` and `memory_get` without requiring an explicit `plugins.slots.memory` entry, while preserving `plugins.slots.memory: "none"`. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Gateway/plugins: resolve `gateway_start` cron hooks from live Gateway runtime state before the legacy deps fallback, so memory-core dreaming cron reconciliation keeps working on installs where `deps.cron` is not populated during service startup. Fixes [#&#8203;72835](https://github.com/openclaw/openclaw/issues/72835). Thanks [@&#8203;RayWoo](https://github.com/RayWoo). - Plugins/CLI: prefer native require for compiled bundled plugin JavaScript before jiti so read-only config, status, device, and node commands avoid unnecessary transform overhead on slow hosts. Fixes [#&#8203;62842](https://github.com/openclaw/openclaw/issues/62842). Thanks [@&#8203;Effet](https://github.com/Effet). - Plugins/compat: inventory doctor-side deprecation migrations separately from runtime plugin compatibility so release sweeps preserve needed repairs while enforcing dated removal windows. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugins/compat: add missing dated compatibility records for legacy extension-api, memory registration, provider hook/type aliases, runtime aliases, channel SDK helpers, and approval/test utility shims. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugins/CLI: refresh the persisted registry after managed plugin files are removed so ClawHub uninstall cannot leave stale `plugins list` entries. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugins/CLI: make plugin install and uninstall config writes conflict-aware, clear stale denylist entries on explicit reinstall/removal, and delete managed plugin files only after config/index commit succeeds. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - Plugins: fail `plugins update` when tracked plugin or hook updates error, keep bundled runtime-dependency repair behind restrictive allowlists, and reject package installs with unloadable extension entries. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - WebChat/Control UI: support non-video file attachments in chat uploads while preserving the existing image attachment path and MIME-sniff fallback for generic image uploads. ([#&#8203;70947](https://github.com/openclaw/openclaw/issues/70947)) Thanks [@&#8203;IAMSamuelRodda](https://github.com/IAMSamuelRodda). - Skills/memory: restore Chokidar v5 hot reloads by watching concrete skill and memory roots with filters, including SKILL.md removals and deleted skill folders without broad workspace recursion. Fixes [#&#8203;27404](https://github.com/openclaw/openclaw/issues/27404), [#&#8203;33585](https://github.com/openclaw/openclaw/issues/33585), and [#&#8203;41606](https://github.com/openclaw/openclaw/issues/41606). Thanks [@&#8203;shelvenzhou](https://github.com/shelvenzhou), [@&#8203;08820048](https://github.com/08820048), and [@&#8203;rocke2020](https://github.com/rocke2020). - Gateway/chat: keep duplicate attachment-backed `chat.send` retries with the same idempotency key on the documented in-flight path so aborts still target the real active run. Fixes [#&#8203;70139](https://github.com/openclaw/openclaw/issues/70139). Thanks [@&#8203;Feelw00](https://github.com/Feelw00). - Gateway/chat: preserve repeated boundary characters while merging assistant chat stream deltas, including repeated digits, CJK characters, and markdown/table tokens. Fixes [#&#8203;63769](https://github.com/openclaw/openclaw/issues/63769); carries forward [#&#8203;63994](https://github.com/openclaw/openclaw/issues/63994) and [#&#8203;65457](https://github.com/openclaw/openclaw/issues/65457). Thanks [@&#8203;yon950905](https://github.com/yon950905) and [@&#8203;mohuaxiao](https://github.com/mohuaxiao). - Plugins: share package entrypoint resolution between install and discovery, reject mismatched `runtimeExtensions`, and cache bundled runtime-dependency manifest reads during scans. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc). - WhatsApp/Web: keep quiet but healthy linked-device sessions connected by basing the watchdog on WhatsApp Web transport activity, while retaining a longer app-silence cap so frame activity cannot mask a stuck session forever. Fixes [#&#8203;70678](https://github.com/openclaw/openclaw/issues/70678); carries forward the focused [#&#8203;71466](https://github.com/openclaw/openclaw/issues/71466) approach and keeps [#&#8203;63939](https://github.com/openclaw/openclaw/issues/63939) as related configurable-timeout follow-up. Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc) and [@&#8203;oromeis](https://github.com/oromeis). - Discord/gateway: count failed health-monitor restart attempts toward cooldown and hourly caps, and evict stale account lifecycle state during channel reloads so repeated Discord gateway recovery cannot loop on old status. Fixes [#&#8203;38596](https://github.com/openclaw/openclaw/issues/38596). ([#&#8203;40413](https://github.com/openclaw/openclaw/issues/40413)) Thanks [@&#8203;jellyAI-dev](https://github.com/jellyAI-dev) and [@&#8203;vashquez](https://github.com/vashquez). - TTS/BlueBubbles: pre-transcode synthesized MP3 audio to opus-in-CAF (mono, 24 kHz — validated against macOS 15.x Messages.app's native voice-memo CAF descriptor) on macOS hosts before handing the file to BlueBubbles, so iMessage renders the result as a native voice-memo bubble with proper duration and waveform UI instead of a plain file attachment. Adds an opt-in `tts.voice.preferAudioFileFormat` channel capability and a magic-byte sniff for the CAF container so the host-local-media validator (which uses `file-type` and didn't recognize CAF natively) can verify the pre-transcoded buffer. Channels that don't opt in are unaffected. ([#&#8203;72586](https://github.com/openclaw/openclaw/issues/72586)) Fixes [#&#8203;72506](https://github.com/openclaw/openclaw/issues/72506). Thanks [@&#8203;omarshahine](https://github.com/omarshahine). - Feishu: retry WebSocket startup failures with monitor-owned backoff while preserving SDK-local heartbeat defaults, so persistent-connection startup failures no longer leave the monitor hung. Fixes [#&#8203;68766](https://github.com/openclaw/openclaw/issues/68766); related [#&#8203;42354](https://github.com/openclaw/openclaw/issues/42354) and [#&#8203;55532](https://github.com/openclaw/openclaw/issues/55532). Thanks [@&#8203;alex-xuweilong](https://github.com/alex-xuweilong), [@&#8203;120106835](https://github.com/120106835), [@&#8203;sirfengyu](https://github.com/sirfengyu), and [@&#8203;tianhaocui](https://github.com/tianhaocui). - Cron: normalize isolated job tool allowlists before granting the narrow self-removal cron tool path, keeping scheduled jobs aligned with shared tool policy normalization. ([#&#8203;73028](https://github.com/openclaw/openclaw/issues/73028)) Thanks [@&#8203;jalehman](https://github.com/jalehman). </details> --- ### Configuration 📅 **Schedule**: (in timezone America/Los_Angeles) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNTAuMCIsInVwZGF0ZWRJblZlciI6IjQzLjE2OC42IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
Collaborator

🟢 LOW — PR Risk Assessment

2 additions, 2 deletions across 1 files
Signals: routine changes

This PR contains the following updates:

📁 Changed Nix Files

File Status Changes
packages/openclaw-image/default.nix 📝 changed +2/-2

Assessed by Ash • 2026-05-17 01:04 UTC

<!-- ash-pr-risk --> ## 🟢 LOW — PR Risk Assessment **2** additions, **2** deletions across **1** files **Signals:** routine changes > This PR contains the following updates: ### 📁 Changed Nix Files | File | Status | Changes | |------|--------|---------| | `packages/openclaw-image/default.nix` | 📝 changed | +2/-2 | --- *Assessed by Ash • 2026-05-17 01:04 UTC*
renovate-bot added 1 commit 2026-05-14 12:06:49 -07:00
chore(deps): update ghcr.io/openclaw/openclaw docker tag to v2026.5.12
CI / check (pull_request) Failing after 10m57s
CI / build-and-cache (pull_request) Has been skipped
CI / Check OpenClaw Changes (pull_request) Failing after 14m38s
CI / Build & Push OpenClaw Image (pull_request) Has been skipped
464e0f8070
renovate-bot force-pushed renovate/openclaw from d1c966a8d9 to 464e0f8070 2026-05-14 12:06:49 -07:00 Compare
renovate-bot changed title from chore(deps): update ghcr.io/openclaw/openclaw docker tag to v2026.5.7 to chore(deps): update ghcr.io/openclaw/openclaw docker tag to v2026.5.12 2026-05-14 12:06:57 -07:00
Some required checks failed
CI / check (pull_request) Failing after 10m57s
Required
Details
CI / build-and-cache (pull_request) Has been skipped
Required
Details
CI / Check OpenClaw Changes (pull_request) Failing after 14m38s
Required
Details
CI / Build & Push OpenClaw Image (pull_request) Has been skipped
Required
Details
Some required checks were not successful.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin renovate/openclaw:renovate/openclaw
git checkout renovate/openclaw
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: johno/nixos-configs#61