Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
311 commits
Select commit Hold shift + click to select a range
5cadc60
fix(sandbox): PAB1 codec - descriptor-first grant read, strict URL pa…
sethkarten Sep 2, 2026
a356d98
fix(sandbox): PAB1 codec - descriptor snapshot recursion, exact byte …
sethkarten Sep 2, 2026
d21f53c
fix(sandbox): PAB1 codec cleanup - unused copy helper, duplicate gran…
sethkarten Sep 2, 2026
fceafa3
feat(coding-agent): B14c sandbox-fd-bootstrap-reader with framed boot…
sethkarten Sep 2, 2026
2f516b8
feat(coding-agent): B14c sandbox-fd-bootstrap-reader with framed boot…
sethkarten Sep 2, 2026
dc19f39
feat(coding-agent): B14c sandbox-fd-bootstrap-reader final correction
sethkarten Sep 2, 2026
490b56a
feat(coding-agent): B14c sandbox-fd-bootstrap-reader final deadline +…
sethkarten Sep 2, 2026
28c22a2
feat(coding-agent): B14c sandbox-fd-bootstrap-reader — fix freshPaylo…
sethkarten Sep 2, 2026
6b45d5a
feat(coding-agent): B14c sandbox-fd-bootstrap-reader — fresh frozen a…
sethkarten Sep 2, 2026
723a8db
test: assert FD3 adapter isolation
sethkarten Sep 2, 2026
cf71d64
feat: implement PAAR v1 pure manifest/framing codec
sethkarten Sep 2, 2026
f51886e
fix: verify-agent corrections to PAAR v1 codec
sethkarten Sep 2, 2026
4be1299
fix: final correctness pass for PAAR v1 codec
sethkarten Sep 2, 2026
a17f558
fix: exact decoder guard, buffer erasure, offset-zero regressions
sethkarten Sep 2, 2026
8cf7e6e
docs: record accepted bootstrap and PAAR foundations
sethkarten Sep 2, 2026
5a0058d
feat(daemon): add pure B03 delivery-index marker codec and recovery a…
sethkarten Sep 2, 2026
75f0dd6
fix(daemon): strict-copy recovery, atomic transition, correct actions…
sethkarten Sep 2, 2026
5e8e926
fix(daemon): factory/query return frozen results, validateMarker comp…
sethkarten Sep 2, 2026
02325cc
feat(coding-agent): PAB1 streaming SSH-stdin bootstrap frame reader
sethkarten Sep 2, 2026
657e2c1
fix(sandbox-stdin-frame): registration-flag-before-on, listener-table…
sethkarten Sep 2, 2026
4beeaa5
fix(sandbox-stdin-frame): registration-flag throw correction + throw-…
sethkarten Sep 2, 2026
e9ee8f6
docs: record delivery index and stdin framing
sethkarten Sep 2, 2026
ee7be76
feat(coding-agent): B14 SSH spawn spec codec -- pure frozen DTO codec
sethkarten Sep 2, 2026
e5e8b81
fixup: contract-gap fixes for B14 SSH spawn spec codec
sethkarten Sep 2, 2026
56991ed
fixup: remove constructor read from isPlainObject, add getter-invocat…
sethkarten Sep 2, 2026
4dd8790
fixup: remove constructor read from isPlainObject, add getter-invocat…
sethkarten Sep 2, 2026
6efce89
docs: record accepted SSH spawn specification
sethkarten Sep 2, 2026
1d63a72
fix(coding-agent): resolve TypeScript regressions from stdin frame re…
sethkarten Sep 2, 2026
af83a78
test: assert hostile SSH env rejection
sethkarten Sep 2, 2026
a7add61
test: type hostile SSH specification inputs
sethkarten Sep 2, 2026
d211013
docs: refresh sandbox sessions integration baseline
sethkarten Sep 2, 2026
8bd83db
feat(coding-agent): add immutable journal publication
sethkarten Sep 2, 2026
db70c4a
docs: record immutable journal publication
sethkarten Sep 2, 2026
df846c0
feat(coding-agent): add immutable delivery marker publication
sethkarten Sep 2, 2026
0460b34
docs: record immutable delivery publication
sethkarten Sep 2, 2026
a497629
feat(coding-agent): add one-use sandbox relay upgrade auth
sethkarten Sep 2, 2026
8b0be96
docs: record accepted upgrade authentication
sethkarten Sep 2, 2026
1ccb524
feat(coding-agent): show sandbox execution metadata
sethkarten Sep 2, 2026
07e87af
docs: record Agents View metadata
sethkarten Sep 2, 2026
4a8962b
feat(coding-agent): normalize sandbox bootstrap stdin
sethkarten Sep 2, 2026
ac32983
docs: record stdin normalization boundary
sethkarten Sep 2, 2026
3f17cb6
feat(coding-agent): write sandbox credential frames safely
sethkarten Sep 2, 2026
ed64498
docs: record credential write ownership
sethkarten Sep 2, 2026
2da8b43
feat(coding-agent): add hosted subagent port boundary
sethkarten Sep 2, 2026
1a03d46
docs: record hosted subagent boundary
sethkarten Sep 2, 2026
9df8a3d
feat(coding-agent): recover durable remote host records
sethkarten Sep 2, 2026
86d9fa0
docs: record bounded journal recovery
sethkarten Sep 2, 2026
f10f66b
docs: record sandbox session correction tracks
sethkarten Sep 2, 2026
26ffef3
feat(coding-agent): add sandbox and sandbox_options to rlm.spawn kwar…
sethkarten Sep 2, 2026
f6ede58
feat(coding-agent): add sandbox and sandbox_options to rlm.spawn kwar…
sethkarten Sep 2, 2026
858ee7d
docs: record RLM sandbox option integration
sethkarten Sep 2, 2026
169c295
feat(sandbox): B14 SSH process monitor with exhaustive adversarial tests
sethkarten Sep 2, 2026
7fd5770
fix(sandbox): track admission settlement, preserve terminal events on…
sethkarten Sep 2, 2026
2da8baa
fix(sandbox): intrinsic Promise.then call, own-then brand validation,…
sethkarten Sep 2, 2026
784d41f
test(sandbox): satisfy monitor repository checks
sethkarten Sep 2, 2026
55fe678
fix(sandbox): type-check SSH monitor boundary
sethkarten Sep 2, 2026
c6a6ff4
docs: record accepted SSH monitor and replacement tracks
sethkarten Sep 2, 2026
0afbaac
fix(sandbox): scrub credentials after terminal relay auth
sethkarten Sep 2, 2026
905a492
feat(rlm/paar): add Python PAAR manifest codec with safe-int parity
sethkarten Sep 2, 2026
dc2e175
paar: salvage Python codec as pure manifest codec only (no streaming/…
sethkarten Sep 2, 2026
298f683
docs: update sandbox session integration evidence
sethkarten Sep 2, 2026
9c5275e
test(paar): run Python codec coverage in CI
sethkarten Sep 2, 2026
31d6ded
feat(sandbox): add Node Writable credential adapter v2
sethkarten Sep 2, 2026
08b890c
fix(sandbox): preserve exact Node writable ownership
sethkarten Sep 2, 2026
32b1db6
feat(sandbox): add bounded PAAR streaming verifier
sethkarten Sep 2, 2026
c72e622
feat(relay): add serialized durable relay store
sethkarten Sep 2, 2026
48bccff
docs: record durable store and artifact review
sethkarten Sep 2, 2026
6a5c715
fix(relay): reject aliased durable store capabilities
sethkarten Sep 2, 2026
7f88944
docs: accept durable relay store
sethkarten Sep 2, 2026
5e365f4
feat(relay): expose recovered journal record in frame state
sethkarten Sep 2, 2026
15ec561
feat(relay): add ordered durable delivery
sethkarten Sep 2, 2026
b03e9d8
test(relay): cover exact ACK replay after restart
sethkarten Sep 2, 2026
3c7ad6c
fix(relay): reject application-context reentry
sethkarten Sep 2, 2026
aa4f5d1
docs: record ordered durable relay
sethkarten Sep 2, 2026
cf99a13
feat(relay): add durable agent-message application
sethkarten Sep 2, 2026
63a1b0a
test(relay): compose durable agent-message delivery
sethkarten Sep 2, 2026
70c256d
docs: record durable agent-message boundary
sethkarten Sep 2, 2026
4cd92e6
feat(runtime): build verified PAAR archives
sethkarten Sep 2, 2026
6c6030e
docs: accept verified PAAR builder
sethkarten Sep 2, 2026
5f753b0
feat(runtime): install verified PAAR archives
sethkarten Sep 2, 2026
2380fc7
docs: accept verified PAAR installer
sethkarten Sep 2, 2026
789dead
feat(coding-agent): add owned Node SSH session adapter
sethkarten Sep 2, 2026
b034e68
docs: record accepted Node SSH session adapter
sethkarten Sep 2, 2026
706a3e5
docs: reject unsafe offline runtime composer v3
sethkarten Sep 2, 2026
522dde8
docs: reject recursive FD3 wrapper v5
sethkarten Sep 2, 2026
7c7aadc
docs: reject incomplete observation persistence v6
sethkarten Sep 2, 2026
9418857
docs: reject unsafe listener server v9
sethkarten Sep 2, 2026
5a7fdc8
docs: reject unsafe runtime and bridge replacements
sethkarten Sep 2, 2026
eaaf6ab
docs: reject observation application v7
sethkarten Sep 2, 2026
0a1f071
docs: reject listener ownership core v10
sethkarten Sep 2, 2026
e1209d8
feat(coding-agent): add owned FD3 bootstrap bridge
sethkarten Sep 2, 2026
118b75d
docs: record accepted FD3 bootstrap bridge
sethkarten Sep 2, 2026
eb550d5
docs: reject listener ownership core v11
sethkarten Sep 2, 2026
46a4ac6
docs: reject observation application v8
sethkarten Sep 2, 2026
a7edbcc
docs: reject offline runtime composer v5
sethkarten Sep 2, 2026
dd486fe
feat(coding-agent): compose pinned offline runtimes
sethkarten Sep 2, 2026
268d094
docs: record accepted offline runtime composer
sethkarten Sep 2, 2026
cdd45df
feat(relay): add canonical observation records
sethkarten Sep 2, 2026
26a2388
docs: record accepted observation codec
sethkarten Sep 2, 2026
c71c2a8
feat(relay): add durable observation application
sethkarten Sep 2, 2026
83a1cce
docs: record accepted durable observation application
sethkarten Sep 2, 2026
58dbc76
docs: reject unsafe B03 scanner replacement
sethkarten Sep 2, 2026
d86e7d6
feat(relay): persist durable observations on Node
sethkarten Sep 2, 2026
d65bb91
docs: record accepted observation backend
sethkarten Sep 2, 2026
9d40331
feat(coding-agent): add single-use sandbox relay listener core
sethkarten Sep 3, 2026
c6bb019
docs: record accepted sandbox relay listener core
sethkarten Sep 3, 2026
cf826a0
feat(coding-agent): add Node sandbox relay adapter
sethkarten Sep 3, 2026
c07f16d
docs: record accepted Node relay adapter
sethkarten Sep 3, 2026
b7c67d3
docs: reconcile sandbox sessions implementation status
sethkarten Sep 3, 2026
adf4057
feat: add dependency-free FD3 child readiness monitor
sethkarten Sep 3, 2026
0c8cf15
docs: record accepted FD3 readiness monitor
sethkarten Sep 3, 2026
bbe38dc
feat(coding-agent): add Node FS backend for B03 DurableRelayStore
sethkarten Sep 3, 2026
213a4d8
docs: record accepted Node B03 backend
sethkarten Sep 3, 2026
5430f0c
test: type Node B03 backend assertions
sethkarten Sep 3, 2026
000a5b2
feat: implement B10 durable target inbox core
sethkarten Sep 3, 2026
b43ed63
fix: harden durable target inbox lifecycle
sethkarten Sep 3, 2026
5d0738a
fix: preserve target inbox recovery failures
sethkarten Sep 3, 2026
2f278bf
docs: record accepted durable target inbox
sethkarten Sep 3, 2026
2cd1471
feat: add owned fd3 runtime launcher
sethkarten Sep 3, 2026
798de25
docs: record accepted fd3 runtime launcher
sethkarten Sep 3, 2026
64a196b
feat(coding-agent): add numeric FD3 runtime dispatch
sethkarten Sep 3, 2026
509ea39
docs: record numeric FD3 runtime integration
sethkarten Sep 3, 2026
87ff033
fix: DurableTargetInbox semantic replay returns current transport fra…
sethkarten Sep 3, 2026
0c223e3
test(coding-agent): tighten cross-transport inbox replay coverage
sethkarten Sep 3, 2026
5c563be
style(coding-agent): format inbox replay test
sethkarten Sep 3, 2026
5a92fa2
feat(coding-agent): add durable target inbox authorization and dispatch
sethkarten Sep 3, 2026
7fc4499
docs: record accepted B10 authorization and transcript dispatch
sethkarten Sep 3, 2026
ac0e313
feat(coding-agent): add durable provider call record codec
sethkarten Sep 3, 2026
814fda8
docs: record accepted provider call codec
sethkarten Sep 3, 2026
af3d31e
feat(coding-agent): compose production FD3 wrapper
sethkarten Sep 3, 2026
304e349
feat(coding-agent): apply ordered target inbox admission
sethkarten Sep 3, 2026
19d3a1d
docs: record FD3 wrapper and ordered target app
sethkarten Sep 3, 2026
98189de
feat(coding-agent): add hosted RLM runtime port
sethkarten Sep 3, 2026
09b93ec
docs: record hosted runtime boundary review
sethkarten Sep 3, 2026
8618dc2
feat(coding-agent): adapt hosted port to ordered relay
sethkarten Sep 3, 2026
8ed8977
feat(coding-agent): recover provider call journals
sethkarten Sep 3, 2026
c9efecd
feat(coding-agent): scan durable session transcripts
sethkarten Sep 3, 2026
ca6b5ab
docs: record durable transport recovery layers
sethkarten Sep 3, 2026
5841b57
docs: track production composition corrections
sethkarten Sep 3, 2026
48a77dc
docs: replace stalled hosted runtime track
sethkarten Sep 3, 2026
c92e8e0
docs: replace unsafe daemon relay composition
sethkarten Sep 3, 2026
2d13a5c
docs: reject unsafe provider store candidate
sethkarten Sep 3, 2026
635adb9
docs: replace stalled sandbox codec track
sethkarten Sep 3, 2026
332b146
docs: restart target inbox registry cleanly
sethkarten Sep 3, 2026
be965f8
docs: record clean composition baseline
sethkarten Sep 3, 2026
91d9532
fix(coding-agent): close raw sandbox identity exposure gap
sethkarten Sep 3, 2026
0d8fb97
docs: record opaque identity and rejected corrections
sethkarten Sep 3, 2026
f0c47a3
Add SandboxCommandRecordV1 codec with four-variant encode/decode
sethkarten Sep 3, 2026
8bc1734
docs: record command durability and correction restarts
sethkarten Sep 3, 2026
27ef4c8
feat: add permanent target inbox registry
sethkarten Sep 3, 2026
43f362e
docs: record registry integration and durability reviews
sethkarten Sep 3, 2026
7578963
docs: record registry root verification
sethkarten Sep 3, 2026
effd481
feat: add remote relay target dispatcher
sethkarten Sep 3, 2026
e467dba
docs: record relay dispatcher and durability audits
sethkarten Sep 3, 2026
71a1631
fix(hosted-rlm-run-controller): raw semantic values for createHostedR…
sethkarten Sep 3, 2026
04265dd
docs: record hosted controller integration
sethkarten Sep 3, 2026
76d0035
feat(sandbox): implement SandboxEventOutboxRecordV1 codec with true r…
sethkarten Sep 3, 2026
d7879a5
docs: record event codec and provider audit
sethkarten Sep 3, 2026
a1a590a
style: format sandbox event codec
sethkarten Sep 3, 2026
2ee56f0
feat: compose bidirectional target inbox entries
sethkarten Sep 3, 2026
92b2782
docs: record bidirectional relay composition
sethkarten Sep 3, 2026
d69f981
docs: record runtime and provider boundary audits
sethkarten Sep 3, 2026
e4274e3
fix: erase owned provider codec bytes
sethkarten Sep 3, 2026
e6020ec
docs: record provider codec hardening
sethkarten Sep 3, 2026
3333f6f
docs: reconcile active sandbox session tracks
sethkarten Sep 3, 2026
6701cd2
feat: add opaque sandbox lifecycle recovery
sethkarten Sep 3, 2026
92812ad
docs: record lifecycle recovery integration
sethkarten Sep 3, 2026
069e6f0
docs: reconcile sandbox sessions implementation roster
sethkarten Sep 3, 2026
191695e
feat(rlm): enforce hosted and branded local runtime union
sethkarten Sep 3, 2026
80dee87
docs: record accepted RLM runtime union
sethkarten Sep 3, 2026
e0fc555
docs: reconcile active sandbox correction tracks
sethkarten Sep 3, 2026
a32f01f
amend command recovery: uncertain/alias, sync guard, invalid vs acces…
sethkarten Sep 3, 2026
caecc4e
fix: rewrite B14 sandbox event-outbox recovery - coherent cleanup, ex…
sethkarten Sep 3, 2026
14b2316
docs: record accepted command and event recovery
sethkarten Sep 3, 2026
39c62a7
fix(store): frozen arrays, codec-normalize with proof, erase split, o…
sethkarten Sep 3, 2026
180a7f6
fix(daemon): align provider recovery receipts
sethkarten Sep 3, 2026
d3fdd68
docs: record accepted provider store
sethkarten Sep 3, 2026
9115d88
docs: reconcile sandbox store tracks
sethkarten Sep 3, 2026
fa2442a
docs: record durability validation stage
sethkarten Sep 3, 2026
06c2b15
docs: refresh sandbox integration baseline
sethkarten Sep 3, 2026
4d2e620
docs: record durability candidate audits
sethkarten Sep 3, 2026
c50e618
feat(sandbox): B14 durable sandbox command store
sethkarten Sep 3, 2026
3f62d7d
feat(daemon): add B14 sandbox-event-outbox store with factory, FIFO, …
sethkarten Sep 3, 2026
d7488f0
docs: record accepted command and event stores
sethkarten Sep 3, 2026
fc1b913
docs: map sandbox domain application topology
sethkarten Sep 3, 2026
cf69fee
docs: reconcile sandbox runtime correction tracks
sethkarten Sep 3, 2026
f33e65f
feat(daemon): restart-safe provider delivery evidence extension
sethkarten Sep 3, 2026
115bbc3
fix(daemon): update dispatcher SEND_VALUE_KEYS for journalReceipt, ha…
sethkarten Sep 3, 2026
4e0d463
fix(relay): correct rejected ACK semantics, scanComplete, outgoing re…
sethkarten Sep 3, 2026
cbc0668
fix(relay): bind queried delivery evidence
sethkarten Sep 3, 2026
c8eaea9
fix(relay): scan full durable journal range
sethkarten Sep 3, 2026
0499ee5
docs: record accepted relay delivery evidence
sethkarten Sep 3, 2026
a711653
docs: correct workspace artifact contract
sethkarten Sep 3, 2026
d35af25
feat(daemon): add relay application multiplexer v1 with ownership-fir…
sethkarten Sep 3, 2026
3596ebf
fix(daemon): correct relay application multiplexer v1 — close, clone,…
sethkarten Sep 3, 2026
7005713
fix(daemon): multiplexer cast-free, cross-instance reentry, Proxy clo…
sethkarten Sep 3, 2026
7e5b9f4
fix(daemon): audit corrections on 9760612c2 — null/primitive INVALID_…
sethkarten Sep 3, 2026
8c8dec7
fix(daemon): close multiplexer ownership audit gaps
sethkarten Sep 3, 2026
c6d8652
fix(daemon): reject multiplexer proxy without reflection
sethkarten Sep 3, 2026
8aaa1ae
docs: record accepted relay multiplexer
sethkarten Sep 3, 2026
452ffca
docs: reconcile sandbox session implementation
sethkarten Sep 3, 2026
7a85993
docs: record runtime integration blockers
sethkarten Sep 3, 2026
48775e6
feat(daemon): add replayUndelivered boundary to ProviderCallStoreCapa…
sethkarten Sep 3, 2026
2c0bb6c
fix(daemon): correct replayUndelivered tests — safe narrowing, >64 pa…
sethkarten Sep 3, 2026
58f78e7
docs: record provider restart index
sethkarten Sep 3, 2026
97ea053
feat(daemon): add session-backed sandbox command effects
sethkarten Sep 3, 2026
ae472cf
docs: record command effect port
sethkarten Sep 3, 2026
eae547f
feat(daemon): add node-sandbox-journal-backend with zero-transfer sec…
sethkarten Sep 3, 2026
ac71982
fix(daemon): enforce _taFill erasure preflight and scanJournalDir uid…
sethkarten Sep 3, 2026
47418e2
fix(daemon): add post-publish prototype verification and malicious-pu…
sethkarten Sep 3, 2026
545e1c4
docs: record production journal runtime
sethkarten Sep 3, 2026
db87fb7
feat: sandbox command relay application v1
sethkarten Sep 3, 2026
5b8899f
fix: correct rejected sandbox command relay application v3
sethkarten Sep 3, 2026
476eba5
fix: final corrections for sandbox command relay v3
sethkarten Sep 3, 2026
da5f1ce
fix: narrow clean-up — remove unused constants, replace misleading tests
sethkarten Sep 3, 2026
522680b
fix: capture all seven AgentSession methods at factory; fix reentry/h…
sethkarten Sep 3, 2026
d16481f
fix: zero casts — capture all seven session methods at factory with d…
sethkarten Sep 3, 2026
7da324d
docs: accept sandbox command relay application
sethkarten Sep 3, 2026
263f52c
feat: implement pure PAWS manifest codec v3
sethkarten Sep 3, 2026
637d379
feat: implement pure PAWS manifest codec v3
sethkarten Sep 3, 2026
0b5fee2
fix: enforce header-only decode in pure PAWS manifest codec
sethkarten Sep 3, 2026
e09c49f
fix: address all pure PAWS manifest codec audit items
sethkarten Sep 3, 2026
ef1cb68
fix: guard empty-manifest order validation, erase both byte buffers o…
sethkarten Sep 3, 2026
b185cc3
fix: proxy-safe entry admission, backing buffer validation, strict ga…
sethkarten Sep 3, 2026
5d8611b
fix: reject C1 control characters in PAWS paths (U+0080-U+009F)
sethkarten Sep 3, 2026
b7b4b94
fix: canonical JSON validation in snapshot and changeset decode, elim…
sethkarten Sep 3, 2026
afb329a
fix: pass manifestStr for canonical JSON validation, remove typed-arr…
sethkarten Sep 3, 2026
93c4538
fix: replace live reencoded.byteLength with captured intrinsic getter
sethkarten Sep 3, 2026
e88e2d4
fix: apply Biome formatting to satisfy strict check
sethkarten Sep 3, 2026
580bf2b
docs: accept pure PAWS manifest codec
sethkarten Sep 3, 2026
6fcaff9
docs: record integrated durability matrix
sethkarten Sep 3, 2026
e624b82
feat(sandbox): add durable local agent-message dispatcher
sethkarten Sep 3, 2026
82d985a
docs: record sandbox local message dispatcher
sethkarten Sep 3, 2026
d093e7e
docs: reconcile hosted composition corrections
sethkarten Sep 3, 2026
fe906bf
Merge origin/main into feat/sandbox-backed-sessions
sethkarten Sep 3, 2026
64e40ba
docs: record sandbox sessions draft PR
sethkarten Sep 3, 2026
c27957b
feat(daemon): classify side-specific relay ingress
sethkarten Sep 3, 2026
9c02300
test: document best-effort cleanup catches
sethkarten Sep 3, 2026
e3ae745
docs: reconcile sandbox sessions implementation status
sethkarten Sep 3, 2026
99dd8af
Merge remote-tracking branch 'origin/main' into feat/sandbox-backed-s…
sethkarten Sep 3, 2026
893a994
docs: record current main merge
sethkarten Sep 3, 2026
719d90c
feat: add sandbox provider relay client
sethkarten Sep 3, 2026
4c9a315
feat: add durable relay application gate
sethkarten Sep 3, 2026
7c35944
docs: record accepted relay integrations
sethkarten Sep 3, 2026
e51860e
fix: sequential reverse-order close for owners; add order, aliasing, …
sethkarten Sep 3, 2026
a0a84bf
feat: coordinate durable home provider calls
sethkarten Sep 3, 2026
5ab7744
fix: validate Node 22 context promises exactly
sethkarten Sep 3, 2026
77c3dc5
docs: record provider and Promise foundations
sethkarten Sep 3, 2026
af04d8c
fix: synchronize daemon schema identity
sethkarten Sep 3, 2026
4de6616
feat: verify PAWS archives with stable streaming evidence
sethkarten Sep 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
445 changes: 445 additions & 0 deletions SANDBOX_SESSIONS_PLAN.md

Large diffs are not rendered by default.

18 changes: 15 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Added the durable lifecycle, transport, journal, command, provider, messaging, observation, and workspace-codec foundations for sandbox-backed Prime Agent sessions. Hosted capability advertisement remains gated until the complete runtime composition and end-to-end cleanup checks are ready.
2 changes: 2 additions & 0 deletions packages/coding-agent/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
"typebox": "^1.3.9",
"undici": "^7.29.0",
"uuid": "^14.0.0",
"ws": "^8.18.0",
"yaml": "^2.9.0"
},
"overrides": {
Expand All @@ -86,6 +87,7 @@
"@types/ms": "^2.1.0",
"@types/node": "^24.3.0",
"@types/proper-lockfile": "^4.1.4",
"@types/ws": "^8.18.1",
"esbuild": "^0.28.1",
"shx": "^0.4.0",
"typescript": "^7.0.2",
Expand Down
45 changes: 35 additions & 10 deletions packages/coding-agent/src/cli.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,40 @@
#!/usr/bin/env node
// The Node 22+ module graph fails at link time on older Node, so it must load
// behind the dynamic import, after the dependency-free guard runs.
// ---- Pre-guard static runtime dispatch -------------------------------------
// Runs BEFORE the Node version guard and heavy imports. Only static imports
// and synchronous parsing — no dynamic import(), no async, no I/O.
// The Node 22+ module graph fails at link time on older Node, so the heavy
// import("./cli-main.js") is inside the version guard. The version check
// and dispatch parser are simple enough to parse on any Node that can import
// ESM (Node >= 16).
import { assertNodeVersion } from "./cli/node-version-check.js";
import { detectReservedArgv } from "./cli/sandbox-runtime-dispatch.js";

const supported = assertNodeVersion({
version: process.versions.node,
log: console.error,
exit: (code) => process.exit(code),
});
const dispatchResult = detectReservedArgv(process.argv.slice(2));
if (dispatchResult.handed) {
// Dispatch consumed the flag. Set exit code and exit without running
// normal startup. Do NOT call process.exit() — let the event loop drain
// naturally so any pending microtasks or promise reactions settle.
process.exitCode = dispatchResult.exitCode;
} else {
// Normal startup path — Node version guard then heavy imports.
await runNormalStartup();
}

// =============================================================================
// Normal startup function
// =============================================================================

async function runNormalStartup(): Promise<void> {
const supported = assertNodeVersion({
version: process.versions.node,
log: console.error,
exit: (code) => {
process.exitCode = code;
},
});

if (supported) {
const { runCli } = await import("./cli-main.js");
await runCli();
if (supported) {
const { runCli } = await import("./cli-main.js");
await runCli();
}
}
2 changes: 2 additions & 0 deletions packages/coding-agent/src/cli/command-registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,8 @@ const TOP_LEVEL_OPTION_GROUPS: ReadonlyArray<{ heading: string; options: readonl
["--no-session", "Do not save the session"],
["--goal <objective>", "Seed a persistent goal for a new root session"],
["--goal-token-budget <n>", "Set a positive token budget for --goal"],
["--sandbox", "Create the session in a Prime Sandbox"],
["--sandbox-options <json>", "JSON options (region only) for the sandbox"],
],
},
{
Expand Down
37 changes: 36 additions & 1 deletion packages/coding-agent/src/cli/daemon-command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import type { AgentSessionRuntimeConfig } from "../core/agent-session-config.js"
import { type AgentCronJob, formatAgentCronJob } from "../core/cron-jobs.js";
import { looksLikeSessionPath } from "../core/session-resolver.js";
import { DaemonClient, type DaemonClientMessageListener } from "../modes/daemon/daemon-client.js";
import type { DaemonOutbound, DaemonResponse } from "../modes/daemon/daemon-protocol.js";
import type { DaemonOutbound, DaemonResponse, SandboxOptions } from "../modes/daemon/daemon-protocol.js";
import { normalizeSandboxOptions } from "../modes/daemon/daemon-protocol.js";
import { matchesSessionIdSuffix } from "../modes/daemon/daemon-session-id.js";
import type { SessionSummary } from "../modes/daemon/daemon-session-list.js";
import { defaultDaemonSocketPath, normalizeSocketPath } from "../modes/daemon/daemon-socket.js";
Expand Down Expand Up @@ -284,6 +285,8 @@ async function runOpen(parsed: ParsedDaemonClientCommand): Promise<void> {
config: sessionArgs.config,
sessionPath: sessionArgs.sessionPath,
continueRecent: sessionArgs.continueRecent,
sandbox: sessionArgs.sandbox,
sandboxOptions: sessionArgs.sandboxOptions,
});
if (response.success || !autoName || !response.error.includes(`Agent name "${sessionName}" is unavailable`)) {
break;
Expand All @@ -307,6 +310,8 @@ interface ParsedSessionArgs {
config?: AgentSessionRuntimeConfig;
sessionPath?: string;
continueRecent?: boolean;
sandbox?: boolean;
sandboxOptions?: SandboxOptions;
}

const SESSION_BOOLEAN_FLAGS = new Set([
Expand Down Expand Up @@ -341,6 +346,8 @@ function parseSessionArgs(args: string[]): ParsedSessionArgs {
const pathBaseCwd = findSessionCwdArg(args) ?? process.cwd();
let sessionPath: string | undefined;
let continueRecent: boolean | undefined;
let sandbox: boolean | undefined;
let sandboxOptions: SandboxOptions | undefined;

for (let index = 0; index < args.length; index++) {
const arg = args[index];
Expand Down Expand Up @@ -383,6 +390,12 @@ function parseSessionArgs(args: string[]): ParsedSessionArgs {
if (parsedOption.continueRecent !== undefined) {
continueRecent = parsedOption.continueRecent;
}
if (parsedOption.sandbox !== undefined) {
sandbox = parsedOption.sandbox;
}
if (parsedOption.sandboxOptions !== undefined) {
sandboxOptions = parsedOption.sandboxOptions;
}
index += parsedOption.consumed;
continue;
}
Expand All @@ -401,6 +414,8 @@ function parseSessionArgs(args: string[]): ParsedSessionArgs {
config: Object.keys(config).length > 0 ? config : undefined,
sessionPath,
continueRecent,
sandbox,
sandboxOptions: sandboxOptions && Object.keys(sandboxOptions).length > 0 ? sandboxOptions : undefined,
};
}

Expand All @@ -410,6 +425,8 @@ interface ParsedSessionOption {
value?: string;
sessionPath?: string;
continueRecent?: boolean;
sandbox?: boolean;
sandboxOptions?: SandboxOptions;
}

function parseSessionOption(
Expand Down Expand Up @@ -566,6 +583,22 @@ function parseSessionOption(
// Session-specific flag: do NOT propagate to daemon startup args.
return { consumed: 1 };
}
case "--sandbox":
return { consumed: 0, sandbox: true };
case "--sandbox-options": {
const value = readValue();
let parsed: unknown;
try {
parsed = JSON.parse(value);
} catch {
throw new Error("--sandbox-options must be valid JSON");
}
const normalised = normalizeSandboxOptions(parsed);
if (!normalised) {
throw new Error("--sandbox-options contains invalid fields");
}
return { consumed: 1, sandboxOptions: normalised };
}
case "--foreground":
case "--no-detach":
case "--background":
Expand Down Expand Up @@ -782,6 +815,8 @@ async function runCreate(client: DaemonClient, args: string[], json: boolean): P
config: sessionArgs.config,
sessionPath: sessionArgs.sessionPath,
continueRecent: sessionArgs.continueRecent,
sandbox: sessionArgs.sandbox,
sandboxOptions: sessionArgs.sandboxOptions,
});
const data = requireSuccess(response);
if (json) {
Expand Down
99 changes: 99 additions & 0 deletions packages/coding-agent/src/cli/sandbox-runtime-dispatch.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
/**
* Static early CLI dispatch for B14 runtime modes.
*
* Detects the two reserved flags BEFORE normal config/UI/provider/plugin
* startup. Static imports only — no dynamic/inline imports, no `any`,
* no sync fs, no shell, no resources.
*
* Only argv[0] is checked. A standalone "--" at argv[0] passes through.
* If argv[0] IS a reserved flag, dispatch ALWAYS hands it — the process
* never enters normal provider/UI startup. Extra trailing arguments still
* hand (INVALID_RUNTIME_ARGUMENTS) rather than passing through.
* Appearances of a reserved flag at argv[1+] are never intercepted.
*
* Without production orchestration (launcher/publisher/relay host) both
* modes fail closed with ORCHESTRATION_UNAVAILABLE. No sandbox_sessions
* support is advertised.
*
* The dispatch function never calls process.exit() — that is the caller's
* responsibility. The CLI may set exitCode 1 without logging secrets.
*
* No dynamic/inline imports, no `any`, no sync FS, no shell, no
* caller-controlled paths or dependencies.
*/

import { parseSandboxBootstrapMode } from "../core/sandbox-fd3-bootstrap-mode.js";

// ---------------------------------------------------------------------------
// Flags
// ---------------------------------------------------------------------------

const WRAPPER_FLAG = "--prime-agent-fd3-bootstrap";
const RUNTIME_FLAG = "--prime-agent-runtime-fd3";

// ---------------------------------------------------------------------------
// Result types
// ---------------------------------------------------------------------------

export type RuntimeDispatchExitCode = 1;

export type RuntimeDispatchCode = "ORCHESTRATION_UNAVAILABLE" | "INVALID_RUNTIME_ARGUMENTS";

export type RuntimeDispatchResult =
/** Neither reserved flag was present — continue with normal startup. */
| Readonly<{ ok: false; handed: false }>
/** Dispatch handled the flag and the process should exit with the given code. */
| Readonly<{ ok: true; handed: true; code: RuntimeDispatchCode; exitCode: RuntimeDispatchExitCode }>;

// ---------------------------------------------------------------------------
// Detect reserved flag at argv[0]
// ---------------------------------------------------------------------------

/**
* Check whether argv[0] is a reserved runtime flag.
*
* If argv[0] IS a reserved flag the result is ALWAYS handed: the process
* must never pass through to normal provider/UI startup. A valid exact
* 3-element form returns ORCHESTRATION_UNAVAILABLE; any other form returns
* INVALID_RUNTIME_ARGUMENTS. Both use exitCode 1.
*
* Only argv[0] is checked — the normal argument position that replaces the
* default CLI command. A standalone "--" at argv[0] passes through.
* Reserved flags at argv[1+] pass through (normal arguments).
*
* This is synchronous (pure parse) and never calls process.exit().
*/
export function detectReservedArgv(argv: readonly string[]): RuntimeDispatchResult {
// Empty argv or standalone "--" separator — pass through.
if (argv.length < 1 || argv[0] === "--") {
return Object.freeze({ ok: false as const, handed: false as const });
}

// Not a recognised reserved flag — pass through.
if (argv[0] !== WRAPPER_FLAG && argv[0] !== RUNTIME_FLAG) {
return Object.freeze({ ok: false as const, handed: false as const });
}

// argv[0] IS a reserved flag — always hand.
// Pass the full argv to the accepted mode parser.
const raw = parseSandboxBootstrapMode(argv);

if (raw.ok) {
// Flag, --ready-nonce, and hex are all valid.
// Without hosted orchestration, fail closed.
return Object.freeze({
ok: true as const,
handed: true as const,
code: "ORCHESTRATION_UNAVAILABLE" as const,
exitCode: 1 as const,
});
}

// Flag recognised but malformed (wrong length, wrong nonce, extras, etc.)
return Object.freeze({
ok: true as const,
handed: true as const,
code: "INVALID_RUNTIME_ARGUMENTS" as const,
exitCode: 1 as const,
});
}
21 changes: 14 additions & 7 deletions packages/coding-agent/src/core/agent-messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ export interface AgentSessionMessagePayload {
/** Sender relationship from the receiver's point of view. */
fromRelationship?: AgentFamilyRelationship;
target: AgentSessionMessageEndpoint;
semanticDigest?: string;
}

export interface AgentSessionMessageDetails {
Expand All @@ -126,6 +127,8 @@ export interface AgentSessionMessageDetails {
from?: AgentSessionMessageSender;
fromRelationship?: AgentFamilyRelationship;
target?: AgentSessionMessageEndpoint;
/** Canonical SHA-256 digest used for transcript idempotency verification. */
semanticDigest?: string;
}

export interface AgentSessionMessage extends CustomMessage<AgentSessionMessageDetails> {
Expand Down Expand Up @@ -409,18 +412,22 @@ export function createAgentSessionMessage(
payload: AgentSessionMessagePayload,
timestamp = Date.now(),
): AgentSessionMessage {
const details: AgentSessionMessageDetails = {
id: payload.id,
message: payload.message,
from: payload.from,
fromRelationship: payload.fromRelationship,
target: payload.target,
};
if (typeof payload.semanticDigest === "string" && /^[0-9a-f]{64}$/.test(payload.semanticDigest)) {
details.semanticDigest = payload.semanticDigest;
}
return {
role: "custom",
customType: AGENT_MESSAGE_CUSTOM_TYPE,
content: createAgentSessionMessagePrompt(payload),
display: true,
details: {
id: payload.id,
message: payload.message,
from: payload.from,
fromRelationship: payload.fromRelationship,
target: payload.target,
},
details,
timestamp,
};
}
Expand Down
Loading
Loading