mirror of
https://github.com/openclaw/openclaw.git
synced 2026-10-03 01:29:56 +00:00
* refactor: split release changelogs and synchronize docs mirrors * fix: complete split changelog instructions and validation wiring * fix: complete release changelog mirror integration Regenerate existing docs mirrors within the docs-agent publication boundary, preserve one HTML release heading, and package links for oversized mirrors without changing frozen records. Update release publisher and test-routing fixtures for the shared changelog resolver. * test: align docs agent Git ownership fixtures Keep failure injection aligned with staged-index validation and mirror staging. Preserve native Git producer exit codes and verify both cached-index producers without weakening process-drain assertions. --------- Co-authored-by: Peter Steinberger <steipete@gmail.com>
26 KiB
26 KiB
2026.2.14
Changes
- Telegram: add poll sending via
openclaw message poll(duration seconds, silent delivery, anonymity controls). (#16209) Thanks @robbyczgw-cla. - Slack/Discord: add
dmPolicy+allowFromconfig aliases for DM access control; legacydm.policy+dm.allowFromkeys remain supported andopenclaw doctor --fixcan migrate them. - Discord: allow exec approval prompts to target channels or both DM+channel via
channels.discord.execApprovals.target. (#16051) Thanks @leonnardo. - Sandbox: add
sandbox.browser.bindsto configure browser-container bind mounts separately from exec containers. (#16230) Thanks @seheepeak. - Discord: add debug logging for message routing decisions to improve
--debugtracing. (#16202) Thanks @jayleekr. - Agents: add optional
messages.suppressToolErrorsconfig to hide non-mutating tool-failure warnings from user-facing chat while still surfacing mutating failures. (#16620) Thanks @vai-oro.
Fixes
- CLI/Installation: fix Docker installation hangs on macOS. (#12972) Thanks @vincentkoc.
- Models: fix antigravity opus 4.6 availability follow-up. (#12845) Thanks @vincentkoc.
- Security/Sessions/Telegram: restrict session tool targeting by default to the current session tree (
tools.sessions.visibility, defaulttree) with sandbox clamping, and pass configured per-account Telegram webhook secrets in webhook mode when no explicit override is provided. Thanks @aether-ai-agent. - CLI/Plugins: ensure
openclaw message sendexits after successful delivery across plugin-backed channels so one-shot sends do not hang. (#16491) Thanks @yinghaosang. - CLI/Plugins: run registered plugin
gateway_stophooks beforeopenclaw messageexits (success and failure paths), so plugin-backed channels can clean up one-shot CLI resources. (#16580) Thanks @gumadeiras. - WhatsApp: honor per-account
dmPolicyoverrides (account-level settings now take precedence over channel defaults for inbound DMs). (#10082) Thanks @mcaxtr. - Telegram: when
channels.telegram.commands.nativeisfalse, exclude plugin commands fromsetMyCommandsmenu registration while keeping plugin slash handlers callable. (#15132) Thanks @Glucksberg. - LINE: return 200 OK for Developers Console "Verify" requests (
{"events":[]}) withoutX-Line-Signature, while still requiring signatures for real deliveries. (#16582) Thanks @arosstale. - Cron: deliver text-only output directly when
delivery.tois set so cron recipients get full output instead of summaries. (#16360) Thanks @thewilloftheshadow. - Cron/Slack: preserve agent identity (name and icon) when cron jobs deliver outbound messages. (#16242) Thanks @robbyczgw-cla.
- Media: accept
MEDIA:-prefixed paths (lenient whitespace) when loading outbound media to preventENOENTfor tool-returned local media paths. (#13107) Thanks @mcaxtr. - Media understanding: treat binary
application/vnd.*/zip/octet-stream attachments as non-text (while keeping vendor+json/+xmltext-eligible) so Office/ZIP files are not inlined into prompt body text. (#16513) Thanks @rmramsey32. - Agents: deliver tool result media (screenshots, images, audio) to channels regardless of verbose level. (#11735) Thanks @strelov1.
- Auto-reply/Block streaming: strip leading whitespace from streamed block replies so messages starting with blank lines no longer deliver visible leading empty lines. (#16422) Thanks @mcinteerj.
- Auto-reply/Queue: keep queued followups and overflow summaries when drain attempts fail, then retry delivery instead of dropping messages on transient errors. (#16771) Thanks @mmhzlrj.
- Agents/Image tool: allow workspace-local image paths by including the active workspace directory in local media allowlists, and trust sandbox-validated paths in image loaders to prevent false "not under an allowed directory" rejections. (#15541) Thanks @tyler6204.
- Agents/Image tool: propagate the effective workspace root into tool wiring so workspace-local image paths are accepted by default when running without an explicit
workspaceDir. (#16722). - BlueBubbles: include sender identity in group chat envelopes and pass clean message text to the agent prompt, aligning with iMessage/Signal formatting. (#16210) Thanks @zerone0x.
- CLI: fix lazy core command registration so top-level maintenance commands (
doctor,dashboard,reset,uninstall) resolve correctly instead of exposing a non-functionalmaintenanceplaceholder command. - CLI/Dashboard: when
gateway.bind=lan, generate localhost dashboard URLs to satisfy browser secure-context requirements while preserving non-LAN bind behavior. (#16434) Thanks @BinHPdev. - TUI/Gateway: resolve local gateway target URL from
gateway.bindmode (tailnet/lan) instead of hardcoded localhost soopenclaw tuiconnects when gateway is non-loopback. (#16299) Thanks @cortexuvula. - TUI: honor explicit
--session <key>inopenclaw tuieven whensession.scopeisglobal, so named sessions no longer collapse into shared global history. (#16575) Thanks @cinqu. - TUI: use available terminal width for session name display in searchable select lists. (#16238) Thanks @robbyczgw-cla.
- TUI: preserve in-flight streaming replies when a different run finalizes concurrently (avoid clearing active run or reloading history mid-stream). (#10704) Thanks @axschr73.
- TUI: keep pre-tool streamed text visible when later tool-boundary deltas temporarily omit earlier text blocks. (#6958) Thanks @KrisKind75.
- TUI: sanitize ANSI/control-heavy history text, redact binary-like lines, and split pathological long unbroken tokens before rendering to prevent startup crashes on binary attachment history. (#13007) Thanks @wilkinspoe.
- TUI: harden render-time sanitizer for narrow terminals by chunking moderately long unbroken tokens and adding fast-path sanitization guards to reduce overhead on normal text. (#5355) Thanks @tingxueren.
- TUI: render assistant body text in terminal default foreground (instead of fixed light ANSI color) so contrast remains readable on light themes such as Solarized Light. (#16750) Thanks @paymog.
- TUI/Hooks: pass explicit reset reason (
newvsreset) throughsessions.resetand emit internal command hooks for gateway-triggered resets so/newhook workflows fire in TUI/webchat. - Gateway/Agent: route bare
/newand/resetthroughsessions.resetbefore running the fresh-session greeting prompt, so reset commands clear the current session in-place instead of falling through to normal agent runs. (#16732) Thanks @kdotndot and @vignesh07. - Cron: prevent
cron list/cron statusfrom silently skipping past-due recurring jobs by using maintenance recompute semantics. (#16156) Thanks @zerone0x. - Cron: repair missing/corrupt
nextRunAtMsfor the updated job without globally recomputing unrelated due jobs duringcron update. (#15750). - Cron: treat persisted jobs with missing
enabledas enabled by default across update/list/timer due-path checks, and add regression coverage for missing-enabledstore records. (#15433) Thanks @eternauta1337. - Cron: skip missed-job replay on startup for jobs interrupted mid-run (stale
runningAtMsmarkers), preventing restart loops for self-restarting jobs such as update tasks. (#16694) Thanks @sbmilburn. - Heartbeat/Cron: treat cron-tagged queued system events as cron reminders even on interval wakes, so isolated cron announce summaries no longer run under the default heartbeat prompt. (#14947) Thanks @archedark-ada and @vignesh07.
- Discord: prefer gateway guild id when logging inbound messages so cached-miss guilds do not appear as
guild=dm. Thanks @thewilloftheshadow. - Discord: treat empty per-guild
channels: {}config maps as no channel allowlist (not deny-all), sogroupPolicy: "open"guilds without explicit channel entries continue to receive messages. (#16714) Thanks @xqliu. - Models/CLI: guard
models statusstring trimming paths to prevent crashes from malformed non-string config values. (#16395) Thanks @BinHPdev. - Gateway/Subagents: preserve queued announce items and summary state on delivery errors, retry failed announce drains, and avoid dropping unsent announcements on timeout/failure. (#16729) Thanks @Clawdette-Workspace.
- Gateway/Config: make
config.patchmerge object arrays byid(for exampleagents.list) instead of replacing the whole array, so partial agent updates do not silently delete unrelated agents. (#6766) Thanks @lightclient. - Webchat/Prompts: stop injecting direct-chat
conversation_labelinto inbound untrusted metadata context blocks, preventing internal label noise from leaking into visible chat replies. (#16556) Thanks @nberardi. - Auto-reply/Prompts: include trusted inbound
message_id,chat_id,reply_to_id, and optionalmessage_id_fullmetadata fields so action tools (for example reactions) can target the triggering message without relying on user text. (#17662) Thanks @MaikiMolto. - Gateway/Sessions: abort active embedded runs and clear queued session work before
sessions.reset, returning unavailable if the run does not stop in time. (#16576) Thanks @Grynn. - Sessions/Agents: harden transcript path resolution for mismatched agent context by preserving explicit store roots and adding safe absolute-path fallback to the correct agent sessions directory. (#16288) Thanks @robbyczgw-cla.
- Agents: add a safety timeout around embedded
session.compact()to ensure stalled compaction runs settle and release blocked session lanes. (#16331) Thanks @BinHPdev. - Agents/Tools: make required-parameter validation errors list missing fields and instruct: "Supply correct parameters before retrying," reducing repeated invalid tool-call loops (for example
read({})). (#14729) Thanks @Takhoffman. - Agents: keep unresolved mutating tool failures visible until the same action retry succeeds, scope mutation-error surfacing to mutating calls (including
session_statusmodel changes), and dedupe duplicate failure warnings in outbound replies. (#16131) Thanks @Swader. - Agents/Process/Bootstrap: preserve unbounded
process logoffset-only pagination (default tail applies only when bothoffsetandlimitare omitted) and enforce strictbootstrapTotalMaxCharsbudgeting across injected bootstrap content (including markers), skipping additional injection when remaining budget is too small. (#16539) Thanks @CharlieGreenman. - Agents/Workspace: persist bootstrap onboarding state so partially initialized workspaces recover missing
BOOTSTRAP.mdonce, while completed onboarding keeps BOOTSTRAP deleted even if runtime files are later recreated. Thanks @gumadeiras. - Agents/Workspace: create
BOOTSTRAP.mdwhen core workspace files are seeded in partially initialized workspaces, while keeping BOOTSTRAP one-shot after onboarding deletion. (#16457) Thanks @robbyczgw-cla. - Agents: classify external timeout aborts during compaction the same as internal timeouts, preventing unnecessary auth-profile rotation and preserving compaction-timeout snapshot fallback behavior. (#9855) Thanks @mverrilli.
- Agents: treat empty-stream provider failures (
request ended without sending any chunks) as timeout-class failover signals, enabling auth-profile rotation/fallback and showing a friendly timeout message instead of raw provider errors. (#10210) Thanks @zenchantlive. - Agents: treat
readtoolfile_patharguments as valid in tool-start diagnostics to avoid false "read tool called without path" warnings when alias parameters are used. (#16717) Thanks @Stache73. - Agents/Transcript: drop malformed tool-call blocks with blank required fields (
id/nameor missinginput/arguments) during session transcript repair to prevent persistent tool-call corruption on future turns. (#15485) Thanks @mike-zachariades. - Tools/Write/Edit: normalize structured text-block arguments for
content/oldText/newTextbefore filesystem edits, preventing JSON-like file corruption and false "exact text not found" misses from block-form params. (#16778) Thanks @danielpipernz. - Ollama/Agents: avoid forcing
<final>tag enforcement for Ollama models, which could suppress all output as(no output). (#16191) Thanks @briancolinger. - Plugins: suppress false duplicate plugin id warnings when the same extension is discovered via multiple paths (config/workspace/global vs bundled), while still warning on genuine duplicates. (#16222) Thanks @shadril238.
- Agents/Process: supervise PTY/child process lifecycles with explicit ownership, cancellation, timeouts, and deterministic cleanup, preventing Codex/Pi PTY sessions from dying or stalling on resume. (#14257) Thanks @onutc.
- Skills: watch
SKILL.mdonly when refreshing skills snapshot to avoid file-descriptor exhaustion in large data trees. (#11325) Thanks @household-bard. - Memory/QMD: make
memory statusread-only by skipping QMD boot update/embed side effects for status-only manager checks. - Memory/QMD: keep original QMD failures when builtin fallback initialization fails (for example missing embedding API keys), instead of replacing them with fallback init errors.
- Memory/Builtin: keep
memory statusdirty reporting stable across invocations by deriving status-only manager dirty state from persisted index metadata instead of process-start defaults. (#10863) Thanks @BarryYangi. - Memory/QMD: cap QMD command output buffering to prevent memory exhaustion from pathological
qmdcommand output. Thanks @vignesh07. - Memory/QMD: parse qmd scope keys once per request to avoid repeated parsing in scope checks. Thanks @vignesh07.
- Memory/QMD: query QMD index using exact docid matches before falling back to prefix lookup for better recall correctness and index efficiency. Thanks @vignesh07.
- Memory/QMD: pass result limits to
search/vsearchcommands so QMD can cap results earlier. Thanks @vignesh07. - Memory/QMD: avoid reading full markdown files when a
from/lineswindow is requested in QMD reads. Thanks @vignesh07. - Memory/QMD: skip rewriting unchanged session export markdown files during sync to reduce disk churn. Thanks @vignesh07.
- Memory/QMD: make QMD result JSON parsing resilient to noisy command output by extracting the first JSON array from noisy
stdout. - Memory/QMD: treat prefixed
no results foundmarker output as an empty result set in qmd JSON parsing. (#11302) Thanks @blazerui. - Memory/QMD: avoid multi-collection
queryranking corruption by running oneqmd query -c <collection>per managed collection and merging by best score (also used forsearch/vsearchfallback-to-query). (#16740) Thanks @volarian-vai. - Memory/QMD: rebind managed collections when existing collection metadata drifts (including sessions name-only listings), preventing non-default agents from reusing another agent's
sessionscollection path. (#17194) Thanks @jonathanadams96. - Memory/QMD: make
openclaw memory indexverify and print the active QMD index file path/size, and fail when QMD leaves a missing or zero-byte index artifact after an update. (#16775) Thanks @Shunamxiao. - Memory/QMD: detect null-byte
ENOTDIRupdate failures, rebuild managed collections once, and retry update to self-heal corrupted collection metadata. (#12919) Thanks @jorgejhms. - Memory/QMD/Security: add
rawKeyPrefixsupport for QMD scope rules and preserve legacykeyPrefix: "agent:..."matching, preventing scoped deny bypass when operators match agent-prefixed session keys. - Memory/Builtin: narrow memory watcher targets to markdown globs and ignore dependency/venv directories to reduce file-descriptor pressure during memory sync startup. (#11721) Thanks @rex05ai.
- Security/Memory-LanceDB: treat recalled memories as untrusted context (escape injected memory text + explicit non-instruction framing), skip likely prompt-injection payloads during auto-capture, and restrict auto-capture to user messages to reduce memory-poisoning risk. (#12524) Thanks @davidschmid24.
- Security/Memory-LanceDB: require explicit
autoCapture: trueopt-in (default is now disabled) to prevent automatic PII capture unless operators intentionally enable it. (#12552) Thanks @fr33d3m0n. - Diagnostics/Memory: prune stale diagnostic session state entries and cap tracked session states to prevent unbounded in-memory growth on long-running gateways. (#5136) Thanks @coygeek and @vignesh07.
- Gateway/Memory: clean up
agentRunSeqtracking on run completion/abort and enforce maintenance-time cap pruning to prevent unbounded sequence-map growth over long uptimes. (#6036) Thanks @coygeek and @vignesh07. - Auto-reply/Memory: bound
ABORT_MEMORYgrowth by evicting oldest entries and deleting reset (false) flags so abort state tracking cannot grow unbounded over long uptimes. (#6629) Thanks @coygeek and @vignesh07. - Slack/Memory: bound thread-starter cache growth with TTL + max-size pruning to prevent long-running Slack gateways from accumulating unbounded thread cache state. (#5258) Thanks @coygeek and @vignesh07.
- Outbound/Memory: bound directory cache growth with max-size eviction and proactive TTL pruning to prevent long-running gateways from accumulating unbounded directory entries. (#5140) Thanks @coygeek and @vignesh07.
- Skills/Memory: remove disconnected nodes from remote-skills cache to prevent stale node metadata from accumulating over long uptimes. (#6760) Thanks @coygeek.
- Sandbox/Tools: make sandbox file tools bind-mount aware (including absolute container paths) and enforce read-only bind semantics for writes. (#16379) Thanks @tasaankaeris.
- Sandbox/Prompts: show the sandbox container workdir as the prompt working directory and clarify host-path usage for file tools, preventing host-path
execfailures in sandbox sessions. (#16790) Thanks @carrotRakko. - Media/Security: allow local media reads from OpenClaw state
workspace/andsandboxes/roots by default so generated workspace media can be delivered without unsafe global path bypasses. (#15541) Thanks @lanceji. - Media/Security: harden local media allowlist bypasses by requiring an explicit
readFileoverride when callers mark paths as validated, and reject filesystem-rootlocalRootsentries. (#16739). - Media/Security: allow outbound local media reads from the active agent workspace (including
workspace-<agentId>) via agent-scoped local roots, avoiding broad global allowlisting of all per-agent workspaces. (#17136) Thanks @MisterGuy420. - Outbound/Media: thread explicit
agentIdthrough coresendMessagedirect-delivery path so agent-scoped local media roots apply even when mirror metadata is absent. (#17268) Thanks @gumadeiras. - Discord/Security: harden voice message media loading (SSRF + allowed-local-root checks) so tool-supplied paths/URLs cannot be used to probe internal URLs or read arbitrary local files.
- Security/BlueBubbles: require explicit
mediaLocalRootsallowlists for local outbound media path reads to prevent local file disclosure. (#16322) Thanks @mbelinky. - Security/BlueBubbles: reject ambiguous shared-path webhook routing when multiple webhook targets match the same guid/password.
- Security/BlueBubbles: harden BlueBubbles webhook auth behind reverse proxies by only accepting passwordless webhooks for direct localhost loopback requests (forwarded/proxied requests now require a password). Thanks @simecek.
- Feishu/Security: harden media URL fetching against SSRF and local file disclosure. (#16285) Thanks @mbelinky.
- Security/Zalo: reject ambiguous shared-path webhook routing when multiple webhook targets match the same secret.
- Security/Nostr: require loopback source and block cross-origin profile mutation/import attempts. Thanks @vincentkoc.
- Security/Signal: harden signal-cli archive extraction during install to prevent path traversal outside the install root.
- Security/Hooks: restrict hook transform modules to
~/.openclaw/hooks/transforms(prevents path traversal/escape module loads via config). Config note:hooks.transformsDirmust now be within that directory. Thanks @akhmittra. - Security/Hooks: ignore hook package manifest entries that point outside the package directory (prevents out-of-tree handler loads during hook discovery).
- Security/Archive: enforce archive extraction entry/size limits to prevent resource exhaustion from high-expansion ZIP/TAR archives. Thanks @vincentkoc.
- Security/Media: reject oversized base64-backed input media before decoding to avoid large allocations. Thanks @vincentkoc.
- Security/Media: stream and bound URL-backed input media fetches to prevent memory exhaustion from oversized responses. Thanks @vincentkoc.
- Security/Skills: harden archive extraction for download-installed skills to prevent path traversal outside the target directory. Thanks @markmusson.
- Security/Slack: compute command authorization for DM slash commands even when
dmPolicy=open, preventing unauthorized users from running privileged commands via DM. Thanks @christos-eth. - Security/Pairing: scope pairing allowlist writes/reads to channel accounts (for example
telegram:yy), and propagate account-aware pairing approvals so multi-account channels do not share a single per-channel pairing allowFrom store. (#17631) Thanks @crazytan. - Security/iMessage: keep DM pairing-store identities out of group allowlist authorization (prevents cross-context command authorization). Thanks @vincentkoc.
- Security/Google Chat: deprecate
users/<email>allowlists (treatusers/...as immutable user id only); keep raw email allowlists for usability. Thanks @vincentkoc. - Security/Google Chat: reject ambiguous shared-path webhook routing when multiple webhook targets verify successfully (prevents cross-account policy-context misrouting). Thanks @vincentkoc.
- Telegram/Security: require numeric Telegram sender IDs for allowlist authorization (reject
@usernameprincipals), auto-resolve@usernameto IDs inopenclaw doctor --fix(when possible), and warn inopenclaw security auditwhen legacy configs contain usernames. Thanks @vincentkoc. - Telegram/Security: reject Telegram webhook startup when
webhookSecretis missing or empty (prevents unauthenticated webhook request forgery). Thanks @yueyueL. - Security/Windows: avoid shell invocation when spawning child processes to prevent cmd.exe metacharacter injection via untrusted CLI arguments (e.g. agent prompt text).
- Telegram: set webhook callback timeout handling to
onTimeout: "return"(10s) so long-running update processing no longer emits webhook 500s and retry storms. (#16763) Thanks @chansearrington. - Signal: preserve case-sensitive
group:target IDs during normalization so mixed-case group IDs no longer fail withGroup not found. (#16748) Thanks @repfigit. - Security/Agents: scope CLI process cleanup to owned child PIDs to avoid killing unrelated processes on shared hosts. Thanks @aether-ai-agent.
- Security/Agents: enforce workspace-root path bounds for
apply_patchin non-sandbox mode to block traversal and symlink escape writes. Thanks @p80n-sec. - Security/Agents: enforce symlink-escape checks for
apply_patchdelete hunks underworkspaceOnly, while still allowing deleting the symlink itself. Thanks @p80n-sec. - Security/Agents (macOS): prevent shell injection when writing Claude CLI keychain credentials. (#15924) Thanks @aether-ai-agent.
- macOS: hard-limit unkeyed
openclaw://agentdeep links and ignoredeliver/to/channelunless a valid unattended key is provided. Thanks @Cillian-Collins. - Scripts/Security: validate GitHub logins and avoid shell invocation in
scripts/update-clawtributors.tsto prevent command injection via malicious commit records. Thanks @scanleale. - Security: fix Chutes manual OAuth login state validation by requiring the full redirect URL (reject code-only pastes) (thanks @aether-ai-agent).
- Security/Gateway: harden tool-supplied
gatewayUrloverrides by restricting them to loopback or the configuredgateway.remote.url. Thanks @p80n-sec. - Security/Gateway: block
system.execApprovals.*vianode.invoke(useexec.approvals.node.*instead). Thanks @christos-eth. - Security/Gateway: reject oversized base64 chat attachments before decoding to avoid large allocations. Thanks @vincentkoc.
- Security/Gateway: stop returning raw resolved config values in
skills.statusrequirement checks (prevents operator.read clients from reading secrets). Thanks @simecek. - Security/Net: fix SSRF guard bypass via full-form IPv4-mapped IPv6 literals (blocks loopback/private/metadata access). Thanks @yueyueL.
- Security/Browser: harden browser control file upload + download helpers to prevent path traversal / local file disclosure. Thanks @1seal.
- Security/Browser: block cross-origin mutating requests to loopback browser control routes (CSRF hardening). Thanks @vincentkoc.
- Security/Node Host: enforce
system.runrawCommand/argv consistency to prevent allowlist/approval bypass. Thanks @christos-eth. - Security/Exec approvals: prevent safeBins allowlist bypass via shell expansion (host exec allowlist mode only; not enabled by default). Thanks @christos-eth.
- Security/Exec: harden PATH handling by disabling project-local
node_modules/.binbootstrapping by default, disallowing node-hostPATHoverrides, and spawning ACP servers via the current executable by default. Thanks @akhmittra. - Security/Tlon: harden Urbit URL fetching against SSRF by blocking private/internal hosts by default (opt-in:
channels.tlon.allowPrivateNetwork). Thanks @p80n-sec. - Security/Voice Call (Telnyx): require webhook signature verification when receiving inbound events; configs without
telnyx.publicKeyare now rejected unlessskipSignatureVerificationis enabled. Thanks @p80n-sec. - Security/Voice Call: require valid Twilio webhook signatures even when ngrok free tier loopback compatibility mode is enabled. Thanks @p80n-sec.
- Security/Discovery: stop treating Bonjour TXT records as authoritative routing (prefer resolved service endpoints) and prevent discovery from overriding stored TLS pins; autoconnect now requires a previously trusted gateway. Thanks @simecek.