2026.5.4
Highlights
- Plugins/file-transfer: add bundled file-transfer plugin with
file_fetch,dir_list,dir_fetch, andfile_writeagent tools for binary file ops on paired nodes; default-deny per-node path policy underplugins.entries.file-transfer.config.nodeswith operator approval, symlink traversal refused by default (opt-infollowSymlinks), and a 16 MB byte ceiling per round-trip. (#74742) Thanks @omarshahine. - Google Meet/Voice Call: make Twilio dial-in joins speak through the realtime Gemini voice bridge with paced audio streaming, backpressure-aware buffering, barge-in queue clearing, and no TwiML fallback during realtime speech, giving Meet participants a much snappier OpenClaw voice agent. (#77064) Thanks @scoootscooob.
Changes
- Control UI/header: show the active agent name in dashboard breadcrumbs without adding the current session key, keeping non-chat views oriented without crowding the topbar.
- Control UI/cron: make the New Job sidebar collapsible so the jobs list can reclaim space while keeping the form one click away. Thanks @BunsDev.
- Gateway/startup: keep model-catalog test helpers, run-session lookup code, QR pairing helpers, and TypeBox memory-tool schema construction out of hot startup import paths, reducing default gateway benchmark plugin-load and memory pressure.
- Control UI/performance: record browser long animation frame or long task entries in the debug event log when supported, making slow dashboard renders easier to attribute from the UI.
- Channels/streaming: add unified
streaming.mode: "progress"drafts with auto single-word status labels and shared progress configuration across Discord, Telegram, Matrix, Slack, and Microsoft Teams. - Slack/streaming: add
streaming.progress.render: "rich"for Block Kit progress drafts backed by structured progress line data. - Slack/streaming: keep the newest rich progress lines when Block Kit limits trim long progress drafts. Thanks @vincentkoc.
- Channels/streaming: cap progress-draft tool lines by default so edited progress boxes avoid jumpy reflow from long wrapped lines.
- Agents/verbose: use compact explain-mode tool summaries for
/verboseand progress drafts by default, withagents.defaults.toolProgressDetail: "raw"and per-agent overrides for debugging raw command/detail output. - Agents/commands: add
/steer <message>for queue-independent steering of the active current-session run without starting a new turn when the session is idle. (#76934) - Control UI/chat: add an agent-first filter to the chat session picker, keep chat controls/composer responsive across phone/tablet/desktop widths, keep desktop chat controls on one row, avoid duplicate avatar refreshes during initial chat load, and hide that row while scrolling down the transcript. Thanks @BunsDev.
- Control UI/chat: collapse consecutive duplicate text messages into one bubble with a count so no-op heartbeat acknowledgements stay compact without hiding nearby context.
- Agents/subagents: preserve every grouped child result when direct completion fallback has to bypass the requester-agent announce turn. Thanks @vincentkoc.
- TTS/telephony: honor provider voice/model overrides in telephony synthesis providers so Google Meet agent speech logs match the backend that actually produced the audio. Thanks @vincentkoc.
- Voice Call/realtime: bound the paced Twilio audio queue and close overloaded realtime streams before provider audio can pile up behind the websocket backpressure guard. Thanks @vincentkoc.
- Tools/BTW: add
/sideas a text and native slash-command alias for/btwside questions. - Doctor/config:
doctor --fixnow commits safe legacy migrations even when unrelated validation issues (e.g. a missing plugin) prevent full validation from passing, soagents.defaults.llmand other known-legacy keys are always cleaned up bydoctor --fixregardless of other config problems. Fixes #76798. (#76800) Thanks @hclsys. - Docs: clarify that IRC uses raw TCP/TLS sockets outside operator-managed forward proxy routing, so direct IRC egress should be explicitly approved before enabling IRC. Thanks @jesse-merhi.
- Agents/tools: skip optional media and PDF tool factories when the effective tool denylist already blocks them, avoiding unnecessary hot-path setup for tools that will be filtered out before model use. (#76773) Thanks @dorukardahan.
- Discord/status: let explicit reaction tool calls opt into tracking subsequent tool progress on the reacted message with
trackToolCalls: true, and use the shared tool display emoji table for status reactions. - Gateway/config: stop Gateway startup and hot reload from auto-restoring invalid config; invalid config now fails closed and
openclaw doctor --fixowns last-known-good repair. - Gateway/performance: lazy-load early runtime discovery and shutdown-hook helpers, defer maintenance timers until after readiness, and trim duplicate plugin auto-enable work during Gateway startup.
- Gateway/performance: defer non-readiness sidecars until after the ready signal, avoid hot-path channel plugin barrel imports, and fast-path trusted bundled plugin metadata during Gateway startup.
- Gateway/performance: avoid importing
jition native-loadable plugin startup paths, so compiled bundled plugin surfaces do not pay source-transform loader cost unless fallback loading is actually needed. - Plugins/loader: preserve real compiled plugin module evaluation errors on the native fast path instead of treating every thrown
.jsmodule as a source-transform fallback miss. Thanks @vincentkoc. - QA/Mantis: add a
pnpm openclaw qa mantis discord-smokerunner and manual GitHub workflow that verify the Mantis Discord bot can see the configured guild/channel, post a smoke message, add a reaction, and upload artifacts. - QA/Mantis: add
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. - QA/Mantis: pass the runtime env through desktop-browser Crabbox and artifact-copy child commands, so embedded Mantis callers can provide Crabbox credentials without mutating the parent process. Thanks @vincentkoc.
- QA/Mantis: return the copied Slack desktop screenshot path even when remote Slack QA fails, so the CLI still prints the failure screenshot artifact. Thanks @vincentkoc.
- QA/Mantis: accept Blacksmith Testbox
tbx_...lease ids from desktop smoke warmup, so provider overrides do not fail before inspect/run. Thanks @vincentkoc. - QA/Slack: add a Slack live transport QA runner with canary and mention-gating coverage for the private bot-to-bot harness. Thanks @vincentkoc.
- Gateway/performance: lazy-load the heavy cron runtime after the rest of Gateway startup, defer restart-sentinel refresh after readiness, and let the Gateway startup benchmark write per-run V8 CPU profiles with
--cpu-prof-dir. - Gateway/performance: keep raw channel-config schema parsing from discovering bundled plugin runtime metadata, and add
pnpm gateway:watch --benchmark-no-forcefor profiling startup without the default port cleanup. - Plugins/onboarding: let Manual setup install optional official plugins, including ClawHub-backed diagnostics with npm fallback, and expose the external Codex plugin as a selectable provider setup choice. Thanks @vincentkoc.
- Plugins/update: treat official externalized bundled npm migrations and ClawHub-to-npm fallbacks as trusted source-linked installs, so prerelease-only official plugin packages can migrate from bundled builds without being rejected as unsafe prerelease resolutions. Thanks @vincentkoc.
- Plugins/update: move ClawHub-preferred externalized plugin installs back to ClawHub after an earlier npm fallback once the ClawHub package becomes available. Thanks @vincentkoc.
- Plugins/update: clean stale bundled load paths for already-externalized pinned npm and ClawHub plugin installs, so release-channel sync does not leave removed bundled paths ahead of the installed external package. Thanks @vincentkoc.
- Plugins/CLI: include package dependency install state in
openclaw plugins list --jsonso scripts can spot missing plugin dependencies without runtime-loading plugins. - Telegram: accept plugin-owned numeric forum-topic targets in the agent message tool and keep reply-dispatch provider chunks behind a real stable runtime alias during in-place package updates. Fixes #77137. Thanks @richardmqq.
- Google Meet: preserve
realtime.introMessage: ""so realtime Chrome joins can stay silent instead of restoring the default spoken intro. Thanks @vincentkoc. - Discord/status: add degraded Discord transport and gateway event-loop starvation signals to
openclaw channels status,openclaw status --deep, and fetch-timeout logs so intermittent socket resets do not look like a healthy running channel. (#76327) Thanks @joshavant. - Providers/OpenRouter: add opt-in response caching params that send OpenRouter's
X-OpenRouter-Cache,X-OpenRouter-Cache-TTL, and cache-clear headers only on verified OpenRouter routes. Thanks @vincentkoc. - Providers/OpenRouter: expand app-attribution categories so OpenClaw advertises coding, programming, writing, chat, and personal-agent usage on verified OpenRouter routes. Thanks @vincentkoc.
- Plugins/update: on the beta OpenClaw update channel, default-line npm and ClawHub plugin updates try
@betafirst and fall back to default/latest when no plugin beta release exists. - Channels/WhatsApp: support explicit WhatsApp Channel/Newsletter
@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. - Exec approvals: add a tree-sitter-backed shell command explainer for future approval and command-review surfaces. (#75004) Thanks @jesse-merhi.
- Agents/sandbox: store sandbox container and browser registry entries as per-runtime shard files, reducing unrelated session lock contention while
openclaw doctor --fixmigrates legacy monolithic registry files. (#74831) Thanks @luckylhb90. - Plugins/ClawHub: annotate 429 errors from ClawHub with the reset window from
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. - Plugins/runtime state: add
registerIfAbsentfor atomic keyed-store dedupe claims that return whether a plugin successfully claimed a key without overwriting an existing live value. Thanks @amknight.
Fixes
-
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.
-
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. -
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. -
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/security: stop the install scanner from blocking official bundled plugin packages when
process.envaccess and normal API sends only appear in distant parts of the same compiled bundle. -
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. -
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/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. -
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. -
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. -
Channels/WhatsApp: allow
@whiskeysockets/libsignal-nodeinonlyBuiltDependenciesso pnpm v9+blockExoticSubdepsno longer rejects the baileys git-tarball subdep and silences all inbound agent replies. Fixes #76539. Thanks @ottodeng and @vincentkoc. -
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.
-
Gateway/systemd: preserve operator-added secrets in the Gateway env file across re-stage while clearing OpenClaw-managed keys (such as
OPENCLAW_GATEWAY_TOKEN) so a fresh staging value is never shadowed by a stale env-file copy; operator secrets are also retained when the state-dir.envis empty. Fixes #76860. Thanks @hclsys. -
Plugin updates: do not short-circuit trusted official npm updates as unchanged when the default/latest spec still resolves to an already-installed prerelease that the installer should replace with a stable fallback. Thanks @vincentkoc.
-
Plugin 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. -
QA/cache: require the full
CACHE-OK <suffix>marker before live cache probes stop retrying, so suffix-only prose cannot hide a broken probe response. Thanks @vincentkoc. -
Slack/Matrix: avoid creating blank progress-draft messages when
streaming.progress.label=falseand progress tool lines are disabled. 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. -
QA/Matrix: keep the mock OpenAI tool-progress provider aligned with exact-marker Matrix prompts so the hardened live preview scenario still forces a deterministic read before final delivery. Thanks @vincentkoc.
-
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.
-
OpenAI/Google Meet: wait for realtime voice
session.updatedbefore treating the bridge as connected, so Meet joins do not return with audio queued behind an unconfigured realtime session. Thanks @vincentkoc. -
Plugins/catalog: merge official external catalog descriptors into partial package channel config metadata, so lagging WeCom/Yuanbao manifests keep their own schema while still exposing host-supplied labels and setup text. Thanks @vincentkoc.
-
Plugins/catalog: supplement lagging official external WeCom and Yuanbao npm manifests with channel config descriptors and declared tool contracts from the OpenClaw catalog, so trusted package sweeps no longer fail because external package metadata trails the host contract. Thanks @vincentkoc.
-
Plugins/install: let trusted official
@openclaw/*catalog installs recover when npmlatestpoints at a prerelease by falling back to the newest stable version, or by selecting the newest exact prerelease for prerelease-only launch packages with a warning instead of making beta/development plugin sweeps fail at install time. Thanks @vincentkoc. -
Google Meet: grant Chrome media permissions against the actual Meet tab, start the local realtime audio bridge only after Meet joins, expose realtime transcripts in status/logs, and force explicit audio responses with current OpenAI realtime output-audio events so BlackHole capture does not keep the OpenClaw participant muted or silent.
-
Memory/LanceDB: declare
apache-arrowin the bundled memory plugin package so LanceDB installs include its runtime peer. Fixes #76910. Thanks @afiqfiles-max. -
CLI/devices: retry explicit device-pair approval with
operator.adminafter a pairing-scope ownership denial, so existing admin-capable paired-device tokens can recover new Control UI/browser pairing after upgrades instead of requiring manual JSON edits. Fixes #76956. Thanks @neo19482. -
Google Meet: use the local call-control microphone button instead of disabled remote participant mute buttons, and block realtime speech when the OpenClaw Meet microphone remains muted.
-
Google Meet: refresh realtime browser state during status and retry delayed speech after Meet finishes joining, so a just-opened in-call tab no longer leaves speech stuck behind stale
not-in-callhealth. -
Plugins/install: recover the install ledger from the managed npm root when
plugins/installs.jsonis empty or partial, so reinstalling Discord and Codex no longer makes the other installed plugin disappear. -
Google Meet: grant Meet media permissions through the Playwright browser context when CDP grants do not affect the attached Chrome page, and report in-call microphone/speaker permission problems instead of marking realtime speech ready.
-
Google Meet: keep Chrome realtime transport tests hermetic on Linux prerelease shards while preserving the macOS-only runtime guard. Thanks @vincentkoc.
-
QA/Slack: fail the live mention-gating scenario on any unexpected SUT reply, even when the reply does not echo the expected marker. Thanks @vincentkoc.
-
QA/Matrix: steer the live tool-progress preview check away from
HEARTBEAT.mdand report final preview candidates when the live marker reply misses the exact token. 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.
-
Tlon: expose
groupInviteAllowlistin the channel config schema and clarify that group invite auto-accept fails closed without an invite allowlist. 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.
-
Control UI/WebChat: collapse duplicate in-flight internal text sends onto the active Gateway run so rapid repeat submits do not start fresh
agent:main:maindispatches. Fixes #75737. Thanks @dsdsddd1 and @BunsDev. -
Mattermost: accept the documented
channels.mattermost.streamingconfig and honorstreaming: "off"by disabling draft preview posts. Thanks @vincentkoc. -
Mattermost: expose streaming progress config labels and help text in generated channel config metadata so Control UI/docs can explain the new
channels.mattermost.streaming.progress.*fields. Thanks @vincentkoc. -
Mattermost: honor
channels.mattermost.streaming.progress.toolProgress=falsein progress draft mode so compact tool status lines stay hidden until final delivery. Thanks @vincentkoc. -
Microsoft Teams: honor progress draft tool lines in native Teams progress streams and suppress standalone tool messages when
channels.msteams.streaming.progress.toolProgress=false. Thanks @vincentkoc. -
Discord: keep progress draft boundary callbacks bound during streaming replies, so extension lint stays green while progress previews transition between assistant and reasoning blocks. Thanks @vincentkoc.
-
Discord: resolve SecretRef-backed bot tokens from the active runtime snapshot for named accounts and keep unresolved configured tokens from crashing status or health checks. (#76987) Thanks @joshavant.
-
Channels/streaming: expose
streaming.progress.label,labels,maxLines, andtoolProgressin bundled channel config metadata so progress draft settings appear in config, docs, and control surfaces. Thanks @vincentkoc. -
Channels/streaming: normalize whitespace and case for
streaming.progress.label: "auto"so progress draft labels keep using the built-in label pool instead of rendering a literalautotitle. Thanks @vincentkoc. -
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. -
Cron/status: render explicit
delivery.mode: "none"jobs as no-delivery previews and label cron session history distinctly instead of showing fallback delivery or direct-session rows. Fixes #76945. -
Gateway/usage: serve
usage.costandsessions.usagefrom a durable transcript aggregate cache with lock-safe background refreshes and localized stale-cache status, so large usage views avoid repeated full scans. (#76650) Thanks @Marvinthebored. -
Plugins/hooks: let
plugins.entries.<id>.hooks.timeoutMsandplugins.entries.<id>.hooks.timeoutsbound plugin typed hooks from operator config, so slow hooks can be tuned without patching installed plugin code. Fixes #76778. Thanks @vincentkoc. -
Telegram: add
channels.telegram.mediaGroupFlushMsat the top level and per account so operators can tune album buffering instead of being stuck with the hard-coded 500ms media-group flush window. Fixes #76149. Thanks @vincentkoc. -
Config/messages: coerce boolean
messages.visibleRepliesandmessages.groupChat.visibleRepliesvalues to the documented enum modes so an intuitive toggle no longer invalidates config and drops channel startup. Fixes #75390. Thanks @scottgl9. -
Agents/network: allow trusted web-search providers and configured model-provider hosts to work behind Surge/Clash/sing-box fake-IP DNS by accepting RFC 2544 and IPv6 ULA synthetic answers only for the request's scoped hostname, without broad private-network access. Refs #76530 and #76549. Thanks @zqchris.
-
Providers: honor env-proxy settings for guarded provider model fetches when no explicit dispatcher policy is configured, preserving explicit transport overrides. Fixes #70453. (#72480) Thanks @mjamiv.
-
Web fetch: add a default-off
tools.web.fetch.useTrustedEnvProxyopt-in for proxy-only environments soweb_fetchcan let an operator-controlled HTTP(S) proxy resolve DNS while preserving default strict DNS pinning and hostname policy checks. Refs #58034 and #62560. Thanks @cosmicnet and @mjamiv. -
Feishu: accept and honor
channels.feishu.blockStreamingat the top level and per account, while keeping the legacy default off so Feishu cards no longer reject documented config or silently drop block replies. Fixes #75555. Thanks @vincentkoc. -
Gateway/update: avoid
launchctl kickstart -kimmediately after fresh macOS update bootstraps, and unlink dangling global plugin-runtime symlinks during packaged postinstall anddoctor --fixso upgrades no longer SIGTERM the newly booted Gateway or leave bundled plugin imports pointed at prunedplugin-runtime-depstrees. Completes #76261 and fixes #76466. (#76929) -
Google Chat: normalize custom Google auth transport headers before google-auth/gaxios interceptors run, restoring webhook token verification when certificate retrieval expects Fetch
Headers. Fixes #76742. Thanks @donbowman. -
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. -
Doctor/plugins: reset stale
plugins.slots.memoryandplugins.slots.contextEnginereferences duringdoctor --fix, so cleanup of missing plugin config does not leave unrecoverable slot owners behind. Fixes #76550 and #76551. Thanks @vincentkoc. -
Docs/WhatsApp: merge the duplicate top-level
webobjects in the gateway channel config example so copy-pasted WhatsApp config keeps bothweb.whatsappand reconnect settings. Fixes #76619. Thanks @WadydX. -
Plugins/Anthropic: expose Claude thinking profiles from the bundled provider-policy artifact so non-runtime callers keep Opus 4.7
adaptive,xhigh, andmaxinstead of downgrading tohigh. Fixes #76779. Thanks @tomascupr and @iAbhi001. -
Plugins/tools: honor
tools.alsoAllowas an optional plugin tool discovery hint without treating its internal allow-all default as permission to load every manifest-marked optional plugin tool. Fixes #76616. -
Discord/native commands: skip slash-command registration and cleanup REST calls when
channels.discord.commands.native=false, letting low-power gateways start without waiting on disabled native-command lifecycle requests. Fixes #76202. Thanks @vincentkoc. -
CLI/plugins: reject unowned command roots such as
openclaw foobefore managed proxy startup and full plugin CLI runtime loading while preserving manifest-owned and CLI-metadata-owned plugin commands. Fixes #75287. Thanks @neilofneils404. -
CLI/message: skip local configured-channel plugin preload for explicit gateway-owned message actions, letting normalized CLI delivery delegate to the gateway without initializing channel runtime in the short-lived CLI process. Fixes #75477.
-
Plugins/commands: normalize empty plugin command handler results and let Telegram native plugin commands send the empty-response fallback instead of throwing when a handler returns
undefined. Fixes #74800. Thanks @vincentkoc. -
Plugins/tools: cold-load selected plugin tool registries when the active registry only has partial tool coverage, so wildcard-expanded allowlists no longer hide installed plugin tools from
tools.effective. Fixes #76780. Thanks @lilesjtu. -
Plugins/tools: compare cached and runtime plugin tool name conflicts with normalized core tool names, so case variants of core tools are blocked instead of leaking duplicate tool registrations. Thanks @vincentkoc.
-
Plugins/OpenRouter: advertise DeepSeek V4 thinking levels, including
xhighandmax, through the runtime and lightweight provider policy surfaces so/thinkvalidation no longer rejects OpenRouter-routed DeepSeek V4 models. Fixes #74788. Thanks @vincentkoc. -
Status/sessions: ignore malformed non-string persisted session provider/model metadata instead of throwing while rendering status summaries. Fixes #76206. Thanks @vincentkoc.
-
CLI/config: remove only the targeted array element for
openclaw config unset array[index]instead of replaying the unset during config write and deleting the shifted next element. Fixes #76290. Thanks @SymbolStar and @vincentkoc. -
Plugins/voice-call: treat abnormal local Gateway close code 1006 as a standalone CLI fallback case, so
voicecall smokeand related commands can still run the provider check path when the Gateway socket closes before returning a response. -
Agents/tools: stop treating
tools.deny: ["write"]as an implicitapply_patchdeny; operators who want to block patch writes should denyapply_patchorgroup:fsexplicitly. Fixes #76749. (#76795) Thanks @Nek-12 and @hclsys. -
Plugins/release: verify published plugin npm tarballs expose compiled runtime entries after publish, catching TS-only package artifacts before release closeout. Thanks @vincentkoc.
-
CLI/message: exit cleanly with a nonzero status when message-command plugin registry loading fails before dispatch, preventing
openclaw-messagechildren from staying alive after plugin load errors. Fixes #76168. -
Plugins/config: report configured plugins that are present but blocked by path-safety checks as blocked instead of stale
plugin not foundentries, and deduplicate repeated blocked-candidate warnings during discovery. Fixes #76144. Thanks @mayank6136. -
Gateway/update: recover an installed-but-unloaded macOS LaunchAgent after package updates, rerun Gateway health/version/channel readiness checks, and print restart, reinstall, and rollback guidance before reporting update failure. (#76790) Thanks @jonathanlindsay.
-
CLI/plugins: explain when a missing plugin command alias belongs to a bundled plugin that is disabled by default, including the
openclaw plugins enable <plugin>repair command. (#76835) -
Gateway/Bonjour: auto-start LAN multicast discovery only on macOS hosts while preserving explicit
openclaw plugins enable bonjourstartup elsewhere, so Linux servers and containers that do not need LAN discovery avoid default mDNS probing and watchdog churn. Refs #74209. -
Gateway/macOS: stop
doctorand LaunchAgent recovery from runninglaunchctl kickstart -kafter a fresh bootstrap, avoiding an immediate SIGTERM of the just-started gateway while still nudging already-loaded launchd jobs. Fixes #76261. Thanks @solosage1. -
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. -
Google Meet: route stateful CLI session commands through the gateway-owned runtime so joined realtime sessions survive after the starting CLI process exits. Fixes #76344. Thanks @coltonharris-wq.
-
Memory/status: split builtin sqlite-vec store readiness from embedding-provider readiness in
memory status --deepandopenclaw status, so local vector-store failures no longer look like provider failures and provider failures no longer hide a healthy local vector store. -
CLI/doctor: trust a ready gateway memory probe when CLI-side active memory backend resolution is unavailable, preventing false "No active memory plugin is registered" warnings for healthy runtime setups. Fixes #76792. Thanks @som-686.
-
Memory/status: keep plain
openclaw memory statusandopenclaw memory status --jsonon the cheap read-only path by reserving vector and embedding provider probes for--deepor--index. Fixes #76769. Thanks @daruire. -
Telegram: suppress stale same-session replies when a newer accepted message arrives before an older in-flight Telegram dispatch finalizes. Fixes #76642. Thanks @chinar-amrutkar.
-
Gateway/diagnostics: throttle repeated long-running active-work session warnings so healthy cron or subagent runs no longer print the same
recovery=noneline every heartbeat. -
Gateway/diagnostics: keep non-blocking active-work and transient event-loop max-spike liveness diagnostics out of the default gateway console while preserving structured diagnostic events and warnings for queued, stalled, and recovery-eligible work.
-
Slack: collapse routine Socket Mode pong-timeout reconnects into one OpenClaw reconnect line and suppress the duplicate Slack SDK pong warning.
-
Gateway/diagnostics: abort-drain embedded runs after an extended no-progress stall so a single dead session no longer leaves queued Discord/channel turns blocked behind repeated
recovery=noneliveness warnings. -
Plugins/ClawHub: accept the live artifact resolver
kind/sha256field names alongside the typedartifactKind/artifactSha256form soclawhub:installs of npm-pack and legacy ZIP packages no longer miss downloadable artifacts. Thanks @RomneyDa. -
Control UI/Sessions: avoid full
sessions.listreloads for chat-turnsessions.changedpayloads, so large session stores no longer add multi-second delays while chat responses are being delivered. (#76676) Thanks @VACInc. -
Gateway/watch: run
doctor --fix --non-interactiveonce and retry when the dev Gateway child exits during startup, so stale local plugin install/config state does not leave the tmux watch session disappearing without a repair attempt. -
Doctor/Telegram: warn when selected Telegram quote replies can suppress
streaming.preview.toolProgress, and document thereplyToModetrade-off without changing runtime delivery. Fixes #73487. Thanks @GodsBoy. -
Channels/Discord: send a best-effort native typing cue immediately after an inbound DM is accepted, so slow pre-dispatch turns show Discord liveness before queueing, context assembly, model, or tool work starts. Fixes #76417. Thanks @mlopez14.
-
Plugins/install: reject source-only TypeScript package installs and installed plugin packages that are missing compiled runtime output, so broken npm artifacts fail at install/discovery time instead of falling through jiti and surfacing later as unavailable providers. Fixes #76720.
-
Plugins/config: deduplicate identical manifest compatibility diagnostics when an explicitly configured plugin overrides another discovered candidate, so external channel plugins do not print the same missing
channelConfigswarning repeatedly during install and enable. Thanks @vincentkoc. -
Discord/status: honor explicit
messages.statusReactions.enabled: truein tool-only guild channels so queued ack reactions can progress through thinking/done lifecycle reactions instead of stopping at the initial emoji. Thanks @Marvinthebored. -
Discord/native commands: compare Discord-normalized slash-command descriptions and localized descriptions during reconcile so CJK or multiline command text no longer triggers redundant startup PATCH bursts and rate-limit 429s. Fixes #76587. Thanks @zhengsx.
-
Agents/OpenAI: omit Chat Completions
reasoning_effortforgpt-5.4-minionly when function tools are present while preserving tool-free Chat and Responses reasoning support, preventing Telegram-routed fallback runs from hanging after OpenAI rejects tool payloads. Fixes #76176. Thanks @ThisIsAdilah and @chinar-amrutkar. -
Telegram: reuse the successful startup
getMeprobe for grammY polling startup and continue intogetUpdatesafter recoverabledeleteWebhookcleanup failures, reducing high-latency Bot API control-plane calls before long polling starts. Refs #76388. Thanks @jackiedepp. -
Gateway/diagnostics: merge session id/key aliases in diagnostic session state and activity tracking so completed runs no longer leave stale queued work behind that keeps liveness samples at warning level.
-
Agents/models: forward model
maxTokensas the default output-token limit for OpenAI-compatible Responses and Completions transports when no runtime override is provided, preventing provider defaults from silently truncating larger outputs. (#76645) Thanks @joeyfrasier. -
macOS CLI/onboarding: honor sensitive wizard text steps in
openclaw-mac wizardwith termios no-echo input, suppressing saved credential previews while preserving long API keys and gateway tokens. Fixes #76698. Thanks @anurag-bg-neu and @sallyom. -
Control UI/Skills: fix skill detail modal silently failing to open in all browsers by deferring
showModal()until the dialog element is connected to the DOM; the Litrefcallback fired before connection causing aDOMException: HTMLDialogElement.showModal: Dialog element is not connectedon every skill click. Thanks @nickmopen. -
Gateway/update: run
doctor --non-interactive --fixafter Control UI global package updates before reporting success, so legacy config is migrated before the gateway restart. Thanks @stevenchouai. -
Gateway/cron: stop a lazy cron startup that loses a hot-reload race, preventing the old cron service from starting after reload has already replaced cron state.
-
CLI/plugins: warn when npm plugin installs remain shadowed by a failing config-selected source and surface the repair path in
plugins doctor. Thanks @LindalyX-Lee. -
Agents/Telegram: preserve explicit reply and quote context in embedded model prompts without letting quoted text drive prompt-local image loading. Fixes #76419. (#76659) Thanks @cheechnd.
-
Active Memory: apply
setupGraceTimeoutMsto the embedded recall runner as well as the outer prompt-build watchdog, so very-cold first recalls keep the configured setup grace end-to-end. (#74480) Thanks @volcano303. -
Channels/Feishu: cap how long the per-chat sequential queue blocks subsequent same-key tasks behind a single in-flight task (5 min default), so a single hung dispatch no longer leaves later same-chat messages in
queuedstate until gateway restart; the stuck task continues running but is evicted from the blocking chain and a warning is logged. Fixes #70133. (#76687) Thanks @martingarramon and @bek91. -
Active Memory: skip scoped Telegram forum-topic conversation ids (containing
:) when resolving the embedded recall run channel, falling back tomessageProviderinstead, so Active Memory no longer throws a bundled-plugin dirName validation error in forum-topic sessions. Fixes #76704. -
Agents/tools: defer automatic PDF model/auth resolution until the PDF tool is used, keeping agent-turn tool prep from probing auth profiles on messages without PDFs while preserving explicit PDF model registration. Fixes #76644. Thanks @hclsys.
-
CLI/config: keep JSON dry-run patches validating touched channel configuration against bundled channel schemas even when the patch only contains SecretRef objects.
-
Plugins/tools: keep disabled bundled tool plugins out of explicit runtime allowlist ownership and fall back from loaded-but-empty channel registries to tool-bearing plugin registries, so Active Memory can use bundled
memory-coresearch/get tools even whenmemory-lancedbis disabled. Fixes #76603. Thanks @jwong-art. -
Plugins/install: run
npm installfrom the managed npm-root manifest so installing one@openclaw/*plugin preserves already installed sibling plugins instead of pruning them. Fixes #76571. (#76602) Thanks @byungskers and @crpol. -
Plugins/context-engine: include the selected
plugins.slots.contextEngineplugin in the gateway startup load plan so external context-engine plugins withoutactivation.onStartupin their manifest are loaded before any agent turn resolves the active engine; prevents the "Context engine X is not registered; falling back to default engine legacy" warning after gateway startup. Fixes #76576. Thanks @hclsys. -
Plugins/tools: restore on-demand registry load for path-based plugins (origin "config") so tool factories registered via
plugins.load.pathsare resolved at agent request time when no pre-warmed channel registry is present; prevents "unknown method" errors after gateway startup. Fixes #76598. Thanks @hclsys. -
Plugins/hooks: include explicitly enabled hook-capable plugins in the Gateway startup runtime scope so embedded PI runs can see their
before_prompt_buildandagent_endhooks. Fixes #76649. Thanks @wwf3045 and @MkDev11. -
Plugins/OpenCode: expose Claude thinking profiles through the lightweight provider policy surface so directive and session validation keep
xhigh,adaptive, andmaxforopencode/claude-opus-4-7instead of remappingxhightohigh. Fixes #76648. Thanks @aaajiao. -
Channels/QQ Bot: resolve structured
clientSecretSecretRefs before QQ token exchange, expose the QQ Bot secret contract to secrets tooling, and reject legacysecretref:/...marker strings. (#74772) Thanks @xialonglee. -
Agents: keep active streamed provider replies alive by refreshing guarded fetch timeouts on raw body chunks and surface true prompt stream timeouts as explicit errors instead of partial assistant fragments. Fixes #76307. (#76633) Thanks @MkDev11.
-
Plugins/externalization: keep official ACPX, Google Chat, and LINE install specs on production package names, leaving beta-tag probing to the explicit OpenClaw beta update channel. Thanks @vincentkoc.
-
CLI/doctor: keep missing-plugin repair from overriding official catalog metadata with runtime fallbacks, so ACPX repairs preserve the official npm spec during the externalization rollout. Thanks @vincentkoc.
-
CLI/doctor: match stale bundled-plugin install records by exact parsed package name so doctor does not remove external npm or ClawHub records that only share an OpenClaw package-name prefix.
-
Plugins/catalog: preserve ClawHub install specs when generating the packaged channel catalog so future storepack-first channel plugins keep their remote source instead of becoming npm-only. Thanks @vincentkoc.
-
Plugins/catalog: pin bare npm specs from prerelease external channel catalog entries to the catalog entry version, so beta catalogs do not silently install the latest stable package.
-
Plugins/update: treat catalog-matched official npm updates and OpenClaw-authored externalized-bundled npm bridges as trusted official installs so launch-code plugins can update or migrate out of the bundled tree without scanner false positives. Thanks @vincentkoc.
-
Plugins/onboarding: fall back from ClawHub to npm only for missing package/version errors, keeping integrity and verification failures fail-closed during storepack rollout. Thanks @vincentkoc.
-
CLI/onboarding: mask credential inputs (model-auth provider API keys, gateway tokens and passwords, web-search provider keys, and skill env-var values) in the interactive
openclaw onboardwizard so pasted secrets no longer echo into terminal scrollback,Start-Transcriptlogs, or screenshots; existing tokens/passwords are preserved through a masked-preview confirm step before the sensitive prompt. Thanks @anurag-bg-neu. -
Control UI/Talk: fix Talk (OpenAI Realtime WebRTC) CORS failure by stripping server-side-only attribution headers (
originator,version,User-Agent) from browser offer headers;api.openai.com/v1/realtime/callsonly allowsauthorizationandcontent-typein its CORS preflight, so forwarding these headers caused the browser SDP exchange to fail. Fixes #76435. Thanks @hclsys. -
Chat delivery: make
/verbose on|full|offchanges affect subsequent tool-use chat bubbles again, including channels with draft preview tool progress enabled, while preserving one-shot verbose directives. -
CLI/logs: auto-reconnect
openclaw logs --followon transient gateway disconnects (WebSocket close, timeout, connection drop) with bounded exponential backoff (up to 8 retries, capped at 30 s) and stderr retry warnings, while still exiting immediately on non-recoverable auth or configuration errors. Fixes #74782. (#75059) Thanks @shashank-poola. -
CLI/logs: announce
--followrecovery with a[logs] gateway reconnectednotice once a poll succeeds after a transient outage, and emit JSONnoticerecords in--jsonmode for both the retry warning and the reconnect transition, so live monitoring scripts can react to the recovery. Carries forward #75059. (#75372) Thanks @RomneyDa. -
Codex/WhatsApp: keep the
messagedynamic tool available when Codex source replies are configured for message-tool delivery, so coding-profile chat agents do not complete turns privately without a visible channel reply. Fixes #76660. (#76663) Thanks @VishalJ99. -
Codex/heartbeat: send heartbeat-specific initiative guidance through Codex turn-scoped collaboration-mode instructions, keeping ordinary message-tool chat turns in Default mode without heartbeat prompt leakage. Thanks @pashpashpash.
-
Plugins/onboarding: trust optional official plugin and web-search installs selected from the official catalog so npm security scanning treats them like other source-linked official install paths. Thanks @vincentkoc.
-
Agents/web_search: keep installed runtime provider discovery enabled when web-search metadata is missing, so externally installed official providers such as Brave remain visible to agent and cron turns instead of falling back to bundled-only lookup. Fixes #76626. Thanks @amknight.
-
Tests/plugins: expose the Discord npm onboarding Docker lane as a package script and assert planned Docker lanes point at real scripts, so external-channel onboarding coverage can actually run. Thanks @vincentkoc.
-
Plugins/ClawHub: explain unreleased ClawHub plugin artifacts as a rollout-state fallback to
npm:installs instead of leaking raw archive metadata fields. Thanks @vincentkoc. -
Tests/onboarding: assert packaged channel onboarding leaves
openclaw channels status --jsonand plainopenclaw statusshowing the configured channel, covering the empty Channels table regression path. Thanks @vincentkoc. -
Microsoft Teams: persist sent-message markers across Gateway restarts so follow-up replies to recent bot messages keep resolving the original conversation instead of dropping out after restart, with marker TTLs preserved on best-effort recovery. (#75585) Thanks @amknight.
-
Matrix: persist pending approval reaction targets across Gateway restarts so room approvers can still approve or deny outstanding prompts after OpenClaw comes back online. (#75586) Thanks @amknight.
-
Channels/onboarding: map third-party official WeCom and Yuanbao catalog entries to their published plugin ids so npm installs pass expected-plugin validation. Thanks @vincentkoc.
-
Plugin SDK: restore the Mattermost and Matrix compatibility subpaths used by the pinned Yuanbao channel package so external installs can module-load after npm install. Thanks @vincentkoc.
-
Plugins/install: keep managed npm-root security scans from treating earlier plugin
openclawpeer links as failures, so one external plugin install cannot poison later official npm installs. Thanks @vincentkoc. -
Memory LanceDB: allow installed-but-unconfigured plugin metadata to load so onboarding and setup flows can prompt for embedding config instead of failing the plugin registry first. Thanks @vincentkoc.
-
CLI/plugins: keep
plugins enableandplugins disablefrom creating unconfigured channel config sections, so channel plugins with required setup fields no longer fail validation during lifecycle probes. Thanks @vincentkoc. -
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.
-
Doctor/config: set
messages.groupChat.visibleReplies: "message_tool"during compatibility repair for configured-channel configs that omit a visible-reply policy, so upgrades can persist the intended tool-only group/channel reply default. Thanks @kagura-agent. -
Agents/sessions: keep delayed
sessions_sendA2A replies alive after soft wait-window timeouts, while preserving terminal run timeouts and avoiding stale target replies in requester sessions. Fixes #76443. Thanks @ryswork1993 and @vincentkoc. -
TUI/Control UI: fix
/thinkcommand showing only base thinking levels when the active session uses a different model from the default, so provider-specific levels like DeepSeek V4 Pro'sxhighandmaxare now visible and selectable. Fixes #76482. Thanks @amknight. -
CLI/sessions: keep intentional empty agent replies silent after tool-delivered channel output, instead of surfacing a misleading "No reply from agent." fallback. Thanks @vincentkoc.
-
Config/doctor: cap
.clobbered.*forensic snapshots per config path and serialize snapshot writes so repeateddoctor --fixrecovery loops cannot flood the config directory. Fixes #76454; carries forward #65649. Thanks @JUSTICEESSIELP, @rsnow, and @vincentkoc. -
Feishu: suppress duplicate text when replies send native voice media while preserving captions for ordinary audio files and falling back to text plus attachment links when voice uploads fail.
-
Feishu: send the skipped reply text when
audioAsVoicefalls back to a generic file attachment after transcode failure, so voice-intent replies do not lose their caption. -
TTS/plugins: activate the configured speech provider plugin during Gateway startup, so Microsoft and Local CLI voice replies work immediately after selecting them instead of staying invisible in the startup plugin set. Fixes #76481. Thanks @amknight.
-
TTS/plugins: include speech providers selected through inherited agent, channel, and account TTS personas during Gateway startup, matching the runtime TTS config merge. Carries forward #76481. Thanks @amknight.
-
Feishu: keep packaged Feishu startup from bundling the Lark SDK's ESM
__dirnamepath by loading the SDK as a plugin-local runtime dependency. Fixes #76291 and #76494. (#76392) Thanks @zqchris. -
Plugins/npm: build package-local runtime dist files for publishable plugins and stop listing root-package-excluded plugin sidecars in the core package metadata, so npm plugin installs such as
@openclaw/diffsand@openclaw/discordno longer publish source-only runtime payloads. Fixes #76426. Thanks @PrinceOfEgypt. -
Channels/secrets: resolve SecretRef-backed channel credentials through external plugin secret contracts after the plugin split, covering runtime startup, target discovery, webhook auth, disabled-account enumeration, and late-bound web_search config. Fixes #76371. (#76449) Thanks @joshavant and @neeravmakwana.
-
Docker/Gateway: pass Docker setup
.envvalues into gateway and CLI containers and preserve exec SecretRefpassEnvkeys in managed service plans, so 1Password Connect-backed Discord tokens keep resolving after doctor or plugin repair. Thanks @vincentkoc. -
Control UI/WebChat: explain compaction boundaries in chat history and link directly to session checkpoint controls so pre-compaction turns no longer look silently lost after refresh. Fixes #76415. Thanks @BunsDev.
-
Agents/compaction: add an optional bundled compaction notifier hook and retry once from the compacted transcript when automatic compaction leaves a turn without a final visible reply. (#76651) Thanks @simplyclever914.
-
Agents/incomplete-turn: detect and surface a warning when the agent's final text after a tool-call chain is silently dropped because the post-tool assistant response was never produced, instead of completing the turn with only the pre-tool analysis text. Fixes #76477. Thanks @amknight.
-
Channels/WhatsApp: attach native outbound mention metadata for group text and media captions by resolving
@+<digits>and@<digits>tokens against WhatsApp participant data, including LID groups. Fixes #39879; carries forward #56863. Thanks @kengi1437, @joe2643, and @fridayck. -
Channels/WhatsApp: require outbound mention tokens to end at a word boundary so phone-number prefixes inside longer strings no longer trigger hidden native mentions.
-
Plugins/uninstall: remove empty managed git install parent directories after deleting cloned plugin repos and cover npm/git uninstall residue in Docker plugin lifecycle tests. Thanks @vincentkoc.
-
Plugins/install: resolve bare official external plugin IDs such as
bravethrough the official catalog when no bundled source is available, so packaged installs fetch the intended scoped npm package instead of an unrelated unscoped package. Fixes #76373. Thanks @bek91 and @vincentkoc. -
Plugins/install: require OpenClaw-owned install provenance before granting official npm plugin scanner trust, so direct npm package names no longer bypass launch-code scanning while catalog, onboarding, and doctor installs stay trusted. Thanks @fede-kamel and @vincentkoc.
-
Network proxy: preserve target TLS hostname validation for Node HTTPS requests routed through the managed HTTP proxy, so Discord-style CONNECT traffic no longer validates certificates against the local proxy host. Fixes #74809. (#76442) Thanks @jesse-merhi and @abnershang.
-
Gateway/sessions: keep async
sessions.listtitle and preview hydration bounded to transcript head/tail reads so Control UI polling cannot full-scan large session transcripts every refresh. Thanks @vincentkoc. -
Gateway/sessions: cache manifest model-id normalization and bundled setup CLI fallback metadata against the active plugin metadata snapshot, so Control UI
sessions.listpolling avoids repeated plugin manifest scans while still refreshing after plugin reloads. Thanks @rolandrscheel. -
Gateway/performance: cache per-run verbose-level session reads, skip a redundant
lsofscan ingateway --forcewhen no listener was killed, and make the Gateway startup benchmark print usage for--help. -
Gateway/sessions: keep agent runtime metadata on lightweight
sessions.listrows so model-only session patches do not make Control UI lose runtime identity. Thanks @vincentkoc. -
Gateway/sessions: keep bulk
sessions.listrows lightweight by skipping per-row transcript usage fallback, display model inference, and plugin projection, avoiding event-loop stalls in large session stores. Thanks @Marvinthebored and @vincentkoc. -
Gateway/models: keep read-only
models.listfallbacks on persisted/current metadata and configured rows while using static auth checks, so missingmodels.jsonfiles no longer runtime-load provider discovery or stall gateway after restart. Fixes #76382; refs #76360 and #75707. Thanks @trojy13, @RayWoo, @AnathemaOfficial, and @vincentkoc. -
Gateway/models: keep agent image attachment capability checks on the full catalog while preserving the read-only
models.listpath, so image sends are not rejected after static catalog fallback. -
CLI/plugins: reject missing plugin ids before config writes in
plugins enableandplugins disableso a typo no longer persists a stale config entry. (#73554) Thanks @ai-hpc. -
Agents/sessions: preserve delivered trailing assistant replies during session-file repair so Telegram/WebChat history is not rewritten to drop already-delivered responses. Fixes #76329. Thanks @obviyus.
-
Gateway/chat history: preserve oversized transcript turns as explicit omitted-message placeholders while avoiding large JSONL parse stalls. Thanks @Marvinthebored and @vincentkoc.
-
Gateway/models: keep read-only model-list responses on registry-compatible fallbacks and metadata defaults, so empty or minimal persisted model files do not hide built-ins or custom model capabilities. Thanks @Marvinthebored.
-
CLI/doctor: load the configured memory-slot plugin when resolving memory diagnostics so bundled
memory-coreno longer triggers a false “no active memory plugin” warning on standalonedoctor/statusruns. Fixes #76367. Thanks @neeravmakwana. -
Gateway: preserve stack diagnostics when
chat.sendor agent attachment parsing/staging fails, improving image-send failure triage. Refs #63432. (#75135) Thanks @keen0206. -
Agents/idle-timeout: add a cost-runaway breaker to the outer embedded-run retry loop that halts further attempts after 5 consecutive idle timeouts without completed model progress, so a wedged provider can no longer fan paid model calls out across the same run; completed text or tool-call progress resets the breaker, but partial tool-argument token dribbles do not. Fixes #76293. Thanks @ThePuma312.
-
Heartbeats/Codex: stop sending the legacy
HEARTBEAT_OKprompt instruction when heartbeat turns have the structuredheartbeat_respondtool, while keeping the text sentinel for legacy automatic heartbeat replies. Thanks @pashpashpash. -
Heartbeats/Codex: keep structured heartbeat prompts aligned with actual
heartbeat_respondtool availability and keep tool-disabled commitment check-ins on the legacy ack path. Thanks @pashpashpash and @vincentkoc. -
Agent runtimes: fail explicit plugin runtime selections honestly when the requested harness is unavailable instead of silently falling back to the embedded PI runtime. Thanks @pashpashpash.
-
Maintainer workflow: push prepared PR heads through GitHub's verified commit API by default and require an explicit override before git-protocol pushes can publish unsigned commits. Thanks @BunsDev.
-
Feishu: resolve setup/status probes through the selected/default account so multi-account configs with account-scoped app credentials show as configured and probeable. Fixes #72930. Thanks @brokemac79.
-
Gateway/responses: emit every client tool call from
/v1/responsesJSON and SSE responses when the agent invokes multiple client tools in a single turn, so multi-tool plans, graph orchestration calls, and similar batched flows no longer drop every call but the last. Fixes #52288. Thanks @CharZhou and @bonelli. -
Gateway/agent: enforce
session.sendPolicy=denyon gateway agent requests only whendeliver: true, so non-delivery smoke checks and internal agent runs are no longer rejected withsend blocked by session policywhile outbound delivery remains gated. Fixes #73381. Thanks @wenxu007. -
Slack/reactions: treat missing no_reaction remove responses as idempotent success and route own-reaction cleanup through the remove helper, so concurrent cleanup no longer surfaces Slack race errors. Fixes #50733. (#76304) Thanks @martingarramon and @Hollychou924.
-
Feishu: include media
file_keyandimage_keyvalues in inbound dedupe so reused message IDs still process distinct media attachments while true retries stay suppressed. Fixes #75057. Thanks @SymbolStar. -
Control UI/Gateway: avoid full session-list reloads for locally applied message-phase session updates, carry known session keys through transcript-file update events, and defer media provider listing when explicit generation model config is present. Refs #76236, #76203, #76188, #76107, and #76166. Thanks @BunsDev.
-
Install/update: prune the obsolete
plugin-runtime-depsstate directory during packaged postinstall so upgrades from pre-2026.5.2 releases reclaim old bundled-plugin dependency caches without touching external plugin installs. -
Auto-reply/queue: treat reset-triggered
/newand/resetturns as interrupt runs across active-run queue handling, so steer/followup modes cannot delay a fresh session behind existing work. Fixes #74093. (#74144) Thanks @ruji9527 and @yelog. -
Cron: persist repaired startup runtime state back to
jobs-state.jsonso a valid futurenextRunAtMswith missingupdatedAtMsno longer triggers repeated external health-check repairs after Gateway restart. Fixes #76461. Thanks @vincentkoc. -
Cron: preserve manual
cron.runIDs incron.runshistory so manual run acknowledgements can be correlated with finished run records. Fixes #76276. -
CLI/devices: request
operator.adminforopenclaw devices approve <requestId>only when the exact pending device request would mint or inherit admin-scoped operator access, while keeping lower-scope approvals on the pairing scope. -
Memory/embedding: broaden the embedding reindex retry classifier to include transient socket-layer errors (
fetch failed,ECONNRESET,socket hang up,UND_ERR_*,closed) so memory reindex survives provider network hiccups instead of aborting mid-run. Related #56815, #44166. (#76311) Thanks @buyitsydney. -
Memory/sessions: keep rotated and deleted session transcripts (
.jsonl.reset.<iso>/.jsonl.deleted.<iso>) searchable end-to-end by indexing their real content inbuildSessionEntryinstead of short-circuiting to empty entries, and by mapping archive hit paths back to their live transcript stem duringmemory_searchvisibility filtering so hits are no longer dropped at the guard..jsonl.bak.<iso>backups and compaction checkpoints remain opaque. Refs #56131. Thanks @buyitsydney. -
Memory/sessions: emit a
sessionTranscriptUpdateevent whenarchiveFileOnDiskrotates a live session transcript into.jsonl.reset.<iso>/.jsonl.deleted.<iso>/.jsonl.bak.<iso>, and bypass the delta-bytes / delta-messages threshold gate inprocessSessionDeltaBatchfor usage-counted archive paths (.jsonl.reset.<iso>and.jsonl.deleted.<iso>). Without the bypass the archive event was forwarded to the listener but dropped at the threshold check, because an archive is a one-shot file-rename mutation rather than an incremental append and would typically land below the defaultdeltaBytes: 100000/deltaMessages: 50reindex thresholds. Archives now feed the memory sync incremental path the same wayappendMessage/ compaction / tool-result rewrite / chat inject / command execution events already do. Refs #56131. Thanks @buyitsydney. -
Memory/search: keep sqlite-vec optional in packaged installs and point missing-extension recovery at the valid
agents.defaults.memorySearch.store.vector.extensionPathsetting. Thanks @willemsej and @vincentkoc. -
Gateway: keep directly requested plugin tools invokable under restrictive tool profiles while preserving explicit deny lists and the HTTP safety deny list, preventing catalog/invoke mismatches that surface as "Tool not available". Thanks @BunsDev.
-
Gateway/update: allow beta binaries to refresh gateway services when the config was last written by the matching stable release version, avoiding false newer-config downgrade blocks during beta channel updates.
-
Channels: keep Matrix and Mattermost bundled in the core package instead of advertising external npm installs before those channels are cut over. Thanks @vincentkoc.
-
Bonjour: disable LAN mDNS advertising after a repeated stuck-announcing recovery instead of repeatedly restarting ciao and saturating the Gateway event loop.
-
Channels/setup: label installable channel picker hints as remote npm installs and hide remote install hints for bundled plugins that already ship with OpenClaw.
-
CLI/update: refuse package updates launched from the active gateway process tree before stopping the managed Gateway service, avoiding self-terminated in-lane updates that leave old Gateway code running. Fixes #75691. (#75819) Thanks @ai-hpc.
-
CLI/plugins: stop treating the non-plugin
authcommand root as a bundled plugin id, so restrictiveplugins.allowconfigs no longer tell users to add staleauthplugin entries. -
Doctor/plugins: update configured plugin installs whose stale manifests still declare channels without
channelConfigs, so beta upgrades repair old Discord-style package payloads duringdoctor --fix. -
Doctor/plugins: repair configured external plugin installs whose persisted install record points at a missing package directory, so upgrades reconcile phantom npm metadata before plugin runtime validation. Thanks @vincentkoc.
-
Active Memory: keep non-empty
memory_searchresults from being fast-failed as empty when debug telemetry reports zero hits. -
Active Memory: preserve the target agent context when building embedded recall plugin tools so
memory_searchandmemory_getstay available for explicit recall sessions. Fixes #76343. Thanks @Countermarch. -
Plugins/externalization: repair missing configured plugin installs from npm by default, reserve ClawHub downloads for explicit
clawhubSpecmetadata, and cover agent-runtime/env-selected plugin repair. Thanks @vincentkoc. -
Plugins/install: allow official catalog-matched npm channel plugins such as Feishu to pass the trusted install scanner path while keeping spoofed package names blocked. Thanks @vincentkoc.
-
Tools/llm-task: keep JSON-only embedded model runs from tripping inherited tool allowlists when tools are intentionally disabled, while preserving runtime
toolsAllowfailures. Fixes #74019. Thanks @amknight. -
Tools/profiles: make
tools.profile: "full"grant all tools including optional plugin tools such as browser, so the full profile no longer silently drops plugin-provided tools that require an explicit allowlist entry. Fixes #76507. Thanks @amknight. -
Feishu: keep timeout env parsing separate from the HTTP client wrapper so package security scans no longer report a false env-harvesting hit during install. Thanks @vincentkoc.
-
Upgrade/config: validate configured web-search providers and statically suppressed model/provider pairs against the active plugin set at config load, so stale plugin state fails loud before runtime fallback.
-
Status/update: resolve beta update-channel checks from the installed version when config still says
stable, and letstatus --deepreuse live gateway channel credential state instead of warning on command-path-only token misses. -
Doctor/plugins: preserve unmanaged third-party plugin
node_modulesduringdoctor --fix, while still pruning OpenClaw-managed runtime dependency caches. -
Gateway/restart: add
openclaw gateway restart --forceand--wait <duration>, log active task run IDs before restart deferral timers, and report timeout restarts as explicit forced restarts. -
Discord: persist slash-command deploy hashes across process restarts so unchanged command sets skip redeploy and avoid restart-loop 429s.
-
Providers/LM Studio: normalize binary
off/onreasoning metadata from Gemma 4 and other local models to LM Studio's accepted OpenAI-compatiblereasoning_effortvalues. -
Plugins/externalization: keep official external install docs, update examples, and live Codex npm checks on default npm tags instead of
@beta. Thanks @vincentkoc. -
Plugins/externalization: keep ACPX, Google Chat, and LINE publishable plugin dist trees out of the core npm package file list.
-
Plugins/ClawHub: fall back to version metadata when the artifact resolver route is missing and keep the Docker ClawHub fixture aligned with npm-pack artifact resolution, avoiding false version-not-found failures during plugin install validation. Thanks @vincentkoc.
-
Providers/openai-codex: honor
providerConfig.baseUrlin the dynamic-model synthesis fallback so codex providers configured with a custom upstream (for example a forwarding proxy) no longer silently bypass the configured URL when the registry has no template row to clone for the requested model id. (#76428) Thanks @arniesaha. -
Status/channels: show configured channels in
openclaw statusand config-onlyopenclaw channels statusoutput even when the Gateway is unreachable, avoiding empty Channels tables on WSL and other no-Gateway paths. Thanks @vincentkoc. -
Plugins/ClawHub: explain unavailable explicit ClawHub ClawPack artifact downloads with a temporary npm install hint while ClawHub artifact routing rolls out. Thanks @vincentkoc.
-
Media: accept home-relative
MEDIA:~/...attachment paths while preserving existing file-read policy, traversal checks, and media type validation. Fixes #73796. Thanks @fabkury. -
Onboarding/search: install official external web-search plugins such as Brave before saving provider config, and make doctor repair reconcile selected external search providers whose npm payload is missing. Thanks @vincentkoc.
-
Plugins/externalization: add official npm-first catalogs for externalized channel, provider, and generic plugins, keep unpublished ACPX/Google Chat/LINE bundled, and make missing-plugin repair honor npm-first metadata while ClawHub pack files roll out. Thanks @vincentkoc.
-
Plugins/update: detect tracked plugin install records whose package directories disappeared during
openclaw update, reinstall them before normal plugin updates, and fail the update if any install record still points at missing disk payloads. -
Plugins/registry: hash manifest and package metadata when validating persisted plugin registries so fast same-size rewrites cannot leave stale plugin metadata trusted.
-
Plugins/registry: canonicalize install-record provenance paths before trust diagnostics, so npm plugins installed under symlinked temp/state roots no longer warn as untracked local code.
-
Plugins/install: let official external Discord reinstall requests pass the invalid-config guard and run stale-channel repair, so upgrades can recover missing external plugin state directly.
-
CLI/infer: reject local
codex/*one-shot model probes before simple-completion dispatch and point operators at the Codex app-server runtime path instead of ending with an empty-output error. -
Agents/sessions: preserve terminal lifecycle state when final run metadata persists from a stale in-memory snapshot, preventing
mainsessions from staying stuck as running after completed or timed-out turns. -
Gateway/CLI: make
openclaw gateway startrepair stale managed service definitions that point at old OpenClaw versions, missing binaries, or temporary installer paths before starting. -
Heartbeat/scheduler: make heartbeat phase scheduling active-hours-aware so the scheduler seeks forward to the first in-window phase slot instead of arming timers for quiet-hours slots and relying solely on the runtime guard. Non-UTC
activeHours.timezonevalues (e.g.Asia/Shanghai) now correctly influence when the next heartbeat timer fires, avoiding wasted quiet-hours ticks and long dormant gaps after gateway restarts. Fixes #75487. Thanks @amknight. -
Providers/Arcee AI: mark Trinity Large Thinking as tool-incompatible so main-session runs use the same text-only request shape that made subagent runs recover, avoiding the remaining main-session response-shape mismatch after the #62848 transport failover fix. Fixes #62851 and #62847; carries forward #62848. Thanks @Adam-Researchh.
-
Status: show the
openai-codexOAuth profile foropenai/gpt-*sessions running through the native Codex runtime instead of reporting auth as unknown. (#76197) Thanks @mbelinky. -
Gateway: avoid repeated plugin tool descriptor config hashing so large runtime configs do not block reply startup and trigger reconnect/timeouts. (#75944) Thanks @joshavant.
-
Plugins/externalization: keep diagnostics ClawHub packages and persisted bundled-plugin relocation on npm-first install metadata for launch, and omit Discord from the core package now that its external package is published. Thanks @vincentkoc.
-
Setup/TUI: bound the Terminal hatch bootstrap run so a stalled provider request times out instead of leaving first-run hatching stuck behind the watchdog. (#76241) Thanks @joshavant.
-
Cron/CLI runtimes: route isolated cron jobs through configured per-agent CLI runtimes only when the resolved model provider is compatible, so OpenAI job overrides no longer inherit a mismatched Claude CLI backend. Thanks @vishutdhar.
-
Plugins/Codex: allow the official npm Codex plugin to install without the unsafe-install override, keep
/codexcommand ownership, and cover the real npm Docker live path through managed.openclaw/npmdependencies plus uninstall failure proof. -
Gateway/status: add concrete service, config, listener-owner, and log collection next steps when gateway probes fail and Bonjour finds no local gateway, so frozen or port-conflict reports include the data needed for root-cause triage. Refs #49012. Thanks @vincentkoc.
-
Codex harness: forward OpenClaw workspace bootstrap files such as
SOUL.mdthrough native Codex config instructions while leavingAGENTS.mdto Codex project-doc discovery. Fixes #76273. Thanks @zknicker. -
Parallels/Windows update smoke: escape the stale post-swap import regex in the generated PowerShell script so expected
ERR_MODULE_NOT_FOUNDupdate handoffs continue to post-update health checks. (#75315) -
Slack: allow draft preview streaming in top-level DMs when
replyToModeisoffwhile keeping Slack native streaming and assistant thread status gated on reply threads. Fixes #56480. (#56544) Thanks @HangGlidersRule. -
Control UI/chat: remove the delete-confirm popover outside-click listener on every dismiss path, so Cancel, Delete, outside clicks, and same-button toggles no longer leave stale document listeners behind. Refs #75590 and #69982. Thanks @Ricardo-M-L.
-
Memory-core: treat exhausted file watcher limits as non-fatal for builtin memory auto-sync while preserving fatal handling for unrelated disk-full errors. (#73357) Thanks @solodmd.
-
Providers/Ollama: restore catalog context-window forwarding as
num_ctxfor native/api/chatrequests; fixes tool selection and context truncation regressions on models with catalog entries (qwen3, llama3, gemma3, …) when no explicitparams.num_ctxwas configured. Fixes #76117. (#76181) Thanks @openperf. -
Plugins/install: pin npm plugin installs to the verified resolved version and reject package-lock version or integrity drift, so mutable tags cannot race integrity checks into accepting a different artifact. Thanks @Lucenx9.
-
Plugins/providers: preserve scoped cold-load fallback for enabled external manifest-contract capability providers missing from the startup registry, so providers such as Fish Audio can resolve on request without requiring
activation.onStartupfor correctness. (#76536) Thanks @Conan-Scott. -
Gateway/update: carry
continuationMessagefromupdate.runinto successful restart sentinels so session-scoped self-updates can resume one follow-up turn after the Gateway restarts. Refs #71178. (#74362) Thanks @100menotu001, @HeilbronAILabs, and @artnking. -
Agents/fallback: suppress duplicate current-turn user-message transcript writes after embedded fallback retries while still sending the retry prompt to the model. (#63696) Thanks @dashhuang.
-
Channels/Telegram: force a fresh final message when a visible non-preview bubble (tool/block/error) was delivered after the active answer preview, so multi-step assistant replies no longer end up with the final answer above intermediate output. Fixes #76529. Thanks @jack-stormentswe.
-
Channels/Telegram: require an observed Telegram send, edit, or fallback before treating a forum-topic final as delivered, so final replies generated in transcript no longer disappear from Telegram topics. Fixes #76554. (#76764) Thanks @bubucilo and @obviyus.
-
Plugins/update: keep externalized bundled npm bridge updates on the normal plugin security scanner path instead of granting source-linked official trust without artifact provenance. (#76765) Thanks @Lucenx9.
-
Agents/reply context: label replied-to messages as the current user message target in model-visible metadata, so short replies are grounded to their explicit reply target instead of nearby chat history. (#76817) Thanks @obviyus.
-
Doctor/plugins: install configured missing official plugins such as Discord and Brave during doctor/update repair, auto-enable repaired provider plugins, preserve config when a download fails, and stop auto-enable from inventing plugin entries when no manifest declares a configured channel. Fixes #76872. Thanks @jack-stormentswe.
-
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.