Peter Steinberger
9f5803079e
fix(nodes): require matching launch and turn identity ( #128722 )
...
* fix(nodes): align worker launch and turn identity
* test(nodes): stabilize container journal proof
2026-08-24 06:19:32 -07:00
Vyctor H. Brzezowski
ddd12ca27b
perf(ai): keep streaming responsive while large tool call arguments assemble ( #128166 )
...
* perf(ai): refresh streamed tool-call argument previews on a length schedule
Every input_json_delta re-parsed the entire accumulated argument buffer
(quote scan, strict parse attempt, repair scan, partial parse), making
assembly quadratic in argument size. A 128KB tool call spent ~1.2s of CPU
on re-parsing alone while blocking token delivery; previews are
preview-only by contract since the terminal parse re-reads the full
buffer authoritatively at content_block_stop.
Refresh previews on a geometric length checkpoint instead: bounded
staleness, linear total work. Applied across every accumulating
packages/ai transport/provider surface sharing the invariant.
(hook bypassed per run-node-tool.sh contract: no local node_modules in
this worktree and pnpm install is out of scope; oxfmt --check green on
all staged files via sibling checkout binary.)
* perf(agents): throttle proxied tool argument previews
* fix(agents): preserve terminal-only proxy tool calls
2026-08-23 12:37:21 -03:00
Peter Steinberger
84c2111b30
fix: restore cloud worker Desktop on node-backed Crabbox workers ( #126393 )
...
* fix(gateway): carry cloud worker desktops over nodes
* fix(crabbox): restore node-backed worker desktops
* refactor(crabbox): split worker provider owners
2026-08-19 11:50:48 -07:00
Peter Steinberger
0606e31d0e
feat(gateway): broker GitHub publication ( #126306 )
...
* feat(gateway): broker GitHub publication
* refactor(gateway): split publication owners
* fix(gateway): enforce publication branch authority
* fix(gateway): bind publication to remote identity
* fix(gateway): bind publication recovery to remote state
* fix(gateway): preserve publication git state
* fix(gateway): retain publication recovery authority
* fix(gateway): commit publication index atomically
* fix(gateway): narrow publication index errors
* refactor(gateway): keep publication CAS errors private
* fix(gateway): recover publication index transactions
* fix(agents): describe GitHub publication tool
* fix(gateway): harden publication base fetch
* fix(gateway): reject publication filter semantics
* fix(gateway): verify publication creation base
* refactor(agents): align publication tool options
* fix(gateway): isolate publication object lineage
* refactor(gateway): use shared table probe
* test(gateway): keep publication helpers in routed suite
* perf(ui): lazy-load GitHub publication request
* fix(gateway): preserve publication support contracts
* fix(gateway): recover publication before authority checks
* fix(gateway): fence local publication snapshots
* fix(android): format generated protocol models
* fix(gateway): harden publication recovery
* fix(gateway): fence publication recovery
* fix(ui): reset completed publication cycles
2026-08-19 11:05:12 -07:00
Peter Steinberger
9814b14c90
test: trim residual exact-subset assertions ( #126293 )
2026-08-19 03:41:20 -07:00
Peter Steinberger
6a97ba4f8b
test(worker): await inference admission before cancellation ( #125835 )
2026-08-18 07:01:27 -07:00
Peter Steinberger
23bcaef0c1
fix: tools report terminal no-delivery outcomes ( #125607 )
...
* fix(tools): report terminal non-delivery outcomes
* fix(agents): prefer authoritative terminal replies
* fix(agents): short-circuit authoritative replies
2026-08-17 22:51:44 -07:00
Peter Steinberger
bb1ce58514
refactor(gateway): remove obsolete reverse worker tunnel ( #125465 )
...
* refactor(gateway): remove reverse worker tunnel
* test(gateway): align worker transport expectations
* docs(gateway): clarify cloud worker ingress
2026-08-17 18:19:52 -07:00
Peter Steinberger
821f41e1cd
fix(workers): propagate session permission context to worker placements ( #125326 )
...
* fix(workers): propagate session permission context
* test(workers): expect launch descriptor v4
2026-08-17 09:34:56 -07:00
Peter Steinberger
11ebdfc9c3
fix(gateway): normalize TLS certificate pins ( #125276 )
...
* fix(gateway): normalize TLS certificate pins
* test(gateway): use valid TLS pin fixtures
2026-08-17 06:02:56 -07:00
Peter Steinberger
4b0d573437
feat: session permission modes with worktree-scoped defaults ( #124909 )
...
* feat(gateway): add session permission modes
* feat(agents): enforce session permission policies
* test: cover session permission modes
* docs: explain session permission modes
* fix(agents): preserve apply patch default root
* feat(codex): map session permission modes
* feat(ui): add session permission controls
* test: cover session permission surfaces
* fix(agents): enforce session permissions from entry
* fix(codex): pass params object to requirements reader
* fix(codex): honor session permission modes
* fix(codex): preserve exec approval floors
* chore: revert changelog edit (release-owned)
* test: align full-mode promotion with upstream semantics
* chore(protocol): regenerate session permission models
* docs: register session permission modes
* fix(ui): use shared permission dropdown
* fix(sessions): restore permission mode contracts
* fix(ci): record session permission startup JS growth in the budget baseline
* refactor(agents): prepare session exec mode at dispatch
Host dispatch owns permissionMode→exec override preparation; the codex
plugin consumes prepared facts and the SDK barrel export is removed,
keeping the plugin-sdk surface at its recorded budget.
* test: type exec mode fixtures as ExecMode
* fix(codex): require admin scope for yolo permissions
* test: isolate codex permission command state
* ci: refresh PR checks against current main
* ci: refresh checks after gateway test repair
* test: fix main-fallout CI suites
* chore: refresh CI merge ref
* fix(worker): fence permission-mode cloud placements
* fix(sessions): clear worktree policy on detach
* chore(protocol): generate session permission mode enum
* test(gateway): type dispatch fixtures from session entries
* fix(ui): allow clearing session permission mode
* chore: refresh CI merge ref
* fix(ci): record permission picker startup growth in the budget baseline
* fix(gateway): gate session root projections
2026-08-17 04:37:35 -07:00
Peter Steinberger
2d3aaaa0d5
feat(node-host): support Cloudflare Access service tokens ( #125193 )
...
* feat(node-host): support Cloudflare Access service tokens
Carry SecretRef-backed, origin-bound Cloudflare Access credentials across node onboarding, gateway and worker connections, and node-owned worker transfers. Refs #125112 .
* chore: align changed gate after rebase
* test(node-host): keep access proof within lint budgets
* style(node-host): keep supervisor within line budget
* fix(node-host): omit absent access config
* fix(node-host): reject Access credentials on plaintext routes
* fix(node-host): reject plaintext before ref resolution
* test: cover Access log redaction over TLS
2026-08-17 04:12:27 -07:00
Peter Steinberger
f59e945013
feat(gateway): move sessions between Gateway and runners ( #125036 )
...
* chore: preserve session placement move work
* feat(gateway): move sessions between runners
* test(gateway): align recovery fixture with move barriers
* fix(protocol): format literal-only Swift initializers
* test(ui): prove session move terminal state
* refactor(gateway): narrow session move target fence
* fix(gateway): preserve pending result recovery ownership
* test(workers): migrate reclaim lifecycle fixtures
* refactor(gateway): keep move internals private
* test(gateway): align split bootstrap fixture with moves
* fix(gateway): recover session moves through exact intent
* refactor(gateway): derive move placement subtypes locally
2026-08-17 00:23:13 -07:00
Peter Steinberger
5ac88c5f20
test(gateway): model exact worker claim lifecycle
2026-08-16 20:44:04 -07:00
Peter Steinberger
568b920b21
feat(lint): enforce import ordering and deduplication ( #124730 )
...
* refactor(imports): dedupe and hoist imports
* feat(lint): enforce import/no-duplicates and import/first
2026-08-16 11:44:52 -07:00
Peter Steinberger
4d872fbfbc
feat(nodes): expose installed worker bundle status ( #124640 )
...
* feat(nodes): expose installed worker bundle status
* perf(nodes): defer bundle status validation
* fix(nodes): tighten bundle status type contracts
* docs(gateway): document node worker bundle status
* refactor(gateway): split runner inventory runtime
* test(ui): keep healthy device status quiet
* fix(ui): preserve steer target ordering
* test(ui): isolate catalog handoff lifecycle
2026-08-16 10:04:46 -07:00
Peter Steinberger
18d130fc1b
fix(workers): bound node bundle retention ( #124590 )
...
* fix(workers): bound node bundle retention
* docs(runners): track bundle retention
2026-08-16 06:25:05 -07:00
Peter Steinberger
f19f62cb77
perf(node-host): prewarm worker bundles ( #124427 )
...
* perf(node-host): prewarm worker bundles
* test(gateway): gate worker finalization responsiveness
* fix(node-host): negotiate bundle prewarming
* fix(protocol): refresh worker prewarm models
* fix(node-host): preserve prewarm upgrade compatibility
2026-08-16 00:41:42 -07:00
Peter Steinberger
78502eda6d
feat(workers): run device sessions from Gateway bundles ( #124037 )
...
* feat(workers): run device sessions from Gateway bundles
Install the current Gateway bundle before a device environment becomes ready, verify it at attach and tunnel boundaries, launch only from the immutable namespaced bundle directory, and retire stale environments for idempotent reprovisioning. Remove the local execution mode and preserve the node-local build claim only as temporary inventory metadata for the final projection/cleanup slice.
* docs(runners): record Gateway bundle cutover
* test(ci): repair runner validation fixtures
# Conflicts:
# src/scripts/test-projects.test.ts
* fix(workers): surface outdated node recovery
Keep legacy runner inventory diagnostic-only while exposing the update-and-reconnect action through node, environment, provider, placement, and Control UI surfaces.
* fix(workers): reject legacy inventory with recovery
* fix(workers): bundle worker deploy closure
* test(workers): close bundle cutover gates
* fix(workers): compose browser runtime at build
* fix(workers): satisfy bundle cutover gates
* fix(workers): route temp runtime through infra
* docs(workers): align bundle host guidance
* fix(ui): fence outdated session destinations
2026-08-15 17:46:44 -07:00
Peter Steinberger
53074ae91a
feat(workers): install Gateway bundles on nodes ( #123985 )
...
* feat(workers): install Gateway bundles on nodes
Add a private paired-channel install command backed by a one-use Gateway HTTP capability, bounded archive validation, script-disabled dependency materialization, and atomic gateway-namespaced publication. Existing device provisioning remains on the local-build path until the next cutover slice.
* docs(runners): record node bundle installer
2026-08-14 20:52:39 -07:00
Peter Steinberger
f570022e14
fix(gateway): allow worker bootstrap on slow uplinks ( #123919 )
...
* fix(gateway): scale worker bundle transfer timeout with bundle size
Record the generated worker bundle size and scale only the upload phase timeout so large bundles can cross slow uplinks without weakening bootstrap verification. Preflight, install, and cleanup retain the base timeout, while invalid size metadata fails before remote work and the transfer remains capped at 60 minutes.
* fix(gateway): coordinate worker bootstrap lifecycle timeout
Derive the service-wide bootstrap deadline from the prepared installation artifact so the outer abort cannot preempt a permitted bundle transfer. Preserve the existing npm timeout, include bounded preflight, install, cleanup, and headroom, and cover the production service path that previously aborted after 35 minutes.
* style(gateway): simplify bundle digest validation
Flatten the bundle digest branch so the coordinated bootstrap timeout repair passes the core lint rule without changing validation behavior.
2026-08-14 19:14:01 -07:00
Peter Steinberger
d913796112
fix(runners): preserve node workspaces across restarts ( #123889 )
...
* fix(runners): retain node workspaces from gateway state
* docs(plan): record authoritative node retention
2026-08-14 16:59:19 -07:00
Peter Steinberger
afb3b9defb
fix(worker): surface gateway admission failures ( #123773 )
...
* fix(worker): surface admission retry failures
* fix(worker): ignore cancellation connection errors
2026-08-14 13:29:36 -07:00
Peter Steinberger
8a3964f87c
fix: node workspace transfers fail after successful turns ( #123564 )
...
* fix(node-host): preserve TLS transfer failures
* fix(node-host): clean transfer backpressure listeners
* fix(gateway): explain node workspace sync paths
2026-08-14 01:51:42 -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
438d035885
feat(gateway): launch workers on paired nodes ( #123157 )
...
* feat(gateway): launch workers on paired nodes
* docs(plan): track node worker launch wire
* fix(runners): restore node workspace ownership
Rehydrate durable workspace bindings after Gateway restart, fence timed-out node tunnel starts, and refuse incomplete clone fallback for submodule and Git LFS workspaces.
* test(runners): isolate node launch fixtures
2026-08-13 18:02:18 -07:00
Peter Steinberger
6c9916a48a
feat(runners): publish atomic device runner inventory ( #123094 )
...
* feat(runners): publish atomic node inventory
# Conflicts:
# docs/.generated/plugin-sdk-api-baseline/agent-harness-runtime.json
# src/gateway/server-methods/environments.ts
# src/gateway/worker-environments/device-provider.test.ts
* fix(runners): refresh topology on inventory removal
* fix(runners): resolve session host type overlap
* fix(protocol): document mobile runner inventory event
* fix(runners): project authoritative session host state
* docs(nodes): clarify prepared session host status
2026-08-13 04:54:26 -07:00
Peter Steinberger
3f4d89505a
feat(worker): expose supervised terminal outcomes ( #123013 )
...
* feat(worker): expose supervised terminal outcomes
* docs(plan): track supervisor terminal outcomes
2026-08-12 22:19:49 -07:00
Peter Steinberger
9ed96868eb
refactor(worker): streamline live preview delivery ( #122830 )
...
* refactor(worker): streamline live preview delivery
* refactor(worker): internalize live response error type
2026-08-12 15:25:23 -07:00
Peter Steinberger
6b9bea84f0
feat(node-host): supervise durable worker launches ( #122829 )
...
* feat(node-host): add worker launch supervision
* fix(node-host): harden worker lifecycle ownership
* fix(node-host): harden worker execution boundary
* fix(node-host): preserve worker trust settings
* chore(plugin-sdk): refresh worker lifecycle baselines
* docs(plan): track runner implementation slices
* test(node-host): await runtime shutdown owner
2026-08-12 15:24:05 -07:00
Peter Steinberger
522f06ffc6
feat(worker): support direct Gateway connections ( #122683 )
...
* feat(worker): support direct gateway connections
* docs(plan): link node worker provider PR
2026-08-12 09:59:29 -07:00
Peter Steinberger
7179d21d97
feat(gateway): expose public worker ingress ( #122643 )
...
* feat(gateway): expose public worker ingress
* docs(plan): mark public worker ingress in progress
* fix(gateway): harden worker ingress provenance
* fix(gateway): preserve disabled worker ingress response
2026-08-12 09:41:45 -07:00
Peter Steinberger
b080dd1e76
refactor: consolidate coercion contracts ( #122458 )
...
* refactor: consolidate coercion contracts
Centralize exact string, record, numeric, date, Boolean, argument, and structured-error coercions while preserving call-site semantics.
Migrate canonical-name collisions and deprecated internal SDK bypasses, deleting 55 net production/tooling lines. Expand declaration ownership enforcement to 101 allowed helpers and add a narrow export-completeness audit.
* fix: preserve standalone script coercions
Keep copied Control UI tooling self-contained and retain the trusted release harness module-relative source seam when the harness runs against an old target cwd.
2026-08-11 23:26:37 -07:00
Peter Steinberger
459c70e14a
fix(worker): stop Gateway RTT from pacing live previews ( #122258 )
...
* fix(worker): decouple live previews from gateway acknowledgements
* test(worker): track fault harness temp directories
* fix(worker): preserve finishing after preview rejection
* fix(worker): recover finishing after early preview failure
* test(worker): model terminal resync decisions
2026-08-11 14:55:08 -07:00
Peter Steinberger
3d76246792
refactor: eliminate final export name collisions ( #122083 )
...
* refactor: resolve final export name collisions
* refactor: update remaining collision rename consumers
* style: format rebased auth helpers
* test: update remaining session entry mocks
* test: update remaining runtime mock exports
* test: update delivery info path mock
* refactor: reconcile combined collision sweeps
* chore: regenerate collision and sdk baselines
2026-08-11 11:18:24 -07:00
Peter Steinberger
ebb2770000
refactor: eliminate export name collisions ( #122084 )
...
* refactor: eliminate export name collisions
* chore(scripts): burn resolved collision baselines
* refactor: narrow legacy session load options
* chore: refresh SDK and session debt baselines
* refactor: adopt upstream secrets collision fix
* test(plugin-sdk): mock renamed session store core
* fix(scripts): track renamed session accessor core
2026-08-11 10:41:50 -07:00
Peter Steinberger
e71d56d557
feat(cloud): let cloud sessions spawn and message cloud children ( #121846 )
...
* feat(cloud): add nested worker session capabilities
Amp-Thread-ID: https://ampcode.com/threads/T-019feaaa-c7ed-769e-9f29-a3612bec72e7
* fix(cloud): harden nested worker sessions
Amp-Thread-ID: https://ampcode.com/threads/T-019feaaa-c7ed-769e-9f29-a3612bec72e7
* fix(cloud): repair exact-head integration
Amp-Thread-ID: https://ampcode.com/threads/T-019feaaa-c7ed-769e-9f29-a3612bec72e7
---------
Co-authored-by: Amp <amp@ampcode.com >
2026-08-11 02:07:49 -07:00
Peter Steinberger
fa03d9b913
refactor: consolidate coercion helpers ( #121366 )
...
* refactor: consolidate coercion helpers
* fix: remove duplicate coercion imports
* fix: preserve serialized coercion guard
* chore: ratchet coercion helper carve-outs
* fix(test): keep gauntlet subprocess startup lean
* fix: preserve imported session timestamp semantics
* fix: preserve catalog timestamp string semantics
* chore: align plugin SDK surface ratchet
* fix: preserve trajectory and SDK string contracts
* fix(test): preserve QA record assertion semantics
* fix: complete standalone record guard rename
* refactor(cron): use canonical string coercion
* fix(acpx): preserve Pi timestamp parsing
* test(channels): adapt custody test harnesses
* test(telegram): classify media harness as test support
* test(acpx): split timestamp contract coverage
* test(channels): support generated custody contracts
* chore: ban the full coercion helper name set
Extends the declaration guard to all eleven consolidated helper names and
renames the cron schedule-identity readNumber wrapper to readScheduleInteger
so the banned generic name cannot regrow.
* fix(scripts): repair release-validation guard drift and lint cause
Restores the renamed isJsonRecord guard in assertTrustedWorkflowHarness after
main added isRecord call sites in parallel, and attaches the caught YAML error
as the thrown error cause (preserve-caught-error was red on main).
* fix: preserve Claude timestamp string semantics
* fix: preserve persisted timestamp string semantics
* fix: preserve date-first timestamp contracts
* fix(openai): harden delegation failure formatting
* chore: close coercion helper guard gaps
* test(openai): model non-error delegation rejection
* chore: refresh plugin SDK API contract
* fix(tasks): use canonical string field reader
* fix(ai): use canonical provider error field coercion
* fix(browser): migrate native bootstrap coercion
* docs(plugin-sdk): clarify text record export compatibility
* fix(gateway): normalize approval execution identity
* test(outbound): isolate message action poll harness
2026-08-11 00:02:18 -07:00
Josh Avant
73a9eed95b
refactor(audit): add canonical admitted-run context ( #120534 )
...
* feat(audit): carry canonical admitted execution context
* fix(agents): preserve admitted context across retries
* fix(worker): fence legacy launch dialect
* test(gateway): track approval temp dirs
* fix(plugin-sdk): preserve harness attempt compatibility
* fix: close delegated run authority at owner boundaries
* fix: internalize delegated authority validators
* refactor: split delegated authority proof surfaces
* refactor: centralize command admission identity
* test: claim runtime tool authority
* fix(gateway): keep lifecycle cleanup within static budgets
* fix(agents): revalidate harness policy authority
* fix(agents): fence awaited approval capability results
* test(copilot): supply required harness capability fixtures
* fix(agent): preserve scoped embedded run admission
* fix(agent): preserve keyless and worker authority
* test(agent): bind incomplete-turn authority
* docs: preserve execution authority invariants
* chore(plugin-sdk): regenerate API baseline
* fix(gateway): notify pending claim closure
* fix(gateway): revalidate delegated tool authority
* fix(plugin-sdk): keep source guard internal
* fix: close delegated authority races
* fix: revalidate delegated side effects
* fix: close harness authority projection gaps
* fix: align authority integration types
* fix: isolate settled harness finalization
* fix: fence recovery identity finalization
* fix: preserve committed session worktrees
* fix: preserve worker placement agent identity
* fix: fence active harness tool work
* fix(plugins): restore embedded run admission owner
* chore(plugin-sdk): compose integrated surface budgets
* fix(copilot): keep finalization attempt type internal
* fix(plugins): complete admission owner type imports
* test(harness): use settled finalization attempt shape
* fix(security): retain exact side-run and approval authority
* fix(security): preserve protected authority through terminal sweep
* fix(agents): follow moved recovery store owner
* fix(ci): align integrated authority owners with gates
* fix(plugins): distinguish embedded agent adapter export
* chore(plugin-sdk): regenerate API baseline after rolling integration
* refactor(gateway): keep session authority within owner budgets
* fix(gateway): keep session helpers private
* docs(plugin-sdk): name the V2 parameter subpath
* chore(integration): reconcile worker and SDK surfaces
* docs(plugin-sdk): require the V2 host API floor
* chore(plugin-sdk): regenerate after proxy-auth integration
2026-08-10 23:15:20 -05:00
Peter Steinberger
b5d5ec340f
feat(cloud-workers): add desktop apps and browser autonomy ( #121475 )
...
* feat(cloud-workers): add desktop apps and browser autonomy
provider-attested Browser/Terminal launchers, shared visible loopback CDP Browser tool, no MCP/cookies/generic command.
* feat(ui): add cloud desktop app launcher
* docs(gateway): document cloud desktop apps and browser autonomy
* perf(ui): trim desktop launcher startup copy
* refactor(ui): simplify desktop launch feedback
* perf(ui): reuse desktop app labels
* fix(ui): keep desktop launch failures actionable
* fix(crabbox): allow browser bootstrap to finish
* fix(cloud-workers): honor provider provision budgets
* fix(cloud-workers): persist browser screenshot receipts
* fix(cloud-workers): bound browser screenshot lifecycle
* fix(cloud-workers): avoid replaying desktop launches
* test(cloud-workers): isolate browser runtime integration
* refactor(cloud-workers): tighten desktop runtime boundaries
* test(cloud-workers): keep browser runtime mock synchronous
* fix(cloud-workers): break gateway type import cycle
* fix(ci): settle admitted setup sessions in tests
* build(plugin-sdk): refresh desktop app contract
* ci: refresh merge-tree validation
* build(plugin-sdk): regenerate desktop app baseline
* style(gateway): format merged method order test
2026-08-10 20:31:07 -07:00
Peter Steinberger
58a538767c
fix(security): centralize provider diagnostic redaction ( #121599 )
...
* fix(security): centralize provider diagnostic redaction
* fix(workers): redact finishing diagnostics
* fix(security): fail closed on malformed diagnostics
* fix(security): redact media wrapper diagnostics
* fix(security): normalize diagnostic field redaction
* fix(security): redact diagnostic media URIs
* fix(ai): preserve diagnostic compatibility in error projection
* refactor(ai): simplify diagnostic error handling
* fix(security): redact credential query diagnostics
* fix(security): redact diagnostic media arrays
* fix(security): redact diagnostic credential headers
* test: align shared expectations with current runtime contracts
* test(ui): align managed media and picker expectations
* fix(security): redact plural media diagnostics
* fix(ai): preserve bracketed provider errors
* fix(security): cover generic diagnostic credentials
* fix(security): redact prefixed diagnostic JSON
* fix(security): redact embedded diagnostic JSON
* test(agents): align cache trace media redaction
* fix(security): redact cookie diagnostics
* refactor(ai): isolate diagnostic host policy
* refactor(ai): narrow diagnostic helper exports
* fix(security): bound diagnostic descriptor reads
* fix(security): bound diagnostic graph traversal
2026-08-10 18:53:45 -07:00
Peter Steinberger
f6298bf84d
fix(workers): preserve disappeared-worker failures across restarts ( #121122 )
...
* fix(workers): persist placement terminal failures
* fix(workers): refresh placement protocol clients
* refactor(workers): isolate error formatting
* fix: integrate cloud terminal state with current main
* chore(plugin-sdk): refresh API baseline
* refactor(ui): inline one-use cloud terminal-reason banner helper
Keeps the Control UI startup JS bundle inside its 317 KiB gzip budget
(the helper + type-only import tipped it by 16 bytes).
* refactor(ui): trim terminal-reason lookup to type-erased optional access
Recovers the last gzip byte of the Control UI startup budget
(324609 B vs the 324608 B limit).
2026-08-10 00:36:52 -07:00
Peter Steinberger
bd6c6aaef2
refactor(ws): consolidate raw WebSocket payload decoding ( #121268 )
...
* refactor(ws): consolidate raw data conversion
* fix(scripts): keep gateway client source-loadable
* refactor(ws): share plugin frame decoding
2026-08-09 16:32:18 -07:00
Peter Steinberger
ce53f7e82e
refactor(agents)!: remove the session write lease ( #121113 )
...
* refactor(agents): remove session write lease
* refactor(plugin-sdk): deprecate session write lease
* refactor(doctor): remove session lock checks
* test(agents): remove session lease fixtures
* test(agents): align writer rebound assertion
* refactor(infra): remove retired session lock exports
* test(tooling): preserve embedded abort race shard
2026-08-09 15:30:48 -07:00
Peter Steinberger
8616c0c374
refactor: finish shared test helper migrations ( #120996 )
...
* test: finish shared helper migrations
* test: fix helper migration CI
* style: fix test import ordering
* test(acpx): restore deferred void types
* test: fix helper migrations after rebase
2026-08-09 06:00:06 -07:00
Peter Steinberger
b61bc5cd8d
fix: sync Cloud Worker workspaces from macOS gateways ( #121027 )
...
* fix(cloud-workers): support Apple openrsync receivers
* build: register worker receiver entry
* fix(cloud-workers): narrow receiver invocation types
* test(cloud-workers): resolve real rsync before wrapping
2026-08-09 03:51:24 -07:00
Peter Steinberger
121ce7faed
fix(worker): preserve long Responses sessions across cloud handoff ( #120803 )
...
* fix(worker): preserve Responses replay across handoff
Long OpenAI Responses cloud-worker sessions retain authoritative compaction replay through windowing and fail visibly when it cannot be preserved.
* test(worker): align replay fixture with frame limit
2026-08-08 19:11:29 -07:00
clawsweeper[bot]
b067311551
fix(agents): record stop reason in completion trajectory ( #118685 )
...
* fix(agents): record stop reason in completion trajectory
* fix(agents): record stop reason in completion trajectory
* fix(agents): record stop reason in completion trajectory
* fix(agents): record stop reason in completion trajectory
* fix(agents): record stop reason in completion trajectory
* fix(agents): record stop reason in completion trajectory
* fix(agents): record stop reason in completion trajectory
* fix(agents): record stop reason in completion trajectory
* fix(agents): record stop reason in completion trajectory
* fix(agents): record stop reason in completion trajectory
* fix(agents): record stop reason in completion trajectory
* fix(agents): record stop reason in completion trajectory
* fix(agents): normalize completion trajectory outcomes
* fix(agents): preserve terminal outcome ownership
* refactor(agents): simplify trajectory completion paths
* test(agents): tighten trajectory outcome matrix
* fix(trajectory): isolate partial export tails
* fix(trajectory): preserve yield and partial-tail ownership
* fix(trajectory): preserve terminal precedence
* fix(trajectory): align terminal status and reason
* fix(trajectory): bound reused-run partial tails
* test(trajectory): cover terminal-only export tails
* fix(trajectory): anchor terminal-only cohorts
---------
Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-08-08 14:51:50 -07:00
Peter Steinberger
e7a9f33d89
refactor(core): adopt normalization-core leaf helpers across production ( #120350 )
...
* refactor(core): adopt normalization-core leaf helpers across production
* fix(ci): keep plugin contract source-resolvable
* fix(errors): preserve adapter-owned error fields
* fix(errors): short-circuit existing errors before stringifying
* fix(errors): skip throwing structured getters
* ci: retrigger checks on current base
* fix(errors): guard structured error enumeration
* fix: harden error detail copying
2026-08-08 12:00:49 -07:00
Peter Steinberger
47f78a32eb
fix(ai): preserve long Responses sessions after server compaction ( #120457 )
...
* fix(ai): preserve Responses server compaction state
Persist opaque Responses compaction items as fenced provider replay state so long stateless sessions can resume authoritative compressed history without exposing it in display or diagnostics. Carry state through worker transcripts and prune replay prefixes without splitting tool pairs.
Release note: Preserve long OpenAI Responses sessions across server-side compaction and worker restarts.
Related: #95788
* test(ai): align long-context fixtures with CI contracts
Make tool-result fixtures type-complete, use the canonical model selector helper, remove unused test-helper exports, and route the paid long-context live probe through the dedicated Gateway profile shard.
* test(ai): type mocked Responses terminal events
Give the mock SSE event collection an explicit open event shape so terminal response events coexist with output-item events under the root test typecheck.
* fix(ai): suppress rejected compaction replay
Persist a route-fenced suppression tombstone when encrypted-content recovery rejects a compaction item, so later turns do not retry the same opaque state. Preserve the tombstone through transcript redaction and cover successful fallback followed by the next turn.
* fix(ai): keep compaction suppression transport-private
Keep the suppression contract local to its sole Responses transport owner and make the regression fixture satisfy root type and lint checks without widening the Plugin SDK surface.
* refactor(ai): remove compaction suppression re-export
* fix(ai): scope compaction suppression to replay route
Keep foreign-route rejection tombstones from hiding the newest compatible Responses compaction while preserving same-route suppression.
* fix(ai): harden Responses replay recovery
Stage encrypted replay recovery so compaction is only suppressed after an attributable rejection. Preserve terminal ordering and keep provider replay within worker frame budgets without truncating opaque state.
* refactor(ai): centralize Responses output indexes
Keep normalized output identity tracking in the stream-slot owner, move response failure state to its diagnostic owner, and remove the obsolete replay clone export so exact-head static gates remain shrink-only.
* fix(ai): retain idless terminal tool identity
Use the canonical empty identity only when a provider supplies neither call nor item id, preventing terminal recovery from duplicating a done-only tool call while preserving stronger identities when available.
* fix(sessions): hide provider replay from public events
* fix(ai): stage encrypted replay recovery
* fix(ai): keep replay attempt kind internal
* fix(ai): route Azure through replay recovery
Use the shared encrypted-content retry owner for Azure Responses so compaction suppression and prompt-observer variants stay coherent across transports.
* fix(ai): harden replay persistence boundaries
Fence Azure replay by the resolved request endpoint, drop invalid replay during transcript sanitization, and surface worker-launch replay omissions through the existing redacted diagnostic path.
2026-08-08 11:55:26 -07:00