Commit Graph

7253 Commits

Author SHA1 Message Date
Vincent Koc 8a09e71953 fix(release): bind GitHub and Windows writers 2026-08-20 21:20:07 -07:00
Vincent Koc ac8018edcf fix(release): preserve trusted dispatch identity 2026-08-20 20:54:18 -07:00
Vincent Koc 20a01f9308 fix(release): bind npm publishers to live tooling 2026-08-20 20:17:17 -07:00
Vincent Koc c89a3dde28 fix(release): revalidate tooling at npm publish 2026-08-20 17:17:22 -07:00
Vincent Koc 87c1c4cc1d fix(release): honor live tooling contracts 2026-08-20 17:10:14 -07:00
Vincent Koc 7f595f04a6 fix(release): cover protected tooling recovery paths 2026-08-20 16:51:20 -07:00
Vincent Koc 7daa6c02d7 fix(release): keep protected tooling trusted after main moves 2026-08-20 16:28:28 -07:00
Peter Steinberger e78b9d3ce4 fix(install): defer success until verification (#126871) 2026-08-20 15:57:11 -07:00
Vincent Koc fa71a6f27b fix(qa): isolate packaged mock auth bootstrap (#126247)
* fix(qa): isolate packaged mock auth config

Punchcard-Session: frost-orchard-lantern-ze
(cherry picked from commit 648bd40a4f)

* fix(qa): scrub inherited shell startup env

* fix(qa): block exported Bash functions
2026-08-21 06:51:34 +08:00
joshavant b52d2f08f5 fix(ci): trust maintainer-authored dependency changes 2026-08-20 15:09:22 -05:00
Peter Steinberger 4249df34b4 improve(code-mode): call tools as global functions (#126262)
* feat(code-mode): expose tools as global functions

* fix(code-mode): harden callable tool composition

* fix(code-mode): reserve private guest globals

* fix(cron): migrate legacy code-mode triggers

* fix(code-mode): align final tool result contracts
2026-08-20 12:18:23 -07:00
Vincent Koc 701b576cc1 fix(ci): default Telegram advisory input to false (#126794) 2026-08-21 03:03:52 +08:00
Peter Steinberger ee7146a282 fix(ui): make startup gzip runtime-independent (#126795)
Host zlib versions compress identical startup assets into different bytes, causing false Linux budget failures. Emit canonical shipped pako gzip sidecars, restore the 512 B ratchet tolerance, and lower the startup baseline from 348351 B to 344531 B.
2026-08-20 12:00:01 -07:00
Dallin Romney 2f602fd382 fix(plugin-sdk): deduplicate API diff declarations (#126725) 2026-08-20 11:31:48 -07:00
Patrick Erichsen 4f1172a6ca test(doctor): cover copied-state migration sequence (#126508) 2026-08-20 11:14:13 -07:00
Patrick Erichsen c99bc4601f test(gateway): cover copied Codex session resume (#126502) 2026-08-20 11:11:34 -07:00
Patrick Erichsen 7e4eeb90d7 fix(pr): batch ignored transition checks (#126759)
* fix(pr): batch ignored transition checks

* fix(pr): ignore absent ignored transition paths
2026-08-20 11:08:28 -07:00
Vincent Koc 2f0f65e790 fix(ci): add Telegram-only package acceptance profile (#126769) 2026-08-20 11:01:59 -07:00
Peter Steinberger 46c71b564e fix(config): validate config writes against the config being written (#126734)
* fix(config): validate config writes against the config being written

writeConfigFileFromContext passed the pre-write snapshot's plugin
metadata into strict validation. During onboarding that snapshot belongs
to an intermediate config written by agent creation, which has no plugin
entries, so its scoped manifest registry is empty. Validating the final
candidate against it made every plugin entry added by the same write look
unknown, and non-interactive onboarding warned that the openai and codex
entries it had just written were stale or uninstalled.

Drop the stale snapshot so validation resolves the manifest registry from
the candidate it is actually validating. Strict semantic validation is
unchanged, and the registry load stays lazy.

* fix(ci): raise the Control UI startup JS baseline to unblock main

main is red on the Control UI startup-JS ratchet: unrelated PR #126725 measures 348289 B and this branch measures 348351 B against a 347023 B baseline + 1056 B tolerance. Twenty-six UI commits have landed since the last bump (#126474), none individually large. Baseline moves to the CI-measured 348351 B, well under the 358400 B maintainer-approved ceiling that still guards cumulative creep.
2026-08-20 09:32:57 -07:00
Ayaan Zaidi 4768ac53c5 feat(qa): acknowledge Mantis PR requests (#126702)
Give maintainers immediate visibility when Mantis is requested. Bare mentions now react, link the active run, and keep one run-owned status comment through proof, short-circuit, or failure.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-20 21:19:40 +05:30
Peter Steinberger 3801331d22 fix(workers): complete autonomous cloud desktop startup (#126705)
* fix(gateway): admit recovering workers during startup

* fix(gateway): admit recovering nodes during startup

* fix(crabbox): bind worker desktop to XFCE session

* fix(workers): reuse Git base during workspace transfer

large clean/stale worktrees were downloading every tracked file after the verified base pack, crossing transfer authority; selectively checkout desired base-index paths, preserving deletions and symlink confinement.

* fix(workers): clone reachable stale workspace commits

tip-only origin detection forced published ancestor commits through heavyweight Gateway transfer; the existing exact checkout and manifest verification safely own reachability/fallback.

* perf(workers): use blobless origin clones

* fix(workers): bundle undici in worker deploy artifact
2026-08-20 08:29:47 -07:00
Peter Steinberger deb73f02bd fix(qa): clean up terminated Telegram observers safely (#126704) 2026-08-20 08:27:34 -07:00
Ayaan Zaidi 8458777e6a feat(qa): trigger Mantis proof from pull requests (#126658)
Add trusted ClawSweeper-label and maintainer-comment dispatch for Mantis Telegram proof. Short-circuit non-visible PRs before desktop setup while preserving exact-head, fork, credential, and comment-ownership boundaries.
2026-08-20 20:05:51 +05:30
Peter Steinberger 0d43ade926 perf(test): cache parsed release workflows (#126673) 2026-08-20 06:28:31 -07:00
Peter Steinberger e1051ceea3 fix(release): dispatch validation by full SHA (#126669) 2026-08-20 06:01:09 -07:00
Peter Steinberger bb96493ebe fix(logging): make clawlog JSON parseable (#126651) 2026-08-20 05:02:28 -07:00
Vincent Koc c28c279afa fix(release): keep frozen validation independent of main (#126622)
* fix(release): freeze validation tooling identity

* fix(release): enforce frozen validation contract

* fix(release): validate candidate identity in parent

* fix(ci): close release isolation gate findings
2026-08-20 04:32:38 -07:00
Ayaan Zaidi b7b7eec5ee feat(qa): run Mantis Telegram proof on local desktop (#126220)
Move Mantis Telegram Desktop proof from the remote AWS/Crabbox lane to a recorder-driven local Docker desktop. Keep proof scenarios agent-authored, cache trusted build outputs, and publish exact visible Telegram evidence without writing the QA bot token to artifacts.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-20 11:12:51 +00:00
Peter Steinberger 594d6d6e4d perf(test): route TUI PTY tests exclusively (#126624)
* perf(test): route TUI PTY tests exclusively

* test: isolate TUI PTY config ownership assertion
2026-08-20 03:10:24 -07:00
Peter Steinberger 6932897bf9 docs(plugins): show root CLI commands (#126621) 2026-08-20 02:42:05 -07:00
Jacqueline Henriksen b668a21f07 fix(models): classify catalog timeouts by identity (#124288)
Prevent provider-authored timeout-like errors from being silently downgraded as discovery deadlines. Keep prepared catalog reuse covered across Gateway/Telegram picker callbacks.

Co-authored-by: Jacqueline Henriksen <jjjhenriksen@gmail.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-20 15:08:45 +05:30
weiqinl bd6802ffb6 test(ui): make formatNextRun weekday assertion locale-portable (#125164)
The "includes weekday and relative time" test computed the expected
weekday with the ambient host locale (`toLocaleDateString(undefined, ...)`)
while `formatNextRun` formats the weekday through `i18n.getLocale()`
(default "en"). On hosts whose default locale is not English (e.g.
`LANG=zh_CN.UTF-8` -> "周一"), the two diverge and the slice assertion
fails: `expected 'Mon,' to be '周一, '`.

Mirror `i18n.getLocale()` in the test so the expected weekday always
matches the locale the presenter uses. No production behavior change.

Verified: passes under `LANG=zh_CN.UTF-8` and `LANG=C` via
`pnpm test:unit:fast -- test/ui.presenter-next-run.test.ts`.

AI-assisted.
2026-08-20 01:25:28 -07:00
weiqinl a29d8c8803 test(unit-fast): isolate computer-tool.test-helpers consumers (#125167)
* test(unit-fast): isolate computer-tool.test-helpers consumers

The unit-fast shard classifier recognizes "stateful" test helpers
(those whose source trips a disqualifying pattern such as `vi.mock(`
or top-level dynamic `import`) via `statefulTestHelperImportPattern`,
so that tests importing them are routed to the isolated pool instead
of the shared `isolate:false` pool.

`computer-tool.test-helpers` was missing from that pattern, even though
the helper sets up `vi.mock("./gateway.js")`, `vi.mock("./nodes-utils.js")`
and uses top-level `await import(...)` — i.e. it is stateful. Its
consumers (`computer-tool.v2/schema/context.test.ts`) therefore
classified with empty `reasons`, fell into the `isolate:false` pool,
and relied on `vi.mock` against a shared module registry. When another
test file loaded the real `./gateway.js` / `./nodes-utils.js` in the
same worker first, the mock was bypassed and `computer-tool.v2.test.ts`
threw `GatewayCredentialsRequiredError: gateway node.list requires
credentials` for all 8 of its cases — while passing in isolation.

Add `computer-tool\.test-helpers` to the pattern (mirroring the existing
`message-action-runner\.test-helpers` entry) so consumers are routed to
the isolated pool where the mock is honored.

Verified on `main` (`83d279a`), Node 24.15.0:
- Before: `pnpm test:unit:fast` -> 8 failures in
  `src/agents/tools/computer-tool.v2.test.ts` (`GatewayCredentialsRequiredError`);
  the file passes alone (8/8).
- After: the three consumers classify `inIsolated=true`; `pnpm test:unit:fast`
  no longer runs them in the shared pool; the suite's only remaining
  failures are unrelated (`test/ui.presenter-next-run.test.ts` locale,
  `test/scripts/resolve-openclaw-ref.test.ts` git version) and the
  computer-tool suite passes (16/16) under `vitest --isolate`.

AI-assisted.

* test(unit-fast): cover computer-tool helper isolation

Punchcard-Session: ember-willow-valley-9r

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-20 01:17:25 -07:00
Peter Steinberger 10e707435a fix(mcp): repair channel lifecycle ownership (#126592)
Restore persisted channel media, cancellation cleanup, retryable permission delivery, bounded-event gap recovery, complete shutdown, and actionable Gateway startup diagnostics.
2026-08-20 01:14:43 -07:00
Peter Steinberger ab7fc490d6 fix(package): clean dist before root packaging (#126577) 2026-08-20 01:13:06 -07:00
Peter Steinberger 980b07f4a2 refactor(agents): replace tool-failure warning heuristics with a two-rule policy (#126542)
* refactor(agents): reduce tool failure warnings to two rules

* test(agents): remove obsolete tool recovery receipt proof

* refactor(agents): drop unused meta param from buildToolMutationState

* test(agents): remove stale tool warning assertions

* test: export runtime source snapshot from closed runtime-snapshot mocks

Heal the main breakage introduced by 9441e3fe6e / #126531, which added a runtime source-snapshot read to provider model route resolution. Closed Vitest factories now return null for that source snapshot, preserving their pre-projection behavior.

* test(gateway): make compaction read-error faults order-immune

Generation-2 CI failure in run 32342180898, job 96343444772 showed that the mock factory initialized while shared gateway-server importers remained bound to the real transcript reader.

The dedicated isolated project fixes normal shards. Complete its ownership by adding it to the root project matrix and excluding the test from the non-isolated OPENCLAW_GATEWAY_PROJECT_SHARDS=0 fallback.
2026-08-20 01:11:05 -07:00
Peter Steinberger 49cd6009cc test(gateway): give module-mocking Gateway tests a private module graph
`server.sessions.compaction-read-errors` mocks
`config/sessions/session-accessor.sqlite-read.js`, but production reaches
`loadTranscriptEvents` through re-exports: `server-methods/sessions-compact.ts`
imports it from the `session-accessor.js` barrel and
`preflightSessionTranscriptForManualCompact` imports it from the leaf. The
`gateway-server` project is `isolate: false`, so when a neighbour has already
evaluated those importers they stay bound to the real implementation and the
mock never fires -- the injected read error simply does not happen and all three
tests fail with `expected true to be false`, reading like a product regression.

Trigger: 33744584f3 added `server.chat-metadata-boundary.test.ts`, which boots
a full non-minimal Gateway in `beforeAll` and lands immediately before this file
in the shard. Main has gone red on it repeatedly since (32338154086, 32339521003,
32339928383, 32341300955, 32341946296); e294c154a6 fixed only the sibling
symptom where the factory had not run yet.

Route the file to a new `gateway-server-isolated` project instead, mirroring
`unit-fast-isolated` -- whose comment describes this exact hazard. A fresh graph
per file makes both symptoms structurally impossible rather than order-dependent.
The list is explicit so the reason travels with the file.

Not reproducible on macOS: the exact 24-file stripe in CI's own order, and the
triggering pair three times, are green locally every time.
2026-08-20 00:16:43 -07:00
Peter Steinberger 9cf5859d57 ci: refit hybrid compact hints from measured Blacksmith runs
Hybrid runs attempt 1 on Blacksmith but packs bins with the GitHub-calibrated
`COMPACT_GITHUB_GROUP_SECONDS_HINTS`. Measured across four healthy main runs
(32316204633, 32317242374, 32318250756, 32320063231), normalized per run by
that run's own VM speed, those hints land at 0.64x on Blacksmith across 100
groups -- so nearly everything is over-predicted and only five groups overshoot:

  core-runtime-infra-process   x2.03   34.5s vs 17
  agentic-cli-process          x1.64  109.8s vs 67
  agentic-agents-core-models   x1.45   81.3s vs 56
  core-runtime-cron-service    x1.35  107.8s vs 80
  agentic-commands-doctor      x1.30   82.9s vs 64

Those five are exactly the ones that matter: an under-predicted group leaves
budget for partners, so the packer piles work onto the bins that already set the
wall. Replaying the plan against the measured per-shard medians, the tallest bin
drops from 164s to 141s of test time and the runner-up from 151s to 140s, for one
extra job (47 -> 48 on push). The plateau is flat and queue time is ~2s, so the
extra job is free and the 23s comes straight off the critical path.

Guard counts move with the plan; they exist to make repacking deliberate, and the
150s non-dist ceiling and 140s max are unchanged.
2026-08-19 23:59:18 -07:00
Josh Avant 29cfd195d1 fix(memory): honor turn tool policy during automatic recall (#126482)
* fix(memory): bind prompt recall to turn tool policy

* test(plugins): update hook contract inventory

* fix(memory): bind recall to active run lifecycle

* docs(plugins): define prompt authority contract

* test(plugins): track prompt authority type guard

* fix(plugins): revalidate prompt authority per handler
2026-08-19 19:21:51 -07:00
Peter Steinberger 53fb8220ce fix(package): bound installed worker artifact parsing (#126491)
* fix(package): bound worker artifact parsing

Keep canonical self-contained worker bundles above the generic dist-file cap while enforcing an 80 MiB limit before installed-package verification reads or parses them.

* fix(package): bound every verifier read

Route the context-engine and dependency scans through one root-dist pre-read policy, exclude plugin-owned extension assets from the root marker contract, and cover the public verifier flow.
2026-08-19 18:47:38 -07:00
Peter Steinberger 0a86702241 feat(github): authorize agent identities from Settings (#126474)
* feat(github): add device authorization lifecycle

* fix(github): harden device authorization lifecycle

* fix(github): refresh native tool display snapshot

* fix(github): refresh config and UI baselines

* refactor(github): break OAuth identity import cycle

* test: make gateway retry deadline assertion scheduler-safe
2026-08-19 17:41:58 -07:00
Peter Steinberger 177828aa75 fix(cron): honor failure alert thresholds (#126483)
* fix(cron): honor failure alert thresholds

Per-run Gateway announcements bypassed threshold, cooldown, and opt-out policy. Make the scheduler the sole owner of failure notification decisions.

* fix(cron): preserve safe failure details

Keep trusted failure detail proof on the scheduler-authorized transport and remove the obsolete Gateway event-context handoff after the ownership consolidation.

* test(cron): assert alternate failure route isolation
2026-08-19 17:25:14 -07:00
Peter Steinberger 13fd888281 fix(tui): stop auth child on exit (#126476) 2026-08-19 16:57:28 -07:00
Peter Steinberger 88345d984b fix(package): restore root tarball budget (#126448)
Exclude maintainer-only docs, shrink the Crabbox worker wallpaper, and keep installed dependency scans compatible with canonical self-contained worker bundles without changing release budgets.
2026-08-19 16:07:15 -07:00
Josh Avant 9a9e688e99 fix(tailscale): preserve privileged route conflicts (#126449) 2026-08-19 16:03:56 -07:00
Peter Steinberger 7769cb6466 fix(cli): accept daemon --json before subcommands (#126447)
* fix(cli): accept daemon json before subcommands

* test(cli): update doctor public-surface fixture

* test(cli): classify daemon parent JSON output
2026-08-19 15:17:21 -07:00
Vincent Koc ee6cab4a2e fix(e2e): use packaged CLI in git fixtures (#126383) 2026-08-20 05:00:25 +08:00
Peter Steinberger 14c02a43ab fix(mcp): stop revoked App actions after catalog waits (#126415)
* fix(mcp): revalidate app grants after catalog work

* test(mcp): track grant proof temp state

* test(browser): use canonical graceful stop budget
2026-08-19 13:35:01 -07:00
Peter Steinberger db533799d5 fix(qa): reject incomplete evidence runs (#126407)
* fix(qa): enforce terminal evidence lifecycle

* test(qa): mark CPU fixture summary completed

* fix(qa): fence calls after flow timeout
2026-08-19 13:30:02 -07:00
Samuel Judson 24a1139188 fix: move raw call transcripts from system to user prompt to protect provenance (#123846)
* Move raw transcript from system to user prompt to protect provenance.

* Type fix.

* fix(voice-call): harden transcript context handling

* fix(voice-call): initialize inbound Twilio control state

* test(voice-call): align runtime coordinator fixture

---------

Co-authored-by: joshavant <830519+joshavant@users.noreply.github.com>
2026-08-19 13:07:59 -07:00