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 identity name or response prefix is configured, so blank/default prefix settings no longer inject branding text unexpectedly in self-chat flows. (#27962) Thanks @ecanmor. - Memory/QMD search result decoding: accept
qmd searchhits that only includefileURIs (for exampleqmd://collection/path.md) withoutdocid, resolve them through managed collection roots, and keep multi-collection results keyed by file fallback so valid QMD hits no longer collapse to emptymemory_searchoutput. (#28181) Thanks @0x76696265. - Memory/QMD collection-name conflict recovery: when
qmd collection addfails because another collection already occupies the samepath + pattern, detect the conflicting collection fromcollection list, remove it, and retry add so agent-scoped managed collections are created deterministically instead of being silently skipped; also add warning-only fallback when qmd metadata is unavailable to avoid destructive guesses. (#25496) Thanks @Ramsbaby. - Slack/app_mention race dedupe: when
app_mentiondispatch wins while same-tsmessageprepare is still in-flight, suppress the later message dispatch so near-simultaneous Slack deliveries do not produce duplicate replies; keep single-retry behavior and add regression coverage for both dropped and successful message-prepare outcomes. (#37033) Thanks @Takhoffman. - Gateway/chat streaming tool-boundary text retention: merge assistant delta segments into per-run chat buffers so pre-tool text is preserved in live chat deltas/finals when providers emit post-tool assistant segments as non-prefix snapshots. (#36957) Thanks @Datyedyeguy.
- TUI/model indicator freshness: prevent stale session snapshots from overwriting freshly patched model selection (and reset per-session freshness when switching session keys) so
/modelupdates reflect immediately instead of lagging by one or more commands. (#21255) Thanks @kowza. - TUI/final-error rendering fallback: when a chat
finalevent has no renderable assistant content but includes envelopeerrorMessage, render the formatted error text instead of collapsing to"(no output)", preserving actionable failure context in-session. (#14687) Thanks @Mquarmoc. - TUI/session-key alias event matching: treat chat events whose session keys are canonical aliases (for example
agent:<id>:mainvsmain) as the same session while preserving cross-agent isolation, so assistant replies no longer disappear or surface in another terminal window due to strict key-form mismatch. (#33937) Thanks @yjh1412. - OpenAI Codex OAuth/login parity: keep
openclaw models auth login --provider openai-codexon the built-in path even without provider plugins, preserve Pi-generated authorize URLs without local scope rewriting, and stop validating successful Codex sign-ins against the public OpenAI Responses API after callback. (#37558; follow-up to #36660 and #24720) Thanks @driesvints, @Skippy-Gunboat, and @obviyus. - Agents/config schema lookup: add
gatewaytool actionconfig.schema.lookupso agents can inspect one config path at a time before edits without loading the full schema into prompt context. (#37266) Thanks @gumadeiras. - Onboarding/API key input hardening: strip non-Latin1 Unicode artifacts from normalized secret input (while preserving Latin-1 content and internal spaces) so malformed copied API keys cannot trigger HTTP header
ByteStringconstruction crashes; adds regression coverage for shared normalization and MiniMax auth header usage. (#24496) Thanks @fa6maalassaf. - Kimi Coding/Anthropic tools compatibility: normalize
anthropic-messagestool payloads to OpenAI-styletools[].function+ compatibletool_choicewhen targeting Kimi Coding endpoints, restoring tool-call workflows that regressed after v2026.3.2. (#37038) Thanks @mochimochimochi-hub. - Heartbeat/workspace-path guardrails: append explicit workspace
HEARTBEAT.mdpath guidance (anddocs/heartbeat.mdavoidance) to heartbeat prompts so heartbeat runs target workspace checklists reliably across packaged install layouts. (#37037) Thanks @stofancy. - Subagents/kill-complete announce race: when a late
subagent-completelifecycle event arrives after an earlier kill marker, clear stale kill suppression/cleanup flags and re-run announce cleanup so finished runs no longer get silently swallowed. (#37024) Thanks @cmfinlan. - Agents/tool-result cleanup timeout hardening: on embedded runner teardown idle timeouts, clear pending tool-call state without persisting synthetic
missing tool resultentries, preventing timeout cleanups from poisoning follow-up turns; adds regression coverage for timeout clear-vs-flush behavior. (#37081) Thanks @Coyote-Den. - Agents/openai-completions stream timeout hardening: ensure runtime undici global dispatchers use extended streaming body/header timeouts (including env-proxy dispatcher mode) before embedded runs, reducing forced mid-stream
terminatedfailures on long generations; adds regression coverage for dispatcher selection and idempotent reconfiguration. (#9708) Thanks @scottchguard. - Agents/fallback cooldown probe execution: thread explicit rate-limit cooldown probe intent from model fallback into embedded runner auth-profile selection so same-provider fallback attempts can actually run when all profiles are cooldowned for
rate_limit(instead of failing pre-run asNo available auth profile), while preserving default cooldown skip behavior and adding regression tests at both fallback and runner layers. (#13623) Thanks @asfura. - Cron/OpenAI Codex OAuth refresh hardening: when
openai-codextoken refresh fails specifically on account-id extraction, reuse the cached access token instead of failing the run immediately, with regression coverage to keep non-Codex and unrelated refresh failures unchanged. (#36604) Thanks @laulopezreal. - TUI/session isolation for
/new: make/newallocate a uniquetui-<uuid>session key instead of resetting the shared agent session, so multiple TUI clients on the same agent stop receiving each other’s replies; also sanitize/newand/resetfailure text before rendering in-terminal. Landed from contributor PR #39238 by @widingmarcus-cyber. Thanks @widingmarcus-cyber. - Synology Chat/rate-limit env parsing: honor
SYNOLOGY_RATE_LIMIT=0as an explicit value while still falling back to the default limit for malformed env values instead of partially parsing them. Landed from contributor PR #39197 by @scoootscooob. Thanks @scoootscooob. - Voice-call/OpenAI Realtime STT config defaults: honor explicit
vadThreshold: 0andsilenceDurationMs: 0instead of silently replacing them with defaults. Landed from contributor PR #39196 by @scoootscooob. Thanks @scoootscooob. - Voice-call/OpenAI TTS speed config: honor explicit
speed: 0instead of silently replacing it with the default speed. Landed from contributor PR #39318 by @ql-wade. Thanks @ql-wade. - launchd/runtime PID parsing: reject
pid <= 0fromlaunchctl printso the daemon state parser no longer treats kernel/non-running sentinel values as real process IDs. Landed from contributor PR #39281 by @mvanhorn. Thanks @mvanhorn. - Cron/file permission hardening: enforce owner-only (
0600) cron store/backup/run-log files and harden cron store + run-log directories to0700, including pre-existing directories from older installs. (#36078) Thanks @aerelune. - Gateway/remote WS break-glass hostname support: honor
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1forws://hostname URLs (not only private IP literals) across onboarding validation and runtime gateway connection checks, while still rejecting public IP literals and non-unicast IPv6 endpoints. (#36930) Thanks @manju-rn. - Routing/binding lookup scalability: pre-index route bindings by channel/account and avoid full binding-list rescans on channel-account cache rollover, preventing multi-second
resolveAgentRoutestalls in large binding configurations. (#36915) Thanks @songchenghao. - Browser/session cleanup: track browser tabs opened by session-scoped browser tool runs and close tracked tabs during
sessions.reset/sessions.deleteruntime cleanup, preventing orphaned tabs and unbounded browser memory growth after session teardown. (#36666) Thanks @Harnoor6693. - Plugin/hook install rollback hardening: stage installs under the canonical install base, validate and run dependency installs before publish, and restore updates by rename instead of deleting the target path, reducing partial-replace and symlink-rebind risk during install failures.
- Slack/local file upload allowlist parity: propagate
mediaLocalRootsthrough the Slack send action pipeline so workspace-rooted attachments passassertLocalMediaAllowedchecks while non-allowlisted paths remain blocked. (synthesis: #36656; overlap considered from #36516, #36496, #36493, #36484, #32648, #30888) Thanks @2233admin. - Agents/compaction safeguard pre-check: skip embedded compaction before entering the Pi SDK when a session has no real conversation messages, avoiding unnecessary LLM API calls on idle sessions. (#36451) thanks @Sid-Qin.
- Config/schema cache key stability: build merged schema cache keys with incremental hashing to avoid large single-string serialization and prevent
RangeError: Invalid string lengthon high-cardinality plugin/channel metadata. (#36603) Thanks @powermaster888. - iMessage/cron completion announces: strip leaked inline reply tags (for example
[[reply_to:6100]]) from user-visible completion text so announcement deliveries do not expose threading metadata. (#24600) Thanks @vincentkoc. - Control UI/iMessage duplicate reply routing: keep internal webchat turns on dispatcher delivery (instead of origin-channel reroute) so Control UI chats do not duplicate replies into iMessage, while preserving webchat-provider relayed routing for external surfaces. Fixes #33483. Thanks @alicexmolt.
- Sessions/daily reset transcript archival: archive prior transcript files during stale-session scheduled/daily resets by capturing the previous session entry before rollover, preventing orphaned transcript files on disk. (#35493) Thanks @byungsker.
- Feishu/group slash command detection: normalize group mention wrappers before command-authorization probing so mention-prefixed commands (for example
@Bot/modeland@Bot /reset) are recognized as gateway commands instead of being forwarded to the agent. (#35994) Thanks @liuxiaopai-ai. - Control UI/auth token separation: keep the shared gateway token in browser auth validation while reserving cached device tokens for signed device payloads, preventing false
device token mismatchdisconnects after restart/rotation. Landed from contributor PR #37382 by @FradSer. Thanks @FradSer. - Gateway/browser auth reconnect hardening: stop counting missing token/password submissions as auth rate-limit failures, and stop auto-reconnecting Control UI clients on non-recoverable auth errors so misconfigured browser tabs no longer lock out healthy sessions. Landed from contributor PR #38725 by @ademczuk. Thanks @ademczuk.
- Gateway/service token drift repair: stop persisting shared auth tokens into installed gateway service units, flag stale embedded service tokens for reinstall, and treat tokenless service env as canonical so token rotation/reboot flows stay aligned with config/env resolution. Landed from contributor PR #28428 by @l0cka. Thanks @l0cka.
- Control UI/agents-page selection: keep the edited agent selected after saving agent config changes and reloading the agents list, so
/agentsno longer snaps back to the default agent. Landed from contributor PR #39301 by @MumuTW. Thanks @MumuTW. - Gateway/auth follow-up hardening: preserve systemd
EnvironmentFile=precedence/source provenance in daemon audits and doctor repairs, block shared-password override flows from piggybacking cached device tokens, and fail closed when config-first gateway SecretRefs cannot resolve. Follow-up to #39241. - Agents/context pruning: guard assistant thinking/text char estimation against malformed blocks (missing
thinking/textstrings or null entries) so pruning no longer crashes with malformed provider content. (#35146) thanks @Sid-Qin. - Agents/transcript policy: set
preserveSignaturesto Anthropic-only handling inresolveTranscriptPolicyso Anthropic thinking signatures are preserved while non-Anthropic providers remain unchanged. (#32813) thanks @Sid-Qin. - Agents/schema cleaning: detect Venice + Grok model IDs as xAI-proxied targets so unsupported JSON Schema keywords are stripped before requests, preventing Venice/Grok
Invalid argumentsfailures. (#35355) thanks @Sid-Qin. - Skills/native command deduplication: centralize skill command dedupe by canonical
skillNameinlistSkillCommandsForAgentsso duplicate suffixed variants (for example_2) are no longer surfaced across interfaces outside Discord. (#27521) thanks @shivama205. - Agents/xAI tool-call argument decoding: decode HTML-entity encoded xAI/Grok tool-call argument values (
&,",<,>, numeric entities) before tool execution so commands with shell operators and quotes no longer fail with parse errors. (#35276) Thanks @Sid-Qin. - Linux/WSL2 daemon install hardening: add regression coverage for WSL environment detection, WSL-specific systemd guidance, and
systemctl --user is-enabledfailure paths so WSL2/headless onboarding keeps treating bus-unavailable probes as non-fatal while preserving real permission errors. Related: #36495. Thanks @vincentkoc. - Linux/systemd status and degraded-session handling: treat degraded-but-reachable
systemctl --user statusresults as available, preserve early errors for truly unavailable user-bus cases, and report externally managed running services as running instead ofnot installed. Thanks @vincentkoc. - Agents/thinking-tag promotion hardening: guard
promoteThinkingTagsToBlocksagainst malformed assistant content entries (null/undefined) beforeblock.typereads so malformed provider payloads no longer crash session processing while preserving pass-through behavior. (#35143) thanks @Sid-Qin. - Gateway/Control UI version reporting: align runtime and browser client version metadata to avoid
devplaceholders, wait for bootstrap version before first UI websocket connect, and only forward bootstrapserverVersionto same-origin gateway targets to prevent cross-target version leakage. (from #35230, #30928, #33928) Thanks @Sid-Qin, @joelnishanth, and @MoerAI. - Control UI/markdown parser crash fallback: catch
marked.parse()failures and fall back to escaped plain-text<pre>rendering so malformed recursive markdown no longer crashes Control UI session rendering on load. (#36445) Thanks @BinHPdev. - Control UI/markdown fallback regression coverage: add explicit regression assertions for parser-error fallback behavior so malformed markdown no longer risks reintroducing hard-crash rendering paths in future markdown/parser upgrades. (#36445) Thanks @BinHPdev.
- Web UI/config form: treat
additionalProperties: trueobject schemas as editable map entries instead of unsupported fields so Accounts-style maps stay editable in form mode. (#35380, supersedes #32072) Thanks @stakeswky and @liuxiaopai-ai. - Feishu/streaming card delivery synthesis: unify snapshot and delta streaming merge semantics, apply overlap-aware final merge, suppress duplicate final text delivery (including text+media final packets), prefer topic-thread
message.replyrouting when a reply target exists, and tune card print cadence to avoid duplicate incremental rendering. (from #33245, #32896, #33840) Thanks @rexl2018, @kcinzgg, and @aerelune. - Feishu/group mention detection: carry startup-probed bot display names through monitor dispatch so
requireMentionchecks compare against current bot identity instead of stale config names, fixing missed@bothandling in groups while preserving multi-bot false-positive guards. (#36317, #34271) Thanks @liuxiaopai-ai. - Security/dependency audit: patch transitive Hono vulnerabilities by pinning
honoto4.12.5and@hono/node-serverto1.19.10in production resolution paths. Thanks @shakkernerd. - Security/dependency audit: bump
tarto7.5.10(from7.5.9) to address the high-severity hardlink path traversal advisory (GHSA-qffp-2rhf-9h96). Thanks @shakkernerd. - Cron/announce delivery robustness: bypass pending-descendant announce guards for cron completion sends, ensure named-agent announce routes have outbound session entries, and fall back to direct delivery only when an announce send was actually attempted and failed. (from #35185, #32443, #34987) Thanks @Sid-Qin, @scoootscooob, and @bmendonca3.
- Cron/announce best-effort fallback: run direct outbound fallback after attempted announce failures even when delivery is configured as best-effort, so Telegram cron sends are not left as attempted-but-undelivered after
cron announce delivery failedwarnings. - Auto-reply/system events: restore runtime system events to the message timeline (
System:lines), preserve think-hint parsing with prepended events, and carry events into deferred followup/collect/steer-backlog prompts to keep cache behavior stable without dropping queued metadata. (#34794) Thanks @anisoptera. - Security/audit account handling: avoid prototype-chain account IDs in audit validation by using own-property checks for
accounts. (#34982) Thanks @HOYALIM. - Cron/restart catch-up semantics: replay interrupted recurring jobs and missed immediate cron slots on startup without replaying interrupted one-shot jobs, with guarded missed-slot probing to avoid malformed-schedule startup aborts and duplicate-trigger drift after restart. (from #34466, #34896, #34625, #33206) Thanks @dunamismax, @dsantoreis, @Octane0411, and @Sid-Qin.
- Venice/provider onboarding hardening: align per-model Venice completion-token limits with discovery metadata, clamp untrusted discovery values to safe bounds, sync the static Venice fallback catalog with current live model metadata, and disable tool wiring for Venice models that do not support function calling so default Venice setups no longer fail with
max_completion_tokensor unsupported-tools 400s. Fixes #38168. Thanks @Sid-Qin, @powermaster888 and @vincentkoc. - Agents/session usage tracking: preserve accumulated usage metadata on embedded Pi runner error exits so failed turns still update session
totalTokensfrom real usage instead of stale prior values. (#34275) thanks @RealKai42. - Slack/reaction thread context routing: carry Slack native DM channel IDs through inbound context and threading tool resolution so reaction targets resolve consistently for DM
To=user:*sessions (includingtoolContext.currentChannelIdfallback behavior). (from #34831; overlaps #34440, #34502, #34483, #32754) Thanks @dunamismax. - Subagents/announce completion scoping: scope nested direct-child completion aggregation to the current requester run window, harden frozen completion capture for deterministic descendant synthesis, and route completion announce delivery through parent-agent announce turns with provenance-aware internal events. (#35080) Thanks @tyler6204.
- Nodes/system.run approval hardening: use explicit argv-mutation signaling when regenerating prepared
rawCommand, and cover thesystem.run.prepare -> system.runhandoff so direct PATH-basednodes.runcommands no longer fail withrawCommand does not match command. (#33137) thanks @Sid-Qin. - Models/custom provider headers: propagate
models.providers.<name>.headersacross inline, fallback, and registry-found model resolution so header-authenticated proxies consistently receive configured request headers. (#27490) thanks @Sid-Qin. - Ollama/remote provider auth fallback: synthesize a local runtime auth key for explicitly configured
models.providers.ollamaentries that omitapiKey, so remote Ollama endpoints run without requiring manual dummy-key setup while preserving env/profile/config key precedence and missing-config failures. (#11283) Thanks @cpreecs. - Ollama/custom provider headers: forward resolved model headers into native Ollama stream requests so header-authenticated Ollama proxies receive configured request headers. (#24337) thanks @echoVic.
- Ollama/compaction and summarization: register custom
api: "ollama"handling for compaction, branch-style internal summarization, and TTS text summarization on currentmain, so native Ollama models no longer fail withNo API provider registered for api: ollamaoutside the main run loop. Thanks @JaviLib. - Daemon/systemd install robustness: treat
systemctl --user is-enabledexit-code-4not-foundresponses as not-enabled by combining stderr/stdout detail parsing, so Ubuntu fresh installs no longer fail withsystemctl is-enabled unavailable. (#33634) Thanks @Yuandiaodiaodiao. - Slack/system-event session routing: resolve reaction/member/pin/interaction system-event session keys through channel/account bindings (with sender-aware DM routing) so inbound Slack events target the correct agent session in multi-account setups instead of defaulting to
agent:main. (#34045) Thanks @paulomcg, @daht-mad and @vincentkoc. - Slack/native streaming markdown conversion: stop pre-normalizing text passed to Slack native
markdown_textin streaming start/append/stop paths to prevent Markdown style corruption from double conversion. (#34931) - Gateway/HTTP tools invoke media compatibility: preserve raw media payload access for direct
/tools/invokeclients by allowing medianodesinvoke commands only in HTTP tool context, while keeping agent-context media invoke blocking to prevent base64 prompt bloat. (#34365) Thanks @obviyus. - Security/archive ZIP hardening: extract ZIP entries via same-directory temp files plus atomic rename, then re-open and reject post-rename hardlink alias races outside the destination root.
- Agents/Nodes media outputs: add dedicated
photos_latestaction handling, block media-returningnodes invokecommands, keep metadata-onlycamera.listinvoke allowed, and normalize emptyphotos_latestresults to a consistent response shape to prevent base64 context bloat. (#34332) Thanks @obviyus. - TUI/session-key canonicalization: normalize
openclaw tui --sessionvalues to lowercase so uppercase session names no longer drop real-time streaming updates due to gateway/TUI key mismatches. (#33866, #34013) thanks @lynnzc. - iMessage/echo loop hardening: strip leaked assistant-internal scaffolding from outbound iMessage replies, drop reflected assistant-content messages before they re-enter inbound processing, extend echo-cache text retention for delayed reflections, and suppress repeated loop traffic before it amplifies into queue overflow. (#33295) Thanks @joelnishanth.
- Skills/workspace boundary hardening: reject workspace and extra-dir skill roots or
SKILL.mdfiles whose realpath escapes the configured source root, and skip syncing those escaped skills into sandbox workspaces. - Outbound/send config threading: pass resolved SecretRef config through outbound adapters and helper send paths so send flows do not reload unresolved runtime config. (#33987) Thanks @joshavant.
- gateway: harden shared auth resolution across systemd, discord, and node host (#39241) Thanks @joshavant.
- Secrets/models.json persistence hardening: keep SecretRef-managed api keys + headers from persisting in generated models.json, expand audit/apply coverage, and harden marker handling/serialization. (#38955) Thanks @joshavant.
- Sessions/subagent attachments: remove
attachments[].content.maxLengthfromsessions_spawnschema to avoid llama.cpp GBNF repetition overflow, and preflight UTF-8 byte size before buffer allocation while keeping runtime file-size enforcement unchanged. (#33648) Thanks @anisoptera. - Runtime/tool-state stability: recover from dangling Anthropic
tool_useafter compaction, serialize long-running Discord handler runs without blocking new inbound events, and prevent stale busy snapshots from suppressing stuck-channel recovery. (from #33630, #33583) Thanks @kevinWangSheng and @theotarr. - ACP/Discord startup hardening: clean up stuck ACP worker children on gateway restart, unbind stale ACP thread bindings during Discord startup reconciliation, and add per-thread listener watchdog timeouts so wedged turns cannot block later messages. (#33699) Thanks @dutifulbob.
- Extensions/media local-root propagation: consistently forward
mediaLocalRootsthrough extensionsendMediaadapters (Google Chat, Slack, iMessage, Signal, WhatsApp), preserving non-local media behavior while restoring local attachment resolution from configured roots. Synthesis of #33581, #33545, #33540, #33536, #33528. Thanks @bmendonca3. - Gateway/plugin HTTP auth hardening: require gateway auth when any overlapping matched route needs it, block mixed-auth fallthrough at dispatch, and reject mixed-auth exact/prefix route overlaps during plugin registration.
- Feishu/video media send contract: keep mp4-like outbound payloads on
msg_type: "media"(including reply and reply-in-thread paths) so videos render as media instead of degrading to file-link behavior, while preserving existing non-video file subtype handling. (from #33720, #33808, #33678) Thanks @polooooo, @dingjianrui, and @kevinWangSheng. - Gateway/security default response headers: add
Permissions-Policy: camera=(), microphone=(), geolocation=()to baseline gateway HTTP security headers for all responses. (#30186) thanks @habakan. - Plugins/startup loading: lazily initialize plugin runtime, split startup-critical plugin SDK imports into
openclaw/plugin-sdk/coreandopenclaw/plugin-sdk/telegram, and preserveapi.runtimereflection semantics for plugin compatibility. (#28620) thanks @hmemcpy. - Plugins/startup performance: reduce bursty plugin discovery/manifest overhead with short in-process caches, skip importing bundled memory plugins that are disabled by slot selection, and speed legacy root
openclaw/plugin-sdkcompatibility via runtime root-alias routing while preserving backward compatibility. Thanks @gumadeiras. - Build/lazy runtime boundaries: replace ineffective dynamic import sites with dedicated lazy runtime boundaries across Slack slash handling, Telegram audit, CLI send deps, memory fallback, and outbound delivery paths while preserving behavior. (#33690) thanks @gumadeiras.
- Gateway/password CLI hardening: add
openclaw gateway run --password-file, warn when inline--passwordis used because it can leak via process listings, and document env/file-backed password input as the preferred startup path. Fixes #27948. Thanks @vibewrk and @vincentkoc. - Config/heartbeat legacy-path handling: auto-migrate top-level
heartbeatintoagents.defaults.heartbeat(with merge semantics that preserve explicit defaults), and keep startup failures on non-migratable legacy entries in the detailed invalid-config path instead of generic migration-failed errors. (#32706) thanks @xiwan. - Plugins/SDK subpath parity: expand plugin SDK subpaths across bundled channels/extensions (Discord, Slack, Signal, iMessage, WhatsApp, LINE, and bundled companion plugins), with build/export/type/runtime wiring so scoped imports resolve consistently in source and dist while preserving compatibility. (#33737) thanks @gumadeiras.
- Google/Gemini Flash model selection: switch built-in
gemini-flashdefaults and docs/examples from the nonexistentgoogle/gemini-3.1-flash-previewID to the workinggoogle/gemini-3-flash-preview, while normalizing legacy OpenClaw config that still uses the old Flash 3.1 alias. - Plugins/bundled scoped-import migration: migrate bundled plugins from monolithic
openclaw/plugin-sdkimports to scoped subpaths (oropenclaw/plugin-sdk/core) across registration and startup-sensitive runtime files, add CI/release guardrails to prevent regressions, and keep rootopenclaw/plugin-sdksupport for external/community plugins. Thanks @gumadeiras. - Routing/session duplicate suppression synthesis: align shared session delivery-context inheritance, channel-paired route-field merges, and reply-surface target matching so dmScope=main turns avoid cross-surface duplicate replies while thread-aware forwarding keeps intended routing semantics. (from #33629, #26889, #17337, #33250) Thanks @Yuandiaodiaodiao, @kevinwildenradt, @Glucksberg, and @bmendonca3.
- Routing/legacy session route inheritance: preserve external route metadata inheritance for legacy channel session keys (
agent:<agent>:<channel>:<peer>and...:thread:<id>) sochat.senddoes not incorrectly fall back to webchat when valid delivery context exists. Follow-up to #33786. - Routing/legacy route guard tightening: require legacy session-key channel hints to match the saved delivery channel before inheriting external routing metadata, preventing custom namespaced keys like
agent:<agent>:work:<ticket>from inheriting stale non-webchat routes. - Gateway/internal client routing continuity: prevent webchat/TUI/UI turns from inheriting stale external reply routes by requiring explicit
deliver: truefor external delivery, keeping main-session external inheritance scoped to non-Webchat/UI clients, and honoring configuredsession.mainKeywhen identifying main-session continuity. (from #35321, #34635, #35356) Thanks @alexyyyander and @Octane0411. - Security/auth labels: remove token and API-key snippets from user-facing auth status labels so
/statusand/modelsdo not expose credential fragments. (#33262) thanks @cu1ch3n. - Models/MiniMax portal vision routing: add
MiniMax-VL-01to theminimax-portalprovider, route portal image understanding through the MiniMax VLM endpoint, and align media auto-selection plus Telegram sticker description with the shared portal image provider path. (#33953) Thanks @tars90percent. - Auth/credential semantics: align profile eligibility + probe diagnostics with SecretRef/expiry rules and harden browser download atomic writes. (#33733) thanks @joshavant.
- Security/audit denyCommands guidance: suggest likely exact node command IDs for unknown
gateway.nodes.denyCommandsentries so ineffective denylist entries are easier to correct. (#29713) thanks @liquidhorizon88-bot. - Agents/overload failover handling: classify overloaded provider failures separately from rate limits/status timeouts, add short overload backoff before retry/failover, record overloaded prompt/assistant failures as transient auth-profile cooldowns (with probeable same-provider fallback) instead of treating them like persistent auth/billing failures, and keep one-shot cron retry classification aligned so overloaded fallback summaries still count as transient retries.
- Docs/security hardening guidance: document Docker
DOCKER-USER+ UFW policy and add cross-linking from Docker install docs for VPS/public-host setups. (#27613) thanks @dorukardahan. - Docs/security threat-model links: replace relative
.mdlinks with Mintlify-compatible root-relative routes in security docs to prevent broken internal navigation. (#27698) thanks @clawdoo. - Plugins/Update integrity drift: avoid false integrity drift prompts when updating npm-installed plugins from unpinned specs, while keeping drift checks for exact pinned versions. (#37179) Thanks @vincentkoc.
- iOS/Voice timing safety: guard system speech start/finish callbacks to the active utterance to avoid misattributed start events during rapid stop/restart cycles. (#33304) thanks @mbelinky; original implementation direction by @ngutman.
- Gateway/chat.send command scopes: require
operator.adminfor persistent/config set|unsetwrites routed through gateway chat clients while keeping/config showavailable to normal write-scoped operator clients, preserving messaging-channel config command behavior without widening RPC write scope into admin config mutation. Thanks @tdjackey for reporting. - iOS/Talk incremental speech pacing: allow long punctuation-free assistant chunks to start speaking at safe whitespace boundaries so voice responses begin sooner instead of waiting for terminal punctuation. (#33305) thanks @mbelinky; original implementation by @ngutman.
- iOS/Watch reply reliability: make watch session activation waiters robust under concurrent requests so status/send calls no longer hang intermittently, and align delegate callbacks with Swift 6 actor safety. (#33306) thanks @mbelinky; original implementation by @Rocuts.
- Docs/tool-loop detection config keys: align
docs/tools/loop-detection.mdexamples and field names with the currenttools.loopDetectionschema to prevent copy-paste validation failures from outdated keys. (#33182) Thanks @Mylszd. - Gateway/session agent discovery: include disk-scanned agent IDs in
listConfiguredAgentIdseven whenagents.listis configured, so disk-only/ACP agent sessions remain visible in gateway session aggregation and listings. (#32831) thanks @Sid-Qin. - Discord/inbound debouncer: skip bot-own MESSAGE_CREATE events before they reach the debounce queue to avoid self-triggered slowdowns in busy servers. Thanks @thewilloftheshadow.
- Discord/Agent-scoped media roots: pass
mediaLocalRootsthrough Discord monitor reply delivery (message + component interaction paths) so local media attachments honor per-agent workspace roots instead of falling back to default global roots. Thanks @thewilloftheshadow. - Discord/slash command handling: intercept text-based slash commands in channels, register plugin commands as native, and send fallback acknowledgments for empty slash runs so interactions do not hang. Thanks @thewilloftheshadow.
- Discord/thread session lifecycle: reset thread-scoped sessions when a thread is archived so reopening a thread starts fresh without deleting transcript history. Thanks @thewilloftheshadow.
- Discord/presence defaults: send an online presence update on ready when no custom presence is configured so bots no longer appear offline by default. Thanks @thewilloftheshadow.
- Discord/typing cleanup: stop typing indicators after silent/NO_REPLY runs by marking the run complete before dispatch idle cleanup. Thanks @thewilloftheshadow.
- ACP/sandbox spawn parity: block
/acp spawnfrom sandboxed requester sessions with the same host-runtime guard already enforced forsessions_spawn({ runtime: "acp" }), preserving non-sandbox ACP flows while closing the command-path policy gap. Thanks @patte. - Discord/config SecretRef typing: align Discord account token config typing with SecretInput so SecretRef tokens typecheck. (#32490) Thanks @scoootscooob.
- Discord/voice messages: request upload slots with JSON fetch calls so voice message uploads no longer fail with content-type errors. Thanks @thewilloftheshadow.
- Discord/voice decoder fallback: drop the native Opus dependency and use opusscript for voice decoding to avoid native-opus installs. Thanks @thewilloftheshadow.
- Discord/auto presence health signal: add runtime availability-driven presence updates plus connected-state reporting to improve health monitoring and operator visibility. (#33277) Thanks @thewilloftheshadow.
- HEIC image inputs: accept HEIC/HEIF
input_imagesources in Gateway HTTP APIs, normalize them to JPEG before provider delivery, and document the expanded default MIME allowlist. Thanks @vincentkoc. - Gateway/HEIC input follow-up: keep non-HEIC
input_imageMIME handling unchanged, make HEIC tests hermetic, and enforce chat-completionsmaxTotalImageBytesagainst post-normalization image payload size. Thanks @vincentkoc. - Telegram/draft-stream boundary stability: materialize DM draft previews at assistant-message/tool boundaries, serialize lane-boundary callbacks before final delivery, and scope preview cleanup to the active preview so multi-step Telegram streams no longer lose, overwrite, or leave stale preview bubbles. (#33842) Thanks @ngutman.
- Telegram/DM draft finalization reliability: require verified final-text draft emission before treating preview finalization as delivered, and fall back to normal payload send when final draft delivery is not confirmed (preventing missing final responses and preserving media/button delivery). (#32118) Thanks @OpenCils.
- Telegram/DM draft final delivery: materialize text-only
sendMessageDraftpreviews into one permanent final message and skip duplicate final payload sends, while preserving fallback behavior when materialization fails. (#34318) Thanks @Brotherinlaw-13. - Telegram/DM draft duplicate display: clear stale DM draft previews after materializing the real final message, including threadless fallback when DM topic lookup fails, so partial streaming no longer briefly shows duplicate replies. (#36746) Thanks @joelnishanth.
- Telegram/draft preview boundary + silent-token reliability: stabilize answer-lane message boundaries across late-partial/message-start races, preserve/reset finalized preview state at the correct boundaries, and suppress
NO_REPLYlead-fragment leaks without broad heartbeat-prefix false positives. (#33169) Thanks @obviyus. - Telegram/native commands
commands.allowFromprecedence: make native Telegram commands honorcommands.allowFromas the command-specific authorization source, including group chats, instead of falling back to channel sender allowlists. (#28216) Thanks @toolsbybuddy and @vincentkoc. - Telegram/
groupAllowFromsender-ID validation: restore sender-only runtime validation so negative chat/group IDs remain invalid entries instead of appearing accepted while still being unable to authorize group access. (#37134) Thanks @qiuyuemartin-max and @vincentkoc. - Telegram/native group command auth: authorize native commands in groups and forum topics against
groupAllowFromand per-group/topic sender overrides, while keeping auth rejection replies in the originating topic thread. (#39267) Thanks @edwluo. - Telegram/named-account DMs: restore non-default-account DM routing when a named Telegram account falls back to the default agent by keeping groups fail-closed but deriving a per-account session key for DMs, including identity-link canonicalization and regression coverage for account isolation. (from #32426; fixes #32351) Thanks @chengzhichao-xydt.
- Discord/audit wildcard warnings: ignore "*" wildcard keys when counting unresolved guild channels so doctor/status no longer warns on allow-all configs. (#33125) Thanks @thewilloftheshadow.
- Discord/channel resolution: default bare numeric recipients to channels, harden allowlist numeric ID handling with safe fallbacks, and avoid inbound WS heartbeat stalls. (#33142) Thanks @thewilloftheshadow.
- Discord/chunk delivery reliability: preserve chunk ordering when using a REST client and retry chunk sends on 429/5xx using account retry settings. (#33226) Thanks @thewilloftheshadow.
- Discord/mention handling: add id-based mention formatting + cached rewrites, resolve inbound mentions to display names, and add optional ignoreOtherMentions gating (excluding @everyone/@here). (#33224) Thanks @thewilloftheshadow.
- Discord/media SSRF allowlist: allow Discord CDN hostnames (including wildcard domains) in inbound media SSRF policy to prevent proxy/VPN fake-ip blocks. (#33275) Thanks @thewilloftheshadow.
- Telegram/device pairing notifications: auto-arm one-shot notify on
/pair qr, auto-ping on new pairing requests, and add manual fallback via/pair approve latestif the ping does not arrive. (#33299) thanks @mbelinky. - Exec heartbeat routing: scope exec-triggered heartbeat wakes to agent session keys so unrelated agents are no longer awakened by exec events, while preserving legacy unscoped behavior for non-canonical session keys. (#32724) thanks @altaywtf
- macOS/Tailscale remote gateway discovery: add a Tailscale Serve fallback peer probe path (
wss://<peer>.ts.net) when Bonjour and wide-area DNS-SD discovery return no gateways, and refresh both discovery paths from macOS onboarding. (#32860) Thanks @ngutman. - iOS/Gateway keychain hardening: move gateway metadata and TLS fingerprints to device keychain storage with safer migration behavior and rollback-safe writes to reduce credential loss risk during upgrades. (#33029) thanks @mbelinky.
- iOS/Concurrency stability: replace risky shared-state access in camera and gateway connection paths with lock-protected access patterns to reduce crash risk under load. (#33241) thanks @mbelinky.
- iOS/Security guardrails: limit production API-key sourcing to app config and make deep-link confirmation prompts safer by coalescing queued requests instead of silently dropping them. (#33031) thanks @mbelinky.
- iOS/TTS playback fallback: keep voice playback resilient by switching from PCM to MP3 when provider format support is unavailable, while avoiding sticky fallback on generic local playback errors. (#33032) thanks @mbelinky.
- Plugin outbound/text-only adapter compatibility: allow direct-delivery channel plugins that only implement
sendText(withoutsendMedia) to remain outbound-capable, gracefully fall back to text delivery for media payloads whensendMediais absent, and fail explicitly for media-only payloads with no text fallback. (#32788) thanks @liuxiaopai-ai. - Telegram/multi-account default routing clarity: warn only for ambiguous (2+) account setups without an explicit default, add
openclaw doctorwarnings for missing/invalid multi-account defaults across channels, and document explicit-default guidance for channel routing and Telegram config. (#32544) thanks @Sid-Qin. - Telegram/plugin outbound hook parity: run
message_sending+message_sentin Telegram reply delivery, include reply-path hook metadata (mediaUrls,threadId), and reportmessage_sent.success=falsewhen hooks blank text and no outbound message is delivered. (#32649) Thanks @KimGLee. - CLI/Coding-agent reliability: switch default
claude-clinon-interactive args to--permission-mode bypassPermissions, auto-normalize legacy--dangerously-skip-permissionsbackend overrides to the modern permission-mode form, align coding-agent + live-test docs with the non-PTY Claude path, and emit session system-event heartbeat notices when CLI watchdog no-output timeouts terminate runs. (#28610, #31149, #34055). Thanks @niceysam, @cryptomaltese and @vincentkoc. - Gateway/OpenAI chat completions: parse active-turn
image_urlcontent parts (including parameterized data URIs and guarded URL sources), forward them as multimodalimages, accept image-only user turns, enforce per-request image-part/byte budgets, default URL-based image fetches to disabled unless explicitly enabled by config, and redact image base64 data in cache-trace/provider payload diagnostics. (#17685) Thanks @vincentkoc - ACP/ACPX session bootstrap: retry with
sessions newwhensessions ensurereturns no session identifiers so ACP spawns avoidNO_SESSION/ACP_TURN_FAILEDfailures on affected agents. (#28786, #31338, #34055). Thanks @Sid-Qin and @vincentkoc. - ACP/sessions_spawn parent stream visibility: add
streamTo: "parent"forruntime: "acp"to forward initial child-run progress/no-output/completion updates back into the requester session as system events (instead of direct child delivery), and emit a tail-able session-scoped relay log (<sessionId>.acp-stream.jsonl, returned asstreamLogPathwhen available), improving orchestrator visibility for blocked or long-running harness turns. (#34310, #29909; reopened from #34055). Thanks @vincentkoc. - Agents/bootstrap truncation warning handling: unify bootstrap budget/truncation analysis across embedded + CLI runtime,
/context, andopenclaw doctor; addagents.defaults.bootstrapPromptTruncationWarning(off|once|always, defaultonce) and persist warning-signature metadata so truncation warnings are consistent and deduped across turns. (#32769) Thanks @gumadeiras. - Agents/Skills runtime loading: propagate run config into embedded attempt and compaction skill-entry loading so explicitly enabled bundled companion skills are discovered consistently when skill snapshots do not already provide resolved entries. Thanks @gumadeiras.
- Agents/Session startup date grounding: substitute
YYYY-MM-DDplaceholders in startup/post-compaction AGENTS context and append runtime current-time lines for/newand/resetprompts so daily-memory references resolve correctly. (#32381) Thanks @chengzhichao-xydt. - Agents/Compaction template heading alignment: update AGENTS template section names to
Session Startup/Red Linesand keep legacyEvery Session/Safetyfallback extraction so post-compaction context remains intact across template versions. (#25098) thanks @echoVic. - Agents/Compaction continuity: expand staged-summary merge instructions to preserve active task status, batch progress, latest user request, and follow-up commitments so compaction handoffs retain in-flight work context. (#8903) thanks @joetomasone.
- Agents/Compaction safeguard structure hardening: require exact fallback summary headings, sanitize untrusted compaction instruction text before prompt embedding, and keep structured sections when preserving all turns. (#25555) thanks @rodrigouroz.
- Gateway/status self version reporting: make Gateway self version in
openclaw statusprefer runtimeVERSION(while preserving explicitOPENCLAW_VERSIONoverride), preventing stale post-upgrade app version output. (#32655) thanks @liuxiaopai-ai. - Memory/QMD index isolation: set
QMD_CONFIG_DIRalongsideXDG_CONFIG_HOMEso QMD config state stays per-agent despite upstream XDG handling bugs, preventing cross-agent collection indexing and excess disk/CPU usage. (#27028) thanks @HenryLoenwind. - Memory/QMD collection safety: stop destructive collection rebinds when QMD
collection listonly reports names without path metadata, preventingmemory searchfrom dropping existing collections if re-add fails. (#36870) Thanks @Adnannnnnnna. - Memory/QMD duplicate-document recovery: detect
UNIQUE constraint failed: documents.collection, documents.pathupdate failures, rebuild managed collections once, and retry update so periodic QMD syncs recover instead of failing every run; includes regression coverage to avoid over-matching unrelated unique constraints. (#27649) Thanks @MiscMich. - Memory/local embedding initialization hardening: add regression coverage for transient initialization retry and mixed
embedQuery+embedBatchconcurrent startup to lock single-flight initialization behavior. (#15639) thanks @SubtleSpark. - CLI/Coding-agent reliability: switch default
claude-clinon-interactive args to--permission-mode bypassPermissions, auto-normalize legacy--dangerously-skip-permissionsbackend overrides to the modern permission-mode form, align coding-agent + live-test docs with the non-PTY Claude path, and emit session system-event heartbeat notices when CLI watchdog no-output timeouts terminate runs. Related to #28261. Landed from contributor PRs #28610 and #31149. Thanks @niceysam, @cryptomaltese and @vincentkoc. - ACP/ACPX session bootstrap: retry with
sessions newwhensessions ensurereturns no session identifiers so ACP spawns avoidNO_SESSION/ACP_TURN_FAILEDfailures on affected agents. Related to #28786. Landed from contributor PR #31338. Thanks @Sid-Qin and @vincentkoc. - LINE/auth boundary hardening synthesis: enforce strict LINE webhook authn/z boundary semantics across pairing-store account scoping, DM/group allowlist separation, fail-closed webhook auth/runtime behavior, and replay/duplication controls (including in-flight replay reservation and post-success dedupe marking). (from #26701, #26683, #25978, #17593, #16619, #31990, #26047, #30584, #18777) Thanks @bmendonca3, @davidahmann, @harshang03, @haosenwang1018, @liuxiaopai-ai, @coygeek, and @Takhoffman.
- LINE/media download synthesis: fix file-media download handling and M4A audio classification across overlapping LINE regressions. (from #26386, #27761, #27787, #29509, #29755, #29776, #29785, #32240) Thanks @kevinWangSheng, @loiie45e, @carrotRakko, @Sid-Qin, @codeafridi, and @bmendonca3.
- LINE/context and routing synthesis: fix group/room peer routing and command-authorization context propagation, and keep processing later events in mixed-success webhook batches. (from #21955, #24475, #27035, #28286) Thanks @lailoo, @mcaxtr, @jervyclaw, @Glucksberg, and @Takhoffman.
- LINE/status/config/webhook synthesis: fix status false positives from snapshot/config state and accept LINE webhook HEAD probes for compatibility. (from #10487, #25726, #27537, #27908, #31387) Thanks @BlueBirdBack, @stakeswky, @loiie45e, @puritysb, and @mcaxtr.
- LINE cleanup/test follow-ups: fold cleanup/test learnings into the synthesis review path while keeping runtime changes focused on regression fixes. (from #17630, #17289) Thanks @Clawborn and @davidahmann.
- Mattermost/interactive buttons: add interactive button send/callback support with directory-based channel/user target resolution, and harden callbacks via account-scoped HMAC verification plus sender-scoped DM routing. (#19957) thanks @tonydehnke.
- Feishu/groupPolicy legacy alias compatibility: treat legacy
groupPolicy: "allowall"asopenin both schema parsing and runtime policy checks so intended open-group configs no longer silently drop group messages whengroupAllowFromis empty. (from #36358) Thanks @Sid-Qin. - Mattermost/plugin SDK import policy: replace remaining monolithic
openclaw/plugin-sdkimports in Mattermost mention-gating paths/tests with scoped subpaths (openclaw/plugin-sdk/compatandopenclaw/plugin-sdk/mattermost) sopnpm checkpasseslint:plugins:no-monolithic-plugin-sdk-entry-importson baseline. (#36480) Thanks @Takhoffman. - Telegram/polls: add Telegram poll action support to channel action discovery and tool/CLI poll flows, with multi-account discoverability gated to accounts that can actually execute polls (
sendMessage+poll). (#36547) thanks @gumadeiras. - Agents/failover cooldown classification: stop treating generic
cooling downtext as providerrate_limitso healthy models no longer show false global cooldown/rate-limit warnings while explicitmodel_cooldownmarkers still trigger failover. (#32972) thanks @stakeswky. - Agents/failover service-unavailable handling: stop treating bare proxy/CDN
service unavailableerrors as provider overload while keeping them retryable via the timeout/failover path, so transient outages no longer show false rate-limit warnings or block fallback. (#36646) thanks @jnMetaCode. - Plugins/HTTP route migration diagnostics: rewrite legacy
api.registerHttpHandler(...)loader failures into actionable migration guidance so doctor/plugin diagnostics point operators toapi.registerHttpRoute(...)orregisterPluginHttpRoute(...). (#36794) Thanks @vincentkoc - Doctor/Heartbeat upgrade diagnostics: warn when heartbeat delivery is configured with an implicit
directPolicyso upgrades pin direct/DM behavior explicitly instead of relying on the current default. (#36789) Thanks @vincentkoc. - Agents/current-time UTC anchor: append a machine-readable UTC suffix alongside local
Current time:lines in shared cron-style prompt contexts so agents can compare UTC-stamped workspace timestamps without doing timezone math. (#32423) thanks @jriff. - Ollama/local model handling: preserve explicit lower
contextWindow/maxTokensoverrides during merge refresh, and keep native Ollama streamed replies from surfacing fallbackthinking/reasoningtext once real content starts streaming. (#39292) Thanks @vincentkoc. - TUI/webchat command-owner scope alignment: treat internal-channel gateway sessions with
operator.adminas owner-authorized in command auth, restoring cron/gateway/connector tool access for affected TUI/webchat sessions while keeping external channels on identity-based owner checks. (from #35666, #35673, #35704) Thanks @Naylenv, @Octane0411, and @Sid-Qin. - Discord/inbound timeout isolation: separate inbound worker timeout tracking from listener timeout budgets so queued Discord replies are no longer dropped when listener watchdog windows expire mid-run. (#36602) Thanks @dutifulbob.
- Memory/doctor SecretRef handling: treat SecretRef-backed memory-search API keys as configured, and fail embedding setup with explicit unresolved-secret errors instead of crashing. (#36835) Thanks @joshavant.
- Memory/flush default prompt: ban timestamped variant filenames during default memory flush runs so durable notes stay in the canonical daily
memory/YYYY-MM-DD.mdfile. (#34951) thanks @zerone0x. - Agents/reply delivery timing: flush embedded Pi block replies before waiting on compaction retries so already-generated assistant replies reach channels before compaction wait completes. (#35489) thanks @Sid-Qin.
- Agents/gateway config guidance: stop exposing
config.schemathrough the agentgatewaytool, remove prompt/docs guidance that told agents to call it, and keep agents onconfig.getplusconfig.patch/config.applyfor config changes. (#7382) thanks @kakuteki. - Provider/KiloCode: Keep duplicate models after malformed discovery rows, and strip legacy
reasoning_effortwhen proxy reasoning injection is skipped. (#32352) Thanks @pandemicsyn and @vincentkoc. - Agents/failover: classify periodic provider limit exhaustion text (for example
Weekly/Monthly Limit Exhausted) asrate_limitwhile keeping explicit402 Payment Requiredvariants in billing, so failover continues without misclassifying billing-wrapped quota errors. (#33813) thanks @zhouhe-xydt. - Mattermost/interactive button callbacks: allow external callback base URLs and stop requiring loopback-origin requests so button clicks work when Mattermost reaches the gateway over Tailscale, LAN, or a reverse proxy. (#37543) thanks @mukhtharcm.
- Gateway/chat.send route inheritance: keep explicit external delivery for channel-scoped sessions while preventing shared-main and other channel-agnostic webchat sessions from inheriting stale external routes, so Control UI replies stay on webchat without breaking selected channel-target sessions. (#34669) Thanks @vincentkoc.
- Telegram/Discord media upload caps: make outbound uploads honor channel
mediaMaxMbconfig, raise Telegram's default media cap to 100MB, and remove MIME fallback limits that kept some Telegram uploads at 16MB. Thanks @vincentkoc. - Skills/nano-banana-pro resolution override: respect explicit
--resolutionvalues during image editing and only auto-detect output size from input images when the flag is omitted. (#36880) Thanks @shuofengzhang and @vincentkoc. - Skills/openai-image-gen CLI validation: validate
--backgroundand--styleinputs early, normalize supported values, and warn when those flags are ignored for incompatible models. (#36762) Thanks @shuofengzhang and @vincentkoc. - Skills/openai-image-gen output formats: validate
--output-formatvalues early, normalize aliases likejpg -> jpeg, and warn when the flag is ignored for incompatible models. (#36648) Thanks @shuofengzhang and @vincentkoc. - ACP/skill env isolation: strip skill-injected API keys from ACP harness child-process environments so tools like Codex CLI keep their own auth flow instead of inheriting billed provider keys from active skills. (#36316) Thanks @taw0002 and @vincentkoc.
- WhatsApp media upload caps: make outbound media sends and auto-replies honor
channels.whatsapp.mediaMaxMbwith per-account overrides so inbound and outbound limits use the same channel config. Thanks @vincentkoc. - Windows/Plugin install: when OpenClaw runs on Windows via Bun and
npm-cli.jsis not colocated with the runtime binary, fall back tonpm.cmd/npx.cmdthrough the existingcmd.exewrapper soopenclaw plugins installno longer fails withspawn EINVAL. (#38056) Thanks @0xlin2023. - Telegram/send retry classification: retry grammY
Network request ... failed after N attemptsenvelopes in send flows without reclassifying plainNetwork request ... failed!wrappers as transient, restoring the intended retry path while keeping broad send-context message matching tight. (#38056) Thanks @0xlin2023. - Gateway/probes: keep
/health,/healthz,/ready, and/readyzreachable when the Control UI is mounted at/, preserve plugin-owned route precedence on those paths, and make/readyand/readyzreport channel-backed readiness with startup grace plus503on disconnected managed channels, while/healthand/healthzstay shallow liveness probes. (#18446) Thanks @vibecodooor, @mahsumaktas, and @vincentkoc. - Feishu/media downloads: drop invalid timeout fields from SDK method calls now that client-level
httpTimeoutMsapplies to requests. (#38267) Thanks @ant1eicher and @thewilloftheshadow. - PI embedded runner/Feishu docs: propagate sender identity into embedded attempts so Feishu doc auto-grant restores requester access for embedded-runner executions. (#32915) thanks @cszhouwei.
- Agents/usage normalization: normalize missing or partial assistant usage snapshots before compaction accounting so
openclaw agent --jsonno longer crashes when provider payloads omittotalTokensor related usage fields. (#34977) thanks @sp-hk2ldn. - Venice/default model refresh: switch the built-in Venice default to
kimi-k2-5, update onboarding aliasing, and refresh Venice provider docs/recommendations to match the current private and anonymized catalog. (from #12964) Fixes #20156. Thanks @sabrinaaquino and @vincentkoc. - Agents/skill API write pacing: add a global prompt guardrail that treats skill-driven external API writes as rate-limited by default, so runners prefer batched writes, avoid tight request loops, and respect
429/Retry-After. Thanks @vincentkoc. - Google Chat/multi-account webhook auth fallback: when
channels.googlechat.accounts.defaultcarries shared webhook audience/path settings (for example after config normalization), inherit those defaults for named accounts while preserving top-level and per-account overrides, so inbound webhook verification no longer fails silently for named accounts missing duplicated audience fields. Fixes #38369. - Models/tool probing: raise the tool-capability probe budget from 32 to 256 tokens so reasoning models that spend tokens on thinking before returning a required tool call are less likely to be misclassified as not supporting tools. (#7521) Thanks @jakobdylanc.
- Gateway/transient network classification: treat wrapped
...: fetch failedtransport messages as transient while avoiding broad matches likeWeb fetch failed (404): ..., preventing Discord reconnect wrappers from crashing the gateway without suppressing non-network tool failures. (#38530) Thanks @xinhuagu. - ACP/console silent reply suppression: filter ACP
NO_REPLYlead fragments and silent-only finals beforeopenclaw agentlogging/delivery so console-backed ACP sessions no longer leakNO/NO_REPLYplaceholders. (#38436) Thanks @ql-wade. - Feishu/reply delivery reliability: disable block streaming in Feishu reply options so plain-text auto-render replies are no longer silently dropped before final delivery. (#38258) Thanks @xinhuagu.
- Agents/reply MEDIA delivery: normalize local assistant
MEDIA:paths before block/final delivery, keep media dedupe aligned with message-tool sends, and contain malformed media normalization failures so generated files send reliably instead of falling back to empty responses. (#38572) Thanks @obviyus. - Sessions/bootstrap cache rollover invalidation: clear cached workspace bootstrap snapshots whenever an existing
sessionKeyrolls to a newsessionIdacross auto-reply, command, and isolated cron session resolvers, soAGENTS.md/MEMORY.md/USER.mdupdates are reloaded after daily, idle, or forced session resets instead of staying stale until gateway restart. (#38494) Thanks @LivingInDrm. - Gateway/Telegram polling health monitor: skip stale-socket restarts for Telegram long-polling channels and thread channel identity through shared health evaluation so polling connections are not restarted on the WebSocket stale-socket heuristic. (#38395) Thanks @ql-wade and @Takhoffman.
- Daemon/systemd fresh-install probe: check for OpenClaw's managed user unit before running
systemctl --user is-enabled, so first-time Linux installs no longer fail on generic missing-unit probe errors. (#38819) Thanks @adaHubble. - Gateway/container lifecycle: allow
openclaw gateway stopto SIGTERM unmanaged gateway listeners andopenclaw gateway restartto SIGUSR1 a single unmanaged listener when no service manager is installed, so container and supervisor-based deployments are no longer blocked byservice disabledno-op responses. Fixes #36137. Thanks @vincentkoc. - Gateway/Windows restart supervision: relaunch task-managed gateways through Scheduled Task with quoted helper-script command paths, distinguish restart-capable supervisors per platform, and stop orphaned Windows gateway children during self-restart. (#38825) Thanks @obviyus.
- Telegram/native topic command routing: resolve forum-topic native commands through the same conversation route as inbound messages so topic
agentIdoverrides and bound topic sessions target the active session instead of the default topic-parent session. (#38871) Thanks @obviyus. - Markdown/assistant image hardening: flatten remote markdown images to plain text across the Control UI, exported HTML, and shared Swift chat while keeping inline
data:image/...markdown renderable, so model output no longer triggers automatic remote image fetches. (#38895) Thanks @obviyus. - Config/compaction safeguard settings: regression-test
agents.defaults.compaction.recentTurnsPreservethroughloadConfig()and cover the new help metadata entry so the exposed preserve knob stays wired through schema validation and config UX. (#25557) thanks @rodrigouroz. - iOS/Quick Setup presentation: skip automatic Quick Setup when a gateway is already configured (active connect config, last-known connection, preferred gateway, or manual host), so reconnecting installs no longer get prompted to connect again. (#38964) Thanks @ngutman.
- CLI/Docs memory help accuracy: clarify
openclaw memory status --deepbehavior and align memory command examples/docs with the current search options. (#31803) Thanks @JasonOA888 and @Avi974. - Auto-reply/allowlist store account scoping: keep
/allowlist ... --storewrites scoped to the selected account and clear legacy unscoped entries when removing default-account store access, preventing cross-account default allowlist bleed-through from legacy pairing-store reads. Thanks @tdjackey for reporting and @vincentkoc for the fix. - Security/Nostr: harden profile mutation/import loopback guards by failing closed on non-loopback forwarded client headers (
x-forwarded-for/x-real-ip) and rejectingsec-fetch-site: cross-site; adds regression coverage for proxy-forwarded and browser cross-site mutation attempts. - CLI/bootstrap Node version hint maintenance: replace hardcoded nvm
22instructions inopenclaw.mjswithMIN_NODE_MAJORinterpolation so future minimum-Node bumps keep startup guidance in sync automatically. (#39056) Thanks @onstash. - Discord/native slash command auth: honor
commands.allowFrom.discord(andcommands.allowFrom["*"]) in guild slash-command pre-dispatch authorization so allowlisted senders are no longer incorrectly rejected as unauthorized. (#38794) Thanks @jskoiz and @thewilloftheshadow. - Outbound/message target normalization: ignore empty legacy
to/channelIdfields when explicittargetis provided so valid target-based sends no longer fail legacy-param validation; includes regression coverage. (#38944) Thanks @Narcooo. - Models/auth token prompts: guard cancelled manual token prompts so
Symbol(clack:cancel)values cannot be persisted into auth profiles; adds regression coverage for cancelledmodels auth paste-token. (#38951) Thanks @MumuTW. - Gateway/loopback announce URLs: treat
http://andhttps://aliases with the same loopback/private-network policy as websocket URLs so loopback cron announce delivery no longer fails secure URL validation. (#39064) Thanks @Narcooo. - Models/default provider fallback: when the hardcoded default provider is removed from
models.providers, resolve defaults from configured providers instead of reporting stale removed-provider defaults in status output. (#38947) Thanks @davidemanuelDEV. - Agents/cache-trace stability: guard stable stringify against circular references in trace payloads so near-limit payloads no longer crash with
Maximum call stack size exceeded; adds regression coverage. (#38935) Thanks @MumuTW. - Extensions/diffs CI stability: add
headersto thelocalReqtest helper inextensions/diffs/index.test.tsso forwarding-hint checks no longer crash withreq.headersundefined. (supersedes #39063) Thanks @Shennng. - Agents/compaction thresholding: apply
agents.defaults.contextTokenscap to the model passed into embedded run and/compactsession creation so auto-compaction thresholds use the effective context window, not native model max context. (#39099) Thanks @MumuTW. - Models/merge mode provider precedence: when
models.mode: "merge"is active and config explicitly sets a providerbaseUrl, keep config as source of truth instead of preserving stale runtimemodels.jsonbaseUrlvalues; includes normalized provider-key coverage. (#39103) Thanks @BigUncle. - UI/Control chat tool streaming: render tool events live in webchat without requiring refresh by enabling
tool-eventscapability, fixing stream/event correlation, and resetting/reloading stream state around tool results and terminal events. (#39104) Thanks @jakepresent. - Models/provider apiKey persistence hardening: when a provider
apiKeyvalue equals a known provider env var value, persist the canonical env var name intomodels.jsoninstead of resolved plaintext secrets. (#38889) Thanks @gambletan. - Discord/model picker persistence check: add a short post-dispatch settle delay before reading back session model state so picker confirmations stop reporting false mismatch warnings after successful model switches. (#39105) Thanks @akropp.
- Agents/OpenAI WS compat store flag: omit
storefromresponse.createpayloads when model compat setssupportsStore: false, preventing strict OpenAI-compatible providers from rejecting websocket requests with unknown-field errors. (#39113) Thanks @scoootscooob. - Config/validation log sanitization: sanitize config-validation issue paths/messages before logging so control characters and ANSI escape sequences cannot inject misleading terminal output from crafted config content. (#39116) Thanks @powermaster888.
- Agents/compaction counter accuracy: count successful overflow-triggered auto-compactions (
willRetry=true) in the compaction counter while still excluding aborted/no-result events, so/statusreflects actual safeguard compaction activity. (#39123) Thanks @MumuTW. - Gateway/chat delta ordering: flush buffered assistant deltas before emitting tool
startevents so pre-tool text is delivered to Control UI before tool cards, avoiding transient text/tool ordering artifacts in streaming. (#39128) Thanks @0xtangping. - Voice-call plugin schema parity: add missing manifest
configSchemafields (webhookSecurity,streaming.preStartTimeoutMs|maxPendingConnections|maxPendingConnectionsPerIp|maxConnections,staleCallReaperSeconds) so gateway AJV validation accepts already-supported runtime config instead of failing withadditionalPropertieserrors. (#38892) Thanks @giumex. - Agents/OpenAI WS reconnect retry accounting: avoid double retry scheduling when reconnect failures emit both
errorandclose, so retry budgets track actual reconnect attempts instead of exhausting early. (#39133) Thanks @scoootscooob. - Daemon/Windows schtasks runtime detection: use locale-invariant
Last Run Resultrunning codes (0x41301/267009) as the primary running signal soopenclaw node statusno longer misreports active tasks as stopped on non-English Windows locales. (#39076) Thanks @ademczuk. - Usage/token count formatting: round near-million token counts to millions (
1.0m) instead of1000k, with explicit boundary coverage for999_499and999_500. (#39129) Thanks @CurryMessi. - Gateway/session bootstrap cache invalidation ordering: clear bootstrap snapshots only after active embedded-run shutdown wait completes, preventing dying runs from repopulating stale cache between
/new/sessions.resetturns. (#38873) Thanks @MumuTW. - Browser/dispatcher error clarity: preserve dispatcher-side failure context in browser fetch errors while still appending operator guidance and explicit no-retry model hints, preventing misleading
"Can't reach service"wrapping and avoiding LLM retry loops. (#39090) Thanks @NewdlDewdl. - Telegram/polling offset safety: confirm persisted offsets before polling startup while validating stored
lastUpdateIdvalues as non-negative safe integers (with overflow guards) so malformed offset state cannot cause update skipping/dropping. (#39111) Thanks @MumuTW. - Telegram/status SecretRef read-only resolution: resolve env-backed bot-token SecretRefs in config-only/status inspection while respecting provider source/defaults and env allowlists, so status no longer crashes or reports false-ready tokens for disallowed providers. (#39130) Thanks @neocody.
- Agents/OpenAI WS max-token zero forwarding: treat
maxTokens: 0as an explicit value in websocketresponse.createpayloads (instead of dropping it as falsy), with regression coverage for zero-token forwarding. (#39148) Thanks @scoootscooob. - Podman/.env gateway bind precedence: evaluate
OPENCLAW_GATEWAY_BINDafter sourcing.envinrun-openclaw-podman.shso env-file overrides are honored. (#38785) Thanks @majinyu666. - Models/default alias refresh: bump
gpttoopenai/gpt-5.4and Gemini defaults togemini-3.1preview aliases (including normalization/default wiring) to track current model IDs. (#38638) Thanks @ademczuk. - Config/env substitution degraded mode: convert missing
${VAR}resolution in config reads from hard-fail to warning-backed degraded behavior, while preventing unresolved placeholders from being accepted as gateway credentials. (#39050) Thanks @akz142857. - Discord inbound listener non-blocking dispatch: make
MESSAGE_CREATElistener handoff asynchronous (no per-listener queue blocking), so long runs no longer stall unrelated incoming events. (#39154) Thanks @yaseenkadlemakki. - Daemon/Windows PATH freeze fix: stop persisting install-time
PATHsnapshots into Scheduled Task scripts so runtime tool lookup follows current host PATH updates; also refresh local TUI history on silent local finals. (#39139) Thanks @Narcooo. - Gateway/systemd service restart hardening: clear stale gateway listeners by explicit run-port before service bind, add restart stale-pid port-override support, tune systemd start/stop/exit handling, and disable detached child mode only in service-managed runtime so cgroup stop semantics clean up descendants reliably. (#38463) Thanks @spirittechie.
- Discord/plugin native command aliases: let plugins declare provider-specific slash names so native Discord registration can avoid built-in command collisions; the bundled Talk voice plugin now uses
/talkvoicenatively on Discord while keeping text/voice. - Daemon/Windows schtasks status normalization: derive runtime state from locale-neutral numeric
Last Run Resultcodes only (without language string matching) and surface unknown when numeric result data is unavailable, preventing locale-specific misclassification drift. (#39153) Thanks @scoootscooob. - Telegram/polling conflict recovery: reset the polling
webhookClearedlatch ongetUpdates409 conflicts so webhook cleanup re-runs on restart cycles and polling avoids infinite conflict loops. (#39205) Thanks @amittell. - Heartbeat/requests-in-flight scheduling: stop advancing
nextDueMsand avoid immediatescheduleNext()timer overrides on requests-in-flight skips, so wake-layer retry cooldowns are honored and heartbeat cadence no longer drifts under sustained contention. (#39182) Thanks @MumuTW. - Memory/SQLite contention resilience: re-apply
PRAGMA busy_timeouton every sync-store and QMD connection open so process restarts/reopens no longer revert to immediateSQLITE_BUSYfailures under lock contention. (#39183) Thanks @MumuTW. - Gateway/webchat route safety: block webchat/control-ui clients from inheriting stored external delivery routes on channel-scoped sessions (while preserving route inheritance for UI/TUI clients), preventing cross-channel leakage from scoped chats. (#39175) Thanks @widingmarcus-cyber.
- Telegram error-surface resilience: return a user-visible fallback reply when dispatch/debounce processing fails instead of going silent, while preserving draft-stream cleanup and best-effort thread-scoped fallback delivery. (#39209) Thanks @riftzen-bit.
- Gateway/password auth startup diagnostics: detect unresolved provider-reference objects in
gateway.auth.passwordand fail with a specific bootstrap-secrets error message instead of generic misconfiguration output. (#39230) Thanks @ademczuk. - Agents/OpenAI-responses compatibility: strip unsupported
storepayload fields whensupportsStore=false(including OpenAI-compatible non-OpenAI providers) while preserving server-compaction payload behavior. (#39219) Thanks @ademczuk. - Agents/model fallback visibility: warn when configured model IDs cannot be resolved and fallback is applied, with log-safe sanitization of model text to prevent control-sequence injection in warning output. (#39215) Thanks @ademczuk.
- Outbound delivery replay safety: use two-phase delivery ACK markers (
.json->.delivered-> unlink) and startup marker cleanup so crash windows between send and cleanup do not replay already-delivered messages. (#38668) Thanks @Gundam98. - Nodes/system.run approval binding: carry prepared approval plans through gateway forwarding and bind interpreter-style script operands across approval to execution, so post-approval script rewrites are denied while unchanged approved script runs keep working. Thanks @tdjackey for reporting.
- Nodes/system.run PowerShell wrapper parsing: treat
pwsh/powershell-EncodedCommandforms as shell-wrapper payloads so allowlist mode still requires approval instead of falling back to plain argv analysis. Thanks @tdjackey for reporting. - Control UI/auth error reporting: map generic browser
Fetch failedwebsocket close errors back to actionable gateway auth messages (gateway token mismatch,authentication failed,retry later) so dashboard disconnects stop hiding credential problems. Landed from contributor PR #28608 by @KimGLee. Thanks @KimGLee. - Media/mime unknown-kind handling: return
undefined(not"unknown") for missing/unrecognized MIME kinds and use document-size fallback caps for unknown remote media, preventing phantom<media:unknown>Signal events from being treated as real messages. (#39199) Thanks @nicolasgrasset. - Nodes/system.run allow-always persistence: honor shell comment semantics during allowlist analysis so
#-tailed payloads that never execute are not persisted as trusted follow-up commands. Thanks @tdjackey for reporting. - Signal/inbound attachment fan-in: forward all successfully fetched inbound attachments through
MediaPaths/MediaUrls/MediaTypes(instead of only the first), and improve multi-attachment placeholder summaries in mention-gated pending history. (#39212) Thanks @joeykrug. - Nodes/system.run dispatch-wrapper boundary: keep shell-wrapper approval classification active at the depth boundary so
envwrapper stacks cannot reach/bin/sh -cexecution without the expected approval gate. Thanks @tdjackey for reporting. - Docker/token persistence on reconfigure: reuse the existing
.envgateway token duringdocker-setup.shreruns and align compose token env defaults, so Docker installs stop silently rotating tokens and breaking existing dashboard sessions. Landed from contributor PR #33097 by @chengzhichao-xydt. Thanks @chengzhichao-xydt. - Agents/strict OpenAI turn ordering: apply assistant-first transcript bootstrap sanitization to strict OpenAI-compatible providers (for example vLLM/Gemma via
openai-completions) without adding Google-specific session markers, preventing assistant-first history rejections. (#39252) Thanks @scoootscooob. - Discord/exec approvals gateway auth: pass resolved shared gateway credentials into the Discord exec-approvals gateway client so token-auth installs stop failing approvals with
gateway token mismatch. Related to #38179. Thanks @0riginal-claw for the adjacent PR #35147 investigation. - Subagents/workspace inheritance: propagate parent workspace directory to spawned subagent runs so child sessions reliably inherit workspace-scoped instructions (
AGENTS.md,SOUL.md, etc.) without exposing workspace override through tool-call arguments. (#39247) Thanks @jasonQin6. - Exec approvals/gateway-node policy: honor explicit
ask=offfromexec-approvals.jsoneven when runtime defaults are stricter, so trusted full/off setups stop re-prompting on gateway and node exec paths. Landed from contributor PR #26789 by @pandego. Thanks @pandego. - Exec approvals/config fallback: inherit
askfromexec-approvals.jsonwhentools.exec.askis unset, so local full/off defaults no longer fall back toon-missfor exec tool andnodes run. Landed from contributor PR #29187 by @Bartok9. Thanks @Bartok9. - Exec approvals/allow-always shell scripts: persist and match script paths for wrapper invocations like
bash scripts/foo.shwhile still blocking-c/-swrapper bypasses. Landed from contributor PR #35137 by @yuweuii. Thanks @yuweuii. - Queue/followup dedupe across drain restarts: dedupe queued redelivery
message_idvalues after queue recreation so busy-session followups no longer duplicate on replayed inbound events. Landed from contributor PR #33168 by @rylena. Thanks @rylena. - Telegram/preview-final edit idempotence: treat
message is not modifiederrors during preview finalization as delivered so partial-stream final replies do not fall back to duplicate sends. Landed from contributor PR #34983 by @HOYALIM. Thanks @HOYALIM. - Telegram/DM streaming transport parity: use message preview transport for all DM streaming lanes so final delivery can edit the active preview instead of sending duplicate finals. Landed from contributor PR #38906 by @gambletan. Thanks @gambletan.
- Telegram/DM draft streaming restoration: restore native
sendMessageDraftpreview transport for DM answer streaming while keeping reasoning on message transport, with regression coverage to keep draft finalization from sending duplicate finals. (#39398) Thanks @obviyus. - Telegram/send retry safety: retry non-idempotent send paths only for pre-connect failures and make custom retry predicates strict, preventing ambiguous reconnect retries from sending duplicate messages. Landed from contributor PR #34238 by @hal-crackbot. Thanks @hal-crackbot.
- ACP/run spawn delivery bootstrap: stop reusing requester inline delivery targets for one-shot
mode: "run"ACP spawns, so fresh run-mode workers bootstrap in isolation instead of inheriting thread-bound session delivery behavior. (#39014) Thanks @lidamao633. - Discord/DM session-key normalization: rewrite legacy
discord:dm:*and phantom direct-messagediscord:channel:<user>session keys todiscord:direct:*when the sender matches, so multi-agent Discord DMs stop falling into empty channel-shaped sessions and resume replying correctly. - Discord/native slash session fallback: treat empty configured bound-session keys as missing so
/statusand other native commands fall back to the routed slash session and routed channel session instead of blanking Discord session keys in normal channel bindings. - Agents/tool-call dispatch normalization: normalize provider-prefixed tool names before dispatch across
toolCall,toolUse, andfunctionCallblocks, while preserving multi-segment tool suffixes when stripping provider wrappers so malformed-but-recoverable tool names no longer fail withTool not found. (#39328) Thanks @vincentkoc. - Agents/parallel tool-call compatibility: honor
parallel_tool_calls/parallelToolCallsextra params only foropenai-completionsandopenai-responsespayloads, preserve higher-precedence alias overrides across config and runtime layers, and ignore invalid non-boolean values so single-tool-call providers like NVIDIA-hosted Kimi stop failing on forced parallel tool-call payloads. (#37048) Thanks @vincentkoc. - Config/invalid-load fail-closed: stop converting
INVALID_CONFIGinto an empty runtime config, keep valid settings available only through explicit best-effort diagnostic reads, and route read-only CLI diagnostics through that path so unknown keys no longer silently drop security-sensitive config. (#28140) Thanks @bobsahur-robot and @vincentkoc. - Agents/codex-cli sandbox defaults: switch the built-in Codex backend from
read-onlytoworkspace-writeso spawned coding runs can edit files out of the box. Landed from contributor PR #39336 by @0xtangping. Thanks @0xtangping. - Gateway/health-monitor restart reason labeling: report
disconnectedinstead ofstuckfor clean channel disconnect restarts, so operator logs distinguish socket drops from genuinely stuck channels. (#36436) Thanks @Sid-Qin. - Control UI/agents-page overrides: auto-create minimal per-agent config entries when editing inherited agents, so model/tool/skill changes enable Save and inherited model fallbacks can be cleared by writing a primary-only override. Landed from contributor PR #39326 by @dunamismax. Thanks @dunamismax.
- Gateway/Telegram webhook-mode recovery: add
webhookCertPathto re-upload self-signed certificates during webhook registration and skip stale-socket detection for webhook-mode channels, so Telegram webhook setups survive health-monitor restarts. Landed from contributor PR #39313 by @fellanH. Thanks @fellanH. - Discord/config schema parity: add
channels.discord.agentComponentsto the strict Zod config schema so validagentComponents.enabledsettings (root and account-scoped) no longer fail with unrecognized-key validation errors. Landed from contributor PR #39378 by @gambletan. Thanks @gambletan and @thewilloftheshadow. - ACPX/MCP session bootstrap: inject configured MCP servers into ACP
session/newandsession/loadfor acpx-backed sessions, restoring Canva and other external MCP tools. Landed from contributor PR #39337. Thanks @goodspeed-apps. - Control UI/Telegram sender labels: preserve inbound sender labels in sanitized chat history so dashboard user-message groups split correctly and show real group-member names instead of
You. (#39414) Thanks @obviyus.