Notas de la versión
Changes
- Discord: send voice messages with waveform previews from local audio files (including silent delivery). (#7253) Thanks @nyanjou.
- Discord: add configurable presence status/activity/type/url (custom status defaults to activity text). (#10855) Thanks @h0tp-ftw.
- Slack/Plugins: add thread-ownership outbound gating via
message_sendinghooks, including @-mention bypass tracking and Slack outbound hook wiring for cancel/modify behavior. (#15775) Thanks @DarlingtonDeveloper. - Agents: add synthetic catalog support for
hf:zai-org/GLM-5. (#15867) Thanks @battman21. - Skills: remove duplicate
local-placesGoogle Places skill/proxy and keepgoplacesas the single supported Google Places path. - Agents: add pre-prompt context diagnostics (
messages,systemPromptChars,promptChars, provider/model, session file) before embedded runner prompt calls to improve overflow debugging. (#8930) Thanks @Glucksberg. - Onboarding/Providers: add first-class Hugging Face Inference provider support (provider wiring, onboarding auth choice/API key flow, and default-model selection), and preserve Hugging Face auth intent in auth-choice remapping (
tokenProvider=huggingfacewithauthChoice=apiKey) while skipping env-override prompts when an explicit token is provided. (#13472) Thanks @Josephrp.
Fixes
- Outbound: add a write-ahead delivery queue with crash-recovery retries to prevent lost outbound messages after gateway restarts. (#15636) Thanks @nabbilkhan, @thewilloftheshadow.
- Auto-reply/Threading: auto-inject implicit reply threading so
replyToModeworks without requiring model-emitted[[reply_to_current]], while preservingreplyToMode: "off"behavior for implicit Slack replies and keeping block-streaming chunk coalescing stable underreplyToMode: "first". (#14976) Thanks @Diaspar4u. - Outbound/Threading: pass
replyToandthreadIdfrommessage sendtool actions through the core outbound send path to channel adapters, preserving thread/reply routing. (#14948) Thanks @mcaxtr. - Auto-reply/Media: allow image-only inbound messages (no caption) to reach the agent instead of short-circuiting as empty text, and preserve thread context in queued/followup prompt bodies for media-only runs. (#11916) Thanks @arosstale.
- Discord: route autoThread replies to existing threads instead of the root channel. (#8302) Thanks @gavinbmoore, @thewilloftheshadow.
- Web UI: add
imgto DOMPurify allowed tags andsrc/altto allowed attributes so markdown images render in webchat instead of being stripped. (#15437) Thanks @lailoo. - Telegram/Matrix: treat MP3 and M4A (including
audio/mp4) as voice-compatible forasVoicerouting, and keep WAV/AAC falling back to regular audio sends. (#15438) Thanks @azade-c. - WhatsApp: preserve outbound document filenames for web-session document sends instead of always sending
"file". (#15594) Thanks @TsekaLuk. - Telegram: cap bot menu registration to Telegram's 100-command limit with an overflow warning while keeping typed hidden commands available. (#15844) Thanks @battman21.
- Telegram: scope skill commands to the resolved agent for default accounts so
setMyCommandsno longer triggersBOT_COMMANDS_TOO_MUCHwhen multiple agents are configured. (#15599) - Discord: avoid misrouting numeric guild allowlist entries to
/channels/<guildId>by prefixing guild-only inputs withguild:during resolution. (#12326) Thanks @headswim. - MS Teams: preserve parsed mention entities/text when appending OneDrive fallback file links, and accept broader real-world Teams mention ID formats (
29:...,8:orgid:...) while still rejecting placeholder patterns. (#15436) Thanks @hyojin. - Media: classify
text/*MIME types as documents in media-kind routing so text attachments are no longer treated as unknown. (#12237) Thanks @arosstale. - Inbound/Web UI: preserve literal
\nsequences when normalizing inbound text so Windows paths likeC:\\Work\\nxxx\\README.mdare not corrupted. (#11547) Thanks @mcaxtr. - TUI/Streaming: preserve richer streamed assistant text when final payload drops pre-tool-call text blocks, while keeping non-empty final payload authoritative for plain-text updates. (#15452) Thanks @TsekaLuk.
- Providers/MiniMax: switch implicit MiniMax API-key provider from
openai-completionstoanthropic-messageswith the correct Anthropic-compatible base URL, fixinginvalid role: developer (2013)errors on MiniMax M2.5. (#15275) Thanks @lailoo. - Ollama/Agents: use resolved model/provider base URLs for native
/api/chatstreaming (including aliased providers), normalize/v1endpoints, and forward abort +maxTokensstream options for reliable cancellation and token caps. (#11853) Thanks @BrokenFinger98. - OpenAI Codex/Spark: implement end-to-end
gpt-5.3-codex-sparksupport across fallback/thinking/model resolution andmodels listforward-compat visibility. (#14990, #15174) Thanks @L-U-C-K-Y, @loiie45e. - Agents/Codex: allow
gpt-5.3-codex-sparkin forward-compat fallback, live model filtering, and thinking presets, and fix model-picker recognition for spark. (#14990) Thanks @L-U-C-K-Y. - Models/Codex: resolve configured
openai-codex/gpt-5.3-codex-sparkthrough forward-compat fallback duringmodels list, so it is not incorrectly tagged as missing when runtime resolution succeeds. (#15174) Thanks @loiie45e. - OpenAI Codex/Auth: bridge OpenClaw OAuth profiles into
piauth.jsonso model discovery and models-list registry resolution can use Codex OAuth credentials. (#15184) Thanks @loiie45e. - Auth/OpenAI Codex: share OAuth login handling across onboarding and
models auth login --provider openai-codex, keep onboarding alive when OAuth fails, and surface a direct OAuth help note instead of terminating the wizard. (#15406, follow-up to #14552) Thanks @zhiluo20. - Onboarding/Providers: add vLLM as an onboarding provider with model discovery, auth profile wiring, and non-interactive auth-choice validation. (#12577) Thanks @gejifeng.
- Onboarding/CLI: restore terminal state without resuming paused
stdin, so onboarding exits cleanly after choosing Web UI and the installer returns instead of appearing stuck. - Signal/Install: auto-install
signal-clivia Homebrew on non-x64 Linux architectures, avoiding x86_64 native binaryExec format errorfailures on arm64/arm hosts. (#15443) Thanks @jogvan-k. - macOS Voice Wake: fix a crash in trigger trimming for CJK/Unicode transcripts by matching and slicing on original-string ranges instead of transformed-string indices. (#11052) Thanks @Flash-LHR.
- Mattermost (plugin): retry websocket monitor connections with exponential backoff and abort-aware teardown so transient connect failures no longer permanently stop monitoring. (#14962) Thanks @mcaxtr.
- Discord/Agents: apply channel/group
historyLimitduring embedded-runner history compaction to prevent long-running channel sessions from bypassing truncation and overflowing context windows. (#11224) Thanks @shadril238. - Outbound targets: fail closed for WhatsApp/Twitch/Google Chat fallback paths so invalid or missing targets are dropped instead of rerouted, and align resolver hints with strict target requirements. (#13578) Thanks @mcaxtr.
- Gateway/Restart: clear stale command-queue and heartbeat wake runtime state after SIGUSR1 in-process restarts to prevent zombie gateway behavior where queued work stops draining. (#15195) Thanks @joeykrug.
- Heartbeat: prevent scheduler silent-death races during runner reloads, preserve retry cooldown backoff under wake bursts, and prioritize user/action wake causes over interval/retry reasons when coalescing. (#15108) Thanks @joeykrug.
- Heartbeat: allow explicit wake (
wake) and hook wake (hook:*) reasons to run even whenHEARTBEAT.mdis effectively empty so queued system events are processed. (#14527) Thanks @arosstale. - Auto-reply/Heartbeat: strip sentence-ending
HEARTBEAT_OKtokens even when followed by up to 4 punctuation characters, while preserving surrounding sentence punctuation. (#15847) Thanks @Spacefish. - Agents/Heartbeat: stop auto-creating
HEARTBEAT.mdduring workspace bootstrap so missing files continue to run heartbeat as documented. (#11766) Thanks @shadril238. - Sessions/Agents: pass
agentIdwhen resolving existing transcript paths in reply runs so non-default agents and heartbeat/chat handlers no longer fail withSession file path must be within sessions directory. (#15141) Thanks @Goldenmonstew. - Sessions/Agents: pass
agentIdthrough status and usage transcript-resolution paths (auto-reply, gateway usage APIs, and session cost/log loaders) so non-default agents can resolve absolute session files without path-validation failures. (#15103) Thanks @jalehman. - Sessions: archive previous transcript files on
/newand/resetsession resets (including gatewaysessions.reset) so stale transcripts do not accumulate on disk. (#14869) Thanks @mcaxtr. - Status/Sessions: stop clamping derived
totalTokensto context-window size, keep prompt-token snapshots wired through session accounting, and surface context usage as unknown when fresh snapshot data is missing to avoid false 100% reports. (#15114) Thanks @echoVic. - CLI/Completion: route plugin-load logs to stderr and write generated completion scripts directly to stdout to avoid
source <(openclaw completion ...)corruption. (#15481) Thanks @arosstale. - CLI: lazily load outbound provider dependencies and remove forced success-path exits so commands terminate naturally without killing intentional long-running foreground actions. (#12906) Thanks @DrCrinkle.
- Security/Gateway + ACP: block high-risk tools (
sessions_spawn,sessions_send,gateway,whatsapp_login) from HTTP/tools/invokeby default withgateway.tools.{allow,deny}overrides, and harden ACP permission selection to fail closed when tool identity/options are ambiguous while supportingallow_always/reject_always. (#15390) Thanks @aether-ai-agent. - Security/Gateway: breaking default-behavior change - canvas IP-based auth fallback now only accepts machine-scoped addresses (RFC1918, link-local, ULA IPv6, CGNAT); public-source IP matches now require bearer token auth. (#14661) Thanks @sumleo.
- Security/Link understanding: block loopback/internal host patterns and private/mapped IPv6 addresses in extracted URL handling to close SSRF bypasses in link CLI flows. (#15604) Thanks @AI-Reviewer-QS.
- Security/Browser: constrain
POST /trace/stop,POST /wait/download, andPOST /downloadoutput paths to OpenClaw temp roots and reject traversal/escape paths. - Security/Canvas: serve A2UI assets via the shared safe-open path (
openFileWithinRoot) to close traversal/TOCTOU gaps, with traversal and symlink regression coverage. (#10525) Thanks @abdelsfane. - Security/WhatsApp: enforce
0o600oncreds.jsonandcreds.json.bakon save/backup/restore paths to reduce credential file exposure. (#10529) Thanks @abdelsfane. - Security/Gateway: sanitize and truncate untrusted WebSocket header values in pre-handshake close logs to reduce log-poisoning risk. Thanks @thewilloftheshadow.
- Security/Audit: add misconfiguration checks for sandbox Docker config with sandbox mode off, ineffective
gateway.nodes.denyCommandsentries, global minimal tool-profile overrides by agent profiles, and permissive extension-plugin tool reachability. - Security/Audit: distinguish external webhooks (
hooks.enabled) from internal hooks (hooks.internal.enabled) in attack-surface summaries to avoid false exposure signals when only internal hooks are enabled. (#13474) Thanks @mcaxtr. - Security/Onboarding: clarify multi-user DM isolation remediation with explicit
openclaw config set session.dmScope ...commands in security audit, doctor security, and channel onboarding guidance. (#13129) Thanks @VintLin. - Agents/Nodes: harden node exec approval decision handling in the
nodestool run path by failing closed on unexpected approval decisions, and add regression coverage for approval-required retry/deny/timeout flows. (#4726) Thanks @rmorse. - Android/Nodes: harden
app.updateby requiring HTTPS and gateway-host URL matching plus SHA-256 verification, stream URL camera downloads to disk with size guards to avoid memory spikes, and stop signing release builds with debug keys. (#13541) Thanks @smartprogrammer93. - Routing: enforce strict binding-scope matching across peer/guild/team/roles so peer-scoped Discord/Slack bindings no longer match unrelated guild/team contexts or fallback tiers. (#15274) Thanks @lailoo.
- Exec/Allowlist: allow multiline heredoc bodies (
<<,<<-) while keeping multiline non-heredoc shell commands blocked, so exec approval parsing permits heredoc input safely without allowing general newline command chaining. (#13811) Thanks @mcaxtr. - Config: preserve
${VAR}env references when writing config files soopenclaw config set/apply/patchdoes not persist secrets to disk. Thanks @thewilloftheshadow. - Config: remove a cross-request env-snapshot race in config writes by carrying read-time env context into write calls per request, preserving
${VAR}refs safely under concurrent gateway config mutations. (#11560) Thanks @akoscz. - Config: log overwrite audit entries (path, backup target, and hash transition) whenever an existing config file is replaced, improving traceability for unexpected config clobbers.
- Config: keep legacy audio transcription migration strict by rejecting non-string/unsafe command tokens while still migrating valid custom script executables. (#5042) Thanks @shayan919293.
- Config: accept
$schemakey in config file so JSON Schema editor tooling works without validation errors. (#14998) - Gateway/Tools Invoke: sanitize
/tools/invokeexecution failures while preserving400for tool input errors and returning500for unexpected runtime failures, with regression coverage and docs updates. (#13185) Thanks @davidrudduck. - Gateway/Hooks: preserve
408for hook request-body timeout responses while keeping bounded auth-failure cache eviction behavior, with timeout-status regression coverage. (#15848) Thanks @AI-Reviewer-QS. - Plugins/Hooks: fire
before_tool_callhook exactly once per tool invocation in embedded runs by removing duplicate dispatch paths while preserving parameter mutation semantics. (#15635) Thanks @lailoo. - Agents/Transcript policy: sanitize OpenAI/Codex tool-call ids during transcript policy normalization to prevent invalid tool-call identifiers from propagating into session history. (#15279) Thanks @divisonofficer.
- Agents/Image tool: cap image-analysis completion
maxTokensby model capability (min(4096, model.maxTokens)) to avoid over-limit provider failures while still preventing truncation. (#11770) Thanks @detecti1. - Agents/Compaction: centralize exec default resolution in the shared tool factory so per-agent
tools.execoverrides (host/security/ask/node and related defaults) persist across compaction retries. (#15833) Thanks @napetrov. - Gateway/Agents: stop injecting a phantom
mainagent into gateway agent listings whenagents.listexplicitly excludes it. (#11450) Thanks @arosstale. - Process/Exec: avoid shell execution for
.execommands on Windows so env overrides work reliably inrunCommandWithTimeout. Thanks @thewilloftheshadow. - Daemon/Windows: preserve literal backslashes in
gateway.cmdcommand parsing so drive and UNC paths are not corrupted in runtime checks and doctor entrypoint comparisons. (#15642) Thanks @arosstale. - Sandbox: pass configured
sandbox.docker.envvariables to sandbox containers atdocker createtime. (#15138) Thanks @stevebot-alive. - Voice Call: route webhook runtime event handling through shared manager event logic so rejected inbound hangups are idempotent in production, with regression tests for duplicate reject events and provider-call-ID remapping parity. (#15892) Thanks @dcantu96.
- Cron: add regression coverage for announce-mode isolated jobs so runs that already report
delivered: truedo not enqueue duplicate main-session relays, including delivery configs wheremodeis omitted and defaults to announce. (#15737) Thanks @brandonwise. - Cron: honor
deleteAfterRunin isolated announce delivery by mapping it to subagent announce cleanup mode, so cron run sessions configured for deletion are removed after completion. (#15368) Thanks @arosstale. - Web tools/web_fetch: prefer
text/markdownresponses for Cloudflare Markdown for Agents, addcf-markdownextraction for markdown bodies, and redact fetched URLs inx-markdown-tokensdebug logs to avoid leaking raw paths/query params. (#15376) Thanks @Yaxuan42. - Clawdock: avoid Zsh readonly variable collisions in helper scripts. (#15501) Thanks @nkelner.
- Memory: switch default local embedding model to the QAT
embeddinggemma-300m-qat-Q8_0variant for better quality at the same footprint. (#15429) Thanks @azade-c. - Docs/Mermaid: remove hardcoded Mermaid init theme blocks from four docs diagrams so dark mode inherits readable theme defaults. (#15157) Thanks @heytulsiprasad.