/** * embeddingSummary — what a recording keeps of a vector: its shape, not its * bytes. * * Pattern: pure copy-on-write projection, in the `storedPreview` family — * "summarise structured values rather than serialize them", applied * to the one field measured to dominate a recording's size. * Role: recorders/observability layer. Applied at the RECORDING boundary * (BoundaryRecorder payload capture, `recordRun` freeze), never to * live run state — stages and stores keep their real vectors. * Emits: N/A. * * ── The measurement this exists for ───────────────────────────────────────── * A single retrieval turn's recording measured 2.76 MB in a production RAG * deployment — about 1.1 MB of it embedding floats, because the memory-read * subflow's boundary output carries every retrieved entry, and every entry * carries its full vector (1,024 floats serializing at ~19 bytes each). No * consumer of a recording reads those floats: retrieval debugging needs the * score, the passage, the document and the rejected candidates — all of which * live in the retrieval evidence and none of which this touches. The vector's * only recording-worthy facts are that it existed, its dimensionality, and a * checksum-grade magnitude. That is exactly what `{ dims, norm }` keeps. * * The walk is copy-on-write: a value with no embeddings anywhere is returned * BY REFERENCE, so the common payload costs one traversal and zero * allocation. It never mutates its input — recordings share structure with * live run state, and live state is borrowed, not owned. * * Two spellings are recognised, because the memory layer writes both: * - `embedding: number[]` — a `MemoryEntry`'s vector (read side); * - `embeddings: number[][]` — the write pipeline's per-message batch. * * Idempotent by construction: a summary is not a numeric array, so a value * that has already been summarised passes through unchanged. */ /** What remains of a vector in a recording: dimensionality and L2 norm. */ export interface EmbeddingSummary { readonly dims: number; readonly norm: number; } /** Summarise one vector. Exported for consumers that render recordings. */ export declare function summarizeVector(vector: readonly number[]): EmbeddingSummary; /** * Replace every `embedding` / `embeddings` field in a JSON-ish value with its * `{ dims, norm }` summary. Copy-on-write: returns the SAME reference when * nothing needed replacing; otherwise a structurally-shared copy. Never * mutates the input. * * Shared nodes stay shared: a snapshot holds the same entry object at several * paths (live state, stage writes, commit history), so results are memoized * per input object — every path gets the SAME summarized copy, not one copy * and one raw leak. Cycle-safe: an object seen again while still being walked * resolves to its original reference (a cyclic value could not be serialized * anyway). */ export declare function summarizeEmbeddings(value: unknown): unknown;