Commit Graph

81507 Commits

Author SHA1 Message Date
Peter Steinberger be0bcb395d fix(gateway): clear stale credential warnings after channel plugin removal (#127503)
* fix(gateway): retire removed channel credential owners

Retire stale account diagnostics only after successful channel plugin removal. Preserve independently owned credential diagnostics across snapshot replacement and rollback.

* test(gateway): cover plugin-disable owner pruning
2026-08-21 15:58:48 -07:00
Alix-007 a7a68cfb47 fix(ui): keep annotated slash commands local (#121191)
* fix(ui): keep browser annotations out of commands

* fix(ui): reuse raw command classification

* fix(ui): fence retained browser annotations by exact identity

Preserve the authoritative annotation object during slash-command recovery and prove terminal command retirement, restored screenshot and document bytes, and same-ID replacement races.

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

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-21 15:56:10 -07:00
Peter Steinberger 11081a95b8 test: remove final moving-tip duplicates (#126990) 2026-08-21 15:54:24 -07:00
Peter Steinberger 8c0cdc6535 fix(gateway): reject unconfigured session owners (#127661)
Validate the canonical configured owner before session and worktree side effects so dispatch, reclaim, and delete can manage every created session.
2026-08-21 15:51:45 -07:00
Peter Steinberger 74c1900e63 refactor(tooling): unify managed child process cleanup (#127480) 2026-08-21 15:43:39 -07:00
Peter Steinberger ee468b8038 fix(macos): prevent stale port sweeps from killing remote tunnels (#127665) 2026-08-21 15:42:39 -07:00
Peter Steinberger 1257279de6 fix(macos): suppress SIGPIPE on process pipe write ends (#127666)
Writing to a pipe whose reader has already exited raises SIGPIPE, which
kills the whole process instead of throwing. MacNodeHostWorker already
guarded its stdin pipe with F_SETNOSIGPIPE; the codex App Server client
and the MLX TTS helper transport did not, so a child exiting mid-write
could take down the app. Suppressing the signal exposed that an
undelivered App Server request write was reported as appServerUnavailable
even though the frame was provably never sent, so it now requeues once
onto a fresh child instead of failing the caller.

Test-side pipe write ends whose readers are spawned children (or a
readability handler that can close the pipe mid-test) get the same
suppression so a racing reader exit fails the assertion instead of
killing swiftpm-testing-helper with signal 13, which is what caused the
macos-swift CI lane's intermittent unrelated-test crashes (e.g. PR
#126559, run 32341197738 job 96340683947).
2026-08-21 15:40:50 -07:00
Peter Steinberger c7c3a20a58 fix(gateway): recover failed cloud worker reclaim (#127660)
Accepted reclaim results hand off to same-Gateway recovery so provider cleanup can retry without direct Crabbox intervention.

Related: #112106
2026-08-21 15:40:47 -07:00
Peter Steinberger 1c5c878a96 fix(ui): show filtered agent skills (#127663)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-b547-7788-a916-d4a94cbd3e3b

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 15:40:07 -07:00
Peter Steinberger 5165fbb4e7 refactor(process): supervise Claude node invocations (#127475)
* refactor(process): supervise Claude node invocations

* fix(process): preserve exact node invocation environment

* test(telegram): await album reply dispatch deterministically
2026-08-21 15:36:52 -07:00
Jesse Merhi a5e9b3189d fix(ui): keep chat pinned as composer grows (#122985)
Co-authored-by: Jesse Merhi <jesse-merhi@users.noreply.github.com>
2026-08-22 08:36:26 +10:00
Peter Steinberger 680001bec4 fix(gateway): fix plugin metadata lifecycle staleness in auth-bypass cache and config reload (#127664)
The gateway HTTP auth-bypass path cache was keyed only by config object
identity, so replacing a channel plugin's declared bypass contract while
config identity stayed stable preserved obsolete unauthenticated HTTP
routes. It now clears on plugin metadata lifecycle resets alongside every
other plugin-derived process memo.

notifyPluginMetadataChanged cleared the process plugin metadata snapshot
slot, but when config bytes were unchanged the config-reload diff took its
early no-op return and skipped both plugin reload and republishing, leaving
the snapshot slot empty so configless readers cold-scanned repeatedly. An
unchanged-bytes metadata signal now forces a plugin-reload plan so the
runtime generation republishes.
2026-08-21 15:35:31 -07:00
Peter Steinberger 6d47044e73 fix(ui): release stale model setup wizard sessions (#127657) 2026-08-21 15:33:30 -07:00
Peter Steinberger fd0c9f6f96 perf(tui): prepare searchable picker rows once (#127620)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f5-984a-7628-a30c-491c166ff247

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 15:31:42 -07:00
Josh Lehman d54a8e80f2 fix(ui): keep Home status clear of Pages editor (#127642) 2026-08-21 15:31:13 -07:00
Jesse Merhi d630897a95 fix(ui): show one session activity indicator (#123288)
* fix(ui): show one session activity indicator

* chore(ui): remove unused session unread renderer

* fix(ui): prioritize active child run indicators

* fix(ui): prioritize Home run activity

* test(ui): measure session endcap layout

* test(ui): align endcap atom count

* fix(ui): preserve hidden unread semantics

* fix(ui): announce active Home runs

* refactor(ui): centralize sidebar state descriptions

* fix(ui): compose Home activity description

---------

Co-authored-by: Jesse Merhi <jesse-merhi@users.noreply.github.com>
2026-08-22 08:27:37 +10:00
Peter Steinberger c801579020 fix(onboard): keep provider credentials with named first agents (#127572)
* fix(onboard): keep provider credentials with named first agents

* fix(onboard): preserve workspace in provider choice normalization
2026-08-21 15:20:58 -07:00
Peter Steinberger 9903e404ef feat(ui): add live CPU/memory/delay sparkline graphs to the system busyness overlay (#127650)
* feat(ui): add cpu/memory graphs to system busyness overlay

* refactor(ui): redesign busyness overlay vitals as sparkline stat tiles

Merge the duplicated sparkline row and numeric tile grid into three vital
tiles (CPU, memory, event-loop delay) with gradient area charts, a live
pulse dot, pointer scrubbing with value+age readout, and a danger tint
driven by the gateway's own event-loop degradation reasons. Memory
auto-ranges its baseline so RSS trends stay visible.
2026-08-21 15:06:17 -07:00
Peter Steinberger 75b736c252 test(runner): reset console routing between non-isolated files (#127604)
enableConsoleCapture() replaces every console method with a forwarder and
routeLogsToStderr()/`--json` mode latch loggingState.forceConsoleToStderr,
which production only unwinds at process exit. loggingState is keyed off
globalThis so it survives vi.resetModules(), so a shared Vitest worker carried
both into the next file: the inherited forwarder writes to process.stderr and
the next file's console.error spy records nothing.

That is the source of the order-dependent
`src/entry.run-main.test.ts > keeps expected conditions at exit 1` flake in
shard core-unit-src-security-2 — it failed only on workers that ran
src/mcp/codex-supervision-tools-serve.test.ts (serveCodexSupervisionToolsMcp
-> routeLogsToStderr) first.

Restore the worker's baseline console methods and logging state in the
runner's existing cross-file cleanup, and drop the two consumer-side
workarounds that were compensating for it.
2026-08-21 14:49:05 -07:00
Peter Steinberger f95443125b fix(ui): separate settings footer actions from build info (#127597)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-b547-7788-a916-d4a94cbd3e3b

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 14:48:42 -07:00
Peter Steinberger 7625443195 fix(macos): fence stale Gateway connection-mode transitions (#127609) 2026-08-21 14:46:59 -07:00
Peter Steinberger 9b98e7b193 fix(agents): preserve real user turns during compaction (#127563) 2026-08-21 14:46:21 -07:00
Peter Steinberger 9dc42007a7 fix(cli): stop approvals --json printing the exec-approvals socket token (#127610)
approvals get --json and every local approvals write emitted
file.socket.token in clear text, while the gateway RPC, the node-host RPC,
and the state snapshot sanitizer all strip it, and the human-readable table
shows only the socket path.

The token is root key material: operator-approval-runtime-token.ts HMACs it
to authorize local operator-approval clients, and agent-runtime-identity-token.ts
reads it for the agent runtime identity token.

Promote one canonical redactExecApprovals to src/infra/exec-approvals.ts,
retire the two duplicate copies, and apply it to the local CLI JSON paths.
It also drops the snapshot's raw field, which carried the same token as
stored JSON.
2026-08-21 14:43:35 -07:00
Peter Steinberger 69e4fbbeb5 fix(cli): tell operators a racing config set changed nothing (#127554)
When two config writes raced, the loser printed a bare "config changed
since last load" and exited 1 — no statement that its write was abandoned
and no hint that re-running works. The gateway sibling already says
"re-run config.get and retry".

Format ConfigMutationConflictError at handleConfigMutationError, the single
CLI boundary, so the low-level throw sites keep serving gateway and
programmatic callers unchanged. Dry-run JSON now reports kind "conflict"
instead of mislabelling a concurrency conflict as a schema error.

Concurrency control itself is unchanged: baseHash pinning and the retry
loop stay exactly as they were.
2026-08-21 14:33:10 -07:00
Peter Steinberger c18654bf01 fix(agents): preserve approved exec output stream labels (#127595)
Adopted from Microsoft's Lobster patch 0013 via
giodl73-repo/lobster-plugins-and-patches (source commit e9f84234ebdf).
2026-08-21 14:31:26 -07:00
Peter Steinberger 41acededbc perf(gateway-client): skip unused timing dispatch (#127566)
Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 14:21:07 -07:00
Peter Steinberger 69d30923bf perf(test): speed up model provider recovery observations (#127570) 2026-08-21 14:17:24 -07:00
Peter Steinberger b6894751d2 test(msteams): pin reply threading and reaction routing across conversation kinds (#127568)
Table-driven regressions prove personal and group sends never carry a
Teams thread suffix while channels preserve ;messageid, and that agent
react actions route to the prepared Graph target per conversation kind
with exact result payloads and inbound reaction event labels.

Parity proof for Microsoft Lobster patches 0038/0026 via
giodl73-repo/lobster-plugins-and-patches.
2026-08-21 14:16:38 -07:00
Peter Steinberger 14cebc477a fix(recovery): keep queued replies alive during session watchdog repair (#127510)
* fix(recovery): preserve queued turns during session watchdog repair

* test(plugins): make stalled response timeout deterministic
2026-08-21 14:14:26 -07:00
Peter Steinberger eb8d90a246 fix(crabbox): decouple lease heartbeat budget from renewal cadence (#127559)
* fix(crabbox): decouple lease heartbeat budget from cadence

Give coordinator lease heartbeats an independent 150-second execution budget, capped at half the idle timeout, after production AWS samples reached 107.6 seconds. Preserve the renewal cadence and unrelated lifecycle timeouts while identifying Crabbox v0.44.0 as the first heartbeat-capable release.

* refactor(crabbox): parse profile durations once

requirePositiveDuration already parsed the duration to validate it, then
discarded the result so the caller re-parsed and coerced an Option to a
number without handling undefined. Return the parsed milliseconds instead:
one parse, and no path where a NaN idle timeout reaches the heartbeat
budget.
2026-08-21 14:09:18 -07:00
Hannes Rudolph 5b67b61964 feat(dashboard): let widgets run granted actions and open links (#127315) 2026-08-21 14:57:40 -06:00
Ben Badejo 47d21dc3c6 fix(matrix): gateway fails to start when legacy credentials differ (#124893)
* fix(matrix): converge differing credential migration

* test(matrix): split doctor credential migrations

---------

Co-authored-by: Benjamin Badejo <ben@benbadejo.com>
2026-08-21 13:54:01 -07:00
Peter Steinberger 33a0bea6d0 test(agents): cover configured bundle MCP request timeouts (#127529)
Adopted from Microsoft's Lobster patch 0042 via the
giodl73-repo/lobster-plugins-and-patches upstream candidate
(source commit e9f84234ebdf, blob 8e753747babe).
2026-08-21 13:48:36 -07:00
Peter Steinberger 3bb1433b78 fix(ui): surface config open-file failures (#127498)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-b547-7788-a916-d4a94cbd3e3b

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 13:37:31 -07:00
Peter Steinberger 959adf6f33 perf(cron): summarize timer schedule in one pass (#127495)
Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 13:30:53 -07:00
Peter Steinberger 3ea90bdcdb feat(ui): add Person grouping mode for sessions sidebar and sessions page (#127346)
* feat(ui): add Person grouping mode for sessions sidebar and sessions page

Sessions can now be grouped by their durable owner identity: the sidebar
Group-by menu gains a capability-gated Person mode (self first, humans by
label, agent identities after; ownerless rows keep their smart zones), and
the sessions page gains the matching person mode. Person section headers
render the owner avatar and profile label; the mock dev server now
advertises the multi-identity policy and carries explicit row owners the
way the gateway projects createdActor fallbacks.

* feat(ui): gate sessions-page Person grouping on the identity capability

Mirrors the sidebar: the Person option hides without
hasMultipleSessionSharingIdentities and a stored Person preference
renders as None until the capability returns.
2026-08-21 13:21:43 -07:00
Peter Steinberger 7909ea6983 ci: remove the Test Performance Agent
The workflow ran a Codex agent over the full test suite and pushed
`test: optimize slow tests` straight to `main` under `contents: write`, with no
pull request and no human review. Its gates were a path allowlist, a
no-add/delete/rename rule, a non-decreasing total test count, and
`pnpm check:changed` -- which covers changed lanes, not the full suite. Test
optimization is exactly the class of change where a plausible edit can weaken
coverage without moving the test count, so unattended landing is the wrong
trade. Autonomous commits to `main` are not something this repo wants.

It had also been inert since well before this. The daily-cadence gate excluded
prior runs with `select(.status != "cancelled")`, but a finished cancelled run
reports `status: "completed"` with `conclusion: "cancelled"` -- verified against
run 32506655531, which that filter counts as a prior run. Its `concurrency`
block sets `cancel-in-progress: false`, so main's push rate produced dozens of
cancelled runs per hour and every trigger skipped, reporting green after ~2
minutes of doing nothing. No `test: optimize slow tests` commit has ever landed
on `main`.

`pnpm test:perf:groups` and the rest of the performance tooling it drove stay;
they are useful by hand and documented in docs/reference/test.md.

Repository secret OPENCLAW_TEST_PERF_AGENT_OPENAI_API_KEY now has no consumer
and can be deleted.
2026-08-21 13:19:14 -07:00
Peter Steinberger 731e9e7681 perf(test): speed up browser extension state observations (#127471) 2026-08-21 13:18:11 -07:00
ClawSweeper 229ce32e32 fix(ui): align run history dropdown text (#127443)
Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-08-21 13:12:10 -07:00
Peter Steinberger 519877a317 fix(ui): surface session owner assignment failures (#127431)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-b547-7788-a916-d4a94cbd3e3b

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 13:09:31 -07:00
Jason (Json) a4ae339903 docs: prefer gh attach for PR media (#127417) 2026-08-21 13:55:28 -06:00
Peter Steinberger 1353ce0995 feat: run Codex sessions on approved paired devices (#127202)
* feat(codex): execute paired-device sessions over node carrier

* fix(node-host): preserve approved invocation session identity

* fix(codex): observe paired-node execution leases before handshake

* fix: fence paired-device placement and Codex execution owners

* fix: satisfy paired-device placement CI ownership guards

* fix(codex): reject credentialed paired-node URL parameters

* fix(codex): fence nested remote HTTP session credentials

* fix(codex): scrub node process URLs and preserve plaintext HTTP

* test(codex): republish node inventory after capability approval
2026-08-21 12:50:26 -07:00
Peter Steinberger bc1f9609a3 fix(status): surface an invalid config instead of reporting a healthy system (#127402)
openclaw status exited 0 with a complete, healthy-looking report when the
config file failed validation, silently substituting defaults for the
operator's authored values. Every sibling command — config validate,
agents list, models list, doctor — reported the failure.

readBestEffortConfigSnapshotFromContext already read snapshot.valid and
dropped it, and BestEffortConfigSnapshot had nowhere to carry it, so no
consumer of the best-effort path could report it. Carry the fact from its
producer as configDiagnostics and render it in text, --json, and --all.

The sibling readSourceConfigBestEffortFromContext already states the rule
seventeen lines below: best-effort legitimizes the fallback value, not the
silence.
2026-08-21 12:48:24 -07:00
Peter Steinberger 3376c29800 perf(discord): avoid redundant payload cleaning (#127422)
Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 12:42:14 -07:00
Peter Steinberger b9ebfeb950 perf(qa): isolate OTEL model-call test imports (#127420) 2026-08-21 12:33:02 -07:00
Gio Della-Libera 61842af8c5 fix(claws): preserve unchanged owned skills on update (#126479)
Avoid rematerializing exact unchanged Claw-owned skills while retaining mutation and provenance blockers and failing closed if package state changes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Co-authored-by: Gio Della-Libera <giodl@microsoft.com>
Copilot-Session: 75f14ffa-b451-435e-97ce-59816458426d
2026-08-21 12:32:58 -07:00
pash-openai 4573635c77 Let Codex use newly available account models before catalog refresh (#127394)
* Let Codex run newly available account models without host credentials

* Keep authored provider routes ahead of native account authentication

* Keep native Codex account discovery consistent with model availability

* Preserve advanced reasoning for newly discovered Codex models
2026-08-21 19:30:54 +00:00
Josh Avant 0b85966072 fix gateway conversation route ownership (#126424) 2026-08-21 12:20:21 -07:00
Peter Steinberger 90d1c43f5a fix(ui): announce custom theme import results (#127380)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-b547-7788-a916-d4a94cbd3e3b

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 12:17:27 -07:00
Marvinthebored 1b998c0d84 fix: /restart restarts the gateway over and over instead of once (#127179)
The /restart command is dispatched from a durable channel ingress row. The
gateway begins its restart drain before that dispatch returns, so the row is
still claimed when root-work admission closes. The drain sees
GatewayDrainingError and releases the row without spending its retry budget
(#125918), which is correct for an ordinary message and wrong for a command
that caused the drain: the successor gateway claims the same row and runs
/restart again, forever. Every boot is clean, so the gateway looks healthy
throughout.

Adopt the ingress claim in the restart command handler before scheduling the
restart. The command is not idempotent, so losing the acknowledgement is better
than an unbounded restart loop. The drain's deferral branch is unchanged.

Co-authored-by: Marvinthebored <262704729+Marvinthebored@users.noreply.github.com>
2026-08-21 12:12:58 -07:00