Commit Graph
10282 Commits
Author SHA1 Message Date
Huanqi Cao d18dc76b89 chore(docs): regenerate module graph for merged tree
The merge-forward took the parent's module-graph verbatim; the merged
tree adds the sandbox-windows-acl package and dsh-session edges.
verify-module-graph is a ci-static gate, not in local doc-sync.
2026-08-09 03:19:09 +08:00
Huanqi Cao 5e080849aa Merge remote-tracking branch 'origin/feat/windows-pwsh-default' into feat/windows-acl-sandbox
# Conflicts:
#	apps/cli/reference/README.i18n.yaml
#	docs/cordis-catalog/services.md
#	docs/module-graph.md
#	docs/subsystems/sandbox.i18n.yaml
#	packages/sandbox/sandbox/README.i18n.yaml
#	pnpm-lock.yaml
#	scripts/verify-package-readme-model-experience.ts
2026-08-09 02:53:48 +08:00
Huanqi Cao cb6ff7e1f8 Merge remote-tracking branch 'origin/master' into feat/windows-pwsh-default
# Conflicts:
#	apps/cli/reference/README.i18n.yaml
#	pnpm-lock.yaml
2026-08-09 02:24:25 +08:00
Huanqi Cao 55fd6e555a fix(knip): restore pwsh-sandbox entry body mangled by merge
The merge-forward collapsed the pwsh-sandbox key with the parent's
e2b entry into invalid JSON; restore the branch's original entry
alongside the kept e2b entry.
2026-08-09 02:14:45 +08:00
Tianyi Cui 0543a6f79d Merge pull request #1137 from deepseek-harness/worktree-docs-subsystems-readme
docs: package-anchored subsystem pages — core.md owns the agent contract, thin group READMEs, enforced folder index
2026-08-09 02:07:27 +08:00
Huanqi Cao 2bfc8273ee fix(pty-local): expect sessionId in resolved policy after merge-forward
Master's pty-local rewrite dropped the sessionId expectation from the
resolved-policy contract; sandbox-policy resolve() injects the owner
sessionId (sandbox branch design). Restore it in both expectations.
2026-08-09 01:56:53 +08:00
Tianyi Cui a2aa567371 docs(subsystems): open core.md on agent creation/ownership and the Agent contract; enforce a complete folder index
core.md claimed to be the packages/core reference but opened on repo-wide type patterns and never documented the ownership vocabulary: AgentHandle, CreateAgentOptions, ResumeAgentOptions, and AgentFactory were TYPE_LINK_EXEMPTIONS pointing at a package README, invisible to the folder that calls itself the type reference. The page now reads spine map -> creation and ownership (AgentHandle pasted; the options and factory summarized with links into the generated registry section) -> the Agent handle (AgentStatus, AgentOptions, SteeringOutcome, SteeringReceipt, and SettleReason now pasted; the one settlement prose wall split by topic; delivery vocabulary ordered as a message travels) -> initiator -> interception -> a Sessions summary -> the ToolDefinition pointer -> an explicitly framed repo-wide patterns tail (the ...Map pattern, branded ids). The duplicate SessionEvent paste is gone -- session.md owns it and LINK_MAP follows -- the four ownership types moved from TYPE_LINK_EXEMPTIONS into LINK_MAP -> core.md, and three dead LINK_MAP entries (ContinuationDecision, ContinuationStop, HookContext) no longer name types absent from the source tree. The "what this page owns" meta-section folds into the intro.

