Commit Graph

80082 Commits

Author SHA1 Message Date
Peter Steinberger 49ff3e5b69 fix(validation): preserve wave 2 boundary compatibility (#125031) 2026-08-16 22:36:06 -07:00
Peter Steinberger bb5c27bf76 refactor(tts): derive runtime types from implementation (#125055) 2026-08-16 22:35:09 -07:00
Peter Steinberger 2af054fb9a fix(qa): prove repeated gateway restart recovery (#125052) 2026-08-16 22:34:55 -07:00
Peter Steinberger 0c4e2f6681 fix(onboard): open browser handoff in display-less WSL (#124704)
* fix(onboard): use canonical browser open support

Amp-Thread-ID: https://ampcode.com/threads/T-01a00ae0-190d-718b-8a76-b75f3e8d1fae

* test(onboard): type WSL browser detector mock

Amp-Thread-ID: https://ampcode.com/threads/T-01a00ae0-190d-718b-8a76-b75f3e8d1fae

* fix(onboard): preserve WSL detection cache

Amp-Thread-ID: https://ampcode.com/threads/T-01a00ae0-190d-718b-8a76-b75f3e8d1fae

* fix(onboard): remove stale browser platform probe

Amp-Thread-ID: https://ampcode.com/threads/T-01a00ae0-190d-718b-8a76-b75f3e8d1fae

* test(onboard): tolerate injected browser probes

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-16 22:33:46 -07:00
Peter Steinberger 816ae22921 fix(ui): recover channel setup after status check failure (#124680)
* fix(ui): recover Custodian channel status

Amp-Thread-ID: https://ampcode.com/threads/T-01a00ae0-190d-718b-8a76-b75f3e8d1fae

* fix(ui): invalidate channel status on reconnect

Amp-Thread-ID: https://ampcode.com/threads/T-01a00ae0-190d-718b-8a76-b75f3e8d1fae

* fix(ui): retain channel retry feedback

Amp-Thread-ID: https://ampcode.com/threads/T-01a00ae0-190d-718b-8a76-b75f3e8d1fae

* chore(ci): refresh channel retry validation

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-16 22:30:09 -07:00
Peter Steinberger fecb223e5b fix(plugins): align registry freshness inspection (#125048) 2026-08-16 22:29:55 -07:00
Peter Steinberger e3595c50ad fix(plugins): failed plugins retain diagnostics without activating capabilities (#125046)
* fix(plugins): make loader failures atomic

* style(plugins): avoid rollback key shadow
2026-08-16 22:29:26 -07:00
Peter Steinberger b3ab276077 fix: steering near run completion receives a response (#125038)
* fix(agent): consume late steering before terminalizing

* test(gateway): split provider bootstrap coverage
2026-08-16 22:19:27 -07:00
Peter Steinberger a2b5345b2b docs(agents): require explicit advisory authorization 2026-08-16 22:17:03 -07:00
Sarah Fortune fc677bcc3c fix(slack): honor bot policy for Enterprise Grid messages (#125009)
* fix(slack): honor bot policy for Enterprise messages

* fix(slack): route Enterprise message subtypes

* test(slack): fix Enterprise system event labels

---------

Co-authored-by: Sarah Fortune <sarah.fortune@gmail.com>
2026-08-16 22:13:51 -07:00
Peter Steinberger 7393a1f64d fix(config): record why best-effort reads fell back (#125010)
readSourceConfigBestEffortFromContext collapsed three distinct
failures — parse error, $include resolution failure, any other read
error — into {} or a root-only config with zero recorded fact. A
corrupt config (or an update.channel living in an unresolvable
$include) silently flipped the update-channel decision and doctor-lint
input to defaults, indistinguishable from a missing file. The main
snapshot path logs an actionable message for the same conditions.

Root cause: 'best effort' legitimized the fallback value AND the
silence. Each degradation branch now warns once with the config path
and cause; the fallback values are unchanged.

Regression: unparseable config yields {} plus a recorded
'best-effort read ignored unparseable config' warning — fails pre-fix
(silent).
2026-08-16 22:12:52 -07:00
Peter Steinberger 4b2aa935f3 fix(android): restore 11sp caption density (#125053) 2026-08-16 22:12:23 -07:00
Peter Steinberger 04fd260b4c refactor(channels): rename progress work counter (#125011) 2026-08-16 22:11:21 -07:00
Peter Steinberger d0b1b6d0ec fix(workboard): keep cards synced when dashboard is closed (#125023)
* fix(workboard): own linked-session lifecycle sync gateway-side

* test(workboard): align lifecycle proof with gateway ownership
2026-08-16 22:02:43 -07:00
Peter Steinberger 49b4775f30 refactor(security): consolidate plugin JSON body reading onto canonical bounded reader (#124944)
* fix(security): harden canonical bounded JSON body reading

* refactor(admin): use canonical bounded JSON body reader

* refactor(telegram): use canonical bounded JSON body reader

The assertion-safety baseline prune for extensions/telegram/src/miniapp/routes.ts (2 to 1) is explicitly approved.

* test(security): cover canonical JSON body migrations

* refactor(plugin-sdk): name response-first body profile

* fix(telegram): flush miniapp body-limit responses before close
2026-08-16 22:01:34 -07:00
Peter Steinberger 1606969dca fix(ui): refresh managed sessions on terminal events (#125040) 2026-08-16 22:01:20 -07:00
Peter Steinberger 0c1217c7b0 fix(ui): only flag delivery problems in session rows (#125003)
* fix(ui): only flag failed messages in session rows

* fix(ui): include uncertain deliveries in sidebar attention
2026-08-16 21:58:57 -07:00
Peter Steinberger c8aed9b1ef fix(gateway): source agent provenance from roster owner (#125032) 2026-08-16 21:58:33 -07:00
Peter Steinberger 559ee3a209 fix: preserve Unicode sessions during SQLite upgrade (#124951)
* fix(sessions): preserve unicode IDs during migration

Amp-Thread-ID: https://ampcode.com/threads/T-01a00a6a-b64e-74a5-8b15-2d3b966a468d

* fix(sessions): bound topic transcript filenames

Amp-Thread-ID: https://ampcode.com/threads/T-01a00a6a-b64e-74a5-8b15-2d3b966a468d

* fix(sessions): canonicalize Unicode IDs

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-16 21:58:04 -07:00
Peter Steinberger 3089decd63 fix(gateway): deduplicate Claude CLI replies after reload (#125030) 2026-08-16 21:57:52 -07:00
Peter Steinberger 4142af3e6c fix(test): ignore stale extension directories in labeler coverage (#125022) 2026-08-16 21:53:29 -07:00
Peter Steinberger 3b4297b6a7 perf(test): consolidate Control UI package fixtures (#125051) 2026-08-16 21:53:27 -07:00
Peter Steinberger 21a38851fb test(gateway): split provider-provisioning replay coverage (#125047)
Direct commit 4d64889290 pushed provider-provisioning.test.ts to 1091
lines, past the 1000-line max-lines cap, breaking check-lint-core-2 on
main. Move the replay/restart-adoption/serialization tests into
provider-provisioning.replay.test.ts (same suite setup via
service.test-support), matching the repo's split-not-suppress policy.
2026-08-16 21:53:15 -07:00
Peter Steinberger d92b91ae70 fix(matrix): preserve thread binding activity on shutdown (#125039)
* fix(matrix): await binding flush on shutdown

Amp-Thread-ID: https://ampcode.com/threads/T-01a00b6b-e4e9-74af-bb31-30363fae6c89

* test(gateway): split provisioning intent coverage

Amp-Thread-ID: https://ampcode.com/threads/T-01a00b6b-e4e9-74af-bb31-30363fae6c89

* chore: drop superseded CI unblock

Amp-Thread-ID: https://ampcode.com/threads/T-01a00b6b-e4e9-74af-bb31-30363fae6c89

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-16 21:52:30 -07:00
Peter Steinberger e6a14c0855 test: replace assertion chains with typed fixture builders — wave 3 (#124986)
* test: replace assertion chains with typed fixture builders — wave 3

* test: keep policy fixture type local

* test: type gateway context fixture

* test: type systemd stream fixture

* test: type chat pane fixture overrides
2026-08-16 21:49:21 -07:00
Patrick Erichsen 9e4ba15f4c improve: detect Claude CLI prompt cache regressions (#124988)
* test(gateway): cover Claude CLI prompt cache reuse

* test(gateway): validate Claude CLI cache across processes

* test(gateway): perturb Claude native cache context

* test(gateway): calibrate Claude CLI cache threshold

* docs(testing): align Claude cache threshold

* test(gateway): preserve config literal types

* test(gateway): split node admission coverage
2026-08-16 21:48:23 -07:00
Peter Steinberger f48d9b1c4b fix(agents): flush memory after CLI and gateway turns (#124964)
* fix(agents): run memory flush for agent commands

* test(agents): isolate memory flush in model switch tests

* fix(agents): require persisted CLI transcript before flush

* fix(agents): fence memory maintenance authority

* fix(agents): compact post-flush session successor

* test(agents): consolidate memory-flush rotation coverage

* fix(agents): preserve memory flush auth profile

* fix(agents): fence memory flush startup

* test(gateway): split node provisioning coverage
2026-08-16 21:41:05 -07:00
Peter Steinberger d095113698 refactor(android): collapse the chat's second color palette into ClawTheme (#125020)
* refactor(android): consolidate chat palette

* refactor(android): fold the font family into ClawTheme
2026-08-16 21:31:27 -07:00
Josh Avant f7a8638282 feat(audit): explain outbound message delivery (#123709)
* feat(audit): explain outbound message delivery

* fix(audit): record early message policy denials

* refactor(audit): split message delivery readers

* test(outbound): cover delivery audit lifecycle

* fix(audit): preserve message progress across downgrade

* fix(audit): keep progress out of activity protocol

* docs(audit): keep activity outcomes terminal-only

* fix(audit): bound merged delivery paging

* fix(audit): trust decision channel references

* fix(audit): keep retention constant private

* fix(audit): record broadcast target denials

* fix(audit): distinguish broadcast denial receipts

* test(qa): enforce message delivery receipt proof

* fix(audit): integrate C04 with schema v9 owners

* chore(audit): satisfy assertion safety gate

* refactor(agents): split explicit message target guard

* test(audit): materialize pinned reader in shallow CI

* test(qa): poll terminal audit persistence

* fix(delivery): defer audit terminal to recovery

* test(qa): isolate message delivery restart proof

* test(qa): keep gateway restart config canonical

* test(qa): exclude unrelated restart plugins

* test(qa): remove unused restart plugins

* test(qa): disable automatic memory plugin

* test(qa): converge replacement gateway startup

* fix(plugins): stabilize registry fingerprints

* fix(plugins): use public normalization export

* test(plugins): keep fingerprint fixture immutable

* fix(audit): bind delivery receipts to exact executions

* chore(audit): keep terminal binding helper private

* test(reply): cover unbound admission callbacks

* docs(agents): preserve durable delivery ownership
2026-08-16 21:26:27 -07:00
Peter Steinberger 4d64889290 test(gateway): bind node admission to worker claim 2026-08-16 21:21:52 -07:00
Peter Steinberger 0d78854415 fix(install): reject invalid PowerShell installer options (#124882)
* fix(install): reject invalid PowerShell installer options

Bind installer parameters strictly so unknown switches and positional arguments cannot enter the mutating installer body. Validate environment options before initialization, add explicit help, and gate website publication on Windows PowerShell 5.1 and pwsh probes.

Amp-Thread-ID: https://ampcode.com/threads/T-01a00ae0-190d-718b-8a76-b75f3e8d1fae

* test(installer): validate strict PowerShell options

Amp-Thread-ID: https://ampcode.com/threads/T-01a00ae0-190d-718b-8a76-b75f3e8d1fae

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-16 21:16:40 -07:00
Peter Steinberger 4f715eb37b docs: align classic onboarding setup flow (#124712)
* docs(onboarding): align classic setup flow

Amp-Thread-ID: https://ampcode.com/threads/T-01a00ae0-190d-718b-8a76-b75f3e8d1fae

* docs(onboard): clarify import reset incompatibility

Amp-Thread-ID: https://ampcode.com/threads/T-01a00ae0-190d-718b-8a76-b75f3e8d1fae

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-16 21:15:39 -07:00
Peter Steinberger 3bf3acbee5 fix(ui): preserve steer order and simplify composer ownership (#124915)
* refactor(ui): simplify composer steer ownership

* fix(ui): preserve target order for landed steers
2026-08-16 21:12:56 -07:00
Pavan Kumar Gondhi 6e026c2fe3 fix(gateway): reject unattributable loopback proxy traffic [AI] (#119950)
* fix(gateway): bind auth limits to ingress attribution

* fix(gateway): close remaining ingress auth gaps

* fix(gateway): carry attribution into new ingress paths

* fix(gateway): close ingress ownership gaps

* fix(gateway): complete proxy ingress hardening

* fix(gateway): stabilize managed Tailscale ingress

* fix(gateway): make Tailscale cleanup ownership-safe

Refuse reset-on-exit publication until Tailscale exposes an atomic owner-bound cleanup operation, and migrate legacy configs with Doctor.

* fix(gateway): finish ingress ownership repair

* fix(gateway): own managed Tailscale route lifetime

Run managed Serve and Funnel routes as foreground claims tied to the Gateway lifecycle. Retire named Service config through Doctor because Tailscale Services cannot run in foreground mode.

Co-authored-by: Pavan Kumar Gondhi <pavangondhi@gmail.com>

* fix(gateway): align Tailscale consumers and build guards

Remove the retired named-service config from Telegram Mini App URL resolution and register the lifecycle worker as an explicit production entry.

Co-authored-by: Pavan Kumar Gondhi <pavangondhi@gmail.com>

* fix(gateway): preserve retired Tailscale inputs

Keep Funnel enabled when removing an ignored named-Service setting and accept the legacy positive reset flag as a no-op now that managed routes always follow Gateway lifetime.

Co-authored-by: Pavan Kumar Gondhi <pavangondhi@gmail.com>

* fix(gateway): preserve Tailscale route diagnostics

Prefer the actionable foreground CLI failure captured during timeout cleanup, and cover the original delayed-failure ordering.

Co-authored-by: Pavan Kumar Gondhi <pavangondhi@gmail.com>

* fix(gateway): reconcile Tailscale ingress with main

Preserve current ingress ownership contracts after the rebase, retire the obsolete device-auth migration check, validate route-owner IPC, and move Tailscale auth coverage onto the managed listener.

Co-authored-by: Pavan Kumar Gondhi <pavangondhi@gmail.com>

* fix(gateway): finish ingress rebase coverage

Unify the rebased net imports and let module-reset WebSocket tests prepare attribution through the same fresh module instance as the handler.

Co-authored-by: Pavan Kumar Gondhi <pavangondhi@gmail.com>

* test(gateway): align run-loop server fixture

---------

Co-authored-by: joshavant <830519+joshavant@users.noreply.github.com>
2026-08-16 21:01:20 -07:00
Peter Steinberger c94b673e46 fix(ui): show Review immediately when opening files (#124990)
* fix(ui): show review before file content loads

* fix(ui): preserve review while disconnected
2026-08-16 21:00:20 -07:00
Peter Steinberger bf9b25ab7e fix(gateway): prevent control-plane polling stalls (#124891)
* fix(gateway): avoid repeated control-plane scans

* fix(tooling): allow concurrent worktree validation

* fix(ci): refresh protocol and runner inputs

* perf(ui): defer hidden session refreshes

* fix(ui): resolve session refresh lint failure

* fix(update): preserve pre-cache update channel

* fix(update): normalize cached update channel

* fix(gateway): lifecycle-cache update install identity

* fix(ui): preserve manual history retry after layout scroll

* test(codex): repair side-question tool schema fixture
2026-08-16 20:58:27 -07:00
ClawSweeper d24cb13320 fix(ui): inset limited access badge from chat edge (#125012) 2026-08-16 20:57:15 -07:00
Peter Steinberger 77ececee54 fix(ui): stop duplicate Sessions page queries (#125018)
Make the Sessions route and page share the managed session-list owner so startup hydration, reconnects, filters, and mutations cannot schedule duplicate raw roster requests. Preserve last-good rows and retire stale query epochs.
2026-08-16 20:54:40 -07:00
Peter Steinberger dd1ee7b375 fix(codex): report dynamic tool audit starts once (#124976)
* fix(codex): dedupe dynamic tool audit starts

* fix(codex): preserve eager dynamic tool audit starts

* test(codex): make audit timing proof nonblocking

* test(codex): consolidate dynamic audit lifecycle proof

* test(codex): declare side-question tool arguments
2026-08-16 20:51:25 -07:00
Peter Steinberger 5ac88c5f20 test(gateway): model exact worker claim lifecycle 2026-08-16 20:44:04 -07:00
Peter Steinberger 81c203ade0 refactor(gateway): carry exact worker claims 2026-08-16 20:44:03 -07:00
Peter Steinberger a0278afb7b fix(gateway): bind worker authority to exact lifecycle claims 2026-08-16 20:44:00 -07:00
chelsealong e128a0459b fix(agents): preserve resolved agentId in model workspace resolution (#124954)
* fix(agents): preserve resolved agentId in model workspace resolution

resolveModelWorkspaceDir re-resolved a default agent instead of reusing
the agentId the caller already authorized, so any plugin call to
runtime.llm.complete with an explicit agentId threw
AgentSelectionRequiredError on multi-agent configs. Thread the known
agentId through resolveModel/resolveModelAsync into workspace
derivation so it is only re-derived when the caller has none.

Fixes #124822

* fix(agents): forward agentId through route-materialization re-resolution

The route-materialization resolver call in prepareSimpleCompletionModel
re-resolved the model without the caller's agentId, so a multi-agent
plugin completion that switches OpenAI routes still fell back to
resolveDefaultAgentId and threw. Forward params.agentId on this call
too, matching the first resolution.
2026-08-16 23:42:41 -04:00
Peter Steinberger 992a88b728 docs: cover groupScope in faq and security guide (#125006) 2026-08-16 20:28:27 -07:00
Peter Steinberger 2c4651538c improve(android): drop the role title on every chat message (#124985)
* fix(android): let chat bubbles carry message roles

* test(android): prove chat speaker accessibility

* chore(android): refresh native i18n inventory

* ci: shrink assertion safety baseline

* fix(android): satisfy Compose modifier lint
2026-08-16 20:21:59 -07:00
Peter Steinberger 782d52c8b8 perf(ci): cache the Node toolchain instead of refetching it every job
Blacksmith's image tracks an older runner-images snapshot. Measured on a leased
box 2026-08-16, its toolcache holds Node 20.20.0, 22.22.0 and 24.13.0 while this
repo's engines floor is >=22.22.3 and >=24.15.0 -- short by three and two
patches. Every candidate is rejected, so all 306 of 306 sampled jobs fell
through to a nodejs.org download. GitHub-hosted runners carry 24.19.0 and
resolve from the toolcache in about a second, which is why only Blacksmith pays.

Normally that download is 2.6s (p99 3.3s), but ~46 jobs fetch the same 50 MB
simultaneously and the mirror throttles: three of 53 sampled runs had setup-node
medians of 44-93s with maxes to 139s, and because every job pays at once it
lands whole on the wall -- those runs went ~210s to 325s.

Keep the payload in the Actions cache, which Blacksmith serves from its
colocated backend. Measured on Blacksmith: cold 1605ms, warm 77ms.

Restores are prefix-keyed and the save carries the resolved patch. An exact key
would be worse than nothing: cache entries are immutable and an exact hit
suppresses the post-job save, so a floating `24.x` key would pin the first Node
it ever saw and, once the floor advanced past it, every job would restore the
rejected payload and re-download forever. Keying the save on the installed
version lets a newer resolve publish a new entry that later prefix restores
pick up.

A rejected payload is pruned before the replacement installs, because the entry
is saved wholesale and a leftover would ride along in every future save.
Windows keeps its existing path. Proven on Blacksmith across cold, warm, stale
and truncated-binary cases; both guards are mutation-checked.

This stays useful even if Blacksmith refreshes their image: the floor moves
independently of the snapshot, so the gap recurs. The image refresh is still
the better fix and is worth asking them for.
2026-08-16 20:18:41 -07:00
Patrick Erichsen 305e38f5d9 fix(release): allow beta Docker backfills (#124999) 2026-08-16 20:16:40 -07:00
Peter Steinberger d64c5161e2 docs(cron): recommend lighter models for routine automation jobs (#125000)
The cron model picker help and the automations docs now say what
operators otherwise learn by surprise on the bill: summaries, triage,
and classification jobs run well on a lighter model, and --fallbacks
covers escalation. Copy-only change; pnpm ui:i18n:verify green, no
baseline drift.
2026-08-16 20:15:31 -07:00
Peter Steinberger fdaaa1ba53 refactor(validation): consolidate boundary guards into schemas — wave 2 (#124961) 2026-08-16 20:13:55 -07:00
Peter Steinberger b555a32ee9 fix(openrouter): keep OAuth loopback open after invalid callbacks (#124922)
Amp-Thread-ID: https://ampcode.com/threads/T-01a00ae0-190d-718b-8a76-b75f3e8d1fae

Co-authored-by: Amp <amp@ampcode.com>
2026-08-16 20:11:04 -07:00