/** * openRecording — a saved run, reopened as evidence a model can navigate. * * Pattern: pure adapter. One shape in (`Recording`), one shape out * (`TraceToolpackArtifacts`). No engine, no agent, no I/O. * Role: the door between the two halves of this library that already * knew about each other's data and had no way to say so. * * `recordRun(agent)` freezes a run into `{ snapshot, events, structure }` — * the shape a viewer reads. The trace toolpack reads a different shape. * Until now, a team with a recording on disk from last Tuesday and a * question about it had to reassemble the bag by hand, which meant * reassembling it differently in every integration and losing the * narrative and the events on the way. * * const recording = JSON.parse(fs.readFileSync('run.json', 'utf8')); * const tools = traceToolpack(openRecording(recording)); * await callTraceTool(tools, 'run_overview'); * * WHAT SURVIVES THE ROUND TRIP, AND WHAT DOES NOT * ─────────────────────────────────────────────── * A recording is JSON. Everything the toolpack needs from the snapshot * survives that (the commit log, the execution tree, shared state, the * mode discriminants) and so do the events. Two things do not: * * - `controlDeps` is a LOOKUP FUNCTION built by a recorder that watched * the run happen. A function does not serialize, and nothing in a * finished recording can rebuild one. So slices opened over a * recording carry the toolpack's existing "⚠ control edges * unavailable" marker — the honest answer, already written. * - The narrative survives only if it was ATTACHED. `recordRun` * deliberately attaches no narrative recorder (see its header), so a * recording made without `narrative()` has none, and `read_narrative` * is simply not mounted. This function lifts it from the snapshot's * recorder rows when it IS there. * * `structure` — the build-time chart — has no reader in the toolpack: the * toolpack navigates what a run DID, and the chart says what it COULD do. * It is left on the recording for the viewers that draw it. */ import type { TraceToolpackArtifacts } from './types.js'; /** * The recording shape — structurally the `Recording` that `recordRun` * produces, restated here so this module stays a leaf (it must not pull * the recorder layer into a pure adapter's import graph). A `Recording` * satisfies it by construction. */ export interface OpenableRecording { readonly snapshot: unknown; readonly events?: readonly unknown[]; readonly structure?: unknown; } /** A recorder row as it rides `snapshot.recorders`. */ interface RecorderRow { readonly id?: string; readonly name?: string; readonly data?: unknown; } /** * The narrative recorder's row: `data` is an array of `{ text, depth }`. * * @internal Exported for the bug-report bundler, which writes the same lines to * `narrative.txt`. One shape-detector, one answer to "is there a narrative in * this snapshot?" — two copies would disagree the first time the row changes. */ export declare function narrativeFrom(snapshot: { recorders?: readonly RecorderRow[]; }): string[] | undefined; /** * Reopen a saved recording as toolpack artifacts. * * @param recording the `{ snapshot, events, structure }` bundle from * `recordRun(...).toRecording()` — live, or parsed back * from JSON. * @throws when the recording carries no usable snapshot. A toolpack over * an empty bag would answer every question with "nothing * happened", which is the one answer a debugging session must * never be given by mistake. */ export declare function openRecording(recording: OpenableRecording): TraceToolpackArtifacts; export {};