@ai-matrx/kit 0.12.1 → 0.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/README.md +3 -0
- package/dist/content-transfer.cjs +1356 -0
- package/dist/content-transfer.cjs.map +1 -0
- package/dist/content-transfer.d.cts +356 -0
- package/dist/content-transfer.d.ts +356 -0
- package/dist/content-transfer.js +1323 -0
- package/dist/content-transfer.js.map +1 -0
- package/dist/index.cjs +1207 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +356 -1
- package/dist/index.d.ts +356 -1
- package/dist/index.js +1207 -3
- package/dist/index.js.map +1 -1
- package/package.json +14 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/json-format/json-value.ts","../src/json-format/format.ts","../src/html-escape.ts","../src/content-transfer/agent-payload.ts","../src/content-transfer.ts"],"sourcesContent":["/**\n * Canonical JSON value types + narrowing guards.\n *\n * Ported (the subset this subpath needs) from matrx-frontend `types/json.ts` —\n * the honest names for \"this is just JSON\" that are NOT `any` and NOT a bare\n * `unknown`. The package must stand alone, so the types live here; a Matrx\n * host keeps using its own `@/types/json` for app code and the two are\n * structurally identical.\n */\n\nexport type JsonPrimitive = string | number | boolean | null;\n\n/**\n * A JSON object. Values are `JsonValue | undefined` so optional keys read\n * cleanly (mirrors Supabase's original generated `Json` object member).\n */\nexport interface JsonObject {\n [key: string]: JsonValue | undefined;\n}\n\nexport type JsonArray = JsonValue[];\n\nexport type JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\n/**\n * Narrow an `unknown` (e.g. a bare JSONB column) to a `JsonObject`.\n * Plain object only — arrays and `null` return false.\n */\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Narrow an `unknown` to a `JsonArray`. */\nexport function isJsonArray(value: unknown): value is JsonArray {\n return Array.isArray(value);\n}\n\n/** Narrow an `unknown` to a JSON primitive (string | number | boolean | null). */\nexport function isJsonPrimitive(value: unknown): value is JsonPrimitive {\n return (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n );\n}\n","// json-format/format.ts\n//\n// The JSON writer. Three styles over one recursive printer:\n//\n// minify — one line, no optional whitespace.\n// compact — width-aware FILL. Any subtree whose flat form fits the remaining\n// columns is inlined; a subtree that does not fit expands, but its\n// children are then PACKED onto shared lines while they fit. This\n// is what turns an 11-line reference blob into 3 lines without\n// turning it into an unreadable one-liner.\n// pretty — one entry per line (classic 2-space JSON).\n//\n// Why not `JSON.stringify(v, null, 2)`: it cannot inline, cannot pack, and\n// cannot sort keys. All three are the point.\n//\n// Pure: no React / DOM. Never throws — a parse failure comes back as a result\n// with `ok: false` and the input text unchanged.\n//\n// Ported verbatim from matrx-frontend `lib/json-format/format.ts`.\n\nimport type { JsonObject, JsonValue } from \"./json-value\";\nimport { isJsonArray, isJsonObject } from \"./json-value\";\nimport { detectJson } from \"./detect\";\nimport type {\n JsonDetection,\n JsonFormatOptions,\n JsonFormatResult,\n JsonTextSize,\n} from \"./types\";\n\nexport const DEFAULT_JSON_INDENT = 2;\nexport const DEFAULT_JSON_WIDTH = 100;\n\ninterface WriterConfig {\n indent: number;\n /** Target line width; `-1` disables inlining entirely (pretty). */\n width: number;\n /** Pack sibling entries onto shared lines (compact only). */\n pack: boolean;\n /** Spaces inside braces/brackets and after colons/commas. */\n spaced: boolean;\n sortKeys: boolean;\n}\n\nfunction orderedKeys(obj: JsonObject, sortKeys: boolean): string[] {\n // `undefined` values are not JSON — JSON.stringify drops them, so do we.\n const keys = Object.keys(obj).filter((k) => obj[k] !== undefined);\n return sortKeys ? [...keys].sort((a, b) => a.localeCompare(b)) : keys;\n}\n\n/** Serialize a scalar exactly as JSON does. */\nfunction writeScalar(value: JsonValue): string {\n // NaN / Infinity stringify to \"null\", matching JSON.stringify.\n return JSON.stringify(value) ?? \"null\";\n}\n\n/** The whole subtree on one line. */\nfunction flatten(value: JsonValue, cfg: WriterConfig): string {\n if (isJsonArray(value)) {\n if (value.length === 0) return \"[]\";\n const parts = value.map((v) => flatten(v ?? null, cfg));\n return cfg.spaced ? `[${parts.join(\", \")}]` : `[${parts.join(\",\")}]`;\n }\n if (isJsonObject(value)) {\n const keys = orderedKeys(value, cfg.sortKeys);\n if (keys.length === 0) return \"{}\";\n const colon = cfg.spaced ? \": \" : \":\";\n const parts = keys.map(\n (k) => `${JSON.stringify(k)}${colon}${flatten(value[k] ?? null, cfg)}`,\n );\n return cfg.spaced ? `{ ${parts.join(\", \")} }` : `{${parts.join(\",\")}}`;\n }\n return writeScalar(value);\n}\n\n/**\n * Lay out `entries` (already-rendered child texts) inside a container.\n * Single-line entries are packed together while they fit; a multi-line entry\n * always occupies its own line(s). Returns the body lines, unindented-prefixed\n * with `pad` already applied.\n */\nfunction layoutEntries(\n entries: string[],\n pad: string,\n cfg: WriterConfig,\n): string[] {\n if (!cfg.pack) return entries.map((e) => pad + e);\n\n const lines: string[] = [];\n let current = \"\";\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i] ?? \"\";\n const isLast = i === entries.length - 1;\n const piece = isLast ? entry : `${entry},`;\n\n if (entry.includes(\"\\n\")) {\n // Multi-line child: flush whatever is buffered, then stand alone.\n if (current !== \"\") {\n lines.push(pad + current);\n current = \"\";\n }\n lines.push(pad + piece);\n continue;\n }\n\n if (current === \"\") {\n current = piece;\n continue;\n }\n const merged = `${current} ${piece}`;\n if (pad.length + merged.length <= cfg.width) {\n current = merged;\n } else {\n lines.push(pad + current);\n current = piece;\n }\n }\n if (current !== \"\") lines.push(pad + current);\n return lines;\n}\n\n/**\n * Render `value` starting at column `used` on its current line, at nesting\n * `level`. `used` includes the indentation AND any key prefix already written,\n * so the width budget is honest about `\"items\": [` style prefixes.\n */\nfunction renderNode(\n value: JsonValue,\n level: number,\n used: number,\n cfg: WriterConfig,\n): string {\n const isContainer = isJsonArray(value) || isJsonObject(value);\n if (!isContainer) return writeScalar(value);\n\n const flat = flatten(value, cfg);\n if (flat === \"[]\" || flat === \"{}\") return flat;\n if (cfg.width >= 0 && used + flat.length <= cfg.width) return flat;\n\n const pad = \" \".repeat((level + 1) * cfg.indent);\n const closePad = \" \".repeat(level * cfg.indent);\n\n if (isJsonArray(value)) {\n const entries = value.map((v) =>\n renderNode(v ?? null, level + 1, pad.length, cfg),\n );\n const body = layoutEntries(entries, pad, cfg);\n const joined = cfg.pack ? body.join(\"\\n\") : body.join(\",\\n\");\n return `[\\n${joined}\\n${closePad}]`;\n }\n\n const keys = orderedKeys(value, cfg.sortKeys);\n const entries = keys.map((k) => {\n const prefix = `${JSON.stringify(k)}: `;\n const rendered = renderNode(\n value[k] ?? null,\n level + 1,\n pad.length + prefix.length,\n cfg,\n );\n return prefix + rendered;\n });\n const body = layoutEntries(entries, pad, cfg);\n const joined = cfg.pack ? body.join(\"\\n\") : body.join(\",\\n\");\n return `{\\n${joined}\\n${closePad}}`;\n}\n\n/**\n * Serialize a JSON value in one of the three styles. This is the entry point\n * for callers that already HAVE a value (a DB JSONB blob, an API frame) and\n * just want it laid out; text callers want {@link formatJsonText}.\n */\nexport function stringifyJson(\n value: JsonValue,\n options: JsonFormatOptions,\n): string {\n const indent = options.indent ?? DEFAULT_JSON_INDENT;\n const sortKeys = options.sortKeys ?? false;\n\n if (options.style === \"minify\") {\n return flatten(value, { indent, width: -1, pack: false, spaced: false, sortKeys });\n }\n\n const cfg: WriterConfig = {\n indent,\n width: options.style === \"pretty\" ? -1 : (options.width ?? DEFAULT_JSON_WIDTH),\n pack: options.style === \"compact\",\n spaced: true,\n sortKeys,\n };\n return renderNode(value, 0, 0, cfg);\n}\n\nfunction sizeOf(text: string): JsonTextSize {\n let lines = text === \"\" ? 0 : 1;\n for (let i = 0; i < text.length; i++) if (text[i] === \"\\n\") lines++;\n return { lines, chars: text.length };\n}\n\n/** Re-assemble the full text: leading + fence + formatted payload + trailing. */\nfunction reassemble(\n detection: JsonDetection,\n payload: string,\n mode: NonNullable<JsonFormatOptions[\"fence\"]>,\n): string {\n const { fence, leading, trailing } = detection;\n\n const keepFence =\n mode === \"add\" || (mode === \"preserve\" && fence !== null);\n if (!keepFence) {\n return leading + payload + trailing;\n }\n\n const marker = fence?.marker ?? \"```\";\n const lang = fence?.lang && fence.lang !== \"\" ? fence.lang : \"json\";\n const indent = fence?.indent ?? \"\";\n const body = indent\n ? payload\n .split(\"\\n\")\n .map((l) => (l === \"\" ? l : indent + l))\n .join(\"\\n\")\n : payload;\n\n // An unterminated source fence stays unterminated — inventing a closing fence\n // would change the surrounding document's structure, not just this block's.\n const close = fence !== null && !fence.closed ? \"\" : `\\n${indent}${marker}`;\n return `${leading}${indent}${marker}${lang}\\n${body}${close}${trailing}`;\n}\n\n/**\n * Format the JSON found in `text`, preserving everything around it.\n *\n * Never throws. When the text does not parse, the result is `ok: false`,\n * `changed: false`, and `text` is the input verbatim — a formatter that\n * mangles text it did not understand is a data-loss bug.\n */\nexport function formatJsonText(\n text: string,\n options: JsonFormatOptions,\n): JsonFormatResult {\n const detection = detectJson(text);\n const before = sizeOf(text);\n\n if (!detection.ok || detection.value === undefined) {\n return {\n ok: false,\n text,\n error: detection.error ?? \"Selection is not JSON.\",\n changed: false,\n detection,\n before,\n after: before,\n };\n }\n\n const payload = stringifyJson(detection.value, options);\n const next = reassemble(detection, payload, options.fence ?? \"preserve\");\n\n return {\n ok: true,\n text: next,\n changed: next !== text,\n detection,\n before,\n after: sizeOf(next),\n };\n}\n","/**\n * @ai-matrx/kit/html-escape — ONE HTML escaper, with a decided character set.\n *\n * WHY THIS FILE EXISTS (2026-09-07 duplication census, row 14). Nine copies of\n * `escapeHtml` were live across the fleet — six in matrx-frontend, one in\n * matrx-extend, one in aidream's dashboard, and one private to\n * `@ai-matrx/print/core` — and **they did not escape the same characters**.\n * Three escaped only `& < >`; two added `\"`; four added `'` (two as `'`,\n * two as `'`). A string that is safe through one of them is an attribute\n * break-out through another. That is not a style difference; it is a latent\n * XSS class with nine independent chances to be wrong.\n *\n * The print package was the wrong owner (an HTML escaper must not require the\n * print engine's `jspdf` + `html2canvas` graph), so it lives here, in the\n * package with no sibling dependencies that everything can reach.\n *\n * THE DECIDED SET: `& < > \" '` → `& < > " '`.\n *\n * All five, always. Escaping the two quote characters is what makes the result\n * safe to interpolate into an unquoted-or-quoted HTML *attribute*, not just\n * into element text — and every caller that only escaped three was one\n * refactor away from being an attribute caller. `'` uses the numeric `'`\n * rather than the named `'`, which is XML, not HTML 4, and rather than\n * `'`, which is the same character with a pointless leading zero.\n *\n * WHAT THIS IS NOT. This escapes text for an HTML *document* context. It is\n * not a sanitiser for untrusted HTML markup (use a real sanitiser), not a\n * JavaScript-string escaper (a `</script>` inside a JSON blob needs\n * `<`), and not a URL encoder.\n */\n\nconst HTML_ESCAPES: Readonly<Record<string, string>> = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n};\n\nconst HTML_ESCAPE_RE = /[&<>\"']/g;\n\n/**\n * Escape `& < > \" '` so `value` is safe as HTML element text or as the\n * contents of a quoted HTML attribute.\n *\n * Non-string input returns the empty string rather than `\"undefined\"` — a\n * literal \"undefined\" rendered into a page is a screen telling a lie.\n */\nexport function escapeHtml(value: string | null | undefined): string {\n if (typeof value !== \"string\") return \"\";\n return value.replace(HTML_ESCAPE_RE, (char) => HTML_ESCAPES[char] ?? char);\n}\n","/** Matrx's portable, source-labelled envelope for external AI tools. */\nexport interface AgentPayloadInput {\n kind: string;\n location: string;\n description: string;\n data: unknown;\n summary?: string;\n attributes?: Record<string, string | number | boolean | null | undefined>;\n context?: Record<string, string | number | boolean | null | undefined>;\n}\n\nexport interface AgentPayloadEnvironment {\n url?: string;\n route?: string;\n capturedAt?: string;\n}\n\nconst escapeXml = (value: string) => value.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\").replace(/\"/g, \""\").replace(/'/g, \"'\");\nconst xmlName = (name: string) => {\n if (!/^[A-Za-z_][A-Za-z0-9_.-]*$/.test(name)) throw new Error(`Invalid AI envelope name: ${name}`);\n return name;\n};\nconst presentEntries = (values?: AgentPayloadInput[\"context\"]) => Object.entries(values ?? {}).filter(([, value]) => value !== null && value !== undefined && value !== \"\");\n\n/** A fence longer than any content fence prevents accidental Markdown closure. */\nexport function fenceJsonBlock(json: string): string {\n const runs = json.match(/`+/g) ?? [];\n const fence = \"`\".repeat(Math.max(3, ...runs.map((run) => run.length + 1)));\n return `${fence}json\\n${json.trimEnd()}\\n${fence}`;\n}\n\n/** Capture location at invocation; environment injection makes non-browser use explicit. */\nexport function buildAgentPayload(input: AgentPayloadInput, environment: AgentPayloadEnvironment = {}): string {\n const kind = xmlName(input.kind);\n const url = environment.url ?? (typeof window === \"undefined\" ? \"\" : window.location.href);\n const route = environment.route ?? (typeof window === \"undefined\" ? \"\" : window.location.pathname);\n const attrs = presentEntries(input.attributes).map(([key, value]) => ` ${xmlName(key)}=\"${escapeXml(String(value))}\"`).join(\"\");\n const entries: Array<[string, string]> = [\n [\"location\", input.location],\n ...(url ? [[\"url\", url] as [string, string]] : []),\n ...(route ? [[\"route\", route] as [string, string]] : []),\n [\"copied\", input.description],\n [\"copied-at\", environment.capturedAt ?? new Date().toISOString()],\n ...presentEntries(input.context).map(([key, value]): [string, string] => [xmlName(key), String(value)]),\n ];\n const json = JSON.stringify(input.data, null, 2);\n if (json === undefined) throw new Error(\"AI envelope data must be JSON serializable.\");\n // The JSON body is Markdown-fenced; escape closing XML delimiters while\n // retaining the original JSON values when parsed (JSON's Unicode escapes).\n const safeJson = json.replace(/</g, \"\\\\u003c\").replace(/>/g, \"\\\\u003e\").replace(/&/g, \"\\\\u0026\");\n const context = entries.map(([key, value]) => `<${key}>${escapeXml(value)}</${key}>`).join(\"\\n\");\n const summary = input.summary ? `<summary>\\n${escapeXml(input.summary)}\\n</summary>\\n` : \"\";\n return `<${kind}${attrs}>\\n<context>\\n${context}\\n</context>\\n${summary}<data format=\"json\">\\n${fenceJsonBlock(safeJson)}\\n</data>\\n</${kind}>`;\n}\n","import { stringifyJson } from \"./json-format\";\nimport { escapeHtml } from \"./html-escape\";\nimport type {\n Artifact,\n CapturedAllMatching,\n CapturedSource,\n Column,\n Draft,\n ExportProjection,\n Json,\n Omission,\n Payload,\n RawSnapshot,\n Snapshot,\n Source,\n Transport,\n TransferScope,\n TransferLimits,\n TransferPreferences,\n SurfaceHandle,\n} from \"./content-transfer/types\";\nexport * from \"./content-transfer/types\";\nexport * from \"./content-transfer/agent-payload\";\n\nexport class ContentTransferError extends Error {\n readonly code: string;\n readonly path: string | undefined;\n\n constructor(\n code: string,\n message: string,\n path?: string,\n ) {\n super(message);\n this.code = code;\n this.path = path;\n }\n}\nconst bound = Symbol(\"bound-all-matching\");\nexport type BoundAllMatching = {\n readonly [bound]: true;\n readonly source: CapturedAllMatching;\n readonly projection: ExportProjection;\n readonly columns: readonly Column[];\n readonly limits?: TransferLimits;\n};\nconst stop = (s: AbortSignal) => {\n if (s.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n};\nconst enc = (x: string) => x.replace(/~/g, \"~0\").replace(/\\//g, \"~1\");\nconst dec = (x: string) => x.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\ntype ClonePolicy = { omitUndefinedObjectProperties?: boolean };\nfunction clone<T extends Json>(\n v: T,\n path = \"\",\n seen = new WeakSet<object>(),\n policy: ClonePolicy = {},\n): T {\n if (v === null || typeof v === \"string\" || typeof v === \"boolean\") return v;\n if (typeof v === \"number\") {\n if (!Number.isFinite(v))\n throw new ContentTransferError(\n \"unsupported-value\",\n \"Only finite numbers are transferable\",\n path,\n );\n return v;\n }\n if (typeof v !== \"object\")\n throw new ContentTransferError(\n \"unsupported-value\",\n \"Unsupported value\",\n path,\n );\n if (seen.has(v))\n throw new ContentTransferError(\n \"circular-value\",\n \"Circular values cannot be transferred\",\n path,\n );\n if (\n !Array.isArray(v) &&\n Object.getPrototypeOf(v) !== Object.prototype &&\n Object.getPrototypeOf(v) !== null\n )\n throw new ContentTransferError(\n \"unsupported-value\",\n \"Only plain JSON objects are transferable\",\n path,\n );\n seen.add(v);\n if (Array.isArray(v)) {\n for (let index = 0; index < v.length; index += 1)\n if (!Object.hasOwn(v, index))\n throw new ContentTransferError(\n \"unsupported-value\",\n \"Sparse arrays cannot be transferred\",\n `${path}/${index}`,\n );\n }\n const out: Json = Array.isArray(v)\n ? v.map((x, i) => clone(x, `${path}/${i}`, seen, policy))\n : Object.fromEntries(\n Object.entries(v)\n .filter(([, x]) => !policy.omitUndefinedObjectProperties || x !== undefined)\n .map(([k, x]) => [\n k,\n clone(x, `${path}/${enc(k)}`, seen, policy),\n ]),\n );\n seen.delete(v);\n return out as T;\n}\nconst maxSurfacePointerSegmentLength = 64;\nconst maxSurfacePointerLength = 192;\nconst truncateSurfacePointer = (value: string, maxLength: number) => {\n const characters = Array.from(value);\n return characters.length > maxLength\n ? `${characters.slice(0, maxLength - 1).join(\"\")}…`\n : value;\n};\nfunction displaySurfacePointer(path: string | undefined): string {\n if (!path) return \"/\";\n const safe = path\n .split(\"/\")\n .slice(1)\n .map((segment) => {\n const controlSafe = segment.replace(/[\\u0000-\\u001F\\u007F-\\u009F]/g, (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, \"0\")}`,\n );\n return truncateSurfacePointer(controlSafe, maxSurfacePointerSegmentLength);\n })\n .join(\"/\");\n const pointer = `/${safe}`;\n return truncateSurfacePointer(pointer, maxSurfacePointerLength);\n}\nfunction cloneSurfaceValue(value: unknown, path: string): Json {\n try {\n return clone(value as Json, path, new WeakSet<object>(), {\n omitUndefinedObjectProperties: true,\n });\n } catch (error) {\n if (error instanceof ContentTransferError)\n throw new ContentTransferError(\n error.code,\n `Surface capture rejected value at ${displaySurfacePointer(error.path)}: ${error.message}`,\n error.path,\n );\n throw error;\n }\n}\n/**\n * Validates arbitrary host data at the transfer boundary and returns a detached\n * JSON value. This deliberately shares the capture validator: undefined,\n * functions, dates, non-finite numbers, and cycles are rejected rather than\n * silently coerced by a JSON stringify round trip.\n */\nexport function normalizeTransferJson(value: unknown): Json {\n return clone(value as Json);\n}\nfunction deepFreeze<T>(v: T): T {\n if (ArrayBuffer.isView(v)) return v;\n if (v && typeof v === \"object\" && !Object.isFrozen(v)) {\n Object.freeze(v);\n for (const x of Object.values(v as object)) deepFreeze(x);\n }\n return v;\n}\nfunction at(v: Json, path: string): Json | undefined {\n validatePointer(path);\n if (path === \"\") return v;\n if (!path.startsWith(\"/\"))\n throw new ContentTransferError(\n \"invalid-path\",\n \"Expected RFC 6901 pointer\",\n path,\n );\n let cur: Json | undefined = v;\n for (const part of path.slice(1).split(\"/\").map(dec)) {\n if (Array.isArray(cur)) cur = cur[Number(part)];\n else if (cur && typeof cur === \"object\")\n cur = Object.hasOwn(cur, part) ? cur[part] : undefined;\n else return undefined;\n }\n return cur;\n}\nfunction validatePointer(path: string): void {\n if ((path !== \"\" && !path.startsWith(\"/\")) || /~(?![01])/u.test(path))\n throw new ContentTransferError(\n \"invalid-path\",\n \"Expected an RFC 6901 JSON pointer\",\n path,\n );\n}\n/** Column ids are identities, never an alternative data address. */\nexport function readTransferCell(\n row: Record<string, Json>,\n column: Column,\n): Json | undefined {\n return at(row, column.path);\n}\nfunction without(\n v: Json,\n paths: readonly string[],\n omit: Omission[],\n path = \"\",\n): Json | undefined {\n if (paths.includes(path)) {\n omit.push({ path, reason: \"excluded\" });\n return undefined;\n }\n if (Array.isArray(v))\n return v\n .map((x, i) => without(x, paths, omit, `${path}/${i}`))\n .filter((x): x is Json => x !== undefined);\n if (v && typeof v === \"object\") {\n const out: Record<string, Json> = Object.create(null);\n for (const [k, x] of Object.entries(v)) {\n const y = without(x, paths, omit, `${path}/${enc(k)}`);\n if (y !== undefined) out[k] = y;\n }\n return out;\n }\n return v;\n}\nfunction projectValue(\n v: Json,\n rules: ExportProjection[\"rules\"],\n target: \"payload\" | \"row\",\n omit: Omission[],\n): Json {\n rules.forEach((rule) => validatePointer(rule.path));\n return (\n without(\n clone(v),\n rules\n .filter(\n (r) =>\n r.target === target &&\n (!r.exportable || r.classification !== \"ordinary\"),\n )\n .map((r) => r.path),\n omit,\n ) ?? null\n );\n}\nfunction normalize(\n p: Payload,\n projection: ExportProjection,\n omit: Omission[],\n): Payload {\n if (p.kind === \"text\" || p.kind === \"markdown\") {\n if (typeof p.text !== \"string\")\n throw new ContentTransferError(\n \"unsupported-value\",\n \"Text payload must contain a string\",\n \"/text\",\n );\n const value = projectValue(p.text, projection.rules, \"payload\", omit);\n return { kind: p.kind, text: typeof value === \"string\" ? value : \"\" };\n }\n if (p.kind === \"json\")\n return {\n kind: \"json\",\n value: projectValue(p.value, projection.rules, \"payload\", omit),\n };\n if (p.kind === \"registered\")\n return {\n kind: \"registered\",\n format: p.format,\n value: projectValue(p.value, projection.rules, \"payload\", omit),\n };\n const rowsPayload = p as Extract<Payload, { kind: \"rows\" }>;\n if (p.kind !== \"rows\")\n throw new ContentTransferError(\n \"invalid-payload\",\n \"Unsupported payload kind\",\n );\n const columns = rowsPayload.columns.map((c) => ({ ...c }));\n resolveTransferRegistry(columns);\n columns.forEach((column) => validatePointer(column.path));\n const rules = [\n ...projection.rules,\n ...columns\n .filter(\n (c) =>\n c.exportable === false ||\n c.classification === \"secret\" ||\n c.classification === \"credential\",\n )\n .map((c) => ({\n target: \"row\" as const,\n path: c.path,\n exportable: c.exportable ?? true,\n classification: c.classification ?? (\"ordinary\" as const),\n })),\n ];\n return {\n kind: \"rows\",\n columns,\n rows: rowsPayload.rows.map((row, index) => {\n if (!row || typeof row !== \"object\" || Array.isArray(row))\n throw new ContentTransferError(\n \"invalid-row\",\n \"A table row must be a JSON object\",\n `/rows/${index}`,\n );\n const projected = projectValue(row, rules, \"row\", omit);\n return projected === null ? {} : (projected as Record<string, Json>);\n }),\n };\n}\nexport function projectSnapshot(\n raw: RawSnapshot,\n projection: ExportProjection,\n): Snapshot {\n const omissions = raw.omissions.map((o) => ({ ...o }));\n const normalized = normalize(raw.payload, projection, omissions);\n const payload = raw.limits\n ? limitPayload(normalized, raw.limits, omissions)\n : normalized;\n const included =\n payload.kind === \"rows\" ? payload.rows.length : raw.coverage.included;\n return deepFreeze({\n ...raw,\n payload,\n coverage: {\n ...raw.coverage,\n included,\n ...(included < raw.coverage.included\n ? { status: \"partial\" as const, reason: \"Source export limit applied\" }\n : {}),\n },\n omissions,\n sections: raw.sections\n .filter(\n (section) =>\n !projection.rules.some(\n (rule) =>\n rule.target === \"payload\" &&\n (!rule.exportable || rule.classification !== \"ordinary\") &&\n (section.path === rule.path ||\n section.path.startsWith(`${rule.path}/`)),\n ),\n )\n .map((x) => ({ ...x })),\n ...(raw.limits ? { limits: { ...raw.limits } } : {}),\n } as Snapshot);\n}\nconst uid = () =>\n globalThis.crypto?.randomUUID?.() ?? `capture-${Date.now()}-${Math.random()}`;\nexport function directSource(\n payload: Payload,\n options: Partial<\n Pick<\n RawSnapshot,\n | \"id\"\n | \"sourceId\"\n | \"revision\"\n | \"label\"\n | \"coverage\"\n | \"unsavedChanges\"\n | \"sections\"\n | \"limits\"\n > & { projection: ExportProjection }\n > = {},\n): CapturedSource {\n const id = options.id ?? uid();\n return {\n projection: options.projection ?? { rules: [] },\n snapshot: {\n id,\n sourceId: options.sourceId ?? id,\n revision: options.revision ?? uid(),\n capturedAt: new Date().toISOString(),\n label: options.label ?? \"Content\",\n payload,\n coverage: options.coverage ?? {\n status: \"complete\",\n included: payload.kind === \"rows\" ? payload.rows.length : 1,\n total: payload.kind === \"rows\" ? payload.rows.length : 1,\n },\n unsavedChanges: options.unsavedChanges ?? false,\n omissions: [],\n sections: options.sections ?? [],\n ...(options.limits ? { limits: { ...options.limits } } : {}),\n },\n };\n}\nexport async function capture(\n source: Source | Payload,\n signal: AbortSignal,\n scope: TransferScope = \"target\",\n): Promise<{ snapshot: Snapshot; allMatching?: BoundAllMatching }> {\n stop(signal);\n const captured =\n \"kind\" in source\n ? directSource(source)\n : await source.capture({ scope, signal });\n stop(signal);\n const all = captured.allMatching;\n if (\n all &&\n (all.query.sourceId !== captured.snapshot.sourceId ||\n all.query.revision !== captured.snapshot.revision ||\n all.query.order.length === 0)\n )\n throw new ContentTransferError(\n \"query-mismatch\",\n \"All-matching query must be captured with stable ordering\",\n );\n const snapshot = projectSnapshot(captured.snapshot, captured.projection);\n if (!all) return { snapshot };\n return {\n snapshot,\n allMatching: deepFreeze({\n [bound]: true as const,\n source: {\n ...all,\n query: {\n ...all.query,\n query: clone(all.query.query),\n order: all.query.order.map((x) => ({ ...x })),\n },\n },\n projection: { rules: captured.projection.rules.map((x) => ({ ...x })) },\n columns: snapshot.payload.kind === \"rows\" ? snapshot.payload.columns : [],\n ...(snapshot.limits ? { limits: { ...snapshot.limits } } : {}),\n }),\n };\n}\nexport function createDraft(s: Snapshot): Draft {\n return deepFreeze({\n snapshotId: s.id,\n sourceId: s.sourceId,\n sourceRevision: s.revision,\n revision: 0,\n payload: normalize(s.payload, { rules: [] }, []),\n omissions: [...s.omissions],\n manuallyEdited: false,\n provenance: [{ kind: \"original\", description: \"Captured source snapshot\" }],\n });\n}\nfunction revise(\n d: Draft,\n p: Payload,\n o: Omission[],\n description: string,\n manual = d.manuallyEdited,\n kind: Draft[\"provenance\"][number][\"kind\"] = \"deterministic\",\n baseOmissions: readonly Omission[] = d.omissions,\n): Draft {\n const { history: _history, ...previous } = d;\n return deepFreeze({\n ...d,\n revision: d.revision + 1,\n payload: normalize(p, { rules: [] }, []),\n omissions: [...baseOmissions, ...o],\n manuallyEdited: manual,\n provenance: [...d.provenance, { kind, description }],\n history: [...(d.history ?? []), previous],\n });\n}\nexport const editDraft = (d: Draft, p: Payload) =>\n revise(d, p, [], \"Manual edit\", true, \"manual\");\nexport const resetDraft = (s: Snapshot) => createDraft(s);\nexport const sourceChanged = (d: Draft, s: Snapshot) =>\n d.sourceId !== s.sourceId || d.sourceRevision !== s.revision;\nexport function undoDraft(d: Draft): Draft {\n const previous = d.history?.at(-1);\n if (!previous) return d;\n return deepFreeze({\n ...previous,\n revision: d.revision + 1,\n history: d.history!.slice(0, -1),\n });\n}\n/** Keep and regenerate are explicit choices; observing fresh data never overwrites edits. */\nexport function refreshDraft(\n draft: Draft,\n snapshot: Snapshot,\n choice: \"keep\" | \"regenerate\",\n): Draft {\n return choice === \"keep\" ? draft : createDraft(snapshot);\n}\nexport function applySectionSelection(\n d: Draft,\n s: Snapshot,\n ids: readonly string[],\n): Draft {\n if (\n d.snapshotId !== s.id ||\n d.sourceId !== s.sourceId ||\n d.sourceRevision !== s.revision\n )\n throw new ContentTransferError(\n \"snapshot-mismatch\",\n \"Section selection requires the draft's captured source snapshot\",\n );\n const selected = new Set(ids),\n omit: Omission[] = [],\n paths = s.sections\n .filter((x) => !selected.has(x.id))\n .map((x) => {\n omit.push({ path: x.path, reason: \"excluded\" });\n return x.path;\n }),\n // Selection is a replacement projection from the snapshot, so only the\n // snapshot's omissions remain authoritative. Retaining draft omissions\n // would preserve stale transforms after the snapshot payload is rebuilt.\n baseOmissions = s.omissions;\n if (s.payload.kind === \"json\")\n return revise(\n d,\n { kind: \"json\", value: without(s.payload.value, paths, []) ?? null },\n omit,\n \"Selected sections\",\n d.manuallyEdited,\n \"deterministic\",\n baseOmissions,\n );\n if (s.payload.kind === \"registered\")\n return revise(\n d,\n {\n kind: \"registered\",\n format: s.payload.format,\n value: without(s.payload.value, paths, []) ?? null,\n },\n omit,\n \"Selected sections\",\n d.manuallyEdited,\n \"deterministic\",\n baseOmissions,\n );\n return revise(\n d,\n s.payload,\n omit,\n \"Selected sections\",\n d.manuallyEdited,\n \"deterministic\",\n baseOmissions,\n );\n}\nexport function transformRows(\n d: Draft,\n o: {\n search?: string;\n sort?: { column: string; direction: \"asc\" | \"desc\" };\n filters?: Readonly<Record<string, string>>;\n /** Positions in this call's input draft rows; unlike ids, no guessed key is used. */\n selectedIndices?: readonly number[];\n selectedIds?: readonly string[];\n idColumn?: string;\n visibleColumns?: readonly string[];\n structuredProjection?: \"full\" | \"visible\";\n top?: number | null;\n },\n): Draft {\n if (d.payload.kind !== \"rows\") return d;\n // Validate before deciding whether truncation is necessary. A negative/NaN\n // top is an invalid request even for an empty result set.\n if (o.top != null) assertLimit(o.top, \"maxRows\");\n const cols = o.visibleColumns\n ? o.visibleColumns\n .map((id) =>\n d.payload.kind === \"rows\"\n ? d.payload.columns.find((c) => c.id === id)\n : undefined,\n )\n .filter((c): c is Column => Boolean(c))\n : d.payload.columns.filter((c) => c.visible);\n const get = readTransferCell;\n let rows = [...d.payload.rows],\n omit: Omission[] = [];\n const before = rows.length;\n if (o.selectedIndices !== undefined) {\n const selected = new Set<number>();\n for (const index of o.selectedIndices) {\n if (!Number.isSafeInteger(index) || index < 0 || index >= d.payload.rows.length)\n throw new ContentTransferError(\n \"invalid-selection-index\",\n \"Selected row indexes must be non-negative positions in the input draft rows\",\n );\n selected.add(index);\n }\n rows = d.payload.rows.filter((_, index) => selected.has(index));\n }\n if (o.selectedIds && o.idColumn) {\n const set = new Set(o.selectedIds);\n const idColumn = d.payload.columns.find((c) => c.id === o.idColumn);\n rows = rows.filter((r) =>\n set.has(String(idColumn ? get(r, idColumn) : r[o.idColumn!])),\n );\n }\n if (o.search) {\n const q = o.search.toLowerCase();\n rows = rows.filter((r) =>\n cols.some((c) =>\n String(get(r, c) ?? \"\")\n .toLowerCase()\n .includes(q),\n ),\n );\n }\n for (const [id, q] of Object.entries(o.filters ?? {})) {\n const c = cols.find((x) => x.id === id);\n if (c)\n rows = rows.filter((r) =>\n String(get(r, c) ?? \"\")\n .toLowerCase()\n .includes(q.toLowerCase()),\n );\n }\n if (rows.length !== before)\n omit.push({\n path: \"/rows\",\n reason: \"filtered\",\n count: before - rows.length,\n });\n if (o.sort) {\n const c = cols.find((x) => x.id === o.sort!.column);\n if (c)\n rows.sort((a, b) => {\n const left = get(a, c);\n const right = get(b, c);\n const compare =\n typeof left === \"number\" && typeof right === \"number\"\n ? left - right\n : String(left ?? \"\").localeCompare(String(right ?? \"\"));\n return compare * (o.sort!.direction === \"asc\" ? 1 : -1);\n });\n }\n if (o.top != null && rows.length > o.top) {\n omit.push({\n path: \"/rows\",\n reason: \"truncated\",\n count: rows.length - o.top,\n });\n rows = rows.slice(0, o.top);\n }\n if (o.structuredProjection === \"visible\") {\n rows = rows.map((r) =>\n Object.fromEntries(cols.map((c) => [c.id, get(r, c) ?? null])),\n );\n omit.push({\n path: \"/columns\",\n reason: \"excluded\",\n count: d.payload.columns.length - cols.length,\n });\n }\n return revise(\n d,\n {\n kind: \"rows\",\n rows,\n columns: cols.map((c) => ({\n ...c,\n visible: true,\n ...(o.structuredProjection === \"visible\"\n ? { path: `/${enc(c.id)}` }\n : {}),\n })),\n },\n omit,\n \"Prepared row subset\",\n );\n}\nexport function reduceJson(\n draft: Draft,\n options: {\n exclude?: readonly string[];\n maxDepth?: number | null;\n maxStringChars?: number | null;\n maxArrayItems?: number | null;\n },\n): Draft {\n if (draft.payload.kind !== \"json\" && draft.payload.kind !== \"registered\")\n return draft;\n const omissions: Omission[] = [];\n options.exclude?.forEach(validatePointer);\n const filtered =\n without(clone(draft.payload.value), options.exclude ?? [], omissions) ??\n null;\n const payload = limitPayload(\n { ...draft.payload, value: filtered },\n options,\n omissions,\n );\n return revise(draft, payload, omissions, \"Reduced JSON\");\n}\nexport async function collectAllMatching(\n c: BoundAllMatching,\n signal: AbortSignal,\n): Promise<{\n rows: Record<string, Json>[];\n coverage: RawSnapshot[\"coverage\"];\n omissions: Omission[];\n error?: ContentTransferError;\n}> {\n const rows: Record<string, Json>[] = [],\n omissions: Omission[] = [],\n ids = new Set<string>(),\n cursors = new Set<string>();\n let cursor: string | null = null,\n token: string | null | undefined,\n last: RawSnapshot[\"coverage\"] = {\n status: \"unknown\",\n included: 0,\n total: null,\n };\n let certifiedTotal: number | null | undefined;\n const maxRows = c.limits?.maxRows;\n if (maxRows != null) assertLimit(maxRows, \"maxRows\");\n const finishAtLimit = (total: number | null, knownOmitted?: number) => ({\n rows: deepFreeze(rows),\n omissions: deepFreeze([\n ...omissions,\n {\n path: \"/rows\",\n reason: \"truncated\" as const,\n ...(knownOmitted === undefined || knownOmitted <= 0\n ? {}\n : { count: knownOmitted }),\n },\n ]),\n coverage: deepFreeze({\n status: \"partial\" as const,\n included: rows.length,\n total,\n reason: \"Source export limit applied\",\n }),\n });\n try {\n // A zero source cap is still a real cap: do not request a page merely to\n // discover data that the caller is not allowed to receive.\n if (maxRows === 0) return finishAtLimit(null);\n do {\n stop(signal);\n const page = await c.source.page({\n query: c.source.query,\n cursor,\n consistencyToken: token ?? null,\n signal,\n });\n stop(signal);\n if (token === undefined) token = page.consistencyToken;\n else if (page.consistencyToken !== token)\n throw new ContentTransferError(\n \"consistency-token-changed\",\n \"All-matching export changed during collection\",\n );\n if (page.coverage.included !== page.rows.length)\n throw new ContentTransferError(\n \"invalid-page-coverage\",\n \"Page count does not match returned rows\",\n );\n if (\n page.coverage.total !== null &&\n (!Number.isSafeInteger(page.coverage.total) || page.coverage.total < 0)\n )\n throw new ContentTransferError(\n \"invalid-page-coverage\",\n \"Page total must be a non-negative integer or null\",\n );\n if (certifiedTotal === undefined) certifiedTotal = page.coverage.total;\n else if (page.coverage.total !== certifiedTotal)\n throw new ContentTransferError(\n \"inconsistent-total\",\n \"All-matching source changed its reported total during collection\",\n );\n const projected = (\n normalize(\n { kind: \"rows\", rows: page.rows, columns: [...c.columns] },\n c.projection,\n omissions,\n ) as Extract<Payload, { kind: \"rows\" }>\n ).rows;\n let uniqueBeyondLimit = 0;\n for (const row of projected) {\n // The callback is part of the transfer boundary, so it receives only\n // the projected row. Sources requiring identity must declare an\n // exportable opaque ID; raw credential/non-exportable fields never\n // cross this seam merely for de-duplication.\n const id = c.source.getRowId(row);\n if (!id)\n throw new ContentTransferError(\n \"invalid-row-id\",\n \"All-matching source returned empty projected ID\",\n );\n if (!ids.has(id)) {\n ids.add(id);\n if (maxRows == null || rows.length < maxRows)\n rows.push(\n (\n limitPayload(\n { kind: \"rows\", rows: [row], columns: [...c.columns] },\n { ...c.limits, maxRows: null },\n omissions,\n ) as Extract<Payload, { kind: \"rows\" }>\n ).rows[0]!,\n );\n else uniqueBeyondLimit += 1;\n } else omissions.push({ path: `/rows/${enc(id)}`, reason: \"duplicate\" });\n }\n // Check after de-duplication and before the source-cap return: ids also\n // includes unique rows that the cap intentionally did not retain.\n if (page.coverage.total !== null && page.coverage.total < ids.size)\n throw new ContentTransferError(\n \"invalid-page-coverage\",\n \"Page total is smaller than the accumulated unique row count\",\n );\n last = page.coverage;\n if (\n maxRows != null &&\n rows.length >= maxRows &&\n (uniqueBeyondLimit > 0 || page.nextCursor !== null)\n )\n return finishAtLimit(\n page.coverage.total,\n page.nextCursor === null\n ? uniqueBeyondLimit\n : page.coverage.total != null && page.coverage.total > rows.length\n ? page.coverage.total - rows.length\n : undefined,\n );\n cursor = page.nextCursor;\n if (cursor !== null && (!cursor || cursors.has(cursor)))\n throw new ContentTransferError(\n \"non-advancing-cursor\",\n \"All-matching source repeated a cursor\",\n );\n if (cursor) cursors.add(cursor);\n } while (cursor !== null);\n const complete =\n c.source.stableSnapshot === true &&\n last.status === \"complete\" &&\n last.total === rows.length &&\n token !== undefined;\n return {\n rows: deepFreeze(rows),\n omissions: deepFreeze(omissions),\n coverage: deepFreeze(\n complete\n ? { ...last, included: rows.length }\n : {\n ...last,\n status: \"partial\",\n included: rows.length,\n reason:\n last.reason ??\n \"Source did not certify a stable complete snapshot\",\n },\n ),\n };\n } catch (e) {\n const error =\n e instanceof ContentTransferError\n ? e\n : new ContentTransferError(\n signal.aborted ? \"cancelled\" : \"page-failed\",\n e instanceof Error ? e.message : \"Page collection failed\",\n );\n return {\n rows: deepFreeze(rows),\n omissions: deepFreeze(omissions),\n coverage: deepFreeze({\n status: \"partial\",\n included: rows.length,\n total: last.total,\n reason: error.message,\n }),\n error,\n };\n }\n}\nconst textValue = (value: Json | undefined): string =>\n value === undefined\n ? \"\"\n : typeof value === \"string\"\n ? value\n : stringifyJson(value, { style: \"compact\" });\n\n/** Preserve artifact-byte identity even if a consumer mutates a returned view. */\nexport function sealTransferArtifact(artifact: Artifact): Artifact {\n if (!artifact.file)\n return deepFreeze({\n ...artifact,\n omissions: artifact.omissions.map((o) => ({ ...o })),\n });\n const bytes = artifact.file.bytes.slice();\n const file = {\n filename: artifact.file.filename,\n mime: artifact.file.mime,\n get bytes() {\n return bytes.slice();\n },\n };\n return deepFreeze({\n ...artifact,\n file,\n omissions: artifact.omissions.map((o) => ({ ...o })),\n });\n}\n\nexport function serialize(\n draft: Draft,\n format:\n \"plain\" | \"markdown\" | \"json\" | \"compact-json\" | \"csv\" | \"tsv\" | \"html\",\n options: { spreadsheetSafe?: boolean; filename?: string } = {},\n): Artifact {\n const payload = draft.payload;\n const omissions = draft.omissions.map((o) => ({ ...o }));\n let plainText = \"\",\n html: string | undefined;\n let mime = \"text/plain;charset=utf-8\",\n extension = \"txt\";\n const columnCell = (row: Record<string, Json>, column: Column) =>\n textValue(readTransferCell(row, column));\n if ((format === \"csv\" || format === \"tsv\") && payload.kind !== \"rows\") {\n throw new ContentTransferError(\n \"unsupported-format\",\n `${format.toUpperCase()} requires tabular data`,\n );\n }\n if (format === \"json\" || format === \"compact-json\") {\n const value =\n payload.kind === \"rows\"\n ? payload.rows\n : payload.kind === \"text\" || payload.kind === \"markdown\"\n ? payload.text\n : payload.value;\n plainText = stringifyJson(value, {\n style: format === \"json\" ? \"pretty\" : \"compact\",\n });\n mime = \"application/json;charset=utf-8\";\n extension = \"json\";\n } else if (payload.kind === \"rows\") {\n const columns = payload.columns.filter(\n (c) =>\n c.visible &&\n c.exportable !== false &&\n c.classification !== \"secret\" &&\n c.classification !== \"credential\",\n );\n if (format === \"markdown\") {\n const escapeCell = (value: string) =>\n escapeHtml(value)\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\|/g, \"\\\\|\")\n .replace(/\\r\\n|\\r|\\n/g, \"<br>\");\n plainText = [\n `| ${columns.map((c) => escapeCell(c.label)).join(\" | \")} |`,\n `| ${columns.map(() => \"---\").join(\" | \")} |`,\n ...payload.rows.map(\n (row) =>\n `| ${columns.map((c) => escapeCell(columnCell(row, c))).join(\" | \")} |`,\n ),\n ].join(\"\\n\");\n mime = \"text/markdown;charset=utf-8\";\n extension = \"md\";\n } else {\n const delimiter = format === \"csv\" ? \",\" : \"\\t\";\n const safe = options.spreadsheetSafe ?? format === \"tsv\";\n const encode = (value: string, path: string, isString = true) => {\n let text = value;\n if (safe && isString && /^[\\t\\r\\n ]*[=+\\-@]/.test(text)) {\n text = `'${text}`;\n omissions.push({ path, reason: \"escaped\", count: 1 });\n }\n return text.includes(delimiter) || /[\"\\n\\r]/.test(text)\n ? `\"${text.replace(/\"/g, '\"\"')}\"`\n : text;\n };\n plainText = [\n columns\n .map((c) => encode(c.label, `/columns/${enc(c.id)}`))\n .join(delimiter),\n ...payload.rows.map((row, index) =>\n columns\n .map((c) =>\n encode(\n columnCell(row, c),\n `/rows/${index}${c.path}`,\n typeof readTransferCell(row, c) === \"string\",\n ),\n )\n .join(delimiter),\n ),\n ].join(\"\\n\");\n if (format === \"csv\") {\n mime = \"text/csv;charset=utf-8\";\n extension = \"csv\";\n }\n if (format === \"tsv\") {\n mime = \"text/tab-separated-values;charset=utf-8\";\n extension = \"tsv\";\n }\n }\n if (format === \"html\")\n html = `<table><thead><tr>${columns.map((c) => `<th>${escapeHtml(c.label)}</th>`).join(\"\")}</tr></thead><tbody>${payload.rows.map((row) => `<tr>${columns.map((c) => `<td>${escapeHtml(columnCell(row, c)).replace(/\\r\\n|\\r|\\n/g, \"<br>\")}</td>`).join(\"\")}</tr>`).join(\"\")}</tbody></table>`;\n } else {\n plainText =\n payload.kind === \"text\" || payload.kind === \"markdown\"\n ? payload.text\n : stringifyJson(payload.value, { style: \"pretty\" });\n if (format === \"markdown\") {\n mime = \"text/markdown;charset=utf-8\";\n extension = \"md\";\n }\n if (format === \"html\") html = `<pre>${escapeHtml(plainText)}</pre>`;\n }\n if (format === \"html\") {\n mime = \"text/html;charset=utf-8\";\n extension = \"html\";\n }\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format,\n plainText,\n ...(html === undefined ? {} : { html }),\n file: {\n filename: options.filename ?? `export.${extension}`,\n mime,\n bytes: new TextEncoder().encode(\n format === \"html\" ? (html ?? plainText) : plainText,\n ),\n },\n omissions,\n });\n}\nexport async function renderMarkdownHtml(markdown: string): Promise<string> {\n const [{ marked }, purify] = await Promise.all([\n import(\"marked\"),\n import(\"dompurify\"),\n ]);\n const html = await marked.parse(markdown);\n const api = purify.default as unknown as { sanitize?: Function } | Function;\n if (typeof api === \"function\" && typeof window !== \"undefined\") {\n const purifier = api(window);\n if (typeof purifier?.sanitize === \"function\") return purifier.sanitize(html);\n }\n if (typeof (api as { sanitize?: Function }).sanitize === \"function\")\n return (api as { sanitize: Function }).sanitize(html);\n throw new ContentTransferError(\n \"rich-html-unavailable\",\n \"Rich Markdown HTML requires a DOMPurify DOM adapter\",\n );\n}\nexport async function serializeMarkdownRich(\n d: Draft,\n filename = \"export.html\",\n): Promise<Artifact> {\n if (d.payload.kind !== \"markdown\")\n throw new ContentTransferError(\n \"unsupported-format\",\n \"Rich Markdown requires Markdown payload\",\n );\n const html = await renderMarkdownHtml(d.payload.text);\n return sealTransferArtifact({\n snapshotId: d.snapshotId,\n draftRevision: d.revision,\n format: \"html\",\n plainText: d.payload.text,\n html,\n file: {\n filename,\n mime: \"text/html;charset=utf-8\",\n bytes: new TextEncoder().encode(html),\n },\n omissions: [...d.omissions],\n });\n}\nexport function createBrowserTransport(): Transport {\n return {\n async copy(a, signal) {\n const cancelled = () =>\n signal.aborted ? { status: \"cancelled\" as const } : undefined;\n try {\n if (cancelled()) return cancelled()!;\n const c = globalThis.navigator?.clipboard;\n if (!c?.write && !c?.writeText)\n return {\n status: \"error\",\n code: \"clipboard-unavailable\",\n message: \"Clipboard writing is unavailable\",\n retryable: false,\n };\n if (\n a.html &&\n c.write &&\n typeof globalThis.ClipboardItem === \"function\"\n ) {\n try {\n await c.write([\n new ClipboardItem({\n \"text/plain\": new Blob([a.plainText], { type: \"text/plain\" }),\n \"text/html\": new Blob([a.html], { type: \"text/html\" }),\n }),\n ]);\n if (cancelled()) return cancelled()!;\n return {\n status: \"success\",\n delivered: \"clipboard\",\n mimeTypes: [\"text/plain\", \"text/html\"],\n };\n } catch {\n if (cancelled()) return cancelled()!;\n }\n }\n if (c.writeText) {\n await c.writeText(a.plainText);\n if (cancelled()) return cancelled()!;\n return a.html\n ? {\n status: \"degraded\",\n delivered: \"plain-text\",\n reason: \"Rich clipboard write was unavailable or rejected\",\n }\n : {\n status: \"success\",\n delivered: \"clipboard\",\n mimeTypes: [\"text/plain\"],\n };\n }\n return {\n status: \"error\",\n code: \"clipboard-rejected\",\n message: \"Clipboard rejected the write\",\n retryable: true,\n };\n } catch (e) {\n return (\n cancelled() ?? {\n status: \"error\",\n code: \"clipboard-rejected\",\n message:\n e instanceof Error ? e.message : \"Clipboard rejected the write\",\n retryable: true,\n }\n );\n }\n },\n async download(a, signal) {\n if (signal.aborted) return { status: \"cancelled\" };\n if (!a.file || typeof document === \"undefined\" || !URL?.createObjectURL)\n return {\n status: \"error\",\n code: \"download-unavailable\",\n message: \"Download is unavailable\",\n retryable: false,\n };\n let url: string | undefined;\n try {\n url = URL.createObjectURL(\n new Blob([a.file.bytes.slice().buffer as ArrayBuffer], {\n type: a.file.mime,\n }),\n );\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = a.file.filename;\n link.click();\n return signal.aborted\n ? { status: \"cancelled\" }\n : {\n status: \"success\",\n delivered: \"download-started\",\n mimeTypes: [a.file.mime],\n };\n } catch (e) {\n return signal.aborted\n ? { status: \"cancelled\" }\n : {\n status: \"error\",\n code: \"download-failed\",\n message: e instanceof Error ? e.message : \"Download failed\",\n retryable: true,\n };\n } finally {\n if (url) setTimeout(() => URL.revokeObjectURL(url!), 0);\n }\n },\n };\n}\n\nfunction assertLimit(value: number | null | undefined, name: string): void {\n if (value != null && (!Number.isSafeInteger(value) || value < 0)) {\n throw new ContentTransferError(\n \"invalid-limit\",\n `${name} must be a non-negative safe integer or null`,\n );\n }\n}\nexport type TransferPreferenceOverrides = Partial<\n Omit<TransferPreferences, \"limits\">\n> & { limits?: Partial<TransferLimits> };\nconst limitKeys = [\n \"maxRows\",\n \"maxStringChars\",\n \"maxDepth\",\n \"maxArrayItems\",\n \"targetTokens\",\n] as const;\n/** Restrictions intersect: neither a menu nor a provider can relax a source limit. */\nexport function resolveTransferPreferences(\n provider: TransferPreferenceOverrides = {},\n menu: TransferPreferenceOverrides = {},\n sourceLimits: Partial<TransferLimits> = {},\n): TransferPreferences {\n const limits: TransferLimits = {\n maxRows: null,\n maxStringChars: null,\n maxDepth: null,\n maxArrayItems: null,\n targetTokens: null,\n };\n for (const key of limitKeys) {\n const candidates = [\n provider.limits?.[key],\n menu.limits?.[key],\n sourceLimits[key],\n ];\n candidates.forEach((value) => assertLimit(value, key));\n const finite = candidates.filter((value): value is number => value != null);\n limits[key] = finite.length ? Math.min(...finite) : null;\n }\n return deepFreeze({\n initialFormat: menu.initialFormat ?? provider.initialFormat ?? \"plain\",\n initialPreset: menu.initialPreset ?? provider.initialPreset ?? \"full\",\n limits,\n });\n}\nfunction cloneTransferRegistration(\n value: unknown,\n path = \"registration\",\n seen = new WeakSet<object>(),\n): unknown {\n if (value === null || (typeof value !== \"object\" && typeof value !== \"function\"))\n return value;\n // Registered behavior remains callable by identity. Freezing a caller-owned\n // function would mutate it and its attached state.\n if (typeof value === \"function\") return value;\n if (seen.has(value))\n throw new ContentTransferError(\n \"unsupported-registration-metadata\",\n \"Circular transfer registration metadata is unsupported\",\n path,\n );\n seen.add(value);\n if (Array.isArray(value)) {\n const copy = value.map((item, index) =>\n cloneTransferRegistration(item, `${path}/${index}`, seen),\n );\n seen.delete(value);\n return Object.freeze(copy);\n }\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null)\n throw new ContentTransferError(\n \"unsupported-registration-metadata\",\n \"Transfer registration metadata must use plain objects and arrays\",\n path,\n );\n const copy = Object.create(prototype) as Record<PropertyKey, unknown>;\n for (const key of Reflect.ownKeys(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key)!;\n if (!(\"value\" in descriptor))\n throw new ContentTransferError(\n \"unsupported-registration-metadata\",\n \"Transfer registration metadata cannot use accessors\",\n `${path}/${String(key)}`,\n );\n Object.defineProperty(copy, key, {\n value: cloneTransferRegistration(\n descriptor.value,\n `${path}/${String(key)}`,\n seen,\n ),\n enumerable: descriptor.enumerable === true,\n writable: false,\n configurable: false,\n });\n }\n seen.delete(value);\n return Object.freeze(copy);\n}\n\n/** One stable id per registered format or action; ambiguous overrides fail loudly. */\nexport function resolveTransferRegistry<T extends { id: string }>(\n ...groups: readonly (readonly T[])[]\n): readonly T[] {\n const ids = new Set<string>();\n const result: T[] = [];\n for (const group of groups)\n for (const item of group) {\n const copy = cloneTransferRegistration(item) as T;\n if (!copy.id.trim() || ids.has(copy.id))\n throw new ContentTransferError(\n \"duplicate-registration\",\n `Transfer id ${JSON.stringify(copy.id)} is empty or registered more than once`,\n );\n ids.add(copy.id);\n result.push(copy);\n }\n return Object.freeze(result);\n}\n\nexport type TransferSurfaceDeclaration = {\n surfaceName: string;\n label?: string;\n values: readonly {\n name: string;\n label: string;\n exportable?: boolean;\n classification?: \"ordinary\" | \"secret\" | \"credential\";\n includedByDefault?: boolean;\n }[];\n};\n/** A structural adapter to the actual mounted surface, never a global name lookup. */\nexport function createSurfaceTransferHandle(options: {\n instanceId: string;\n manifest: TransferSurfaceDeclaration;\n isMounted(): boolean;\n getScope(): Record<string, unknown> | Promise<Record<string, unknown>>;\n getRevision?(): string;\n unsavedChanges?(): boolean;\n projection?: ExportProjection;\n limits?: TransferLimits;\n}): SurfaceHandle {\n const declarations = resolveTransferRegistry(\n options.manifest.values.map((value) => ({ ...value, id: value.name })),\n );\n return {\n instanceId: options.instanceId,\n surfaceName: options.manifest.surfaceName,\n isMounted: options.isMounted,\n async capture(signal) {\n stop(signal);\n if (!options.isMounted())\n throw new ContentTransferError(\n \"surface-unmounted\",\n \"The captured surface is no longer mounted\",\n );\n const revisionBefore = options.getRevision?.();\n const scope = await options.getScope();\n stop(signal);\n if (!options.isMounted())\n throw new ContentTransferError(\n \"surface-unmounted\",\n \"The surface closed during capture\",\n );\n if (\n revisionBefore !== undefined &&\n options.getRevision?.() !== revisionBefore\n )\n throw new ContentTransferError(\n \"surface-changed\",\n \"The surface changed during capture; capture again\",\n );\n const value: Record<string, Json> = {};\n for (const declaration of declarations) {\n if (\n Object.hasOwn(scope, declaration.name) &&\n scope[declaration.name] !== undefined\n ) {\n Object.defineProperty(value, declaration.name, {\n value: cloneSurfaceValue(\n scope[declaration.name],\n `/${enc(declaration.name)}`,\n ),\n enumerable: true,\n writable: true,\n configurable: true,\n });\n }\n }\n return directSource(\n { kind: \"json\", value },\n {\n sourceId: options.instanceId,\n revision: revisionBefore ?? uid(),\n label: options.manifest.label ?? options.manifest.surfaceName,\n unsavedChanges: options.unsavedChanges?.() ?? false,\n sections: declarations\n .filter((d) => Object.hasOwn(value, d.name))\n .map((d) => ({\n id: d.name,\n label: d.label,\n path: `/${enc(d.name)}`,\n includedByDefault: d.includedByDefault ?? true,\n })),\n projection: {\n rules: [\n ...(options.projection?.rules ?? []),\n ...declarations.map((d) => ({\n target: \"payload\" as const,\n path: `/${enc(d.name)}`,\n exportable: d.exportable ?? true,\n classification: d.classification ?? (\"ordinary\" as const),\n })),\n ],\n },\n ...(options.limits ? { limits: options.limits } : {}),\n },\n );\n },\n };\n}\n\nfunction limitJson(\n value: Json,\n limits: Partial<TransferLimits>,\n omissions: Omission[],\n path = \"\",\n depth = 0,\n): Json {\n if (limits.maxDepth != null && depth > limits.maxDepth) {\n omissions.push({ path, reason: \"truncated\" });\n return null;\n }\n if (\n typeof value === \"string\" &&\n limits.maxStringChars != null &&\n Array.from(value).length > limits.maxStringChars\n ) {\n const chars = Array.from(value);\n omissions.push({\n path,\n reason: \"truncated\",\n count: chars.length - limits.maxStringChars,\n });\n return chars.slice(0, limits.maxStringChars).join(\"\");\n }\n if (Array.isArray(value)) {\n const count = Math.min(value.length, limits.maxArrayItems ?? value.length);\n if (count < value.length)\n omissions.push({\n path,\n reason: \"truncated\",\n count: value.length - count,\n });\n return value\n .slice(0, count)\n .map((item, index) =>\n limitJson(item, limits, omissions, `${path}/${index}`, depth + 1),\n );\n }\n if (value && typeof value === \"object\")\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n limitJson(item, limits, omissions, `${path}/${enc(key)}`, depth + 1),\n ]),\n );\n return value;\n}\nfunction limitPayload(\n payload: Payload,\n limits: Partial<TransferLimits>,\n omissions: Omission[],\n): Payload {\n limitKeys.forEach((key) => assertLimit(limits[key], key));\n if (payload.kind === \"rows\") {\n const count = Math.min(\n payload.rows.length,\n limits.maxRows ?? payload.rows.length,\n );\n if (count < payload.rows.length)\n omissions.push({\n path: \"/rows\",\n reason: \"truncated\",\n count: payload.rows.length - count,\n });\n return {\n ...payload,\n rows: payload.rows\n .slice(0, count)\n .map(\n (row, index) =>\n limitJson(row, limits, omissions, `/rows/${index}`) as Record<\n string,\n Json\n >,\n ),\n };\n }\n if (payload.kind === \"json\" || payload.kind === \"registered\")\n return { ...payload, value: limitJson(payload.value, limits, omissions) };\n return {\n ...payload,\n text: limitJson(payload.text, limits, omissions) as string,\n };\n}\n/** Applies explicit preparation/source limits with exact omissions; token target is advisory. */\nexport function applyTransferLimits(\n draft: Draft,\n limits: Partial<TransferLimits>,\n): Draft {\n const omissions: Omission[] = [];\n const payload = limitPayload(draft.payload, limits, omissions);\n return omissions.length\n ? revise(draft, payload, omissions, \"Applied preparation limits\")\n : draft;\n}\n"],"mappings":"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","names":["entries","body","joined","copy"]}
|