Commit Graph

79149 Commits

Author SHA1 Message Date
ClawSweeper 0b0fe6ecc0 fix(gateway): retain admission across setup sessions (#123418)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Colin Johnson <colin@solvely.net>
2026-08-13 23:30:24 -07:00
Peter Steinberger 1647027880 fix: isolate collected turns by model route 2026-08-13 23:28:53 -07:00
Peter Steinberger 42b74b2978 fix: restrict pending input to route-only changes 2026-08-13 23:28:53 -07:00
Peter Steinberger 129c06d811 fix: bind steering authority to model route 2026-08-13 23:28:53 -07:00
Peter Steinberger d183d06738 fix(codex): deny native tool feature pins 2026-08-13 23:28:53 -07:00
Peter Steinberger 54cf346abb fix: preserve pending input across authority changes 2026-08-13 23:28:53 -07:00
Peter Steinberger 1bb20fb16a fix(codex): bind steering to tool authority 2026-08-13 23:28:53 -07:00
Peter Steinberger 0fa354827f fix(copilot): bind active runs to host tool authority 2026-08-13 23:28:53 -07:00
Peter Steinberger 18b4cc94ff fix: drain authority-mismatched provided operations 2026-08-13 23:28:53 -07:00
Peter Steinberger b5809f5f44 fix: enforce native tool policy across harness lifecycles 2026-08-13 23:28:53 -07:00
Peter Steinberger 252bb545b4 fix(macos): keep background hosts out of GUI keychain (#123500)
Background-only Bridge and Mac-node launches keep GUI onboarding and saved Gateway-profile Keychain state cold while preserving environment/config-owned Gateway connectivity.
2026-08-13 23:28:26 -07:00
Peter Steinberger 8cfc415af4 fix(plugins): make setup registration atomic (#123506) 2026-08-13 23:27:57 -07:00
Ayaan Zaidi 14882ac44d fix(ci): prevent Telegram test watchdog stalls (#123514)
Bound Telegram extension tests to five files per Vitest process across explicit config, directory, and full-suite routes while preserving serial isolated execution.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-14 11:55:29 +05:30
Peter Steinberger e7a2d1758a fix: Control UI test lane fails at random on unrelated pull requests (#123512)
* fix(test): keep shared jsdom window in step with the per-file module reset

The non-isolated runner already resets the module graph after every test file,
so each file evaluates its own component classes. The jsdom window it shares
across the whole worker was never reset with it: every Control UI component
registers with `if (!customElements.get(tag))`, so the first file to import a
component owned that tag for the rest of the run and `document.createElement`
kept building elements closed over that file's module instances. Later files'
singletons, module mocks, and spies were never the ones production reached, so
assertions failed as "expected ... to be called once, but got 0 times" in
whichever files the size-based sequencer happened to place after a warming one.

Drop repo-owned tags with the graph they came from. Dependency packages are
externalized and register once per worker through native ESM, so their
definitions are attributed by define call site and kept.

The same window also carried mounted DOM forward, so helpers reading
`document.body.querySelector(...)` answered an earlier file's leaked dialog and
focus assertions read its stale activeElement. Clear the body with it;
`document.head` stays, since dependency styles cannot be replayed either.

* fix(test): keep the jsdom definition shape local to its module
2026-08-13 23:25:08 -07:00
Peter Steinberger 7cadfb0bd6 fix: speed up local node launches and isolate scratch state (#123503)
* perf(node-host): reuse advertised worker build identity

* fix(agents): keep default workspaces inside state dir

* fix(plugins): package llama.cpp private SSRF runtime

* fix(node-host): silence missing skills directory
2026-08-13 23:24:54 -07:00
Peter Steinberger 6bd21a1122 fix: make device onboarding and dispatch outcomes honest (#123501)
* fix(gateway): approve joined node surface

* fix(sessions): record offline device dispatches

* fix(sessions): reclaim failed worker placements

* fix(gateway): escalate session cwd scope

* fix(agent): honor recorded terminal outcomes
2026-08-13 22:55:09 -07:00
Ayaan Zaidi c6dbc96cbf fix(ui): drop empty sidebar session lead columns (#123505)
Reserved 16/20px indicator slots indented titles when there was no artwork.
2026-08-14 11:22:16 +05:30
Peter Steinberger 65fca84d7c fix(agents): keep compacted sessions recoverable across retries (#123484)
* fix(agents): harden session compaction recovery

* fix(agents): sanitize restored compaction replay
2026-08-13 22:48:18 -07:00
Peter Steinberger ee258beba6 fix(reef): diagnose relay protocol skew (#123498) 2026-08-13 22:47:53 -07:00
Peter Steinberger d9646ad5d5 test(cua-computer): freeze computer-use provider parity matrix fixtures (W0-FIX) (#123469)
* test(cua-computer): freeze provider parity fixtures

* test(cua-computer): keep parity fixture type aliases file-local until a consumer exists

* test(cua-computer): split parity fixtures under the line cap and fix strict test types
2026-08-13 22:42:46 -07:00
Peter Steinberger 1400049ae9 improve(ci): cut hosted test import time with warm caches (#123465)
* perf(ci): restore hosted test caches across lanes

* perf(ci): restore caches in remaining Vitest lanes
2026-08-13 22:41:27 -07:00
Peter Steinberger db4379bd2f fix(codex): refresh token snapshot after compaction (#123478) 2026-08-13 22:38:04 -07:00
Ayaan Zaidi 1425d944ca fix(ui): show Claude Code logo in mock Control UI sidebar (#123496)
The mock catalog used id claude-code, but the sidebar only brands registered plugin ids (claude).
2026-08-14 05:37:33 +00:00
Peter Steinberger 85edd7fdc1 fix: clear stale CLI bindings after manual compaction (#123486)
Co-authored-by: Ilya Kuprov <i.kuprov@soton.ac.uk>
2026-08-13 22:34:33 -07:00
Peter Steinberger 1ea1499107 perf(test): consolidate channel artifact parity (#123480) 2026-08-13 22:25:39 -07:00
Josh Avant 49275b8f4b fix(ui): stop agent roster retry storms (#123483) 2026-08-14 00:24:48 -05:00
Peter Steinberger f530b7042b test(agents): remove d60a98e payload timing race
The diagnostics change only reordered the large shard; it exposed a pre-existing one-second timeout around lazy Responses transport initialization. Fail from the stream's terminal result instead, and pre-abort egress so payload serialization stays a strict offline contract.
2026-08-13 22:23:33 -07:00
Peter Steinberger c636cf559a fix(agents): scope dormant model catalog reads (#123473) 2026-08-13 22:13:19 -07:00
Peter Steinberger 2b61dc5429 fix(mobile): embedded Control UI follows the app's dark or light appearance (#123408)
* fix(mobile): sync Control UI webview appearance

* docs(android): explain why an appearance flip rebuilds the Control UI webview
2026-08-13 22:05:55 -07:00
Peter Steinberger ebd0133be2 fix(agents): preserve Swarm collector errors (#123468) 2026-08-13 22:05:10 -07:00
Peter Steinberger 737982d5fe fix(macos): adopt Peekaboo 4.1 bridge contracts (#123420)
* feat(macos): adopt checked Peekaboo bridge runtime

* fix(macos): preserve bridge snapshot retention

* docs(macos): clarify bridge client identity

* fix(macos): retry transient timestamp signing

* build(macos): pin embedded Peekaboo runtime

* fix(macos): expose embedded bridge source identity

* test(macos): isolate gateway launch agent hooks

(cherry picked from commit 7da18c5fee43fed7e8dfa42c4851f99d035b2a36)

* test(macos): pin gateway command mode

* fix(macos): preserve Peekaboo bridge provenance
2026-08-13 22:03:47 -07:00
Peter Steinberger 7026cf2f21 fix(delivery): bound failed-row retention lifecycle (#123410) 2026-08-13 22:03:33 -07:00
Peter Steinberger 9122db3463 fix(agent-core): preserve file provenance across compaction (#123467) 2026-08-13 21:59:32 -07:00
Peter Steinberger 3e6f08eab9 fix: message send works after multi-agent ownership migration (#123450)
* fix: preserve message owner after config migration

* fix: resolve bootstrap owner from config facade

* fix: resolve default owner from effective config

* fix: honor configured system owner for message sends
2026-08-13 21:57:27 -07:00
Peter Steinberger 71ea4e3838 fix(agents): preserve native CLI compaction bindings (#123466) 2026-08-13 21:55:36 -07:00
Peter Steinberger d60a98ec87 fix(diagnostics): suppress startup-only heartbeat delay warnings (#123461)
* fix(diagnostics): suppress startup heartbeat delay warning

* chore: leave release changelog generation to release tooling
2026-08-13 21:42:11 -07:00
Josh Avant 9496a4b199 fix(ui): scope model reads to selected agent (#123415)
* fix(ui): scope model reads to selected agent

* test(ui): align selected-agent diagnostics coverage

* test(ui): scope debug diagnostics expectation

* fix(ui): route model reads through canonical owners

* refactor(ui): narrow model ownership repair
2026-08-13 23:40:34 -05:00
Peter Steinberger 928942d48d feat(sessions): legacy-main session migration engine (#123424)
* feat(sessions): add legacy main migration engine

* fix(sessions): keep migration types internal

* fix(sessions): harden legacy main migration convergence

* fix(sessions): prefer stale migration claims over lock errors

* fix(sessions): keep unresolved owner notices nonblocking
2026-08-13 21:33:37 -07:00
Peter Steinberger d540905f56 fix: terminals and model setup fail in explicit-agent fleets (#123429)
* fix(gateway): preserve explicit setup owners

* fix(gateway): complete explicit setup owner coverage
2026-08-13 21:32:41 -07:00
Peter Steinberger e7528c6d91 fix(gateway): make the node worker deadline the sole expiry authority (#123462)
The node launch adapter armed a per-RPC abort timer for every invocation, even
when the RPC budget was clamped to the remaining deadline. Both timers then
expired at the same instant, so which one fired first decided whether the
adapter saw a terminal deadline or a retryable RPC timeout. On the retryable
branch the cancellation loop funded another cancel dispatch out of a
sub-millisecond residue, producing a second doomed RPC and a flaky
"reports unknown cancellation outcome after a hard cancellation deadline"
failure under CI load.

The per-RPC timer now arms only when its budget genuinely binds before the
deadline; otherwise the deadline signal alone governs the RPC. RPC-timeout
retries are unchanged where the RPC budget is the shorter bound.
2026-08-13 21:30:00 -07:00
Peter Steinberger 25d4807b38 feat(anthropic): opt-in server-side compaction (compact-2026-01-12) (#123402)
* feat(anthropic): add server-side compaction replay

* docs(anthropic): document server compaction

* test(anthropic): harden compaction live probe

Fix the live fixture baseUrl (the SDK appends /v1 itself), fail fast on
errored turns instead of silently looping, assert request-side injection
before capture, and log per-turn stream outcomes for live debugging.

* test(anthropic): keep live settings type module-local

* refactor(agents): split transcript replay sanitizers

* test(anthropic): move compaction live probe into plugin tree

* refactor(anthropic): consolidate compaction replay duplication

* test(anthropic): align compaction threshold host coverage

* test(anthropic): fabricate checkpoints via capture tracker

Keeps captureAnthropicCompaction module-local; knip flags exports whose
only consumers are tests.
2026-08-13 21:28:19 -07:00
Peter Steinberger 92eed63f58 fix(ui): repair shared vitest lane cross-file leaks (#123453)
The non-isolated |ui| lane resets the module graph per test file while the
jsdom document and customElements registry persist for the whole worker.
Three producers leaked across that lifetime mismatch:

- github-link-hovercard-registration.ts: each file's module instance adds
  document-level bootstrap listeners; on the first real focusin every stale
  instance raced customElements.define -> unhandled NotSupportedError.
  Guard the define inside the single-flight loader.
- app-host.test.ts locale retry asserted through createElement, which serves
  a sibling graph's shell class bound to a different i18n singleton; construct
  ShellGatewayOwner directly so spy and callee share one graph.
- route-transition.test.ts assigned updateComplete over the real Lit outlet's
  getter-only accessor when a sibling had registered it; define an own data
  property instead (byte-identical to the hunk in PR #123347).

Adds a boundary regression test reproducing the duplicate-module-instance
order; it failed pre-fix with 2 registry defines and the NotSupportedError.
2026-08-13 21:12:57 -07:00
Peter Steinberger 63bc139872 fix(ui): unread badge latches un-clearable when the read patch is never sent (#123252)
sessions.patch resolves null without sending a request when the
connection scope cannot be captured, but the read-marker guard only
unlatched on promise rejection — so the once-per-episode latch stayed
set with no request in flight, and the unread badge stayed lit on the
open session until navigating away and back. Treat a null resolution
like a failure.
2026-08-13 21:12:21 -07:00
Peter Steinberger dc61fe5abe fix(ui): automations model picker renders raw "common.default" i18n key (+3 sibling call-site drifts) (#123238)
* fix(ui): automations model picker shows raw "common.default" key instead of Default

t("common.default") never existed in the catalog, so the picker's
inherit option rendered the literal key string in every locale
(introduced in #122964 when cron's free-text model input became the
shared model picker). Use the existing quickSettings.model.default key.

Same-sweep i18n call-site drift fixes:
- sessions view Reasoning override now routes through
  buildSessionLevelOptions like its Fast/Verbose siblings (adds the
  missing sessionsView.stream key; deletes the unlabeled duplicate
  withCurrentOption helper)
- activity entry summary collapses the placeholder-only
  activity.entrySummary pass-through (two silently dropped params) to
  the direct label call; orphan key removed
- group-delete confirm drops its dead {group} param (string has no
  placeholder since the reword)

* test(ui): compact multi-line expects in cron view test to stay under max-lines

The file sits at the 1000 counted-line cap on main; extracting named
intermediates keeps the new inherit-option regression net-neutral.
2026-08-13 21:10:32 -07:00
Peter Steinberger f820897670 fix(ui): typing a decimal point into numeric config fields deletes the stored value (#123210)
* fix(ui): typing a decimal point into numeric config fields no longer deletes the stored value

For <input type=number>, partial numeric text ("0.", "-", "1e")
reports value === "" with validity.badInput. The input handlers
treated that as an intentional clear: they committed undefined, the
800ms autosave persisted the removal, and the identity resync wiped the
user's in-progress text from the DOM. Typing 0.5 into sampleRate stored
5.

Resolve numeric input state (badInput/empty/value) once in a shared
helper used by both renderTextInput's number branch and
renderNumberInput, absorbing their duplicated parse/commit/revalidate
logic. badInput now surfaces the invalid-number validity message
without committing; genuine clears keep removing optional overrides.

* test(ui): use plain validity objects instead of spreading ValidityState

Spreading a class instance drops its prototype (no-misused-spread); prod
only reads validity.badInput, so a plain object is the honest stub.
2026-08-13 21:08:04 -07:00
Peter Steinberger 0d851250c7 fix(agents): preserve process poll stream order (#123449) 2026-08-13 21:06:44 -07:00
Vyctor H. Brzezowski 72ec2a0bb1 fix(ui): show resolved agent names in New Session (#122463)
* test(ui): reproduce New Session raw agent labels

* fix(ui): resolve New Session agent names

* fix(gateway): preserve agent name source

* chore(protocol): regenerate Swift models

* chore(plugin-sdk): refresh API baselines

* fix(ui): scope agent target label fallback

* chore: format agent identity schema

* fix(ui): honor resolved agent name precedence

---------

Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>
2026-08-13 21:04:39 -07:00
Peter Steinberger 27c4433939 fix(ci): trust dependency approvers before graph compare (#123456) 2026-08-13 21:03:34 -07:00
Peter Steinberger 860aeed8f6 feat(gateway): transfer node worker workspaces (#123280)
* feat(gateway): transfer node worker workspaces

* fix(gateway): harden node workspace transfer

* fix(gateway): isolate transfer HTTP contract

* fix(gateway): trim transfer HTTP exports
2026-08-13 21:00:44 -07:00
Peter Steinberger b9c6789560 feat(secrets): authenticated egress substitution proxy with destination binding (#123216)
* feat(secrets): add authenticated egress substitution proxy

* feat(secrets): bind egress substitution to hosts

* ci(codeql): classify egress proxy bypass tunnel in network boundary query

* refactor(proxy-capture): use the canonical IP parser instead of node:net

* fix(secrets): compare proxy tokens with a process-keyed MAC
2026-08-13 20:49:31 -07:00