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
pull from: renovate/openclaw
merge into: johno:main
johno:main
johno:ash/ci-runner-labels
johno:ash/workout-card-launcher
johno:ash/add-plasma-bigscreen-cache
johno:ash/add-lnav
johno:renovate/lock-file-maintenance
johno:ash/talk-desktop-wayland-screenshare
johno:ash/sway-screen-sharing
johno:ash/fix-renovate-schedule
johno:ash/plasma-bigscreen
johno:fix/ci-skip-cached-packages
johno:polecat/dust/x-fqaob@mlfbyrhb
johno:polecat/fury/x-iyz0w@mlecbczk
johno:polecat/nitro/x-xiiep@mlebx809
johno:polecat/shiny/x-qdkuu@mlec8nfv
johno:polecat/guzzle/x-xiiep@mlec0has
johno:polecat/chrome/x-ymkgu@mlebby8e
johno:polecat/rust/x-lnr8g@mlebamik
johno:polecat/rust/x-0cf@ml2ye219
johno:polecat/rust/hq-0h1p9m@ml2ugjq1
johno:polecat/rust/x-nyo@mkoso6ie
johno:polecat/chrome/nix-6pi@mkiwlml9
johno:beads-sync
johno:bead/nixos-configs-w0v
johno:bead/nixos-configs-wgw
johno:bead/nixos-configs-apu
johno:bead/nixos-configs-g4n
johno:bead/nixos-configs-9eq
johno:bead/nixos-configs-4ht
johno:bead/nixos-configs-cto
johno:bead/nixos-configs-2mk
johno:bead/nixos-configs-0vf
johno:fix/mu4e-email-body-nixos-configs-9l8
johno:bead/nixos-configs-fkt
johno:bead/nixos-configs-tcu
johno:bead/nixos-configs-u81
johno:bead/nixos-configs-alr
johno:bead/nixos-configs-vru
johno:bead/nixos-configs-pea
johno:bead/nixos-configs-ek5
johno:bead/nixos-configs-bli
johno:bead/nixos-configs-tdf
johno:bead/nixos-configs-2hq
johno:bead/nixos-configs-85h
johno:bead/nixos-configs-7hd
johno:bead/nixos-configs-is4
johno:bead/nixos-configs-0ov
johno:bead/nixos-configs-v2v
johno:feat/prebuilt-doom-usb-nixos-configs-1wd
johno:feat/starship-prompt-nixos-configs-uji
johno:feature/sendspin-cli-package
johno:25.11
johno:nix-deck-setup
johno:boxy-app-launcher
johno:btrfs-role
johno:convert-nixbook-to-btrfs
johno:add-liveusb
johno:shared-steam-library
johno:add-steam-streaming-sleep-inhibitor
johno:kodi-add-kdeconnect
johno:kodi-updates
johno:kodi-hdr
johno:spotifyd
johno:plasma-manager
johno:fix-kodi-wayland
johno:k3s
johno:sway
johno:kodi-to-wayland
johno:home-manager-as-nixos-module
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "renovate/openclaw"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
This PR contains the following updates:
2026.4.26→2026.5.12Release Notes
openclaw/openclaw (ghcr.io/openclaw/openclaw)
v2026.5.12Compare Source
Changes
acp.fallbacksso ACP turns can try configured backup runtime backends when the primary backend is unavailable before any output is emitted. (#69542) Thanks @kaseonedge.max_completion_tokensandmax_tokenson inbound/v1/chat/completionsrequests so client-provided token caps reach the upstream provider viastreamParams.maxTokens, withmax_completion_tokenstaking precedence when both are sent. Thanks @Lellansin.openclaw models auth login --provider openaistart the ChatGPT/Codex account login by default, while--method api-keyremains the explicit OpenAI API-key setup path.google/gemini-3.1-pro-previewfor Gemini 3.1 testing.google/gemini-3.1-pro-previewfor Gemini 3.1 testing.openclaw models auth login --set-defaultprovider auth flows before writing config, so Gemini testing targetsgoogle/gemini-3.1-pro-preview.google/gemini-3.1-pro-preview.google/gemini-3.1-pro-preview.config setmutation output for agent overrides and provider catalog rows, so current config emitsgoogle/gemini-3.1-pro-preview.google/gemini-3.1-pro-previewfor Gemini 3.1 testing.google/gemini-3.1-pro-previewfor Gemini 3.1 testing.google/gemini-3.1-pro-previewfor Gemini 3.1 testing.google/gemini-3.1-pro-preview.agents.defaults.subagents.announceTimeoutMsin the sub-agent and configuration references. (#75509) Thanks @akrimm702.cron.get,openclaw cron get <id>, and agent-toolgetsupport for inspecting one stored cron job by id. (#75117) Thanks @samzong.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.plugin-inspector-advisoryartifact to Plugin Prerelease so release runs capture bundled plugin compatibility triage without changing the blocking gate./editwithimage_urlsarray, enforce NB2 edit geometry usingaspect_ratioandresolutionparams, 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.exec/waitwhile hiding enabled tools behind a catalog bridge.session.agentToAgent.maxPingPongTurnsup to 20 while keeping the default at 5 for longer agent-to-agent reply chains. Fixes #52382. (#52400) Thanks @thirumaleshp.tools.message.crossContextoverrides so sandboxed/public agents can restrict message sends to the current conversation without changing the global bot policy.tools.message.actions.allowoverrides so sandboxed/public agents can expose and enforce send-only message tools.localServicestartup for on-demand local model servers before OpenAI-compatible requests, including one-shot model probes./context mapto send a treemap image of the current session context contributors. (#79867)unfurlLinksandunfurlMediaconfig for botchat.postMessagereplies, including per-account overrides, so Slack link and media previews can be suppressed without workspace-wide settings. Fixes #48435. (#80145) Thanks @esegev1 and @HemantSudarshan.replyBroadcastsupport for text and Block Kit thread replies so agents can opt into Slack's parent-channelreply_broadcastbehavior. (#64365) Thanks @tony88331.message.sendcalls toD...targets do not split the same Slack DM thread into a channel session. Fixes #80091. (#80111) Thanks @bek91.provider-auth-loginpublic subpath after moving Chutes, GitHub Copilot, and OpenAI Codex auth flows back to provider-owned modules.talk.realtime.instructionsso operators can append realtime voice style instructions while preserving OpenClaw's built-in agent-consult guidance. (#79081) Thanks @VACInc.opusscriptdecoder by ignoring optional native@discordjs/opusbuilds, avoiding slow native addon compiles outside dedicated voice-performance lanes.@discordjs/opusinstall script and decoder preference for live voice-performance lanes without charging unrelated Docker/tests for native addon builds.voice.allowedChannelsto restrict voice joins and bot voice-state moves to configured channels while preserving open voice behavior when unset.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.@agentclientprotocol/claude-agent-acp0.33.1, Codex ACP0.14.0, Baileys7.0.0-rc10, Google GenAI2.0.1, OpenAI6.37.0, AWS SDK3.1045.0, Kysely0.29.0, Tlon skill0.3.6, Aimock1.19.5, and tsdown0.22.0.@earendil-worksnamespace, refresh Twitch Twurple packages, and move@openclaw/fs-safefrom the GitHub release pin to the published npm package.process logbefore sending interactive input and to usewaitingForInput/stdinWritablehints fromlog/poll.@whiskeysockets/baileystobaileyswhile keeping the7.0.0-rc10runtime.sendSessionAttachment, and Cron-backedscheduleSessionTurn/tag cleanup under the grouped session namespace. Replaces #75578/#75581/#75588 and part of #73384/#74483. Thanks @100yenadmin.extractStructuredWithModel(...)plus the optional provider-sideextractStructured(...)seam so trusted plugins can run bounded image-first structured extraction with optional supplemental text context through provider-owned runtimes such as Codex.tools.exec.commandHighlightingso parser-derived command highlighting in approval prompts can be enabled globally or per agent. (#79348) Thanks @jesse-merhi.skills.load.allowSymlinkTargetsso intentional symlinked skill folders can resolve into trusted sibling repos without disabling root containment.fallbackskey andagents.defaults.model.fallbacksis 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./think defaultand/fast defaultto clear session overrides and inherit configured/provider defaults. (#79385) Thanks @VACInc.@openai/codex0.130.0,acpx0.7.0, AWS SDK3.1044.0, OpenTelemetry0.217.0,typebox1.1.38,vite8.0.11,oxfmt0.48.0, andoxlint1.63.0, and update the Codex harness model snapshot for the new bundled app-server catalog.npm packartifacts via environment variables.argsarray inagents.<name>config so paths and flag values containing spaces stay intact when spawning ACP agent processes. Thanks @TheArchitectit and @BunsDev.agents.defaults.subagents.delegationModeand per-agent overrides withsuggest/prefermodes, and centralize config-backed system prompt resolution across embedded, CLI, compaction, and command-export prompt surfaces.sessions_yieldwait guidance, stabletaskNamealiases, and active-child runtime prompt context for spawned sub-agent work.oc-pathplugin, providingopenclaw pathfor surgicaloc://access to markdown, JSONC, and JSONL workspace files.providerCatalogEntrymanifests, shared media list help, live catalog caching, and per-model video capability overlays.MessagePresentationsemantics without duplicating native cards or components.${baseUrl}/modelsso per-account entitlement and accurate context windows surface at runtime; static manifest catalog (now includinggpt-5.5) remains the fallback when discovery is disabled or the API is unreachable.plugins.entries.active-memory.config.toolsAllowrecall tool names for custom memory plugins while keeping the built-in memory-core default onmemory_search/memory_getand preservingmemory_recallautomatically forplugins.slots.memory: "memory-lancedb".NONErecall decisions asstatus=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 brokenstatus=emptymemory. Fixes #79812. (#80015) Thanks @TurboTheTurtle.From, so @mention replies do not drop the configured group id. Fixes #79457. Thanks @greyxiong.reasoningDefaultvalues when deciding whether channel reasoning previews should stream or stay hidden, addressing the preview-default part of #73182. Thanks @anagnorisis2peripeteia./models,/status, and/newresponses stay visible in QQ Bot C2C conversations. Fixes #79310. Thanks @rollingshmily.tiniso long-lived containers reap orphaned child processes and forward signals correctly. (#77885) Thanks @VintageAyu.tasks.list,tasks.get, andtasks.cancel, including generated Swift model typing for optional task summaries. Thanks @BunsDev.google/gemini-3-pro-previewandgoogle-gemini-cli/gemini-3-pro-previewselections togoogle/gemini-3.1-pro-previewbefore they are written to model config.google/gemini-3.1-pro-previewids from configured provider catalog rows so model list and selection paths can test Gemini 3.1 instead of retired Gemini 3 Pro.google/gemini-3-pro-previewtogoogle/gemini-3.1-pro-preview, so Kilo-style configured catalogs test Gemini 3.1 instead of the retired Gemini 3 Pro id.google/gemini-3.1-pro-previewinstead of re-emitting retired Gemini 3 Pro config keys.google/gemini-3.1-pro-preview.google/gemini-3-pro-previewselections.serviceTierparameter for Bedrock models, configurable viaagents.defaults.params.serviceTieror per-model inagents.defaults.models. Valid values:default,flex,priority,reserved. (#64512) Thanks @mobilinkd.tools.exec.securityinstead of the non-schemaagents.defaults.exec.securitypath, so configuredfull/denyvalues render accurately. Fixes #78311. Thanks @FriedBack.deliverOutboundPayloadsand legacy reply-dispatch bridges as deprecated compatibility substrate, enrichsendDurableMessageBatchwith explicit durable send outcomes, migrate bundled send/turn paths off deprecated APIs, and enforce the split withcheck:deprecated-api-usage.openai-codexOAuth when no direct API key is configured, make Google Meettest_speechhonormode: "bidi", expose Control UI launch options for provider/model/voice/transport/VAD/reasoning, and update the default OpenAI realtime voice model togpt-realtime-2. Thanks @Solvely-Colin.details(functions, symbols, bigints, cycles, oversized payloads) before middleware sees them. Tool emitters legitimately produce raw dependency payloads ondetails, and the harness owes any registered middleware a JSON-safe view of that payload; otherwise a no-op middleware (e.g. bundledtokenjuiceon thepiruntime) 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.22.16+so native SQLite query handling can rely on thenode:sqlitestatement metadata API while continuing to recommend Node 24. (#78921)/vcmodes so Discord voice channels can run as STT/TTS, a realtime talk buffer with the OpenClaw agent brain, or a bidi realtime session withopenclaw_agent_consult.voice.realtime.minBargeInAudioEndMsand let the realtime provider own playback clearing, so speaker echo no longer cuts OpenAI realtime model audio ataudioEndMs=0while low-echo rooms can opt back into immediate barge-in with0.agent-proxythe default voice mode so realtime voice acts as the microphone/speaker extension of the routed OpenClaw agent session, withstt-ttsremaining available as an explicit fallback.agent-proxyrealtime 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.conversation.item.donefunction-call events, and preserve continuing tool results through the gateway relay so the OpenAI realtime bridge reliably routes consults before speaking the final answer.@openai/codex@0.129.0, defer OpenClaw integration dynamic tools behind Codex tool search by default, and accept current Codex service-tier values so legacyfastsettings survive the stable harness upgrade aspriority.messagetool spec so visible replies are sent throughmessage(action="send")instead of staying private. (#79704)compat.thinkingFormatvaluesqwenandqwen-chat-templatefor configured OpenAI-compatible Qwen models, preserving them through catalog normalization and mapping/thinklevels toenable_thinkingorchat_template_kwargs.enable_thinking. Fixes #79677. (#79777) Thanks @indulgeback.--prefix ., avoiding npm 10.9.3 Arborist crashes on native Windows WhatsApp plugin installs. Fixes #78514. (#78902) Thanks @melihselamett-stack.pathToFileURLso Windows paths with backslashes still run the--checkand--writecommand body. (#52989) Thanks @easyteacher.imsg rpcfor reactions, edits, unsends, replies, rich sends, attachments, and group management whenimsg status --jsonreports the required bridge capabilities.HEARTBEAT_OKacknowledgements 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.openclaw channels capabilities --channel discord --target channel:<id>andchannels status --probeaudit voice-channel permissions, including auto-join targets, so missing Connect/Speak/Read Message History permissions show up before/vc join.skipDeferralon thegateway.restart.requestRPC and addopenclaw gateway restart --safe --skip-deferralso operators can bypass the safe-restart deferral gate when a pinned task run prevents the OpenClaw-aware restart from draining. Surfaces the existing internalscheduleGatewaySigusr1Restart({ skipDeferral })semantics added in #71637 to a public surface, complementinggateway.reload.deferralTimeoutMs. Refs #76162. Thanks @solomonneas.channels.discord.streaming.modeis set tooff.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)stdio:"pipe"on Windows so PowerShell/CMD console handles are not inherited, preventing the terminal from hanging afteropenclaw updatecompletes. Fixes #78445. (#78483) Thanks @Beandon13.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.com.openclaw.presentationmetadata 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.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.turn/completed, and stop global rate-limit notifications from keeping stuck turns alive.logandpollfor idle interactive background sessions so operators can inspect stuck CLIs and resume them with existing input actions. Fixes #33957. Thanks @bitloi and @vincentkoc./Runcalls when the gateway task is already running, using a locale-stable PowerShell task-state probe before retrying. Fixes #52044. (#52487) Thanks @andyk-ms.openclaw sessionsand Control UI session lists avoid heavyweight model resolution on large stores. (#77902) Thanks @ragesaq.session/request_permissionhandler before resolving the Gateway approval. Thanks @amknight.openai-curatedCodex plugins in the same Codex harness thread with explicitcodexPluginsconfig, cached app readiness, and fail-closed destructive-action policy. Thanks @kevinslin.destructive_enabledconfig instead of OpenClaw-maintained per-tool deny lists, leave plugin appopen_world_enabledon by default, and invalidate existing plugin app thread bindings so old generated app config is rebuilt. Thanks @kevinslin.cron-nestedlane watchdog fires, preventing internal command-lane or model-fallback timeout text from being persisted. Fixes #77703. (#78168) Thanks @brokemac79 and @transxtech.proof: suppliedwhen Barnacle finds structured real behavior proof, keep stale negative proof labels in sync across CRLF-edited PR bodies, and let ClawSweeper own the strongerproof: sufficientjudgement.talk.session.*RPC surface.plugin existsconflict hint while keeping new plugin activations selected by default. Thanks @kevinslin.rowContextcache with memoization forresolveSessionDisplayModelIdentityRef, thinking metadata, andresolveModelCostConfigso deterministic per-row resolvers run once per unique(provider, model[, agentId])tuple instead of once per session. Cuts CPU onsessions.listfor stores with many sessions sharing a small set of model tuples; behavior is unchanged for callers that pass norowContext. Thanks @rolandrscheel.openclaw cron list --agent <id>, normalize the requested agent id, and include jobs without a stored agent id under the configured default agent while keepingcron listunfiltered when no agent is supplied. Fixes #77118. Thanks @zhanggttry.configandworkspaceDirlookup context through to provider-id resolution so workspace-scoped auth aliases resolve correctly when no explicit alias map is supplied. Thanks @shakkernerd.pnpm gateway:watchso slow Gateway turns are easier to attribute from logs and stability diagnostics.message.thread-replywithfilePath, and captures baseline/candidate screenshot evidence.filePathandpathattachments when replying to a thread with the message tool.pnpm openclaw qa whatsappfor live DM canary and pairing-gate coverage using two pre-linked WhatsApp Web sessions from the QA credential pool.standardmulti-region capacity with broker hints enabled, reservingbeastfor explicit CPU-bound maintainer lanes.openclawpackage into the shared root. Thanks @vincentkoc.openclaw/plugin-sdk/channel-messagelifecycle helpers fordefineChannelMessageAdapter,deliverInboundReplyWithMessageSendContext, send/receive/live/state contracts, durable final-delivery capability derivation, capability proof helpers, and normalized message receipts.createChannelMessageAdapterFromOutboundso channel plugins can derive durable message adapters from proven outbound adapters without duplicating send/receipt bridge code.actions.prepareSendPayload(...)so channel plugins can shape message-tool sends into durable payloads while core owns queueing, hooks, retry, recovery, and acknowledgements.channel-reply-pipelinesubpath a compatibility wrapper over the shared reply core while steering root compat deprecations towardplugin-sdk/channel-message.plugin-sdk/channel-messageand 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.plugin-sdk/security-runtime, and move OpenClaw's duplicated safe filesystem write paths onto the shared@openclaw/fs-safepackage.tempWorkspace,withTempWorkspace,tempWorkspaceSync, andwithTempWorkspaceSync, matching the cleaner@openclaw/fs-safeAPI before the package is published.tbx_...lease ids from desktop smoke warmup, so provider overrides do not fail before inspect/run. Thanks @vincentkoc.before_agent_finalizeretry instructions so workflow plugins can request one more model pass. Thanks @100yenadmin.SessionEntryslot projection and scoped trusted-policy session extension reads. (#75609; replaces part of #73384/#74483) Thanks @100yenadmin.plugins.sessionActiondispatch and plugin-attributedemitAgentEventsupport so plugins can expose typed session actions and workflow events to trusted clients. (#75578; replaces part of #73384/#74483) Thanks @100yenadmin.before_tool_calland trusted policy hooks so workflow plugins can reason about known file targets without reparsing tool envelopes. (#75605) Thanks @100yenadmin.@tencent-weixin/openclaw-weixinexternal entry pinned to2.4.1so onboarding andopenclaw channels addcan install the Tencent Weixin (personal WeChat) channel by default. (#77269) Thanks @pumpkinxing1.OUTPUT_SOURCE_MAPS=1source-map build path for breakpoints in TypeScript source. (#45710) Thanks @SwissArmyBud.proxy.loopbackModefor 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./thinklevel picker so users can see the active setting before changing it. (#78278) Thanks @obviyus.before_agent_runpass/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 requirehooks.allowConversationAccess=true. (#75035) Thanks @jesse-merhi.openclaw.json; in Nix mode, config writers, mutatingopenclaw update, plugin lifecycle mutators, and doctor repair/token-generation now refuse with agent-first nix-openclaw guidance. (#78047) Thanks @joshp123.api.runtime.llm.completehost 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.channels.imessage.groups.<chat_id>.systemPrompt(and thegroups["*"]wildcard) by forwarding it asGroupSystemPrompton 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-groupsystemPromptpattern already supported by Discord, Telegram, IRC, Slack, GoogleChat, and the retired BlueBubbles channel. Fixes #78285. (#79383) Thanks @omarshahine.channels.imessage.catchup.enabled: true; tunables formaxAgeMinutes,perRunLimit,firstRunLookbackMinutes, andmaxFailureRetries. 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 aftermaxFailureRetriesto 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 regeneratedsrc/config/bundled-channel-config-metadata.generated.tsso the runtime AJV schema accepts the newchannels.imessage.catchupblock. Fixes #78649. (#79387) Thanks @omarshahine.openclaw-plugin-yuanbaonpm spec from2.11.0to2.13.0in 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.tools,tool_choice,tool_calls, androle: "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.mistral-medium-3-5to the bundled catalog with reasoning support. Thanks @sliekens.reasoning_effort="high"withtemperature: 0.Breaking
channels.bluebubblesconfigs must migrate tochannels.imessageusingimsgon a signed-in Mac or an SSH wrapper, and non-macOS defaultimsgconfigs now report remote-Mac wrapper guidance.Fixes
OPENCLAW_WORKSPACE_DIRwhen resolving the default agent workspace, preserving explicit config precedence while keeping env-backed deployments out of the system prompt fallback path. Fixes #66786.messageat runtime, keeping update and doctor output aligned with the OpenAI happy path. Thanks @pashpashpash.@tencent-weixin/openclaw-weixin@2.4.3with the matching package integrity. (#81730) Thanks @scotthuang.agents.defaults.subagents.modelbefore target agent primary models duringsessions_spawn, so model-scoped runtimes such asclaude-clistay attached to default child runs. Fixes #81395. (#81783) Thanks @joshavant.requireMentionis active, avoiding failed media-download replies for messages that should be ignored. Fixes #81181. (#81785) Thanks @joshavant.USERPROFILEin the sandbox blocked home roots so credential-bearing binds (such as.codex,.openclaw, or.sshunder the Windows user profile) are denied even whenHOMEpoints at a different shell home. (#63074) Thanks @luoyanglang.^[A-Z_][A-Z0-9_]*$strings, and resolve config-backed providerapiKeyvalues only through structured env SecretRefs (secrets.providers[id]/secrets.defaults), so unrelated env vars cannot accidentally become provider credentials. Thanks @sallyom.--openai-api-key) through the onboarding wizard so they reach provider auth methods viactx.opts, letting--openai-api-key "$OPENAI_API_KEY"skip the redundant "use existing env var?" prompt in non-interactive harnesses. (#81669) Thanks @sjf.REASON_CODE_MESSAGESstrings so plan/result rows read as labels instead of sentence fragments. (#81705) Thanks @sjf.Locationheaders as unfollowable redirects instead of failing Slack media downloads.setup.providers[].envVarscredentials during provider discovery while keeping the deprecatedproviderAuthEnvVarsfallback. (#81542) Thanks @JARVIS-Glasses.CODEX_HOMEisolates~/.codexwhile inheritedHOMEintentionally keeps.agentsdiscovery and subprocess user-home state available.auth-profiles.jsonuntil manual cleanup.openclaw plugins listdescriptions readable.PATHcannot be shadowed by hostPath.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.operator.admingateway scope explicitly for browser control commands, avoiding unnecessary scope-upgrade approval loops. Fixes #81555. (#81716) Thanks @joshavant.openclaw/plugin-sdk/memory-corepackage subpath as an alias ofmemory-host-core, so published memory companion plugins that still import it resolve on current hosts.tools.messagesource 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.wss://gateway certificate and honorgateway.remote.tlsFingerprintas 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.kind: "spawn-child"instead of"direct"inopenclaw sessionsand 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)agentRuntime.id: "acpx"(or stored backend id) withsource: "session-key"for ACP control-plane session rows inopenclaw sessions --json,openclaw status, and Gateway session RPC responses instead of the incorrect"auto"/"pi"implicit fallback. Fixes catalog #18. (#79550)CODEX_HOMEisolation without rewritingHOMEby default, so Codex-run subprocesses can still find normal user-home config, tokens, and CLI state unless the launch explicitly overridesHOME. Thanks @pashpashpash.<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.sessions_sendor gateway send, so agent-to-agent messages no longer fail when the target agent has not started yet.reasoning: falsewhen resolving thinking policy, preventing non-thinking Google/Gemma models from advertisingthinking=medium. Fixes #81424.deltaText/replaceframes so SDK clients can consume assistant updates without local diffing. (#80725) Thanks @samzong.--no-git-updatefor existing git checkouts before resolving release refs, preventing pinned source installs from moving during reinstall.memory_recalltool visible after managed installs. Fixes #81193. Thanks @julio-arcila..envOpenClaw paths cannot leak into Linux containers. Fixes #80381. (#81105) Thanks @brokemac79.@wecom/wecom-openclaw-plugin@2026.5.7and update existing managed npm installs instead of failing on the package directory. Fixes #79884. (#80390) Thanks @brokemac79.--versionfor git installs and install from the checked-in lockfile, preventing recent dependency pins from tripping pnpm's minimum-release-age gate during tag installs.items. Fixes #81175. (#81217) Thanks @JARVIS-Glasses.getUpdatesliveness only, so outbound API calls no longer mask dead inbound polling; log polling-cycle starts after transport rebuilds. Fixes #78473.OPENAI_API_KEYauth. (#81511) Thanks @jalehman.@openclaw/codexpackage to use its private task-runtime and MCP projection SDK helpers, fixingMODULE_NOT_FOUNDduring migrated OpenAI/Codex beta runs.Skip for nowand bulk-selection rows work even when planned items start preselected.image_generateavailable when OpenAI auth lives in the agent's auth-profile store instead of environment variables.accounts.<id>.groups: {}map the same as undefined so the rootchannels.telegram.groupsallowlist still applies, instead of silently dropping every group update under the defaultgroupPolicy: "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 remainsgroupPolicy: "disabled". Fixes #79427. (#81030) Thanks @kinjitakabe.mcp.serversinto 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 separateappsconfig patch. Fixes #80814. Thanks @kinjitakabe.7.0.0-rc11so libsignal resolves from the registry instead of a GitHub tarball.└─prefix, making the parent-child relationship clear. Fixes #77628. (#78623) Thanks @chinar-amrutkar.--jsonoutput to stdout instead of diagnostic logs so automation can parse commitment list and dismiss results. (#81215) Thanks @giodl73-repo.timeoutSecondsfor the LLM idle watchdog even when it numerically equalsagents.defaults.timeoutSeconds, preserving explicit per-run timeout intent and preventing stalled streaming replies from being cut to the implicit 120s cap. (#79426) Thanks @legolaz8451.qrcodeterminal 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.google/gemini-3.1-pro-previewinstead ofgoogle/gemini-3-pro-preview./newor/resetare not replayed into later turns. (#80848) Thanks @VACInc.kilocode/google/gemini-3-pro-previewresolves tokilocode/google/gemini-3.1-pro-previewfor Gemini 3.1 testing.tsxpreloads with Node native type stripping so Node 26 build paths no longer emitDEP0205module loader deprecation warnings. (#78584) Thanks @keshavbotagent.timeoutMs, matching image generation behavior. (#80687)openclawpeer dependencies duringdoctor --fix, while refusing to follow package-localnode_modulessymlinks outside the plugin package. (#77412) Thanks @TheCrazyLex.reactionNotifications: "off" | "own" | "all"overrides. Fixes #60274; refs #39031 and #39322. Thanks @hyperclaw.session_endplugin hook with reasonshutdown(orrestartwhen 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 downstreamsession_endplugins (e.g. claude-mem) with ghost rows accumulating across restarts. The new shutdown finalizer drains an in-memory tracker that is populated bysession_startand 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"toPluginHookSessionEndReason. Fixes #57790. Thanks @pandadev66.chat content is emptyafter tool-heavy sessions. Fixes #74589. Thanks @neeravmakwana and @DerekEXS.tools.alsoAllow-only policies when preconstructing built-in media generation and PDF tools, so configured media tools become live without forcingtools.allow: ["*", ...]. Fixes #77841. Thanks @trialanderrorstudios.sqlite-vec-<platform>-<arch>variant directly when the metasqlite-vecpackage is missing from a global install, so vector recall keeps working onnpm install -g openclaw@latestupgrades where optionalDependencies left only the platform variant on disk. Fixes #77838. Thanks @corevibe555 and @Simon2256928.lostmarkers before durable recovery reconciles. Fixes #78233. (#78243) Thanks @Feelw00.GH_CONFIG_DIRhint when the GitHub skill is usable butghauth lives under a different operator HOME than the agent process, without warning for disabled or filtered skills. Fixes #78063. (#78095) Thanks @tmimmanuel.send,poll, andmessage.actionrequests while delivery is still in flight, preventing duplicate outbound work for the same idempotency key. (#68341) Thanks @thesomewhatyou.systemEventheartbeat wakes on their bound session route for both direct and queued wake paths by dropping inherited explicit heartbeat destinations when forcingtarget: "last". Fixes #73900. Thanks @richardmqq.--force-documentsends MP4s as documents instead of typed videos. Fixes #80389. (#80405) Thanks @jbetala7./stop, preventing immediate follow-up messages from being orphaned. Fixes #68838. (#68839) Thanks @Feelw00.MEMORY.mdby compacting oldest auto-promoted sections while preserving user-authored notes, keeping active memory below the bootstrap budget. Fixes #73691. (#74088) Thanks @YB0y./statusand/thinkmenus while preserving explicit session overrides. (#80341) Thanks @VACInc.sessions.resolvesessionId and label store loads to the requested agent so large unrelated agent stores are not parsed for scoped lookups. Fixes #51264. (#79474) Thanks @samzong.openclaw doctorservice config panels while preserving the declined-repair--forcehint. Fixes #80287. (#78688) Thanks @YB0y.channel exitederror. Fixes #75736; mitigates #77443. Thanks @dataCenter430./props.default_generation_settings.n_ctxwhile keeping top-leveln_ctxas a fallback, so session budgeting reflects the loaded context window. Fixes #73664. (#74057) Thanks @brokemac79.readFilescans with shared streaming helpers (streamSessionTranscriptLinesandstreamSessionTranscriptLinesReverse) 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 usereadlineover a boundedcreateReadStream; 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.dmPolicyandallowFromsettings to the active Web listener before processing new inbound DMs. Fixes #80538. Thanks @Ampaskopi129.openclaw doctor --fixrepair managed plugin installs whose package entrypoints fail package-directory boundary validation after local state moves. Fixes #80592. Thanks @wei-wei-zhao.unknown channel: voice. Fixes #80540. Thanks @patrickmch./model provider/modelis an exact session route, while duplicate bare model ids only use configured fallback order on non-session override paths. Refs #80562. Thanks @gaodaabao..openclaw/sandboxesexec workdirs as sandbox runs in compact tool summaries instead of showing the full path.fs-safestat helper failures as missing files, restoring Agents file status for existing Windows workspace files. Fixes #79953. Thanks @lovelefeng-glitch.reply_to_idmetadata. Fixes #79338. Thanks @sxxtony.@openclaw/fs-safeso 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.<turn_aborted>raw markers as terminal so interrupted native-tool turns release Discord agent sessions instead of waiting for the outer timeout.openclaw-plugin-yuanbaoto 2.13.1 to supportsourceReplyDeliveryMode: "automatic"for group chat. (#79814) Thanks @loongfay.memory_searchresultcorpuslabels aligned with the hit source, so session transcript hits surface assessionsand memory-file hits staymemory. Fixes #72885. (#71898, #72886) Thanks @rubencu.google/gemini-3.1-pro-previewis used for testing instead ofgoogle/gemini-3-pro-preview.openrouter/google/gemini-3-pro-previeware persisted as Gemini 3.1 Pro Preview.google/gemini-3.1-pro-previewinstead ofgoogle/gemini-3-pro-preview.google/gemini-3.1-pro-previewinstead ofgoogle/gemini-3-pro-preview.google/gemini-3.1-pro-preview.sessions_sendACP manager andweb_fetchruntime chunks importable after package updates, preventing live gateways from breaking before restart. Fixes #78804. Thanks @Gomesy72.openclaw gateway install, so systemd reinstall paths keep env-file-backed secrets out of inline unit metadata. Refs #77406, #77427. Thanks @stainlu and @brokemac79./newand/resetmodel prompts while keeping startup instructions out of transcript prompts, so agents see sender identity on the first reset turn. Fixes #77360. Thanks @srb11e.auth-profiles.jsonsaves. Thanks @mcaxtr.imagetool model overrides even whenagents.defaults.imageModelis unset, restoring one-off vision calls for configured multimodal providers. Fixes #79341. Thanks @haumanto.vprefixes when verifying exact npm package install targets, soopenclaw update --tag v2026...does not roll back after installing the matching bare package version. Refs #74069; #80480. Thanks @Kaspre.plugins.denyas 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.gateway status --deepplugin-aware so configured plugin manifest warnings, including missing channel config metadata, stay visible during install and update smoke checks.operator.user_id, so card buttons dispatch instead of being dropped as malformed. Fixes #71670. (#71787) Thanks @rubencu.main. Fixes #74313. (#74438) Thanks @carlos4s.auth-profiles.json, preventing staleanthropic:claude-cliprofiles from repeatedly bootstrapping and flooding debug logs. Fixes #80129. Thanks @Caulderein./context maponly from actual run context and persist Codex app-server run reports without counting deferred tool-search schemas as prompt-loaded tool schemas.bash, web, file, and MCP tools no longer look like stale embedded runs to the watchdog. (#80217)auth.order.openaientries for Codex-compatible OAuth and API-key profiles while keeping existingopenai-codexprofile ordering valid.after_tool_callobservations for native tool completions not covered by the native hook relay so observability plugins can record Codex-native tools. (#80372) Thanks @VACInc./agentworkspace mount while keeping write/edit/apply_patch workspace-only guarded, restoringread /agent/...forworkspaceAccess: "ro". Fixes #39497. Thanks @stainlu and @teosborne.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.files.infowhen inbound DM file events omit or stale attachment URLs, preventing file attachments from being dropped before media hydration. Fixes #50129. (#50200) Thanks @smartchainark.download-filefile ids separately from message timestamps and return a targeted recovery error when agents passmessageIdinstead offileId. (#74155) Thanks @jarvis-ai-gregmoser.requireMention=falsechannels so always-on Slack rooms keep recent conversation context between turns. (#38658) Thanks @syedamaann.interactiveRepliescapability gate, preserving Block Kit for Slack CLI and cron deliveries. (#78220) Thanks @kazamak.main. (#73101) Thanks @Raasl.topLevel: trueorthreadId: null, allowing agents to post a new parent-channel message from inside a Slack thread. Fixes #79807. Thanks @vexclawx31.readysignal no longer fires before the acpx runtime has either become usable or reported a probe failure; setOPENCLAW_ACPX_RUNTIME_STARTUP_PROBE=0to restore lazy startup. Fixes #79596. Thanks @bzelones.reasoningpayloads. Fixes #46637. Thanks @zipzagster and @lexhoefsloot.compat.strictMessageKeysto strip Chat Completions replay messages toroleandcontentfor strict providers that reject OpenAI-style tool and metadata keys. Fixes #50374. Thanks @choutos.plugins.entries.amazon-bedrock-mantle.config.discovery.enabled=falseto suppress automatic Mantle discovery and IAM bearer-token generation while keeping the plugin enabled. Fixes #67288. Thanks @kanekoh./api/chatrequests from copying catalogcontextWindowormaxTokensintooptions.num_ctxunlessparams.num_ctxis explicitly configured, avoiding pathological prompt-ingestion latency on local large-context models. Fixes #62267. Thanks @BenSHPD.*:cloudmodels 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.tools.allowfor classic embedded voice responses, including empty allowlists, so no-tool Ollama agents do not receive tool schemas. Fixes #79506. Thanks @donkeykong91.messagetool, so operators can fix tool policy mismatches before explicit channel actions such as attachments or thread replies fail. Refs #80128. Thanks @jeffjhunterai.savedPathevents as reply media, so blank-text image generation turns still attach the generated file. Thanks @keshavbotagent.EADDRNOTAVAILas a transient gateway network failure instead of a fatal crash. Fixes #80078. Thanks @takamasa-aiso.connect-srcviolation. Fixes #78504. Thanks @BunsDev.Invalid comparator: npm:failure, so older npm versions can install official plugins instead of aborting. (#80539) Thanks @rubencu.openclaw doctorstops repeating stale warnings after a local extension is replaced by a managed npm plugin. Fixes #80087. (#80134) Thanks @hclsys.openai-codex/*model refs to canonicalopenai/*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.sendDurableMessageBatchindeliverAgentCommandResultandopenclaw 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.plugins.allow, while preserving allowlist guidance for real plugin command roots. Fixes #80109. (#80123) Thanks @kagura-agent.config setandconfig patchvalues that equal runtime defaults instead of reporting success while dropping them. Fixes #79856. (#80106) Thanks @abodanty and @hclsys.400 invalid_request_errorresponses for malformed encoded session-kill HTTP paths instead of letting route-shaped requests fall through to later Gateway handlers. (#72439) Thanks @rubencu./__openclaw__/SPA routes so tab icons, install metadata, and the service worker do not 404 after internal navigation. Fixes #80072. Thanks @CodeNovice2017.interruptResponseOnInputAudio: false.env|prod. (#79816) Thanks @moeedahmed./think low|medium|highfor reasoning-capable Grok models and keepreasoning.efforton native Responses payloads while preserving off-only behavior for non-reasoning routes. Fixes #79210. Thanks @colinmcintosh.openclaw infer image describe --model zai/glm-4.6vworks like direct model runs and Anthropic auth probes avoid stale Claude 3 Haiku catalog entries.anthropic/claude-haiku-4-5to 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.legacyengine registration failures during CLI session persistence. Fixes #79446. Thanks @TurboTheTurtle.supportsReasoningEffort: false, preventing Kimi-compatible providers from resending unsupportedthinkingcontent. Fixes #47452.exec.approval.liston the lightweight policy-summary path so listing pending approvals no longer loads the rich tree-sitter command explainer. (#76943) Thanks @rubencu.exec/bashtool calls fail after the assistant claims success, while keeping raw stderr hidden unless verbose details are enabled. Fixes #60497. (#80003) Thanks @jbetala7._blanksentinel. Fixes #34129. (#56391) Thanks @smartchainark.agents.defaults.model.primarywithout requiring a manual reset. Fixes #74284. Thanks @brtkwr and @bitloi.openclaw agent --modeluse the backend/admin Gateway scope without cached device-token scopes silently downscoping the request. (#78837) Thanks @VACInc.openclaw channels addfirst screen quieter.PLAYWRIGHT_BROWSERS_PATHand the default Playwright cache on Linux, so Docker installs that persist/home/node/.cache/ms-playwrightno longer needbrowser.executablePath./api/showomits thethinkingcapability, so/think highno longer rejectsollama/deepseek-v4-*:cloud.0.33.1.7.0.0-rc10, and patch the bundled Baileys declaration so the latest tsdown build stays warning-clean.0.22.0warning-clean by externalizing known third-party declaration edges and replacing relative channel config module augmentations with explicit built-in channel fields.effortwhile keeping persisted OpenClaw state canonical. (#79926) Thanks @InTheCloudDan.provider/*entries inagents.defaults.modelsso/model,/models, and model pickers can show dynamically discovered models for selected providers without exact model allowlists. Fixes #79485. Thanks @rendrag-git.unknownwhile preserving unchanged status.openai-codexOAuth profile metadata into Codex plugin harness attempts after canonicalopenai/*migration, so OAuth-only installs keep using native Codex auth instead of falling through to direct OpenAI API-key auth. Fixes #79978.openai/gpt-5.5plus Codex OAuth route, and fix trajectory export errors so they suggest the validopenclaw sessionscommand.google/gemini-3-pro-previewprimary, fallback, and model-map refs during config load and unrelated config writes so saved config keeps targeting Gemini 3.1 Pro Preview.google/gemini-3.1-pro-preview.google/gemini-3.1-pro-preview.google/gemini-3.1-pro-preview.google/gemini-3.1-pro-preview.vscode-chatintegration identity used by runtime requests, and refresh legacy cached tokens missing that identity so image-capable Copilot models no longer inherit thecopilot-language-serverscope. Fixes #79946, #80074. Thanks @TurboTheTurtle.openclaw doctor --fixremoves npm packages that shadow bundled plugins, so the rebuilt registry no longer resurrects the removed package metadata.fallbackskey andagents.defaults.model.fallbacksis 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.audioEndMs=0and skips legitimate interruptions.message(action="send")replies inside the topic when the active session is group_topic or group_topic_sender, and propagatereplyInThreadthrough text, card, and media outbound adapters so topic-scoped sessions no longer post at the group root. Fixes #74903. (#77151) Thanks @ai-hpc.server_errorpayloads asserver_error, expose that reason in cron state, and let one-shot cron retry policy honorretryOn: ["server_error"]without requiring raw5xxtext. (#45594) Thanks @clovericbot.audit-exec-surface.test.tsunder a per-case OpenClaw home tempdir, redirectingOPENCLAW_HOME(which wins overHOME/USERPROFILEinresolveRawHomeDir) alongsideHOMEandUSERPROFILE, so itssaveExecApprovals(...)calls never touch the live~/.openclaw/exec-approvals.jsonon the host running the suite. Sibling exec-approvals tests already used the tempdir pattern; this file did not, so runningpnpm testagainst a contributor's local checkout was silently truncating their real approvals to{ "version": 1, "agents": {} }. (#79885) Thanks @omarshahine.AcpRuntimeErrorcause 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 opaqueInternal error/[object Object], with redaction applied before the chain reaches log or reply surfaces.action: "reply"attachments throughimsg send-rich --filewhen the installed imsg build advertises that capability (probed once viaimsg send-rich --helpand cached on the private-API status). Reply now hydratesmedia/mediaUrl/fileUrl/mediaUrls[0]/filePath/path/base64buffer+filenamethrough the shared outbound resolver, stages buffers via the existingwithTempFilehelper, rejectshttp(s)://URL attachments with a targeted error pointing callers atsend's full attachment-resolver pipeline, and falls back to the explicitimsg#114 not landed yeterror on older imsg builds. Depends on the upstreamopenclaw/imsg#114capability landing in an installable release; until then the new path stays gated and users see the same explicit fallback#79822introduced. (#79864) Thanks @omarshahine./model statuswhen they are only duplicated by a nested OpenRouter model id such asopenrouter/google/..., while preserving explicitly configured direct providers. Fixes #62317.opencode-go/deepseek-v4-prowhen another provider owns the same bare model alias. Fixes #79325.models.providers.<provider>.models[]registration when a model exists only inagents.defaults.models, instead of returning a bare unknown-model error. Fixes #80089.403 API key budget limit exceededas billing so model fallback advances instead of retrying the exhausted primary. Fixes #60191. Thanks @omgitsgela.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-3.1-pro-previewso fresh Gemini test configs exercise Gemini 3.1 Pro Preview.openrouter/openai/gpt-5.4-minino longer displays asopenai/gpt-5.4-mini. Fixes #67792. (#72752) Thanks @iot2edge.supported_parameterstool support metadata so non-tool Perplexity Sonar models no longer receive agent tool payloads and fall back unnecessarily. Fixes #64175. Thanks @Catfish-75.tools.byProvider["provider/model"].denywhen reporting small-model web/browser exposure, so per-model OpenRouter mitigations clear themodels.small_paramsexposure signal. Fixes #80118.moonshotai/...andmoonshot-ai/...refs as aliases for canonicalmoonshot/..., so copied OpenRouter Kimi ids no longer fail as unknown direct models. Fixes #73876. (#74946) Thanks @jeffrey701.kimi-for-codingAPI model id in bundled catalog, onboarding, and docs while normalizing legacykimi-codeandk2p5refs. Fixes #79965.minLength. Fixes #38817.reasoning_contentreplay fields for unowned OpenAI-compatible proxy providers, preventing follow-up request failures outside the bundled DeepSeek and OpenRouter routes. Fixes #79608.~/.openclaw/logs/openclaw.loginstead of having to read per-session trajectory JSONLtool.resultpayloads. Common after a gateway restart un-injects the dylib from Messages.app. (#80035) Thanks @omarshahine.thread.idandthread.sessionIdbefore schema validation so live Codex app-server responses that omitsessionIdno longer failthread/startorthread/resume. Fixes #80124. (#80137) Thanks @kagura-agent.openclaw/plugin-sdkdist aliases instead of forcing Jiti transforms. (#80878) Thanks @medns./compactwhen Pi returns an empty or no-op compaction summary, preventing blank checkpoints from replacing the live context./statusand other command-only native replies do not wait behind full agent turn setup./nix/storeto load inOPENCLAW_NIX_MODE=1while keeping normal external plugin hardlink rejection unchanged. Thanks @joshp123.responsefeature in setup, explain missing--feature responseon rejected sends, and surface missing response capability in doctor/status checks. Fixes #78935. (#79657) Thanks @joshavant.operationandurlcontext tobuildTimeoutAbortSignalfrom the music-generate reference fetch and the Matrix guarded redirect transport, so thefetch timeout reached; aborting operationwarning carries actionable structured fields instead of a bare line. Fixes #79195. Thanks @pandadev66.gateway.mode, metadata, and auth are not silently clobbered. Fixes #64973 and #74890. Thanks @BunsDev.openclaw gateway restartkeeps Homebrew Node installs reachable. Fixes #79232. Thanks @BunsDev and @TurboTheTurtle.openai-codex/*routes to the Codex runtime so mixed-provider agents keep automatic PI routing for MiniMax, Anthropic, and other non-OpenAI model switches.openclaw gateway stopnow useslaunchctl bootoutby default instead of unconditionally callinglaunchctl disable, so KeepAlive auto-recovery still works after unexpected crashes; use the new--disableflag to opt into the persistent-disable behavior when a manual stop should survive reboots. Fixes #77934. Thanks @bmoran1022.repairLaunchAgentBootstrapno 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.openclaw gateway stop --disablenow 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.openclaw status --jsonoff manifest-backed channel discovery so configured-channel checks do not repeatedly rescan plugin metadata. Fixes #79129.gateway.tailscale.preserveFunnelso whentailscale.mode = "serve"and an externally configured Tailscale Funnel route already covers the gateway port, OpenClaw skips re-applyingtailscale serveon startup and skips theresetOnExitteardown for that run, keeping operator-managed Funnel exposure alive across gateway restarts. Fixes #57241. Thanks @RenzoMXD.gemini-3-proalias to Gemini 3.1 Pro Preview instead of the shut-down Gemini 3 Pro Preview. Thanks @BunsDev.infer model run --modelso mixed-case provider/model strings resolve to the canonical catalog entry instead of failing withUnknown model. (#78940) Thanks @ai-hpc.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 ofUnknown model.scpfromPATHwhen staging sandbox media so nonstandard OpenSSH installs can copy remote attachments.OPENCLAW_TRACE_SYNC_IOdisabled by default inpnpm gateway:watch:rawso watch mode avoids noisy Node sync-I/O stack traces unless explicitly requested.agent --localruns do not leave app-server child processes alive.openclaw agent --local --model openai/...does not fail with an unregisteredcodexharness..profileOpenAI gateway profile runs from hanging before provider dispatch.openclaw updateswaps the core package and before the gateway restarts, repairing missing configured plugin payloads, validating active install records includingopenclaw.extensions, and exiting with structured repair guidance instead of restarting the gateway with broken plugins. (#79143) Thanks @BKF-Gitty.text/event-streamresponse bodies so provider HTTP errors keep their JSON detail instead of collapsing to generic streaming failures. Fixes #78180.trusted-proxymode fail closed instead of accepting local password fallback credentials after trusted-proxy identity checks fail. Fixes #78684.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 statushonor the configured agent allowlist instead of reporting on for agents where recall is disabled. Fixes #78986.[object Object]visible reply text. Fixes #78846.session_status({"sessionKey":"current"})instead of falling back to the persisted session default. Fixes #77493.passEnvnames such asHOMEwhile still blocking dangerous runtime env hooks. Fixes #78216./model defaultreset the session model override instead of treating it as a literal model name. Fixes #78182.payload.modelerrors show the configuredagents.defaults.modelsallowlist instead of echoing the rejected model twice. Fixes #79058.NO_PROXYentries such as100.64.0.0/10and100.64.*before enabling trusted env-proxy mode for model-provider requests. Fixes #79030.openclaw-clisidecar, keeping the default compose setup hardened while unblockingopenclaw plugins installwhen users opt in. Fixes #79018. Thanks @Jason-Vaughan.openclawoutside the parent shell PATH, print follow-up commands with the resolved binary path instead of telling users to runopenclawfrom a shell that will reportcommand not found. Fixes #72382. Thanks @jbob762.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.sessions_spawnaccepted note from recommendingsessions_yieldas the default wait path in push-based chat and CLI flows. Fixes #78913. Thanks @oiGaDio.mediaUrlfallback when all media URLs are filtered. Fixes #78372.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.canvasHostconfigs valid untilopenclaw doctor --fixmigrates them intoplugins.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.adaptive,xhigh, andmaxappear without leaking unsupported default-model options. Thanks @BunsDev.maxTokensso 1M-context Anthropic compactions do not request more output than the API permits. Fixes #54383.exec host=nodebeforesystem.runwhen the selected node is known to be disconnected, with an actionable reconnect message instead of a raw node invoke failure. Thanks @BunsDev.anthropic-cli/*model refs as Claude CLI runtime refs instead of failing model resolution withUnknown model. Thanks @BunsDev.alsoAllow, so already re-allowed filesystem tools do not make exec-only fixes look broader than they are. Thanks @BunsDev.tools.execortools.fssections when the agent profile did not configure those tool sections itself. Thanks @BunsDev.toolsAllowentries the same way as Pi tool policy, so aliases likebashandapply-patchstill expose the intended OpenClaw tools. Thanks @BunsDev.output_textassistant parts from narrative subagent transcripts, so light-phase Dream Diary entries are not dropped as empty. Thanks @BunsDev.compat.supportsTools=falseby stripping tool payload fields before dispatch to chat-only endpoints. Fixes #74664.notschemas. Fixes #75467.auth-profiles.jsonso masked or rich-text credential artifacts fail as auth errors instead of crashing HTTP header construction. Fixes #77624.model="gemini-flash"and other aliases route to the intended provider instead of the agent default. Fixes #54166.fal-ai/flux/devthrough registered provider model metadata so FAL image/video models do not get misparsed as providerfal-ai. Fixes #77444.aws-sdkauth profiles as config routing metadata instead of stored credentials, and letdoctor --fixmove legacy markers out ofauth-profiles.json. Fixes #69708.sipswhen optional image tooling cannot decode HEIC/HEIF input files before model-run requests. Refs #50081.openrouter/automodel ref canonical while preventing TUI and Control UI catalog pickers from displaying or submittingopenrouter/openrouter/auto. Fixes #62655.oauth (claude-cli)for working Claude CLI OAuth runtime sessions instead ofunknownwhen no local auth profile exists. Fixes #78632. Thanks @gorkem2020."global"undersession.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.sessionKeyonWakeParamsSchema, add--session-keytoopenclaw 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.openclaw completion --installwith 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.message_thread_idrouting intact. Fixes #79455. (#78575) Thanks @tmimmanuel.<https://example.com>so link previews do not expand into uninvited embeds. (#78614)delta.tool_callsremains the only authoritative tool-call source. (#78331) Thanks @samzong.systemPromptOverride, sosessions_spawn(mode: "run")child runs still see their assigned task. Fixes #77950. Thanks @amknight.schtasksreportsAcceso denegado, matching the existing access-denied fallback path. Fixes #77993. Thanks @jackonedev.nextRunAtMsvalues 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.openclaw-tuiprocesses on first boot. Thanks @vincentkoc.doctor --fixcan repair instances already stuck onagent:main:mainheartbeat history. Thanks @vincentkoc.ttstool audio attached to a final text reply is delivered instead of being consumed before final Telegram/media delivery. Thanks @Conan-Scott.openclawpeer 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.models.providers.openai-codex.models[].contextTokensfor nativeopenai/*Codex runtime runs and/statuscontext reporting, so subscription-backed Codex agents use the configured OAuth context cap without inflating past the runtime model window. Fixes #77858. Thanks @lilesjtu.openclaw sessions cleanup --fix-dm-scopeso operators who returnsession.dmScopetomaincan dry-run and retire stale direct-DM session rows while preserving transcripts as deleted archives. Fixes #47561 and #45554. Thanks @BunsDev.openai-codex/*routes and cron payload model refs to canonicalopenai/*, 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.720Prequests to its supported768Presolution with the usual override warning/details instead of failing fallback.plugins uninstallconfirmation prompt and exit 1 with actionable--forceguidance instead of crashing with Node exit 13 unsettled top-level await. Fixes #73562. (#73566) Thanks @ai-hpc.gcloud,gog, andtailscalePATH/PATHEXT shims before setup and watcher spawns, using the Windows-safe.cmdwrapper for long-livedgog serveprocesses. (#74881, fixes #54470) Thanks @Angfr95.HEARTBEAT_OKacknowledgement 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.<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.<available_skills>no longer points at host-only~/.openclaw/skillspaths. Fixes #50590. Thanks @kidroca and @sallyom.openclaw update --yes --jsonrestarts, so SecretRef-backed local gateway auth cannot regress behind mocked restart checks. Thanks @vincentkoc.openclaw sessionsand Control UI session lists stay responsive on model-heavy stores. (#77650) Thanks @ragesaq.diagnostics.stuckSessionAbortMs, and emit structured recovery requested/completed events so stale or skipped recovery no longer looks like a successful abort.400 The conversation must end with a user messageafter a session whose last turn errored before producing content. Refs #77228. (#77287) Thanks @openperf.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.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/deepseek-v4-pro:cloudkeep/think maxavailable even before the full plugin runtime activates. (#77617, fixes #77612) Thanks @rriggs and @yfge.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.git fetchfails, 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.openclaw.jsonback 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.daily-ingestion.jsonso unchanged notes are still re-ingested once per dreaming day for promotion signals toward deep thresholds. Fixes #76225. (#76359) Thanks @neeravmakwana.EACCES/EPERMprevent removing shared/tmp/node-compile-cacheentries owned by another user. Fixes #76353. (#76362) Thanks @RayWoo and @neeravmakwana.openclaw channels login/channels addinstead of failing withUnsupported channel. (#77269) Thanks @pumpkinxing1.wiki_searchandwiki_getso sandboxed subagents cannot read transcript content from sibling or parent sessions. Fixes GHSA-72fw-cqh5-f324. Thanks @zsxsoft.argPatternargument 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..and..segments in wildcard exec allowlist match targets and canonicalize absolute executable path candidates before regex matching, so a target like/usr/bin/../../bin/shno longer string-matches a/usr/bin/**allowlist entry while resolving outside the declared root. (#75723) Thanks @eleqtrizit and @zsxsoft.tools.web.search.provider: "brave"is explicitly configured — a redundant provider re-resolution at startup could race and return an empty list, causing a spuriousWEB_SEARCH_PROVIDER_INVALID_AUTODETECTwarning and treating the explicitly configured provider as absent. Fixes #77676. Thanks @openperf.openclaw doctor --fix, so plugin-owned legacy config repair runs before validation. (#77477) Thanks @jalehman.basic-ftpto 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/agentisolated-run errors and failed cron jobs with cron diagnostic summaries, so rejectedpayload.modelvalues are visible instead of looking like accepted-but-missing runs. Fixes #78597. (#78655) Thanks @kevinslin.warnper account at monitor startup whenchannels.imessage.groupPolicy: "allowlist"is set without achannels.imessage.groupsblock, plus a one-timewarnperchat_idwhen the runtime gate drops a specific group, naming the exactchannels.imessage.groups[...]key to add to allow it. Fixes #78749. (#79190) Thanks @omarshahine.openclaw channels status, so outbound self-sends no longer look like handled inbound messages. Fixes #79056. (#79057) Thanks @ai-hpc and @bittoby.fs-safevalidation before staging final files, so symlinked output roots are rejected before writes. (#78780) Thanks @jesse-merhi.Reference UTC:prompt line so localCurrent time:stays anchored to the user's timezone. (#42654) Thanks @chencheng-li.session.dmScope: "main"is configured, route a bare webchat/newagainst the agent's main session (sessions.createwithemitCommandHooks=true) to an in-place reset instead of creating a paralleldashboard:child, matching/newbehavior on Telegram/Discord. Fixes #77434. (#71170) Thanks @statxc..cmdand.batUI 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.conversationIdandparentConversationIdas 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.7Compare Source
Fixes
openai/chat-latestas an explicit direct API-key model override for trying the moving ChatGPT Instant API alias without changing the stable default model.statusincron list --jsonandcron show --jsonoutput so external tooling can read disabled/running/ok/error/skipped/idle state without reimplementing cron status derivation. (#78701) Thanks @aweiker.openclaw channels listchannel-only, add--allfor bundled and catalog channels, render installed/configured/enabled state, and move model auth/usage details toopenclaw models auth list,openclaw status, andopenclaw models list. (#78456) Thanks @sliverp./newandsessions.resetso long-lived channel sessions rebuild the visible skill list after skills change. (#78873) Thanks @Evizero.tavily_searchandtavily_extracttool credentials from the active runtime config snapshot, soexecSecretRef-backed API keys do not reach the tools unresolved. (#78610) Thanks @VACInc.discord:channel:<id>as channel sends instead of legacy Discord DM targets, so cross-channel agentmessage(action="send")calls no longer misroute channel IDs into misleadingUnknown Channelfailures. Fixes #78572.max_tokensvalues. (#54392) Thanks @adzendo./btwmissing-question usage placeholder with brackets so outbound channel sanitization keeps it visible. Fixes #62877. Thanks @RajvardhanPatil07.payload.modelwas stored as"default","null", blank, or JSONnullby removing the bad override duringopenclaw doctor --fixwhile keeping cron runtime model validation strict. Fixes #78549. Thanks @bizzle12368239.accessGroup:*sender allowlists for DMs, groups, native commands, and callback authorization before applying Telegram's numeric sender-ID checks. Fixes #78660. Thanks @manugc.deliverySucceeded=falsewhen outbound delivery returns no adapter result, so claimed/empty delivery paths no longer masquerade as successful sends. Fixes #78532. Thanks @joeyfrasier.delivery.channel=lasthas no previous route, so recurring jobs do not spend tokens before hitting a permanent delivery-target error. Fixes #78608. Thanks @sallyom.openai-codex/*PI routes duringdoctor --fixand recover 2026.5.5-rewrittenopenai/*GPT-5 routes when only Codex OAuth auth is available, so update repair does not break subscription-auth setups. Fixes #78407. Thanks @shakkernerd.getUpdatesliveness so unrelated outbound Bot API calls cannot mask a wedged inbound poller. Fixes #78422. Thanks @ai-hpc.agents.defaults.subagents.archiveAfterMinutesinstead of a hardcoded 5-minute TTL, so registry-backed surfaces keep one retention knob across spawn modes. (#78263) Thanks @arniesaha.setChannelRuntimefrom non-bundled external plugin setup entries so deferred external channel runtime initializers are installed before startup polling. Fixes #77779. (#77799) Thanks @openperf.messagetool outbound sends during an inbound Telegram turn as delivered when deciding whether to emit the rewritten silent reply fallback. (#78685) Thanks @neeravmakwana.channels capabilitiesandchannels status --probe, including auto-join targets, so missing Connect/Speak/Read Message History permissions show up before/vc join.voice.captureSilenceGraceMsfor noisy Discord sessions, and tighten the spoken-output prompt around live STT fragments. Thanks @vincentkoc.MEDIA:directive auto-replies once instead of emitting an empty media message before the captioned media reply. (#78770) Thanks @ai-hpc.PermissionRequesthook by default so Codex's reviewer can approve safe commands before OpenClaw surfaces an approval, rememberallow-alwaysdecisions for identical Codex nativePermissionRequestpayloads 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.__env__:VARcustom-provider keys, and repair snake_case tool-call transcript sanitization. Fixes #51881, #48915, #77566, and #42858./modelscallback buttons sohf.comodel lists render as inline keyboard buttons. Fixes #38745.v2026.5.6Compare Source
Fixes
doctor --fix, preserving existing OpenAI routes unless a supported repair path applies.fetchorHeaders, so SDK and guarded/proxy fetch paths do not reject otherwise valid plugin requests. Fixes #77846. Thanks @shakkernerd.v2026.5.5Compare Source
Fixes
New Chat.openai-codex/*PI routes duringdoctor --fix, recover 2026.5.5-rewrittenopenai/*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.fetchorHeaders, so SDK and guarded/proxy fetch paths do not reject otherwise valid plugin requests. Fixes #77846. Thanks @shakkernerd.openclaw setup --wizard, instead of failing validation before--http-urlis collected. Fixes #76670. Thanks @jacobtomlinson.openai-codexGPT-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.--global-dirsoopenclaw updatedoes not create a second default-prefix install whenOPENCLAW_HOMEor the shell points at a custom OpenClaw directory. Fixes #78377. Thanks @amknight.openai-codex/*PDF tool requests so Codex Responses receives its required system prompt. Fixes #77872. Thanks @anyech.openclaw doctor --fixto install or enable the plugin. (#78642) Thanks @joshavant.channels.<id>config by falling back toensureChannelSetupPluginInstalledvia the trusted catalog when the plugin is missing on disk, so leftoverappId/token entries no longer dead-end onboard with " plugin not available." (#78328) Thanks @sliverp.developerInstructionsinstead ofconfig.instructions, so persona/style guidance reaches the behavior-shaping app-server lane. Fixes #77363. Thanks @lonexreb.openai-codex/*model probes and surface provider error details wheninfer model runreturns no text. Fixes #76464. Thanks @lilesjtu.ip-addressto10.2.0so the runtime lockfile no longer includes the vulnerable10.1.0build flagged by Dependabot alert 109. Thanks @vincentkoc.openclawcopy beside Codex/Discord/WhatsApp and triggerERESOLVE. Thanks @vincentkoc.dmPolicy: "open"configs without wildcardallowFromso webhook DMs fail validation instead of being acknowledged and silently blocked before inbound processing. Fixes #78316.xai/grok-4.3no longer fails live Docker/Gateway runs withInvalid reasoning effort.offso live Gateway runs cannot send unsupported reasoning levels to native Grok Responses models./steerthrough the normal authorization and mention gate instead of silently dropping them before an agent session can see them. Fixes #78080. Thanks @ramitrkar-hash.N Checkpoint(s)disclosure and show expanded session-level details with modern checkpoint history cards across responsive table layouts. Thanks @BunsDev./newcommand 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.json, while preserving symlink, hard-link, and owner-only permission safeguards. Fixes #77785. (#77907) Thanks @Alex-Alaniz and @MilleniumGenAI.totalTokensfor CLI backends fromagentMeta.lastCallUsage(and set it on Claude CLI runs) so/statuscontext usage is not shown as?while cache/token lines are populated. Fixes #78194. Thanks @neeravmakwana.unknown error.ws://connects for private LAN and.localgateways while keeping Tailscale/public routes onwss://, and prefer explicit gateway passwords over stale bootstrap tokens in mixed-auth reconnects. Fixes #47887; carries forward #65185. Thanks @draix and @BunsDev.nextRunAtMsvalues 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.openclaw-tuiprocesses on first boot. Thanks @vincentkoc.doctor --fixcan repair instances already stuck onagent:main:mainheartbeat history. Thanks @vincentkoc.Reasoningstatus line.OPENCLAW_GATEWAY_TOKENwould shadow a different activegateway.auth.tokensource for local CLI commands, while avoiding false positives when config points at the same env token. Fixes #74271. Thanks @yelog./v1/chat/completionsclients with a bodyless 200 response until their idle timeout fires.LocalMediaAccessErrorwhile keeping Codex home out of the display allowlist. Thanks @frankekn.openclaw doctor --deep, using the installed service environment when available so service-managed clean exits are visible in guided diagnostics. Thanks @shakkernerd.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.thinking: disabled, so manual model switches do not send Fireworks-rejectedreasoning*parameters. Refs #74289. Thanks @frankekn.openclawpeer packages before plugin installs, so beta-channel official plugin updates are not downgraded by old core package-lock state. Thanks @vincentkoc.openclawpeer links after shared-root npm installs, updates, and uninstalls, so mutating one plugin does not leave previously installed SDK-using plugins unable to resolveopenclaw/plugin-sdk/*./newor/resetcaptures in the same minute do not overwrite the earlier session archive. Thanks @vincentkoc.mainagent dir helper from runtime paths; model, auth, gateway, bundled plugin, and test helpers now resolve default/session agent dirs throughagents.list/agent-scope helpers while plugin SDK keeps a deprecated compatibility export.openclaw statussession rows so terminal status matches the/statusruntime line. Thanks @vincentkoc.sessions cleanup, so gateway restart or crash orphans do not accumulate indefinitely outsidesessions.json. Fixes #77608. Thanks @slideshow-dingo.openai-codex/*routes in primary models, fallbacks, heartbeat/subagent/compaction overrides, hooks, channel overrides, and stale session pins to canonicalopenai/*, selectingagentRuntime.id: "codex"only when the Codex plugin is installed, enabled, contributes thecodexharness, and has usable OAuth; otherwise selectagentRuntime.id: "pi". Thanks @vincentkoc.720Pto MiniMax's supported768P, and stop sending GooglegenerateAudioon Gemini video requests so provider fallback can recover from model-specific parameter differences. Thanks @vincentkoc./status, making restart and host-lifetime checks visible from chat. Thanks @vincentkoc.llmSlug: true, so/newand/resetno longer block WhatsApp and other message-channel reset replies on hook housekeeping or a nested model call. Thanks @vincentkoc.openclaw agentfrom 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./newor/resetcaptures in the same minute do not overwrite the earlier session archive. Thanks @vincentkoc.openclaw-tuiprocesses on first boot. Thanks @vincentkoc.doctor --fixcan repair instances already stuck onagent:main:mainheartbeat history. Thanks @vincentkoc.ShutdownResultwhile preserving lifecycle hook hardening. Carries forward #41296. Thanks @edenfunf.openclaw update --channel devno longer walks back otherwise-good main commits when Ubuntu hosts OOM-kill or fail parallel oxlint shards. Thanks @vincentkoc.openclaw channelsparent-help command, so it exits promptly after printing help instead of loading configured channel plugins. Thanks @vincentkoc.openclaw statussession rows so terminal status matches the/statusruntime line. Thanks @vincentkoc.openclaw sessionstable so terminal output matches the runtime visibility already present in JSON/status surfaces. Thanks @vincentkoc.NET_RAWandNET_ADMINcapabilities and enablingno-new-privilegesin the bundleddocker-compose.yml. Thanks @VintageAyu.v2026.5.4Compare Source
Highlights
Changes
127.0.0.1on Windows so libuv's dual-stack::1behavior cannot wedge localhost HTTP requests. (#69701, fixes #69674) Thanks @SARAMALI15792.plugins.entriesorplugins.allowreferences an official external plugin that is not installed, so upgraded configs point operators toopenclaw plugins install <spec>instead of telling them to remove valid plugin config. (#77483) Thanks @hclsys.keyRefandtokenReffields when scrubbing provider-target secrets, so the canonical SecretRef metadata survivessecrets applywithout keeping plaintext values. Thanks @Beandon13.: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-plugindirNamevalidation and crash the recall run. The same guard already applied to explicitchannelIdparams (#76704); this extends it to store-derived channels. (#77396) Thanks @hclsys.<rootDir>/dist/when resolving thesecret-contract-apisidecar, so npm-published externalized channel plugins (e.g.@openclaw/discordsince 2026.5.2) whose compiled artifacts live underdist/actually contribute their channel SecretRef contracts to the runtime snapshot. Without this, env-backedchannels.discord.tokenSecretRefs silently failed to resolve at gateway start on 2026.5.3, leaving the channelnot configuredeven though #76449 had landed the generic external-contract loader. Thanks @mogglemoss.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.streaming.progress.render: "rich"for Block Kit progress drafts backed by structured progress line data./verboseand progress drafts by default, withagents.defaults.toolProgressDetail: "raw"and per-agent overrides for debugging raw command/detail output.jition native-loadable plugin startup paths, so compiled bundled plugin surfaces do not pay source-transform loader cost unless fallback loading is actually needed.pnpm gateway:watchso slow Gateway turns are easier to attribute from logs and stability diagnostics..jsmodule as a source-transform fallback miss. Thanks @vincentkoc.pnpm openclaw qa mantis slack-desktop-smoketo run Slack live QA inside a Crabbox VNC desktop, open Slack Web, and capture desktop screenshots beside the Slack QA artifacts.tbx_...lease ids from desktop smoke warmup, so provider overrides do not fail before inspect/run. Thanks @vincentkoc.realtime.introMessage: ""so realtime Chrome joins can stay silent instead of restoring the default spoken intro. Thanks @vincentkoc.before_agent_finalizeretry instructions so workflow plugins can request one more model pass. Thanks @100yenadmin.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.X-OpenRouter-Cache,X-OpenRouter-Cache-TTL, and cache-clear headers only on verified OpenRouter routes. Thanks @vincentkoc./audio/transcriptionscontract, including default audio model metadata and auto-selection priority. (#77490) Thanks @remdev.@newsletteroutbound 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.openclaw doctor --fixmigrates legacy monolithic registry files. (#74831) Thanks @luckylhb90.RateLimit-Reset/Retry-Afterand append aSign 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.registerIfAbsentfor atomic keyed-store dedupe claims that return whether a plugin successfully claimed a key without overwriting an existing live value. Thanks @amknight.SessionEntryslot projection and scoped trusted-policy session extension reads. (#75609; replaces part of #73384/#74483) Thanks @100yenadmin.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=Interactiveso 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
@betawhile 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.sendcalls 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/openclawpreferred path on Windows inresolvePreferredOpenClawTmpDirso log files, TTS temp files, and other writes land in%TEMP%\openclaw-<uid>instead ofC:\tmp\openclaw. Fixes #60713. Thanks @juan-flores077.Media/Windows: open saved attachment temp files read/write before fsync so Windows WebChat and
chat.sendmedia 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, orgroup:pluginsno 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
experimentalApibridge compatible with latest Codex while preserving formatter gates.Telegram/media: derive no-caption inbound media placeholders from saved MIME metadata instead of the Telegram
photoshape, 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 modelstartup log line, defaulting unset startup thinking tomediumwithout 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-runnerthat arms after auto-compaction-retry and aborts the run withcompaction_loop_persistedwhen the agent emits the same(tool, args, result)triplewindowSizetimes (default 3) within that window. Disable via existingtools.loopDetection.enabled; tune viatools.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 --benchmarkunless 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
json5in the memory-core plugin runtime dependency set so packagedmemory_searchsandboxes 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
openclawpeer links before skipping unchanged npm plugin updates, so current external Codex installs can recoveropenclaw/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.profilesmetadata intact whendoctor --fixstrips stale secret fields from configs, repairing legacy<provider>:defaultAPI-key profile metadata when model fallbacks or explicitmodel@profilerefs still depend on it. Fixes #77400.Doctor/plugins: include
plugins.allow-only official plugin ids in the release configured-plugin repair set, sodoctor --fixinstalls 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 --fixsees 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-prometheuscan 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.sendcalls no longer tripReplyRunAlreadyActiveErrorevery 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 sessionsoutput 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.*, andchannels.telegram.requireMentionso 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-1as 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.listand 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.ttlSecondsas 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_efforton OpenRouter-supported values, mapping stalemaxthinking overrides toxhighsoopenrouter/deepseek/deepseek-v4-prono 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
/thinklevels by passing Claude Code's session-scoped--effortflag 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-coreormemory-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=allsearches 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_DIRandOPENCLAW_WORKSPACE_DIRon both gateway and CLI services so the host paths written into.envbyscripts/docker/setup.sh(used as Compose bind-mount sources) cannot leak into runtime code via theenv_fileimport. Fixes regressions on macOS Docker setups where the first agent reply died withEACCES: permission denied, mkdir '/Users'because the host-style workspace path got persisted intoagents.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 errorinstead ofundefinedin socket-mode startup retry logs and label the retry reason explicitly.Telegram: let explicit forum-topic
requireMentionsettings override persisted/activateand/deactivatestate, 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.sendresolves so pressing Esc during the gap before the first gateway event aborts the run instead of repeatedly printingno 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 skillSKILL.mdfiles and inactive plugin links are cleaned up. Fixes #77296. (#77328) Thanks @zhangguiping-xydt.Gateway/status: label Linux managed gateway services as
systemd user, making status output explicit about the user-service scope instead of implying a system-level unit. Thanks @vincentkoc.Plugins/install: remove the previous managed plugin directory when a reinstall switches sources, so stale ClawHub and npm copies no longer keep duplicate plugin ids in discovery after the new install wins. Thanks @vincentkoc.
Plugins/install: let official plugin reinstall recovery repair source-only installed runtime shadows, so
openclaw plugins install npm:@​openclaw/discord --forcecan 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
/codexcommand 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-1as 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/discordno 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 installcommands, so chat-driven installs match the CLI install trust path. Thanks @vincentkoc.Plugins/release: make the published npm runtime verifier reject blank
openclaw.runtimeExtensionsentries 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/postreferences 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: falseduring tool execution so config reloads cannot leave an already-createdweb_searchtool 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.runtimeExtensionsentries 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.jsonandnode_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
registerandregisterIfAbsentdo not report success while evicting their own fresh value. Thanks @vincentkoc.Plugins/providers: make bundled provider discovery honor restrictive
plugins.allowby default for new configs, while doctor migrates legacy restrictive allowlist configs toplugins.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 duringdoctor --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_fetchconfig and provider fallback metadata from the active runtime snapshot, matchingweb_searchso 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_searchprovider 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 blocksplugins installfor 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 finishacross terminals.Providers/OpenAI Codex: fail closed on malformed
/codexcontrol 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_inputtext 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
xhighandmaxthinking levels through the lightweight provider-policy surface, so Control UI/thinkpickers 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 listwhengh workflow runreturns 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-clampdeclaration 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 streampreviews 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/@​meREST path still bring the channel online while status enrichment finishes asynchronously. Fixes #77103. Thanks @Suited78.Exec approvals: detect
env -Ssplit-string command-carrier risks when-S/-sis combined with other env short options, so approval explanations do not miss split payloads hidden behindenv -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
execas a command carrier for inline eval, shell-wrapper, and eval/source detection, so approval explanations and command-risk checks do not miss payloads hidden behindexec. 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.jsaliases 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/approveshell 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.jswithout 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_searchauto-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.toolProgressscoped to progress draft mode, so partial and quiet Matrix previews do not lose tool progress unlessstreaming.preview.toolProgressis 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.toolProgressscoped 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-1as stable releases for npm installs, plugin updates, and bundled-version comparisons, solatestcan 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
/themespage. 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_listandmessages_read, while preservingstructuredContentfor capable clients. Fixes #77024.Media: treat
EPERMfrom the post-write media fsync step as best-effort, allowing WebChat and channel uploads to finish on Windows filesystems that rejectfsyncafter 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
sharpis 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
timeoutSecondsdrive both CLI no-output and embedded LLM idle watchdogs instead of being capped by resume defaults. Fixes #76289.Plugins/catalog: suppress missing
channelConfigscompatibility 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 formode: "agent", so new joins use the STT -> OpenClaw agent -> TTS path instead of selecting the direct realtime voice fallback.Google Meet: add
chrome.audioBufferBytesfor 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.postDtmfSpeechDelayMsin 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.providervalues as the transcription provider compatibility fallback whenrealtime.transcriptionProvideris unset. Thanks @vincentkoc.Google Meet: make Twilio setup status require an enabled
voice-callplugin 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-missingno 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 bindsidecar 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-cliresume sessionId at preparation time when its on-disk transcript no longer exists in~/.claude/projects/, so a stale binding from a half-installedupdate.runcannot trap follow-up runs (auto-reply / Telegram direct) in aclaude --resumetimeout 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 --repairdoes not reinstallfeishuwhileopenclaw-larkhandleschannels.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.listRPC 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, andtools.denypolicy 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.mdand 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 trackingOPENCLAW_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
lsofreports only the Node process name, so stale gateway cleanup can find macOScnodelisteners. Fixes #70664.Gateway/logging: expand leading
~inlogging.filebefore creating the file logger, preventing startup crash loops for home-relative log paths. Fixes #73587.Channels/CLI: keep
openclaw channels list --jsonusable when provider usage fetching fails, and report per-provider usage errors without aborting the channel list. Refs #67595.Doctor/plugins: do not treat
plugins.allowentries 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
messagetool 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.toolProgressis 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-codexwhen 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.alsoAllownames 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 asmode: "bidi"and acceptingmode: "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 asrealtime.strategy: "bidi", route the Meet tab speaker output toBlackHole 2chautomatically 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/pathlessread 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 bindapp-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 --forceno 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 whatsappdoes 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=1is 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-reachablecan 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/WINDIRenv values through the Windows install-root validator and add them to the dangerous-host-env policy when resolvingicacls.exe/whoami.exeforopenclaw security audit, so workspace.envoverrides and bare command names cannot redirect Windows ACL helpers to attacker-controlled binaries. (#74458) Thanks @mmaps.Security/Windows: pin Windows registry-probe
reg.exeresolution to the canonical Windows install root in install-root probing, soSystemRoot/WINDIRenv 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
commandAuthorizedmatching the channel's resolvedisAuthorizedSenderinstead of a hardcodedtrue. (#77453) Thanks @drobison00.Security/Windows: block
LOCALAPPDATAfrom workspace.envand resolve Windows update-flow portable Git path prepends from the trusted process-localLOCALAPPDATAonly, so workspace-supplied values cannot redirectgitdiscovery duringopenclaw 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/.batprocess wrapper through the shared Windows install-root resolver instead ofprocess.env.ComSpec, so workspace dotenv-blockedSystemRoot/WINDIRoverrides and unsafe values like UNC paths or path-lists cannot redirectcmd.exeselection on Windows. (#77472) Thanks @drobison00.Agents/bootstrap: honor
BOOTSTRAP.mdcontent injected byagent:bootstraphooks when deciding whether bootstrap is pending, so hook-provided required setup instructions are included in the system prompt. (#77501) Thanks @ificator.v2026.5.3Compare Source
Fixes
process.envaccess and normal API sends only appear in distant parts of the same compiled bundle. Thanks @vincentkoc.v2026.5.2Compare Source
Highlights
Changes
clawhub:installs on ClawHub and bare package installs on npm for the launch cutover. Thanks @vincentkoc.path.resolveandpath.relativework in hot filesystem walkers. Refs #75895, #75575, and #68782. Thanks @Enderfga.api.registerTool(...)so repeated prompt-time planning can skip plugin runtime loading while execution still loads the live plugin tool. (#76079) Thanks @shakkernerd.openai/gpt-*withagentRuntime.id: "codex"for native Codex runtime, whileopenai-codex/*remains the PI OAuth route. Thanks @pashpashpash.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.@openclaw/acpxpackage so packaged installs keep ACP harness adapter binaries out of core until the ACP backend is installed. Thanks @vincentkoc.@openclaw/diagnostics-otelpackage so packaged installs keep the OTEL dependency stack out of core until the plugin is installed. Thanks @vincentkoc.2026.5.1-beta.2npm and ClawHub publishing, and keep publishable plugin dist trees out of the core npm package. Thanks @vincentkoc.2026.5.1-beta.2npm and ClawHub publishing. Thanks @vincentkoc.2026.5.1-beta.1npm and ClawHub publishing. Thanks @vincentkoc.2026.5.1-beta.1npm and ClawHub publishing. Thanks @vincentkoc.accessTypeandentryPointAccess, and addgooglemeet end-active-conferencefor closing managed spaces after a call. (#74824) Thanks @BsnizND.googlemeet test-listenand the matchinggoogle_meettest_listenaction so transcribe-mode joins wait for real caption or transcript movement before reporting listen-first health. Refs #72478. Thanks @DougButdorf.threadBindings.spawnSessions, default thread-bound spawns on, and letopenclaw doctor --fixmigrate the legacy keys. (#75943)extraBody/extra_bodypassthrough for OpenAI-compatible TTS endpoints, so custom speech servers can receive fields such aslangin/audio/speechrequests. Fixes #39900. Thanks @R3NK0R.accessGroup:<name>across channel auth paths. (#75813)pnpm crabbox:*commands, and reject stale binaries that lackblacksmith-testboxprovider support.Fixes
distchunks and from the@openai/codexpackage bin when installs do not provide a nearby.bin/codexshim, avoiding false missing-binary startup failures.clawhub:specs until ClawHub pack readiness is deployed. Thanks @vincentkoc.extensions/*workspace while using npm package excludes as the packaged-core boundary, removing the stale core-bundle metadata path..tgzresolver path and persist artifact kind, npm integrity, shasum, and tarball metadata for update and diagnostics flows. Thanks @vincentkoc.gateway.controlUi.chatMessageMaxWidthsetting instead of patching bundled CSS after upgrades. Fixes #67935. Thanks @xiew4589-lang.sessions.changedsnapshots in-place and refetch only for partial events, avoiding redundantsessions.listregeneration during active session updates.sessions.listpolling 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.meta.lastTouchedVersion, installing actively used downloadable OpenClaw plugins through the configured external source before marking the config touched for the release.session.writeLock.acquireTimeoutMspolicy 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./codex bindworks from Telegram forum topics. Refs #75845 and #76049. Thanks @MatthewSchleder..openclaw-install-backupsafter plugin updates. Fixes #75456./status@botroute to the active non-mainsession instead of falling back to the default route. Fixes #75405; supersedes #75558. Thanks @ziptbm and @yfge.structuredClone, preserving mutation isolation while avoiding native-memory growth on large stores. Fixes #45438. Thanks @markus-lassfolk.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.sessions.jsonrereads and JSON clones on hot metadata updates. Refs #68554. Thanks @henkterharmsel./modelacknowledgements for non-default selections as session-scoped. Thanks @addu2612..mdsuffix during broken-wikilink validation, avoiding false positives for native render-mode links. Thanks @Kenneth8128.secrets.reloadandsecrets.resolvewarning logs while keeping RPC errors generic, so operators can diagnose reload and permission failures. Thanks @davidangularme.reasoning_contentreplay placeholders foropenrouter/deepseek/deepseek-v4-flashandopenrouter/deepseek/deepseek-v4-pro, so thinking/tool follow-up turns do not fail with DeepSeek's replay-shape error. Fixes #76018. Thanks @cloph-dsp.incomplete_resultreplies. Fixes #76007. Thanks @vliuyt.propertiesis missing, null, or invalid before sending tools to OpenAI, so MCP tools without params stay usable. Fixes #75362. Thanks @tolkonepiu and @SymbolStar.[[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.transformsDirpoints 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.FormDatabodies before proxy-backed undici fetches, so audio transcription and multipart uploads no longer send[object FormData]whenHTTP_PROXYorHTTPS_PROXYis configured. Fixes #48554. Thanks @dco5.sessions_senduses the target session'sdeliveryContext.accountIdorlastAccountIdinstead of falling back to the default bot in multi-account setups. Fixes #42652; refs #51626 and #44773; supersedes #73975. Thanks @irchelper, @dpalfox, and @Lanfei.CONTENT_TYPE_INVALID. Thanks @FunJim.ownerIdandparentIdfrom Discord API-style snake_case payload fields, so bot-owned autoThreads do not require unnecessary mentions. Thanks @mgh3326.reliability.outputLimits, raising the default guard for tool-heavy Claude CLI turns while preserving memory limits. Fixes #75838. Thanks @hcordoba840.message_thread_idreply-with-quote metadata on the flat DM session by default while preserving opt-in DM topic isolation for configured topics,dm.threadReplies, anddirect.<chatId>.threadReplies. Fixes #75975. Thanks @ProjectEvolutionEVE.timeoutSecondsconfigs extend safe method guards, and retry timed-out typing indicators through the transport fallback without risking duplicate messages. Fixes #76013. Thanks @iaki1206./statusand plugin commands stay available in forum topics. Fixes #74032; updates #6457. Thanks @dae-sun and @WouldenShyp.keychain:<service>:<account>OPENAI_API_KEYrefs before creating OpenAI Realtime browser sessions or voice bridges, with a bounded cached Keychain lookup. Fixes #72120. Thanks @ctbritt.sessionScope: "per-call"for fresh per-call agent memory while preserving the default per-phone caller history. Fixes #45280. Thanks @pondcountry.EBUSY,EPERM, orEACCESlocks do not fail memory rebuilds. Fixes #64187. Thanks @kunpeng-ai-lab.getMerequest guard for the gateway bot probe instead of a fixed 2.5-second budget, and honor highertimeoutSecondsconfigs for slow Telegram API paths. Fixes #75783. Thanks @tankotan.process is not defined. Fixes #75987. Thanks @novkien.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.image describe,image describe-many, andaudio transcribeinstead of blaming the input path when no provider is available. Fixes #73569 and supersedes #73593, #74288, and #74495. Thanks @bittoby, @tmimmanuel, @Linux2010, and @vyctorbrzezowski.allowFromentries. Fixes #62339. Thanks @kelvinisly-collab.google_meettool 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.openclaw.jsonduring Tailscale settings hydration, preservinggateway,auth,meta, andwizarduntil the user changes a setting. Fixes #59545. Thanks @Tengdw.setupGraceTimeoutMsconfig, so the plugin no longer silently extends 15000 ms configs to 45000 ms on the main lane. Fixes #75843. Thanks @vishutdhar.loadOpenClawPluginscall on every request while preserving origin and scope filters. Fixes #75513. Thanks @jochen.sessions_sendon its own persistent native subagent session, while preserving announce delivery for async sends. Fixes #73550. Thanks @sylviazhang2006-design.brave.httpdiagnostics 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.plugins.entries.brave.config.webSearch.baseUrlfor Brave-compatible proxies, including endpoint-aware cache keys for both web and LLM Context modes. Fixes #19075. Thanks @jkoprax and @vishnukool.tools.web.search.providervalues against bundled and installed plugin manifests, while warning for stale third-party plugin config. Fixes #53092. Thanks @TinyTb.message readand bound stop-hook shutdown for other message actions, so one-shot Discord reads cannot hang behind plugin lifecycle cleanup./newthrough the New Chat dashboard-session creation flow instead ofchat.send, while keeping/resetas the explicit current-session reset. Fixes #69599. Thanks @WolvenRA.claude-cli/*in the configured allowlist after canonical runtime migration, so cronpayload.modeloverrides keep working. Fixes #75753. Thanks @RyanSandoval.thread/starton a closed client. Thanks @vincentkoc.NO_COLOR, while preserving explicitFORCE_COLOR=0opt-out. Thanks @vincentkoc.isPrivateIpAddressfromplugin-sdk/ssrf-runtime, restoring source-checkout builds for SearXNG and Firecrawl private-network guards. Thanks @vincentkoc.upload-fileand 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.NO_REPLYand keep agent-to-agent announce bookkeeping out of visible transcripts. Fixes #53145. Thanks @TarahAssistant.search.formatsprerequisite during SearXNG setup before prompting for the base URL. Supersedes #65592. Thanks @evanpaul14.img_srcimage URLs from SearXNG image-category results. Supersedes #61416. Thanks @sghael.firecrawl_scrapetarget URLs before forwarding them to Firecrawl. Supersedes #48133. Thanks @kn1ghtc.baseUrlendpoints, 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.infer model run --jsonand avoid double-prefixing provider-qualified defaults such asopenrouter/autoinmodels status. Partially fixes #69527. Thanks @alexifra.plugins.entries.exa.config.webSearch.baseUrl, normalize it to the Exa/searchendpoint, and partition cached results by endpoint. Fixes #54928 and supersedes #54939. Thanks @mrpl327 and @lyfuci.MINIMAX_API_KEYparticipate in MiniMax Search auto-detection. Supersedes #65828. Thanks @Jah-yee.models.providers.lmstudio.params.preload: falseto 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.MINIMAX_OAUTH_TOKENto 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.sessions_sendtargets 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.sessions_spawnwithexpectsCompletionMessage: falseby skipping parent completion handoff delivery while still running child cleanup. Fixes #75848. Thanks @alfredjbclaw.MEDIA:fallback posts after video or music generation finishes.gateway.authand 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.null. Thanks @shakkernerd.reactionNotifications: "off", avoiding needless reaction-event queue work. Fixes #47516. Thanks @x4v13r1120.MEDIA:directive file extensions, so generated-image metadata cannot pollute the parsed media path and cause falseENOENTdelivery failures. Fixes #75182. Thanks @TnzGit and @hclsys.TELEGRAM_BOT_TOKENorDISCORD_BOT_TOKEN) is unavailable, with secret-safe migration docs for checking state-dir.env. Fixes #74298. Thanks @lolaopenclaw.telegram:123select their channel when delivery falls back tolast, so Telegram IDs cannot be coerced into WhatsApp phone numbers. Fixes #56839. Thanks @bencoremans.mainsends the chat turn but Gateway emits events under the canonical session key for the same run. Fixes #73716. Thanks @teebes.--agentonopenclaw models setandset-imageinstead of silently writing agent-scoped requests to global model defaults. Fixes #68391. Thanks @derrickabellard.openclaw tool ...token as a plugin id under restrictiveplugins.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.ttsname. Fixes #74752. Thanks @Loveworld3033 and @andyliu.minHostVersionmetadata, 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.[TOOL_CALL]...[/TOOL_CALL]and[TOOL_RESULT]...[/TOOL_RESULT]pseudo-call blocks from heartbeat replies before channel delivery. Fixes #54138. Thanks @Deniable9570.web_searcha 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.sendincludes a file plus presentation or interactive controls, so file attachments are no longer rejected. Fixes #51458. Thanks @HirokiKobayashi-R.dmHistoryLimitfor fresh 1:1 Slack DM sessions by backfilling recent conversation history before the current reply. Fixes #64427. Thanks @brantley-creator.replyToModetargets Slack thread replies, preserving context across DM turns. Fixes #58832. Thanks @daye-jjeong.auth.testresponse metadata before trying legacy scope APIs, so modern bot tokens no longer reportunknown_methodfor channel capabilities. Fixes #44625. Thanks @Qquanwei and @martingarramon.chat.postMessage(channel=<user id>)while keeping conversation resolution for uploads and threaded sends. Fixes #62042. Thanks @MarkMolina.channel:C...,user:U..., or<@​U...>, so bound Slack peers route to the configured agent instead ofmain. Fixes #41608. Thanks @Winnsolutionsadmin.channel:C...against bare Slack runtime channel IDs, so allowed channel mentions do not fail aschannel-not-allowed. Fixes #41264 and supersedes #56530. Thanks @babutree and @Realworld404.EAI_AGAIN, so transient resolver hiccups can recover without retrying platform errors that may duplicate messages. Fixes #68789. Thanks @sonnyb9.<!subteam^...>user-group mentions through Slackusergroups.users.listand 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.readfetch an exact Slack message timestamp, including a specific thread reply when paired withthreadId, instead of returning only the parent thread or recent channel history. Fixes #53943. Thanks @zomars.x-goog-api-keyheader instead of the request URL, keeping secrets out of proxy and access logs. Supersedes #60600. Thanks @garagon.web_fetchfor known URLs and the browser tool for interactive pages. Thanks @zhaoyang97.web_searchcalls to the current runtime config snapshot, so existing sessions do not keep stale unresolved SecretRefs after secrets reload. Fixes #75420. Thanks @richardmqq.models.providers.google.apiKeyandmodels.providers.google.baseUrlas lower-priority fallbacks for Gemini web search after dedicated search config andGEMINI_API_KEY. Supersedes #57496. Thanks @Aoiujz.freshnessanddate_after/date_beforefilters through Google Search grounding time ranges. Fixes #66498. Thanks @ismael-81.baseUrloverrides for Gemini, Grok, and x_search provider-owned config, so proxy-backed search tools no longer dial hardcoded public endpoints. Supersedes #61972. Thanks @Lanfei./tools/brave-searchdocs page and make the legacy/brave-searchdocs page a redirect stub. Fixes #65870 and supersedes #65892. Thanks @Magicray1217 and @Jah-yee.freshnessand bounded date ranges inllm-contextmode, matching Brave's documented LLM Context API support. Supersedes #51005. Thanks @remusao.webFetchProvidersfor non-sandboxedweb_fetch, while keeping sandboxed fetches limited to bundled providers. Fixes #74915. Thanks @ultrahighsuper and @mingmingtsao.[TOOL_CALL]...[/TOOL_CALL]and[TOOL_RESULT]...[/TOOL_RESULT]pseudo-call blocks from heartbeat replies before channel delivery. Fixes #54138. Thanks @Deniable9570.web_searcha 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.openclaw directory peers/groups list --channel slackprefer token-backed live readers and return the connected Slack account fromdirectory self, so valid Slack tokens no longer produce empty directory CLI results. Fixes #50776. Thanks @pjaillon.[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.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.[[tts]]replies generate voice payloads instead of leaking raw tags. Fixes #52125. Thanks @kenchen3000.<media:image>. Fixes #59174. Thanks @gaffner.skillsSnapshot.resolvedSkillsarray inside each session entry, sosessions.jsonno longer carries a copy of every parsedSKILL.mdbody for every active session;ensureSkillSnapshotrehydrates 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.ensure-whatsapp.shhealth check, which can misreportGateway inactivewhen cron lacks the systemd user-bus environment. Fixes #60204. Thanks @mySebbe.[[tts:...]]tags are not spoken literally and voiceId overrides reach OpenAI/ElevenLabs calls. Fixes #58114. Thanks @legonhilltech-jpg..jsonl.lockfiles. Fixes #75805; refs #49603. Thanks @cdznho.sessions_spawnresolves spawn preparation, so cliBackend-only cold starts no longer fail with an unregisteredlegacycontext engine. Fixes #73095. (#73904) Thanks @brokemac79.contracts.toolsas the manifest ownership contract for plugin tool registration, rejecting undeclared runtime tool names and adding bundled plugin drift coverage. Thanks @shakkernerd.NO_REPLY, so quiet turns are represented by not calling the visible message tool instead of conflicting final-text instructions. Thanks @pashpashpash.gateway config.patchto update documented subagent thinking defaults. Fixes #75764. (#75802) Thanks @kAIborg24.agentIdentries under guild channel config into top-levelbindings[]routes, soopenclaw doctor --fixpreserves the intended agent route instead of stripping it as an unknown key. Fixes #62455. Thanks @lobster-biscuit.ctx.Toto the semanticuser:<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.@Namereferences can be rewritten to real Discord user mentions instead of relying only on the transient directory cache. Fixes #67587. Thanks @McoreD./users/@​melookup. Fixes #75341. Thanks @PrinceOfEgypt.ctx.channelIdfrom the conversation target instead of the provider name, so Discord and other channel plugins can keep per-channel state isolated. Fixes #59881. Thanks @bradfreels.session.stuckdiagnostics while a session remains unchanged. Supersedes #72010. Thanks @rubencu.status: internal server errorprovider messages as retryable server errors so model fallback can rotate instead of stopping. (#73844) Thanks @thesomewhatyou.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.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 throughUnknown sessionKey: current. Fixes #74141. (#72306) Thanks @bittoby.openclaw skills check --agent, and let doctor report or disable unavailable skills allowed for the default agent. (#75983) Thanks @mbelinky.v2026.4.29Compare Source
Highlights
Changes
agents.defaults.skipOptionalBootstrapFilesfor skipping selected optional workspace files during bootstrap without disabling required workspace setup. (#62110) Thanks @mainstay22.git:plugin installs with ref checkout, commit metadata, normal scanner/staging, andplugins updatesupport for recorded git sources. Thanks @badlogic.BodyForAgentis the primary inbound model text whileBodyis the legacy envelope fallback, and add Signal coverage so channel hardening patches target the real prompt path. Refs #66198. Thanks @defonota3box.app_home_openedand include the Home tab event in setup manifests. Fixes #11655; refs #52020. Thanks @TinyTb.channels.bluebubbles.replyContextApiFallbackthat 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 throughmergeAccountConfig; routed through the typedBlueBubblesClientso 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 samereplyToIdcoalesce 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 extendssanitizeForLogto redact?password=…/?token=…query params andAuthorization:headers before they reach the log sink (CWE-532). (#71820) Thanks @coletebou and @zqchris.openclaw proxy validateso operators can verify effective proxy configuration, proxy reachability, and expected allow/deny destination behavior before deploying proxy-routed OpenClaw commands. (#73438) Thanks @jesse-merhi.messagetool when visible reply delivery is not explicitly configured, keeping channel-visible output as a deliberate tool call. (#75765) Thanks @pashpashpash.heartbeat_respondtool for tool-capable heartbeat runs so agents can record quiet outcomes or explicit notification text without relying only onHEARTBEAT_OKparsing. (#75765) Thanks @pashpashpash.$includedirectives to read files from operator-approvedOPENCLAW_INCLUDE_ROOTSdirectories while preserving default config-directory confinement. Thanks @ificator.tools.exec,tools.fs) no longer implicitly widen restrictive profiles (messaging,minimal). Users who need those tools under a restricted profile must add explicitalsoAllowentries; a startup warning identifies affected configs. Fixes #47487. Thanks @amknight.commitments.enabled/commitments.maxPerDayconfig, and heartbeat-interval due-time clamping so magical check-ins do not echo immediately. (#74189) Thanks @vignesh07.steerdrain all pending Pi steering messages at the next model boundary, keep legacy one-at-a-time steering asqueue, and add a dedicated steering queue docs page. Thanks @vincentkoc.steerwith a 500ms followup fallback debounce, and document the queue modes, precedence, and drop policies on the command queue page. Thanks @vincentkoc.messages.visibleRepliesso operators can require visible output to go throughmessage(action=send)for any source chat, whilemessages.groupChat.visibleRepliesstays available as the group/channel override. Thanks @scoootscooob.spawnedByon subagent chat and agent broadcast payloads so clients can route child session events without an extra session lookup. (#63244) Thanks @samzong.allowedChatIdsanddeniedChatIdsfilters so operators can enable recall only for selected direct, group, or channel conversations while keeping broad sessions skipped. (#67977) Thanks @quengh.doctor.memory.remHarnessRPC so operator clients can preview bounded REM dreaming output without running mutation paths. (#66673) Thanks @samzong.openclaw doctor --fixcannot 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.api.runtime.state.openKeyedStore) for restart-safe keyed registries with TTL, eviction, and automatic plugin isolation. Thanks @amknight.@deprecatedtags. Thanks @vincentkoc.pnpm gateway:watchthrough a named tmux session by default, withgateway:watch:rawandOPENCLAW_GATEWAY_WATCH_TMUX=0for foreground mode, so repeated starts respawn an inspectable watcher without trapping the invoking agent shell. Thanks @vincentkoc.fa,nl,vi, andzh-TWdocs glossaries, so the docs translation pipeline and the Control UI language picker stay aligned across surfaces. Thanks @vincentkoc.OPENCLAW_SKIP_ONBOARDINGso automated Docker installs can skip the interactive onboarding step while still applying gateway defaults. (#55518) Thanks @jinjimz.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
<@​USER_ID>,<#CHANNEL_ID>, and<@​&ROLE_ID>instead of legacy nickname mentions. (#75173)Heartbeat scheduler: gate exec-event/notification/spawn/retry wakes through a centralized cooldown so backgrounded
process.startexit notifications can no longer self-feed runaway heartbeat runs (configuredevery: "30m"was firing every ~10s in production, pegging the gateway event loop witheventLoopDelayMaxMs >6sspikes 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 zaishows the full known catalog without duplicated runtime seed data. Thanks @shakkernerd.Providers/Qianfan and Providers/Stepfun: declare setup auth metadata (
api-keymethod,QIANFAN_API_KEY,STEPFUN_API_KEY) in the plugin manifest so onboarding andmodels setupsurface the expected env var without falling back to legacyproviderAuthEnvVarsruntime 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
.envsystem-path variables and resolve stale-processtaskkill.exefrom 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 enableandplugins 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.voiceis explicitly configured, avoiding defaultGuildVoiceStatestraffic 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 --enforcestill preserve the cleanup safeguards. Fixes #70050. Thanks @tangda18.Security/audit: keep plain
security auditon 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
qrcodethrough 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
systemPromptoverrides 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 deepinfrarows 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 --deliverrequests 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-fromonboarding 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
ttstool and asks for spoken reply text, so/vc joinsessions synthesize and play agent replies instead of ending withNO_REPLY. Fixes #61536. Thanks @aounakram.Doctor/plugins: keep plain
doctor --non-interactivefrom installing bundled plugin runtime dependencies, so headless health checks report missing deps whiledoctor --fixremains the explicit repair path. Thanks @vincentkoc.Doctor/gateway: require an interactive confirmation before installing or rewriting the Gateway service, so
doctor --fix --non-interactivecan 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-sdkdo 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.schemaresponse 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 updateno 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 toaudio/*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 inlinedocker buildcommands 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 twilioand 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_BANNERbanner 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 continuethrough 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
voicecallcommands to the running Gateway runtime and skip webhook startup during CLI-only plugin loading, preventing webhook port conflicts andsetup --jsonhangs. Fixes #72345. Thanks @serrurco and @DougButdorf.Agents/pi-embedded-runner: extract the
abortableprovider-call wrapper fromrunEmbeddedAttemptto 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
python3in 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
voicecallcommand 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.allowis 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
messagetool 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
--allstill 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 installafter 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 onboardandopenclaw configureconfig 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.lockdirectories. 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
contextTokensis larger than nativecontextWindow. Fixes #74917. Thanks @kAIborg24.Gateway/systemd: exit with sysexits 78 for supervised lock and
EADDRINUSEconflicts soRestartPreventExitStatus=78stopsRestart=alwaysrestart 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_HOMEandHOMEper 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
messagetool 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 configuredbrowser.executablePath,headless, andnoSandboxinstead 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.jsonsurgery. 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-depsdirectories. Fixes #74971. Thanks @eurojojo.Memory/runtime-deps: retain the native
node-llama-cppruntime 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.fetchconfig, 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
requireMentionis set. Fixes #53308. Thanks @minupla and @juan-flores077.Signal: bound
signal-cliinstaller 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=trueto 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
getAttachmentHTTP response caps fromchannels.signal.mediaMaxMbwith 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-cli0.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
/statusno longer disturbs the active input row. (#75003) Thanks @velvet-shark.Models/OpenAI Codex: restore
openai-codex/gpt-5.4-minifor 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
timeoutSecondsvalues below thegetUpdatespoll window no longer force a fresh HTTPS connection every few seconds. Fixes #75114. Thanks @hpinho77.Web search: describe
web_searchas 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.midTurnPrecheckmid-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
packageRootviafs.realpathSync.native(withpath.resolvefallback) when computing the bundled runtime-deps stage key, so loader and channelbundled-rootcallers no longer derive divergent stage directories under~/.openclaw/plugin-runtime-deps/openclaw-<version>-<hash>/and bundled channels stop failing withENOENTon 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, andprofileIdattribution throughFailoverErroranddescribeFailoverError/coerceToFailoverErrorso structured error logs (e.g.gateway.err.logingestion) 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
COMSPECin workspace.envso a malicious repo cannot redirect Windowscmd.exeresolution, and lock in case-insensitive workspace-.envregression 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 --forceand doctor repair, so the repair path no longer recreatesgateway-path-nonminimalwarnings. Fixes #75220. (#75440) Thanks @leonaIee, @renaudcerrato, and @aaajiao.v2026.4.27Compare Source
Highlights
Changes
sandbox.docker.gpuspassthrough 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.node.presence.aliveprotocol event andnode.listlast-seen fields so background iOS wakes can mark paired nodes recently alive without treating them as connected. Carries forward #63123. Thanks @ngutman.node.presence.aliveevents after node connect and background transitions so paired Android nodes retain durable last-seen metadata after disconnects. Carries forward #63123. Thanks @ngutman.chat.sendby staging them as agent-readable media paths, while keeping unsupported RPC attachment paths explicit instead of silently dropping files. Fixes #48123. (#67572) Thanks @samzong.target: "both"delivery, with redacted artifacts preserving safe approval summaries. Thanks @gumadeiras./diagnosticswith 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 matchingcodex resume <thread-id>inspection command after confirmed upload. Thanks @pashpashpash./export-trajectorythrough per-run exec approval, send group-chat approval prompts and export results only to the owner privately, and addopenclaw sessions export-trajectoryfor the approved command path. Thanks @pashpashpash./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.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.cua-driver mcp, and OpenClaw.app's PeekabooBridge fit together so desktop-control setup choices are clearer. Thanks @pash-openai and @trycua.streaming.preview.toolProgress: falseto keep answer previews while hiding interim tool lines. Thanks @gumadeiras.modelCatalog.aliasesandmodelCatalog.suppressionsinto 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.modelCatalogrows. Thanks @shakkernerd.modelCatalogrows and remove the now-unused Volcengine-family shared catalog SDK subpath. Thanks @shakkernerd.modelCatalogrows so provider-filtered listing can use manifest-backed static rows. Thanks @shakkernerd.openclaw-plugin-yuanbao) in the official channel catalog, contract suites, and community plugin docs, with a newdocs/channels/yuanbao.mdquick-start guide for WebSocket bot DMs and group chats. (#72756) Thanks @loongfay.stream_messagesstreaming with aStreamingControllerlifecycle manager, unifiedsendMediawith chunked upload for large files, and refactor the engine into pipeline stages, focused outbound submodules, builtin slash-command modules, and explicit DI ports viacreateEngineAdapters(). (#70624) Thanks @cxyhhhhh.activation.onStartupdeclarations so Gateway startup imports only the bundled plugins that intentionally register startup-time runtime surfaces. Thanks @shakkernerd.activation.onStartupmetadata. Thanks @shakkernerd.activation.onStartupmetadata so plugins can declare Gateway startup import behavior while the deprecated implicit sidecar fallback remains for legacy plugins. Thanks @shakkernerd.models list --allon raw registry and supplement rows without runtime normalization, and avoid duplicate supplement resolution. Thanks @shakkernerd.test/helpers/channelsbridge directory so plugin tests stay on focused SDK surfaces. Thanks @vincentkoc.plugin-sdk/agent-runtime-test-contracts, move sandbox config fixtures into the focused generic fixture subpath, and block extension tests from importing repo-onlytest/helpersbridges. Thanks @vincentkoc.channel-config-schema-legacysubpath, add an explicit bundled-channel schema SDK surface, and track both remaining legacy test/config compatibility barrels with dated removal windows. Thanks @vincentkoc.test/helpers/pluginsTypeScript bridge. Thanks @vincentkoc.plugin-sdk/channel-test-helpersso bundled extension tests no longer import repo-only channel helper bridges. Thanks @vincentkoc.plugin-sdk/channel-target-testingfor shared channel target-resolution cases, document channel reaction helpers onplugin-sdk/channel-feedback, and keep the oldplugin-sdk/test-utilsalias as compatibility-only. Thanks @vincentkoc.plugin-sdk/testingbarrel for common setup helpers. Thanks @vincentkoc.plugin-sdk/plugin-test-apihelper subpath and move bundled plugin registration tests off the repo-only plugin API bridge. Thanks @vincentkoc.src/**internals. Thanks @vincentkoc.DEEPINFRA_API_KEYonboarding, 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.Fixes
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.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), inboundchatGuidfallback (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.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.approval-pendinginstead of replaying stale exec approval IDs into the new Gateway process after restart. Fixes #65486. Thanks @mjmai20682068-create.chat.historyandsessions.listthinking defaults with owning-agent and catalog-aware resolution so Control UI session defaults match backend runtime state. (#63418) Thanks @jpreagan.allow-onceapprovals, while returning an explicit already-resolved error for conflicting repeats. Fixes #59162; refs #58479 and #65486. Thanks @wikithoughts, @sajazuniga7-coder, and @mjmai20682068-create.approvals.exec/plugin.targets[].accountIdwhen routing native approvals across multi-bot Telegram accounts while preserving unscoped Telegram targets for any account. Fixes #69916. Thanks @joerod26.video_generateandmusic_generatetool run contexts until terminal status, so Discord-backed provider jobs stay live in/tasksinstead of becominglostwhen the parent chat run context disappears. Thanks @vincentkoc./tasksagent-local fallback includes session-backedvideo_generateand other async media jobs even when the current chat session has no linked rows. Thanks @vincentkoc.video_generateandmusic_generatetasks fresh while provider jobs are still pending, so task maintenance does not mark active Discord media renders lost before completion. Thanks @vincentkoc.openclaw status --allno longer reports a live gateway as unreachable aftermissing scope: operator.read. Fixes #49180; supersedes #47981. Thanks @openjay.channels.slack.socketMode.clientPingTimeout,serverPingTimeout, andpingPongLoggingEnabledoverrides so stale-websocket handling no longer depends on app-event health heuristics. Fixes #14248; refs #58519, #64009, and #63488. Thanks @shivasymbl and @freerk.file_sharemedia no longer wedges inbound message handling. Fixes #61850. Thanks @bassboy2k.new sessionout ofBodyForAgentafter directive cleanup, so configured Slack reset phrases do not leak into the fresh model turn. Fixes #73137. Thanks @neeravmakwana.channels.discord.tokeninto 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./resetand/newafter 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.reasoning_contenton 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.config.patchandconfig.applytool 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.NO_REPLYTTS replies still deliver the requested audio bubble. (#73406) Thanks @zqchris.System: Mattermost message...directives. Fixes #71795. Thanks @juan-flores077.agents.defaults.imageModelandpdfModelrefs from unique configured image-capable providers, so Ollama vision models such asmoondreamandqwen2.5vl:7bdo not fall through to the default provider. Fixes #38816; supersedes #73396. Thanks @alainasclaw and @vincentkoc.skills.entries.coding-agent.enabledbefore 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.entries.workspacewarnings during Gateway startup. Fixes #73433. Thanks @AnneVoss.sessions_yieldas 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.~/.openclaw/media/inbound/instead of temporary files so agents can still read LINE media after/tmpcleanup. Fixes #73370. Thanks @hijirii and @wenxu007.plugins.load.pathswhile preserving install records, so install/inspect/doctor loops no longer warn about the current bundled plugin directory. Thanks @vincentkoc.plugins inspect <id>runtime loading to the matched plugin so single-plugin inspection does not load every plugin before checking the target. Thanks @shakkernerd.cron.addjobs whenagentIdis 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.--thread-idtoopenclaw cron addandopenclaw cron edit, preserving Telegram forum topic delivery targets across scheduled announcements. Carries forward #51581, #60373, and #60890. Thanks @ChunHao-dev.chat.historyno longer expose them as normal user turns. Fixes #54408 and #58956; refs #43567. Thanks @markgong and @guoyuhang9.RangeError: Maximum call stack size exceeded. Fixes #73360; refs #54378 and #63432. Thanks @hejunhui-73, @Ansub, and @christianhernandez3-afk.reader.read(). Refs #72965 and #73120. Thanks @wdeveloper16.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./newwhile leaving typed/newand/resetcommands immediate. Fixes #45800; refs #27065, #56611, #54499, and #27110. Thanks @aethnova, @kosta228-huli, @adambezemek, and @xss925175263 (xianshishan).fallbacksis omitted, so probe-only custom providers are not tried as hidden fallback candidates unless the agent explicitly opts in. Fixes #73332. Thanks @haumanto.models.pricing.enabledso 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.CLAWDBOT_*orMOLTBOT_*environment variables are still present, pointing users toOPENCLAW_*names instead of failing silently. Fixes #53482; carries forward #53667. Thanks @lndyzwdxhs.OPENCLAW_GATEWAY_TOKENorOPENCLAW_GATEWAY_PASSWORDvalues do not produce false gateway-token-mismatch failures after setup. Fixes #72203. Thanks @galiniliev.openclaw doctor --fixno longer silently renames recoverable session history after upgrades regeneratesessions.json. Fixes #73106. Thanks @scottgl9.: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.pnpm buildwrites the build stamp, so the next CLI invocation does not re-sync runtime artifacts after a successful build. Fixes #73151. Thanks @bittoby.openclaw channels listshows Telegram accounts before auth providers. Fixes #73319 and #73322. Thanks @mlaihk.infer model run --gatewayraw 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.--promptand--timeout-msthroughinfer image describeanddescribe-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.infer model run --promptvalues before calling local providers or the Gateway, so smoke checks do not spend provider calls on invalid turns. Fixes #73185. Thanks @iot2edge.chat.sendimage offloads through media-understanding fields soagents.defaults.imageModelcan describe WebChat attachments instead of leaving only an opaquemedia://inboundmarker. Fixes #72968. Thanks @vorajeeah.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./thinkcommands against live Ollama catalog reasoning metadata and preserve explicit nativeparams.think/params.thinking, so models whose/api/showcapabilities includethinkingexposelow,medium,high, andmaxinstead of being stuck onoff. Fixes #73366. Thanks @cymise.sessions.jsonrotation backups, deprecatesession.maintenance.rotateBytes, and teachopenclaw doctor --fixto remove the ignored key so hot session writes no longer copy multi-MB stores. Refs #72338. Thanks @midhunmonachan and @DougButdorf.getMetoken probe with 401, so invalid or stale BotFather tokens are reported as token auth failures instead of misleadingdeleteWebhookcleanup failures. Fixes #47674. Thanks @samaedan-arch.--custom-image-input/--custom-text-inputoverrides so vision-capable proxies do not get saved as text-only configs. Fixes #51869. Thanks @Antsoldier1974.openai-codex/gpt-5.4-minirows through Codex OAuth, keep stale discovery rows suppressed with a clear API-key-route hint, and leave directopenai/gpt-5.4-miniavailable. Fixes #73242. Thanks @0xCyda.stringEnumandoptionalStringEnumexports 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.registerContextEngineand expose missing legacy compat helpersnormalizeAccountIdandresolvePreferredOpenClawTmpDirso older external plugins such asopenclaw-weixincan keep loading while migrating to focused SDK subpaths. Fixes #53497. Thanks @alanxchen85.openclaw doctor --fixmigrate legacy flatauth-profiles.jsonfiles 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.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./bot<TOKEN>TelegramapiRootvalues at runtime and teachopenclaw doctor --fixto 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.zca-jssession cookies after QR login, session restore, and successful API calls so gateway restarts restore the freshest local session. (#73277) Thanks @darkamenosa.createSubsystemLogger().info/warn/erroroutput 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.openclaw-unknown-*directories or loops onENOTEMPTY. Fixes #72956. (#73205) Thanks @SymbolStar.--mcp-configdirectory until the live subprocess closes. Fixes #73244. Thanks @edwin-rivera-dev.tzvalues use local wall-clock cron fields and omitted crontzfalls back to the Gateway host local timezone. Fixes #53669; carries forward #46177. (#73372) Thanks @chen-zhang-cs-code and @maranello-o.qwen/qwen3.6-plusto resolve on Qwen Coding Plan endpoints while keeping the built-in catalog from advertising it there. Fixes #63654; carries forward #63987. Thanks @jepson-liu.deleteWebhookIPv6 stalls no longer trigger slow multi-account retry storms. Fixes #73255. Thanks @ttomiczek and @sktbrd.sessions_spawnworks from non-delivery parent sessions while unknown channel hints still fail closed. Fixes #73237. Thanks @KeWang0622.models.providers.*.modelsrows 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.openclaw tasks cancelcan load ACP/subagent cancellation helpers from published builds. Fixes #68997. Thanks @1OAKDesign.image_generateoutputs still reach Telegram as photos instead of being dropped from the final payload. Fixes #73253. Thanks @mlaihk.openclaw agent --localruns, while keeping gateway-owned MCP loopback cleanup internal to the Gateway. Thanks @frankekn.npxadapter resolution. Fixes #73202. Thanks @joerod26.agents.defaults.compaction.memoryFlush.modeloverride such asollama/qwen3:8bwithout inheriting the active session fallback chain, so local housekeeping can avoid paid conversation models. Fixes #53772. Thanks @limen96.test_speechreport fresh realtime output-byte verification instead of only confirming a queued utterance. Refs #72478. Thanks @DougButdorf.models.providers.*.modelsshow those configured models first instead of flooding the picker with the full built-in catalog. Fixes #65405. Thanks @wbyanclaw.models.providers.*.modelsentries whenmodels.modeisreplaceinstead of loading the full built-in catalog. Fixes #64950. Thanks @mrozentsvayg.InteractionEventListenerlistener timeouts. Fixes #73204. Thanks @slideshow-dingo.model.fallback_steptrajectory 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.execfrom launching interactiveopenclaw channels loginflows 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.heartbeat.model, so smaller local heartbeat models point users toisolatedSessionorlightContextinstead of only compaction-buffer tuning. Fixes #67314. Thanks @Knightmare6890.sessions_spawn.modeland 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.setWebhookregistration after recoverable startup network failures, so transient Bot API timeouts no longer leave reverse proxies pointing at a closed listener. Fixes #71834. Thanks @jinon86.CODEX_HOMEwrapper before falling back to npm, so Codex ACP startup no longer depends on livenpxresolution or the stale@zed-industries/codex-acp@^0.11.1range. Fixes #72037; refs #73202. Thanks @jasonftl, @sazora, and @joerod26.actual unavailable. Thanks @ProspectOre.extensions/*/node_modulesdependency trees while keeping plugin manifests and source files in archives, so local backups avoid rebuildable npm payload bloat. Fixes #64144. Thanks @BrilliantWang.payload.modelis 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.messages.tts.providers.<id>.apiKeythrough the active runtime snapshot fortalk.config, so Talk overlays can discover SecretRef-backed speech providers without falling back to local speech. Fixes #73109. (#73111) Thanks @omarshahine.memorySearch.providercustom provider ids through their configuredmodels.providers.<id>.apiowner, so multi-GPU Ollama setups can dedicate embeddings to providers such asollama-5080without losing the Ollama adapter or local auth semantics. Fixes #73150. Thanks @oneandrewwang.openclaw memorycommands so memory search does not race unrelated model metadata discovery. Fixes #73123. Thanks @oalansilva and @neeravmakwana.message sendand poll actions through the running Gateway when available, so packaged installs use the stagedgrammyruntime deps and CLI sends return instead of hanging after the Telegram channel is active. Fixes #73140. Thanks @oalansilva.grammyfrom the managed runtime-deps stage without copying dependencies into the global package root. Refs #73140. Thanks @oalansilva.(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.openclaw-lark. Fixes #56794. Thanks @wuji-tech-dev.not checkedand report active custom memory plugin runtime status fromstatus --json --allwithout requiring built-inagents.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.openclaw doctorwarn about that policy mismatch;messages.groupChat.visibleReplies: "automatic"restores legacy auto-posting. (#73046) Thanks @scoootscooob.embedding.apiKey, so OAuth-capable embedding providers can power auto-recall/capture. Fixes #68950. Thanks @malshaalan-ai.openclaw <parent>(memory, channels, plugins, approvals, devices, cron, mcp) without a subcommand now prints the parent's help and exits0, matching<parent> --helpand the existingagents/sessionsdefaults so shell&&chains and pnpm wrappers no longer surface a misleadingELIFECYCLE Command failed with exit code 1.line. Fixes #73077. Thanks @hclsys.agent_endobservation 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.config.get/config.schema, preventing idle plugin-discovery CPU churn after upgrades. Fixes #73088. Thanks @sleitor and @geovansb.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.npm install failed:with no detail. (#73093) Thanks @sanctrl.recallMaxCharssetting, 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.--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.OPENCLAW_DISABLE_BUNDLED_PLUGINSas a hard disable. (#72817) Thanks @serkonyc.memorySearch.remote.nonBatchConcurrencyfor 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.models.jsonreadiness and provider-hook caches warm across repeated agent and subagent model resolution while preserving externalmodels.jsoninvalidation, reducing repeated provider-plugin loads on slower ARM64 hosts. Fixes #73075. Thanks @jochen.tools.profile: "messaging"is intentionally narrow and thattools.profile: "full"is the unrestricted baseline for broader command/control access. Carries forward #39954. Thanks @posigit.sessions_historyrecall redaction enabled even when general log redaction is disabled, and clarify that safety-boundary UI/tool/diagnostic payloads still redact independently oflogging.redactSensitive. Carries forward #72319. Thanks @volcano303 and @BunsDev.web_searchactivation 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.payload.modelas a per-job primary that can use configured fallbacks, while still lettingpayload.fallbacks: []make cron runs strict and avoid hidden agent-primary retries. Refs #73023. Thanks @pavelyortho-cyber./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_API_KEYorOPENAI_API_KEY, and fall back toCODEX_API_KEY/OPENAI_API_KEYapp-server login only when no Codex account is available. Fixes #73057. Thanks @holgergruenhagen and @pashpashpash.infer model runprobes 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.infer model runthrough 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/chatrequest. Fixes #72851. Thanks @TotalRes2020.~/.volta/bin,~/.asdf/shims,~/.bun/bin, and fnm/pnpm fallbacks into gateway and node service PATHs when the directories exist, soopenclaw doctorno longer flagsgateway.path.non-minimalagainst a PATH the daemon just wrote. Env-driven roots and stable user-bin dirs remain unconditional. Fixes #71944; carries forward #71964. Thanks @Sanjays2402.pnpm buildupdates are visible to the nextopenclawCLI invocation. Fixes #73037. Thanks @LouisGameDev.NO_REPLYpath without injecting visible-answer retry prompts, and clarify the group prompt so agents use the exact silent token instead of prose. Thanks @vincentkoc.NO_REPLYmechanics 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.reasoning.encrypted_contenton reasoning turns so GPT-5.4/GPT-5.5 sessions do not lose requiredrs_*state besidemsg_*items. Fixes #73053. Thanks @odb36777.plugins.enabled=falseas 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./dock-*commands switch the active session reply route throughsession.identityLinksinstead of falling through to normal chat. Fixes #69206; carries forward #73033. Thanks @clawbones and @michaelatamuk.gateway_starthook is registered, so clean post-ready sidecar work stays off the critical path. Refs #72846. Thanks @RayWoo, @livekm0309, and @mrz1836.runtimeContextssurface instead of importing the full reply/routing/session channel runtime beforestartAccount, 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.openclaw statusoff 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.trustedProxy.allowLoopbacksupport 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.delivery.threadIdin 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.chokidaror similar root-chunk dependencies after update. Fixes #72882 and #72970; carries forward #72992. Thanks @shrimpy8, @colin-chang, and @Schnup03.openclaw messagechannels 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.models status --jsonstdout reserved for the JSON payload by routing auth-profile and startup diagnostics to stderr. Fixes #72962. Thanks @vishutdhar.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.updatedAtvalues at the merge boundary so clock-skewed messages cannot keep stale sessions alive forever. Fixes #72989. Thanks @martingarramon./newand/resetprompts from producing empty transcript text by inserting the hidden session marker when the visible tail is blank. (#72863) Thanks @mahopan.chat.historyfrom 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.tsserverdo not survive stop or restart. Fixes #72357. Thanks @ai-hpc and @bittoby.traceId,spanId,parentSpanId, andtraceFlagsfields in file-log JSONL records so traced requests and model calls are easier to correlate in log processors. Refs #40353. Thanks @liangruochong44-ui./api/showcapabilities 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.memory-coreslot during Gateway startup when permitted so active-memory recall can callmemory_searchandmemory_getwithout requiring an explicitplugins.slots.memoryentry, while preservingplugins.slots.memory: "none". Thanks @vincentkoc.gateway_startcron hooks from live Gateway runtime state before the legacy deps fallback, so memory-core dreaming cron reconciliation keeps working on installs wheredeps.cronis not populated during service startup. Fixes #72835. Thanks @RayWoo.plugins listentries. Thanks @vincentkoc.plugins updatewhen tracked plugin or hook updates error, keep bundled runtime-dependency repair behind restrictive allowlists, and reject package installs with unloadable extension entries. Thanks @vincentkoc.chat.sendretries with the same idempotency key on the documented in-flight path so aborts still target the real active run. Fixes #70139. Thanks @Feelw00.runtimeExtensions, and cache bundled runtime-dependency manifest reads during scans. Thanks @vincentkoc.tts.voice.preferAudioFileFormatchannel capability and a magic-byte sniff for the CAF container so the host-local-media validator (which usesfile-typeand didn't recognize CAF natively) can verify the pre-transcoded buffer. Channels that don't opt in are unaffected. (#72586) Fixes #72506. Thanks @omarshahine.Configuration
📅 Schedule: (in timezone America/Los_Angeles)
🚦 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.
This PR has been generated by Mend Renovate.
🟢 LOW — PR Risk Assessment
2 additions, 2 deletions across 1 files
Signals: routine changes
📁 Changed Nix Files
packages/openclaw-image/default.nixAssessed by Ash • 2026-05-17 01:04 UTC
d1c966a8d9to464e0f8070chore(deps): update ghcr.io/openclaw/openclaw docker tag to v2026.5.7to chore(deps): update ghcr.io/openclaw/openclaw docker tag to v2026.5.12View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.