Commit Graph

69462 Commits

Author SHA1 Message Date
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
wangmiao0668000666
7b8dd74f66 fix(skills): bound skill command debug dedupe cache (#109164)
* fix(skills): bound skill command debug dedupe cache

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

* fix(skills): move test-only reset to testing object and fix type error

* fix(skills): avoid test-only export in command debug cache

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-07-16 12:15:34 -07:00
Peter Steinberger
6c39e713d4 refactor: move native hook relay registry to SQLite (#109289)
* refactor: store native hook relays in SQLite

* chore: satisfy relay store CI checks
2026-07-16 12:14:06 -07:00
RileyJJY
3f89aae98d fix(qqbot): bound tail log reads to actual bytes returned by fs.readSync (#108955)
* fix(qqbot): bound tail log reads to actual bytes returned by fs.readSync

* fix(qqbot): satisfy knip deadcode check for testing export

Add __testing re-export and test-api.ts barrel so knip traces the testing export through a recognized entry point.

* fix(qqbot): restore testing export alongside __testing re-export

Both exports are needed: testing for proof scripts, __testing for knip tracing.

* fix(qqbot): remove unused __testing re-export from log-helpers

test-api.ts already imports testing and re-exports as __testing. The extra re-export in log-helpers.ts was unused by production code.

* fix(qqbot): retry short log tail reads

* test(qqbot): keep short-read seam private

Co-authored-by: RileyJJY <100176083+RileyJJY@users.noreply.github.com>

* test(qqbot): exercise short reads through log export

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

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: RileyJJY <100176083+RileyJJY@users.noreply.github.com>
2026-07-16 12:12:46 -07:00
David Gorelik
63b0cac9f0 fix: reply hooks can claim ordinary agent turns (#108353)
* fix: honor reply hooks for user agent turns

* fix: preserve reply hook turn context

* fix: gate CLI reply hooks by trigger

* fix(plugins): run reply hooks once per admitted turn

Co-authored-by: Clive (OpenClaw) <clive@openclaw.local>

* fix(plugins): reconcile reply hooks after rebase

* fix(auto-reply): dispatch hooks for active steers

* test: use valid channel context shape in steer hook test

---------

Co-authored-by: Clive (OpenClaw) <clive@openclaw.local>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 11:50:43 -07:00
Dallin Romney
c4b2183db6 fix(release): repair frozen validation compatibility (#109272) 2026-07-16 11:45:31 -07:00
NianJiu
42ff5ec754 feat(kimi): add Kimi K3 support (#109202)
* feat(moonshot): add Kimi K3 support

* feat(kimi): add K3 subscription models

---------

Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 11:41:12 -07:00
tzy-17
e9b974e18b fix(ci): bound release evidence dispatch (#108898) 2026-07-16 11:38:19 -07:00
Shakker
f084ab2240 fix: prevent external gateway restart timeouts (#109273) 2026-07-16 19:36:58 +01:00
Alix-007
6bcf071120 fix(infra): bound macOS process start probes (#109064)
* fix(infra): bound macOS process start probes

* docs(changelog): note macOS process probe deadline

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

* test(infra): cover process probe timeout

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 11:36:07 -07:00
Peter Steinberger
6175e6a98c refactor: remove stale internal deprecated compatibility (#109266)
* refactor(agents): remove stale deprecated internals

* refactor(channels): remove dead target compat aliases

* refactor(plugins): collapse private deprecated types

* refactor(onboarding): remove stale provider skip alias

* style(agents): format deprecated cleanup

* refactor(agents): internalize sanitizer options
2026-07-16 11:35:34 -07:00
Peter Steinberger
04c31f453c fix: reject oversized credential files in remaining readers (#109260)
* fix(security): bound remaining credential file reads

* fix(anthropic-vertex): keep ADC helper type private
2026-07-16 11:33:18 -07:00
Peter Steinberger
1bdebb8c69 test(telegram): speed webhook shutdown retry proof (#109271) 2026-07-16 11:33:11 -07:00
Peter Steinberger
76870ed958 fix(agents): scope tool-terminal completion proof to post-assistant results (#109259)
The continuation guard scanned the whole session snapshot for non-error
toolResults, so a prior turn's result with a model-reused tool-call id
could prove 'completion' for a batch that never dispatched (fresh-eyes
review finding on 2848acbbaa). Scope the scan to snapshot entries after
the terminal assistant — both assistant fields are found on the snapshot
itself, so identity lookup holds; an assistant missing from the snapshot
fails closed to the existing incomplete-turn error. Adds a stale
prior-turn-result regression.
2026-07-16 11:26:34 -07:00
tzy-17
9c61809ec4 fix(ci): bound plugin npm artifact connection (#108897) 2026-07-16 11:23:01 -07:00
Peter Steinberger
2f3bda1be6 feat(linux): OS integration for the desktop companion (#109236)
Single-instance + openclaw:// deep links (openclaw://dashboard opens and
connects the dashboard; the tiny URL contract is routed entirely in Rust), a
Start at Login tray toggle (tauri-plugin-autostart, default off), native
notifications for update-ready/update-available when the window is unfocused,
and window-state persistence (canvas window excluded). All official Tauri v2
plugins; cross-platform deps so the macOS/Windows test builds keep compiling.
2026-07-16 11:19:10 -07:00