Notas da versão
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, with explicit break-glass private-network opt-in viaOPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1; align onboarding/client/call validation and tests to this strict-default policy. (#28670) Thanks @dashed, @vincentkoc. - OpenAI Codex OAuth/TLS prerequisites: add an OAuth TLS cert-chain preflight with actionable remediation for cert trust failures, and gate doctor TLS prerequisite probing to OpenAI Codex OAuth-configured installs (or explicit
doctor --deep) to avoid unconditional outbound probe latency. (#32051) Thanks @alexfilatov. - Security/Webhook request hardening: enforce auth-before-body parsing for BlueBubbles and Google Chat webhook handlers, add strict pre-auth body/time budgets for webhook auth paths (including LINE signature verification), and add shared in-flight/request guardrails plus regression tests/lint checks to prevent reintroducing unauthenticated slow-body DoS patterns. Thanks @GCXWLP for reporting.
- CLI/Config validation and routing hardening: dedupe
openclaw config validatefailures to a single authoritative report, expose allowed-values metadata/hints across core Zod and plugin AJV validation (including--jsonfields), sanitize terminal-rendered validation text, and make command-path parsing root-option-aware across preaction/route/lazy registration (including routedconfig get/unsetwith split root options). Thanks @gumadeiras. - Browser/Extension relay reconnect tolerance: keep
/json/versionand/cdpreachable during short MV3 worker disconnects when attached targets still exist, and retain clients across reconnect grace windows. (#30232) Thanks @Sid-Qin. - CLI/Browser start timeout: honor
openclaw browser --timeout <ms> startand stop by removing the fixed 15000ms override so slower Chrome startups can use caller-provided timeouts. (#22412, #23427) Thanks @vincentkoc. - Synology Chat/gateway lifecycle: keep
startAccountpending until abort for inactive and active account paths to prevent webhook route restart loops under gateway supervision. (#23074) Thanks @druide67. - Exec approvals/allowlist matching: escape regex metacharacters in path-pattern literals (while preserving glob wildcards), preventing crashes on allowlisted executables like
/usr/bin/g++and correctly matching mixed wildcard/literal token paths. (#32162) Thanks @stakeswky. - Synology Chat/webhook compatibility: accept JSON and alias payload fields, allow token resolution from body/query/header sources, and ACK webhook requests with
204to avoid persistentProcessing...states in Synology Chat clients. (#26635) Thanks @memphislee09-source. - Voice-call/Twilio signature verification: retry signature validation across deterministic URL port variants (with/without port) to handle mixed Twilio signing behavior behind reverse proxies and non-standard ports. (#25140) Thanks @drvoss.
- Slack/Bolt startup compatibility: remove invalid
message.channelsandmessage.groupsevent registrations so Slack providers no longer crash on startup with Bolt 4.6+; channel/group traffic continues through the unifiedmessagehandler (channel_type). (#32033) Thanks @mahopan. - Slack/socket auth failure handling: fail fast on non-recoverable auth errors (
account_inactive,invalid_auth, etc.) during startup and reconnect instead of retry-looping indefinitely, includingunable_to_socket_mode_starterror payload propagation. (#32377) Thanks @scoootscooob. - Gateway/macOS LaunchAgent hardening: write
Umask=077in generated gateway LaunchAgent plists so npm upgrades preserve owner-only default file permissions for gateway-created state files. (#31919) Fixes #31905. Thanks @liuxiaopai-ai. - macOS/LaunchAgent security defaults: write
Umask=63(octal077) into generated gateway launchd plists so post-update service reinstalls keep owner-only file permissions by default instead of falling back to system022. (#32022) Fixes #31905. Thanks @liuxiaopai-ai. - Media understanding/provider HTTP proxy routing: pass a proxy-aware fetch function from
HTTPS_PROXY/HTTP_PROXYenv vars into audio/video provider calls (with graceful malformed-proxy fallback) so transcription/video requests honor configured outbound proxies. (#27093) Thanks @mcaxtr. - Sandbox/workspace mount permissions: make primary
/workspacebind mounts read-only wheneverworkspaceAccessis notrw(includingnone) across both core sandbox container and sandbox browser create flows. (#32227) Thanks @guanyu-zhang. - Tools/fsPolicy propagation: honor
tools.fs.workspaceOnlyfor image/pdf local-root allowlists so non-sandbox media paths outside workspace are rejected when workspace-only mode is enabled. (#31882) Thanks @justinhuangcode. - Daemon/Homebrew runtime pinning: resolve Homebrew Cellar Node paths to stable Homebrew-managed symlinks (including versioned formulas like
node@22) so gateway installs keep the intended runtime across brew upgrades. (#32185) Thanks @scoootscooob. - Browser/Security output boundary hardening: replace check-then-rename output commits with root-bound fd-verified writes, unify install/skills canonical path-boundary checks, and add regression coverage for symlink-rebind race paths across browser output and shared fs-safe write flows. Thanks @tdjackey for reporting.
- Gateway/Security canonicalization hardening: decode plugin route path variants to canonical fixpoint (with bounded depth), fail closed on canonicalization anomalies, and enforce gateway auth for deeply encoded
/api/channels/*variants to prevent alternate-path auth bypass through plugin handlers. Thanks @tdjackey for reporting. - Browser/Gateway hardening: preserve env credentials for
OPENCLAW_GATEWAY_URL/CLAWDBOT_GATEWAY_URLwhile treating explicit--urlas override-only auth, and make container browser hardening flags optional with safer defaults for Docker/LXC stability. (#31504) Thanks @vincentkoc. - Gateway/Control UI basePath webhook passthrough: let non-read methods under configured
controlUiBasePathfall through to plugin routes (instead of returning Control UI 405), restoring webhook handlers behind basePath mounts. (#32311) Thanks @ademczuk. - Control UI/Legacy browser compatibility: replace
toSorted-dependent cron suggestion sorting inapp-renderwith a compatibility helper so older browsers withoutArray.prototype.toSortedno longer white-screen. (#31775) Thanks @liuxiaopai-ai. - macOS/PeekabooBridge: add compatibility socket symlinks for legacy
clawdbot,clawdis, andmoltbotApplication Support socket paths so pre-rename clients can still connect. (#6033) Thanks @lumpinif and @vincentkoc. - Gateway/message tool reliability: avoid false
Unknown channelfailures whenmessage.*actions receive platform-specific channel ids by falling back totoolContext.currentChannelProvider, and prevent health-monitor restart thrash for channels that just (re)started by adding a per-channel startup-connect grace window. (from #32367) Thanks @MunemHashmi. - Windows/Spawn canonicalization: unify non-core Windows spawn handling across ACP client, QMD/mcporter memory paths, and sandbox Docker execution using the shared wrapper-resolution policy, with targeted regression coverage for
.cmdshim unwrapping and shell fallback behavior. (#31750) Thanks @Takhoffman. - Security/ACP sandbox inheritance: enforce fail-closed runtime guardrails for
sessions_spawnwithruntime="acp"by rejecting ACP spawns from sandboxed requester sessions and rejectingsandbox="require"for ACP runtime, preventing sandbox-boundary bypass via host-side ACP initialization. (#32254) Thanks @tdjackey for reporting, and @dutifulbob for the fix. - Security/Web tools SSRF guard: keep DNS pinning for untrusted
web_fetchand citation-redirect URL checks when proxy env vars are set, and require explicit dangerous opt-in before env-proxy routing can bypass pinned dispatch for trusted/operator-controlled endpoints. Thanks @tdjackey for reporting. - Gemini schema sanitization: coerce malformed JSON Schema
propertiesvalues (null, arrays, primitives) to{}before provider validation, preventing downstream strict-validator crashes on invalid plugin/tool schemas. (#32332) Thanks @webdevtodayjason. - Media understanding/malformed attachment guards: harden attachment selection and decision summary formatting against non-array or malformed attachment payloads to prevent runtime crashes on invalid inbound metadata shapes. (#28024) Thanks @claw9267.
- Browser/Extension navigation reattach: preserve debugger re-attachment when relay is temporarily disconnected by deferring relay attach events until reconnect/re-announce, reducing post-navigation tab loss. (#28725) Thanks @stone-jin.
- Browser/Extension relay stale tabs: evict stale cached targets from
/json/listwhen extension targets are destroyed/crashed or commands fail with missing target/session errors. (#6175) Thanks @vincentkoc. - Browser/CDP startup readiness: wait for CDP websocket readiness after launching Chrome and cleanly stop/reset when readiness never arrives, reducing follow-up
PortInUseErrorraces afterbrowser start/open. (#29538) Thanks @AaronWander. - OpenAI/Responses WebSocket tool-call id hygiene: normalize blank/whitespace streamed tool-call ids before persistence, and block empty
function_call_output.call_idpayloads in the WS conversion path to avoid OpenAI 400 errors (Invalid 'input[n].call_id': empty string), with regression coverage for both inbound stream normalization and outbound payload guards. - Security/Nodes camera URL downloads: bind node
camera.snap/camera.clipURL payload downloads to the resolved node host, enforce fail-closed behavior when noderemoteIpis unavailable, and use SSRF-guarded fetch with redirect host/protocol checks to prevent off-node fetch pivots. Thanks @tdjackey for reporting. - Config/backups hardening: enforce owner-only (
0600) permissions on rotated config backups and clean orphan.bak.*files outside the managed backup ring, reducing credential leakage risk from stale or permissive backup artifacts. (#31718) Thanks @YUJIE2002. - Telegram/inbound media filenames: preserve original
file_namemetadata for document/audio/video/animation downloads (with fetch/path fallbacks), so saved inbound attachments keep sender-provided names instead of opaque Telegram file paths. (#31837) Thanks @Kay-051. - Gateway/OpenAI chat completions: honor
x-openclaw-message-channelwhen buildingagentCommandinput for/v1/chat/completions, preserving caller channel identity instead of forcingwebchat. (#30462) Thanks @bmendonca3. - Plugin SDK/runtime hardening: add package export verification in CI/release checks to catch missing runtime exports before publish-time regressions. (#28575) Thanks @Glucksberg.
- Media/MIME normalization: normalize parameterized/case-variant MIME strings in
kindFromMime(for exampleAudio/Ogg; codecs=opus) so WhatsApp voice notes are classified as audio and routed through transcription correctly. (#32280) Thanks @Lucenx9. - Discord/audio preflight mentions: detect audio attachments via Discord
content_typeand gate preflight transcription on typed text (not media placeholders), so guild voice-note mentions are transcribed and matched correctly. (#32136) Thanks @jnMetaCode. - Feishu/topic session routing: use
thread_idas topic session scope fallback whenroot_idis absent, keep first-turn topic keys stable across thread creation, and force thread replies when inbound events already carry topic/thread context. (#29788) Thanks @songyaolun. - Gateway/Webchat NO_REPLY streaming: suppress assistant lead-fragment deltas that are prefixes of
NO_REPLYand keep final-message buffering in sync, preventing partialNOleaks on silent-response runs while preserving legitimate short replies. (#32073) Thanks @liuxiaopai-ai. - Telegram/models picker callbacks: keep long model buttons selectable by falling back to compact callback payloads and resolving provider ids on selection (with provider re-prompt on ambiguity), avoiding Telegram 64-byte callback truncation failures. (#31857) Thanks @bmendonca3.
- Context-window metadata warmup: add exponential config-load retry backoff (1s -> 2s -> 4s, capped at 60s) so transient startup failures recover automatically without hot-loop retries.
- Voice-call/Twilio external outbound: auto-register webhook-first
outbound-apicalls (initiated outside OpenClaw) so media streams are accepted and call direction metadata stays accurate. (#31181) Thanks @scoootscooob. - Feishu/topic root replies: prefer
root_idas outboundreplyTargetMessageIdwhen present, and parse millisecondmessage_create_timevalues correctly so topic replies anchor to the root message in grouped thread flows. (#29968) Thanks @bmendonca3. - Feishu/DM pairing reply target: send pairing challenge replies to
chat:<chat_id>instead ofuser:<sender_open_id>so Lark/Feishu private chats with user-id-only sender payloads receive pairing messages reliably. (#31403) Thanks @stakeswky. - Feishu/Lark private DM routing: treat inbound
chat_type: "private"as direct-message context for pairing/mention-forward/reaction synthetic handling so Lark private chats behave like Feishu p2p DMs. (#31400) Thanks @stakeswky. - Signal/message actions: allow
reactto fall back totoolContext.currentMessageIdwhenmessageIdis omitted, matching Telegram behavior and unblocking agent-initiated reactions on inbound turns. (#32217) Thanks @dunamismax. - Discord/message actions: allow
reactto fall back totoolContext.currentMessageIdwhenmessageIdis omitted, matching Telegram/Signal reaction ergonomics in inbound turns. - Synology Chat/reply delivery: resolve webhook usernames to Chat API
user_idvalues for outbound chatbot replies, avoiding mismatches between webhook user IDs andmethod=chatbotrecipient IDs in multi-account setups. (#23709) Thanks @druide67. - Slack/thread context payloads: only inject thread starter/history text on first thread turn for new sessions while preserving thread metadata, reducing repeated context-token bloat on long-lived thread sessions. (#32133) Thanks @sourman.
- Slack/session routing: keep top-level channel messages in one shared session when
replyToMode=off, while preserving thread-scoped keys for true thread replies and non-off modes. (#32193) Thanks @bmendonca3. - Voice-call/webhook routing: require exact webhook path matches (instead of prefix matches) so lookalike paths cannot reach provider verification/dispatch logic. (#31930) Thanks @afurm.
- Zalo/Pairing auth tests: add webhook regression coverage asserting DM pairing-store reads/writes remain account-scoped, preventing cross-account authorization bleed in multi-account setups. (#26121) Thanks @bmendonca3.
- Zalouser/Pairing auth tests: add account-scoped DM pairing-store regression coverage (
monitor.account-scope.test.ts) to prevent cross-account allowlist bleed in multi-account setups. (#26672) Thanks @bmendonca3. - Feishu/Send target prefixes: normalize explicit
group:/dm:send targets and preserve explicit receive-id routing hints when resolving outbound Feishu targets. (#31594) Thanks @liuxiaopai-ai. - Webchat/Feishu session continuation: preserve routable
OriginatingChannel/OriginatingTometadata from session delivery context inchat.send, and prefer provider-normalized channel when deciding cross-channel route dispatch so Webchat replies continue on the selected Feishu session instead of falling back to main/internal session routing. (#31573) - Telegram/implicit mention forum handling: exclude Telegram forum system service messages (
forum_topic_*,general_forum_topic_*) from reply-chain implicit mention detection sorequireMentiondoes not get bypassed inside bot-created topic lifecycle events. (#32262) Thanks @scoootscooob. - Slack/inbound debounce routing: isolate top-level non-DM message debounce keys by message timestamp to avoid cross-thread collisions, preserve DM batching, and flush pending top-level buffers before immediate non-debounce follow-ups to keep ordering stable. (#31951) Thanks @scoootscooob.
- Feishu/Duplicate replies: suppress same-target reply dispatch when message-tool sends use generic provider metadata (
provider: "message") and normalizelark/feishuprovider aliases during duplicate-target checks, preventing double-delivery in Feishu sessions. (#31526) - Webchat/silent token leak: filter assistant
NO_REPLY-only transcript entries fromchat.historyresponses and add client-side defense-in-depth guards in the chat controller so internal silent tokens never render as visible chat bubbles. (#32015) Consolidates overlap from #32183, #32082, #32045, #32052, #32172, and #32112. Thanks @ademczuk, @liuxiaopai-ai, @ningding97, @bmendonca3, and @x4v13r1120. - Doctor/local memory provider checks: stop false-positive local-provider warnings when
provider=localand no explicitmodelPathis set by honoring default local model fallback while still warning when gateway probe reports local embeddings not ready. (#32014) Fixes #31998. Thanks @adhishthite. - Media understanding/parakeet CLI output parsing: read
parakeet-mlxtranscripts from--output-dir/<media-basename>.txtwhen txt output is requested (or default), with stdout fallback for non-txt formats. (#9177) Thanks @mac-110. - Media understanding/audio transcription guard: skip tiny/empty audio files (<1024 bytes) before provider/CLI transcription to avoid noisy invalid-audio failures and preserve clean fallback behavior. (#8388) Thanks @Glucksberg.
- Gateway/Plugin HTTP route precedence: run explicit plugin HTTP routes before the Control UI SPA catch-all so registered plugin webhook/custom paths remain reachable, while unmatched paths still fall through to Control UI handling. (#31885) Thanks @Sid-Qin.
- Gateway/Node browser proxy routing: honor
profilefrombrowser.requestJSON body when query params omit it, while preserving query-profile precedence when both are present. (#28852) Thanks @Sid-Qin. - Gateway/Control UI basePath POST handling: return 405 for
POSTon exact basePath routes (for example/openclaw) instead of redirecting, and add end-to-end regression coverage that root-mounted webhook POST paths still pass through to plugin handlers. (#31349) Thanks @Sid-Qin. - Browser/default profile selection: default
browser.defaultProfilebehavior now prefersopenclaw(managed standalone CDP) when no explicit default is configured, while still auto-provisioning thechromerelay profile for explicit opt-in use. (#32031) Fixes #31907. Thanks @liuxiaopai-ai. - Sandbox/mkdirp boundary checks: allow existing in-boundary directories to pass mkdirp boundary validation when directory open probes return platform-specific I/O errors, with regression coverage for directory-safe fallback behavior. (#31547) Thanks @stakeswky.
- Models/config env propagation: apply
config.env.varsbefore implicit provider discovery in models bootstrap so config-scoped credentials are visible to implicit provider resolution paths. (#32295) Thanks @hsiaoa. - Models/Codex usage labels: infer weekly secondary usage windows from reset cadence when API window seconds are ambiguously reported as 24h, so
openclaw models statusno longer mislabels weekly limits as daily. (#31938) Thanks @bmendonca3. - Gateway/Heartbeat model reload: treat
models.*andagents.defaults.modelconfig updates as heartbeat hot-reload triggers so heartbeat picks up model changes without a full gateway restart. (#32046) Thanks @stakeswky. - Memory/LanceDB embeddings: forward configured
embedding.dimensionsinto OpenAI embeddings requests so vector size and API output dimensions stay aligned when dimensions are explicitly configured. (#32036) Thanks @scotthuang. - Gateway/Control UI method guard: allow POST requests to non-UI routes to fall through when no base path is configured, and add POST regression coverage for fallthrough and base-path 405 behavior. (#23970) Thanks @tyler6204.
- Browser/CDP status accuracy: require a successful
Browser.getVersionresponse over the CDP websocket (not just socket-open) before reportingcdpReady, so stale idle command channels are surfaced as unhealthy. (#23427) Thanks @vincentkoc. - Daemon/systemd checks in containers: treat missing
systemctlinvocations (includingspawn systemctl ENOENT/EACCES) as unavailable service state duringis-enabledchecks, preventing container flows from failing withGateway service check failedbefore install/status handling can continue. (#26089) Thanks @sahilsatralkar and @vincentkoc. - Security/Node exec approvals: revalidate approval-bound
cwdidentity immediately before execution/forwarding and fail closed with an explicit denial whencwddrifts after approval hardening. - Security audit/skills workspace hardening: add
skills.workspace.symlink_escapewarning inopenclaw security auditwhen workspaceskills/**/SKILL.mdresolves outside the workspace root (for example symlink-chain drift), plus docs coverage in the security glossary. - Security/Node exec approvals: preserve shell/dispatch-wrapper argv semantics during approval hardening so approved wrapper commands (for example
env sh -c ...) cannot drift into a different runtime command shape, and add regression coverage for both approval-plan generation and approved runtime execution paths. Thanks @tdjackey for reporting. - Security/fs-safe write hardening: make
writeFileWithinRootuse same-directory temp writes plus atomic rename, add post-write inode/hardlink revalidation with security warnings on boundary drift, and avoid truncating existing targets when final rename fails. - Security/Skills archive extraction: unify tar extraction safety checks across tar.gz and tar.bz2 install flows, enforce tar compressed-size limits, and fail closed if tar.bz2 archives change between preflight and extraction to prevent bypasses of entry-type/size guardrails. Thanks @GCXWLP for reporting.
- Security/Prompt spoofing hardening: stop injecting queued runtime events into user-role prompt text, route them through trusted system-prompt context, and neutralize inbound spoof markers like
[System Message]and line-leadingSystem:in untrusted message content. (#30448) - Sandbox/Docker setup command parsing: accept
agents.*.sandbox.docker.setupCommandas either a string or a string array, and normalize arrays to newline-delimited shell scripts so multi-step setup commands no longer concatenate without separators. (#31953) Thanks @liuxiaopai-ai. - Sandbox/Bootstrap context boundary hardening: reject symlink/hardlink alias bootstrap seed files that resolve outside the source workspace and switch post-compaction
AGENTS.mdcontext reads to boundary-verified file opens, preventing host file content from being injected via workspace aliasing. Thanks @tdjackey for reporting. - Agents/Sandbox workdir mapping: map container workdir paths (for example
/workspace) back to the host workspace before sandbox path validation so exec requests keep the intended directory in containerized runs instead of falling back to an unavailable host path. (#31841) Thanks @liuxiaopai-ai. - Docker/Sandbox bootstrap hardening: make
OPENCLAW_SANDBOXopt-in parsing explicit (1|true|yes|on), support custom Docker socket paths viaOPENCLAW_DOCKER_SOCKET, defer docker.sock exposure until sandbox prerequisites pass, and reset/roll back persisted sandbox mode tooffwhen setup is skipped or partially fails to avoid stale broken sandbox state. (#29974) Thanks @jamtujest and @vincentkoc. - Hooks/webhook ACK compatibility: return
200(instead of202) for successful/hooks/agentrequests so providers that require200(for example Forward Email) accept dispatched agent hook deliveries. (#28204) Thanks @Glucksberg. - Feishu/Run channel fallback: prefer
ProvideroverSurfacewhen inferring queued runmessageProviderfallback (whenOriginatingChannelis missing), preventing Feishu turns from being mislabeled aswebchatin mixed relay metadata contexts. (#31880) Fixes #31859. Thanks @liuxiaopai-ai. - Skills/sherpa-onnx-tts: run the
sherpa-onnx-ttsbin under ESM (replace CommonJSrequireimports) and add regression coverage to preventrequire is not defined in ES module scopestartup crashes. (#31965) Thanks @bmendonca3. - Inbound metadata/direct relay context: restore direct-channel conversation metadata blocks for external channels (for example WhatsApp) while preserving webchat-direct suppression, so relay agents recover sender/message identifiers without reintroducing internal webchat metadata noise. (#31969) Fixes #29972. Thanks @Lucenx9.
- Slack/Channel message subscriptions: register explicit
message.channelsandmessage.groupsmonitor handlers (alongside genericmessage) so channel/group event subscriptions are consumed even when Slack dispatches typed message event names. Fixes #31674. - Hooks/session-scoped memory context: expose ephemeral
sessionIdin embedded plugin tool contexts andbefore_tool_call/after_tool_callhook contexts (including compaction and client-tool wiring) so plugins can isolate per-conversation state across/newand/reset. Related #31253 and #31304. Thanks @Sid-Qin and @Servo-AIpex. - Voice-call/Twilio inbound greeting: run answered-call initial notify greeting for Twilio instead of skipping the manager speak path, with regression coverage for both Twilio and Plivo notify flows. (#29121) Thanks @xinhuagu.
- Voice-call/stale call hydration: verify active calls with the provider before loading persisted in-progress calls so stale locally persisted records do not block or misroute new call handling after restarts. (#4325) Thanks @garnetlyx.
- Feishu/File upload filenames: percent-encode non-ASCII/special-character
file_namevalues in Feishu multipart uploads so Chinese/symbol-heavy filenames are sent as proper attachments instead of plain text links. (#31179) Thanks @Kay-051. - Media/MIME channel parity: route Telegram/Signal/iMessage media-kind checks through normalized
kindFromMimeso mixed-case/parameterized MIME values classify consistently across message channels. - WhatsApp/inbound self-message context: propagate inbound
fromMethrough the web inbox pipeline and annotate direct self messages as(self)in envelopes so agents can distinguish owner-authored turns from contact turns. (#32167) Thanks @scoootscooob. - Webchat/stream finalization: persist streamed assistant text when final events omit
message, while keeping final payload precedence and skipping empty stream buffers to prevent disappearing replies after tool turns. (#31920) Thanks @Sid-Qin. - Feishu/Inbound ordering: serialize message handling per chat while preserving cross-chat concurrency to avoid same-chat race drops under bursty inbound traffic. (#31807)
- Feishu/Typing notification suppression: skip typing keepalive reaction re-adds when the indicator is already active, preventing duplicate notification pings from repeated identical emoji adds. (#31580)
- Feishu/Probe failure backoff: cache API and timeout probe failures for one minute per account key while preserving abort-aware probe timeouts, reducing repeated health-check retries during transient credential/network outages. (#29970)
- Feishu/Streaming block fallback: preserve markdown block stream text as final streaming-card content when final payload text is missing, while still suppressing non-card internal block chunk delivery. (#30663)
- Feishu/Bitable API errors: unify Feishu Bitable tool error handling with structured
LarkApiErrorresponses and consistent API/context attribution across wiki/base metadata, field, and record operations. (#31450) - Feishu/Missing-scope grant URL fix: rewrite known invalid scope aliases (
contact:contact.base:readonly) to valid scope names in permission grant links, so remediation URLs open with correct Feishu consent scopes. (#31943) - BlueBubbles/Message metadata: harden send response ID extraction, include sender identity in DM context, and normalize inbound
message_idselection to avoid duplicate ID metadata. (#23970) Thanks @tyler6204. - WebChat/markdown tables: ensure GitHub-flavored markdown table parsing is explicitly enabled at render time and add horizontal overflow handling for wide tables, with regression coverage for table-only and mixed text+table content. (#32365) Thanks @BlueBirdBack.
- Feishu/default account resolution: always honor explicit
channels.feishu.defaultAccountduring outbound account selection (including top-level-credential setups where the preferred id is not present inaccounts), instead of silently falling back to another account id. (#32253) Thanks @bmendonca3. - Feishu/Sender lookup permissions: suppress user-facing grant prompts for stale non-existent scope errors (
contact:contact.base:readonly) during best-effort sender-name resolution so inbound messages continue without repeated false permission notices. (#31761) - Discord/dispatch + Slack formatting: restore parallel outbound dispatch across Discord channels with per-channel queues while preserving in-channel ordering, and run Slack preview/stream update text through mrkdwn normalization for consistent formatting. (#31927) Thanks @Sid-Qin.
- Feishu/Inbound debounce: debounce rapid same-chat sender bursts into one ordered dispatch turn, skip already-processed retries when composing merged text, and preserve bot-mention intent across merged entries to reduce duplicate or late inbound handling. (#31548)
- Tests/Sandbox + archive portability: use junction-compatible directory-link setup on Windows and explicit file-symlink platform guards in symlink escape tests where unprivileged file symlinks are unavailable, reducing false Windows CI failures while preserving traversal checks on supported paths. (#28747) Thanks @arosstale.
- Browser/Extension re-announce reliability: keep relay state in
connectingwhen re-announce forwarding fails and extend debugger re-attach retries after navigation to reduce false attached states and post-nav disconnect loops. (#27630) Thanks @markmusson. - Browser/Act request compatibility: accept legacy flattened
action="act"params (kind/ref/text/...) in addition torequest={...}so browser act calls no longer fail withrequest required. (#15120) Thanks @vincentkoc. - OpenRouter/x-ai compatibility: skip
reasoning.effortinjection forx-ai/*models (for example Grok) so OpenRouter requests no longer fail with invalid-arguments errors on unsupported reasoning params. (#32054) Thanks @scoootscooob. - Models/openai-completions developer-role compatibility: force
supportsDeveloperRole=falsefor non-native endpoints, treat unparseablebaseUrlvalues as non-native, and add regression coverage for empty/malformed baseUrl plus explicit-true override behavior. (#29479) thanks @akramcodez. - Browser/Profile attach-only override: support
browser.profiles.<name>.attachOnly(fallback to globalbrowser.attachOnly) so loopback proxy profiles can skip local launch/port-ownership checks without forcing attach-only mode for every profile. (#20595) Thanks @unblockedgamesstudio and @vincentkoc. - Sessions/Lock recovery: detect recycled Linux PIDs by comparing lock-file
starttimewith/proc/<pid>/statstarttime, so stale.jsonl.lockfiles are reclaimed immediately in containerized PID-reuse scenarios while preserving compatibility for older lock files. (#26443) Fixes #27252. Thanks @HirokiKobayashi-R and @vincentkoc. - Cron/isolated delivery target fallback: remove early unresolved-target return so cron delivery can flow through shared outbound target resolution (including per-channel
resolveDefaultTofallback) whendelivery.tois omitted. (#32364) Thanks @hclsys. - OpenAI media capabilities: include
audioin the OpenAI provider capability list so audio transcription models are eligible in media-understanding provider selection. (#12717) Thanks @openjay. - Browser/Managed tab cap: limit loopback managed
openclawpage tabs to 8 via best-effort cleanup after tab opens to reduce long-running renderer buildup while preserving attach-only and remote profile behavior. (#29724) Thanks @pandego. - Docker/Image health checks: add Dockerfile
HEALTHCHECKthat probes gatewayGET /healthzso container runtimes can mark unhealthy instances without requiring auth credentials in the probe command. (#11478) Thanks @U-C4N and @vincentkoc. - Gateway/Node dangerous-command parity: include
sms.sendin default onboarding nodedenyCommands, share onboarding deny defaults with the gateway dangerous-command source of truth, and includesms.sendin phone-control/phone arm writeshandling so SMS follows the same break-glass flow as other dangerous node commands. Thanks @zpbrent. - Pairing/AllowFrom account fallback: handle omitted
accountIdvalues inreadChannelAllowFromStoreandreadChannelAllowFromStoreSyncasdefault, while preserving legacy unscoped allowFrom merges for default-account flows. Thanks @Sid-Qin and @vincentkoc. - Browser/Remote CDP ownership checks: skip local-process ownership errors for non-loopback remote CDP profiles when HTTP is reachable but the websocket handshake fails, and surface the remote websocket attach/retry path instead. (#15582) Landed from contributor (#28780) Thanks @stubbi, @bsormagec, @unblockedgamesstudio and @vincentkoc.
- Browser/CDP proxy bypass: force direct loopback agent paths and scoped
NO_PROXYexpansion for localhost CDP HTTP/WS connections when proxy env vars are set, so browser relay/control still works behind global proxy settings. (#31469) Thanks @widingmarcus-cyber. - Sessions/idle reset correctness: preserve existing
updatedAtduring inbound metadata-only writes so idle-reset boundaries are not unintentionally refreshed before actual user turns. (#32379) Thanks @romeodiaz. - Sessions/lock recovery: reclaim orphan legacy same-PID lock files missing
starttimewhen no in-process lock ownership exists, avoiding false lock timeouts after PID reuse while preserving active lock safety checks. (#32081) Thanks @bmendonca3. - Sessions/store cache invalidation: reload cached session stores when file size changes within the same mtime tick by keying cache validation on a single file-stat snapshot (
mtimeMs+sizeBytes), with regression coverage for same-tick rewrites. (#32191) Thanks @jalehman. - Agents/Subagents
sessions_spawn: reject malformedagentIdinputs before normalization (for example error-message/path-like strings) to prevent unintended synthetic agent IDs and ghost workspace/session paths; includes strict validation regression coverage. (#31381) Thanks @openperf. - CLI/installer Node preflight: enforce Node.js
v22.12+consistently in bothopenclaw.mjsruntime bootstrap and installer active-shell checks, with actionable nvm recovery guidance for mismatched shell PATH/defaults. (#32356) Thanks @jasonhargrove. - Web UI/config form: support SecretInput string-or-secret-ref unions in map
additionalProperties, so provider API key fields stay editable instead of being marked unsupported. (#31866) Thanks @ningding97. - Auto-reply/inline command cleanup: preserve newline structure when stripping inline
/statusand extracting inline slash commands by collapsing only horizontal whitespace, preventing paragraph flattening in multi-line replies. (#32224) Thanks @scoootscooob. - Config/raw redaction safety: preserve non-sensitive literals during raw redaction round-trips, scope SecretRef redaction to secret IDs (not structural fields like
source/provider), and fall back to structured raw redaction when text replacement cannot restore the original config shape. (#32174) Thanks @bmendonca3. - Hooks/runtime stability: keep the internal hook handler registry on a
globalThissingleton so hook registration/dispatch remains consistent when bundling emits duplicate module copies. (#32292) Thanks @Drickon. - Hooks/after_tool_call: include embedded session context (
sessionKey,agentId) and fire the hook exactly once per tool execution by removing duplicate adapter-path dispatch in embedded runs. (#32201) Thanks @jbeno, @scoootscooob, @vincentkoc. - Hooks/tool-call correlation: include
runIdandtoolCallIdin plugin tool hook payloads/context and scope tool start/adjusted-param tracking by run to prevent cross-run collisions inbefore_tool_callandafter_tool_call. (#32360) Thanks @vincentkoc. - Plugins/install diagnostics: reject legacy plugin package shapes without
openclaw.extensionsand return an explicit upgrade hint with troubleshooting docs for repackaging. (#32055) Thanks @liuxiaopai-ai. - Hooks/plugin context parity: ensure
llm_inputhooks in embedded attempts receive the sametriggerandchannelId-awarehookCtxused by the other hook phases, preserving channel/trigger-scoped plugin behavior. (#28623) Thanks @davidrudduck and @vincentkoc. - Plugins/hardlink install compatibility: allow bundled plugin manifests and entry files to load when installed via hardlink-based package managers (
pnpm,bun) while keeping hardlink rejection enabled for non-bundled plugin sources. (#32119) Fixes #28175, #28404, #29455. Thanks @markfietje. - Cron/session reaper reliability: move cron session reaper sweeps into
onTimerfinallyand keep pruning active even when timer ticks fail early (for example cron store parse failures), preventing stale isolated run sessions from accumulating indefinitely. (#31996) Fixes #31946. Thanks @scoootscooob. - Cron/HEARTBEAT_OK summary leak: suppress fallback main-session enqueue for heartbeat/internal ack summaries in isolated announce mode so
HEARTBEAT_OKnoise never appears in user chat while real summaries still forward. (#32093) Thanks @scoootscooob. - Authentication: classify
permission_errorasauth_permanentfor profile fallback. (#31324) Thanks @Sid-Qin. - Agents/host edit reliability: treat host edit-tool throws as success only when on-disk post-check confirms replacement likely happened (
newTextpresent andoldTextabsent), preventing false failure reports while avoiding pre-write false positives. (#32383) Thanks @polooooo. - Plugins/install fallback safety: resolve bare install specs to bundled plugin ids before npm lookup (for example
diffs-> bundled@openclaw/diffs), keep npm fallback limited to true package-not-found errors, and continue rejecting non-plugin npm packages that fail manifest validation. (#32096) Thanks @scoootscooob. - Web UI/inline code copy fidelity: disable forced mid-token wraps on inline
<code>spans so copied UUID/hash/token strings preserve exact content instead of inserting line-break spaces. (#32346) Thanks @hclsys. - Restart sentinel formatting: avoid duplicate
Reason:lines when restart message text already matchesstats.reason, keeping restart notifications concise for users and downstream parsers. (#32083) Thanks @velamints2. - Auto-reply/followup queue: avoid stale callback reuse across idle-window restarts by caching the followup runner only when a drain actually starts, preserving enqueue ordering after empty-finalize paths. (#31902) Thanks @Lanfei.
- Agents/tool-result guard: always clear pending tool-call state on interruptions even when synthetic tool results are disabled, preventing orphaned tool-use transcripts that cause follow-up provider request failures. (#32120) Thanks @jnMetaCode.
- Failover/error classification: treat HTTP
529(provider overloaded, common with Anthropic-compatible APIs) asrate_limitso model failover can engage instead of misclassifying the error path. (#31854) Thanks @bugkill3r. - Logging: use local time for logged timestamps instead of UTC, aligning log output with documented local timezone behavior and avoiding confusion during local diagnostics. (#28434) Thanks @liuy.
- Agents/Subagent announce cleanup: keep completion-message runs pending while descendants settle, add a 30 minute hard-expiry backstop to avoid indefinite pending state, and keep retry bookkeeping resumable across deferred wakes. (#23970) Thanks @tyler6204.
- Secrets/exec resolver timeout defaults: use provider
timeoutMsas the default inactivity (noOutputTimeoutMs) watchdog for exec secret providers, preventing premature no-output kills for resolvers that start producing output after 2s. (#32235) Thanks @bmendonca3. - Auto-reply/reminder guard note suppression: when a turn makes reminder-like commitments but schedules no new cron jobs, suppress the unscheduled-reminder warning note only if an enabled cron already exists for the same session; keep warnings for unrelated sessions, disabled jobs, or unreadable cron store paths. (#32255) Thanks @scoootscooob.
- Cron/isolated announce heartbeat suppression: treat multi-payload runs as skippable when any payload is a heartbeat ack token and no payload has media, preventing internal narration + trailing
HEARTBEAT_OKfrom being delivered to users. (#32131) Thanks @adhishthite. - Cron/store migration: normalize legacy cron jobs with string
scheduleand top-levelcommand/timeoutfields into canonical schedule/payload/session-target shape on load, preventing schedule-error loops on old persisted stores. (#31926) Thanks @bmendonca3. - Tests/Windows backup rotation: skip chmod-only backup permission assertions on Windows while retaining compose/rotation/prune coverage across platforms to avoid false CI failures from Windows non-POSIX mode semantics. (#32286) Thanks @jalehman.
- Tests/Subagent announce: set
OPENCLAW_TEST_FAST=1before importingsubagent-announceformat suites so module-level fast-mode constants are captured deterministically on Windows CI, preventing timeout flakes in nested completion announce coverage. (#31370) Thanks @zwffff.