Commit Graph

81284 Commits

Author SHA1 Message Date
Amp c028581cce fix(exec): isolate completed-process retention 2026-08-21 15:04:13 +00:00
ClawSweeper 9050d9b0a7 fix(ui): align configured automation trigger status (#126784)
Vertically center the configured trigger label with the Advanced heading and cover the rendered geometry in Chromium.

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 06:23:18 -07:00
Hüseyin 6132c6f6cb fix: exec treats empty workdir from models as omitted (#126509)
* fix(exec): treat exact empty workdir as omitted

Small tool-calling models fill every optional field of the exec schema,
so exec arrives with workdir: "" instead of omitting the field. The
empty string was treated as a literal path and the command was refused,
wasting agent turns and surfacing misleading failures (e.g. the model
concluding the runtime is unavailable).

Normalize only the exact empty string to omitted at the workdir input
boundary; whitespace-only and nonempty invalid paths remain fail-closed.

Closes #126390

* fix(exec): align exec schema with empty-workdir behavior

The shared model-facing schema still declared blank and whitespace
workdirs invalid while the resolver now treats an exact empty string as
omitted. Update the schema description to state that an empty string
means omitted and only whitespace-only values are invalid, and update
the schema assertion accordingly.
2026-08-21 06:14:42 -07:00
ruel225 587c7524e5 fix(normalization-core): preserve non-Error object causes with extra keys in formatErrorMessage (#126654)
* fix(normalization-core): preserve non-Error object causes with extra keys

The cause-chain branch of formatErrorMessage called only
formatStatusAndCode(cause) with no stringifyUnknown fallback, while the
top-level branch used formatStatusAndCode(value) ?? stringifyUnknown(value).
formatStatusAndCode returns undefined for any object whose keys are not
exactly status/code, so a non-Error object cause carrying extra keys (e.g.
{ statusCode: 429 } or { status: 503, code: "UNAVAILABLE", requestId: "abc" })
was silently dropped — appendCauseMessage(undefined) no-op'd and the loop
broke, losing the diagnostic/retryable detail.

Mirror the top-level branch: appendCauseMessage(formatStatusAndCode(cause) ??
stringifyUnknown(cause)). Behavior-neutral for causes that already render;
restores the dropped detail for the asymmetric case. stringifyUnknown is a
local helper in the same file.

Closes #126652

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

* test(normalization-core): assert structured cause metadata

---------

Co-authored-by: ruel225 <ruel225@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Altay <altay@hey.com>
2026-08-21 16:09:25 +03:00
Jesse Merhi efbcb57569 fix(control-ui): autocomplete model thinking levels (#123507)
* fix(control-ui): autocomplete model thinking levels

* fix(control-ui): keep thinking options model-current

* fix(control-ui): execute catalog thinking levels

* fix(control-ui): close stale think picker

---------

Co-authored-by: Jesse Merhi <openclaw@users.noreply.github.com>
2026-08-21 23:02:33 +10:00
Peter Steinberger e66d7c5cac fix(qa): index scenario execution paths (#127185) 2026-08-21 05:49:27 -07:00
Goutam Adwant 17d1204b76 fix(gateway): avoid session lookup for stream events (#125872) 2026-08-21 15:31:24 +03:00
Ayaan Zaidi e8d2b8cb18 fix(mantis): keep Telegram proof running and honest (#127108)
Make long, free-form Telegram proof runs truthful and resilient. Keep the trusted mock harness current across historical SUTs, preserve intentional silence and blocked outcomes, remove fixed attempt/lifetime caps, and export cropped motion proof without the prior memory spike.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-21 17:53:54 +05:30
Peter Steinberger 085044cd5f perf(plugins): reuse provider ownership metadata (#127178)
Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 05:21:44 -07:00
Peter Steinberger 02bba8ee84 fix(heartbeat): honor configured session for monitor wakes (#127153)
Sessionless interval heartbeat monitor and task wakes now defer to the
configured heartbeat session, while explicit user sessions and ordinary cron
event queue ownership remain unchanged.

Maintainer replacement for #116373 because the external fork cannot satisfy
the strict Clownfish landing transaction. The replacement preserves the
accepted patch exactly on current main.

Fixes #116205.
Thanks @sloptop-the-terrible for the original patch and @QQSHI13 for the report.

Co-authored-by: sloptop-the-terrible <310909503+sloptop-the-terrible@users.noreply.github.com>
2026-08-21 05:11:01 -07:00
Peter Steinberger 498471396f fix(gateway): refresh health after runtime inspection failure (#127174) 2026-08-21 05:04:20 -07:00
Peter Steinberger 1dbcbb2fb0 fix(ui): keep segmented selections visible in forced colors (#127165)
* test(ui): cover segmented controls in forced colors

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

* fix(ui): preserve segmented selection in forced colors

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

* fix(ui): separate forced-color selection and focus

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

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 04:53:52 -07:00
Peter Steinberger cb563bb16d perf(test): speed up board provider snapshot observations (#127163) 2026-08-21 04:26:39 -07:00
Peter Steinberger 096a970820 perf(sessions): lazily scan transcript matches (#127162)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f5-984a-7628-a30c-491c166ff247

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 04:20:02 -07:00
Peter Steinberger 75c44b2b98 fix(ui): recover cloud worker saves after reconnect (#127150)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-b547-7788-a916-d4a94cbd3e3b

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 03:50:40 -07:00
Peter Steinberger 7fd243326f fix(process): retain live children after signal errors (#127154) 2026-08-21 03:49:55 -07:00
Vincent Koc 67630f6854 fix(ci): isolate candidate cache authority (#127149) 2026-08-21 03:47:41 -07:00
wanyongstar 2c7936414e fix(comfy): forward req.timeoutMs in music generation (#123444)
The Comfy music provider dropped req.timeoutMs when calling
runComfyWorkflow, while the image and video providers forward it.
Request-level timeouts (mediaModels.music.timeoutMs, tool parameter)
were silently ignored: shorter values had no effect and longer ones
still failed at the hardcoded 300s default.

Punchcard-Session: coral-harbor-river-yv
2026-08-21 03:46:42 -07:00
Peter Steinberger 5016e6519f perf(clickclack): avoid duplicate upload buffer (#127152)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f5-984a-7628-a30c-491c166ff247

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 03:43:21 -07:00
Peter Steinberger 7ecc9f6049 perf(test): speed up server preference observations (#127144) 2026-08-21 03:40:30 -07:00
mjzcng 8f8895c141 Cron: bound cross-tick admission (#119195)
* 修复 Cron 跨批次有界准入

* 修复 Cron 收据冲突后的容量唤醒

* 适配最新主线的 Cron 运行态测试

* 拆分 Cron 容量边界测试

* 满足 Cron 即时重检返回类型约束

* fix(cron): track independent timer tick roots

Amp-Thread-ID: https://ampcode.com/threads/T-01a0223e-d6cf-70c1-b0f8-5ea0193d09c0

* fix(cron): retain delayed capacity wake ownership

Amp-Thread-ID: https://ampcode.com/threads/T-01a0223e-d6cf-70c1-b0f8-5ea0193d09c0

* test(cron): await deferred cleanup runs

Amp-Thread-ID: https://ampcode.com/threads/T-01a0223e-d6cf-70c1-b0f8-5ea0193d09c0

* fix(cron): keep admission helper within lint budget

Amp-Thread-ID: https://ampcode.com/threads/T-01a0223e-d6cf-70c1-b0f8-5ea0193d09c0

* test(mcp): restore stderr routing after supervision tests

Amp-Thread-ID: https://ampcode.com/threads/T-01a0223e-d6cf-70c1-b0f8-5ea0193d09c0

* fix(cron): restore partial wake admission context

Amp-Thread-ID: https://ampcode.com/threads/T-01a0223e-d6cf-70c1-b0f8-5ea0193d09c0

---------

Co-authored-by: zhangcheng <zhangcheng@cpe-fund.com>
Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: mjzcng <6001731+mjzcng@users.noreply.github.com>
2026-08-21 03:37:13 -07: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