Releases: openclaw/openclaw
Releases · openclaw/openclaw
openclaw 2026.3.8
Immutable
release. Only release title and notes can be modified.
Mac assets on this release reuse the beta artifact line from v2026.3.8-beta.1.
Changes
- CLI/backup: add
openclaw backup createandopenclaw backup verifyfor local state archives, including--only-config,--no-include-workspace, manifest/payload validation, and backup guidance in destructive flows. (#40163) thanks @shichangs. - macOS/onboarding: add a remote gateway token field for remote mode, preserve existing non-plaintext
gateway.remote.tokenconfig values until explicitly replaced, and warn when the loaded token shape cannot be used directly from the macOS app. (#40187, supersedes #34614) Thanks @cgdusek. - Talk mode: add top-level
talk.silenceTimeoutMsconfig so Talk waits a configurable amount of silence before auto-sending the current transcript, while keeping each platform's existing default pause window when unset. (#39607) Thanks @danodoesdesign. Fixes #17147. - TUI: infer the active agent from the current workspace when launched inside a configured agent workspace, while preserving explicit
agent:session targets. (#39591) thanks @arceus77-7. - Tools/Brave web search: add opt-in
tools.web.search.brave.mode: "llm-context"soweb_searchcan call Brave's LLM Context endpoint and return extracted grounding snippets with source metadata, plus config/docs/test coverage. (#33383) Thanks @thirumaleshp. - CLI/install: include the short git commit hash in
openclaw --versionoutput when metadata is available, and keep installer version checks compatible with the decorated format. (#39712) thanks @sourman. - CLI/backup: improve archive naming for date sorting, add config-only backup mode, and harden backup planning, publication, and verification edge cases. (#40163) Thanks @gumadeiras.
- ACP/Provenance: add optional ACP ingress provenance metadata and visible receipt injection (
openclaw acp --provenance off|meta|meta+receipt) so OpenClaw agents can retain and report ACP-origin context with session trace IDs. (#40473) thanks @mbelinky. - Tools/web search: alphabetize provider ordering across runtime selection, onboarding/configure pickers, and config metadata, so provider lists stay neutral and multi-key auto-detect now prefers Grok before Kimi. (#40259) thanks @kesku.
- Docs/Web search: restore $5/month free-credit details, replace defunct "Data for Search"/"Data for AI" plan names with current "Search" plan, and note legacy subscription validity in Brave setup docs. Follows up on #26860. (#40111) Thanks @remusao.
- Extensions/ACPX tests: move the shared runtime fixture helper from
src/runtime-internals/tosrc/test-utils/so the test-only helper no longer looks like shipped runtime code.
Fixes
- Update/macOS launchd restart: re-enable disabled LaunchAgent services before updater bootstrap so
openclaw updatecan recover from a disabled gateway service instead of leaving the restart step stuck. - macOS app/chat UI: route browser proxy through the local node browser service, preserve plain-text paste semantics, strip completed assistant trace/debug wrapper noise from transcripts, refresh permission state after returning from System Settings, and tolerate malformed cron rows in the macOS tab. (#39516) Thanks @Imhermes1.
- Android/Play distribution: remove self-update, background location,
screen.record, and background mic capture from the Android app, narrow the foreground service todataSynconly, and clean up the legacylocation.enabledMode=alwayspreference migration. (#39660) Thanks @obviyus. - Telegram/DM routing: dedupe inbound Telegram DMs per agent instead of per session key so the same DM cannot trigger duplicate replies when both
agent:main:mainandagent:main:telegram:direct:<id>resolve for one agent. Fixes #40005. Supersedes #40116. (#40519) thanks @obviyus. - Cron/Telegram announce delivery: route text-only announce jobs through the real outbound adapters after finalizing descendant output so plain Telegram targets no longer report
delivered: truewhen no message actually reached Telegram. (#40575) thanks @obviyus. - Matrix/DM routing: add safer fallback detection for broken
m.directhomeservers, honor explicit room bindings over DM classification, and preserve room-bound agent selection for Matrix DM rooms. (#19736) Thanks @derbronko. - Feishu/plugin onboarding: clear the short-lived plugin discovery cache before reloading the registry after installing a channel plugin, so onboarding no longer re-prompts to download Feishu immediately after a successful install. Fixes #39642. (#39752) Thanks @GazeKingNuWu.
- Plugins/channel onboarding: prefer bundled channel plugins over duplicate npm-installed copies during onboarding and release-channel sync, preventing bundled plugins from being shadowed by npm installs with the same plugin ID. (#40092)
- Config/runtime snapshots: keep secrets-runtime-resolved config and auth-profile snapshots intact after config writes so follow-up reads still see file-backed secret values while picking up the persisted config update. (#37313) thanks @bbblending.
- Gateway/Control UI: resolve bundled dashboard assets through symlinked global wrappers and auto-detected package roots, while keeping configured and custom roots on the strict hardlink boundary. (#40385) Thanks @LarytheLord.
- Browser/extension relay: add
browser.relayBindHostso the Chrome relay can bind to an explicit non-loopback address for WSL2 and other cross-namespace setups, while preserving loopback-only defaults. (#39364) Thanks @mvanhorn. - Browser/CDP: normalize loopback direct WebSocket CDP URLs back to HTTP(S) for
/json/*tab operations so localws:///wss://profiles can still list, focus, open, and close tabs after the new direct-WS support lands. (#31085) Thanks @shrey150. - Browser/CDP: rewrite wildcard
ws://0.0.0.0andws://[::]debugger URLs from remote/json/versionresponses back to the external CDP host/port, fixing Browserless-style container endpoints. (#17760) Thanks @joeharouni. - Browser/extension relay: wait briefly for a previously attached Chrome tab to reappear after transient relay drops before failing with
tab not found, reducing noisy reconnect flakes. (#32461) Thanks @AaronWander. - macOS/Tailscale gateway discovery: keep Tailscale Serve probing alive when other remote gateways are already discovered, prefer direct transport for resolved
.ts.netand Tailscale Serve gateways, and setTERM=dumbfor GUI-launched Tailscale CLI discovery. (#40167) thanks @ngutman. - TUI/theme: detect light terminal backgrounds via
COLORFGBGand pick a WCAG AA-compliant light palette, withOPENCLAW_THEME=light|darkoverride for terminals without auto-detection. (#38636) Thanks @ademczuk and @vincentkoc. - Agents/openai-codex: normalize
gpt-5.4fallback transport back toopenai-codex-responsesonchatgpt.com/backend-apiwhen config drifts to the generic OpenAI responses endpoint. (#38736) Thanks @0xsline. - Models/openai-codex GPT-5.4 forward-compat: use the GPT-5.4 1,050,000-token context window and 128,000 max tokens for
openai-codex/gpt-5.4instead of inheriting stale legacy Codex limits in resolver fallbacks and model listing. (#37876) thanks @yuweuii. - Tools/web search: restore Perplexity OpenRouter/Sonar compatibility for legacy
OPENROUTER_API_KEY,sk-or-..., and explicitperplexity.baseUrl/modelsetups while keeping direct Perplexity keys on the native Search API path. (#39937) Thanks @obviyus. - Agents/failover: detect Amazon Bedrock
Too many tokens per dayquota errors as rate limits across fallback, cron retry, and memory embeddings while keeping context-windowtoo many tokens per requesterrors out of the rate-limit lane. (#39377) Thanks @gambletan. - Mattermost replies: keep
root_idpinned to the existing thread root when an agent replies inside a thread, while still using reply-target threading for top-level posts. (#27744) thanks @hnykda. - Telegram/DM partial streaming: keep DM preview lanes on real message edits instead of native draft materialization so final replies no longer flash a second duplicate copy before collapsing back to one.
- macOS overlays: fix VoiceWake, Talk, and Notify overlay exclusivity crashes by removing shared
inoutvisibility mutation fromOverlayPanelFactory.present, and add a repeated Talk overlay smoke test. (#39275, #39321) Thanks @fellanH. - macOS Talk Mode: set the speech recognition request
taskHintto.dictationfor mic capture, and add regression coverage for the request defaults. (#38445) Thanks @dmiv. - macOS release packaging: default
scripts/package-mac-app.shto universal binaries forBUILD_CONFIG=release, and clarify thatscripts/package-mac-dist.shalready produces the release zip + DMG. (#33891) Thanks @cgdusek. - Hooks/session-memory: keep
/newand/resetmemory artifacts in the bound agent workspace and align saved reset session keys with that workspace when stale main-agent keys leak into the hook path. (#39875) thanks @rbutera. - Sessions/model switch: clear stale cached
contextTokenswhen a session changes models so status and runtime paths recompute against the active model window. (#38044) thanks @yuweuii. - ACP/session history: persist transcripts for successful ACP child runs, preserve exact transcript text, record ACP spawned-session lineage, and keep spawn-time transcript-path persistence best-effort so history storage failures do not block execution. (#40137) thanks @mbelinky.
- Docs/browser: add a layered WSL2 + Windows remote Chrome CDP troubleshooting guide, including Control UI origin pitfalls and extension-relay bind-address guidance. (#39407) Thanks @Owlock.
- Context engine registry/bundled builds: share the registry state through a
globalThissingleton so duplicated bundled module copies can resolve engines registered by each other at runtime, with regression coverage for duplicate-module imports. (#40115) thanks @jalehman. - Podman/setup: fix
cannot chdir: Permission deniedinrun_as_userwhen `...
openclaw 2026.3.8-beta.1
Immutable
release. Only release title and notes can be modified.
Changes
- CLI/backup: add
openclaw backup createandopenclaw backup verifyfor local state archives, including--only-config,--no-include-workspace, manifest/payload validation, and backup guidance in destructive flows. (#40163) thanks @shichangs. - macOS/onboarding: add a remote gateway token field for remote mode, preserve existing non-plaintext
gateway.remote.tokenconfig values until explicitly replaced, and warn when the loaded token shape cannot be used directly from the macOS app. (#40187, supersedes #34614) Thanks @cgdusek. - Talk mode: add top-level
talk.silenceTimeoutMsconfig so Talk waits a configurable amount of silence before auto-sending the current transcript, while keeping each platform's existing default pause window when unset. (#39607) Thanks @danodoesdesign. Fixes #17147. - TUI: infer the active agent from the current workspace when launched inside a configured agent workspace, while preserving explicit
agent:session targets. (#39591) thanks @arceus77-7. - Tools/Brave web search: add opt-in
tools.web.search.brave.mode: "llm-context"soweb_searchcan call Brave's LLM Context endpoint and return extracted grounding snippets with source metadata, plus config/docs/test coverage. (#33383) Thanks @thirumaleshp. - CLI/install: include the short git commit hash in
openclaw --versionoutput when metadata is available, and keep installer version checks compatible with the decorated format. (#39712) thanks @sourman. - CLI/backup: improve archive naming for date sorting, add config-only backup mode, and harden backup planning, publication, and verification edge cases. (#40163) Thanks @gumadeiras.
- ACP/Provenance: add optional ACP ingress provenance metadata and visible receipt injection (
openclaw acp --provenance off|meta|meta+receipt) so OpenClaw agents can retain and report ACP-origin context with session trace IDs. (#40473) thanks @mbelinky. - Tools/web search: alphabetize provider ordering across runtime selection, onboarding/configure pickers, and config metadata, so provider lists stay neutral and multi-key auto-detect now prefers Grok before Kimi. (#40259) thanks @kesku.
- Docs/Web search: restore $5/month free-credit details, replace defunct "Data for Search"/"Data for AI" plan names with current "Search" plan, and note legacy subscription validity in Brave setup docs. Follows up on #26860. (#40111) Thanks @remusao.
- Extensions/ACPX tests: move the shared runtime fixture helper from
src/runtime-internals/tosrc/test-utils/so the test-only helper no longer looks like shipped runtime code.
Fixes
- macOS app/chat UI: route browser proxy through the local node browser service, preserve plain-text paste semantics, strip completed assistant trace/debug wrapper noise from transcripts, refresh permission state after returning from System Settings, and tolerate malformed cron rows in the macOS tab. (#39516) Thanks @Imhermes1.
- Android/Play distribution: remove self-update, background location,
screen.record, and background mic capture from the Android app, narrow the foreground service todataSynconly, and clean up the legacylocation.enabledMode=alwayspreference migration. (#39660) Thanks @obviyus. - Telegram/DM routing: dedupe inbound Telegram DMs per agent instead of per session key so the same DM cannot trigger duplicate replies when both
agent:main:mainandagent:main:telegram:direct:<id>resolve for one agent. Fixes #40005. Supersedes #40116. (#40519) thanks @obviyus. - Cron/Telegram announce delivery: route text-only announce jobs through the real outbound adapters after finalizing descendant output so plain Telegram targets no longer report
delivered: truewhen no message actually reached Telegram. (#40575) thanks @obviyus. - Matrix/DM routing: add safer fallback detection for broken
m.directhomeservers, honor explicit room bindings over DM classification, and preserve room-bound agent selection for Matrix DM rooms. (#19736) Thanks @derbronko. - Feishu/plugin onboarding: clear the short-lived plugin discovery cache before reloading the registry after installing a channel plugin, so onboarding no longer re-prompts to download Feishu immediately after a successful install. Fixes #39642. (#39752) Thanks @GazeKingNuWu.
- Plugins/channel onboarding: prefer bundled channel plugins over duplicate npm-installed copies during onboarding and release-channel sync, preventing bundled plugins from being shadowed by npm installs with the same plugin ID. (#40092)
- Config/runtime snapshots: keep secrets-runtime-resolved config and auth-profile snapshots intact after config writes so follow-up reads still see file-backed secret values while picking up the persisted config update. (#37313) thanks @bbblending.
- Gateway/Control UI: resolve bundled dashboard assets through symlinked global wrappers and auto-detected package roots, while keeping configured and custom roots on the strict hardlink boundary. (#40385) Thanks @LarytheLord.
- Browser/extension relay: add
browser.relayBindHostso the Chrome relay can bind to an explicit non-loopback address for WSL2 and other cross-namespace setups, while preserving loopback-only defaults. (#39364) Thanks @mvanhorn. - Browser/CDP: normalize loopback direct WebSocket CDP URLs back to HTTP(S) for
/json/*tab operations so localws:///wss://profiles can still list, focus, open, and close tabs after the new direct-WS support lands. (#31085) Thanks @shrey150. - Browser/CDP: rewrite wildcard
ws://0.0.0.0andws://[::]debugger URLs from remote/json/versionresponses back to the external CDP host/port, fixing Browserless-style container endpoints. (#17760) Thanks @joeharouni. - Browser/extension relay: wait briefly for a previously attached Chrome tab to reappear after transient relay drops before failing with
tab not found, reducing noisy reconnect flakes. (#32461) Thanks @AaronWander. - macOS/Tailscale gateway discovery: keep Tailscale Serve probing alive when other remote gateways are already discovered, prefer direct transport for resolved
.ts.netand Tailscale Serve gateways, and setTERM=dumbfor GUI-launched Tailscale CLI discovery. (#40167) thanks @ngutman. - TUI/theme: detect light terminal backgrounds via
COLORFGBGand pick a WCAG AA-compliant light palette, withOPENCLAW_THEME=light|darkoverride for terminals without auto-detection. (#38636) Thanks @ademczuk and @vincentkoc. - Agents/openai-codex: normalize
gpt-5.4fallback transport back toopenai-codex-responsesonchatgpt.com/backend-apiwhen config drifts to the generic OpenAI responses endpoint. (#38736) Thanks @0xsline. - Models/openai-codex GPT-5.4 forward-compat: use the GPT-5.4 1,050,000-token context window and 128,000 max tokens for
openai-codex/gpt-5.4instead of inheriting stale legacy Codex limits in resolver fallbacks and model listing. (#37876) thanks @yuweuii. - Tools/web search: restore Perplexity OpenRouter/Sonar compatibility for legacy
OPENROUTER_API_KEY,sk-or-..., and explicitperplexity.baseUrl/modelsetups while keeping direct Perplexity keys on the native Search API path. (#39937) Thanks @obviyus. - Agents/failover: detect Amazon Bedrock
Too many tokens per dayquota errors as rate limits across fallback, cron retry, and memory embeddings while keeping context-windowtoo many tokens per requesterrors out of the rate-limit lane. (#39377) Thanks @gambletan. - Mattermost replies: keep
root_idpinned to the existing thread root when an agent replies inside a thread, while still using reply-target threading for top-level posts. (#27744) thanks @hnykda. - Telegram/DM partial streaming: keep DM preview lanes on real message edits instead of native draft materialization so final replies no longer flash a second duplicate copy before collapsing back to one.
- macOS overlays: fix VoiceWake, Talk, and Notify overlay exclusivity crashes by removing shared
inoutvisibility mutation fromOverlayPanelFactory.present, and add a repeated Talk overlay smoke test. (#39275, #39321) Thanks @fellanH. - macOS Talk Mode: set the speech recognition request
taskHintto.dictationfor mic capture, and add regression coverage for the request defaults. (#38445) Thanks @dmiv. - macOS release packaging: default
scripts/package-mac-app.shto universal binaries forBUILD_CONFIG=release, and clarify thatscripts/package-mac-dist.shalready produces the release zip + DMG. (#33891) Thanks @cgdusek. - Hooks/session-memory: keep
/newand/resetmemory artifacts in the bound agent workspace and align saved reset session keys with that workspace when stale main-agent keys leak into the hook path. (#39875) thanks @rbutera. - Sessions/model switch: clear stale cached
contextTokenswhen a session changes models so status and runtime paths recompute against the active model window. (#38044) thanks @yuweuii. - ACP/session history: persist transcripts for successful ACP child runs, preserve exact transcript text, record ACP spawned-session lineage, and keep spawn-time transcript-path persistence best-effort so history storage failures do not block execution. (#40137) thanks @mbelinky.
- Docs/browser: add a layered WSL2 + Windows remote Chrome CDP troubleshooting guide, including Control UI origin pitfalls and extension-relay bind-address guidance. (#39407) Thanks @Owlock.
- Context engine registry/bundled builds: share the registry state through a
globalThissingleton so duplicated bundled module copies can resolve engines registered by each other at runtime, with regression coverage for duplicate-module imports. (#40115) thanks @jalehman. - Podman/setup: fix
cannot chdir: Permission deniedinrun_as_userwhensetup-podman.shis invoked from a directory the target user cannot access, by wrapping user-switch calls in a subshell that cd's to/tmpwith/fallback. (#39435) Thanks @langdon and @jlcbk. - Podman/SELinux: auto-detect SELinux enforcing/permissive mode and add
:Zrelabel to bi...
openclaw 2026.3.7
Immutable
release. Only release title and notes can be modified.
Changes
- Agents/context engine plugin interface: add
ContextEngineplugin slot with full lifecycle hooks (bootstrap,ingest,assemble,compact,afterTurn,prepareSubagentSpawn,onSubagentEnded), slot-based registry with config-driven resolution,LegacyContextEnginewrapper preserving existing compaction behavior, scoped subagent runtime for plugin runtimes viaAsyncLocalStorage, andsessions.getgateway method. Enables plugins likelossless-clawto provide alternative context management strategies without modifying core compaction logic. Zero behavior change when no context engine plugin is configured. (#22201) thanks @jalehman. - ACP/persistent channel bindings: add durable Discord channel and Telegram topic binding storage, routing resolution, and CLI/docs support so ACP thread targets survive restarts and can be managed consistently. (#34873) Thanks @dutifulbob.
- Telegram/ACP topic bindings: accept Telegram Mac Unicode dash option prefixes in
/acp spawn, support Telegram topic thread binding (--thread here|auto), route bound-topic follow-ups to ACP sessions, add actionable Telegram approval buttons with prefixed approval-id resolution, and pin successful bind confirmations in-topic. (#36683) Thanks @huntharo. - Telegram/topic agent routing: support per-topic
agentIdoverrides in forum groups and DM topics so topics can route to dedicated agents with isolated sessions. (#33647; based on #31513) Thanks @kesor and @Sid-Qin. - Web UI/i18n: add Spanish (
es) locale support in the Control UI, including locale detection, lazy loading, and language picker labels across supported locales. (#35038) Thanks @DaoPromociones. - Onboarding/web search: add provider selection step and full provider list in configure wizard, with SecretRef ref-mode support during onboarding. (#34009) Thanks @kesku and @thewilloftheshadow.
- Tools/Web search: switch Perplexity provider to Search API with structured results plus new language/region/time filters. (#33822) Thanks @kesku.
- Gateway: add SecretRef support for gateway.auth.token with auth-mode guardrails. (#35094) Thanks @joshavant.
- Docker/Podman extension dependency baking: add
OPENCLAW_EXTENSIONSso container builds can preinstall selected bundled extension npm dependencies into the image for faster and more reproducible startup in container deployments. (#32223) Thanks @sallyom. - Plugins/before_prompt_build system-context fields: add
prependSystemContextandappendSystemContextso static plugin guidance can be placed in system prompt space for provider caching and lower repeated prompt token cost. (#35177) thanks @maweibin. - Plugins/hook policy: add
plugins.entries.<id>.hooks.allowPromptInjection, validate unknown typed hook names at runtime, and preserve legacybefore_agent_startmodel/provider overrides while stripping prompt-mutating fields when prompt injection is disabled. (#36567) thanks @gumadeiras. - Hooks/Compaction lifecycle: emit
session:compact:beforeandsession:compact:afterinternal events plus plugin compaction callbacks with session/count metadata, so automations can react to compaction runs consistently. (#16788) thanks @vincentkoc. - Agents/compaction post-context configurability: add
agents.defaults.compaction.postCompactionSectionsso deployments can choose whichAGENTS.mdsections are re-injected after compaction, while preserving legacy fallback behavior when the documented default pair is configured in any order. (#34556) thanks @efe-arv. - TTS/OpenAI-compatible endpoints: add
messages.tts.openai.baseUrlconfig support with config-over-env precedence, endpoint-aware directive validation, and OpenAI TTS request routing to the resolved base URL. (#34321) thanks @RealKai42. - Slack/DM typing feedback: add
channels.slack.typingReactionso Socket Mode DMs can show reaction-based processing status even when Slack native assistant typing is unavailable. (#19816) Thanks @dalefrieswthat. - Discord/allowBots mention gating: add
allowBots: "mentions"to only accept bot-authored messages that mention the bot. Thanks @thewilloftheshadow. - Agents/tool-result truncation: preserve important tail diagnostics by using head+tail truncation for oversized tool results while keeping configurable truncation options. (#20076) thanks @jlwestsr.
- Cron/job snapshot persistence: skip backup during normalization persistence in
ensureLoadedsojobs.json.bakkeeps the pre-edit snapshot for recovery, while preserving backup creation on explicit user-driven writes. (#35234) Thanks @0xsline. - CLI: make read-only SecretRef status flows degrade safely (#37023) thanks @joshavant.
- Tools/Diffs guidance: restore a short system-prompt hint for enabled diffs while keeping the detailed instructions in the companion skill, so diffs usage guidance stays out of user-prompt space. (#36904) thanks @gumadeiras.
- Tools/Diffs guidance loading: move diffs usage guidance from unconditional prompt-hook injection to the plugin companion skill path, reducing unrelated-turn prompt noise while keeping diffs tool behavior unchanged. (#32630) thanks @sircrumpet.
- Docs/Web search: remove outdated Brave free-tier wording and replace prescriptive AI ToS guidance with neutral compliance language in Brave setup docs. (#26860) Thanks @HenryLoenwind.
- Config/Compaction safeguard tuning: expose
agents.defaults.compaction.recentTurnsPreserveand quality-guard retry knobs through the validated config surface and embedded-runner wiring, with regression coverage for real config loading and schema metadata. (#25557) thanks @rodrigouroz. - iOS/App Store Connect release prep: align iOS bundle identifiers under
ai.openclaw.client, refresh Watch app icons, add Fastlane metadata/screenshot automation, and support Keychain-backed ASC auth for uploads. (#38936) Thanks @ngutman. - Mattermost/model picker: add Telegram-style interactive provider/model browsing for
/oc_modeland/oc_models, fix picker callback updates, and emit a normal confirmation reply when a model is selected. (#38767) thanks @mukhtharcm. - Docker/multi-stage build: restructure Dockerfile as a multi-stage build to produce a minimal runtime image without build tools, source code, or Bun; add
OPENCLAW_VARIANT=slimbuild arg for a bookworm-slim variant. (#38479) Thanks @sallyom. - Google/Gemini 3.1 Flash-Lite: add first-class
google/gemini-3.1-flash-lite-previewsupport across model-id normalization, default aliases, media-understanding image lookups, Google Gemini CLI forward-compat fallback, and docs.
Breaking
- BREAKING: Gateway auth now requires explicit
gateway.auth.modewhen bothgateway.auth.tokenandgateway.auth.passwordare configured (including SecretRefs). Setgateway.auth.modetotokenorpasswordbefore upgrade to avoid startup/pairing/TUI failures. (#35094) Thanks @joshavant.
Fixes
- Models/MiniMax: stop advertising removed
MiniMax-M2.5-Lightningin built-in provider catalogs, onboarding metadata, and docs; keep the supported fast-tier model asMiniMax-M2.5-highspeed. - Security/Config: fail closed when
loadConfig()hits validation or read errors so invalid configs cannot silently fall back to permissive runtime defaults. (#9040) Thanks @joetomasone. - Memory/Hybrid search: preserve negative FTS5 BM25 relevance ordering in
bm25RankToScore()so stronger keyword matches rank above weaker ones instead of collapsing or reversing scores. (#33757) Thanks @lsdcc01. - LINE/
requireMentiongroup gating: align inbound and reply-stage LINE group policy resolution across raw,group:, androom:keys (including account-scoped group config), preserve plugin-backed reply-stage fallback behavior, and add regression coverage for prefixed-only group/room config plus reply-stage policy resolution. (#35847) Thanks @kirisame-wang. - Onboarding/local setup: default unset local
tools.profiletocodinginstead ofmessaging, restoring file/runtime tools for fresh local installs while preserving explicit user-set profiles. (from #38241, overlap with #34958) Thanks @cgdusek. - Gateway/Telegram stale-socket restart guard: only apply stale-socket restarts to channels that publish event-liveness timestamps, preventing Telegram providers from being misclassified as stale solely due to long uptime and avoiding restart/pairing storms after upgrade. (#38464)
- Onboarding/headless Linux daemon probe hardening: treat
systemctl --user is-enabledprobe failures as non-fatal during daemon install flow so onboarding no longer crashes on SSH/headless VPS environments before showing install guidance. (#37297) Thanks @acarbajal-web. - Memory/QMD mcporter Windows spawn hardening: when
mcporter.cmdlaunch fails withspawn EINVAL, retry via baremcportershell resolution so QMD recall can continue instead of falling back to builtin memory search. (#27402) Thanks @i0ivi0i. - Tools/web_search Brave language-code validation: align
search_langhandling with Brave-supported codes (includingzh-hans,zh-hant,en-gb, andpt-br), map common alias inputs (zh,ja) to valid Brave values, and reject unsupported codes before upstream requests to prevent 422 failures. (#37260) Thanks @heyanming. - Models/openai-completions streaming compatibility: force
compat.supportsUsageInStreaming=falsefor non-native OpenAI-compatible endpoints during model normalization, preventing usage-only stream chunks from triggeringchoices[0]parser crashes in provider streams. (#8714) Thanks @nonanon1. - Tools/xAI native web-search collision guard: drop OpenClaw
web_searchfrom tool registration when routing to xAI/Grok model providers (including OpenRouterx-ai/*) to avoid duplicate tool-name request failures against provider-nativeweb_search. (#14749) Thanks @realsamrat. - TUI/token copy-safety rendering: treat long credential-like mixed alphanumeric tokens (including quoted forms) as copy-sensitive in render sanitization so formatter hard-wrap guards ...
openclaw 2026.3.7-beta.1
Immutable
release. Only release title and notes can be modified.
Changes
- Agents/context engine plugin interface: add
ContextEngineplugin slot with full lifecycle hooks (bootstrap,ingest,assemble,compact,afterTurn,prepareSubagentSpawn,onSubagentEnded), slot-based registry with config-driven resolution,LegacyContextEnginewrapper preserving existing compaction behavior, scoped subagent runtime for plugin runtimes viaAsyncLocalStorage, andsessions.getgateway method. Enables plugins likelossless-clawto provide alternative context management strategies without modifying core compaction logic. Zero behavior change when no context engine plugin is configured. (#22201) thanks @jalehman. - ACP/persistent channel bindings: add durable Discord channel and Telegram topic binding storage, routing resolution, and CLI/docs support so ACP thread targets survive restarts and can be managed consistently. (#34873) Thanks @dutifulbob.
- Telegram/ACP topic bindings: accept Telegram Mac Unicode dash option prefixes in
/acp spawn, support Telegram topic thread binding (--thread here|auto), route bound-topic follow-ups to ACP sessions, add actionable Telegram approval buttons with prefixed approval-id resolution, and pin successful bind confirmations in-topic. (#36683) Thanks @huntharo. - Telegram/topic agent routing: support per-topic
agentIdoverrides in forum groups and DM topics so topics can route to dedicated agents with isolated sessions. (#33647; based on #31513) Thanks @kesor and @Sid-Qin. - Web UI/i18n: add Spanish (
es) locale support in the Control UI, including locale detection, lazy loading, and language picker labels across supported locales. (#35038) Thanks @DaoPromociones. - Onboarding/web search: add provider selection step and full provider list in configure wizard, with SecretRef ref-mode support during onboarding. (#34009) Thanks @kesku and @thewilloftheshadow.
- Tools/Web search: switch Perplexity provider to Search API with structured results plus new language/region/time filters. (#33822) Thanks @kesku.
- Gateway: add SecretRef support for gateway.auth.token with auth-mode guardrails. (#35094) Thanks @joshavant.
- Docker/Podman extension dependency baking: add
OPENCLAW_EXTENSIONSso container builds can preinstall selected bundled extension npm dependencies into the image for faster and more reproducible startup in container deployments. (#32223) Thanks @sallyom. - Plugins/before_prompt_build system-context fields: add
prependSystemContextandappendSystemContextso static plugin guidance can be placed in system prompt space for provider caching and lower repeated prompt token cost. (#35177) thanks @maweibin. - Plugins/hook policy: add
plugins.entries.<id>.hooks.allowPromptInjection, validate unknown typed hook names at runtime, and preserve legacybefore_agent_startmodel/provider overrides while stripping prompt-mutating fields when prompt injection is disabled. (#36567) thanks @gumadeiras. - Hooks/Compaction lifecycle: emit
session:compact:beforeandsession:compact:afterinternal events plus plugin compaction callbacks with session/count metadata, so automations can react to compaction runs consistently. (#16788) thanks @vincentkoc. - Agents/compaction post-context configurability: add
agents.defaults.compaction.postCompactionSectionsso deployments can choose whichAGENTS.mdsections are re-injected after compaction, while preserving legacy fallback behavior when the documented default pair is configured in any order. (#34556) thanks @efe-arv. - TTS/OpenAI-compatible endpoints: add
messages.tts.openai.baseUrlconfig support with config-over-env precedence, endpoint-aware directive validation, and OpenAI TTS request routing to the resolved base URL. (#34321) thanks @RealKai42. - Slack/DM typing feedback: add
channels.slack.typingReactionso Socket Mode DMs can show reaction-based processing status even when Slack native assistant typing is unavailable. (#19816) Thanks @dalefrieswthat. - Discord/allowBots mention gating: add
allowBots: "mentions"to only accept bot-authored messages that mention the bot. Thanks @thewilloftheshadow. - Agents/tool-result truncation: preserve important tail diagnostics by using head+tail truncation for oversized tool results while keeping configurable truncation options. (#20076) thanks @jlwestsr.
- Cron/job snapshot persistence: skip backup during normalization persistence in
ensureLoadedsojobs.json.bakkeeps the pre-edit snapshot for recovery, while preserving backup creation on explicit user-driven writes. (#35234) Thanks @0xsline. - CLI: make read-only SecretRef status flows degrade safely (#37023) thanks @joshavant.
- Tools/Diffs guidance: restore a short system-prompt hint for enabled diffs while keeping the detailed instructions in the companion skill, so diffs usage guidance stays out of user-prompt space. (#36904) thanks @gumadeiras.
- Tools/Diffs guidance loading: move diffs usage guidance from unconditional prompt-hook injection to the plugin companion skill path, reducing unrelated-turn prompt noise while keeping diffs tool behavior unchanged. (#32630) thanks @sircrumpet.
- Docs/Web search: remove outdated Brave free-tier wording and replace prescriptive AI ToS guidance with neutral compliance language in Brave setup docs. (#26860) Thanks @HenryLoenwind.
- Config/Compaction safeguard tuning: expose
agents.defaults.compaction.recentTurnsPreserveand quality-guard retry knobs through the validated config surface and embedded-runner wiring, with regression coverage for real config loading and schema metadata. (#25557) thanks @rodrigouroz. - iOS/App Store Connect release prep: align iOS bundle identifiers under
ai.openclaw.client, refresh Watch app icons, add Fastlane metadata/screenshot automation, and support Keychain-backed ASC auth for uploads. (#38936) Thanks @ngutman. - Mattermost/model picker: add Telegram-style interactive provider/model browsing for
/oc_modeland/oc_models, fix picker callback updates, and emit a normal confirmation reply when a model is selected. (#38767) thanks @mukhtharcm. - Docker/multi-stage build: restructure Dockerfile as a multi-stage build to produce a minimal runtime image without build tools, source code, or Bun; add
OPENCLAW_VARIANT=slimbuild arg for a bookworm-slim variant. (#38479) Thanks @sallyom.
Breaking
- BREAKING: Gateway auth now requires explicit
gateway.auth.modewhen bothgateway.auth.tokenandgateway.auth.passwordare configured (including SecretRefs). Setgateway.auth.modetotokenorpasswordbefore upgrade to avoid startup/pairing/TUI failures. (#35094) Thanks @joshavant.
Fixes
- Models/MiniMax: stop advertising removed
MiniMax-M2.5-Lightningin built-in provider catalogs, onboarding metadata, and docs; keep the supported fast-tier model asMiniMax-M2.5-highspeed. - Security/Config: fail closed when
loadConfig()hits validation or read errors so invalid configs cannot silently fall back to permissive runtime defaults. (#9040) Thanks @joetomasone. - Memory/Hybrid search: preserve negative FTS5 BM25 relevance ordering in
bm25RankToScore()so stronger keyword matches rank above weaker ones instead of collapsing or reversing scores. (#33757) Thanks @lsdcc01. - LINE/
requireMentiongroup gating: align inbound and reply-stage LINE group policy resolution across raw,group:, androom:keys (including account-scoped group config), preserve plugin-backed reply-stage fallback behavior, and add regression coverage for prefixed-only group/room config plus reply-stage policy resolution. (#35847) Thanks @kirisame-wang. - Onboarding/local setup: default unset local
tools.profiletocodinginstead ofmessaging, restoring file/runtime tools for fresh local installs while preserving explicit user-set profiles. (from #38241, overlap with #34958) Thanks @cgdusek. - Gateway/Telegram stale-socket restart guard: only apply stale-socket restarts to channels that publish event-liveness timestamps, preventing Telegram providers from being misclassified as stale solely due to long uptime and avoiding restart/pairing storms after upgrade. (#38464)
- Onboarding/headless Linux daemon probe hardening: treat
systemctl --user is-enabledprobe failures as non-fatal during daemon install flow so onboarding no longer crashes on SSH/headless VPS environments before showing install guidance. (#37297) Thanks @acarbajal-web. - Memory/QMD mcporter Windows spawn hardening: when
mcporter.cmdlaunch fails withspawn EINVAL, retry via baremcportershell resolution so QMD recall can continue instead of falling back to builtin memory search. (#27402) Thanks @i0ivi0i. - Tools/web_search Brave language-code validation: align
search_langhandling with Brave-supported codes (includingzh-hans,zh-hant,en-gb, andpt-br), map common alias inputs (zh,ja) to valid Brave values, and reject unsupported codes before upstream requests to prevent 422 failures. (#37260) Thanks @heyanming. - Models/openai-completions streaming compatibility: force
compat.supportsUsageInStreaming=falsefor non-native OpenAI-compatible endpoints during model normalization, preventing usage-only stream chunks from triggeringchoices[0]parser crashes in provider streams. (#8714) Thanks @nonanon1. - Tools/xAI native web-search collision guard: drop OpenClaw
web_searchfrom tool registration when routing to xAI/Grok model providers (including OpenRouterx-ai/*) to avoid duplicate tool-name request failures against provider-nativeweb_search. (#14749) Thanks @realsamrat. - TUI/token copy-safety rendering: treat long credential-like mixed alphanumeric tokens (including quoted forms) as copy-sensitive in render sanitization so formatter hard-wrap guards no longer inject visible spaces into auth-style values before display. (#26710) Thanks @jasonthane.
- WhatsApp/self-chat response prefix fallback: stop forcing
"[openclaw]"as the implicit outbound response prefix when no identit...
openclaw 2026.3.2
Immutable
release. Only release title and notes can be modified.
Changes
- Secrets/SecretRef coverage: expand SecretRef support across the full supported user-supplied credential surface (64 targets total), including runtime collectors,
openclaw secretsplanning/apply/audit flows, onboarding SecretInput UX, and related docs; unresolved refs now fail fast on active surfaces while inactive surfaces report non-blocking diagnostics. (#29580) Thanks @joshavant. - Tools/PDF analysis: add a first-class
pdftool with native Anthropic and Google PDF provider support, extraction fallback for non-native models, configurable defaults (agents.defaults.pdfModel,pdfMaxBytesMb,pdfMaxPages), and docs/tests covering routing, validation, and registration. (#31319) Thanks @tyler6204. - Outbound adapters/plugins: add shared
sendPayloadsupport across direct-text-media, Discord, Slack, WhatsApp, Zalo, and Zalouser with multi-media iteration and chunk-aware text fallback. (#30144) Thanks @nohat. - Models/MiniMax: add first-class
MiniMax-M2.5-highspeedsupport across built-in provider catalogs, onboarding flows, and MiniMax OAuth plugin defaults, while keeping legacyMiniMax-M2.5-Lightningcompatibility for existing configs. - Sessions/Attachments: add inline file attachment support for
sessions_spawn(subagent runtime only) with base64/utf8 encoding, transcript content redaction, lifecycle cleanup, and configurable limits viatools.sessions_spawn.attachments. (#16761) Thanks @napetrov. - Telegram/Streaming defaults: default
channels.telegram.streamingtopartial(fromoff) so new Telegram setups get live preview streaming out of the box, with runtime fallback to message-edit preview when native drafts are unavailable. - Telegram/DM streaming: use
sendMessageDraftfor private preview streaming, keep reasoning/answer preview lanes separated in DM reasoning-stream mode. (#31824) Thanks @obviyus. - Telegram/voice mention gating: add optional
disableAudioPreflighton group/topic config to skip mention-detection preflight transcription for inbound voice notes where operators want text-only mention checks. (#23067) Thanks @yangnim21029. - CLI/Config validation: add
openclaw config validate(with--json) to validate config files before gateway startup, and include detailed invalid-key paths in startup invalid-config errors. (#31220) thanks @Sid-Qin. - Tools/Diffs: add PDF file output support and rendering quality customization controls (
fileQuality,fileScale,fileMaxWidth) for generated diff artifacts, and document PDF as the preferred option when messaging channels compress images. (#31342) Thanks @gumadeiras. - Memory/Ollama embeddings: add
memorySearch.provider = "ollama"andmemorySearch.fallback = "ollama"support, honormodels.providers.ollamasettings for memory embedding requests, and document Ollama embedding usage. (#26349) Thanks @nico-hoff. - Zalo Personal plugin (
@openclaw/zalouser): rebuilt channel runtime to use nativezca-jsintegration in-process, removing external CLI transport usage and keeping QR/login + send/listen flows fully inside OpenClaw. - Plugin SDK/channel extensibility: expose
channelRuntimeonChannelGatewayContextso external channel plugins can access shared runtime helpers (reply/routing/session/text/media/commands) without internal imports. (#25462) Thanks @guxiaobo. - Plugin runtime/STT: add
api.runtime.stt.transcribeAudioFile(...)so extensions can transcribe local audio files through OpenClaw's configured media-understanding audio providers. (#22402) Thanks @benthecarman. - Plugin hooks/session lifecycle: include
sessionKeyinsession_start/session_endhook events and contexts so plugins can correlate lifecycle callbacks with routing identity. (#26394) Thanks @tempeste. - Hooks/message lifecycle: add internal hook events
message:transcribedandmessage:preprocessed, plus richer outboundmessage:sentcontext (isGroup,groupId) for group-conversation correlation and post-transcription automations. (#9859) Thanks @Drickon. - Media understanding/audio echo: add optional
tools.media.audio.echoTranscript+echoFormatto send a pre-agent transcript confirmation message to the originating chat, with echo disabled by default. (#32150) Thanks @AytuncYildizli. - Plugin runtime/system: expose
runtime.system.requestHeartbeatNow(...)so extensions can wake targeted sessions immediately after enqueueing system events. (#19464) Thanks @AustinEral. - Plugin runtime/events: expose
runtime.events.onAgentEventandruntime.events.onSessionTranscriptUpdatefor extension-side subscriptions, and isolate transcript-listener failures so one faulty listener cannot break the entire update fanout. (#16044) Thanks @scifantastic. - CLI/Banner taglines: add
cli.banner.taglineMode(random|default|off) to control funny tagline behavior in startup output, with docs + FAQ guidance and regression tests for config override behavior.
Breaking
- BREAKING: Onboarding now defaults
tools.profiletomessagingfor new local installs (interactive + non-interactive). New setups no longer start with broad coding/system tools unless explicitly configured. - BREAKING: ACP dispatch now defaults to enabled unless explicitly disabled (
acp.dispatch.enabled=false). If you need to pause ACP turn routing while keeping/acpcontrols, setacp.dispatch.enabled=false. Docs: https://docs.openclaw.ai/tools/acp-agents - BREAKING: Plugin SDK removed
api.registerHttpHandler(...). Plugins must register explicit HTTP routes viaapi.registerHttpRoute({ path, auth, match, handler }), and dynamic webhook lifecycles should useregisterPluginHttpRoute(...). - BREAKING: Zalo Personal plugin (
@openclaw/zalouser) no longer depends on externalzca-compatible CLI binaries (openzca,zca-cli) for runtime send/listen/login; operators should useopenclaw channels login --channel zalouserafter upgrade to refresh sessions in the new JS-native path.
Fixes
- Plugin command/runtime hardening: validate and normalize plugin command name/description at registration boundaries, and guard Telegram native menu normalization paths so malformed plugin command specs cannot crash startup (
trimon undefined). (#31997) Fixes #31944. Thanks @liuxiaopai-ai. - Telegram: guard duplicate-token checks and gateway startup token normalization when account tokens are missing, preventing
token.trim()crashes during status/start flows. (#31973) Thanks @ningding97. - Discord/lifecycle startup status: push an immediate
connectedstatus snapshot when the gateway is already connected before lifecycle debug listeners attach, with abort-guarding to avoid contradictory status flips during pre-aborted startup. (#32336) Thanks @mitchmcalister. - Feishu/multi-app mention routing: guard mention detection in multi-bot groups by validating mention display name alongside bot
open_id, preventing false-positive self-mentions from Feishu WebSocket remapping so only the actually mentioned bot responds underrequireMention. (#30315) Thanks @teaguexiao. - Feishu/session-memory hook parity: trigger the shared
before_resetsession-memory hook path when Feishu/newand/resetcommands execute so reset flows preserve memory behavior consistent with other channels. (#31437) Thanks @Linux2010. - Feishu/LINE group system prompts: forward per-group
systemPromptconfig into inbound contextGroupSystemPromptfor Feishu and LINE group/room events so configured group-specific behavior actually applies at dispatch time. (#31713) Thanks @whiskyboy. - Mentions/Slack formatting hardening: add null-safe guards for runtime text normalization paths so malformed/undefined text payloads do not crash mention stripping or mrkdwn conversion. (#31865) Thanks @stone-jin.
- Feishu/Plugin sdk compatibility: add safe webhook default fallbacks when loading Feishu monitor state so mixed-version installs no longer crash if older
openclaw/plugin-sdkbuilds omit webhook default constants. (#31606) - Feishu/group broadcast dispatch: add configurable multi-agent group broadcast dispatch with observer-session isolation, cross-account dedupe safeguards, and non-mention history buffering rules that avoid duplicate replay in broadcast/topic workflows. (#29575) Thanks @ohmyskyhigh.
- Gateway/Subagent TLS pairing: allow authenticated local
gateway-clientbackend self-connections to skip device pairing while still requiring pairing for non-local/direct-host paths, restoringsessions_spawnwithgateway.tls.enabled=truein Docker/LAN setups. Fixes #30740. Thanks @Sid-Qin and @vincentkoc. - Browser/CDP startup diagnostics: include Chrome stderr output and a Linux no-sandbox hint in startup timeout errors so failed launches are easier to diagnose. (#29312) Thanks @veast.
- Synology Chat/webhook ingress hardening: enforce bounded body reads (size + timeout) via shared request-body guards to prevent unauthenticated slow-body hangs before token validation. (#25831) Thanks @bmendonca3.
- Feishu/Dedup restart resilience: warm persistent dedup state into memory on monitor startup so retry events after gateway restart stay suppressed without requiring initial on-disk probe misses. (#31605)
- Voice-call/runtime lifecycle: prevent
EADDRINUSEloops by resetting failed runtime promises, making webhookstart()idempotent with the actual bound port, and fully cleaning up webhook/tunnel/tailscale resources after startup failures. (#32395) Thanks @scoootscooob. - Gateway/Security hardening: tie loopback-origin dev allowance to actual local socket clients (not Host header claims), add explicit warnings/metrics when
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallbackaccepts websocket origins, harden safe-regex detection for quantified ambiguous alternation patterns (for example(a|aa)+), and bound large regex-evaluation inputs for session-filter and log-redaction paths. - Gateway/Plugin HTTP hardening: require explicit
authfor plugin route registration...
openclaw 2026.3.2-beta.1
Immutable
release. Only release title and notes can be modified.
Changes
- Secrets/SecretRef coverage: expand SecretRef support across the full supported user-supplied credential surface (64 targets total), including runtime collectors,
openclaw secretsplanning/apply/audit flows, onboarding SecretInput UX, and related docs; unresolved refs now fail fast on active surfaces while inactive surfaces report non-blocking diagnostics. (#29580) Thanks @joshavant. - Tools/PDF analysis: add a first-class
pdftool with native Anthropic and Google PDF provider support, extraction fallback for non-native models, configurable defaults (agents.defaults.pdfModel,pdfMaxBytesMb,pdfMaxPages), and docs/tests covering routing, validation, and registration. (#31319) Thanks @tyler6204. - Outbound adapters/plugins: add shared
sendPayloadsupport across direct-text-media, Discord, Slack, WhatsApp, Zalo, and Zalouser with multi-media iteration and chunk-aware text fallback. (#30144) Thanks @nohat. - Models/MiniMax: add first-class
MiniMax-M2.5-highspeedsupport across built-in provider catalogs, onboarding flows, and MiniMax OAuth plugin defaults, while keeping legacyMiniMax-M2.5-Lightningcompatibility for existing configs. - Sessions/Attachments: add inline file attachment support for
sessions_spawn(subagent runtime only) with base64/utf8 encoding, transcript content redaction, lifecycle cleanup, and configurable limits viatools.sessions_spawn.attachments. (#16761) Thanks @napetrov. - Telegram/Streaming defaults: default
channels.telegram.streamingtopartial(fromoff) so new Telegram setups get live preview streaming out of the box, with runtime fallback to message-edit preview when native drafts are unavailable. - Telegram/DM streaming: use
sendMessageDraftfor private preview streaming, keep reasoning/answer preview lanes separated in DM reasoning-stream mode. (#31824) Thanks @obviyus. - Telegram/voice mention gating: add optional
disableAudioPreflighton group/topic config to skip mention-detection preflight transcription for inbound voice notes where operators want text-only mention checks. (#23067) Thanks @yangnim21029. - CLI/Config validation: add
openclaw config validate(with--json) to validate config files before gateway startup, and include detailed invalid-key paths in startup invalid-config errors. (#31220) thanks @Sid-Qin. - Tools/Diffs: add PDF file output support and rendering quality customization controls (
fileQuality,fileScale,fileMaxWidth) for generated diff artifacts, and document PDF as the preferred option when messaging channels compress images. (#31342) Thanks @gumadeiras. - Memory/Ollama embeddings: add
memorySearch.provider = "ollama"andmemorySearch.fallback = "ollama"support, honormodels.providers.ollamasettings for memory embedding requests, and document Ollama embedding usage. (#26349) Thanks @nico-hoff. - Zalo Personal plugin (
@openclaw/zalouser): rebuilt channel runtime to use nativezca-jsintegration in-process, removing external CLI transport usage and keeping QR/login + send/listen flows fully inside OpenClaw. - Plugin SDK/channel extensibility: expose
channelRuntimeonChannelGatewayContextso external channel plugins can access shared runtime helpers (reply/routing/session/text/media/commands) without internal imports. (#25462) Thanks @guxiaobo. - Plugin runtime/STT: add
api.runtime.stt.transcribeAudioFile(...)so extensions can transcribe local audio files through OpenClaw's configured media-understanding audio providers. (#22402) Thanks @benthecarman. - Plugin hooks/session lifecycle: include
sessionKeyinsession_start/session_endhook events and contexts so plugins can correlate lifecycle callbacks with routing identity. (#26394) Thanks @tempeste. - Hooks/message lifecycle: add internal hook events
message:transcribedandmessage:preprocessed, plus richer outboundmessage:sentcontext (isGroup,groupId) for group-conversation correlation and post-transcription automations. (#9859) Thanks @Drickon. - Media understanding/audio echo: add optional
tools.media.audio.echoTranscript+echoFormatto send a pre-agent transcript confirmation message to the originating chat, with echo disabled by default. (#32150) Thanks @AytuncYildizli. - Plugin runtime/system: expose
runtime.system.requestHeartbeatNow(...)so extensions can wake targeted sessions immediately after enqueueing system events. (#19464) Thanks @AustinEral. - Plugin runtime/events: expose
runtime.events.onAgentEventandruntime.events.onSessionTranscriptUpdatefor extension-side subscriptions, and isolate transcript-listener failures so one faulty listener cannot break the entire update fanout. (#16044) Thanks @scifantastic. - CLI/Banner taglines: add
cli.banner.taglineMode(random|default|off) to control funny tagline behavior in startup output, with docs + FAQ guidance and regression tests for config override behavior.
Breaking
- BREAKING: Onboarding now defaults
tools.profiletomessagingfor new local installs (interactive + non-interactive). New setups no longer start with broad coding/system tools unless explicitly configured. - BREAKING: ACP dispatch now defaults to enabled unless explicitly disabled (
acp.dispatch.enabled=false). If you need to pause ACP turn routing while keeping/acpcontrols, setacp.dispatch.enabled=false. Docs: https://docs.openclaw.ai/tools/acp-agents - BREAKING: Plugin SDK removed
api.registerHttpHandler(...). Plugins must register explicit HTTP routes viaapi.registerHttpRoute({ path, auth, match, handler }), and dynamic webhook lifecycles should useregisterPluginHttpRoute(...). - BREAKING: Zalo Personal plugin (
@openclaw/zalouser) no longer depends on externalzca-compatible CLI binaries (openzca,zca-cli) for runtime send/listen/login; operators should useopenclaw channels login --channel zalouserafter upgrade to refresh sessions in the new JS-native path.
Fixes
- Plugin command/runtime hardening: validate and normalize plugin command name/description at registration boundaries, and guard Telegram native menu normalization paths so malformed plugin command specs cannot crash startup (
trimon undefined). (#31997) Fixes #31944. Thanks @liuxiaopai-ai. - Telegram: guard duplicate-token checks and gateway startup token normalization when account tokens are missing, preventing
token.trim()crashes during status/start flows. (#31973) Thanks @ningding97. - Discord/lifecycle startup status: push an immediate
connectedstatus snapshot when the gateway is already connected before lifecycle debug listeners attach, with abort-guarding to avoid contradictory status flips during pre-aborted startup. (#32336) Thanks @mitchmcalister. - Feishu/LINE group system prompts: forward per-group
systemPromptconfig into inbound contextGroupSystemPromptfor Feishu and LINE group/room events so configured group-specific behavior actually applies at dispatch time. (#31713) Thanks @whiskyboy. - Mentions/Slack formatting hardening: add null-safe guards for runtime text normalization paths so malformed/undefined text payloads do not crash mention stripping or mrkdwn conversion. (#31865) Thanks @stone-jin.
- Feishu/Plugin sdk compatibility: add safe webhook default fallbacks when loading Feishu monitor state so mixed-version installs no longer crash if older
openclaw/plugin-sdkbuilds omit webhook default constants. (#31606) - Feishu/group broadcast dispatch: add configurable multi-agent group broadcast dispatch with observer-session isolation, cross-account dedupe safeguards, and non-mention history buffering rules that avoid duplicate replay in broadcast/topic workflows. (#29575) Thanks @ohmyskyhigh.
- Gateway/Subagent TLS pairing: allow authenticated local
gateway-clientbackend self-connections to skip device pairing while still requiring pairing for non-local/direct-host paths, restoringsessions_spawnwithgateway.tls.enabled=truein Docker/LAN setups. Fixes #30740. Thanks @Sid-Qin and @vincentkoc. - Browser/CDP startup diagnostics: include Chrome stderr output and a Linux no-sandbox hint in startup timeout errors so failed launches are easier to diagnose. (#29312) Thanks @veast.
- Synology Chat/webhook ingress hardening: enforce bounded body reads (size + timeout) via shared request-body guards to prevent unauthenticated slow-body hangs before token validation. (#25831) Thanks @bmendonca3.
- Feishu/Dedup restart resilience: warm persistent dedup state into memory on monitor startup so retry events after gateway restart stay suppressed without requiring initial on-disk probe misses. (#31605)
- Voice-call/runtime lifecycle: prevent
EADDRINUSEloops by resetting failed runtime promises, making webhookstart()idempotent with the actual bound port, and fully cleaning up webhook/tunnel/tailscale resources after startup failures. (#32395) Thanks @scoootscooob. - Gateway/Security hardening: tie loopback-origin dev allowance to actual local socket clients (not Host header claims), add explicit warnings/metrics when
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallbackaccepts websocket origins, harden safe-regex detection for quantified ambiguous alternation patterns (for example(a|aa)+), and bound large regex-evaluation inputs for session-filter and log-redaction paths. - Gateway/Plugin HTTP hardening: require explicit
authfor plugin route registration, add route ownership guards for duplicatepath+matchregistrations, centralize plugin path matching/auth logic into dedicated modules, and share webhook target-route lifecycle wiring across channel monitors to avoid stale or conflicting registrations. Thanks @tdjackey for reporting. - Browser/Profile defaults: prefer
openclawprofile overchromein headless/no-sandbox environments unless an explicitdefaultProfileis configured. (#14944) Thanks @BenediktSchackenberg. - Gateway/WS security: keep plaintext
ws://loopback-only by default, w...
openclaw 2026.3.1
Immutable
release. Only release title and notes can be modified.
Changes
- Agents/Thinking defaults: set
adaptiveas the default thinking level for Anthropic Claude 4.6 models (including Bedrock Claude 4.6 refs) while keeping other reasoning-capable models atlowunless explicitly configured. - Gateway/Container probes: add built-in HTTP liveness/readiness endpoints (
/health,/healthz,/ready,/readyz) for Docker/Kubernetes health checks, with fallback routing so existing handlers on those paths are not shadowed. (#31272) Thanks @vincentkoc. - Android/Nodes: add
camera.list,device.permissions,device.health, andnotifications.actions(open/dismiss/reply) on Android nodes, plus first-class node-tool actions for the new device/notification commands. (#28260) Thanks @obviyus. - Discord/Thread bindings: replace fixed TTL lifecycle with inactivity (
idleHours, default 24h) plus optional hardmaxAgeHourslifecycle controls, and add/session idle+/session max-agecommands for focused thread-bound sessions. (#27845) Thanks @osolmaz. - Telegram/DM topics: add per-DM
direct+ topic config (allowlists,dmPolicy,skills,systemPrompt,requireTopic), route DM topics as distinct inbound/outbound sessions, and enforce topic-aware authorization/debounce for messages, callbacks, commands, and reactions. Landed from contributor PR #30579 by @kesor. Thanks @kesor. - Web UI/Cron i18n: localize cron page labels, filters, form help text, and validation/error messaging in English and zh-CN. (#29315) Thanks @BUGKillerKing.
- OpenAI/Streaming transport: make
openaiResponses WebSocket-first by default (transport: "auto"with SSE fallback), add shared OpenAI WS stream/connection runtime wiring with per-session cleanup, and preserve server-side compaction payload mutation (store+context_management) on the WS path. - Android/Gateway capability refresh: add live Android capability integration coverage and node canvas capability refresh wiring, plus runtime hardening for A2UI readiness retries, scoped canvas URL normalization, debug diagnostics JSON, and JavaScript MIME delivery. (#28388) Thanks @obviyus.
- Android/Nodes parity: add
system.notify,photos.latest,contacts.search/contacts.add,calendar.events/calendar.add, andmotion.activity/motion.pedometer, with motion sensor-aware command gating and improved activity sampling reliability. (#29398) Thanks @obviyus. - CLI/Config: add
openclaw config fileto print the active config file path resolved fromOPENCLAW_CONFIG_PATHor the default location. (#26256) thanks @cyb1278588254. - Feishu/Docx tables + uploads: add
feishu_docactions for Docx table creation/cell writing (create_table,write_table_cells,create_table_with_values) and image/file uploads (upload_image,upload_file) with stricter create/upload error handling for missingdocument_idand placeholder cleanup failures. (#20304) Thanks @xuhao1. - Feishu/Reactions: add inbound
im.message.reaction.created_v1handling, route verified reactions through synthetic inbound turns, and harden verification with timeout + fail-closed filtering so non-bot or unverified reactions are dropped. (#16716) Thanks @schumilin. - Feishu/Chat tooling: add
feishu_chattool actions for chat info and member queries, with configurable enablement underchannels.feishu.tools.chat. (#14674) Thanks @liuweifly. - Feishu/Doc permissions: support optional owner permission grant fields on
feishu_doccreate and report permission metadata only when the grant call succeeds, with regression coverage for success/failure/omitted-owner paths. (#28295) Thanks @zhoulongchao77. - Web UI/i18n: add German (
de) locale support and auto-render language options from supported locale constants in Overview settings. (#28495) thanks @dsantoreis. - Tools/Diffs: add a new optional
diffsplugin tool for read-only diff rendering from before/after text or unified patches, with gateway viewer URLs for canvas and PNG image output. Thanks @gumadeiras. - Memory/LanceDB: support custom OpenAI
baseUrland embedding dimensions for LanceDB memory. (#17874) Thanks @rish2jain and @vincentkoc. - ACP/ACPX streaming: pin ACPX plugin support to
0.1.15, add configurable ACPX command/version probing, and streamline ACP stream delivery (final_onlydefault + reduced tool-event noise) with matching runtime and test updates. (#30036) Thanks @osolmaz. - Shell env markers: set
OPENCLAW_SHELLacross shell-like runtimes (exec,acp,acp-client,tui-local) so shell startup/config rules can target OpenClaw contexts consistently, and document the markers in env/exec/acp/TUI docs. Thanks @vincentkoc. - Cron/Heartbeat light bootstrap context: add opt-in lightweight bootstrap mode for automation runs (
--light-contextfor cron agent turns andagents.*.heartbeat.lightContextfor heartbeat), keeping onlyHEARTBEAT.mdfor heartbeat runs and skipping bootstrap-file injection for cron lightweight runs. (#26064) Thanks @jose-velez. - OpenAI/WebSocket warm-up: add optional OpenAI Responses WebSocket warm-up (
response.createwithgenerate:false), enable it by default foropenai/*, and exposeparams.openaiWsWarmupfor per-model enable/disable control. - Agents/Subagents runtime events: replace ad-hoc subagent completion system-message handoff with typed internal completion events (
task_completion) that are rendered consistently across direct and queued announce paths, with gateway/CLI plumbing for structuredinternalEvents.
Fixes
- Android/Nodes reliability: reject
facing=bothwhendeviceIdis set to avoid mislabeled duplicate captures, allow notificationopen/replyon non-clearable entries while still gating dismiss, trigger listener rebind before notification actions, and scale invoke-result ack timeout to invoke budget for large clip payloads. (#28260) Thanks @obviyus. - Windows/Plugin install: avoid
spawn EINVALon Windows npm/npx invocations by resolving tonode+ npm CLI scripts instead of spawning.cmddirectly. Landed from contributor PR #31147 by @codertony. Thanks @codertony. - LINE/Voice transcription: classify M4A voice media as
audio/mp4(notvideo/mp4) by checking the MPEG-4ftypmajor brand (M4A/M4B), restoring voice transcription for LINE voice messages. Landed from contributor PR #31151 by @scoootscooob. Thanks @scoootscooob. - Slack/Announce target account routing: enable session-backed announce-target lookup for Slack so multi-account announces resolve the correct
accountIdinstead of defaulting to bot-token context. Landed from contributor PR #31028 by @taw0002. Thanks @taw0002. - Android/Voice screen TTS: stream assistant speech via ElevenLabs WebSocket in Talk Mode, stop cleanly on speaker mute/barge-in, and ignore stale out-of-order stream events. (#29521) Thanks @gregmousseau.
- Android/Photos permissions: declare Android 14+ selected-photo access permission (
READ_MEDIA_VISUAL_USER_SELECTED) and align Android permission/settings paths with current minSdk behavior for more reliable permission state handling. - Web UI/Cron: include configured agent model defaults/fallbacks in cron model suggestions so scheduled-job model autocomplete reflects configured models. (#29709) Thanks @Sid-Qin.
- Cron/Delivery: disable the agent messaging tool when
delivery.modeis"none"so cron output is not sent to Telegram or other channels. (#21808) Thanks @lailoo. - CLI/Cron: clarify
cron listoutput by renamingAgenttoAgent IDand adding aModelcolumn for isolated agent-turn jobs. (#26259) Thanks @openperf. - Feishu/Reply media attachments: send Feishu reply
mediaUrl/mediaUrlspayloads as attachments alongside text/streamed replies in the reply dispatcher, including legacy fallback whenmediaUrlsis empty. (#28959) Thanks @icesword0760. - Slack/User-token resolution: normalize Slack account user-token sourcing through resolved account metadata (
SLACK_USER_TOKENenv + config) so monitor reads, Slack actions, directory lookups, onboarding allow-from resolution, and capabilities probing consistently use the effective user token. (#28103) Thanks @Glucksberg. - Feishu/Outbound session routing: stop assuming bare
oc_identifiers are always group chats, honor explicitdm:/group:prefixes foroc_chat IDs, and default ambiguous bareoc_targets to direct routing to avoid DM session misclassification. (#10407) Thanks @Bermudarat. - Feishu/Group session routing: add configurable group session scopes (
group,group_sender,group_topic,group_topic_sender) with legacytopicSessionMode=enabledcompatibility so Feishu group conversations can isolate sessions by sender/topic as configured. (#17798) Thanks @yfge. - Feishu/Reply-in-thread routing: add
replyInThreadconfig (disabled|enabled) for group replies, propagatereply_in_threadacross text/card/media/streaming sends, and align topic-scoped session routing so newly created reply threads stay on the same session root. (#27325) Thanks @kcinzgg. - Feishu/Probe status caching: cache successful
probeFeishu()bot-info results for 10 minutes (bounded cache with per-account keying) to reduce repeated status/onboarding probe API calls, while bypassing cache for failures and exceptions. (#28907) Thanks @Glucksberg. - Feishu/Opus media send type: send
.opusattachments withmsg_type: "audio"(instead of"media") so Feishu voice messages deliver correctly while.mp4remainsmsg_type: "media"and documents remainmsg_type: "file". (#28269) Thanks @Glucksberg. - Feishu/Mobile video media type: treat inbound
message_type: "media"as video-equivalent for media key extraction, placeholder inference, and media download resolution so mobile-app video sends ingest correctly. (#25502) Thanks @4ier. - Feishu/Inbound sender fallback: fall back to
sender_id.user_idwhensender_id.open_idis missing on inbound events, and use ID-type-aware sender lookup so mobile-delivered messages keep stable sender identity/routing. (#26703)...
openclaw 2026.2.26
Immutable
release. Only release title and notes can be modified.
Changes
- Highlight: External Secrets Management introduces a full
openclaw secretsworkflow (audit,configure,apply,reload) with runtime snapshot activation, strictsecrets applytarget-path validation, safer migration scrubbing, ref-only auth-profile support, and dedicated docs. (#26155) Thanks @joshavant. - ACP/Thread-bound agents: make ACP agents first-class runtimes for thread sessions with
acpspawn/send dispatch integration, acpx backend bridging, lifecycle controls, startup reconciliation, runtime cleanup, and coalesced thread replies. (#23580) thanks @osolmaz. - Agents/Routing CLI: add
openclaw agents bindings,openclaw agents bind, andopenclaw agents unbindfor account-scoped route management, including channel-only to account-scoped binding upgrades, role-aware binding identity handling, plugin-resolved binding account IDs, and optional account-binding prompts inopenclaw channels add. (#27195) thanks @gumadeiras. - Codex/WebSocket transport: make
openai-codexWebSocket-first by default (transport: "auto"with SSE fallback), keep explicit per-model/runtime transport overrides, and add regression coverage + docs for transport selection. - Onboarding/Plugins: let channel plugins own interactive onboarding flows with optional
configureInteractiveandconfigureWhenConfiguredhooks while preserving the generic fallback path. (#27191) thanks @gumadeiras. - Auth/Onboarding: add an explicit account-risk warning and confirmation gate before starting Gemini CLI OAuth, and document the caution in provider docs and the Gemini CLI auth plugin README. (#16683) Thanks @vincentkoc.
- Android/Nodes: add Android
devicecapability plusdevice.statusanddevice.infonode commands, including runtime handler wiring and protocol/registry coverage for device status/info payloads. (#27664) Thanks @obviyus. - Android/Nodes: add
notifications.listsupport on Android nodes and exposenodes notifications_listin agent tooling for listing active device notifications. (#27344) thanks @obviyus. - Docs/Contributing: add Nimrod Gutman to the maintainer roster in
CONTRIBUTING.md. (#27840) Thanks @ngutman.
Fixes
- Telegram/DM allowlist runtime inheritance: enforce
dmPolicy: "allowlist"allowFromrequirements using effective account-plus-parent config across account-capable channels (Telegram, Discord, Slack, Signal, iMessage, IRC, BlueBubbles, WhatsApp), and alignopenclaw doctorchecks to the same inheritance logic so DM traffic is not silently dropped after upgrades. (#27936) Thanks @widingmarcus-cyber. - Delivery queue/recovery backoff: prevent retry starvation by persisting
lastAttemptAton failed sends and deferring recovery retries until each entry'slastAttemptAt + backoffwindow is eligible, while continuing to recover ready entries behind deferred ones. Landed from contributor PR #27710 by @Jimmy-xuzimo. Thanks @Jimmy-xuzimo. - Gemini OAuth/Auth flow: align OAuth project discovery metadata and endpoint fallback handling for Gemini CLI auth, including fallback coverage for environment-provided project IDs. (#16684) Thanks @vincentkoc.
- Google Chat/Lifecycle: keep Google Chat
startAccountpending until abort in webhook mode so startup is no longer interpreted as immediate exit, preventing auto-restart loops and webhook-target churn. (#27384) thanks @junsuwhy. - Temp dirs/Linux umask: force
0700permissions after temp-dir creation and self-heal existing writable temp dirs before trust checks soumask 0002installs no longer crash-loop on startup. Landed from contributor PR #27860 by @stakeswky. (#27853) Thanks @stakeswky. - Nextcloud Talk/Lifecycle: keep
startAccountpending until abort and stop the webhook monitor on shutdown, preventingEADDRINUSErestart loops when the gateway manages account lifecycle. (#27897) - Microsoft Teams/File uploads: acknowledge
fileConsent/invokeimmediately (invokeResponsebefore upload + file card send) so Teams no longer shows false "Something went wrong" timeout banners while upload completion continues asynchronously; includes updated async regression coverage. Landed from contributor PR #27641 by @scz2011. - Queue/Drain/Cron reliability: harden lane draining with guaranteed
drainingflag reset on synchronous pump failures, reject new queue enqueues during gateway restart drain windows (instead of silently killing accepted tasks), add/stopqueued-backlog cutoff metadata with stale-message skipping (while avoiding cross-session native-stop cutoff bleed), and raise isolated cronagentTurnouter safety timeout to avoid false 10-minute timeout races against longer agent session timeouts. (#27407, #27332, #27427) - Typing/Main reply pipeline: always mark dispatch idle in
agent-runnerfinalization so typing cleanup runs even when dispatcheronIdledoes not fire, preventing stuck typing indicators after run completion. (#27250) Thanks @Sid-Qin. - Typing/TTL safety net: add max-duration guardrails to shared typing callbacks so stuck lifecycle edges auto-stop typing indicators even when explicit idle/cleanup signals are missed. (#27428) Thanks @Crpdim.
- Typing/Cross-channel leakage: unify run-scoped typing suppression for cross-channel/internal-webchat routes, preserve current inbound origin as embedded run message channel context, harden shared typing keepalive with consecutive-failure circuit breaker edge-case handling, and enforce dispatcher completion/idle waits in extension dispatcher callsites (Feishu, Matrix, Mattermost, MSTeams) so typing indicators always clean up on success/error paths. Related: #27647, #27493, #27598. Supersedes/replaces draft PRs: #27640, #27593, #27540.
- Telegram/sendChatAction 401 handling: add bounded exponential backoff + temporary local typing suppression after repeated unauthorized failures to stop unbounded
sendChatActionretry loops that can trigger Telegram abuse enforcement and bot deletion. (#27415) Thanks @widingmarcus-cyber. - Telegram/Webhook startup: clarify webhook config guidance, allow
channels.telegram.webhookPort: 0for ephemeral listener binding, and log both the local listener URL and Telegram-advertised webhook URL with the bound port. (#25732) thanks @huntharo. - Config/Doctor allowlist safety: reject
dmPolicy: "allowlist"configs with emptyallowFrom, add Telegram account-level inheritance-aware validation, and teachopenclaw doctor --fixto restore missingallowFromentries from pairing-store files when present, preventing silent DM drops after upgrades. (#27936) Thanks @widingmarcus-cyber. - Browser/Chrome extension handshake: bind relay WS message handling before
onopenand add non-blockingconnect.challengeresponse handling for gateway-style handshake frames, avoiding stuck…badge states when challenge frames arrive immediately on connect. Landed from contributor PR #22571 by @pandego. (#22553) - Browser/Extension relay init: dedupe concurrent same-port relay startup with shared in-flight initialization promises so callers await one startup lifecycle and receive consistent success/failure results. Landed from contributor PR #21277 by @HOYALIM. (Related #20688)
- Browser/Fill relay + CLI parity: accept
act.fillfields without explicittypeby defaulting missing/emptytypetotextin both browser relay route parsing andopenclaw browser fillCLI field parsing, so relay calls no longer fail when the model omits field type metadata. Landed from contributor PR #27662 by @Uface11. (#27296) Thanks @Uface11. - Feishu/Permission error dispatch: merge sender-name permission notices into the main inbound dispatch so one user message produces one agent turn/reply (instead of a duplicate permission-notice turn), with regression coverage. (#27381) thanks @byungsker.
- Agents/Canvas default node resolution: when multiple connected canvas-capable nodes exist and no single
mac-*candidate is selected, default to the first connected candidate instead of failing withnode requiredfor implicit-node canvas tool calls. Landed from contributor PR #27444 by @carbaj03. Thanks @carbaj03. - TUI/stream assembly: preserve streamed text across real tool-boundary drops without keeping stale streamed text when non-text blocks appear only in the final payload. Landed from contributor PR #27711 by @scz2011. (#27674)
- Hooks/Internal
message:sent: forwardsessionKeyon outbound sends from agent delivery, cron isolated delivery, gateway receipt acks, heartbeat sends, session-maintenance warnings, and restart-sentinel recovery so internalmessage:senthooks consistently dispatch with session context, includingopenclaw agent --deliverruns resumed via--session-id(without explicit--session-key). Landed from contributor PR #27584 by @qualiobra. Thanks @qualiobra. - Pi image-token usage: stop re-injecting history image blocks each turn, process image references from the current prompt only, and prune already-answered user-image blocks in stored history to prevent runaway token growth. (#27602)
- BlueBubbles/SSRF: auto-allowlist the configured
serverUrlhostname for attachment fetches so localhost/private-IP BlueBubbles setups are no longer false-blocked by default SSRF checks. Landed from contributor PR #27648 by @lailoo. (#27599) Thanks @taylorhou for reporting. - Agents/Compaction + onboarding safety: prevent destructive double-compaction by stripping stale assistant usage around compaction boundaries, skipping post-compaction custom metadata writes in the same attempt, and cancelling safeguard compaction when there are no real conversation messages to summarize; harden workspace/bootstrap detection for memory-backed workspaces; and change
openclaw onboard --resetdefault scope toconfig+creds+sessions(workspace deletion now requires--reset-scope full). (#26458, #27314) Thanks @jaden-clovervnd, @Sid-Qin, and @widingmarcus-cyber for fix direction in #26502, #26529, and #27492. - NO_REPLY suppression: suppress
NO_REPLYbefore ...
openclaw 2026.2.25
Immutable
release. Only release title and notes can be modified.
Changes
- Android/Chat: improve streaming delivery handling and markdown rendering quality in the native Android chat UI, including better GitHub-flavored markdown behavior. (#26079) Thanks @obviyus.
- Android/Startup perf: defer foreground-service startup, move WebView debugging init out of critical startup, and add startup macrobenchmark + low-noise perf CLI scripts for deterministic cold-start tracking. (#26659) Thanks @obviyus.
- UI/Chat compose: add mobile stacked layout for compose action buttons on small screens to improve send/session controls usability. (#11167) Thanks @junyiz.
- Heartbeat/Config: replace heartbeat DM toggle with
agents.defaults.heartbeat.directPolicy(allow|block; also supported per-agent viaagents.list[].heartbeat.directPolicy) for clearer delivery semantics. - Onboarding/Security: clarify onboarding security notices that OpenClaw is personal-by-default (single trusted operator boundary) and shared/multi-user setups require explicit lock-down/hardening.
- Branding/Docs + Apple surfaces: replace remaining
bot.moltlaunchd label, bundle-id, logging subsystem, and command examples withai.openclawacross docs, iOS app surfaces, helper scripts, and CLI test fixtures. - Agents/Config: remind agents to call
config.schemabefore config edits or config-field questions to avoid guessing. Thanks @thewilloftheshadow. - Dependencies: update workspace dependency pins and lockfile (Bedrock SDK
3.998.0,@mariozechner/pi-*0.55.1, TypeScript native preview7.0.0-dev.20260225.1) while keeping@buape/carbonpinned.
Breaking
- BREAKING: Heartbeat direct/DM delivery default is now
allowagain. To keep DM-blocked behavior from2026.2.24, setagents.defaults.heartbeat.directPolicy: "block"(or per-agent override).
Fixes
- Agents/Subagents delivery: refactor subagent completion announce dispatch into an explicit queue/direct/fallback state machine, recover outbound channel-plugin resolution in cold/stale plugin-registry states across announce/message/gateway send paths, finalize cleanup bookkeeping when announce flow rejects, and treat Telegram sends without
message_idas delivery failures (instead of false-success"unknown"IDs). (#26867, #25961, #26803, #25069, #26741) Thanks @SmithLabsLLC and @docaohieu2808. - Telegram/Webhook: pre-initialize webhook bots, switch webhook processing to callback-mode JSON handling, and preserve full near-limit payload reads under delayed handlers to prevent webhook request hangs and dropped updates. (#26156)
- Slack/Session threads: prevent oversized parent-session inheritance from silently bricking new thread sessions, surface embedded context-overflow empty-result failures to users, and add configurable
session.parentForkMaxTokens(default100000,0disables). (#26912) Thanks @markshields-tl. - Cron/Message multi-account routing: honor explicit
delivery.accountIdfor isolated cron delivery resolution, and whenmessage.sendomitsaccountId, fall back to the sending agent's bound channel account instead of defaulting to the global account. (#27015, #26975) Thanks @lbo728 and @stakeswky. - Gateway/Message media roots: thread
agentIdthrough gatewaysendRPC and prefer explicitagentIdover session/default resolution so non-default agent workspace media sends no longer fail withLocalMediaAccessError; added regression coverage for agent precedence and blank-agent fallback. (#23249) Thanks @Sid-Qin. - Followups/Routing: when explicit origin routing fails, allow same-channel fallback dispatch (while still blocking cross-channel fallback) so followup replies do not get dropped on transient origin-adapter failures. (#26109) Thanks @Sid-Qin.
- Cron/Announce duplicate guard: track attempted announce/direct delivery separately from confirmed
delivered, and suppress fallback main-session cron summaries when delivery was already attempted to avoid duplicate end-user sends in uncertain-ack paths. (#27018) - LINE/Lifecycle: keep LINE
startAccountpending until abort so webhook startup is no longer misread as immediate channel exit, preventing restart-loop storms on LINE provider boot. (#26528) Thanks @Sid-Qin. - Discord/Gateway: capture and drain startup-time gateway
errorevents before lifecycle listeners attach so earlyFatal Gateway error: 4014closes surface as actionable intent guidance instead of uncaught gateway crashes. (#23832) Thanks @theotarr. - Discord/Inbound text: preserve embed
title+descriptionfallback text in message and forwarded snapshot parsing so embed titles are not silently dropped from agent input. (#26946) Thanks @stakeswky. - Slack/Inbound media fallback: deliver file-only messages even when Slack media downloads fail by adding a filename placeholder fallback, capping fallback names to the shared media-file limit, and normalizing empty filenames to
fileso attachment-only messages are not silently dropped. (#25181) Thanks @justinhuangcode. - Telegram/Preview cleanup: keep finalized text previews when a later assistant message is media-only (for example mixed text plus voice turns) by skipping finalized preview archival at assistant-message boundaries, preventing cleanup from deleting already-visible final text messages. (#27042)
- Telegram/Markdown spoilers: keep valid
||spoiler||pairs while leaving unmatched trailing||delimiters as literal text, avoiding false all-or-nothing spoiler suppression. (#26105) Thanks @Sid-Qin. - Slack/Allowlist channels: match channel IDs case-insensitively during channel allowlist resolution so lowercase config keys (for example
c0abc12345) correctly match Slack runtime IDs (C0ABC12345) undergroupPolicy: "allowlist", preventing silent channel-event drops. (#26878) Thanks @lbo728. - Discord/Typing indicator: prevent stuck typing indicators by sealing channel typing keepalive callbacks after idle/cleanup and ensuring Discord dispatch always marks typing idle even if preview-stream cleanup fails. (#26295) Thanks @ngutman.
- Channels/Typing indicator: guard typing keepalive start callbacks after idle/cleanup close so post-close ticks cannot re-trigger stale typing indicators. (#26325) Thanks @win4r.
- Followups/Typing indicator: ensure followup turns mark dispatch idle on every exit path (including
NO_REPLY, empty payloads, and agent errors) so typing keepalive cleanup always runs and channel typing indicators do not get stuck after queued/silent followups. (#26881) Thanks @codexGW. - Voice-call/TTS tools: hide the
ttstool when the message provider isvoice, preventing voice-call runs from selecting self-playback TTS and falling into silent no-output loops. (#27025) - Agents/Tools: normalize non-standard plugin tool results that omit
contentso embedded runs no longer crash withCannot read properties of undefined (reading 'filter')after tool completion (includingtesseramemo_query). (#27007) - Cron/Model overrides: when isolated
payload.modelis no longer allowlisted, fall back to default model selection instead of failing the job, while still returning explicit errors for invalid model strings. (#26717) Thanks @Youyou972. - Agents/Model fallback: keep explicit text + image fallback chains reachable even when
agents.defaults.modelsallowlists are present, prefer explicit runagentIdover session-key parsing for followup fallback override resolution (with session-key fallback), treat agent-level fallback overrides as configured in embedded runner preflight, and classifymodel_cooldown/cooling downerrors asrate_limitso failover continues. (#11972, #24137, #17231) - Agents/Model fallback: keep same-provider fallback chains active when session model differs from configured primary, infer cooldown reason from provider profile state (instead of
disabledReasononly), keep no-profile fallback providers eligible (env/models.json paths), and only relax same-provider cooldown fallback attempts forrate_limit. (#23816) thanks @ramezgaberiel. - Agents/Model fallback: continue fallback traversal on unrecognized errors when candidates remain, while still throwing the original unknown error on the last candidate. (#26106) Thanks @Sid-Qin.
- Models/Auth probes: map permanent auth failover reasons (
auth_permanent, for example revoked keys) into probe auth status instead ofunknown, soopenclaw models status --probereports actionable auth failures. (#25754) thanks @rrenamed. - Hooks/Inbound metadata: include
guildIdandchannelNameinmessage_receivedmetadata for both plugin and internal hook paths. (#26115) Thanks @davidrudduck. - Discord/Component auth: evaluate guild component interactions with command-gating authorizers so unauthorized users no longer get
CommandAuthorized: trueon modal/button events. (#26119) Thanks @bmendonca3. - Security/Gateway auth: require pairing for operator device-identity sessions authenticated with shared token auth so unpaired devices cannot self-assign operator scopes. Thanks @tdjackey for reporting.
- Security/Gateway WebSocket auth: enforce origin checks for direct browser WebSocket clients beyond Control UI/Webchat, apply password-auth failure throttling to browser-origin loopback attempts (including localhost), and block silent auto-pairing for non-Control-UI browser clients to prevent cross-origin brute-force and session takeover chains. This ships in the next npm release (
2026.2.25). Thanks @luz-oasis for reporting. - Security/Gateway trusted proxy: require
operatorrole for the Control UI trusted-proxy pairing bypass so unpairednodesessions can no longer connect viaclient.id=control-uiand invoke node event methods. This ships in the next npm release (2026.2.25). Thanks @tdjackey for reporting. - Security/macOS beta onboarding: remove Anthropic OAuth sign-in and the legacy
oauth.jsononboarding path that exposed the PKCE verifier via OAuthstate; this impacted the macOS beta onboarding path only. Anthropic subscription auth is now...
openclaw 2026.2.25-beta.1
Immutable
release. Only release title and notes can be modified.
Changes
- Android/Chat: improve streaming delivery handling and markdown rendering quality in the native Android chat UI, including better GitHub-flavored markdown behavior. (#26079) Thanks @obviyus.
- Android/Startup perf: defer foreground-service startup, move WebView debugging init out of critical startup, and add startup macrobenchmark + low-noise perf CLI scripts for deterministic cold-start tracking. (#26659) Thanks @obviyus.
- UI/Chat compose: add mobile stacked layout for compose action buttons on small screens to improve send/session controls usability. (#11167) Thanks @junyiz.
- Heartbeat/Config: replace heartbeat DM toggle with
agents.defaults.heartbeat.directPolicy(allow|block; also supported per-agent viaagents.list[].heartbeat.directPolicy) for clearer delivery semantics. - Onboarding/Security: clarify onboarding security notices that OpenClaw is personal-by-default (single trusted operator boundary) and shared/multi-user setups require explicit lock-down/hardening.
- Branding/Docs + Apple surfaces: replace remaining
bot.moltlaunchd label, bundle-id, logging subsystem, and command examples withai.openclawacross docs, iOS app surfaces, helper scripts, and CLI test fixtures. - Agents/Config: remind agents to call
config.schemabefore config edits or config-field questions to avoid guessing. Thanks @thewilloftheshadow. - Dependencies: update workspace dependency pins and lockfile (Bedrock SDK
3.998.0,@mariozechner/pi-*0.55.1, TypeScript native preview7.0.0-dev.20260225.1) while keeping@buape/carbonpinned.
Fixes
- Agents/Subagents delivery: refactor subagent completion announce dispatch into an explicit queue/direct/fallback state machine, recover outbound channel-plugin resolution in cold/stale plugin-registry states across announce/message/gateway send paths, finalize cleanup bookkeeping when announce flow rejects, and treat Telegram sends without
message_idas delivery failures (instead of false-success"unknown"IDs). (#26867, #25961, #26803, #25069, #26741) Thanks @SmithLabsLLC and @docaohieu2808. - Telegram/Webhook: pre-initialize webhook bots, switch webhook processing to callback-mode JSON handling, and preserve full near-limit payload reads under delayed handlers to prevent webhook request hangs and dropped updates. (#26156)
- Slack/Session threads: prevent oversized parent-session inheritance from silently bricking new thread sessions, surface embedded context-overflow empty-result failures to users, and add configurable
session.parentForkMaxTokens(default100000,0disables). (#26912) Thanks @markshields-tl. - Cron/Message multi-account routing: honor explicit
delivery.accountIdfor isolated cron delivery resolution, and whenmessage.sendomitsaccountId, fall back to the sending agent's bound channel account instead of defaulting to the global account. (#27015, #26975) Thanks @lbo728 and @stakeswky. - Gateway/Message media roots: thread
agentIdthrough gatewaysendRPC and prefer explicitagentIdover session/default resolution so non-default agent workspace media sends no longer fail withLocalMediaAccessError; added regression coverage for agent precedence and blank-agent fallback. (#23249) Thanks @Sid-Qin. - Followups/Routing: when explicit origin routing fails, allow same-channel fallback dispatch (while still blocking cross-channel fallback) so followup replies do not get dropped on transient origin-adapter failures. (#26109) Thanks @Sid-Qin.
- Cron/Announce duplicate guard: track attempted announce/direct delivery separately from confirmed
delivered, and suppress fallback main-session cron summaries when delivery was already attempted to avoid duplicate end-user sends in uncertain-ack paths. (#27018) - LINE/Lifecycle: keep LINE
startAccountpending until abort so webhook startup is no longer misread as immediate channel exit, preventing restart-loop storms on LINE provider boot. (#26528) Thanks @Sid-Qin. - Discord/Gateway: capture and drain startup-time gateway
errorevents before lifecycle listeners attach so earlyFatal Gateway error: 4014closes surface as actionable intent guidance instead of uncaught gateway crashes. (#23832) Thanks @theotarr. - Discord/Inbound text: preserve embed
title+descriptionfallback text in message and forwarded snapshot parsing so embed titles are not silently dropped from agent input. (#26946) Thanks @stakeswky. - Slack/Inbound media fallback: deliver file-only messages even when Slack media downloads fail by adding a filename placeholder fallback, capping fallback names to the shared media-file limit, and normalizing empty filenames to
fileso attachment-only messages are not silently dropped. (#25181) Thanks @justinhuangcode. - Telegram/Preview cleanup: keep finalized text previews when a later assistant message is media-only (for example mixed text plus voice turns) by skipping finalized preview archival at assistant-message boundaries, preventing cleanup from deleting already-visible final text messages. (#27042)
- Telegram/Markdown spoilers: keep valid
||spoiler||pairs while leaving unmatched trailing||delimiters as literal text, avoiding false all-or-nothing spoiler suppression. (#26105) Thanks @Sid-Qin. - Slack/Allowlist channels: match channel IDs case-insensitively during channel allowlist resolution so lowercase config keys (for example
c0abc12345) correctly match Slack runtime IDs (C0ABC12345) undergroupPolicy: "allowlist", preventing silent channel-event drops. (#26878) Thanks @lbo728. - Discord/Typing indicator: prevent stuck typing indicators by sealing channel typing keepalive callbacks after idle/cleanup and ensuring Discord dispatch always marks typing idle even if preview-stream cleanup fails. (#26295) Thanks @ngutman.
- Channels/Typing indicator: guard typing keepalive start callbacks after idle/cleanup close so post-close ticks cannot re-trigger stale typing indicators. (#26325) Thanks @win4r.
- Followups/Typing indicator: ensure followup turns mark dispatch idle on every exit path (including
NO_REPLY, empty payloads, and agent errors) so typing keepalive cleanup always runs and channel typing indicators do not get stuck after queued/silent followups. (#26881) Thanks @codexGW. - Voice-call/TTS tools: hide the
ttstool when the message provider isvoice, preventing voice-call runs from selecting self-playback TTS and falling into silent no-output loops. (#27025) - Agents/Tools: normalize non-standard plugin tool results that omit
contentso embedded runs no longer crash withCannot read properties of undefined (reading 'filter')after tool completion (includingtesseramemo_query). (#27007) - Cron/Model overrides: when isolated
payload.modelis no longer allowlisted, fall back to default model selection instead of failing the job, while still returning explicit errors for invalid model strings. (#26717) Thanks @Youyou972. - Agents/Model fallback: keep explicit text + image fallback chains reachable even when
agents.defaults.modelsallowlists are present, prefer explicit runagentIdover session-key parsing for followup fallback override resolution (with session-key fallback), treat agent-level fallback overrides as configured in embedded runner preflight, and classifymodel_cooldown/cooling downerrors asrate_limitso failover continues. (#11972, #24137, #17231) - Agents/Model fallback: keep same-provider fallback chains active when session model differs from configured primary, infer cooldown reason from provider profile state (instead of
disabledReasononly), keep no-profile fallback providers eligible (env/models.json paths), and only relax same-provider cooldown fallback attempts forrate_limit. (#23816) thanks @ramezgaberiel. - Agents/Model fallback: continue fallback traversal on unrecognized errors when candidates remain, while still throwing the original unknown error on the last candidate. (#26106) Thanks @Sid-Qin.
- Models/Auth probes: map permanent auth failover reasons (
auth_permanent, for example revoked keys) into probe auth status instead ofunknown, soopenclaw models status --probereports actionable auth failures. (#25754) thanks @rrenamed. - Hooks/Inbound metadata: include
guildIdandchannelNameinmessage_receivedmetadata for both plugin and internal hook paths. (#26115) Thanks @davidrudduck. - Discord/Component auth: evaluate guild component interactions with command-gating authorizers so unauthorized users no longer get
CommandAuthorized: trueon modal/button events. (#26119) Thanks @bmendonca3. - Security/Gateway auth: require pairing for operator device-identity sessions authenticated with shared token auth so unpaired devices cannot self-assign operator scopes. Thanks @tdjackey for reporting.
- Security/Gateway WebSocket auth: enforce origin checks for direct browser WebSocket clients beyond Control UI/Webchat, apply password-auth failure throttling to browser-origin loopback attempts (including localhost), and block silent auto-pairing for non-Control-UI browser clients to prevent cross-origin brute-force and session takeover chains. This ships in the next npm release (
2026.2.25). Thanks @luz-oasis for reporting. - Security/Gateway trusted proxy: require
operatorrole for the Control UI trusted-proxy pairing bypass so unpairednodesessions can no longer connect viaclient.id=control-uiand invoke node event methods. This ships in the next npm release (2026.2.25). Thanks @tdjackey for reporting. - Security/macOS beta onboarding: remove Anthropic OAuth sign-in and the legacy
oauth.jsononboarding path that exposed the PKCE verifier via OAuthstate; this impacted the macOS beta onboarding path only. Anthropic subscription auth is now setup-token-only and will ship in the next npm release (2026.2.25). Thanks @zdi-disclosures for reporting. - Security/Microsoft Teams file consent: bind
fileConsent/invokeupload acceptance/decline to the origin...