The subsystems README index silently lost tasks.md and session-reference.md on both language sides during a base absorption; the rows are restored and scripts/project-doc-site.spec.ts now fails when any page misses either side of the index (proven red on a removed row). tools.md links ToolSchema to its llm-streaming.md declaration instead of calling it core; subagent.md links AgentHandle and CreateAgentOptions.seed to the new section. A new Agent Note records the package-anchored page-scoping decision; the 2026-06-20 catalog note marks its spine-vs-seam rule superseded as the page-scoping rule while keeping the type-equiv mechanism current, and docs/AGENTS.md cites the new note.
2026-08-09 01:34:23 +08:00
Tianyi Cui aa0ca6c836 docs: anchor each subsystem page to its package group; make group READMEs thin tables
core.md read as a type grab-bag: LLM wire vocabulary up front, the agent/loop story buried, and no correspondence to packages/core. It now opens on the packages/core control spine — the package-by-package loop map with a Page column into session/system-prompt/tools/scope — and keeps only what the spine group declares plus the repo-wide patterns: the Agent handle with its delivery/cancellation/interception contracts, the SessionEvent envelope, branded ids, the …Map pattern. The conversation vocabulary (Message/ContentBlock, the model request, adapters — 17 type-equiv blocks) moves to llm-streaming.md, which now declares packages/llm end-to-end; the duplicate ContentBlockMap paste near its seam section folds into the moved section, and the manifest, LINK_MAP, README table rows, website label (Core data structures → Core), and inbound anchors follow.

