Commit Graph

81264 Commits

Author SHA1 Message Date
Amp 0bc6ec6c69 fix(tui): retire local shell process trees 2026-08-21 13:07:29 +00:00
Peter Steinberger 9b37e538a8 perf(process): make command queues constant time (#127145)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f5-984a-7628-a30c-491c166ff247

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 03:19:16 -07:00
Peter Steinberger d2d63a2c3f fix: announce Worktrees operation failures (#127114)
* fix(ui): announce Worktrees operation failures

Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-b547-7788-a916-d4a94cbd3e3b

* test(ui): stabilize attachment URL lifecycle proof

Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-b547-7788-a916-d4a94cbd3e3b

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 03:16:43 -07:00
Peter Steinberger 81628db1d7 refactor(outbound): remove beta queue reply migration (#127133)
* refactor(outbound): remove beta queue reply migration

* test(outbound): retain legacy reply migration coverage

* test(outbound): type legacy migration fixture
2026-08-21 02:54:42 -07:00
Vincent Koc 225aa5a178 fix(ci): isolate Actions cache writes (#127107) 2026-08-21 02:45:06 -07:00
Peter Steinberger 5d8cd4c819 perf(test): speed up model setup state observations (#127134) 2026-08-21 02:40:20 -07:00
Peter Steinberger e17c858bae perf(gateway): scope startup model catalog planning (#127117)
Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 02:34:02 -07:00
Peter Steinberger f7cbe9e5da fix(slack): preserve partial reply delivery (#127130) 2026-08-21 02:32:05 -07:00
Peter Steinberger f14efd2a40 perf(gateway): avoid repeated legacy delivery scans (#127129)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f5-984a-7628-a30c-491c166ff247

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 02:30:29 -07:00
Peter Steinberger 9c3335a1a4 fix(qa): restore failed-tool recovery scenarios (#126971)
* fix(qa): sync cron failed-tool honesty fixture

* fix(qa): sync channel failed-tool honesty fixture

Amp-Thread-ID: https://ampcode.com/threads/T-01a02218-492f-73b8-8514-ef342917e129

* test(qa): sync OTEL failed-tool assertion

---------

Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: Dallin Romney <dallinromney@gmail.com>
2026-08-21 02:20:53 -07:00
Peter Steinberger 782a7d7aed refactor(discord): remove obsolete action runtime wrapper (#127123) 2026-08-21 02:07:48 -07:00
Peter Steinberger be2f7c6a3d perf(test): speed up Tasks page state observations (#127121) 2026-08-21 01:58:21 -07:00
Peter Steinberger d17bbfc31a feat(nodes): expose plugin duplex channels (#126961)
* feat(nodes): expose plugin duplex channels

* fix(nodes): enforce duplex declarations
2026-08-21 01:52:06 -07:00
Peter Steinberger 32fb2fc766 fix(cli): render task flow JSON failures (#127080)
* fix(cli): render task flow JSON failures

* test(cli): stabilize entry console capture

* fix(cli): keep JSON terminal resets off stdout

* fix(cli): keep task JSON resets off stdout
2026-08-21 01:48:16 -07:00
Peter Steinberger 5edc2a7f21 fix(twitch): retire client managers before disconnect (#127103) 2026-08-21 01:33:26 -07:00
Peter Steinberger 627f862e8e perf(test): speed up new-session model control observations (#127101) 2026-08-21 01:20:01 -07:00
Peter Steinberger f28bb5e79d refactor(telegram): remove obsolete progress summary collapse (#127089) 2026-08-21 01:19:49 -07:00
Peter Steinberger 0a0d343cf2 fix(ui): refresh active agent file content (#127086)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-b547-7788-a916-d4a94cbd3e3b

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 01:13:55 -07:00
Peter Steinberger 426a3d1be8 fix(cron): revalidate caller scope at mutation commit (#127042)
Amp-Thread-ID: https://ampcode.com/threads/T-01a02218-21a3-720e-82e4-5c16d962084a

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 01:10:55 -07:00
Peter Steinberger dfce5f6958 perf(skills): reuse plugin metadata for watcher refresh (#127088)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f5-984a-7628-a30c-491c166ff247

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 01:06:23 -07:00
Peter Steinberger fd3a919063 fix(media): clean failed temporary staging (#127092) 2026-08-21 01:02:27 -07:00
parthjayaram a049fe8c9b fix(cron): count isolated setup as execution progress (#93914)
Amp-Thread-ID: https://ampcode.com/threads/T-01a0220e-0046-742a-bdd8-2883b9305619

Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: Cadbury <cadbury@localclaw.local>
2026-08-21 00:58:30 -07:00
Peter Steinberger c7b216edef fix(cron): use selected account for CLI announce delivery (#126995)
* fix(cron): preserve CLI delivery account

Amp-Thread-ID: https://ampcode.com/threads/T-01a02218-35bb-715b-b40d-f918b943bbb7

* test(cron): prove CLI account-bound message sends

Amp-Thread-ID: https://ampcode.com/threads/T-01a02218-35bb-715b-b40d-f918b943bbb7

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 00:46:18 -07:00
Peter Steinberger 76af07b735 fix(onboard): redact gateway health failures (#127071)
Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 00:43:16 -07:00
Peter Steinberger 8ac7dd254c perf(test): speed up model provider page observation polling (#127085) 2026-08-21 00:40:36 -07:00
Peter Steinberger 58127fa73e fix(agents): remove a deleted agent's cron jobs on the offline delete path (#127075)
* fix(agents): remove a deleted agent's cron jobs on the offline delete path

Follow-up to #127037, which fixed the exec-approvals half of the same gap and
named this one explicitly.

`agents delete` tries the Gateway first and falls back to a local path. The
Gateway handler nests two transactional cleanups around the roster commit --
cron wrapping approvals wrapping the config write. After #127037 the offline
path did the inner one; it still skipped cron. So deleting an agent without a
Gateway left its scheduled jobs enabled:

    $ openclaw agents delete cronprobe --force
    Deleted agent: cronprobe            <- no mention of cron
    $ sqlite3 <state>/state/openclaw.sqlite "select job_id, name, agent_id, enabled from cron_jobs"
    975cb750-... | cronprobe-job | cronprobe | 1
    $ openclaw cron list
    cronprobe-job   every 1h   Next: in 59m   idle

To be accurate about severity: this is not silent. Each firing records
`error: "cron job agent is unavailable: cronprobe"` and `cron list` flips to
`error`. The defect is that the job keeps its schedule forever, and that
recreating an agent with the same id points it at the new agent.

The fallback had collapsed two different reasons into one `null` return, which
is what made the fix look unsafe at first: credential failures happen *before*
transport, so a live scheduler may still own the cron store, while an
unreachable Gateway means nothing else is holding it. `maybeDeleteAgentThroughGateway`
now returns a discriminated union, and only the unreachable branch mutates the
store directly. The credentials branch commits the roster, warns, and sets
`cronCleanupSkipped: true` in JSON.

The local `CronService` construction already existed inside
`local-request-context.ts`; it moves to `src/cron/local-service.ts` and both
callers share it rather than growing a second cron mutation path. That
extraction also switches the default-owner resolver from
`tryResolveLegacyCompatibilityAgentId` to `tryResolveAmbientOwnerAgentId`, which
is a superset -- it honors an explicitly configured
`agents.defaults.systemAgent.agentId` and otherwise falls back to exactly the
previous function. Live testing showed agentless memory-dreaming jobs need it to
load under explicit agent ownership.

Production +89/-62.

* test(agents): split the delete suite so the new cron coverage stays under the cap

The 40-line cron regression test added in the previous commit pushed
`src/commands/agents.delete.test.ts` to 1018 code lines, over the 1000 cap, and
`check-lint-core-3` went red. Repo policy forbids a `max-lines` suppression.

Unlike the earlier `cron/view.test.ts` split there was no describe-level seam --
23 flat tests in a single describe -- so the split follows subject instead. The
seven workspace-lifecycle tests (trashing, sharing, overlap, symlink reachability,
workspace-state cleanup) move to `agents.delete.workspace.test.ts`.

`vi.mock` and `vi.hoisted` are per-file and cannot be imported, so the mock
preamble and the shared `beforeEach` are declared in both files; the helper block
above them is unchanged in each. Each file then imports only what it uses, which
is why the import lists differ.

Trimming to a hair under the cap by moving only the new test was possible and
rejected: it would have left the file at ~978 code lines, back at the cap within
a couple of changes. This leaves 749 and 603 physical lines.

No test content changed: 27 passed before, 27 after.
2026-08-21 00:31:17 -07:00
Vincent Koc fa86caf94f fix(release): keep protected tooling trusted after main moves (#126881)
* fix(release): keep protected tooling trusted after main moves

* fix(release): cover protected tooling recovery paths

* fix(release): honor live tooling contracts

* fix(release): revalidate tooling at npm publish

* fix(release): bind npm publishers to live tooling

* fix(release): preserve trusted dispatch identity

* fix(release): revalidate parent authorization

* fix(release): bind ClawHub to release parent

* docs(release): define frozen tooling identity

* test(release): align ClawHub protected dispatch ref

* fix(release): trust protected plugin npm preflight tooling

* docs(release): scope protected writer guarantees

* fix(release): keep protected tooling foundation npm-only

* test(release): cover trusted npm preflight tooling
2026-08-21 07:24:31 +00:00
Vishal Doshi b470422371 fix(cron): surface Code Mode MCP resolution failures (#121796)
Amp-Thread-ID: https://ampcode.com/threads/T-01a0220e-1365-736f-b0f8-bfe122e23a8f

Co-authored-by: Grynn <grynn@users.noreply.github.com>
2026-08-21 00:15:35 -07:00
Peter Steinberger fc019c52b8 fix(gateway): return runtime-owned task results (#127045)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-b547-7788-a916-d4a94cbd3e3b

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 00:13:46 -07:00
Peter Steinberger e7e1c53250 fix(auto-reply): surface missing final replies after progress updates (#127070)
* fix(auto-reply): distinguish follow-up progress from final delivery

* test(auto-reply): compact follow-up delivery evidence cases
2026-08-21 00:07:45 -07:00
Ayaan Zaidi 190f2edd7f fix(qa): stop Mantis skipping visible Telegram changes (#127032)
Remove the premature visibility classifier and let one proof agent configure and exercise the disposable Telegram gateway. Align mock response timing with the 15-minute lane budget while preserving credential isolation through the alias-token proxy.
2026-08-21 12:33:38 +05:30
Peter Steinberger c83d212c7f perf(plugins): narrow installed index normalization imports (#127067)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f5-984a-7628-a30c-491c166ff247

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 00:03:27 -07:00
Peter Steinberger c021295233 fix(clawhub): clean failed archive staging (#127065) 2026-08-20 23:57:35 -07:00
Peter Steinberger 46d09d1a28 perf(test): speed up Agents page observation polling (#127063) 2026-08-20 23:55:44 -07:00
Vincent Koc 2405b98b05 fix(android): explicitly target notification intents (#127055) 2026-08-20 23:48:16 -07:00
Yuval Dinodia 8ec5ae0693 fix(agents): preserve literal Unicode-space paths (#126797)
Preserve model-supplied filename identity for mutations while keeping existence-checked Unicode-equivalent fallback for reads.

Co-authored-by: yetval <yetvald@gmail.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-21 12:18:11 +05:30
Vincent Koc 73ff2d2f45 fix(agents): distinguish review routing from enforcement (#126216) 2026-08-20 23:47:14 -07:00
Shakker faa1cfc598 fix(ui): associate steering work by target run (#126997) 2026-08-21 07:45:40 +01:00
Shakker b2d49afd8e fix(ui): collapse completed pre-steer work 2026-08-21 07:45:40 +01:00
Shakker 69fa1a8eab fix(codex): preserve steering transcript order 2026-08-21 07:45:40 +01:00
Peter Steinberger 72c8bf9946 fix(gateway): retain Bonjour cleanup on startup failure (#127062) 2026-08-20 23:39:12 -07:00
Vincent Koc 750f2f3762 fix(release): require concrete validation retry groups (#127012)
* fix(release): require concrete validation retry groups

* fix(release): reject mismatched retry filters

* fix(release): align retry controller vocabulary

* fix(release): preserve historical validation evidence

* fix(release): validate retry filters before scheduling

* test(release): follow shared filter validator

* docs(testing): clarify release QA retry groups
2026-08-20 23:35:16 -07:00
Peter Steinberger 5570c5ffac fix(file-transfer): expose directory page tokens (#127051) 2026-08-20 23:28:31 -07:00
Peter Steinberger 3b295b374c perf: trim setup detection worker imports (#127053)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-76a1-76f1-8758-25d0466913af

Co-authored-by: Amp <amp@ampcode.com>
2026-08-20 23:24:52 -07:00
Peter Steinberger ac724b1e41 fix(onboard): make --auth-choice help match the accepted set (#127030)
`openclaw onboard --help` advertised `claude-cli`, which the command
rejects, and hid `token`, which it accepts and its own error text
recommends. Three surfaces each rebuilt the accepted set independently:
Commander help asked for legacy aliases, the reset preflight added a
hardcoded `BUILT_IN_AUTH_CHOICES`, and the non-interactive dispatcher
added a hardcoded `GENERIC_NON_INTERACTIVE_AUTH_CHOICES`.

`formatAuthChoiceChoicesForCli` is now the single owner of that set. It
emits the generic token-provider choices (`setup-token`, `token`,
`apiKey`) that `AuthChoice` has always declared built-in, so every
surface renders and validates the same list.

Deprecated aliases stay out of it. `includeLegacyAliases: true` arrived
with a mechanical help-text refactor, never as a product decision: the
pre-refactor hardcoded help string listed no legacy alias, the reset
preflight's copy was unreachable because normalization runs first, and
the deprecation error already names the replacement. `oauth` is likewise
normalized to `setup-token` before any validator sees it, so the
dispatcher's `oauth` arm and its slot in the accepted list were dead.

Production LOC: -26.
2026-08-20 23:19:11 -07:00
Peter Steinberger 872048000b fix(gateway): await cron exit watcher drain (#126963)
* fix(gateway): await cron exit watcher drain

Amp-Thread-ID: https://ampcode.com/threads/T-01a0220d-d77f-73fb-a791-cbfb09be7d07

* fix(gateway): drain exit watchers before cron restart

Amp-Thread-ID: https://ampcode.com/threads/T-01a0220d-d77f-73fb-a791-cbfb09be7d07

* fix(gateway): fence cron restart after later stop

Amp-Thread-ID: https://ampcode.com/threads/T-01a0220d-d77f-73fb-a791-cbfb09be7d07

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-20 23:18:36 -07:00
Peter Steinberger f1723c757b fix(telegram): preserve direct-topic self-history (#127050) 2026-08-20 23:18:05 -07:00
Shakker d15f570742 fix: dismiss sidebar session menu tooltip (#127044)
Dismiss the sidebar session tooltip whenever its overflow menu opens, preserving unobstructed menu actions and stable row semantics.

Refs #127039.
2026-08-21 07:14:13 +01:00
Peter Steinberger f14cf6b910 perf(test): speed up pairing access polling (#127047) 2026-08-20 23:02:46 -07:00
Peter Steinberger c60a26695d perf(cli): remove ineffective dynamic imports (#127046)
Co-authored-by: Amp <amp@ampcode.com>
2026-08-20 23:01:49 -07:00