Commit Graph

6841 Commits

Author SHA1 Message Date
Eugene Harold Krabs 0079fe80bb fix(plugin-npm): align bundled lock install strategy (#114620)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-29 00:20:32 -04:00
Vincent Koc 4896416521 fix(android): preserve generated lint suppressions (#115501) 2026-07-29 11:37:40 +08:00
mikasa 887b37cf80 fix(ci): bound Mantis Discord fetches (#110851)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 23:36:27 -04:00
Dallin Romney 0d8ee3a1c5 fix(qa): validate profile evidence against scenario inventory (#115446) 2026-07-29 11:29:56 +08:00
Peter Steinberger d5567ed61e fix: prevent duplicate agent turns and slow Codex harness runs (#115474)
* fix(agents): deduplicate turns and speed up Codex harnesses

* test(agents): keep keyed transcript fixtures type-safe

* fix(codex): simplify linear native skill traversal

* fix(agents): preserve admitted SQLite turns during orphan repair

* test: split session user idempotency regressions
2026-07-28 22:56:12 -04:00
Shakker 7620475a2f docs: explain native subagent handoff 2026-07-29 02:22:09 +01:00
Patrick Erichsen 0972790951 fix(agents): preserve onboarding probe session manager (#115452)
* fix(agents): preserve caller-owned session manager

* test(onboard): cover guided inference composition
2026-07-28 17:50:11 -07:00
Ayaan Zaidi 895bf61ea0 feat(agents): surface watched-session awareness to the model (#114835) 2026-07-29 07:39:20 +09:00
Manan Bansal ec56892b74 fix(infra): resolve ssh client from trusted system dirs (#83289) (#93030)
resolveSshConfig and startSshPortForward spawned a hard-coded /usr/bin/ssh,
so SSH config discovery and gateway tunneling failed wherever the system ssh
client lives elsewhere: Windows (built-in OpenSSH under System32\OpenSSH) and
NixOS (/run/current-system/sw/bin).

Route both helpers through the existing resolveSystemBin("ssh", { trust:
"strict" }) resolver, and add the Windows built-in OpenSSH directory to the
resolver's trusted Windows locations (it had System32 but not the
System32\OpenSSH subdirectory where ssh.exe actually ships). Fail closed with
a clear diagnostic when no system ssh client is present.

Closes #83289.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 18:35:58 -04:00
Peter Steinberger bd33a1c45f fix(ci): simplify fail-closed workflow revival (#115420) 2026-07-28 17:47:48 -04:00
Peter Steinberger d239a59d82 fix(ui): make Control UI ownership and permissions reliable (#115364)
* fix(ui): unify connection-owned gateway event dispatch

* fix(qa): keep hosted UI smoke evidence truthful

* fix(ui): make mobile navigation drawer an accessible modal

* refactor(ui): centralize settings search destinations

* fix(ui): own chat media resource lifecycles

* fix(ui): unify sidebar session scope ownership

* refactor(ui): remove obsolete navigation backdrop styles

* refactor(ui): isolate dashboard provider lease capabilities

* fix(ui): centralize gateway operator permissions

* style(ui): format gateway event regressions

* fix(ui): render live dashboard permissions immediately

* fix(ui): enforce approval grant authority

* fix(gateway): fence retired sockets after event gaps

* fix(ui): isolate sidebar gateway fixtures across shared workers

* test(ui): isolate singleton-sensitive browser suites

* fix(ui): retire stale catalog pagination on gateway reconnect

* fix(ui): restore drawer focus after native dialog dismissal

* fix(ui): seed drawer threads and preserve modal focus ownership

* fix(ui): isolate nested native drawer overlay lifecycle

* test(ui): prove isolated dashboard lease authorization

* fix(ui): bound settled managed image resources

* fix(ui): type native modal focus and shared test helper

* fix(ui): correct approval mock types and trim dead export

* fix(ui): keep settings section metadata private

* fix(qa): keep hosted coverage regression within lint limit

* refactor(ui): keep catalog presence in its session data owner

* fix(browser): regenerate bundled copilot runtime

* test(ui): split board lease authorization regressions

* fix(ui): snapshot gateway listener fanout without redundant spread

* fix(ui): bind chat media subscriptions to image lifetime

* fix(ui): extract overlay access lifecycle

* fix(ui): restore guarded media after Lit reconnection

* test(ui): localize board lease fixture title

* fix(ui): reuse system approval fixture labels

* test(ui): narrow managed media lifecycle source

* fix(ui): prevent retired board gateway clients from rolling back leases

* fix(ui): expose pairing to pairing-scoped operators

* fix(ui): preserve legacy device pairing access

* fix(ui): preserve responsive sidebar ownership

* fix(ui): preserve responsive navigation and prove media ownership

* fix(ui): retire revoked catalog and refresh pairing grants

* test(ui): align typed catalog fixtures with main
2026-07-28 16:42:05 -04:00
Christian Lallo 811444d6db fix(memory-core): avoid cubic MMR similarity rescans (#113359)
* fix(memory): avoid cubic MMR similarity rescans

* style(memory-core): oxfmt mmr.test.ts

* test(memory-core): allow packed CI integration tests

* fix(ci): serialize targeted memory-core tests

* fix(ci): pin agentic cli worker count

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-29 03:53:43 +08:00
Peter Steinberger 388bcc43a1 fix: make Code Mode reliable across gateway and provider lifecycles (#115379)
* fix(code-mode): dispose suspended runs and propagate cancellation

* fix(code-mode): preserve request-visible provider tools

* test(code-mode): require real packaged gateway execution

* fix(gateway): load code mode cleanup only during shutdown
2026-07-28 15:21:54 -04:00
Peter Steinberger f78ba09120 feat(talk): support GPT-Live realtime voice over ChatGPT OAuth (#115226)
* feat(gateway): share the canonical browser-origin policy with plugins

Export resolveAcceptedBrowserOrigin through openclaw/plugin-sdk/webhook-request-guards
so browser-facing plugin routes reuse the Gateway's real origin contract instead of a
narrow allowedOrigins array check. Private LAN/Tailnet Control UI loads and the
Host-header fallback were previously rejected with 403 by plugin offer routes while the
Control UI itself worked.

Moves the loopback/forwarded-header helpers to net.ts (re-exported from auth.ts) so the
guard can delegate without importing gateway auth, and migrates the Codex realtime
broker onto the shared seam.

* feat(talk): let providers own agent delegation for realtime voice

Adds an optional runAgentConsult callback to the browser-session create request and
injects the existing embedded consult runtime from talk-client, bound to the same agent
and session key the GA tool path uses. Providers whose realtime protocol delegates work
through their own control channel (rather than GA function calls) can now reach the
OpenClaw agent without a client round-trip.

Threads the effective per-session model into browser-session capability resolution so a
request-level model override selects the right capability set, and propagates a caller
abort signal into consultRealtimeVoiceAgent so a superseded delegation stops its run.

* feat(openai): support GPT-Live realtime voice over ChatGPT OAuth

Implements OpenAI's quicksilver/frameless session natively for Talk browser sessions.
The Gateway creates the WebRTC call (multipart sdp+session to https://api.openai.com/v1/live)
and owns the sideband control socket, so the browser never holds upstream credentials;
delegation.created events run through the OpenClaw agent and stream back as speakable
context appends.

Verified end-to-end on 2026-07-28 against a ChatGPT Pro OAuth profile: call create 201
with an rtc_* id and answer SDP, sideband session.started, session.close teardown.
ChatGPT OAuth is preferred over a Platform API key because /v1/live access for platform
keys is waitlist-gated; the legacy chatgpt.com backend route returns 403 for every model
and protocol version and is not used.

Accepted models are gpt-live-1-codex and gpt-live-1-boulder-alpha; the voice allowlist is
the ten values the route actually accepts, since an invalid voice is rejected at call
creation and cannot be repaired afterwards (session.update reports immutable_field_update).

* docs: document GPT-Live Talk support and its route gotchas

Records the working route and auth, the accepted models and voices, the browser-only
scope, and the two traps that cost the most time: the chatgpt.com backend route returns
403 Voice session access denied for every model, and that same 403 is also what an
invalid voice returns, so it must not be read as an account entitlement block.

* fix(openai): resolve GPT-Live CI failures

* refactor(openai): own zod runtime dependency

* fix(openai): satisfy lint and live-shard gates for GPT-Live

Types the retry-delay finish callback as Error so the rejection reason is provably an
Error at the call site; the abort path already normalized a non-Error AbortSignal reason,
but the unknown parameter type hid that from static analysis.

Registers the new GPT-Live live test in the native-live-extensions-openai shard
expectation. The shard selector already picked the file up from the real tree; only the
hardcoded list in the tooling test lagged.

* fix(openai): clean up post-rebase capability resolver

* fix(openai): preserve GPT-Live delegation fragments

* fix(openai): close GPT-Live sideband handoff race

* fix(openai): accept UUID GPT-Live call ids

* style: apply oxfmt to GPT-Live sources and Talk docs

* style: format Talk docs after rebase

* fix(openai): keep GPT-Live transcript context across ignored delegations
2026-07-28 15:05:55 -04:00
Peter Steinberger 723423ffe7 fix(ci): stop reviving superseded pull request workflows (#115378)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 14:56:19 -04:00
Vincent Koc 77751a224d fix: stabilize package-to-dev release upgrades (#115292)
* origin/test/parallels-main-3224005-host:
  docs(changelog): cover Windows prerequisite readiness
  fix(e2e): preserve Windows installer reboot results
  docs(changelog): include Windows stop safety gate
  fix(e2e): force Windows smoke gateway stop
  docs(changelog): note Parallels and update fixes
  fix(update): finalize install switches in fresh process
  fix(e2e): harden Parallels guest preparation
2026-07-29 02:52:44 +08:00
Peter Steinberger a8fb4872fb refactor: harden shell completion and shard Control UI E2E (#115332)
* refactor: harden CLI completion and shard Control UI E2E

* fix: keep completion command-tree result private

* fix: remove unused browser test helper exports

* test: cover sharded Control UI workflow contract
2026-07-28 14:35:27 -04:00
Vincent Koc 13b8f0765c Merge remote-tracking branch 'origin/main' into test/parallels-main-3224005-host
* origin/main: (72 commits)
  fix: macOS-only Parallels smoke harness regression (#75293)
  fix(ios): use configured speech language for system voice (#113372)
  refactor: centralize isolated agent test ownership (#115340)
  test(ui): stabilize browser route readiness (#115320)
  fix(cron): clear automation after failed scheduler shutdown (#115316)
  fix: keep isolated gateway workspaces and skills inside state dir (#114487)
  docs: document local TTS on macOS, Linux, and Windows (#110230)
  fix(tasks): clone only the requested task page (#114277)
  fix(agents): prevent Code Mode resume loss and unbounded preparation (#115314)
  fix(process): preserve the first process cancellation reason (#115317)
  fix(nostr): report unavailable ingress when queue open fails (#115313)
  fix: prevent Slack and Feishu ingress startup leaks (#115295)
  fix(slack): avoid unsafe emphasis boundaries (#111575)
  fix: prevent changed checks from expanding into full lint (#115322)
  fix(codex): stabilize prompts and expose real cache regressions (#115238)
  refactor(ui): derive page route specs from the route table (#115214)
  fix(compaction): plan cut points in trigger units (#111886) (#115309)
  fix: prevent cron and gateway stress-run timeouts (#115241)
  fix(ci): validate frozen Matrix QA targets (#115298)
  test(macos): block real process fallthrough (#113337)
  ...

# Conflicts:
#	CHANGELOG.md
2026-07-29 02:22:47 +08:00
Peter Steinberger 68ac905ce3 feat(tooling): close three agent pre-flight and landing gaps (#115333)
* fix(tooling): check changed exports for dead code

* fix(tooling): name mismatched PR wrapper components

* feat(tooling): repin PR review artifacts

* fix(tooling): scope dead-export detection to source files

Matching only the top-level tree let a docs file under src/ carrying `export`
in a code sample set the flag. That mattered because the flag also short-
circuited changedCheckRequiresRemote above its docsOnly guard, so a docs-only
change could be dragged onto the heavy remote route and made to run knip.

Scope detection to the source extensions knip actually reads, and drop the
routing branch entirely: any file that can now trigger detection already
enables a non-docs lane, which the existing final clause routes remotely. The
branch was dead for every real source change and wrong for the docs case.

* refactor(tooling): round-trip the repinned review JSON

Preserving byte-exact formatting required a hand-rolled JSON scanner: string
escape handling, container nesting, and span splicing, for a file that lives in
gitignored .local/ and is only ever read back through JSON.parse.

repin already parses the artifact to validate it, so assign the two identity
fields and re-serialize. JSON.parse/stringify keeps insertion order, which is
the only formatting property worth holding. Drops four helpers.

* fix(tooling): select the dead-export scan by path, not changed lines

Inspecting changed lines for an `export` token has two false negatives that
defeat the purpose. Barrels export through multiline `export { ... }` lists, so
removing a symbol changes a line carrying no `export` token. Worse, the failure
that motivated this scan was an import-only edit: it orphaned a re-export in a
barrel the diff never touched, which no changed-line rule can see.

Select by path instead: any changed production source file under src/,
extensions/, ui/, or packages/. This also removes the merge-base dependency, so
a shallow checkout or unrelated history can no longer silently skip the scan.

Those paths already enable a non-docs lane, so the run already routes remotely
and knip's cost lands on the box already doing the heavy work.
OPENCLAW_CHECK_CHANGED_SKIP_DEADCODE=1 still opts out.

* Revert "feat(tooling): repin PR review artifacts"

The repin subcommand defeats the property the identity pin exists to enforce.
It rewrites the pinned PR number and head SHA while keeping every
recommendation, finding, and Markdown conclusion, so a completed
"READY FOR /prepare-pr" verdict authored against one revision can be relabelled
as covering another and then pass validation. The test added alongside it
restamped PR #7 as PR #42 and asserted validation succeeded, which is exactly
the substitution the fail-closed gate was built to stop.

Re-authoring a review after the head moves is friction on purpose: the code the
verdict describes may no longer be the code being landed. A safe version has to
prove the reviewed content is equivalent across the move, which is a design
decision about what equivalence means, not a convenience wrapper.

Reverts 5d89a704d9 and its follow-up c6304eb539.

* docs(tooling): note why the wrapper diagnostic reads HEAD blobs

Two reviewers independently read the new component comparison as inspecting
committed state while the refusal was triggered by working-tree files. The
uncommitted-wrapper guard above already exits for any staged or unstaged edit to
these three paths, so HEAD matches the working tree by the time this runs. State
the invariant at the site instead of letting a third reader re-derive it.

* fix(tooling): cover jsx in the dead-export source selector

The hand-written extension alternation matched .tsx but not .jsx, so a JSX
source change would skip a scan that knip does apply to it. Use the
`[cm]?[jt]sx?` selector the lint lanes in check-changed.mjs already use, which
covers both and is shorter, and pin the extension coverage in tests.
2026-07-28 14:15:46 -04:00
clawsweeper[bot] a0e4ac412c fix: macOS-only Parallels smoke harness regression (#75293)
* fix: macOS-only Parallels smoke harness regression

* fix(parallels): keep macOS update smoke script owner-readable

* fix: macOS-only Parallels smoke harness regression

* test(parallels): exercise macOS guest script identity

Co-authored-by: clawsweeper[bot] <274271284+clawsweeper[bot]@users.noreply.github.com>

---------

Co-authored-by: openclaw-clawsweeper[bot] <280122609+openclaw-clawsweeper[bot]@users.noreply.github.com>
Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 14:12:57 -04:00
Peter Steinberger 6de618315a refactor: centralize isolated agent test ownership (#115340) 2026-07-28 14:07:02 -04:00
Peter Steinberger 4683c752ed test(ui): stabilize browser route readiness (#115320) 2026-07-28 13:59:05 -04:00
Peter Steinberger 3aae420337 fix: prevent changed checks from expanding into full lint (#115322) 2026-07-28 13:27:26 -04:00
Peter Steinberger 5de0366d95 fix(codex): stabilize prompts and expose real cache regressions (#115238)
* fix(codex): stabilize prompt caching and measure uncached work

* test(codex): refresh stable dynamic-tool prompt snapshots

* fix(qa): account for cache rewrites and incomplete telemetry

* fix(qa): reject inconsistent measured cache totals

* fix(qa): preserve live profile eligibility and parity topology

* fix(qa): extract acyclic runtime parity usage contract
2026-07-28 13:26:04 -04:00
Peter Steinberger 2aa79e4aaa fix: prevent cron and gateway stress-run timeouts (#115241)
* fix: make cron and gateway stress tests deterministic

* test: update focused agent project expectations

* fix: preserve focused agent glob isolation
2026-07-28 13:23:35 -04:00
Peter Steinberger 1a13bc5c54 fix(ci): validate frozen Matrix QA targets (#115298)
* fix(ci): support frozen Matrix QA profiles

* style(ci): format Matrix workflow contract test
2026-07-28 13:22:56 -04:00
Yue Fei 1b4a465ea1 feat(gateway): accept WebSocket request trace context (#113189)
* feat(gateway): accept WebSocket request trace context

* test(gateway): prove WebSocket trace isolation

* test(gateway): simplify traced response match

* ci: allow iOS screenshot validation to finish

* fix(gateway): keep traced request failures scoped

* test(ci): align iOS screenshot timeout contract

* test(ui): reset config route location

* ci: scope iOS screenshots to native changes

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 13:15:05 -04:00
Vincent Koc caa5ae32e9 fix(e2e): preserve Windows installer reboot results 2026-07-29 01:12:42 +08:00
Peter Steinberger 5c6bccff4a feat(macos): enable Computer Control by default and diagnose stale Accessibility grants (#115280)
* feat(macos): enable and diagnose computer control

* docs(macos): explain computer control permissions

* chore: refresh macOS i18n and docs indexes

* test: update macOS computer control i18n fixture
2026-07-28 13:00:32 -04:00
Vincent Koc 6e275bf0b4 fix(e2e): force Windows smoke gateway stop 2026-07-29 00:27:25 +08:00
Vincent Koc c56091e0a0 fix(e2e): harden Parallels guest preparation 2026-07-29 00:24:03 +08:00
Peter Steinberger 3506f36555 fix(macos): signed rebuild no longer stalls on app shutdown (#103957)
* fix(macos): prevent restart termination hangs

* fix(macos): keep restart failsafe off main queue

* refactor(macos): drop superseded failsafe changes
2026-07-28 12:13:22 -04:00
Peter Steinberger 924f91ce47 refactor(sessions): isolate legacy transcript fixtures (#115231)
* test(sessions): isolate legacy file fixtures

* test(sessions): hide fixture-only manager type
2026-07-28 11:56:16 -04:00
Vincent Koc 54345505d1 test(i18n): prove iOS discovery catalog ownership 2026-07-28 23:48:57 +08:00
Vincent Koc 6726404c18 fix(i18n): include shared discovery copy in macOS catalog 2026-07-28 23:48:57 +08:00
Vincent Koc 9b63702543 fix(macos): localize privacy permission prompts 2026-07-28 23:48:01 +08:00
Vincent Koc 7e0f43a5b3 fix(ui): detect composed accessibility copy 2026-07-28 23:47:14 +08:00
Vincent Koc 8f40fac955 fix(ci): run localization checks for UI changes 2026-07-28 23:47:14 +08:00
Vincent Koc 498a7fec28 test(ui): catch untranslated accessibility labels 2026-07-28 23:47:14 +08:00
Vincent Koc 2f5c70ec24 fix(docs): preserve localized navigation parity 2026-07-28 23:45:40 +08:00
Peter Steinberger 3224005c82 fix(ci): bound Telegram Mantis proof cleanup (#115253)
* test(mantis): bound Telegram proof cleanup

* test(mantis): enforce cleanup deadline in wrapper

* test(mantis): supervise cleanup through bash
2026-07-28 11:44:28 -04:00
Vincent Koc cbe19ed3be fix(scripts): materialize PR worktrees before gates (#115120)
* fix(scripts): materialize PR worktrees before gates

* test(agents): stabilize failed local service fixture

* test(ui): isolate config route location
2026-07-28 15:38:17 +00:00
Peter Steinberger a8f088e50a perf(pr): cache complete small file lists (#115199) 2026-07-28 11:20:56 -04:00
Peter Steinberger b3fc995e73 fix(ui): stop modal autofocus steal after the open animation (#115168)
* fix(ui): stop modal autofocus steal after the open animation

* test(ui-e2e): give expect.poll a CI-realistic deadline
2026-07-28 10:39:34 -04:00
Dallin Romney 9feb6ad161 refactor(qa): make scenario selection taxonomy-owned (#114055)
* refactor(qa): remove scenario execution profiles

* fix(qa): preserve smoke CI membership

* test(qa): drop redundant smoke pack order check

* refactor(qa): remove Matrix runner profiles

* refactor(qa): simplify Matrix CI orchestration

* refactor(qa): derive execution sets from taxonomy

* fix(qa): keep Matrix shard helper private

* refactor(qa): derive profile scenarios from taxonomy

* refactor(qa): reconcile taxonomy selection

* refactor(qa): use canonical profile planning

* refactor(qa): select canonical coverage owners

* fix(qa): keep profile selector internal

* refactor(qa): remove representative coverage owners
2026-07-28 22:23:41 +08:00
Peter Steinberger 99ec30b44b feat(plugins): catch code-mode drift between catalogs shipping the same model (#115183)
* feat(plugins): catch code-mode drift between catalogs sharing one model

Adds a contract test that groups bundled catalog rows by shared upstream
model and requires every row in a group to declare compat.codeMode once any
sibling does. Rows sharing a model id group automatically; rows under
different ids opt in with the new manifest-only `upstreamModel` marker.

Moves the kimi catalog into its manifest so the scan can see it, and records
the tier reseller catalogs were silently missing as explicit "capable".

* docs: regenerate docs map for the shared-model code-mode section
2026-07-28 08:52:21 -04:00
Peter Steinberger 0cb56ace62 fix(ui): harden browser, session, permissions, and media lifecycles (#115110)
* fix(ui): harden browser, session, and gateway lifecycles

* fix(ui): satisfy browser lifecycle and control UI CI gates

* fix(ui): satisfy type-aware browser and cron lint

* fix(ci): isolate model and UI test workloads

* fix(ui): reject superseded browser and session page races

* fix(ui): settle superseded background-tab refreshes

* fix(ui): reconcile committed navigation and terminal pages

* fix(ui): preserve canonical cron permission contracts
2026-07-28 05:48:35 -07:00
Peter Steinberger 981a3dfad3 fix(packaging): require the code mode worker in shipped tarballs (#115178) 2026-07-28 08:26:30 -04:00
Dallin Romney a35bf77c82 fix(release): run harness install from its cwd (#115172) 2026-07-28 20:20:32 +08:00
wanyongstar 89b6d85cdd fix(scripts): bound android-release-signing exec operations (#110822)
* fix(scripts): bound android-release-signing exec operations

* fix(scripts): test Android signing timeouts

Co-authored-by: wanyongstar <wan.yong@xydigit.com>

* fix(scripts): keep signing timeout internal

* docs(scripts): clarify signing timeout scope

* test(agents): isolate transport timeout proof

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-28 07:51:38 -04:00