Every packages/<group>/README pair is now a thin front door in one shape: a why-first intro (bash's seam-pattern-first paragraph rewritten as 'shell execution for the agent'), the package table, and a closing pointer to the owning docs/subsystems page — the bash-style table stays the load-bearing middle. Load-bearing trailing paragraphs relocate rather than vanish: the fs no-timeout rationale becomes a filesystem.md section (both languages), session's four sectioned tables merge into one 12-row table, examples' legacy-bin H2 collapses to a pointer at jsonrpc-demo's README, and design rationale that already lives in an Agent Note or subsystem page is now linked instead of restated. All 40 pair records re-recorded.
2026-08-09 01:32:39 +08:00
Tianyi Cui 2886ba45db docs: give subsystems/ its own README index; retire the data-structures-catalog framing
core.md doubled as the folder index: its intro claimed "this folder catalogs the data structures" and carried the 38-row page table, wording that predates the one-page-per-subsystem shape where every page also carries its generated Cordis surface. The folder index now lives in docs/subsystems/README.md (page table plus the type-equiv note), and core.md is one subsystem page among siblings: the spine vocabulary. Structural referents move with it: the docs/AGENTS.md tier table and update rule, development.md's type-equiv pointer, the dsh-code-review skill, the two owning catalog Agent Notes, and website/docs.ts (README projects as reference/subsystems/index.md and takes the docs/subsystems folder alias; sidebar orders shift by one). Remaining "data-structure catalog" / "sub-page" phrasing in active notes and READMEs is reworded to subsystem-page terms in both languages; touched pairs re-recorded; translation-prompt snapshot re-recorded (its example embeds development.md).
2026-08-09 01:32:39 +08:00
Tianyi Cui f7323354bb docs: generate each subsystem's cordis surface into its own page; delete the flat catalogs
Rebuild of the region machinery (PR3) on the post-#904 Typert projection:
renderPageRegion/renderInheritedPage live in dsh-typert-generator beside the
projection; scripts/gen-cordis-catalog.ts owns the curated SERVICE_PAGE /
EVENT_SCOPE_PAGE / SERVICE_WALK_EXEMPTIONS / LINK_MAP partition (fail-loud in
both directions, with the independent Context-merge scan backstopping the
projection's blind spot), spliceRegion, and the guarded pair auto-record.
docs/cordis-catalog/ is deleted: the flat events/services catalogs dissolve
into per-page regions and docs/cordis-catalog/core moves to docs/cordis-api/
with the inherited tier as its own generated page. The partition absorbs the
post-regrouping surface: ctx.typert → invariants.md, ctx.directoryPicker →
workspace.md, skills/* events → skills.md, and the four launcher-provided tui
accessor values join the named exemptions.
2026-08-09 01:31:57 +08:00
Tianyi Cui 44b035c711 docs: qualify plan-mode timing and workspace no-write claims
ds-review-bot round 3:
- set() after a turn's final step lands in a later turn (selection
  never forces continuation) — the same-turn phrasing overstated the
  guarantee; set() JSDoc + subsystem page (both languages).
- Workspace attach/insert/detach no-op claims now carry the
  filtered-candidate-prune caveat: mutate() durably prunes stale
  candidates even when the requested change is a no-op, a state the
  sessionIds contract explicitly permits; Workspace fence re-synced on
  both page sides; catalogs regenerated.
2026-08-09 01:28:29 +08:00
Tianyi Cui 3e1c7351be docs: state the plan-mode flush as a step boundary
ds-review-bot round 2: set() during an open multi-step turn applies at
the next request derivation in that same turn, so 'next turn boundary'
misstated the public timing contract (and propagated into the generated
catalogs). set()'s JSDoc, the module JSDoc, the pending-intent field
comment, and the subsystem page (both languages) now say step boundary;
catalogs regenerated; plan pair re-recorded.
2026-08-09 01:27:20 +08:00
Tianyi Cui bd62b6c032 docs: qualify the telemetry dedupe key as ledger-only
ds-review-bot: ops records deliberately omit event.seq, so the
(session.id, event.seq) dedupe advice cannot apply to them — they are
alert signals that tolerate duplicates. Both language sides; pair
re-recorded.
2026-08-09 01:27:20 +08:00
Tianyi Cui 0dd3ac14eb docs: regenerate catalogs after the plan-mode JSDoc expansion shifted source lines
Codex round-2: the two-line module-JSDoc fix moved every later
declaration in packages/plan/plan-mode/src/index.ts, so the three
generated catalogs' source-line links went stale. Three one-line
regenerated updates; doc-sync back to 25/25.
2026-08-09 01:27:20 +08:00
Tianyi Cui 061100f6f2 docs: fix four factual errors found by Codex review round 1
- plan.md/.zh.md (+ plan-mode module JSDoc and README pair): the sole
  flush point is the prepended agent/step listener; prompt admission is
  pre-turn and never flushes — the pages had it backwards.
- workspace.md/.zh.md: pending-mutation recovery deletes the marked
  table row — completing an interrupted delete but rolling back an
  interrupted create; 'completes exactly the marked mutation' oversold.
- telemetry.md/.zh.md: delivery is best-effort with possible loss AND
  duplication, not at-most-once; TelemetryRecord.attributes JSDoc (source
  + both fences) now lists session.seed_length, which the coordinator
  emits for forked sessions.
- Agent Note consequence bullet: nine pages cover ten services (storage
  owns two keys); client-modules.zh.md wire-single-source phrasing.

Pairs re-recorded; plan-mode and telemetry suites green.
2026-08-09 01:27:20 +08:00
Tianyi Cui a8cf78630c docs: align zh subsystem pages with late en-side precision edits
The translators' clause-by-clause verification pass caught the English
pages' final wording refinements (tui built-in dialogs enumeration and
display()'s line-feed exception, invariants whitespace-padded/companion
phrasing, client-modules fiber-lifecycle parenthetical, storage strict
sequence, workspace first-successful-start) landing after the initial
zh versions; this aligns the eight pages and re-records their pairs.
2026-08-09 01:27:20 +08:00
Tianyi Cui 3f9c58855b docs: telemetry subsystem page and Chinese counterparts for the nine new pages
telemetry.md joins the eight pages after the OTel telemetry seam landed
on master (ctx.telemetry + telemetry/record were the one service and
event scope still without a page). All nine pages gain zh counterparts
translated whole-document per dsh-translate-docs; the eleven touched
pairs (nine new + core + the subsystems-catalog note) are recorded;
TelemetryRecord moves from TYPE_LINK_EXEMPTIONS to LINK_MAP and the
catalogs are regenerated.
2026-08-09 01:27:20 +08:00
Tianyi Cui e3af8d2ed2 docs: add eight lean subsystem pages covering every remaining service
permission, plan, invariants, http-server, storage (hub + backend seam +
domain form + domain/changed), workspace, tui, and client-modules complete
the docs/subsystems tier: every ctx service and event scope now has one
owning page, the precondition for generating per-subsystem service/event
reference into these pages. 25 new type-equiv manifest entries; 16 types
move from TYPE_LINK_EXEMPTIONS to LINK_MAP now that they have catalog
homes (dead InvariantRegistration exemption removed; catalogs
regenerated); core.md's sub-page table gains the eight rows in both
languages; the owning subsystems-catalog Agent Note records the coverage
extension. Chinese counterparts and pair records follow in the next
commit.
2026-08-09 01:27:20 +08:00
Tianyi Cui cf5e53e051 docs: fix stale package README claims found while writing subsystem pages
- dsh-host-webserver: the service is HttpServerService under ctx.httpServer
  (README said WebServerService/ctx.webServer, matching no symbol in source),
  and the dev-mode bundle-watch paragraph described machinery that moved to
  dsh-client-modules/dsh-client-hmr in the webserver rewrite — removed; those
  packages' READMEs already document the current pipeline.
- dsh-workspace: ctx.workspace.touchSession(id) does not exist; the
  activity-pinning chain was replaced by Workspace.insertSessionBefore
  (2026-07-25 session-list note) — the bullet now documents the real method.
- packages/storage group table: the domain package directory is
  storage-domain/, not domain/.

All three pairs updated on both sides and re-recorded.
2026-08-09 01:27:20 +08:00
Tianyi Cui ba3125234a docs: rename core-data-structures/ to subsystems/
The folder is becoming the home of one-doc-per-subsystem pages (intro +
data structures + cordis services/events), so the name must describe the
whole contract, not just the type-vocabulary third of it. Mechanical
rename rebuilt on current master: every inbound Markdown link, generator
constant, website route, type-equiv manifest path, and spec expectation
moves together; the zh sides of the notes whose prose names the folder
are aligned (子系统) in the same change; touched bilingual pairs
re-recorded; translation-prompt snapshot re-recorded (its example embeds
development.md). Historical Agent Note slugs keep their dated
filenames.
2026-08-09 01:27:09 +08:00
Tianyi Cui 36cf4f32f4 docs(agent-note): flip the regrouping note to implemented
Move the triplet to implemented/architecture/, rewrite Proposal into a
present-tense Decision, fold Acceptance criteria and Risks into
Consequences (recording what pins the result), retitle the migration
section to what the move actually touched, and repoint the seven
inbound FIXME/README links.
2026-08-09 01:25:24 +08:00
Tianyi Cui 2a40cbf8ef refactor(packages): merge timeout/ into guard/, rename cordis/ to self-modification/
git mv timeout-policy beside repeat-tool-guard (both are loop-hygiene
policies on the tool-execution pipeline, and the timeout/ group name
collided with util/timeout) and tool-cordis into self-modification/
(naming the role the framework name obscured). Merged/renamed group
README triplets, tsconfig globs, generator sources, hierarchy tables,
catalogs, and the timeout-policy design note's group references
follow. Adds the fifth FIXME marker (dsh-timeout-guard, recorded as a
suggestion to settle at resolution time).

guard + self-modification suites: 197 passed.
2026-08-09 01:21:12 +08:00
Tianyi Cui 3fc35c91ff refactor(packages): dissolve ui/ and rename sdk/ to scaffold/
git mv per the regrouping RFC: the five human-collaboration seams and
tui join packages/interaction/, app-boot becomes packages/boot/, and
jsonrpc joins the renamed scaffold/ (formerly sdk/) as its server half
beside client/protocol/create-sdk/helper/scripts/telemetry, whose
folders drop the legacy sdk- prefix. Three new group README triplets
replace the ui/ and sdk/ ones; tsconfig references/paths/globs,
knip keys, vitest globs, gate scripts, catalogs, docs, and the
lockfile follow. Adds the four settled FIXME rename markers
(dsh-sdk-server, dsh-sdk-telemetry, dsh-sdk-helper, dsh-sdk-scripts).

The scaffold folders diverge from their npm names until those renames
land, so tsconfig.base.json maps the three affected names explicitly
beside the group wildcard. Also repairs two pre-existing stale-path
classes the strengthened sweep surfaced: docs/web-styling.md's retired
web-ui host package and type-model spec fixture-literal joins.

app-boot's three Loader-composition specs time out at the default 5s
under full-suite parallel load on this filesystem (pre-existing;
pass isolated with --testTimeout=30000); interaction/scaffold/boot
suites otherwise green (687 passed).
2026-08-09 01:21:12 +08:00
Tianyi Cui 7e445c3a67 refactor(session): fold the session family into packages/session/
git mv the 12 packages from session-persistence/, session-projection/,
session-title/, and telemetry/ into one session/ group per the
regrouping RFC; merge the four group READMEs into one bilingual
triplet; rewrite the group segment in tsconfig references (intra-group
references shorten to ../<pkg>), tsconfig.base.json paths/globs,
knip.json keys, vitest include, gate scripts, and authored doc/note
citations; regenerate module graph, doc graphs, catalogs, and the
lockfile importer keys. No npm names change.

Full unit suite: 8779 passed; the 18 reported failures reproduce as
env flakes (ambient-proxy IPv6 tunneling, watched-dir inotify
timeouts under parallel load) — each passes in isolation with
NO_PROXY set, matching their known pre-existing behavior on master.
2026-08-09 01:21:11 +08:00
Tianyi Cui 645fcf5713 docs(agent-note): propose packages/ regrouping by measured clustering
RFC settling the target group map: fold the session family into one
session/ group, dissolve ui/ into interaction/ (+tui), boot/, and the
scaffold/ developer-tooling family (absorbing jsonrpc as server),
merge timeout/ into guard/, and rename cordis/ to self-modification/.
Zero npm renames now; five FIXME-tracked intended renames. Squash of
the reviewed RFC iterations (turtle1999 map corrections applied).
2026-08-09 01:21:10 +08:00
Tianyi Cui f3b76e1afa Merge pull request #2072 from deepseek-harness/worktree/fix-e2b-pty-sandbox-policy-test
test(e2b): mount sandbox policy in live PTY composition
2026-08-09 01:13:07 +08:00
Tianyi Cui 047348300a Merge pull request #2069 from deepseek-harness/worktree/auto-i18n-merge-driver
feat(i18n): compose pairing records during merges
2026-08-09 01:12:05 +08:00
Tianyi Cui f34b2bb634 ci(e2b): add manual live sandbox workflow 2026-08-09 00:51:56 +08:00
Tianyi Cui 58b89fb6b4 test(i18n): align merge failure fixtures 2026-08-09 00:50:13 +08:00
Tianyi Cui 9c13a62702 fix(i18n): preserve merge conflicts without runtime 2026-08-09 00:37:46 +08:00
Huanqi Cao 97a62fa639 Merge remote-tracking branch 'origin/feat/windows-pwsh-default' into feat/windows-acl-sandbox
# Conflicts:
#	docs/module-graph.md
#	knip.json
#	packages/pty/pty-local/tests/index.spec.ts
#	scripts/check-workspace-constraints.ts
2026-08-09 00:29:55 +08:00
Huanqi Cao 544290f3b6 Merge remote-tracking branch 'origin/master' into HEAD 2026-08-09 00:22:50 +08:00
Huanqi Cao db7bcbdf91 test(sandbox): cover the durable-record typeof guards and the empty-workspace branch 2026-08-09 00:06:50 +08:00
Tianyi Cui b77dbf8ad8 fix(e2b): mount sandbox policy in live PTY test 2026-08-09 00:06:26 +08:00
Huanqi Cao 18859c408c fix(sandbox): record the dsh-session dependency in the lockfile 2026-08-08 23:59:52 +08:00
Tianyi Cui 9f2a6d6fff Merge pull request #1978 from deepseek-harness/worktree/unify-github-label-taxonomy
cleanup: unify GitHub label taxonomy
2026-08-08 23:24:38 +08:00
Huanqi Cao 6478da61e3 fix(sandbox): harden the per-session record and the ACL runner failure paths (review round v6)
Durable record: bound to the owning session id and validated at the fold (orphan-SID shape, temp path inside the host temp root) — a fork's copied parent record no longer provisions the child, and a tampered record fails loud. Private temp dir: random unguessable name persisted in the record, created exclusively (pre-existing entries and reparse points fail EEXIST). Persistence: a fresh provision kicks an immediate flush (no write-behind debounce), narrowing the crash window to the flush latency — documented as the one self-healing gap. Runner-failure rules: exit-gated on 127 so a confined command that prints the signature on a non-127 exit is never misclassified. Spawn: AssignProcessToJobObject failure terminates the suspended child (no hanging orphans). SandboxExecutionPolicy.sessionId is the branded SessionId. Boundary docs: qualifying clause on the absolutist sentences, NULL-DACL Known Limitation, 'full' scoped to the supported NTFS surface, CLM gate comment.
2026-08-08 23:23:38 +08:00
Tianyi Cui 33312c6a89 Merge pull request #796 from deepseek-harness/worktree/e2b-poc-20260727
feat(e2b): add one-sandbox FS/subprocess POC
2026-08-08 23:15:49 +08:00
Tianyi Cui 450ec99325 fix(e2b): address the v7 review round
- restore the parent's AGENTS.md body around this branch's e2b row (the
  replay had resurrected the pre-profile-CLI layout, deleting the api/,
  bundle/, settings/, and credentials/ groups); the fs/lsp row
  condensations stay for the word budget
- aggregate the composite rollback failure, not the original error, when
  private state cleanup also fails — a surviving remote group is no
  longer hidden by a later cleanup error (triple-failure regression)
- own the state directory before the makeDir RPC, matching the terminal
  transaction, so a cancellation racing a committed creation still
  enters cleanup
- drop the hidden pollMs parameter defaults; the schemastery default is
  the one home, and tests pass the cadence explicitly
- restore spawn/spawnTerminal graceMs validation to the seam's
  documented bound (the earlier removal cited subprocess-local as not
  validating; it does), with rejection regressions
2026-08-08 22:52:25 +08:00
Tianyi Cui 10fc9405c7 docs(e2b): re-home the overlay section on master's README
Master rewrote the headless README around the profile CLI and removed
cli-demo; the replay had resurrected the old body. The branch's claim is
the E2B overlay section alone, now inserted into master's text with the
credential-gated live composition e2e as the runnable instruction (the
config-file demo runner no longer exists).
2026-08-08 22:19:14 +08:00
Tianyi Cui 0569437ff3 chore(rebase): regenerate third-party notices and the module graph
Master turned THIRD_PARTY_NOTICES.md into generator output (the branch's
hand-added e2b row carried a stale dotenv entry), and the cascade's
ours-side resolution flattened the module graph to the parent's content;
both regenerate from the current tree.
2026-08-08 22:19:13 +08:00
Tianyi Cui e0a31475fc chore(rebase): re-record the packages-README pairing after the cascade
The parent's round-two replay restored master's pairing record while
this branch's e2b group row changes both sides; re-record the pair.
2026-08-08 22:19:13 +08:00
Tianyi Cui 72419bc333 test(e2b): cover the environment tombstone removal
The serializer's undefined-tombstone branch (from the seam's
NodeJS.ProcessEnv migration) removes an ambient entry; the composition
env test now exercises it against the scrubbed ambient KEEP entry.
2026-08-08 22:19:13 +08:00
Tianyi Cui 55c0a44bd9 fix(e2b): trim published files to the hardened allowlist
Master's publication hardening enforces the exact package files list;
the three E2B manifests still published src and d.ts maps.
2026-08-08 22:19:13 +08:00
Tianyi Cui d488330ba4 fix(rebase): migrate the replayed E2B branch onto the rebased parent
The linear replay carried old-lineage content over parent-owned files;
this checkpoint restores them and adapts the branch to the parent's
post-rebase seam:

- restore all pty/lsp/subprocess/code-runtime surfaces to the parent's
  exact content (this branch claims none of them) and drop the net-zero
  code-runtime-e2b/pty-e2b/lsp-e2b residue and its registrations
- widen serializeRemoteEnvironment to the seam's NodeJS.ProcessEnv
  tombstone contract: an explicit undefined removes an ambient entry
- migrate the two E2B fixture Agent stubs to the Inbox-model interface
  and Session.create
- re-apply the branch's gen-doc-graphs roles, THIRD_PARTY_NOTICES e2b
  row, and packages/README group row (trimmed to the doc budget);
  regenerate catalogs and re-record bilingual pairings
2026-08-08 22:19:13 +08:00
Tianyi Cui 6e1ae76c9b test(e2b): satisfy the steer() receipt signature in Agent stubs
Master's steering-receipt API (agent.steer returns SteeringReceipt) reached
this branch through the parent sync; the two E2B live-fixture Agent stubs
return the same rejected-outcome receipt the pty test stubs use.
2026-08-08 22:19:13 +08:00
Tianyi Cui f5866fc202 fix(e2b): address review round on cadence config, disposal, and SDK edge cases
- subprocess-e2b: the 20 ms remote poll cadence becomes a validated pollMs
  Config field (each tick is one control-plane request); the README documents
  the latency-versus-request-count trade.
- subprocess-e2b: extract src/remote.ts owning asError, signalOpts,
  commandOpts, delay, waitTick, and one tolerant signalRemoteGroups shared by
  the pgid-keyed process ladder and sid-keyed terminal ladder, so the two
  teardown paths keep identical error tolerance.
- subprocess-e2b: service disposal aggregates sibling cleanup failures into
  one AggregateError instead of discarding all but the first.
- subprocess-e2b: waitForProcessGroupId refuses published group ids <= 1, so
  a same-UID rewrite of the pid file cannot aim termination at kill -- -1;
  README documents the same-UID control-state limitation.
- subprocess-e2b: drain-grace expiry now releases an inherited-output E2B
  callback blocked on host backpressure before disconnecting, so the SDK
  settlement cannot stay pinned behind an unread host stream.
- subprocess-e2b: spawn/spawnTerminal stop validating typed spec fields
  (trust-TypeScript rule; pty-local validates its config before specs exist);
  resolveExecutable rejects separator-containing relative paths per the seam
  contract; terminal setups tracked as a Set of records.
- subprocess-e2b: PTY output push-without-backpressure is a documented
  contract (flowing consumer folds bytes; paused consumer buffers).
- fs-e2b: streamText normalizes the pinned SDK's empty-file '' return into an
  empty stream instead of throwing on getReader().
- e2b overlays: comment the one-world cwd invariant across e2b.cwd,
  workspaceRoot, and bash-local's implicit default workdir.
2026-08-08 22:19:13 +08:00
Tianyi Cui e6b3afbee9 docs(e2b): remove code runtime residue 2026-08-08 22:19:13 +08:00
Tianyi Cui 26b18ba189 refactor(e2b): keep code runtime host-local 2026-08-08 22:19:13 +08:00
Tianyi Cui 258bd4456b test(e2b): poll sandbox list convergence 2026-08-08 22:19:13 +08:00