cherry-pick: upstream bugfix commits (2026-02-08-2013)#117
cherry-pick: upstream bugfix commits (2026-02-08-2013)#117
Conversation
875b018 removed onToolResult from dispatch-from-config.ts to prevent tool summaries leaking into group channels. However, this also broke verbose tool summaries in DM/private sessions where they are expected. This restores onToolResult but gates it behind ChatType !== 'group', so group channels remain unaffected while DM verbose works again. mirror=false is passed to sendPayloadAsync to avoid duplicating tool summaries in the session transcript (matching the block reply behavior). Fixes openclaw#2665 (cherry picked from commit f27a503)
Native slash commands (e.g. /verbose, /status) should not emit tool summaries. Gate onToolResult behind CommandSource !== 'native' in addition to the existing ChatType !== 'group' check. Add test for native command exclusion. (cherry picked from commit c13c39f)
(cherry picked from commit 4ac7aa4)
…ibility (openclaw#3750) NTFS does not allow < or > in filenames, causing the XML filename escaping test to fail on Windows CI with ENOENT. Replace file<test>.txt with file&test.txt — & is valid on all platforms and still requires XML escaping (&), preserving the test's intent. Fixes openclaw#3748 (cherry picked from commit c200350)
(cherry picked from commit 718bc3f) # Conflicts: # CHANGELOG.md # src/telegram/bot-native-commands.ts # src/telegram/bot/delivery.ts
@vinaygit18) (cherry picked from commit 4583f88) # Conflicts: # CHANGELOG.md
(cherry picked from commit d47b4e6) # Conflicts: # src/commands/onboard-auth.config-core.ts # src/plugins/config-state.ts
(cherry picked from commit 0257661) # Conflicts: # docs/providers/xiaomi.md # package.json # src/cli/banner.ts # src/commands/doctor-gateway-services.ts # src/commands/doctor.ts # src/commands/onboard-helpers.ts # src/daemon/inspect.ts
(cherry picked from commit a155e2f) # Conflicts: # src/commands/doctor-config-flow.ts
(cherry picked from commit 9886fd1) # Conflicts: # package.json # src/commands/onboard-helpers.ts # src/config/paths.ts
(cherry picked from commit b9afa3d) # Conflicts: # package.json # src/infra/state-migrations.ts
(cherry picked from commit 151ddd6) # Conflicts: # package.json
…obhparker) (cherry picked from commit 9025da2) # Conflicts: # src/telegram/bot-native-commands.ts
(cherry picked from commit bc432d8) # Conflicts: # README.md
(cherry picked from commit da71eae) # Conflicts: # CHANGELOG.md # src/markdown/render.ts # src/telegram/format.test.ts
…penclaw#4593) OAuth credentials with a refresh token auto-renew on first API call, so the doctor should not warn about access token expiration when a refresh token is present. This avoids unnecessary "expired" warnings that prompt users to re-auth when no action is needed. Fixes openclaw#3032 Co-authored-by: Ayush Ojha <[email protected]> (cherry picked from commit 37e295f)
Co-authored-by: jlowin <[email protected]> (cherry picked from commit f24e3cd) # Conflicts: # src/cli/models-cli.ts # src/commands/models/list.status-command.ts # src/commands/models/list.status.test.ts
(cherry picked from commit daf27dd) # Conflicts: # CHANGELOG.md
Co-authored-by: Hisleren <[email protected]> (cherry picked from commit e5a95b5) # Conflicts: # src/commands/configure.gateway.ts # src/wizard/onboarding.gateway-config.ts
…Hisleren) Co-authored-by: Hisleren <[email protected]> (cherry picked from commit 39eb0b7) # Conflicts: # CHANGELOG.md
…hanks @YuriNachos) Co-authored-by: YuriNachos <[email protected]> (cherry picked from commit 34bdbdb) # Conflicts: # CHANGELOG.md # src/infra/control-ui-assets.ts
…unce routing (openclaw#4957) * fix: prefer requesterOrigin over stale session entry in subagent announce routing When a subagent finishes and announces results back, resolveAnnounceOrigin merged the session entry (primary) with requesterOrigin (fallback). If the session store had a stale lastChannel (e.g. whatsapp) from a previous interaction but the user was now on a different channel (e.g. bluebubbles), the announce would route to the wrong channel. Swap the merge order so requesterOrigin (captured at spawn time, reflecting the actual current channel) takes priority, with the session entry as fallback for any missing fields. Error before fix: Delivery failed (whatsapp to bluebubbles:chat_guid:...): Unknown channel: whatsapp Adds regression test for the stale-channel scenario. * fix: match test to exact failure scenario and improve reliability (openclaw#4957) (thanks @tyler6204) - Remove lastTo from stale session store to match the exact mismatch scenario described in the PR - Replace 5ms setTimeout sleeps with expect.poll for better test reliability - Prevents flakiness on slower CI machines (cherry picked from commit 57248a7)
…jasonsschin) (cherry picked from commit e849df6) # Conflicts: # CHANGELOG.md # src/telegram/token.ts
(cherry picked from commit 310eed8) # Conflicts: # src/config/sessions/store.ts # src/utils/delivery-context.test.ts # src/utils/delivery-context.ts
(cherry picked from commit 48aaf6c)
(cherry picked from commit 3c8fa0f) # Conflicts: # src/cli/completion-cli.ts
(cherry picked from commit e9f0be0) # Conflicts: # src/agents/pi-embedded-runner/compact.ts # src/agents/pi-model-discovery.ts
* Fix: Enable scrolling in dashboard * Fix: Enable scrolling in dashboard * Fix: Enable scrolling in dashboard (cherry picked from commit cefd87f)
(cherry picked from commit de7b2ba) # Conflicts: # docs/tools/thinking.md
Adds cleanup handlers to release held file locks when the process terminates via SIGTERM, SIGINT, or normal exit. This prevents orphaned lock files that would block future sessions. Fixes openclaw#1951 (cherry picked from commit ec0728b)
The dist/control-ui/ files were committed before the dist/ gitignore rule was effective. These build artifacts get regenerated during builds, causing dirty repo errors that block the auto-update mechanism. Removes the files from git tracking while keeping them locally and respecting the existing dist/ gitignore entry. Fixes openclaw#1838 Co-authored-by: Claude <[email protected]> (cherry picked from commit 3ad7958)
…2022) HOTFIX: Tool summaries were not being sent to chat channels when verbose mode was enabled. The onToolResult callback was defined in the types but never wired up in dispatch-from-config.ts. This adds the missing callback alongside onBlockReply, using the same dispatcher.sendBlockReply() path to deliver tool summaries to WhatsApp, Telegram, and other chat channels. Fixes verbose tool summaries not appearing in WhatsApp despite /verbose on. (cherry picked from commit 05b28c1)
(cherry picked from commit 47538bc) # Conflicts: # src/gateway/server-http.ts
(cherry picked from commit 8abce8a)
(cherry picked from commit f16e32b)
* fix: Gateway authentication token exposed in URL query parameters * fix: silence unused hook token url param * fix: remove gateway auth tokens from URLs (openclaw#9436) (thanks @coygeek) * test: fix Windows path separators in audit test (openclaw#9436) --------- Co-authored-by: George Pickett <[email protected]> (cherry picked from commit 717129f) # Conflicts: # docs/gateway/configuration.md # docs/help/faq.md # docs/platforms/exe-dev.md # docs/start/clawd.md # docs/web/dashboard.md # src/commands/dashboard.ts # src/gateway/hooks.ts # src/gateway/server-http.ts # src/wizard/onboarding.finalize.ts # ui/src/ui/app-settings.ts # ui/src/ui/views/overview.ts
(cherry picked from commit 7224585) # Conflicts: # CHANGELOG.md # src/infra/control-ui-assets.ts
(cherry picked from commit b40da2c)
…resolution (cherry picked from commit 4a59b77) # Conflicts: # src/cli/update-cli.ts # src/version.ts
* fix: guard resolveUserPath against undefined input When subagent spawner omits workspaceDir, resolveUserPath receives undefined and crashes on .trim(). Add a falsy guard that falls back to process.cwd(), matching the behavior callers already expect. Closes openclaw#10089 Co-Authored-By: Claude Opus 4.6 <[email protected]> * fix: harden runner workspace fallback (openclaw#10176) (thanks @Yida-Dev) * fix: harden workspace fallback scoping (openclaw#10176) (thanks @Yida-Dev) * refactor: centralize workspace fallback classification and redaction (openclaw#10176) (thanks @Yida-Dev) * test: remove explicit any from utils mock (openclaw#10176) (thanks @Yida-Dev) * security: reject malformed agent session keys for workspace resolution (openclaw#10176) (thanks @Yida-Dev) --------- Co-authored-by: Yida-Dev <[email protected]> Co-authored-by: Claude Opus 4.6 <[email protected]> Co-authored-by: Gustavo Madeira Santana <[email protected]> (cherry picked from commit 4216449) # Conflicts: # CHANGELOG.md # src/agents/cli-runner.test.ts # src/agents/cli-runner.ts # src/agents/pi-embedded-runner/run.ts # src/agents/pi-embedded-runner/run/attempt.ts # src/auto-reply/reply/agent-runner-execution.ts # src/commands/status-all/channels.ts # src/utils.test.ts
…n session-memory (openclaw#10730) * fix: replace debug console.log with proper subsystem logging in session-memory * fix(hooks): normalize session-memory subsystem logging --------- Co-authored-by: Tak Hoffman <[email protected]> (cherry picked from commit 2c8af78)
…openclaw#10776) * refactor: update cron job wake mode and run mode handling - Changed default wake mode from 'next-heartbeat' to 'now' in CronJobEditor and related CLI commands. - Updated cron-tool tests to reflect changes in run mode, introducing 'due' and 'force' options. - Enhanced cron-tool logic to handle new run modes and ensure compatibility with existing job structures. - Added new tests for delivery plan consistency and job execution behavior under various conditions. - Improved normalization functions to handle wake mode and session target casing. This refactor aims to streamline cron job configurations and enhance the overall user experience with clearer defaults and improved functionality. * test: enhance cron job functionality and UI - Added tests to ensure the isolated agent correctly announces the final payload text when delivering messages via Telegram. - Implemented a new function to pick the last deliverable payload from a list of delivery payloads. - Enhanced the cron service to maintain legacy "every" jobs while minute cron jobs recompute schedules. - Updated the cron store migration tests to verify the addition of anchorMs to legacy every schedules. - Improved the UI for displaying cron job details, including job state and delivery information, with new styles and layout adjustments. These changes aim to improve the reliability and user experience of the cron job system. * test: enhance sessions thinking level handling - Added tests to verify that the correct thinking levels are applied during session spawning. - Updated the sessions-spawn-tool to include a new parameter for overriding thinking levels. - Enhanced the UI to support additional thinking levels, including "xhigh" and "full", and improved the handling of current options in dropdowns. These changes aim to improve the flexibility and accuracy of thinking level configurations in session management. * feat: enhance session management and cron job functionality - Introduced passthrough arguments in the test-parallel script to allow for flexible command-line options. - Updated session handling to hide cron run alias session keys from the sessions list, improving clarity. - Enhanced the cron service to accurately record job start times and durations, ensuring better tracking of job execution. - Added tests to verify the correct behavior of the cron service under various conditions, including zero-delay timers. These changes aim to improve the usability and reliability of session and cron job management. * feat: implement job running state checks in cron service - Added functionality to prevent manual job runs if a job is already in progress, enhancing job management. - Updated the `isJobDue` function to include checks for running jobs, ensuring accurate scheduling. - Enhanced the `run` function to return a specific reason when a job is already running. - Introduced a new test case to verify the behavior of forced manual runs during active job execution. These changes aim to improve the reliability and clarity of cron job execution and management. * feat: add session ID and key to CronRunLogEntry model - Introduced `sessionid` and `sessionkey` properties to the `CronRunLogEntry` struct for enhanced tracking of session-related information. - Updated the initializer and Codable conformance to accommodate the new properties, ensuring proper serialization and deserialization. These changes aim to improve the granularity of logging and session management within the cron job system. * fix: improve session display name resolution - Updated the `resolveSessionDisplayName` function to ensure that both label and displayName are trimmed and default to an empty string if not present. - Enhanced the logic to prevent returning the key if it matches the label or displayName, improving clarity in session naming. These changes aim to enhance the accuracy and usability of session display names in the UI. * perf: skip cron store persist when idle timer tick produces no changes recomputeNextRuns now returns a boolean indicating whether any job state was mutated. The idle path in onTimer only persists when the return value is true, eliminating unnecessary file writes every 60s for far-future or idle schedules. * fix: prep for merge - explicit delivery mode migration, docs + changelog (openclaw#10776) (thanks @tyler6204) (cherry picked from commit d90cac9) # Conflicts: # CHANGELOG.md # docs/automation/cron-jobs.md # scripts/test-parallel.mjs # src/agents/openclaw-tools.subagents.sessions-spawn-applies-thinking-default.test.ts # src/cli/cron-cli/register.cron-add.ts # src/cron/delivery.ts # src/cron/isolated-agent.skips-delivery-without-whatsapp-recipient-besteffortdeliver-true.test.ts # src/cron/isolated-agent/run.ts # src/cron/normalize.ts # src/cron/run-log.ts # src/cron/service.every-jobs-fire.test.ts # src/cron/service.skips-main-jobs-empty-systemevent-text.test.ts # src/cron/service.store.migration.test.ts # src/cron/service/jobs.ts # src/cron/service/store.ts # src/cron/service/timer.ts # src/cron/store.ts # src/gateway/protocol/schema/cron.ts # src/gateway/session-utils.ts # ui/src/ui/app-defaults.ts # ui/src/ui/app-render.helpers.ts # ui/src/ui/app-render.ts # ui/src/ui/format.test.ts # ui/src/ui/format.ts # ui/src/ui/views/cron.ts # ui/src/ui/views/sessions.ts
* feat(bluebubbles): auto-strip markdown from outbound messages (openclaw#7402) * fix(security): add timeout to webhook body reading (openclaw#6762) Adds 30-second timeout to readBody() in voice-call, bluebubbles, and nostr webhook handlers. Prevents Slow-Loris DoS (CWE-400, CVSS 7.5). Merged with existing maxBytes protection in voice-call. * fix(security): unify Error objects and lint fixes in webhook timeouts (openclaw#6762) * fix: prevent plugins from auto-enabling without user consent (openclaw#3961) Changes default plugin enabled state from true to false in enablePluginEntry(). Preserves existing enabled:true values. Fixes openclaw#3932. * fix: apply hierarchical mediaMaxMb config to all channels (openclaw#8749) Generalizes resolveAttachmentMaxBytes() to use account → channel → global config resolution for all channels, not just BlueBubbles. Fixes openclaw#7847. * fix(bluebubbles): sanitize attachment filenames against header injection (openclaw#10333) Strip ", \r, \n, and \\ from filenames after path.basename() to prevent multipart Content-Disposition header injection (CWE-93, CVSS 5.4). Also adds sanitization to setGroupIconBlueBubbles which had zero filename sanitization. * fix(lint): exclude extensions/ from Oxlint preflight check (openclaw#9313) Extensions use PluginRuntime|null patterns that trigger no-redundant-type-constituents because PluginRuntime resolves to any. Excluding extensions/ from Oxlint unblocks user upgrades. Re-applies the approach from closed PR openclaw#10087. * fix(bluebubbles): add tempGuid to createNewChatWithMessage payload (openclaw#7745) Non-Private-API mode (AppleScript) requires tempGuid in send payloads. The main sendMessageBlueBubbles already had it, but createNewChatWithMessage was missing it, causing 400 errors for new chat creation without Private API. * fix: send stop-typing signal when run ends with NO_REPLY (openclaw#8785) Adds onCleanup callback to the typing controller that fires when the controller is cleaned up while typing was active (e.g., after NO_REPLY). Channels using createTypingCallbacks automatically get stop-typing on cleanup. This prevents the typing indicator from lingering in group chats when the agent decides not to reply. * fix(telegram): deduplicate skill commands in multi-agent setup (openclaw#5717) Two fixes: 1. Skip duplicate workspace dirs when listing skill commands across agents. Multiple agents sharing the same workspace would produce duplicate commands with _2, _3 suffixes. 2. Clear stale commands via deleteMyCommands before registering new ones. Commands from deleted skills now get cleaned up on restart. * fix: add size limits to unbounded in-memory caches (openclaw#4948) Adds max-size caps with oldest-entry eviction to prevent OOM in long-running deployments: - BlueBubbles serverInfoCache: 64 entries (already has TTL) - Google Chat authCache: 32 entries - Matrix directRoomCache: 1024 entries - Discord presenceCache: 5000 entries per account * fix: address review concerns (openclaw#11093) - Chain deleteMyCommands → setMyCommands to prevent race condition (openclaw#5717) - Rename enablePluginEntry to registerPluginEntry (now sets enabled: false) - Add Slow-Loris timeout test for readJsonBody (openclaw#6023) (cherry picked from commit 1007d71) # Conflicts: # extensions/bluebubbles/src/chat.ts # extensions/bluebubbles/src/send.ts # extensions/voice-call/src/webhook.ts # src/auto-reply/skill-commands.ts # src/config/plugin-auto-enable.ts
* fix: add .caf to AUDIO_FILE_EXTENSIONS for iMessage voice messages * fix: add caf audio extension regression coverage (openclaw#10982) (thanks @succ985) --------- Co-authored-by: succ985 <[email protected]> Co-authored-by: Gustavo Madeira Santana <[email protected]> (cherry picked from commit b8f740f) # Conflicts: # CHANGELOG.md # src/media/mime.test.ts
…penclaw#11579) * fix: gracefully handle oversized tool results causing context overflow When a subagent reads a very large file or gets a huge tool result (e.g., gh pr diff on a massive PR), it can exceed the model's context window in a single prompt. Auto-compaction can't help because there's no older history to compact — just one giant tool result. This adds two layers of defense: 1. Pre-emptive: Hard cap on tool result size (400K chars ≈ 100K tokens) applied in the session tool result guard before persistence. This prevents extremely large tool results from being stored in full, regardless of model context window size. 2. Recovery: When context overflow is detected and compaction fails, scan session messages for oversized tool results relative to the model's actual context window (30% max share). If found, truncate them in the session via branching (creating a new branch with truncated content) and retry the prompt. The truncation preserves the beginning of the content (most useful for understanding what was read) and appends a notice explaining the truncation and suggesting offset/limit parameters for targeted reads. Includes comprehensive tests for: - Text truncation with newline-boundary awareness - Context-window-proportional size calculation - In-memory message truncation - Oversized detection heuristics - Guard-level size capping during persistence * fix: prep fixes for tool result truncation PR (openclaw#11579) (thanks @tyler6204) (cherry picked from commit 0deb8b0) # Conflicts: # src/agents/pi-embedded-runner/run.ts # src/agents/session-tool-result-guard.test.ts # src/agents/session-tool-result-guard.ts
(cherry picked from commit 95263f4) # Conflicts: # src/memory/search-manager.test.ts
…canvas (openclaw#4824) * fix: use STATE_DIR instead of hardcoded ~/.openclaw for identity and canvas device-identity.ts and canvas-host/server.ts used hardcoded path.join(os.homedir(), '.openclaw', ...) ignoring OPENCLAW_STATE_DIR env var and the resolveStateDir() logic from config/paths.ts. This caused ~/.openclaw/identity and ~/.openclaw/canvas directories to be created even when state dir was overridden or resided elsewhere. * fix: format and remove duplicate imports * fix: scope state-dir patch + add regression tests (openclaw#4824) (thanks @kossoy) * fix: align state-dir fallbacks in hooks and agent paths (openclaw#4824) (thanks @kossoy) --------- Co-authored-by: Gustavo Madeira Santana <[email protected]> (cherry picked from commit ebe5730) # Conflicts: # CHANGELOG.md # src/agents/agent-scope.ts # src/agents/sandbox/constants.ts # src/canvas-host/server.ts # src/cli/update-cli.ts # src/commands/agents.test.ts # src/hooks/bundled/command-logger/handler.ts # src/hooks/bundled/session-memory/handler.ts # src/infra/device-identity.ts
…penclaw#11664) (thanks @tyler6204) * initial commit * feat: implement deriveSessionTotalTokens function and update usage tests * Added deriveSessionTotalTokens function to calculate total tokens based on usage and context tokens. * Updated usage tests to include cases for derived session total tokens. * Refactored session usage calculations in multiple files to utilize the new function for improved accuracy. * fix: restore overflow truncation fallback + changelog/test hardening (openclaw#11551) (thanks @tyler6204) (cherry picked from commit 191da1f) # Conflicts: # CHANGELOG.md # scripts/test-parallel.mjs # src/agents/clawdbot-tools.subagents.sessions-spawn-normalizes-allowlisted-agent-ids.test.ts # src/agents/pi-embedded-runner/run.overflow-compaction.test.ts # src/agents/pi-embedded-runner/run.ts # src/agents/pi-embedded-runner/run/types.ts # src/agents/pi-embedded-subscribe.handlers.messages.ts # src/agents/subagent-announce.format.test.ts # src/agents/subagent-announce.ts # src/agents/subagent-registry.ts # src/agents/timeout.ts # src/agents/usage.test.ts # src/commands/agent/session-store.ts # ui/src/styles/components.css # ui/src/ui/views/chat.ts
| const desc = c | ||
| .description() | ||
| .replace(/'/g, "'\\''") | ||
| .replace(/\[/g, "\\[") | ||
| .replace(/\]/g, "\\]"); |
Check failure
Code scanning / CodeQL
Incomplete string escaping or encoding High
Show autofix suggestion
Hide autofix suggestion
Copilot Autofix
AI 2 months ago
In general, to fix incomplete escaping when using String.replace, you must ensure that all relevant metacharacters for the target context are handled, including backslashes, and that replacements are global (using regexes with the g flag). In many cases, using a dedicated escaping/sanitization helper is better than duplicating similar logic in multiple places.
In this file, the specific issue is in generateZshSubcmdList, where the description is escaped like this:
const desc = c
.description()
.replace(/'/g, "'\\''")
.replace(/\[/g, "\\[")
.replace(/\]/g, "\\]");Backslashes in the original description are not escaped, so an input containing \ can interact badly with the subsequent escaping for ', [, and ] or with the zsh _arguments syntax. The minimal, behavior-preserving fix is to first escape backslashes themselves, then apply the existing replacements. That way, any literal backslash in the description becomes \\ in the completion script, preventing it from unintentionally escaping characters that follow.
We only need to modify the generateZshSubcmdList function in src/cli/completion-cli.ts. Specifically, in the .map((c) => { ... }) block, we should insert a .replace(/\\/g, "\\\\") before the other replacements on c.description(). No new imports or helper functions are required; the built-in String.replace with a regex literal is sufficient.
| @@ -152,6 +152,7 @@ | ||
| .map((c) => { | ||
| const desc = c | ||
| .description() | ||
| .replace(/\\/g, "\\\\") | ||
| .replace(/'/g, "'\\''") | ||
| .replace(/\[/g, "\\[") | ||
| .replace(/\]/g, "\\]"); |
| const desc = c | ||
| .description() | ||
| .replace(/'/g, "'\\''") | ||
| .replace(/\[/g, "\\[") |
Check failure
Code scanning / CodeQL
Incomplete string escaping or encoding High
Show autofix suggestion
Hide autofix suggestion
Copilot Autofix
AI 2 months ago
In general, the fix is to ensure that all characters with special meaning in the target context (here, zsh completion descriptions inside single quotes and bracket expressions) are escaped consistently. Since we are already doing string .replace operations to escape some characters, we should extend that sequence to also escape backslashes (\), and do so before any replacements that introduce new backslashes. Alternatively, a dedicated shell-escaping utility could be used, but here a targeted additional replacement is sufficient.
Concretely, in src/cli/completion-cli.ts, in generateZshSubcmdList, we build desc from c.description() and then chain .replace(/'/g, "'\\''"), .replace(/\[/g, "\\["), .replace(/\]/g, "\\]"). We should add an initial .replace(/\\/g, "\\\\") so that every backslash in the original description becomes \\ in the output. This must be the first replacement in the chain, because the later replacements insert backslashes; escaping those again would change their meaning. No other parts of the file need changes, and no new imports are required.
| @@ -152,6 +152,7 @@ | ||
| .map((c) => { | ||
| const desc = c | ||
| .description() | ||
| .replace(/\\/g, "\\\\") | ||
| .replace(/'/g, "'\\''") | ||
| .replace(/\[/g, "\\[") | ||
| .replace(/\]/g, "\\]"); |
Patchbot
CI Checks (0/0 passed)
Updated 2026-03-01T02:37:09.568Z · Run #22534269444 |
* Revert "cherry-pick: upstream refactor/feature commits (2026-02-08-2013) (#119)" This reverts commit ca1d391. * Revert "cherry-pick: upstream bugfix commits (2026-02-08-2013) (#117)" This reverts commit b5bcbd8. * Revert "cherry-pick: upstream deps/security commits (2026-02-08-2013) (#115)" This reverts commit 89c4883. * Revert "cherry-pick: upstream ci commits (2026-02-08-2013) (#116)" This reverts commit 595f964. * Revert "cherry-pick: upstream docs commits (2026-02-08-2013) (#118)" This reverts commit da859ed.
Summary
Automated cherry-pick of upstream
bugfixcommits fromupstream/main.This branch was created from
origin/main, so cherry-picks apply cleanly ontheir own upstream lineage. Any merge conflicts in this PR are due to fork
divergence in
daisy/devand should be resolved during merge (not in thecherry-picks themselves).
Commits
f27a5030fix: restore verbose tool summaries in DM sessions (risk: 1/5)c13c39f1fix: exclude native slash commands from onToolResult (risk: 1/5)4ac7aa4afix: handle telegram video notes (fix(telegram): add video_note support openclaw/openclaw#2905) (thanks @mylukin) (risk: 1/5)fcc53bcffix: include AccountId in telegram native command context (fix(telegram): include AccountId in native command context for multi-agent routing openclaw/openclaw#2942) (thanks @Chloe-VP) (risk: 1/5)c2003509fix: use & instead of <> in XML escaping test for Windows NTFS compatibility (fix: Windows CI — use & instead of <> in XML escaping filename test openclaw/openclaw#3750) (risk: 1/5)718bc3f9fix: avoid silent telegram empty replies (fix(telegram): empty-response fallback openclaw/openclaw#3796) (fix(telegram): empty-response fallback openclaw/openclaw#3796) (risk: 1/5)4583f886fix: preserve reasoning tags inside code blocks (fix(telegram): preserve reasoning tags inside code blocks (#3952) openclaw/openclaw#4118) (thanks @vinaygit18) (risk: 1/5)d47b4e6ffix: update config types (risk: 2/5)02576615fix: migrate legacy gateway services (risk: 2/5)a155e2f8fix: migrate legacy config (risk: 1/5)9886fd1afix: migrate legacy state dirs (risk: 1/5)b9afa3d3fix: migrate symlinked legacy state dirs (risk: 1/5)151ddd62fix: detect legacy gateway launchd labels (risk: 1/5)9025da22fix: scope telegram skill commands per bot (fix(telegram): scope skill commands to bound agent per bot openclaw/openclaw#4360) (thanks @robhparker) (risk: 1/5)3a85cb18fix: honor Telegram proxy dispatcher (fix(telegram): use undici fetch for proxy to fix dispatcher option openclaw/openclaw#4456) (thanks @spiceoogway) (risk: 1/5)bc432d84fix: accept numeric Telegram react ids (fix(telegram): react action accepts numeric messageId and chatId openclaw/openclaw#4533) (thanks @Ayush10) (risk: 1/5)fa9ec6e8fix: add docker ui install changelog entry (perf: skip redundant ui install in Dockerfile openclaw/openclaw#4584) (thanks @obviyus) (risk: 1/5)da71eaebfix: correct telegram html nesting (fix(telegram): properly nest overlapping HTML tags (#4071) openclaw/openclaw#4578) (thanks @ThanhNguyxn) (risk: 1/5)37e295fcfix: don't warn about expired OAuth tokens with valid refresh tokens (fix: don't warn about expired OAuth tokens with valid refresh tokens openclaw/openclaw#4593) (risk: 2/5)09be5d45Merge pull request fix(line): resolve TypeError in status command when LINE is enabled openclaw/openclaw#4651 from yuting0624/fix/status-command-line-crash (risk: 1/5)f24e3cdafix: local updates for PR CLI: add --agent flag to models status openclaw/openclaw#4780 (risk: 2/5)daf27dd3fix: add per-agent models status (CLI: add --agent flag to models status openclaw/openclaw#4780) (thanks @jlowin) (risk: 1/5)e5a95b5bfix: local updates for PR fix(security): prevent gateway token from defaulting to 'undefined' string openclaw/openclaw#4873 (risk: 1/5)39eb0b7bfix: prevent undefined gateway token defaults (fix(security): prevent gateway token from defaulting to 'undefined' string openclaw/openclaw#4873) (thanks @Hisleren) (risk: 1/5)34bdbdb4fix: resolve Control UI assets for global installs (fix(infra): resolve control-ui assets on npm global install openclaw/openclaw#4909) (thanks @YuriNachos) (risk: 1/5)57248a7cfix: prefer requesterOrigin over stale session entry in subagent announce routing (fix: prefer requesterOrigin over stale session entry in subagent announce routing openclaw/openclaw#4957) (risk: 1/5)e849df64fix: normalize telegram account token lookup (Fix Telegram per-account token resolution when account keys aren't normalized openclaw/openclaw#5055) (thanks @jasonsschin) (risk: 1/5)310eed82fix: preserve delivery thread fallback (fix: Telegram threadId delivery context fallback openclaw/openclaw#4911) (thanks @yevhen) (risk: 1/5)48aaf6cefix: suppress banner and doctor checks for completion command (risk: 1/5)3c8fa0f9fix: remove unused variables and fix template literal type (risk: 1/5)e9f0be06fix: repair docker build typing (risk: 1/5)d2a852b9fix: align embedded session setup with sdk (risk: 1/5)51e72d41fix: restore embedded extension discovery typings (risk: 1/5)a42e1c82fix: restore tsc build and plugin install tests (risk: 2/5)ee26b68ffix: lint cleanups (risk: 1/5)ed65131cfix: Also buildentry.tsintodist/entry.mjs. (risk: 1/5)4b740671fix: Update a few moreentry.jstoentry.mjspaths. (risk: 1/5)68ba1afbfix: Fixscripts/watch-node.mjsand usetsdown --watch. (risk: 1/5)ddc5683cfix: resolve workspace templates from package root (risk: 1/5)e25fedf9fix: retry gateway watch after dist rebuild (risk: 1/5)dae00fe1fix: UpdateCONTRIBUTING.md+ adjustwatch-node.mjsagain to be faster withtsc. (risk: 1/5)c3a8a537fix: sync docker-compose gateway command (risk: 2/5)b9b94715fix: avoid stderr backpressure in macOS discovery (Fix potential subprocess hang by discarding stderr pipe openclaw/openclaw#3304) (thanks @abhijeet117) (risk: 1/5)37721ebdfix: restore telegram draft streaming partials (risk: 2/5)a64d8d2dfix: harden telegram streaming state (risk: 1/5)b5c2b188fix: stabilize partial streaming filters (risk: 1/5)f1de88c1fix: restore telegram draft streaming partials (fix: restore telegram draft streaming partials openclaw/openclaw#5543) (thanks @obviyus) (risk: 1/5)58f41859fix: Failing tests due to import sorting. (risk: 2/5)dc8a63cbfix: skip extension append if command already has one (risk: 1/5)3d5c03ecfix: resolve Windows npm spawn ENOENT (fix(process): resolve npm/pnpm spawn ENOENT on Windows openclaw/openclaw#5815) (thanks @thejhinvirtuoso) (risk: 1/5)c621c80afix(tui): prevent crash when searching with digits in model selector (risk: 1/5)633f8484fix: use telegram user id for pairing request (risk: 1/5)1f3afa38fix: use shared pairing store for telegram (refactor: use shared pairing store for telegram openclaw/openclaw#6127) (thanks @obviyus) (risk: 1/5)a1e89afcfix: secure chrome extension relay cdp (risk: 1/5)b897389bfix: friendlier Windows onboarding message (fix: friendlier Windows onboarding message openclaw/openclaw#6242) (risk: 1/5)5d3c898afix: update compaction safeguard to respect context window tokens (risk: 1/5)0992c5a8fix: cap context window resolution (fix: custom configured context tokens not respected openclaw/openclaw#6187) (thanks @iamEvanYT) (risk: 1/5)e9f70e85fix: satisfy lint curly rule (fix: satisfy lint curly rule openclaw/openclaw#6310) (risk: 1/5)083ec932fix: cover OpenRouter attribution headers (risk: 1/5)bcde2fcafix: align embedded agent session setup (risk: 2/5)8eb11bd3fix: wire before_tool_call hook into tool execution (Fix missing before_tool_call hook integration openclaw/openclaw#6570) (thanks @ryancnelson) (Fix before_tool_call hook execution openclaw/openclaw#6660) (risk: 1/5)3367b2aafix: align embedded runner with session API changes (risk: 2/5)a87a07ecfix: harden host exec env validation (### Security Fix: Prevent Hidden Execution via Environment Variables openclaw/openclaw#4896) (thanks @HassanFleyah) (risk: 1/5)19775abdfix: clean up plugin linting and types (risk: 1/5)e58291e0fix: align embedded runner with pi-coding-agent API (risk: 2/5)7aeabbabfix: refine oauth provider guard (risk: 2/5)aa2eb48bfix: align pi-coding-agent typings and docs (risk: 1/5)4347d246fix: format issues and lint error in oauth.ts (risk: 2/5)7ee99af9fix: convert HTML comments to MDX comments in docs (risk: 1/5)dda8a2b2fix: format docs (risk: 1/5)5020bfa2fix: L2-normalize local embedding vectors to fix semantic search (fix: L2-normalize local embedding vectors to fix semantic search openclaw/openclaw#5332) (risk: 1/5)19b8416afix: unify telegram thread handling (risk: 1/5)1d7dd5f2fix: require thread specs for telegram sends (risk: 1/5)0bc8a592fix: inline telegram thread scope type (risk: 1/5)e25f8ed5fix: add changelog for telegram thread spec (fix: telegram thread handling (DM vs forum) openclaw/openclaw#6833) (thanks @obviyus) (risk: 1/5)01449a2ffix: add telegram download timeouts (fix(telegram): add timeout to file download to prevent DoS (CWE-400) openclaw/openclaw#6914) (thanks @hclsys) (risk: 1/5)521b1218fix: treat '*' tool allowlist as valid (risk: 1/5)9ef24fd4fix: flush block streaming on paragraph boundaries for chunkMode=newline (fix: flush block streaming on paragraph boundaries for chunkMode=newline openclaw/openclaw#7014) (risk: 2/5)34dd7324fix: restore lint/build gates (risk: 2/5)d03eca84fix: harden plugin and hook install paths (risk: 1/5)41cc5bcdfix: gate Teams media auth retries (risk: 1/5)b8174decfix: resolve system prompt overrides (risk: 1/5)284d2420fix: align tool execute signature (risk: 1/5)2d317ce4fix: align tool execute parameter order (risk: 1/5)9ae1b732fix: align tool definition adapter (risk: 1/5)bcb0ed08fix: normalize tool execute args (risk: 1/5)845d97b6fix: handle legacy tool execute signatures (risk: 1/5)bf08b485fix: satisfy tool adapter lint (risk: 1/5)81c68f58fix: guard remote media fetches with SSRF checks (risk: 2/5)66307695fix: start gateway in docker CMD (fix(docker): add gateway subcommand and cloud-compatible flags openclaw/openclaw#6635) (thanks @kaizen403) (risk: 1/5)dfef943ffix: polish docker setup flow (risk: 2/5)9bd64c8afix: expand SSRF guard coverage (risk: 2/5)f9fae2c4fix: stabilize docker e2e flows (risk: 1/5)822388fefix: address review feedback — retryDelay uses effectiveForce, default overrides param, @State() on chatNewMessagesBelow (risk: 1/5)d3bb3227fix: resolve check errors in nodes-tool and commands-ptt (risk: 1/5)a63ec41afix: validate AbortSignal instances before calling AbortSignal.any() (risk: 1/5)5fb8f779fix: validate AbortSignal instances before calling AbortSignal.any() (fix: validate AbortSignal instances before calling AbortSignal.any() openclaw/openclaw#7277) (thanks @Elarwei001) (risk: 1/5)f49297e2fix: skip audio files from text extraction to prevent binary processing (fix: skip audio files from text extraction to prevent binary processing openclaw/openclaw#7475) (risk: 1/5)cfd6b21dfix: repair malformed tool calls and session transcripts (Agents: repair malformed tool calls and session files openclaw/openclaw#7473) (thanks @justinhuangcode) (risk: 1/5)d1ecb460fix: harden exec allowlist parsing (risk: 1/5)e9f182defix: error handling in restore failure reporting (risk: 1/5)23cfcd60Fix build regressions after merge (risk: 1/5)d0b98c75fix: make QMD cache key deterministic (risk: 1/5)edd6289ffix: derive citations chat type via session parser (risk: 1/5)7d5ca117fix: restore session_status and CLI examples (risk: 1/5)afbb1af6fix: restore safety + session_status hints (risk: 1/5)1ee57cf7fix: changelog entry for QMD memory (feat (memory): Implement new (opt-in) QMD memory backend openclaw/openclaw#3160) (thanks @vignesh07) (risk: 1/5)e3b85b98fix: shell completion and drop onboarding prompt (risk: 1/5)42500341fix: Removetsconfig.oxlint.jsonAGAIN. (risk: 1/5)be4f7ef3fix: Fix Mac app build step. (risk: 1/5)a7f4a53cfix: harden Windows exec allowlist (risk: 1/5)9d2066bdfix: restore OpenClaw docs/source links in system prompt (risk: 1/5)66d8117dfix: harden control ui framing + ws origin (risk: 2/5)a9bb96adfix: use build-info for version fallback (risk: 1/5)e895e85ffix: improve build-info resolution for commit/version (risk: 1/5)6b4b6049fix: enforce Nextcloud Talk allowlist by user id (risk: 1/5)9c5941bafix: add legacy daemon-cli shim for updates (risk: 1/5)41a4f120fix: honor telegram model overrides in buttons (Telegram: add inline button model selection openclaw/openclaw#8193) (thanks @gildo) (risk: 1/5)4a5d3689fix: keep Moonshot CN base URL in onboarding (feat: add support for Moonshot API key for Other endpoint openclaw/openclaw#7180) (thanks @waynelwz) (risk: 2/5)a749db98fix: harden voice-call webhook verification (risk: 2/5)6341819dfix: cron announce delivery path (Overhaul cron delivery model, migrate schedule timestamps to ISO 8601, fix issues/bugs openclaw/openclaw#8540) (thanks @tyler6204) (risk: 1/5)b2361292fix: trim legacy signature fallback, type fromChatType as union (risk: 1/5)78fd1947fix: telegram forward metadata + cron delivery guard (fix(telegram): include forward_from_chat metadata in forwarded messages (#8133) openclaw/openclaw#8392) (thanks @Glucksberg) (risk: 1/5)f633a8cbfix: address review comments (risk: 1/5)19ecdce2fix: align proxy fetch typing (risk: 1/5)6f200ea7fix: force reload cron store (risk: 1/5)0cd47d83fix: cover anonymous voice allowlist callers (Voice: enforce exact allowlist matching openclaw/openclaw#8104) (thanks @victormier) (fix: cover anonymous voice allowlist callers openclaw/openclaw#9188) (risk: 1/5)385a7ebafix: enforce owner allowlist for commands (risk: 2/5)22927b08fix: infer --auth-choice from API key flags during non-interactive onboarding (fix: infer --auth-choice from API key flags during non-interactive onboarding openclaw/openclaw#9241) (risk: 2/5)85246664fix: gracefully downgrade xhigh thinking level in cron isolated agent (fix: gracefully downgrade xhigh thinking level in cron isolated agent openclaw/openclaw#9363) (risk: 1/5)d84eb464fix: restore discord owner hint from allowlists (risk: 2/5)3b40227bfix: remove unused cron import (risk: 1/5)1ee1522dfix: resolve bundled chrome extension assets (Fix chrome extension bundled path resolution openclaw/openclaw#8914) (thanks @kelvinCB) (risk: 1/5)d6cde28cfix: stabilize windows acl tests and command auth registry (Tests: add test coverage for security/windows-acl.ts openclaw/openclaw#9335) (thanks @M00N7682) (risk: 1/5)a4d1af1bfix: resolve discord owner allowFrom matches (risk: 1/5)f2c5c847fix: preserve telegram DM topic threadId (fix(telegram): preserve DM topic threadId in deliveryContext openclaw/openclaw#9039) (thanks @lailoo) (risk: 1/5)cf95b2f3fix: update changelog for help sorting (enhancement(CLI): sort commands alphabetically in help output openclaw/openclaw#8068) (thanks @deepsoumya617) (risk: 1/5)eef247b7fix: auto-inject Telegram forum topic threadId in message tool (risk: 1/5)a13efbe2fix: pass threadId/to/accountId from parent to subagent gateway call (risk: 1/5)01db1ddefix: telegram topic auto-threading — use parseTelegramTarget, add tests (🔴 FIX: Telegram DM Topics — auto-inject threadId in message tool & subagent announce openclaw/openclaw#7235) (thanks @Lukavyi) (risk: 1/5)f32eeae3fix: remove orphaned tool_results during compaction pruning (risk: 1/5)821520a0fix cron scheduling and reminder delivery regressions (fix cron scheduling and reminder delivery regressions openclaw/openclaw#9733) (risk: 1/5)93b45034fix: clear stale token metrics on /new and /reset (fix: clear stale token metrics on /new and /reset openclaw/openclaw#8929) (risk: 1/5)4e1a7cd6fix: allow multiple compaction retries on context overflow (fix: allow multiple compaction retries on context overflow openclaw/openclaw#8928) (risk: 1/5)cefd87f3Fix: Enable scrolling on the dashboard config page (Fix: Enable scrolling on the dashboard config page openclaw/openclaw#1822) (risk: 1/5)de7b2ba7fix: normalize xhigh aliases and docs sync (Thinking: accept extra-high alias and sync Codex 5.3 FAQ wording openclaw/openclaw#9976) (risk: 1/5)ec0728b3fix: release session locks on process termination (fix: release session locks on process termination [AI-assisted] openclaw/openclaw#1962) (risk: 1/5)3ad79583fix: untrack dist/control-ui build artifacts (fix: untrack dist/control-ui build artifacts openclaw/openclaw#1856) (risk: 1/5)05b28c14fix: wire onToolResult callback for verbose tool summaries (fix: wire onToolResult callback for verbose tool summaries openclaw/openclaw#2022) (risk: 1/5)47538bcafix: Gateway canvas host bypasses auth and serves files unauthenticated (risk: 1/5)8abce8a8fix:onToolResultfallback is not expected. (risk: 1/5)f16e32b7fix: Do notprocess.exit(0)in the middle of a test. (risk: 1/5)717129f7fix: silence unused hook token url param (fix: silence unused hook token url param openclaw/openclaw#9436) (risk: 2/5)72245855fix: add fallback for Control UI asset resolution in global installs (risk: 1/5)b40da2cbfix: remove dead restore control-ui step from update runner (risk: 1/5)4a59b778fix: CLI harden update restart imports and fix nested bundle version resolution (risk: 1/5)42164494fix: guard resolveUserPath against undefined input (fix: guard resolveUserPath against undefined input openclaw/openclaw#10176) (risk: 2/5)2c8af78dfix(hooks): replace debug console.log with proper subsystem logging in session-memory (fix(hooks): replace debug console.log with proper subsystem logging in session-memory openclaw/openclaw#10730) (risk: 1/5)d90cac99fix: cron scheduler reliability, store hardening, and UX improvements (fix: cron scheduler reliability, store hardening, and UX improvements openclaw/openclaw#10776) (risk: 3/5)1007d71ffix: comprehensive BlueBubbles and channel cleanup (fix: comprehensive BlueBubbles and channel cleanup openclaw/openclaw#11093) (risk: 3/5)b8f740fbfix: add .caf to AUDIO_FILE_EXTENSIONS (fix: add .caf to AUDIO_FILE_EXTENSIONS openclaw/openclaw#10982) (risk: 1/5)0deb8b0dfix: recover from context overflow caused by oversized tool results (fix: recover from context overflow caused by oversized tool results openclaw/openclaw#11579) (risk: 1/5)95263f4eMemory: add SQLITE_BUSY fallback regression test (risk: 1/5)ebe57304fix: use STATE_DIR instead of hardcoded ~/.openclaw for identity and canvas (fix: use STATE_DIR instead of hardcoded ~/.openclaw for identity and canvas openclaw/openclaw#4824) (risk: 2/5)191da1fefix: context overflow compaction and subagent announce improvements (fix: context overflow compaction and subagent announce improvements openclaw/openclaw#11664) (thanks @tyler6204) (risk: 2/5)What to beware of
Bug fixes may subtly change behavior the fork relies on. Check for side effects in shared modules, altered return types, and changed error handling paths.
About conflicts
Some cherry-picks may have conflicted during application — these are committed
with conflict markers intact and are visible in the diff for manual resolution.
Additionally, this PR may show merge conflicts against
daisy/devdue tofork divergence. Resolve both in the merge UI or locally with
git merge.Risk
Review checklist
Generated by
scripts/upstream-triage.sh --apply --open-pron 2026-02-08-2013 — no upstream code was executed