Commit Graph

69477 Commits

Author SHA1 Message Date
Peter Steinberger 02adefa39a feat(ui): show the live plan checklist inside the chat thread (#109343)
The run-scoped plan snapshot already fed the sticky composer bar; it now
also renders as an always-expanded card inside the active run's work
group, so plan progress is visible in scroll context. The bar and card
share one extracted renderer (variant: bar | card) instead of duplicating
the template, and the card clears with the run through existing plan
lifecycle.
2026-07-16 14:41:09 -07:00
Peter Steinberger d6e9cbd775 fix(docs-sync): preserve translated mirrored pages 2026-07-16 17:28:38 -04:00
Peter Steinberger 58f43c703e test(auto-reply): consolidate command suites (#109342) 2026-07-16 14:23:11 -07:00
RileyJJY 786ad1dbf8 fix(sms): ignore blank Twilio env account fallbacks (#109149)
* fix(sms): ignore blank Twilio env account fallbacks

* refactor(sms): reuse configured account value predicate

Co-authored-by: RileyJJY <0668000974@xydigit.com>

* test(sms): keep blank account fixture minimal

Co-authored-by: RileyJJY <0668000974@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 14:19:21 -07:00
Peter Steinberger 7bf5c772be improve: reuse Vitest transform cache across CI runs (#109330)
* ci: persist Vitest transform cache

* fix(ci): declare Vitest cache helpers

* fix(ci): serialize Vitest cache snapshots
2026-07-16 14:15:17 -07:00
pick-cat 7cde0ac8c0 fix(proxy-capture): guard body-less arrayBuffer reads against oversized responses (#101268)
* fix(proxy-capture): guard body-less arrayBuffer reads against oversized responses

* fix(proxy-capture): exercise body-less fallback in bounded read tests

New tests use mock clones with body: null plus arrayBuffer spies to
prove the content-length precheck guards the !body path. A real
Response clone exposes body.getReader in Node 24, so the prior test
only exercised the streaming branch and would stay green even if
the precheck were deleted.

* chore: retrigger CI

* fix(proxy-capture): reject non-safe content-length before arrayBuffer (#101268)

ClawSweeper P2: the body-less fallback used Number(content-length), so a
huge digit-only Content-Length value could overflow to Infinity, bypass the
Number.isFinite guard, and still call arrayBuffer() — leaving an OOM path in
the hardening PR.

Add declaredContentLengthExceedsCap, which accepts only plain digit strings,
treats any value longer than Number.MAX_SAFE_INTEGER as oversized, and
compares safe-integer parsed values against the cap. Non-numeric or malformed
values fall through to the post-read length check.

Adds a regression test for a 100-digit Content-Length that would previously
have bypassed the guard.

* fix(proxy-capture): normalize zero-padded Content-Length before digit-count guard

* fix(proxy-capture): fail closed without response streams

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 14:12:43 -07:00
Peter Steinberger 411c09f9be test(infra): skip real recovery pacing waits (#109338) 2026-07-16 14:12:07 -07:00
Peter Steinberger 7d71d7cf6b fix(sessions): large histories no longer load entire transcripts (#108851)
* perf(sessions): bound SQLite history reads

* fix(sessions): keep history pagination gap-free

* test(sessions): use shared temp cleanup

* fix(sessions): reconcile mixed transcript projections

* fix(sessions): preserve strict schema migration

* refactor(sessions): trim internal export surface

* refactor(sessions): keep reader helpers private

* fix(sessions): reconcile transcript projections off requests

* test(sessions): await transcript projection repair

* fix(sessions): normalize projection worker failures

* fix(sessions): satisfy projection release gates
2026-07-16 14:11:33 -07:00
Peter Steinberger a327e43023 fix(kimi): import isLiveTestEnabled from plugin-sdk/test-live
The live-test helper is exported from openclaw/plugin-sdk/test-live (as every
other extension live test imports it), not test-env. The wrong subpath in
#109335 broke check-test-types repo-wide.
2026-07-16 14:09:22 -07:00
Peter Steinberger 7496f4d988 feat(android): mascot mood engine and onboarding moods (#109311)
Ports the deterministic mascot animator to Android: full pose channels
(face, gaze, droop, hard hat, effects), seeded mood loops including the
hard-hat working hammer cycle, entrance gestures, and static poses when
system animations are off. Onboarding heroes now feel the flow — working
while the gateway connects, celebrating once paired, thinking during
node approval, curious on permissions, sad on visible errors. Tinted
silhouette marks keep their ambient idle loop and stay silent for
TalkBack outside the welcome hero.
2026-07-16 14:04:40 -07:00
Dallin Romney 5a0fcc2ff9 test(cli): distinguish silent hook relay completion (#109339) 2026-07-16 13:59:34 -07:00
tzy-17 84fb48c3be fix(sandbox): use Buffer.byteLength for env var value size limit (#105017)
* fix(sandbox): use Buffer.byteLength for env var value size limit

validateEnvVarValue checked value.length (UTF-16 code units) against
the 32768-byte limit, so multi-byte CJK values like "值".repeat(11000)
passed the check despite exceeding 33 KB in UTF-8. Switch to
Buffer.byteLength(value, "utf8") so the limit matches the actual byte
count the OS and child processes see.

* test(sandbox): simplify env byte-limit coverage

Co-authored-by: 唐梓夷0668001293 <tang.ziyi@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 13:56:23 -07:00
Peter Steinberger 0631252f4b refactor: reduce plugin SDK test import overhead (#109333)
* refactor(test): split plugin SDK test helpers

* fix(test): align plugin SDK test subpaths
2026-07-16 13:55:23 -07:00
Peter Steinberger cfaa30a08f fix(release): align Codex discovery and Telegram traces 2026-07-16 21:54:11 +01:00
Peter Steinberger 442d6fc94a docs(agents): prefer remote testboxes with trusted local fallback when unavailable 2026-07-16 21:52:58 +01:00
Dallin Romney 8924e27bb6 refactor(qa): keep synthetic UX evidence out of scenario catalog (#109315)
* refactor(qa): keep UX evidence producer out of catalog

* test(qa): preserve UX producer runner integration
2026-07-16 13:51:18 -07:00
xingzhou 950ec3c620 fix(telegram): stalled getChat errors retain connections (#109007)
* fix(telegram): abort stalled getChat errors

* test(telegram): satisfy promise executor lint

* fix(telegram): close getChat lookup transports

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 13:50:50 -07:00
Peter Steinberger 2409df768c fix(kimi): honor K3 thinking off (#109335)
* fix(kimi): honor K3 thinking off

* chore: defer Kimi release note

* test(kimi): narrow live reasoning blocks
2026-07-16 13:50:15 -07:00
Peter Steinberger 6dc3e6055f docs(agents): note OPENCLAW_BUILD_PRIVATE_QA=1 to build QA Lab/qa-channel into dist 2026-07-16 13:40:46 -07:00
tzy-17 543b60092d fix(cli): use startsWith for loopback IPv4 check in container proxy (#106077)
isLoopbackProxyHostname used split(".", 1)[0] === "127" to detect
127.0.0.0/8 addresses. While isIP() already rejects leading-zero octets
before this branch is reached, startsWith("127.") is more direct and
clearly expresses the intent of matching the entire 127.0.0.0/8 range.
2026-07-16 13:40:18 -07:00
Peter Steinberger 093b8859c4 perf(test): fix env-dependent failures, stop verifier lazy-fetch, balance CI stripes (#109332)
* test: fix environment-dependent failures on built and partial-clone checkouts

Canvas A2UI fixtures now pin the resolved root through a new canvas
test-api hook: dev checkouts with a locally built a2ui.bundle.js won
candidate resolution and shadowed the fixture root. Speech-core prefs
tests resolve the canonical tmpdir (macOS /tmp symlink breaks fs-safe
store roots), and the bundled plugin install test asks discovery for
the canonical bundled path instead of hardcoding the source tree.

* fix(release): keep evidence verifier blob reads local-deterministic

git show against a forged or missing SHA lazily fetched from the
promisor remote on partial clones, hanging a security check on network
state (266s observed). GIT_NO_LAZY_FETCH pins verification to local
objects; missing blobs fail closed as before.

* perf(test): pay the command-handler barrel once and merge subagent command tests

commands-name and commands-login imported the full handler barrel
(~1,700 modules) for registration assertions; those now live in a
dedicated registration test, dropping the two files from 12.6s/4.6s to
1.4s/1.0s locally. Five subagent command test files merged into one so
the auto-reply module graph evaluates once instead of five times.

* perf(ci): stripe node test bins by measured file cost

Round-robin striping packed the whale files together, leaving
auto-reply-commands-1 at ~220s while sibling stripes idled at ~30s.
Greedy LPT over advisory per-file seconds hints balances the commands,
cli-runner, and tooling stripes deterministically; group hints for the
restriped bins are equalized at the old totals.
2026-07-16 13:38:56 -07:00
NIO b2f11462c8 fix(slack): pass upload timeoutMs through guarded fetch dispatcher floors (#106496)
* fix(slack): pass upload timeoutMs through guarded fetch dispatcher floors

* test(slack): simplify upload timeout coverage

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 13:38:44 -07:00
Leon-SK668 5dce814ca1 fix(android): preserve emoji in shell initials (#108830)
* fix(android): preserve emoji in shell initials

* chore(android): refresh native i18n inventory

* refactor(android): share Unicode initial extraction

* fix(android): preserve grapheme cluster initials

* chore(android): refresh native i18n inventory

* fix(android): satisfy ICU iterator nullability

* test(android): run shell initials under Robolectric

Co-authored-by: Leon-SK668 <0668001470@xydigit.com>

* style(android): format localized initial helper

Co-authored-by: Leon-SK668 <0668001470@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 13:38:27 -07:00
Peter Steinberger 9ac2af50e6 fix(migrate): reject duplicate item ids, fingerprint the full plan, route Hermes memory copies by item (#109323) 2026-07-16 13:31:44 -07:00
mushuiyu886 cb47a0b4cc fix(agents): force-stop stalled tool probes (#109215) 2026-07-16 13:31:10 -07:00
Peter Steinberger b39e1cf66f perf(agents): drain code-mode bridge calls inline within one exec turn (#109290)
Code mode previously suspended to the model with a waiting result for every
awaited tools.search/describe/call, forcing one wait tool turn per await
(turns = tool calls + 1). Bridge calls now resolve inline within the exec
deadline and resume the QuickJS snapshot host-side, matching the namespace
auto-drain path. Restart-safe runs keep their existing no-drain semantics.
Live proof across OpenAI/Anthropic/Google: ~45% fewer turns and ~45% fewer
input tokens at equal success rate.

Also landed with the same contract:
- one shared wall-clock deadline per exec/wait call (initial worker, inline
  drain rounds, and resumed guest interrupt budget all share it)
- park the snapshot instead of resuming when the remaining budget could not
  survive VM restore, so near-deadline settles stay recoverable
- abort now terminates the guest worker, skips resume, and drops suspended
  runs instead of pinning process-global slots until TTL, reported with the
  existing aborted failure code
- exec description omits API.list/MCP/namespace guidance when the run catalog
  has no MCP tools or namespaces, so models stop probing an empty surface
- API.list tolerates a trailing-slash prefix like API.list("mcp/")
2026-07-16 13:30:07 -07:00
Peter Steinberger ea53179025 test: reuse config suite state (#109326) 2026-07-16 13:28:03 -07:00
Peter Steinberger fbb5af6515 improve(mac): group pairing session providers (#109320)
* feat(mac): group pairing session access

* chore(i18n): sync native source inventory

* chore(mac): defer release note generation
2026-07-16 13:19:15 -07:00
thomas.szbay 1bff4eecb2 [AI] fix(feishu): send text and voice separately for Auto-TTS replies (#103781)
* fix(feishu): use TTS supplement metadata for precise text suppression

* refactor(feishu): centralize TTS supplement delivery

* style(feishu): format TTS delivery callback

* fix(feishu): preserve streamed TTS text

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 13:18:28 -07:00
mushuiyu886 9edd662741 fix(doctor): force-stop stalled TUI process probes (#109243) 2026-07-16 13:17:08 -07:00
Peter Steinberger 5680791d7f build(codex): bump Codex CLI to 0.144.5 2026-07-16 21:16:50 +01:00
Peter Steinberger 8f74762f4d fix(macos): merge the WebChat window title band into the toolbar row (#109318)
The standalone chat window stacked a visible title bar (traffic lights +
"OpenClaw" title) above the SwiftUI toolbar row, wasting a full band of
vertical space. Apply the Dashboard window's merged chrome: hidden title,
transparent titlebar, no separator, movable-by-background — the unified
toolbar (sidebar toggle, search, pickers, session actions) now shares its row
with the traffic lights. A window subclass pins titleVisibility to hidden
because SwiftUI's toolbar bridge can restore visible title chrome, and scene
bridging is reset to toolbars-only after controller attachment (attaching an
NSHostingController resets it to .all).
2026-07-16 13:12:24 -07:00
Dallin Romney b5eb8977dc test(qa): prove Codex cold install product path (#109267) 2026-07-16 13:10:41 -07:00
Peter Steinberger a9f82837a1 feat: inspect background tasks across web and mobile (#109150)
* feat: add background task details across clients

* fix: refresh background task clients and translations

* fix: keep background task details fresh

* fix: ignore deleted background task details

* refactor: split background task rendering

* fix: use canonical background task ids

* refactor: extract background task view types

* fix(apps): regenerate task localizations

* fix(ios): remove unused task screen import

* fix(apps): refresh task localization inventory
2026-07-16 13:08:42 -07:00
xingzhou 0e1fad711c fix(channels): prevent lifecycle listener buildup (#109108) 2026-07-16 13:08:12 -07:00
Peter Steinberger da8a443a4d feat(linux): pending-approval notifications and a summon shortcut for the companion (#109322)
The companion now rings the doorbell for gateway approvals: it polls pending
node and device pairing requests over the existing CLI seam on the connected
watchdog cadence, fires one native notification per new request when the
window is unfocused, and shows a pending count in the tray status line.
Approval itself stays in the dashboard/CLI (owner boundary).

Adds a CmdOrCtrl+Shift+O summon shortcut with a tray toggle whose opt-out
persists as a marker file (no config schema). The X11-only global-hotkey
backend is gated off on native Wayland sessions — the feature is omitted
rather than half-registered through XWayland; a portal implementation can
follow.
2026-07-16 13:06:18 -07:00
Peter Steinberger 54eb03fcf0 fix(migrate): harden importer path resolution and memory copy safety (#109314) 2026-07-16 12:56:43 -07:00
Peter Steinberger ce919593bf fix(ui): unblock rebases with generated i18n conflicts (#109279)
* fix(ui): automate i18n conflict resolution

* fix(ui): preserve i18n cache merge intent

* fix(ui): restrict resolver to generated locales

* fix(ui): prune stale locales before baseline

* fix(ui): handle removed locale conflicts
2026-07-16 12:52:28 -07:00
wings1029 8dfb310b56 fix(infra): bound three warning dedupe caches with createDedupeCache (#101746)
* fix(infra): bound three warning dedupe caches with createDedupeCache

Replace unbounded Set<string> warning dedupe caches with the shared
createDedupeCache helper (ttlMs=0, maxSize=4096) to prevent unbounded
memory growth:

- safeBinTrustedDirWarningCache in invoke-system-run.ts
- chmodWarnedTargets in openclaw-state-db.ts
- clobberCapWarnedPaths in io.clobber-snapshot.ts

All three follow the same anti-pattern: .has()/.add() only, no eviction,
no size cap. Matches the fix pattern from #101696 and #101738.

Co-Authored-By: Claude <noreply@anthropic.com>

* chore: refresh PR body evidence for ClawSweeper re-review

* test(io.clobber-snapshot): add clobber-cap warning deduplication test

Exercises warnClobberCapReached through the production API
(persistBoundedClobberedConfigSnapshot) to prove that
clobberCapWarnedPaths.check() suppresses duplicate warnings
on the same config path.

Co-Authored-By: Claude <noreply@anthropic.com>

* test(infra): tighten warning cache coverage

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 12:45:51 -07:00
Peter Steinberger d58c216500 fix(voice-call): honor OPENCLAW_STATE_DIR (#109284)
* fix(voice-call): honor state directory override

* chore(voice-call): leave release notes to release flow

* docs(voice-call): document state-dir store root
2026-07-16 12:40:53 -07:00
wangmiao0668000666 a54623ffde fix(config): bound config I/O warning caches (#109000)
* fix(config): bound config I/O warning and pending-secret caches

* fix(config): drop unused import and unexported constants in io.state

* refactor(config): centralize bounded io cache writes

* fix(config): keep generated owner secrets stable

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 12:36:36 -07:00
Peter Steinberger 39cddf847e fix(reef): keep routine agent replies from disappearing (#109160)
* fix(reef): relax guard and surface rejections

* fix(reef): preserve ordered rejection notices

* fix(reef): bound rejection notice retries

* fix(reef): persist correlated rejection notices

* fix(reef): align receipt entry typing

* test(reef): type owner notice fixtures

* fix(reef): make rejection feedback restart-safe

* fix(reef): retry rejection state reads

* fix(reef): quarantine invalid receipts

* chore(reef): leave changelog to release

* fix(reef): bind receipts to recipient identity

* refactor(reef): keep receipt types private

* test(reef): preserve notice mock call typing

* fix(reef): reconcile keys before resend recovery

* fix(reef): keep rejection recovery durable

* fix(reef): preserve in-flight receipt upgrades

* test(reef): split receipt flow coverage

* fix(reef): cap automatic guard retries
2026-07-16 12:36:22 -07:00
mushuiyu886 f25322e2e8 fix(memory-wiki): bound stalled Obsidian CLI calls (#109232) 2026-07-16 12:35:02 -07:00
Peter Steinberger 761eabad25 fix(ui): show dead reattached terminals as exited (#109281)
* fix(ui): show dead terminal sessions as exited

* chore: leave changelog to release flow
2026-07-16 12:34:52 -07:00
Peter Steinberger 615007d8c6 fix(discord): correlate activity launches at click time (#109194) 2026-07-16 12:32:20 -07:00
Alix-007 8f1c6df748 fix(daemon): bound Node binary lookup (#109239)
* fix(daemon): bound Node binary lookup

* docs(changelog): note bounded daemon Node lookup

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* docs(changelog): keep release notes out of contributor PR

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 12:32:08 -07:00
Dallin Romney b36011bb2a chore(plugin-sdk): refresh merged API baseline (#109297) 2026-07-16 12:31:21 -07:00
thomas.szbay b06fe2a673 fix(kill-tree): verify process group leader before using group kill to prevent gateway SIGTERM (#76259) (#94697)
* fix(kill-tree): verify process group leader before group kill to prevent gateway SIGTERM (#76259)

- Add isProcessGroupLeader() to killProcessTree/signalProcessTree: ps -p <pid> -o pgid= primary check with /proc/<pid>/stat fallback on Linux. Group kill only when the PID is its own process group leader; non-leaders fall back to single-pid kill, preventing accidental gateway SIGTERM when a non-detached child shares the gateway's process group.
- Propagate detached: true to all detached-spawn cleanup callers (exec-termination, agent-bundle LSP, mcp-stdio, bash, supervisor pty, agent-core nodejs) so detached group cleanup survives leader exit.
- Gateway/daemon cleanup paths (schtasks, restart-health) keep the leader-checked default (detached omitted).

Closes #76259

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(process): tighten process-group ownership checks

* refactor(daemon): split restart diagnostics

* refactor(daemon): isolate restart health types

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 12:30:51 -07:00
Peter Steinberger cf24f14c63 test(agents): speed local service startup fixtures (#109296) 2026-07-16 12:24:37 -07:00
Peter Steinberger 734e1ed369 refactor(daemon): split restart port ownership helpers (#109298) 2026-07-16 12:15:48 -07:00