A max-tokens response that included a tool call persisted assembler-transformed content next to replay metadata projected from the untransformed native message, so the next request died in history reconstruction with INVALID_REPLAY_STATE and the session stayed permanently stuck. Write side: the finish chunk's replayState becomes a typed ReplayEnvelope — opaque response-level metadata plus optional per-block entries aligned with the emitted block sequence. BlockAssembler computes one keep/drop decision for blocks and entries together, so stored metadata always describes stored content and retained blocks keep their signatures. pi-ai splits its state into a version-2 response half and per-block signature entries. Read side: durable content is authoritative. toPiAssistant degrades any unusable state — foreign kind, other versions (including the flat v1 form already on disk), malformed metadata, or content/block mismatches — to the existing provider-neutral conversion with an onReplayDegrade diagnostic instead of failing the request, which un-bricks sessions poisoned before this change. Covered by assembler and replay unit tests, an agent-loop continuation regression, keyless real-composition continuation tests (native pruned-envelope replay and legacy flat-state degrade), and the authored keyless snapshot scenario max-tokens-continue through the assembled ACP app.
extensions/ — the agent modifies its own runtime
English | 中文
Model-facing tools over the live cordis runtime the agent itself runs inside: inspect the loaded plugins and service API, define and run model-written dynamic packages, and retract them again — plus the restricted repository Plugin runtime. Both browser-half packages live here rather than under packages/client/ because they are halves of this subsystem's dual-half packages; the host aggregate excludes them so each face keeps its own compiler program. Design home: the toolset Agent Note.
| Package | Role | ctx key |
|---|---|---|
tool-cordis/ |
Model-facing runtime inspection and dynamic-package tools | registers on ctx.tools |
cordis-host-runner/ |
Definition registry, the node:vm sandbox for host halves, and the request-run round trip |
provides ctx.dynamicCordisRunner |
cordis-client-runner/ |
Browser half of a dual-half package: evaluates the definition into a live browser plugin and answers the run request | client face; provides the browser ctx.dynamicCordisRunner |
ui-cordis/ |
Browser surfaces: the frame-wide panel that operates every definition, and the read-only define card | client face; registers slots |