@ai-matrx/alchemy 0.15.0 → 0.17.4

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.
Files changed (62) hide show
  1. package/CHANGELOG.md +74 -1
  2. package/dist/core.cjs +3 -3
  3. package/dist/core.cjs.map +1 -1
  4. package/dist/core.d.cts +27 -2
  5. package/dist/core.d.ts +27 -2
  6. package/dist/core.js +4 -4
  7. package/dist/core.js.map +1 -1
  8. package/dist/index.cjs +3 -3
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.d.cts +27 -2
  11. package/dist/index.d.ts +27 -2
  12. package/dist/index.js +4 -4
  13. package/dist/index.js.map +1 -1
  14. package/dist/operate-capture.cjs +2 -0
  15. package/dist/operate-capture.cjs.map +1 -0
  16. package/dist/operate-capture.d.cts +105 -0
  17. package/dist/operate-capture.d.ts +105 -0
  18. package/dist/operate-capture.js +2 -0
  19. package/dist/operate-capture.js.map +1 -0
  20. package/dist/operate-document.cjs +1 -1
  21. package/dist/operate-document.cjs.map +1 -1
  22. package/dist/operate-document.js +1 -1
  23. package/dist/operate-document.js.map +1 -1
  24. package/dist/operate-pptx.cjs +151 -0
  25. package/dist/operate-pptx.cjs.map +1 -0
  26. package/dist/operate-pptx.d.cts +2695 -0
  27. package/dist/operate-pptx.d.ts +2695 -0
  28. package/dist/operate-pptx.js +151 -0
  29. package/dist/operate-pptx.js.map +1 -0
  30. package/dist/operate-read.cjs +6 -0
  31. package/dist/operate-read.cjs.map +1 -0
  32. package/dist/operate-read.d.cts +174 -0
  33. package/dist/operate-read.d.ts +174 -0
  34. package/dist/operate-read.js +6 -0
  35. package/dist/operate-read.js.map +1 -0
  36. package/dist/operate-rich-html.cjs +1 -1
  37. package/dist/operate-rich-html.cjs.map +1 -1
  38. package/dist/operate-rich-html.js +1 -1
  39. package/dist/operate-rich-html.js.map +1 -1
  40. package/dist/operate-server.cjs +1 -1
  41. package/dist/operate-server.cjs.map +1 -1
  42. package/dist/operate-server.js +1 -1
  43. package/dist/operate-server.js.map +1 -1
  44. package/dist/operate-xlsx.cjs +3 -2
  45. package/dist/operate-xlsx.cjs.map +1 -1
  46. package/dist/operate-xlsx.d.cts +1227 -6
  47. package/dist/operate-xlsx.d.ts +1227 -6
  48. package/dist/operate-xlsx.js +3 -2
  49. package/dist/operate-xlsx.js.map +1 -1
  50. package/dist/operate-zip.cjs +2 -0
  51. package/dist/operate-zip.cjs.map +1 -0
  52. package/dist/operate-zip.d.cts +35 -0
  53. package/dist/operate-zip.d.ts +35 -0
  54. package/dist/operate-zip.js +2 -0
  55. package/dist/operate-zip.js.map +1 -0
  56. package/dist/operate.cjs +3 -3
  57. package/dist/operate.cjs.map +1 -1
  58. package/dist/operate.d.cts +27 -2
  59. package/dist/operate.d.ts +27 -2
  60. package/dist/operate.js +4 -4
  61. package/dist/operate.js.map +1 -1
  62. package/package.json +51 -5
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/operate/types.ts","../src/operate/fenced-code.ts","../src/operate/agent-payload.ts","../src/operate/core.ts","../src/operate/formats/rich-html.ts","../src/operate/formats/document.ts","../src/operate.ts","../src/operate/door.ts","../src/operate/thinking.ts","../src/operate/formats.ts","../src/operate/preparation.ts","../src/operate/spans.ts","../src/operate/tree.ts","../src/operate/recipes.ts"],"sourcesContent":["/**\n * Framework-neutral transfer contracts (Alchemy Operate, CONTRACT §2.3). All data crossing this boundary is JSON.\n * Moved in ALC-16; `Json`/`Payload`/`Column` now live in `@ai-matrx/kit/transfer-json`; the format-adapter contract lives in `./contract`.\n */\nimport type { Column, Json, Payload } from \"@ai-matrx/kit/transfer-json\";\nexport type { Column, Json, Payload };\nexport type ExportProjection = {\n rules: {\n target: \"payload\" | \"row\";\n path: string;\n exportable: boolean;\n classification: \"ordinary\" | \"secret\" | \"credential\";\n }[];\n};\nexport type TransferScope =\n \"target\" | \"row\" | \"selected\" | \"view\" | \"loaded\" | \"all-matching\";\nexport type Section = {\n id: string;\n label: string;\n path: string;\n includedByDefault: boolean;\n};\nexport type Coverage = {\n status: \"complete\" | \"loaded\" | \"partial\" | \"unknown\";\n included: number;\n total: number | null;\n reason?: string;\n /** What is counted, singular (\"message\", \"row\"); a workspace with sections counts the ticked ones in this unit. */\n unit?: string;\n};\nexport type Omission = {\n path: string;\n reason:\n | \"excluded\"\n | \"filtered\"\n | \"truncated\"\n | \"unsupported\"\n | \"escaped\"\n | \"duplicate\";\n count?: number;\n /** What a person reads for this omission (a section's name, a dotted path, a stub's size). */\n label?: string;\n};\nexport type RawSnapshot = {\n id: string;\n sourceId: string;\n revision: string;\n capturedAt: string;\n label: string;\n payload: Payload;\n coverage: Coverage;\n unsavedChanges: boolean;\n omissions: Omission[];\n sections: Section[];\n limits?: TransferLimits;\n};\ndeclare const projected: unique symbol;\nexport type Snapshot = RawSnapshot & { readonly [projected]: true };\nexport type QuerySnapshot = {\n sourceId: string;\n revision: string;\n query: Json;\n order: { field: string; direction: \"asc\" | \"desc\" }[];\n};\nexport type ExportPage = {\n rows: Record<string, Json>[];\n nextCursor: string | null;\n coverage: Coverage;\n consistencyToken: string | null;\n};\nexport type CapturedAllMatching = {\n query: QuerySnapshot;\n getRowId(row: Record<string, Json>): string;\n page(request: {\n query: QuerySnapshot;\n cursor: string | null;\n consistencyToken: string | null;\n signal: AbortSignal;\n }): Promise<ExportPage>;\n stableSnapshot?: boolean;\n};\nexport type CapturedSource = {\n snapshot: RawSnapshot;\n projection: ExportProjection;\n allMatching?: CapturedAllMatching;\n};\nexport type Source = {\n id: string;\n label: string;\n capture(request: {\n scope: TransferScope;\n signal: AbortSignal;\n }): Promise<CapturedSource>;\n};\nexport type Draft = {\n snapshotId: string;\n sourceId: string;\n sourceRevision: string;\n revision: number;\n payload: Payload;\n omissions: Omission[];\n manuallyEdited: boolean;\n provenance: {\n kind: \"original\" | \"deterministic\" | \"manual\" | \"ai\";\n operationId?: string;\n description: string;\n }[];\n /** Frozen prior states, with history omitted to avoid recursive duplication. */\n history?: readonly Omit<Draft, \"history\">[];\n};\nexport type Transform = {\n id: string;\n apply(draft: Draft, options: Json, signal: AbortSignal): Promise<Draft>;\n};\nexport type Artifact = {\n snapshotId: string;\n draftRevision: number;\n format: string;\n plainText: string;\n html?: string;\n file?: { filename: string; mime: string; bytes: Uint8Array };\n omissions: Omission[];\n};\n/** A concrete destination receipt; opening an editor is not a persisted save. */\nexport type TransferTarget = { kind: string; id: string; label: string; href?: string };\nexport type TransferOutcome =\n | {\n status: \"success\";\n delivered: \"clipboard\" | \"download-started\" | \"action\";\n mimeTypes: string[];\n /** Host-provided completion text for an explicit page action. */\n message?: string;\n target?: TransferTarget;\n }\n | { status: \"degraded\"; delivered: \"plain-text\"; reason: string }\n /**\n * Accepted for review; NOTHING was written and NOTHING failed.\n *\n * A destination whose organization reviews this kind of change first answers\n * \"filed, waiting for a person\" — a queued write is neither a delivery nor a\n * failure, and reporting it as either lies in one of two directions: claiming\n * a record that does not exist, or telling someone their work was lost while\n * it sits in a queue with their name on it.\n *\n * It carries the same sentence/remedy pair the other members carry, both\n * REQUIRED: `message` is what happened in the host's own words, `remedy` is\n * the half that sentence never states — what has NOT happened yet and what\n * the person does next. `target`, when the host can name it, is the pending\n * request itself (the approval row, which exists and opens) and NEVER the\n * destination record, which does not exist yet.\n */\n | { status: \"queued\"; message: string; remedy: string; target?: TransferTarget }\n | { status: \"cancelled\" }\n | { status: \"error\"; code: string; message: string; retryable: boolean; target?: TransferTarget };\nexport type Transport = {\n copy(artifact: Artifact, signal: AbortSignal): Promise<TransferOutcome>;\n download(artifact: Artifact, signal: AbortSignal): Promise<TransferOutcome>;\n};\nexport type SurfaceHandle = {\n instanceId: string;\n surfaceName: string;\n isMounted(): boolean;\n capture(signal: AbortSignal): Promise<CapturedSource>;\n};\nexport type AiPreparation = {\n supports(snapshot: Snapshot): boolean;\n run(request: {\n snapshot: Snapshot;\n draft: Draft;\n instruction: string;\n signal: AbortSignal;\n }): Promise<Draft>;\n /** Create an isolated adapter session for one preparation workspace. */\n fork?(): AiPreparation;\n /** Cancel the retained provider request; closing a host UI does not imply this. */\n cancel?(): Promise<void>;\n /** Revalidate the frozen source and recover a previously saved provider result. */\n recover?(input: {\n snapshot: Snapshot;\n draft: Draft;\n signal: AbortSignal;\n }): Promise<Draft>;\n};\nexport type TransferLimits = {\n maxRows: number | null;\n maxStringChars: number | null;\n maxDepth: number | null;\n maxArrayItems?: number | null;\n targetTokens: number | null;\n};\nexport type TransferPreferences = {\n initialFormat: string;\n initialPreset: \"full\" | \"compact\" | \"brief\";\n /**\n * What the preparation workspace's one preview and one Copy start on (PP-10): `\"ai\"` = the\n * sealed AI envelope around the chosen format, `\"text\"` = the format's bare bytes. The person\n * switches it in the workspace; this is only where it starts.\n */\n initialEnvelope: \"ai\" | \"text\";\n limits: TransferLimits;\n};\nexport type PageAction = {\n /** Alternate click-time source, captured through the same projection and limits before run. */\n source?: Source;\n id: string;\n label: string;\n supports(snapshot: Snapshot, draft?: Draft): boolean;\n run(request: {\n snapshot: Snapshot;\n draft: Draft;\n signal: AbortSignal;\n }): Promise<TransferOutcome>;\n};\n","/**\n * Wrap text in a Markdown code fence that cannot be closed by its contents.\n *\n * Fence writing is deliberately centralized here. Consumers should not grow\n * their own backtick-run detection when exporting code-shaped payloads.\n */\nexport function fencedCodeBlock(text: string, language: string): string {\n const runs = text.match(/`+/g) ?? [];\n const fence = \"`\".repeat(Math.max(3, ...runs.map((run) => run.length + 1)));\n return `${fence}${language}\\n${text}${text.endsWith(\"\\n\") ? \"\" : \"\\n\"}${fence}`;\n}\n","import { fencedCodeBlock } from \"./fenced-code\";\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 * How `data` travels (PP-09). `\"json\"` (the default): `data` is any JSON value, written as a\n * fenced JSON body with `<`, `>` and `&` escaped. Any other name (`\"text\"`, `\"markdown\"`,\n * `\"csv\"`, …): `data` is TEXT, written verbatim — real line breaks, no quoting, no escapes —\n * inside a Markdown fence longer than any backtick run in it, under `<data format=\"<name>\">`.\n * A text source is never wrapped as one escaped JSON string.\n */\n dataFormat?: string;\n /**\n * A person's instructions for the model (PP-10). Sealed with the envelope as its first block,\n * `<instructions>…</instructions>`, so the preview, the clipboard and the token total all\n * include it. Empty or whitespace-only = no block.\n */\n instructions?: string;\n}\n\nexport interface AgentPayloadEnvironment {\n url?: string;\n route?: string;\n capturedAt?: string;\n}\n\nconst escapeXml = (value: string) => value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\").replace(/'/g, \"&apos;\");\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 return fencedCodeBlock(json.trimEnd(), \"json\");\n}\n\n/** Capture location at invocation; environment injection makes non-browser use explicit. */\nexport function buildAgentPayload(input: AgentPayloadInput, environment: AgentPayloadEnvironment = {}): string {\n return assembleAgentPayload(input, environment).text;\n}\n\n/**\n * The envelope, plus where its JSON body sits: `body` is the exact JSON text written between the\n * fence lines, starting at `bodyOffset` (so a span map of the body lands in the envelope at that\n * offset — PP-06a).\n */\nexport function assembleAgentPayload(\n input: AgentPayloadInput,\n environment: AgentPayloadEnvironment = {},\n): { text: string; body: string; bodyOffset: number } {\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 dataFormat = input.dataFormat ?? \"json\";\n if (dataFormat !== \"json\" && !/^[a-z][a-z0-9-]*$/.test(dataFormat)) throw new Error(`Invalid AI envelope data format: ${dataFormat}`);\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 const instructions = input.instructions?.trim()\n ? `<instructions>\\n${input.instructions.trim().replace(/<\\/instructions>/gi, \"<\\\\/instructions>\")}\\n</instructions>\\n\\n`\n : \"\";\n const head = `${instructions}<${kind}${attrs}>\\n<context>\\n${context}\\n</context>\\n${summary}<data format=\"${dataFormat}\">\\n`;\n let fenced: string;\n let body: string;\n if (dataFormat === \"json\") {\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 fenced = fenceJsonBlock(safeJson);\n body = safeJson.trimEnd();\n } else {\n if (typeof input.data !== \"string\") throw new Error(`AI envelope ${dataFormat} data must be text.`);\n // Text travels verbatim: the fence (longer than any backtick run inside) is its only delimiter.\n fenced = fencedCodeBlock(input.data, dataFormat === \"text\" ? \"text\" : dataFormat);\n body = input.data;\n }\n return {\n text: `${head}${fenced}\\n</data>\\n</${kind}>`,\n body,\n // The fence line is backticks + the language + a line break; the body follows it verbatim.\n bodyOffset: head.length + fenced.indexOf(\"\\n\") + 1,\n };\n}\n","import { stringifyJson } from \"@ai-matrx/kit/json-format\";\nimport { escapeHtml } from \"@ai-matrx/kit/html-escape\";\nimport {\n ContentTransferError,\n cloneTransferJson,\n normalizeTransferJson,\n normalizeTransferJsonAtPath,\n} from \"@ai-matrx/kit/transfer-json\";\nexport {\n ContentTransferError,\n normalizeTransferJson,\n type NormalizeTransferJsonOptions,\n} from \"@ai-matrx/kit/transfer-json\";\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 \"./types\";\nexport * from \"./types\";\nexport * from \"./agent-payload\";\n\n/** A realm-wide brand (Symbol.for), so a binding made by one loaded copy is recognised by another. */\nconst bound: unique symbol = Symbol.for(\"ai-matrx.alchemy.operate.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, \"~\");\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 normalizeTransferJsonAtPath(value, path, {\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}\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 cloneTransferJson(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 excludedColumn(column: Column): boolean {\n return (\n column.exportable === false ||\n column.classification === \"secret\" ||\n column.classification === \"credential\"\n );\n}\nfunction rowProjectionExcludesColumnSchema(\n column: Column,\n rules: ExportProjection[\"rules\"],\n): boolean {\n return rules.some(\n (rule) =>\n rule.target === \"row\" &&\n (!rule.exportable || rule.classification !== \"ordinary\") &&\n (rule.path === column.path || column.path.startsWith(`${rule.path}/`)),\n );\n}\n/** Project the schema with the same payload rules that govern column metadata. */\nfunction projectColumnSchema(\n column: Column,\n rules: ExportProjection[\"rules\"],\n omit: Omission[],\n): Column[\"schema\"] | undefined {\n if (column.schema === undefined) return undefined;\n const root = `/columns/${enc(column.id)}/schema`;\n const schemaRules = rules\n .filter((rule) => rule.target === \"payload\" && (rule.path === root || rule.path.startsWith(`${root}/`)))\n .map((rule) => ({ ...rule, path: rule.path.slice(root.length) }));\n const projected = projectValue(column.schema, schemaRules, \"payload\", omit);\n if (schemaRules.some((rule) => rule.path === \"\" && (!rule.exportable || rule.classification !== \"ordinary\")))\n return undefined;\n return projected as Column[\"schema\"];\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 const text = typeof value === \"string\" ? value : \"\";\n // A code block keeps its language (downloads take its extension; Markdown fences it).\n return p.kind === \"text\" && typeof p.language === \"string\" && p.language.trim()\n ? { kind: \"text\", text, language: p.language.trim() }\n : { kind: p.kind, text };\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 sourceColumns = rowsPayload.columns.map((column) => ({ ...column }));\n const columns = sourceColumns\n .filter((column) => !excludedColumn(column))\n .map((column) => {\n // Do not spread source schema back after an explicit schema or row exclusion.\n const { schema: _sourceSchema, ...withoutSchema } = column;\n const schema = rowProjectionExcludesColumnSchema(column, projection.rules)\n ? undefined\n : projectColumnSchema(column, projection.rules, omit);\n return {\n ...withoutSchema,\n ...(schema === undefined ? {} : { schema }),\n };\n });\n resolveTransferRegistry(columns);\n columns.forEach((column) => validatePointer(column.path));\n const rules = [\n ...projection.rules,\n ...sourceColumns\n .filter(excludedColumn)\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: cloneTransferJson(all.query.query),\n order: all.query.order.map((x) => ({ ...x })),\n },\n },\n projection: { rules: captured.projection.rules.map((x) => ({ ...x })) },\n // Page rows must be normalized against the original declaration so excluded\n // column values are removed before stable IDs or any caller can observe them.\n columns:\n captured.snapshot.payload.kind === \"rows\"\n ? captured.snapshot.payload.columns.map((column) => ({ ...column }))\n : [],\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\");\n/**\n * A deterministic revision of `d` (the structure trees, PP-06/07): same snapshot, next revision,\n * the given omissions added. `baseOmissions` replaces the draft's own when a step re-projects from\n * the snapshot (a section selection), exactly as `applySectionSelection` does.\n */\nexport const deriveDraft = (\n d: Draft,\n p: Payload,\n o: Omission[],\n description: string,\n baseOmissions: readonly Omission[] = d.omissions,\n) => revise(d, p, o, description, d.manuallyEdited, \"deterministic\", baseOmissions);\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 if (s.payload.kind === \"markdown\" || s.payload.kind === \"text\") {\n // A prose section is a character range of the text: `/text/<start>-<end>`.\n const text = s.payload.text;\n const ranges = paths\n .map((path) => {\n const m = /^\\/text\\/(\\d+)-(\\d+)$/.exec(path);\n const start = m ? Number(m[1]) : NaN,\n end = m ? Number(m[2]) : NaN;\n if (!m || start > end || end > text.length)\n throw new ContentTransferError(\n \"invalid-section\",\n `Section \"${path}\" is not a range of this text. Declare a prose section as /text/<start>-<end> within the text.`,\n );\n return [start, end] as const;\n })\n .sort((a, b) => b[0] - a[0]);\n let kept = text;\n for (const [start, end] of ranges) kept = kept.slice(0, start) + kept.slice(end);\n return revise(\n d,\n { ...s.payload, text: kept },\n omit,\n \"Selected sections\",\n d.manuallyEdited,\n \"deterministic\",\n baseOmissions,\n );\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 const excludedColumns = d.payload.columns.length - cols.length;\n if (excludedColumns > 0)\n omit.push({\n path: \"/columns\",\n reason: \"excluded\",\n count: excludedColumns,\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(cloneTransferJson(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}\n// An EMPTY cell is empty text. `null` is how a row carries \"nothing here\"\n// (hosts normalise a missing cell to JSON null so the row keeps its shape), and\n// until 2026-09-21 it serialized as the word \"null\" in every plain / CSV / TSV\n// / Markdown copy — six \"null\"s across a copied row of a data table.\nconst textValue = (value: Json | undefined): string =>\n value === undefined || value === null\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\n/** The columns a text serialization writes: visible, exportable, never secret or credential. */\nexport function exportedColumns(columns: readonly Column[]): Column[] {\n return columns.filter(\n (c) =>\n c.visible &&\n c.exportable !== false &&\n c.classification !== \"secret\" &&\n c.classification !== \"credential\",\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 = exportedColumns(payload.columns);\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 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 initialEnvelope: menu.initialEnvelope ?? provider.initialEnvelope ?? \"ai\",\n limits,\n });\n}\n/**\n * True for the objects React uses to represent a component or an element —\n * `forwardRef`, `memo`, `lazy`, portals, elements. They are all tagged with the\n * `$$typeof` symbol, which is exactly the test React uses itself.\n */\nfunction isReactElementType(value: object): boolean {\n const tag = (value as { $$typeof?: unknown }).$$typeof;\n return typeof tag === \"symbol\";\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 // A React component or element is registered BEHAVIOUR too — it is rendered,\n // never inspected — and `React.forwardRef` / `React.memo` produce OBJECTS\n // rather than functions. React's development build defines their\n // `displayName` as an ACCESSOR, so walking into one threw \"cannot use\n // accessors\" at `registration/icon/displayName` and took EVERY dashboard page\n // that renders a transfer menu down behind its error boundary (2026-09-14;\n // every AI variant the admin dashboard registers carries a lucide `icon`).\n // Recognised the way React itself recognises them.\n if (isReactElementType(value)) 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","/**\n * `@ai-matrx/alchemy/operate/formats/rich-html` — the rich clipboard format (CONTRACT §1.9a).\n *\n * Engine: THE one Markdown→HTML engine (`@ai-matrx/print/markdown-html`, loaded lazily) with the\n * `inline` skin — styles on elements, no class dependence, because Google Docs and Word drop\n * `<style>` and classes on paste. Docs and Word are one action (\"Copy formatted\") until a\n * destination profile produces different bytes. Private images go through the host's asset\n * port. Every HTML string ends in print's allow-list.\n */\n\nimport type { MarkdownHtmlEngine } from \"@ai-matrx/print/markdown-html\";\nimport { ContentTransferError, sealTransferArtifact } from \"../core\";\nimport type { FormatEngine, FormatOptions } from \"../contract\";\nimport type { Artifact, Draft } from \"../types\";\n\nconst ENGINE = Symbol.for(\"ai-matrx.alchemy.operate.markdown-html-engine\");\n\n/** One engine per realm, created on first use (the print module itself loads only here). */\nexport async function loadMarkdownHtmlEngine(): Promise<MarkdownHtmlEngine> {\n const g = globalThis as unknown as Record<symbol, Promise<MarkdownHtmlEngine> | undefined>;\n g[ENGINE] ??= import(\"@ai-matrx/print/markdown-html\").then((m) => m.createMarkdownHtmlEngine());\n return g[ENGINE] as Promise<MarkdownHtmlEngine>;\n}\n\nfunction parseOptions(options: FormatOptions, signal: AbortSignal) {\n return {\n signal,\n ...(options.onNotice ? { onNotice: options.onNotice } : {}),\n ...(options.assets ? { assets: options.assets } : {}),\n };\n}\n\n/** Plain text from the one parse (the `plain` format for Markdown payloads). */\nexport async function markdownPlainText(markdown: string, options: FormatOptions, signal: AbortSignal): Promise<string> {\n const engine = await loadMarkdownHtmlEngine();\n return engine.plainText(await engine.parse(markdown, parseOptions(options, signal)));\n}\n\nexport const richHtmlEngine: FormatEngine = {\n async build(draft: Draft, options: FormatOptions, signal: AbortSignal): Promise<Artifact> {\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n if (draft.payload.kind !== \"markdown\") {\n throw new ContentTransferError(\"unsupported-format\", \"Formatted copy needs Markdown content. Copy it as plain text instead.\");\n }\n const engine = await loadMarkdownHtmlEngine();\n const tree = await engine.parse(draft.payload.text, parseOptions(options, signal));\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n const html = engine.fragment(tree, { skin: options.skin ?? \"inline\", profile: options.profile ?? \"generic\" });\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format: \"rich-html\",\n plainText: engine.plainText(tree),\n html,\n file: { filename: options.filename ?? \"export.html\", mime: \"text/html;charset=utf-8\", bytes: new TextEncoder().encode(html) },\n omissions: draft.omissions.map((o) => ({ ...o })),\n });\n },\n};\n","/**\n * `@ai-matrx/alchemy/operate/formats/document` — HTML page, PDF, DOCX and EPUB (CONTRACT §1.9).\n *\n * One tree: the HTML page is THE one Markdown→HTML engine's `document()` (print's\n * `documentToHtml`, body allow-listed); PDF (vector, selectable text), DOCX and EPUB are print's\n * `/document` writers over the same parse. Print loads only when one of these is chosen.\n * A text payload with a language exports as its fenced code block.\n */\n\nimport { ContentTransferError, sealTransferArtifact } from \"../core\";\nimport type { FormatEngine, FormatOptions } from \"../contract\";\nimport { fencedCodeBlock } from \"../fenced-code\";\nimport type { Artifact, Draft } from \"../types\";\nimport { loadMarkdownHtmlEngine } from \"./rich-html\";\n\nconst enc = new TextEncoder();\n\nfunction markdownOf(draft: Draft): string {\n const p = draft.payload;\n if (p.kind === \"markdown\") return p.text;\n if (p.kind === \"text\") {\n if (!p.language) return p.text;\n return fencedCodeBlock(p.text, p.language);\n }\n throw new ContentTransferError(\"unsupported-format\", \"A document needs text or Markdown content. Download it as JSON or CSV instead.\");\n}\n\nconst stem = (filename: string | undefined) => (filename ? filename.replace(/\\.[a-z0-9]+$/i, \"\") : undefined);\n\n/** The standalone HTML page (the `html` format for prose). */\nexport const documentHtmlEngine: FormatEngine = {\n async build(draft: Draft, options: FormatOptions, signal: AbortSignal): Promise<Artifact> {\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n const engine = await loadMarkdownHtmlEngine();\n const tree = await engine.parse(markdownOf(draft), {\n signal,\n ...(options.onNotice ? { onNotice: options.onNotice } : {}),\n ...(options.assets ? { assets: options.assets } : {}),\n });\n const page = engine.document(tree);\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format: \"html\",\n plainText: engine.plainText(tree),\n html: page,\n file: { filename: options.filename ?? \"export.html\", mime: \"text/html;charset=utf-8\", bytes: enc.encode(page) },\n omissions: draft.omissions.map((o) => ({ ...o })),\n });\n },\n};\n\n/** PDF / DOCX / EPUB through print's `/document` (lazy). */\nexport function documentEngine(format: \"pdf\" | \"docx\" | \"epub\"): FormatEngine {\n return {\n async build(draft: Draft, options: FormatOptions, signal: AbortSignal): Promise<Artifact> {\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n const source = markdownOf(draft);\n const { exportDocument } = await import(\"@ai-matrx/print/document\");\n const name = stem(options.filename);\n const out = await exportDocument(source, format, {\n ...(name ? { fileName: name } : {}),\n ...(options.onNotice ? { onNotice: (n) => options.onNotice?.({ code: n.code, sentence: n.message, remedy: n.remedy }) } : {}),\n });\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format,\n plainText: source,\n file: { filename: out.fileName, mime: out.mime, bytes: out.bytes },\n omissions: draft.omissions.map((o) => ({ ...o })),\n });\n },\n };\n}\n","/**\n * `@ai-matrx/alchemy/operate` — THE transfer engine (Matrx Alchemy CONTRACT §2.3, ALC-16).\n *\n * capture → projection → draft → a SEALED artifact → delivery. Built-in formats need no heavy\n * dependency; rich HTML, the HTML page, PDF, DOCX and EPUB load `@ai-matrx/print` on first use,\n * and the Excel workbook loads SheetJS on first use. No React.\n */\nexport * from \"./operate/core\";\nexport type {\n BuiltInFormatId,\n Delivery,\n DeliveryOutcome,\n FormatAdapter,\n FormatEngine,\n FormatOptions,\n Notice,\n Receipt,\n SealedArtifact,\n ServerOperation,\n TransferOperation,\n WriteTargetRef,\n} from \"./operate/contract\";\nexport {\n DuplicateWriteHandlerError,\n createWriteDoor,\n type CannotApply,\n type WriteApplyRequest,\n type WriteCaller,\n type WriteDoor,\n type WriteDoorDeclarations,\n type WriteDoorPorts,\n type WriteHandler,\n type WriteHandlerResult,\n type WriteOp,\n type WriteRefusalReason,\n type WriteRequest,\n type WriteReviewPort,\n} from \"./operate/door\";\nexport { hasThinking, stripThinking } from \"./operate/thinking\";\nexport { FORMAT_ADAPTERS, eligibleFormats, extensionForLanguage, formatAdapter } from \"./operate/formats\";\nexport {\n createDelivery,\n isSealed,\n openPreparation,\n sealArtifact,\n sealDraft,\n type PreparationOptions,\n type PreparationSession,\n} from \"./operate/preparation\";\nexport {\n agentPayloadWithSpans,\n jsonTextSpans,\n offsetSpans,\n spanMap,\n type OutputSpan,\n type SpanMap,\n} from \"./operate/spans\";\nexport {\n EMPTY_STRUCTURE,\n applyJsonStructure,\n applySectionStructure,\n applyStructureToJson,\n concretePointers,\n displayPath,\n isProseSection,\n joinPointer,\n jsonSize,\n nodeChars,\n outputPointer,\n patternBelow,\n patternCovers,\n patternMatches,\n pointerSegments,\n sectionLayout,\n stubText,\n type NodeLimit,\n type SectionLayout,\n type StructureRecipe,\n} from \"./operate/tree\";\nexport {\n TRANSFER_DEFAULT_RECIPE_SETTING,\n recipeKey,\n resolveDefaultRecipe,\n setPersonDefaultRecipe,\n type RecipeOrigin,\n type ResolvedRecipe,\n} from \"./operate/recipes\";\n","/**\n * THE ONE WRITE DOOR (Matrx Alchemy ALC-17; Applets CONTRACTS §6 \"receipts through the one write door\").\n *\n * Every write — a person's edit, a menu row, a destination send, an agent, an applet, an automation,\n * an Action projected from a write target — lands through `door.write`. The door:\n *\n * 1. resolves the DECLARED write target (the surface's own, then its ancestors'); an undeclared\n * target is refused by name;\n * 2. enforces the mode: `stream` takes ops from the target's `streamOps`; ops on any other target\n * need `patchable` (+ `updatesValue`); a value on a `stream` target is refused;\n * 3. checks the kind (rule 10): a person's mismatch WARNS (the receipt is still applied, with a\n * `warning` and a `fix`); an agent's, applet's or automation's malformed write is REFUSED;\n * 4. applies the policy: manual → a person only; ask → a person's own act is the approval, anyone\n * else asks through `approvals`; queued → filed through `review`; auto → applies;\n * 5. applies through the handler: the mounted page's LIVE handler wins over the HEADLESS one;\n * neither → refused `unapplicable` (\"open <surface> to apply it\");\n * 6. turns stale / missing record / broken protected span into \"cannot apply\" with a one-click\n * remedy (rule 11).\n *\n * Every outcome is a `Receipt` carrying the system's own sentence. `write` never throws.\n *\n * Who counts as a person: `person`, `menu` and `destination` (a destination send is a person's own\n * click on \"Send to …\"). `agent`, `applet` and `automation` are not.\n *\n * Open-risk ruling — stream ops into an entity target: an entity write is ONE atomic save. Ops reach\n * an entity target only when it is declared `patchable` (the ops are handed to the handler in one\n * call and commit as one save); a non-patchable entity target refuses ops with the remedy \"stream\n * into the editor, then save\". Op-by-op persistence into a record does not exist.\n */\nimport type { AlchemyHostPorts, Json } from \"../ports\";\nimport type { ItemType, StreamOp, WriteTarget } from \"../declare/types\";\nimport type { Receipt, WriteTargetRef } from \"./contract\";\n\n/** Who is writing. `menu` and `destination` are a person's own act. */\nexport type WriteCaller = \"person\" | \"agent\" | \"applet\" | \"automation\" | \"destination\" | \"menu\";\n\n/** One text op for a `stream` (or `patchable`) target — the WidgetHandle op set. */\nexport interface WriteOp {\n op: StreamOp;\n /** The text the op inserts or replaces with. */\n text?: string;\n /** What `replace` / `insert_before` / `insert_after` / `patch` anchor on. */\n find?: string;\n}\n\nexport interface WriteRequest {\n surfaceName: string;\n /** A write target name; `\"<itemType>.<name>\"` names an item's target. */\n target: string;\n itemType?: string;\n /** Which item, by its declared identity values. Required for an item target. */\n itemIdentity?: Record<string, string>;\n /** A whole value. Exactly one of `value` / `ops`. */\n value?: unknown;\n /** Text ops (stream / patchable targets). */\n ops?: readonly WriteOp[];\n by: WriteCaller;\n runId?: string;\n}\n\n/** What a handler receives: the request plus the declared target it resolved to. */\nexport interface WriteApplyRequest {\n surfaceName: string;\n /** The surface that declares the target (an ancestor when inherited). */\n declaredOn: string;\n target: WriteTarget;\n item?: { itemType: string; identity: Record<string, string> };\n value?: unknown;\n ops?: readonly WriteOp[];\n by: WriteCaller;\n runId?: string;\n}\n\n/** Rule 11: the three \"cannot apply\" signals. */\nexport type CannotApply = \"stale\" | \"missing-record\" | \"broken-span\";\n\n/**\n * A handler applies the write. Return nothing (or `{ status: \"applied\" }`) when it landed, or a\n * `cannotApply` signal; THROWING an error whose `code` is a `CannotApply` signal means the same.\n */\nexport type WriteHandlerResult =\n | void\n | { status: \"applied\"; sentence?: string; /** What the write produced (e.g. the created record); passed to `receipt.result` unchanged. */ result?: Json }\n | { status: \"cannot-apply\"; cannotApply: CannotApply; sentence?: string; remedy?: string };\n\nexport type WriteHandler = (request: WriteApplyRequest, signal: AbortSignal) => WriteHandlerResult | Promise<WriteHandlerResult>;\n\n/** Files a `queued` write for an organization's review. */\nexport interface WriteReviewPort {\n file(request: WriteApplyRequest): Promise<{ sentence?: string; remedy?: string } | void>;\n}\n\n/** Why a write was refused. */\nexport type WriteRefusalReason =\n | \"undeclared\"\n | \"needs_item\"\n | \"malformed\"\n | \"declaration_broken\"\n | \"manual_only\"\n | \"needs_approval\"\n | \"declined\"\n | \"no_review\"\n | \"unapplicable\"\n | \"cannot_apply\"\n | \"cancelled\"\n | \"failed\";\n\nexport interface WriteDoor {\n write(request: WriteRequest, signal?: AbortSignal): Promise<Receipt>;\n /** A feature's write handler that works with no page mounted. Refuses a second one for the same target. */\n registerHeadless(surfaceName: string, targetName: string, handler: WriteHandler): () => void;\n /** A mounted page's handler; wins over the headless one while registered. Returns unregister. */\n registerLive(surfaceName: string, targetName: string, handler: WriteHandler): () => void;\n}\n\n/** The declarations the door reads: a `DeclarationRegistry` satisfies it. */\nexport interface WriteDoorDeclarations {\n get(surfaceName: string): { writeTargets?: readonly WriteTarget[]; itemTypes?: readonly ItemType[] } | undefined;\n /** Parent chain, root first (the registry's `ancestry`). Absent = no inheritance. */\n ancestry?(surfaceName: string): string[];\n}\n\nexport type WriteDoorPorts = Pick<AlchemyHostPorts, \"diagnostics\" | \"kinds\" | \"approvals\" | \"review\">;\n\nconst PERSON: ReadonlySet<WriteCaller> = new Set([\"person\", \"menu\", \"destination\"]);\nconst POLICIES: ReadonlySet<string> = new Set([\"manual\", \"ask\", \"auto\", \"queued\"]);\n\nexport class DuplicateWriteHandlerError extends Error {\n constructor(surfaceName: string, targetName: string) {\n super(`[door] \"${surfaceName}\" already has a headless handler for \"${targetName}\". One handler per target; nothing was overwritten.`);\n this.name = \"DuplicateWriteHandlerError\";\n }\n}\n\nfunction handlerKey(surfaceName: string, itemType: string, name: string): string {\n return `${surfaceName}\\u0000${itemType}\\u0000${name}`;\n}\n\nfunction splitTarget(target: string, itemType?: string): { itemType: string; name: string } {\n const dot = target.indexOf(\".\");\n if (dot > 0 && !itemType) return { itemType: target.slice(0, dot), name: target.slice(dot + 1) };\n return { itemType: itemType ?? \"\", name: target };\n}\n\nfunction qualified(itemType: string, name: string): string {\n return itemType ? `${itemType}.${name}` : name;\n}\n\nfunction messageOf(error: unknown): string {\n if (error instanceof Error && error.message.trim()) return error.message;\n if (typeof error === \"string\" && error.trim()) return error;\n return \"The save failed without saying why.\";\n}\n\nfunction toJson(value: unknown): Json {\n if (value === undefined) return null;\n if (value instanceof Uint8Array) return `<${value.byteLength} bytes>`;\n try {\n return JSON.parse(JSON.stringify(value)) as Json;\n } catch {\n return String(value);\n }\n}\n\n/** Does `value` have the declared value type? `document` takes text or a structured document. */\nfunction typeMatches(valueType: WriteTarget[\"valueType\"], value: unknown): boolean {\n switch (valueType) {\n case \"string\":\n return typeof value === \"string\";\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value);\n case \"boolean\":\n return typeof value === \"boolean\";\n case \"array\":\n return Array.isArray(value);\n case \"object\":\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && !(value instanceof Uint8Array);\n case \"document\":\n return typeof value === \"string\" || value instanceof Uint8Array || (typeof value === \"object\" && value !== null);\n default:\n return true;\n }\n}\n\nconst CANNOT_APPLY_WORDS: Record<CannotApply, { sentence: string; remedy: string }> = {\n stale: {\n sentence: \"it changed since this was written\",\n remedy: \"Reload the latest version and apply it again.\",\n },\n \"missing-record\": {\n sentence: \"the record it belongs to no longer exists\",\n remedy: \"Pick where it should go instead and apply it again.\",\n },\n \"broken-span\": {\n sentence: \"it would break a protected part of the content\",\n remedy: \"Review the change against the protected part and apply it again.\",\n },\n};\n\nfunction cannotApplyOf(error: unknown): CannotApply | null {\n const code = (error as { code?: unknown } | null)?.code;\n return code === \"stale\" || code === \"missing-record\" || code === \"broken-span\" ? code : null;\n}\n\nexport function createWriteDoor(options: { ports: WriteDoorPorts; declarations: WriteDoorDeclarations }): WriteDoor {\n const { ports, declarations } = options;\n const headless = new Map<string, WriteHandler>();\n const live = new Map<string, WriteHandler[]>();\n\n const capture = (error: unknown, detail: Json) => {\n try {\n ports.diagnostics.capture(error, { area: \"write\", detail });\n } catch {\n // A broken diagnostics port never turns a receipt into a throw.\n }\n };\n\n function resolveTarget(\n surfaceName: string,\n itemType: string,\n name: string,\n ): { target: WriteTarget; declaredOn: string; itemType: string; identity: readonly string[] | null } | null {\n let chain: string[] = [surfaceName];\n try {\n chain = [surfaceName, ...(declarations.ancestry?.(surfaceName) ?? []).slice().reverse()];\n } catch (error) {\n capture(error, { stage: \"ancestry\", surfaceName });\n }\n for (const surface of chain) {\n const declaration = declarations.get(surface);\n if (!declaration) continue;\n const screen = (declaration.writeTargets ?? []).find((t) => t.name === name && (t.itemType ?? \"\") === itemType);\n if (screen) {\n const item = itemType ? declaration.itemTypes?.find((i) => i.name === itemType) : undefined;\n return { target: screen, declaredOn: surface, itemType, identity: itemType ? (item?.identity ?? []) : null };\n }\n if (itemType) {\n const item = declaration.itemTypes?.find((i) => i.name === itemType);\n const own = item?.writeTargets?.find((t) => t.name === name);\n if (item && own) return { target: own, declaredOn: surface, itemType, identity: item.identity };\n }\n }\n return null;\n }\n\n /** The surfaces from the writing one up to (and including) the one that declared the target, nearest first. */\n function chainUpTo(surfaceName: string, declaredOn: string): string[] {\n let chain: string[] = [surfaceName];\n try {\n chain = [surfaceName, ...(declarations.ancestry?.(surfaceName) ?? []).slice().reverse()];\n } catch (error) {\n capture(error, { stage: \"ancestry\", surfaceName });\n }\n const end = chain.indexOf(declaredOn);\n return end >= 0 ? chain.slice(0, end + 1) : [surfaceName, declaredOn];\n }\n\n function handlerFor(surfaces: readonly string[], itemType: string, name: string): WriteHandler | null {\n for (const surface of surfaces) {\n const key = handlerKey(surface, itemType, name);\n const stack = live.get(key);\n if (stack?.length) return stack[stack.length - 1] ?? null;\n }\n for (const surface of surfaces) {\n const handler = headless.get(handlerKey(surface, itemType, name));\n if (handler) return handler;\n }\n return null;\n }\n\n async function write(request: WriteRequest, signal: AbortSignal = new AbortController().signal): Promise<Receipt> {\n if (!request || typeof request.target !== \"string\" || !request.target) {\n // The door never throws to its caller, even for a request the types forbid.\n return {\n status: \"refused\",\n to: { surfaceName: String(request?.surfaceName ?? \"\"), target: String(request?.target ?? \"\") },\n reason: \"malformed\",\n sentence: \"This write names no place to save, so nothing was saved.\",\n remedy: \"Name the declared write target to save into.\",\n };\n }\n const { itemType, name } = splitTarget(request.target, request.itemType);\n const to: WriteTargetRef = {\n surfaceName: request.surfaceName,\n target: qualified(itemType, name),\n ...(request.itemIdentity && itemType ? { item: { itemType, identity: request.itemIdentity } } : {}),\n };\n const refuse = (reason: WriteRefusalReason, sentence: string, remedy: string): Receipt => ({ status: \"refused\", to, reason, sentence, remedy });\n const isPerson = PERSON.has(request.by);\n try {\n if (!request.surfaceName) {\n return refuse(\"undeclared\", `This write names no screen, so \"${to.target}\" can't be found.`, \"Send it from the screen it belongs to.\");\n }\n const resolved = resolveTarget(request.surfaceName, itemType, name);\n if (!resolved) {\n return refuse(\n \"undeclared\",\n `${request.surfaceName} declares no write target ${to.target}, so nothing was saved.`,\n `Pick one of ${request.surfaceName}'s declared places to save, or declare \"${to.target}\" on it.`,\n );\n }\n const { target, declaredOn } = resolved;\n const label = target.label || target.name;\n\n // Item targets need to know which item.\n let item: WriteApplyRequest[\"item\"];\n if (resolved.identity) {\n const identity = request.itemIdentity ?? {};\n const missing = resolved.identity.filter((key) => !identity[key]);\n if (!request.itemIdentity || missing.length) {\n return refuse(\n \"needs_item\",\n `\"${label}\" saves into one ${resolved.itemType}, and this write doesn't say which${missing.length ? ` (missing ${missing.join(\", \")})` : \"\"}.`,\n `Pick the ${resolved.itemType} first, then save again.`,\n );\n }\n item = { itemType: resolved.itemType, identity: { ...identity } };\n }\n\n // ── Mode ────────────────────────────────────────────────────────────\n const hasOps = request.ops !== undefined;\n if (hasOps === (request.value !== undefined)) {\n return refuse(\n \"malformed\",\n hasOps ? `A write to \"${label}\" carries both a value and edits; send one.` : `A write to \"${label}\" carries nothing to save.`,\n \"Send either the whole value or the edits, then try again.\",\n );\n }\n if (target.mode === \"stream\" || (hasOps && target.patchable)) {\n if (!target.updatesValue) {\n capture(new Error(`write target \"${to.target}\" on ${declaredOn} edits text but declares no updatesValue`), { stage: \"declaration\", surfaceName: declaredOn, target: to.target });\n return refuse(\n \"declaration_broken\",\n `\"${label}\" edits text but doesn't say which value it edits, so it can't be applied safely.`,\n `Declare updatesValue on ${declaredOn}'s \"${to.target}\".`,\n );\n }\n }\n if (target.mode === \"stream\") {\n if (!hasOps) {\n return refuse(\"malformed\", `\"${label}\" takes edits, not a whole value.`, `Send it as edits (${(target.streamOps ?? []).join(\", \") || \"none declared\"}).`);\n }\n if (!target.streamOps?.length) {\n capture(new Error(`stream target \"${to.target}\" on ${declaredOn} declares no streamOps`), { stage: \"declaration\", surfaceName: declaredOn, target: to.target });\n return refuse(\"declaration_broken\", `\"${label}\" takes edits but declares none it accepts.`, `Declare streamOps on ${declaredOn}'s \"${to.target}\".`);\n }\n } else if (hasOps) {\n if (!target.patchable) {\n return refuse(\n \"malformed\",\n target.mode === \"entity\"\n ? `\"${label}\" saves a whole record at once and takes no live edits.`\n : `\"${label}\" takes a whole value, not edits.`,\n target.mode === \"entity\" ? \"Stream the edits into the editor, then save the result.\" : \"Send the whole value instead.\",\n );\n }\n }\n if (hasOps) {\n const allowed = new Set<string>(target.mode === \"stream\" ? (target.streamOps ?? []) : (target.streamOps ?? [\"patch\"]));\n const bad = (request.ops ?? []).filter((op) => !op || !allowed.has(op.op)).map((op) => String(op?.op));\n if (!request.ops?.length || bad.length) {\n const sentence = !request.ops?.length\n ? `A write to \"${label}\" carries no edits.`\n : `\"${label}\" doesn't accept the edit${bad.length > 1 ? \"s\" : \"\"} ${bad.join(\", \")}.`;\n return refuse(\"malformed\", sentence, `Use only ${[...allowed].join(\", \")}.`);\n }\n }\n\n // ── Kind (rule 10) ──────────────────────────────────────────────────\n let warning: { warning: string; fix: string } | null = null;\n if (!hasOps) {\n let problem: { sentence: string; remedy: string } | null = null;\n if (!typeMatches(target.valueType, request.value)) {\n problem = { sentence: `\"${label}\" expects ${target.valueType === \"array\" ? \"a list\" : `a ${target.valueType}`}.`, remedy: `Send it as ${target.valueType === \"array\" ? \"a list\" : `a ${target.valueType}`}.` };\n } else if (target.valueKind) {\n if (!ports.kinds) {\n problem = { sentence: `\"${label}\" holds ${target.valueKind}, and it can't be checked here.`, remedy: \"Check the content before relying on it.\" };\n } else {\n const verdict = await ports.kinds.validate(target.valueKind, request.value, signal);\n if (!verdict.ok) problem = { sentence: verdict.sentence, remedy: verdict.remedy };\n }\n }\n if (problem) {\n if (!isPerson) return refuse(\"malformed\", `The write to \"${label}\" was refused: ${problem.sentence}`, problem.remedy);\n warning = { warning: problem.sentence, fix: problem.remedy };\n }\n }\n\n // ── Policy ──────────────────────────────────────────────────────────\n const applyRequest: WriteApplyRequest = {\n surfaceName: request.surfaceName,\n declaredOn,\n target,\n ...(item ? { item } : {}),\n ...(request.ops ? { ops: request.ops } : { value: request.value }),\n by: request.by,\n ...(request.runId ? { runId: request.runId } : {}),\n };\n const declaredPolicy = target.applyPolicy ?? \"manual\";\n // An unrecognised policy (a typo in a row) is the strictest one, announced — never auto.\n const policy = POLICIES.has(declaredPolicy) ? declaredPolicy : \"manual\";\n if (policy !== declaredPolicy) {\n capture(new Error(`write target \"${to.target}\" on ${declaredOn} declares unknown applyPolicy \"${String(declaredPolicy)}\"; treated as manual`), {\n stage: \"declaration\",\n surfaceName: declaredOn,\n target: to.target,\n });\n }\n if (policy === \"manual\" && !isPerson) {\n return refuse(\"manual_only\", `\"${label}\" is saved only by a person, so the ${request.by}'s write was not applied.`, \"Ask a person to review it and save it themselves.\");\n }\n if (policy === \"ask\" && !isPerson) {\n if (!ports.approvals) {\n return refuse(\"needs_approval\", `\"${label}\" needs a person's approval, and there is no one to ask here.`, `Open ${request.surfaceName} so a person can approve it.`);\n }\n if (signal.aborted) return refuse(\"cancelled\", `\"${label}\" was cancelled before anyone was asked, so nothing was saved.`, \"Send it again when you're ready.\");\n let approved: boolean;\n try {\n approved = await ports.approvals.ask({\n action: to.target,\n label,\n description: target.description,\n input: hasOps ? ({ ops: toJson(request.ops) } as Json) : toJson(request.value),\n by: request.by as \"agent\" | \"applet\" | \"automation\",\n surfaceName: request.surfaceName,\n ...(request.runId ? { runId: request.runId } : {}),\n });\n } catch (error) {\n capture(error, { stage: \"approval\", surfaceName: request.surfaceName, target: to.target, by: request.by });\n return refuse(\"failed\", `Couldn't ask a person to approve \"${label}\", so nothing was saved: ${messageOf(error)}`, \"Try again; if it keeps failing, open the page and save it yourself.\");\n }\n if (!approved) return refuse(\"declined\", `\"${label}\" was not approved, so nothing was saved.`, \"Change it and propose it again.\");\n }\n if (policy === \"queued\") {\n if (!ports.review) {\n return refuse(\"no_review\", `\"${label}\" is saved only after review, and review isn't available here.`, `Open ${request.surfaceName} where review is available, then send it again.`);\n }\n const filed = await ports.review.file(applyRequest);\n return {\n status: \"queued\",\n to,\n sentence: filed?.sentence ?? `Sent \"${label}\" for review; it will be saved once approved.`,\n remedy: filed?.remedy ?? \"Open the review queue to approve it.\",\n };\n }\n\n // ── Apply ───────────────────────────────────────────────────────────\n // The nearest registered handler anywhere on the chain applies it (a middle surface may own the page).\n const handler = handlerFor(chainUpTo(request.surfaceName, declaredOn), resolved.itemType, name);\n if (!handler) {\n return refuse(\"unapplicable\", `\"${label}\" can only be saved with ${request.surfaceName} open, so nothing was saved.`, `Open ${request.surfaceName} to apply it.`);\n }\n if (signal.aborted) return refuse(\"cancelled\", `\"${label}\" was cancelled, so nothing was saved.`, \"Send it again when you're ready.\");\n let result: WriteHandlerResult;\n try {\n result = await handler(applyRequest, signal);\n } catch (error) {\n const signalled = cannotApplyOf(error);\n if (signalled) {\n const words = CANNOT_APPLY_WORDS[signalled];\n return refuse(\"cannot_apply\", `Can't apply \"${label}\": ${words.sentence}.`, words.remedy);\n }\n capture(error, { stage: \"apply\", surfaceName: request.surfaceName, target: to.target, by: request.by });\n return refuse(\"failed\", `\"${label}\" was not saved: ${messageOf(error)}`, \"Try again; if it keeps failing, copy it and paste it in by hand.\");\n }\n if (result && result.status === \"cannot-apply\") {\n const words = CANNOT_APPLY_WORDS[result.cannotApply];\n return refuse(\"cannot_apply\", result.sentence ?? `Can't apply \"${label}\": ${words.sentence}.`, result.remedy ?? words.remedy);\n }\n return {\n status: \"applied\",\n to,\n sentence: (result && result.sentence) || `Saved to \"${label}\".`,\n ...(result && result.status === \"applied\" && result.result !== undefined ? { result: result.result } : {}),\n ...(warning ?? {}),\n };\n } catch (error) {\n capture(error, { stage: \"door\", surfaceName: request.surfaceName, target: to.target, by: request.by });\n return refuse(\"failed\", `\"${to.target}\" was not saved: ${messageOf(error)}`, \"Try again; if it keeps failing, copy it and paste it in by hand.\");\n }\n }\n\n return {\n write,\n registerHeadless(surfaceName, targetName, handler) {\n const { itemType, name } = splitTarget(targetName);\n const key = handlerKey(surfaceName, itemType, name);\n if (headless.has(key)) throw new DuplicateWriteHandlerError(surfaceName, targetName);\n headless.set(key, handler);\n return () => {\n if (headless.get(key) === handler) headless.delete(key);\n };\n },\n registerLive(surfaceName, targetName, handler) {\n const { itemType, name } = splitTarget(targetName);\n const key = handlerKey(surfaceName, itemType, name);\n const stack = live.get(key) ?? [];\n stack.push(handler);\n live.set(key, stack);\n return () => {\n const current = live.get(key);\n if (!current) return;\n const index = current.lastIndexOf(handler);\n if (index !== -1) current.splice(index, 1);\n if (!current.length) live.delete(key);\n };\n },\n };\n}\n","/**\n * Reasoning (\"thinking\") blocks in model output. A copy of an answer leaves them out by default;\n * the menu's \"Copy including thinking\" variant puts them back (`stripThinking` prop of\n * `MatrxCopyMenu`). Pure and tiny: no engine is loaded.\n *\n * Same contract as print's `removeThinkingContent` — `thinking.test.ts` runs both over one corpus\n * so the two cannot drift apart.\n */\n\n/** Does this content carry any reasoning block? */\nexport function hasThinking(text: string): boolean {\n return !!text && /<thinking>|<think>|<reasoning>/i.test(text);\n}\n\n/**\n * The content without its reasoning blocks. A block between blank lines (its own paragraph) leaves two\n * paragraphs; a block inside a paragraph collapses to one line break; three or more newlines collapse to two.\n */\nexport function stripThinking(text: string): string {\n if (!text) return \"\";\n const hide = (_match: string, before: string, after: string) => (before.length >= 2 || after.length >= 2 ? \"\\n\\n\" : \"\\n\");\n return text\n .replace(/(\\n*)<thinking>[\\s\\S]*?<\\/thinking>(\\n*)/gi, hide)\n .replace(/(\\n*)<think>[\\s\\S]*?<\\/think>(\\n*)/gi, hide)\n .replace(/(\\n*)<reasoning>[\\s\\S]*?<\\/reasoning>(\\n*)/gi, hide)\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n","/**\n * Operate formats — one adapter per format, stable ids, synchronous eligibility, lazy engines\n * (Matrx Alchemy CONTRACT §1.9 / §2.3, ALC-16).\n *\n * Built in (no heavy dependency): plain, markdown, json, compact-json, csv, tsv, rows→html.\n * Loaded on first use: rich-html, html (documents), pdf, docx, epub (print's one Markdown→HTML\n * engine and document writers) and xlsx (SheetJS). The heavy libraries are only ever reached\n * through `import()`, so choosing plain text never downloads a PDF writer.\n */\n\nimport { ContentTransferError, resolveTransferRegistry, sealTransferArtifact, serialize } from \"./core\";\nimport type { FormatAdapter, FormatEngine, FormatOptions } from \"./contract\";\nimport { fencedCodeBlock } from \"./fenced-code\";\nimport type { Artifact, Draft, Payload } from \"./types\";\n\nconst enc = new TextEncoder();\nconst isRows = (p: Payload) => p.kind === \"rows\";\nconst isProse = (p: Payload) => p.kind === \"markdown\" || p.kind === \"text\";\nconst always = () => true;\n\n/** File extension for a code block's language (T17); unknown → txt. */\nconst LANGUAGE_EXTENSION: Readonly<Record<string, string>> = {\n typescript: \"ts\", ts: \"ts\", tsx: \"tsx\", javascript: \"js\", js: \"js\", jsx: \"jsx\", python: \"py\", py: \"py\",\n json: \"json\", html: \"html\", css: \"css\", sql: \"sql\", bash: \"sh\", sh: \"sh\", shell: \"sh\", zsh: \"sh\",\n yaml: \"yaml\", yml: \"yaml\", markdown: \"md\", md: \"md\", go: \"go\", rust: \"rs\", java: \"java\", ruby: \"rb\",\n php: \"php\", csharp: \"cs\", cs: \"cs\", cpp: \"cpp\", c: \"c\", swift: \"swift\", kotlin: \"kt\", xml: \"xml\", toml: \"toml\",\n};\nexport function extensionForLanguage(language: string | undefined): string {\n return (language && LANGUAGE_EXTENSION[language.trim().toLowerCase()]) || \"txt\";\n}\n\nfunction checkSignal(signal: AbortSignal) {\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n}\n\nfunction textArtifact(draft: Draft, format: string, text: string, mime: string, filename: string, html?: string): Artifact {\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format,\n plainText: text,\n ...(html === undefined ? {} : { html }),\n file: { filename, mime, bytes: enc.encode(html ?? text) },\n omissions: draft.omissions.map((o) => ({ ...o })),\n });\n}\n\n/** kit's `serialize` for the formats it owns, with the contract's filename and format id. */\nfunction serialized(format: \"json\" | \"compact-json\" | \"csv\" | \"tsv\", extension: string): FormatEngine {\n return {\n async build(draft, options, signal) {\n checkSignal(signal);\n const a = serialize(draft, format, {\n filename: options.filename ?? `export.${extension}`,\n ...(options.spreadsheetSafe === undefined ? { spreadsheetSafe: format === \"csv\" || format === \"tsv\" } : { spreadsheetSafe: options.spreadsheetSafe }),\n });\n return a;\n },\n };\n}\n\nconst plainEngine: FormatEngine = {\n async build(draft, options, signal) {\n checkSignal(signal);\n if (draft.payload.kind === \"markdown\") {\n // Plain text from the ONE parse: markdown chrome removed, tables as TSV, TeX kept.\n const { markdownPlainText } = await import(\"./formats/rich-html\");\n const text = await markdownPlainText(draft.payload.text, options, signal);\n return textArtifact(draft, \"plain\", text, \"text/plain;charset=utf-8\", options.filename ?? \"export.txt\");\n }\n const ext = draft.payload.kind === \"text\" ? extensionForLanguage(draft.payload.language) : \"txt\";\n const a = serialize(draft, \"plain\", { filename: options.filename ?? `export.${ext}` });\n return a;\n },\n};\n\nconst markdownEngine: FormatEngine = {\n async build(draft, options, signal) {\n checkSignal(signal);\n const p = draft.payload;\n if (p.kind === \"text\" && p.language) {\n // A code block's Markdown is a fence in its own language (longer than any fence inside it).\n const text = fencedCodeBlock(p.text, p.language);\n return textArtifact(draft, \"markdown\", text, \"text/markdown;charset=utf-8\", options.filename ?? \"export.md\");\n }\n return serialize(draft, \"markdown\", { filename: options.filename ?? \"export.md\" });\n },\n};\n\nconst htmlEngine: FormatEngine = {\n async build(draft, options, signal) {\n checkSignal(signal);\n if (isProse(draft.payload)) {\n const { documentHtmlEngine } = await import(\"./formats/document\");\n return documentHtmlEngine.build(draft, options, signal);\n }\n // Rows → the escaped <table>; JSON → an escaped <pre>. No print needed.\n return serialize(draft, \"html\", { filename: options.filename ?? \"export.html\" });\n },\n};\n\nconst lazy = (pick: () => Promise<FormatEngine>): (() => Promise<FormatEngine>) => pick;\n\n/** THE format adapters. Order is menu order. Ids are stable; labels are what a person reads. */\nexport const FORMAT_ADAPTERS: readonly FormatAdapter[] = Object.freeze([\n { id: \"plain\", label: \"Plain text\", extension: \"txt\", mime: \"text/plain;charset=utf-8\", modes: [\"copy\", \"download\"], runsOn: \"client\", supports: always, load: async () => plainEngine },\n { id: \"markdown\", label: \"Markdown\", extension: \"md\", mime: \"text/markdown;charset=utf-8\", modes: [\"copy\", \"download\"], runsOn: \"client\", supports: (p: Payload) => p.kind !== \"json\" && p.kind !== \"registered\", load: async () => markdownEngine },\n {\n // Google Docs and Word are ONE action until a destination profile produces different bytes (1.9a).\n id: \"rich-html\", label: \"Copy formatted\", extension: \"html\", mime: \"text/html;charset=utf-8\", modes: [\"copy\"], runsOn: \"client\",\n supports: (p: Payload) => p.kind === \"markdown\",\n load: lazy(async () => (await import(\"./formats/rich-html\")).richHtmlEngine),\n },\n { id: \"html\", label: \"HTML page\", extension: \"html\", mime: \"text/html;charset=utf-8\", modes: [\"copy\", \"download\"], runsOn: \"client\", supports: (p: Payload) => p.kind !== \"registered\", load: async () => htmlEngine },\n { id: \"json\", label: \"JSON\", extension: \"json\", mime: \"application/json;charset=utf-8\", modes: [\"copy\", \"download\"], runsOn: \"client\", supports: (p: Payload) => p.kind !== \"registered\", load: async () => serialized(\"json\", \"json\") },\n { id: \"compact-json\", label: \"Compact JSON\", extension: \"json\", mime: \"application/json;charset=utf-8\", modes: [\"copy\", \"download\"], runsOn: \"client\", supports: (p: Payload) => p.kind !== \"registered\", load: async () => serialized(\"compact-json\", \"json\") },\n { id: \"csv\", label: \"CSV\", extension: \"csv\", mime: \"text/csv;charset=utf-8\", modes: [\"copy\", \"download\"], runsOn: \"client\", supports: isRows, load: async () => serialized(\"csv\", \"csv\") },\n { id: \"tsv\", label: \"Google Sheets\", extension: \"tsv\", mime: \"text/tab-separated-values;charset=utf-8\", modes: [\"copy\", \"download\"], runsOn: \"client\", supports: isRows, load: async () => serialized(\"tsv\", \"tsv\") },\n {\n id: \"xlsx\", label: \"Excel workbook\", extension: \"xlsx\", mime: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", modes: [\"download\"], runsOn: \"client\",\n supports: isRows,\n load: lazy(async () => (await import(\"@ai-matrx/alchemy/operate/formats/xlsx\")).xlsxEngine),\n },\n {\n id: \"pdf\", label: \"PDF\", extension: \"pdf\", mime: \"application/pdf\", modes: [\"download\"], runsOn: \"client\",\n supports: isProse,\n load: lazy(async () => (await import(\"./formats/document\")).documentEngine(\"pdf\")),\n },\n {\n id: \"docx\", label: \"Word document\", extension: \"docx\", mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", modes: [\"download\"], runsOn: \"client\",\n supports: isProse,\n load: lazy(async () => (await import(\"./formats/document\")).documentEngine(\"docx\")),\n },\n {\n id: \"epub\", label: \"EPUB book\", extension: \"epub\", mime: \"application/epub+zip\", modes: [\"download\"], runsOn: \"client\",\n supports: isProse,\n load: lazy(async () => (await import(\"./formats/document\")).documentEngine(\"epub\")),\n },\n] satisfies FormatAdapter[]);\n\n/**\n * The adapters for a payload, in menu order: built-ins first, then registered formats (a\n * duplicate id is refused — a registered format can never shadow a built-in).\n */\nexport function eligibleFormats(payload: Payload, registered: readonly FormatAdapter[] = [], mode?: \"copy\" | \"download\"): FormatAdapter[] {\n return resolveTransferRegistry<FormatAdapter>(FORMAT_ADAPTERS, registered).filter(\n (f) => f.supports(payload) && (mode === undefined || f.modes.includes(mode)),\n );\n}\n\n/** Find an adapter by id (built-in or registered); an unknown id is an error with a remedy. */\nexport function formatAdapter(id: string, registered: readonly FormatAdapter[] = []): FormatAdapter {\n const found = resolveTransferRegistry<FormatAdapter>(FORMAT_ADAPTERS, registered).find((f) => f.id === id);\n if (!found) throw new ContentTransferError(\"unsupported-format\", `There is no \"${id}\" format. Choose one of the formats offered for this content.`);\n return found;\n}\n\nexport type { FormatOptions };\n","/**\n * The preparation workspace and delivery (CONTRACT §2.3, \"exact bytes: preview = copy = download = send\").\n *\n * capture → draft edits → SEAL → copy / download / send, and delivery takes the sealed artifact as-is.\n *\n * `seal` builds once per (draft revision, format, options) and brands the result; `copy`,\n * `copyPending`, `download` and `send` accept only a branded artifact and never rebuild, so the\n * bytes a person previewed are the bytes that reach the clipboard, the file or the destination.\n */\n\nimport {\n ContentTransferError,\n applySectionSelection,\n capture,\n createBrowserTransport,\n createDraft,\n editDraft,\n sealTransferArtifact,\n undoDraft,\n} from \"./core\";\nimport type {\n Delivery,\n DeliveryOutcome,\n FormatAdapter,\n FormatOptions,\n SealedArtifact,\n} from \"./contract\";\nimport type { WriteDoor } from \"./door\";\nimport { formatAdapter } from \"./formats\";\nimport type { Artifact, Draft, Json, Payload, Snapshot, Source, Transform, TransferScope, Transport } from \"./types\";\n\nconst SEALED = Symbol.for(\"ai-matrx.alchemy.operate.sealed-artifacts\");\n\nfunction sealedSet(): WeakSet<object> {\n const g = globalThis as unknown as Record<symbol, WeakSet<object> | undefined>;\n g[SEALED] ??= new WeakSet<object>();\n return g[SEALED] as WeakSet<object>;\n}\n\n/** Freeze an artifact's bytes and brand it; the only way to make a `SealedArtifact`. */\nexport function sealArtifact(artifact: Artifact): SealedArtifact {\n const frozen = sealTransferArtifact(artifact);\n sealedSet().add(frozen);\n return frozen as SealedArtifact;\n}\n\n/** True only for an artifact `sealArtifact` (or a preparation session's `seal`) produced. */\nexport function isSealed(artifact: unknown): artifact is SealedArtifact {\n return typeof artifact === \"object\" && artifact !== null && sealedSet().has(artifact);\n}\n\nconst notSealed: DeliveryOutcome = {\n status: \"error\",\n code: \"not-sealed\",\n message: \"This content was not prepared for delivery, so nothing was copied or saved. Prepare it again and retry.\",\n retryable: true,\n};\n\nexport interface PreparationSession {\n readonly snapshot: Snapshot;\n readonly draft: Draft;\n /** Deterministic transform, AI preparation or any registered transform — bumps draft.revision. */\n transform(id: string, options: Json, signal: AbortSignal): Promise<Draft>;\n /** A manual edit. */\n edit(payload: Payload): Draft;\n /** Keep only these sections (ids from the snapshot). */\n selectSections(ids: readonly string[]): Draft;\n undo(): Draft;\n /** Build once and seal; cached per (draft revision, format, options). */\n seal(format: string, options: FormatOptions, signal: AbortSignal): Promise<SealedArtifact>;\n}\n\nexport interface PreparationOptions {\n /** Transforms this session may run, by id (a duplicate id is refused). */\n transforms?: readonly Transform[];\n /** Registered row formats beside the built-ins (a duplicate id is refused). */\n formats?: readonly FormatAdapter[];\n}\n\n/** The cache key never includes callbacks or ports; options that change bytes do. */\nconst optionsKey = (o: FormatOptions) =>\n JSON.stringify({ f: o.filename ?? null, s: o.spreadsheetSafe ?? null, k: o.skin ?? null, p: o.profile ?? null, h: o.highlightCode ?? false });\n\nexport async function openPreparation(\n source: Source | Payload,\n scope: TransferScope,\n signal: AbortSignal,\n options: PreparationOptions = {},\n): Promise<PreparationSession> {\n const { snapshot } = await capture(source, signal, scope);\n let draft = createDraft(snapshot);\n const transforms = new Map<string, Transform>();\n for (const t of options.transforms ?? []) {\n if (transforms.has(t.id)) throw new ContentTransferError(\"duplicate-registration\", `Transform \"${t.id}\" is registered more than once`);\n transforms.set(t.id, t);\n }\n const cache = new Map<string, Promise<SealedArtifact>>();\n\n return {\n get snapshot() {\n return snapshot;\n },\n get draft() {\n return draft;\n },\n async transform(id, transformOptions, transformSignal) {\n const t = transforms.get(id);\n if (!t) throw new ContentTransferError(\"unsupported-transform\", `There is no \"${id}\" preparation step here.`);\n draft = await t.apply(draft, transformOptions, transformSignal);\n return draft;\n },\n edit(payload) {\n draft = editDraft(draft, payload);\n return draft;\n },\n selectSections(ids) {\n draft = applySectionSelection(draft, snapshot, ids);\n return draft;\n },\n undo() {\n draft = undoDraft(draft);\n return draft;\n },\n seal(format, formatOptions, sealSignal) {\n const adapter = formatAdapter(format, options.formats);\n if (!adapter.supports(draft.payload)) {\n return Promise.reject(new ContentTransferError(\"unsupported-format\", `${adapter.label} is not available for this content.`));\n }\n const key = `${draft.revision}\\u0000${format}\\u0000${optionsKey(formatOptions)}`;\n const hit = cache.get(key);\n if (hit) return hit;\n const at = draft;\n const built = adapter\n .load()\n .then((engine) => engine.build(at, formatOptions, sealSignal))\n .then(sealArtifact);\n // A failed or cancelled build is not cached: the next seal tries again.\n built.catch(() => cache.delete(key));\n cache.set(key, built);\n return built;\n },\n };\n}\n\n/** Seal a draft directly (hosts without a workspace, e.g. a one-click \"Copy as CSV\"). */\nexport async function sealDraft(\n draft: Draft,\n format: string,\n options: FormatOptions,\n signal: AbortSignal,\n formats?: readonly FormatAdapter[],\n): Promise<SealedArtifact> {\n const adapter = formatAdapter(format, formats);\n if (!adapter.supports(draft.payload)) throw new ContentTransferError(\"unsupported-format\", `${adapter.label} is not available for this content.`);\n return sealArtifact(await (await adapter.load()).build(draft, options, signal));\n}\n\ntype ClipboardWrite = (items: ClipboardItem[]) => Promise<void>;\n\nfunction narrow(outcome: Awaited<ReturnType<Transport[\"copy\"]>>): DeliveryOutcome {\n if (outcome.status === \"success\" && outcome.delivered === \"action\") {\n return { status: \"success\", delivered: \"clipboard\", mimeTypes: outcome.mimeTypes };\n }\n if (outcome.status === \"queued\") {\n return { status: \"error\", code: \"unexpected-queued\", message: outcome.message, retryable: false };\n }\n return outcome as DeliveryOutcome;\n}\n\n/**\n * The one delivery. `transport` defaults to the browser (clipboard + download link); a non-browser\n * host binds its own (`TransportPort`). `send` goes through the one write door (ALC-17): without one it is\n * refused with a remedy, never faked.\n */\nexport function createDelivery(\n ports: {\n transport?: Transport;\n /** The one write door (`createWriteDoor`). Absent → `send` is refused with a remedy. */\n door?: Pick<WriteDoor, \"write\">;\n } = {},\n): Delivery {\n const transport = ports.transport ?? createBrowserTransport();\n return {\n async copy(artifact, signal) {\n if (!isSealed(artifact)) return notSealed;\n return narrow(await transport.copy(artifact, signal));\n },\n copyPending(pending, signal, options = {}) {\n // SYNCHRONOUS part first: Safari only honours a clipboard write made inside the click.\n const clipboard = globalThis.navigator?.clipboard as (Clipboard & { write?: ClipboardWrite }) | undefined;\n const Item = globalThis.ClipboardItem as (typeof ClipboardItem & { supports?(type: string): boolean }) | undefined;\n const checked = pending.then((a) => {\n if (!isSealed(a)) throw new ContentTransferError(\"not-sealed\", notSealed.status === \"error\" ? notSealed.message : \"\");\n return a;\n });\n if (clipboard?.write && typeof Item === \"function\") {\n const text = checked.then((a) => new Blob([a.plainText], { type: \"text/plain\" }));\n const entries: Record<string, Promise<Blob>> = { \"text/plain\": text };\n if (options.html) entries[\"text/html\"] = checked.then((a) => new Blob([a.html ?? a.plainText], { type: \"text/html\" }));\n let item: ClipboardItem | null = null;\n try {\n item = new Item(entries as unknown as Record<string, Blob>);\n } catch {\n item = null; // this browser cannot take promise-valued items → build-then-write below\n }\n if (item) {\n const written = clipboard.write([item]);\n return written.then(\n async (): Promise<DeliveryOutcome> =>\n signal.aborted\n ? { status: \"cancelled\" }\n : { status: \"success\", delivered: \"clipboard\", mimeTypes: options.html ? [\"text/plain\", \"text/html\"] : [\"text/plain\"] },\n async (): Promise<DeliveryOutcome> => {\n // Refused (or not sealed): fall back to the plain-text write of the SAME sealed bytes.\n try {\n const a = await checked;\n return narrow(await transport.copy(a, signal));\n } catch (error) {\n return error instanceof ContentTransferError && error.code === \"not-sealed\"\n ? notSealed\n : { status: \"error\", code: \"clipboard-rejected\", message: \"The clipboard refused the copy. Try again.\", retryable: true };\n }\n },\n );\n }\n }\n return checked.then(\n async (a) => narrow(await transport.copy(a, signal)),\n (): DeliveryOutcome => notSealed,\n );\n },\n async download(artifact, signal) {\n if (!isSealed(artifact)) return notSealed;\n return narrow(await transport.download(artifact, signal));\n },\n async send(artifact, to, via) {\n if (!isSealed(artifact)) {\n return { status: \"refused\", to, reason: \"failed\", sentence: notSealed.status === \"error\" ? notSealed.message : \"\", remedy: \"Prepare the content again, then send it.\" };\n }\n if (!ports.door) {\n return {\n status: \"refused\",\n to,\n reason: \"unapplicable\",\n sentence: \"Sending to a destination is not available here yet, so nothing was sent.\",\n remedy: \"Copy or download it instead, then paste it where it belongs.\",\n };\n }\n void via;\n return ports.door.write({\n surfaceName: to.surfaceName ?? \"\",\n target: to.target,\n ...(to.item ? { itemType: to.item.itemType, itemIdentity: to.item.identity } : {}),\n value: artifact.file ? artifact.file.bytes : artifact.plainText,\n by: \"destination\",\n });\n },\n };\n}\n","/**\n * Serializer span maps (Preparation parity PP-06a): every node of the draft payload → the exact\n * span of the SEALED text it became.\n *\n * A span map is computed from the sealed artifact's own `plainText` (the bytes the preview shows,\n * the clipboard receives and the download holds), never from a second rendering of the draft — so\n * a span can never describe text that is not there. Offsets are UTF-16 code units into\n * `artifact.plainText`, `[start, end)`, exactly what `String.prototype.slice` and a DOM text range\n * take.\n *\n * Paths are the JSON Pointers the rest of Operate already uses for omissions:\n * \"\" the whole payload (a text or Markdown payload is one node)\n * \"/messages/0/content\" a node inside a JSON payload\n * \"/rows\" the row array (JSON formats of a rows payload)\n * \"/rows/3\" one row (its whole line in CSV / TSV / Markdown / plain)\n * \"/rows/3/name\" one cell (the column's own path under the row)\n * \"/columns/name\" one header cell (CSV / TSV / Markdown / plain), keyed by column id\n *\n * Spans nest (a row contains its cells, an object its members) and never partially overlap.\n * PP-06b–d (the structure trees) and PP-07 (the removed-text diff) highlight through this map.\n */\nimport { assembleAgentPayload, type AgentPayloadEnvironment, type AgentPayloadInput } from \"./agent-payload\";\nimport { ContentTransferError, exportedColumns } from \"./core\";\nimport { fencedCodeBlock } from \"./fenced-code\";\nimport type { Artifact, Column, Draft } from \"./types\";\n\nexport interface OutputSpan {\n /** JSON Pointer of the node in the draft payload (see the module header). */\n path: string;\n /** UTF-16 offset of the node's first character in `artifact.plainText`. */\n start: number;\n /** UTF-16 offset one past the node's last character. */\n end: number;\n}\nexport type SpanMap = readonly OutputSpan[];\n\nconst pointerSegment = (x: string) => x.replace(/~/g, \"~0\").replace(/\\//g, \"~1\");\n\nfunction spanError(message: string): ContentTransferError {\n return new ContentTransferError(\"unsupported-format\", message);\n}\n\n/**\n * Spans of every value in a JSON text, found by reading the text itself (whatever writer laid it\n * out: pretty, compact, minified, escaped). Pre-order: a container before its members.\n * Throws when the text is not exactly one JSON value.\n */\nexport function jsonTextSpans(text: string, basePath = \"\", offset = 0): OutputSpan[] {\n const spans: OutputSpan[] = [];\n let i = 0;\n const fail = (what: string): never => {\n throw spanError(`The sealed text is not JSON at character ${i}: ${what}.`);\n };\n const ws = () => {\n while (i < text.length && (text[i] === \" \" || text[i] === \"\\n\" || text[i] === \"\\r\" || text[i] === \"\\t\")) i++;\n };\n const readString = (): string => {\n if (text[i] !== '\"') fail(\"expected a string\");\n const start = i;\n i++;\n while (i < text.length && text[i] !== '\"') i += text[i] === \"\\\\\" ? 2 : 1;\n if (i >= text.length) fail(\"unterminated string\");\n i++;\n return JSON.parse(text.slice(start, i)) as string;\n };\n const value = (path: string): void => {\n ws();\n const start = i;\n const slot = spans.length;\n spans.push({ path, start: offset + start, end: offset + start });\n const ch = text[i];\n if (ch === \"{\") {\n i++;\n ws();\n if (text[i] === \"}\") i++;\n else\n for (;;) {\n ws();\n const key = readString();\n ws();\n if (text[i] !== \":\") fail(\"expected ':'\");\n i++;\n value(`${path}/${pointerSegment(key)}`);\n ws();\n if (text[i] === \",\") {\n i++;\n continue;\n }\n if (text[i] === \"}\") {\n i++;\n break;\n }\n fail(\"expected ',' or '}'\");\n }\n } else if (ch === \"[\") {\n i++;\n ws();\n if (text[i] === \"]\") i++;\n else\n for (let index = 0; ; index++) {\n value(`${path}/${index}`);\n ws();\n if (text[i] === \",\") {\n i++;\n continue;\n }\n if (text[i] === \"]\") {\n i++;\n break;\n }\n fail(\"expected ',' or ']'\");\n }\n } else if (ch === '\"') {\n readString();\n } else {\n const m = /^(?:-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?|true|false|null)/.exec(text.slice(i, i + 400));\n if (!m) fail(\"expected a value\");\n i += (m as RegExpExecArray)[0].length;\n }\n (spans[slot] as OutputSpan).end = offset + i;\n };\n value(basePath);\n ws();\n if (i !== text.length) fail(\"text after the value\");\n return spans;\n}\n\n/**\n * CSV / TSV / plain rows: the header line, then one line per row, cells quoted exactly as Operate's\n * serializer quotes them (a cell holding the delimiter, a quote or a line break is wrapped in\n * quotes, so a row's line may itself hold line breaks).\n */\nfunction delimitedSpans(text: string, delimiter: string, columns: readonly Column[], rowCount: number): OutputSpan[] {\n const spans: OutputSpan[] = [];\n let i = 0;\n const readLine = (paths: readonly string[], linePath: string | null) => {\n const lineStart = i;\n const lineSlot = spans.length;\n if (linePath !== null) spans.push({ path: linePath, start: lineStart, end: lineStart });\n paths.forEach((path, index) => {\n const start = i;\n if (text[i] === '\"') {\n i++;\n for (;;) {\n if (i >= text.length) throw spanError(`An unterminated quoted cell starts at character ${start}.`);\n if (text[i] === '\"') {\n if (text[i + 1] === '\"') {\n i += 2;\n continue;\n }\n i++;\n break;\n }\n i++;\n }\n } else {\n while (i < text.length && text[i] !== delimiter && text[i] !== \"\\n\") i++;\n }\n spans.push({ path, start, end: i });\n const last = index === paths.length - 1;\n const expected = last ? \"\\n\" : delimiter;\n if (last && i === text.length) return;\n if (text[i] !== expected) throw spanError(`Expected ${last ? \"a line break\" : \"a delimiter\"} at character ${i}.`);\n if (!last) i++;\n });\n if (linePath !== null) (spans[lineSlot] as OutputSpan).end = i;\n if (i < text.length) i++;\n };\n readLine(columns.map((c) => `/columns/${pointerSegment(c.id)}`), null);\n for (let row = 0; row < rowCount; row++) readLine(columns.map((c) => `/rows/${row}${c.path}`), `/rows/${row}`);\n if (i < text.length) throw spanError(`Text continues after the last row at character ${i}.`);\n return spans;\n}\n\n/** Markdown table rows: `| a | b |`, with `\\|` and `\\\\` escapes inside cells. */\nfunction markdownTableSpans(text: string, columns: readonly Column[], rowCount: number): OutputSpan[] {\n const spans: OutputSpan[] = [];\n const lines: { start: number; end: number }[] = [];\n let at = 0;\n for (const line of text.split(\"\\n\")) {\n lines.push({ start: at, end: at + line.length });\n at += line.length + 1;\n }\n if (lines.length !== rowCount + 2) throw spanError(`A Markdown table of ${rowCount} rows has ${lines.length} lines.`);\n const cells = (line: { start: number; end: number }, paths: readonly string[]) => {\n let i = line.start;\n if (text.slice(i, i + 2) !== \"| \") throw spanError(`A table line must open with \"| \" at character ${i}.`);\n i += 2;\n paths.forEach((path) => {\n const start = i;\n while (i < line.end && text[i] !== \"|\") i += text[i] === \"\\\\\" ? 2 : 1;\n if (text[i] !== \"|\" || text[i - 1] !== \" \") throw spanError(`A table cell must close with \" |\" at character ${i}.`);\n spans.push({ path, start, end: i - 1 });\n i += 2;\n });\n if (i - 1 !== line.end) throw spanError(`A table line has more cells than columns at character ${i}.`);\n };\n cells(lines[0] as { start: number; end: number }, columns.map((c) => `/columns/${pointerSegment(c.id)}`));\n for (let row = 0; row < rowCount; row++) {\n const line = lines[row + 2] as { start: number; end: number };\n spans.push({ path: `/rows/${row}`, start: line.start, end: line.end });\n cells(line, columns.map((c) => `/rows/${row}${c.path}`));\n }\n return spans;\n}\n\n/**\n * The span map of a sealed artifact built from `draft` (same snapshot, same draft revision).\n * Covers the text formats the preparation workspace previews: plain, markdown, json,\n * compact-json, csv, tsv, and html's plain text. Binary and document formats have no text to map\n * and are refused by name.\n */\nexport function spanMap(draft: Draft, artifact: Artifact): SpanMap {\n if (artifact.snapshotId !== draft.snapshotId || artifact.draftRevision !== draft.revision) {\n throw spanError(\"This artifact was built from a different draft, so its spans cannot be read from this one. Seal the current draft again.\");\n }\n const text = artifact.plainText;\n const payload = draft.payload;\n const format = artifact.format;\n if (format === \"json\" || format === \"compact-json\") return jsonTextSpans(text, payload.kind === \"rows\" ? \"/rows\" : \"\");\n if (format === \"csv\" || format === \"tsv\") {\n if (payload.kind !== \"rows\") throw spanError(`${format.toUpperCase()} requires tabular data`);\n return delimitedSpans(text, format === \"csv\" ? \",\" : \"\\t\", exportedColumns(payload.columns), payload.rows.length);\n }\n if (format !== \"plain\" && format !== \"markdown\" && format !== \"html\") {\n throw spanError(`The ${format} format has no text span map; spans cover plain, Markdown, JSON, CSV and TSV text.`);\n }\n if (payload.kind === \"rows\") {\n const columns = exportedColumns(payload.columns);\n return format === \"markdown\"\n ? markdownTableSpans(text, columns, payload.rows.length)\n : delimitedSpans(text, \"\\t\", columns, payload.rows.length);\n }\n if (payload.kind === \"json\" || payload.kind === \"registered\") return jsonTextSpans(text);\n if (payload.kind === \"text\" && payload.language && format === \"markdown\") {\n const fenced = fencedCodeBlock(payload.text, payload.language);\n if (fenced !== text) throw spanError(\"The Markdown code block does not hold this draft's text.\");\n const start = text.indexOf(\"\\n\") + 1;\n return [{ path: \"\", start, end: start + payload.text.length }];\n }\n return [{ path: \"\", start: 0, end: text.length }];\n}\n\n/** The same spans at `offset` characters later — a map carried inside a larger sealed text. */\nexport function offsetSpans(spans: SpanMap, offset: number): OutputSpan[] {\n return spans.map((s) => ({ path: s.path, start: s.start + offset, end: s.end + offset }));\n}\n\n/**\n * The AI envelope with the span map of its data: every node of `input.data` → its span in the\n * envelope text. The body is read where the envelope wrote it, so the spans stay exact even where\n * the envelope escapes `<`, `>` and `&`; for data without those characters they are the bare JSON's\n * spans moved by exactly the envelope header.\n */\nexport function agentPayloadWithSpans(\n input: AgentPayloadInput,\n environment: AgentPayloadEnvironment = {},\n): { text: string; spans: SpanMap } {\n const { text, body, bodyOffset } = assembleAgentPayload(input, environment);\n // A text body (PP-09) is one node written verbatim; a JSON body is read value by value.\n if ((input.dataFormat ?? \"json\") !== \"json\") return { text, spans: [{ path: \"\", start: bodyOffset, end: bodyOffset + body.length }] };\n return { text, spans: jsonTextSpans(body, \"\", bodyOffset) };\n}\n","/**\n * The structure trees' pure core (Preparation parity PP-06b–d, PP-07): what a person's choices in\n * the preparation workspace's Structure pane do to a draft — without React, so an agent can apply\n * the same choices (\"the extraction is a pure function of (data, options)\").\n *\n * exclude JSON Pointer PATTERNS whose segment `*` matches every array item or member:\n * `/messages/* /metadata` (no space) drops every message's metadata.\n * limits per pattern: `stub` (one line that keeps the header and states the original size),\n * `maxChars` (strings under the node cut to N characters), `maxItems` (arrays under the\n * node keep their first N items).\n *\n * The trees only ever REMOVE or SHORTEN. They run on a draft that capture has already projected\n * (secret and non-exportable values are gone before a tree sees them), so no choice here can bring\n * a declared-secret value back. Every change is an omission with a label a person can read.\n *\n * Prose sections (`/text/<start>-<end>` ranges) get the same include / stub / cap choices through\n * `sectionLayout`, which also says where each kept section landed in the text (for highlighting).\n */\nimport { formatCount } from \"@ai-matrx/kit/format\";\n\nimport { ContentTransferError, deriveDraft } from \"./core\";\nimport type { Draft, Json, Omission, Section } from \"./types\";\n\nexport type NodeLimit = { kind: \"stub\" } | { kind: \"maxChars\"; value: number } | { kind: \"maxItems\"; value: number };\nexport interface StructureRecipe {\n exclude: readonly string[];\n limits: Readonly<Record<string, NodeLimit>>;\n}\nexport const EMPTY_STRUCTURE: StructureRecipe = Object.freeze({ exclude: Object.freeze([]) as readonly string[], limits: Object.freeze({}) });\n\nconst encode = (segment: string) => segment.replace(/~/g, \"~0\").replace(/\\//g, \"~1\");\nconst decode = (segment: string) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n\n/** \"\" → []; \"/a/b~1c\" → [\"a\", \"b/c\"]. */\nexport function pointerSegments(pointer: string): string[] {\n if (pointer === \"\") return [];\n if (!pointer.startsWith(\"/\")) throw new ContentTransferError(\"invalid-pointer\", `\"${pointer}\" is not a JSON Pointer (it must start with \"/\").`);\n return pointer.slice(1).split(\"/\").map(decode);\n}\nexport function joinPointer(segments: readonly string[]): string {\n return segments.map((segment) => `/${encode(segment)}`).join(\"\");\n}\n\n/** A pattern names this exact node (`*` matches any one segment). */\nexport function patternMatches(pattern: string, pointer: string): boolean {\n const p = pointerSegments(pattern);\n const s = pointerSegments(pointer);\n return p.length === s.length && p.every((segment, index) => segment === \"*\" || segment === s[index]);\n}\n/** A pattern names this node or one of its ancestors. */\nexport function patternCovers(pattern: string, pointer: string): boolean {\n const p = pointerSegments(pattern);\n const s = pointerSegments(pointer);\n return p.length <= s.length && p.every((segment, index) => segment === \"*\" || segment === s[index]);\n}\n/** A pattern names a strict descendant of this node (for a parent's mixed state). */\nexport function patternBelow(pattern: string, pointer: string): boolean {\n const p = pointerSegments(pattern);\n const s = pointerSegments(pointer);\n return p.length > s.length && s.every((segment, index) => p[index] === \"*\" || p[index] === segment);\n}\n\n/** The path a person reads and copies: `/messages/*\\/metadata` → `data.messages[*].metadata`. */\nexport function displayPath(pointer: string, root = \"data\"): string {\n let out = root;\n for (const segment of pointerSegments(pointer)) {\n if (segment === \"*\" || /^(0|[1-9]\\d*)$/.test(segment)) out += `[${segment}]`;\n else if (/^[A-Za-z_$][\\w$]*$/.test(segment)) out += `${out ? \".\" : \"\"}${segment}`;\n else out += `[${JSON.stringify(segment)}]`;\n }\n return out;\n}\n\nconst sizes = new WeakMap<object, number>();\n/** Exactly `JSON.stringify(value).length`, computed once per object (large sources stay cheap). */\nexport function jsonSize(value: Json): number {\n if (value === null) return 4;\n if (typeof value === \"string\") return JSON.stringify(value).length;\n if (typeof value === \"number\") return (JSON.stringify(value) ?? \"null\").length;\n if (typeof value === \"boolean\") return value ? 4 : 5;\n const cached = sizes.get(value);\n if (cached !== undefined) return cached;\n let total = 2;\n if (Array.isArray(value)) {\n value.forEach((item, index) => { total += jsonSize(item) + (index ? 1 : 0); });\n } else {\n let index = 0;\n for (const [key, item] of Object.entries(value)) {\n total += JSON.stringify(key).length + 1 + jsonSize(item) + (index++ ? 1 : 0);\n }\n }\n sizes.set(value, total);\n return total;\n}\n/** The size a person expects for a node: a string's own length, else its JSON. */\nexport function nodeChars(value: Json): number {\n return typeof value === \"string\" ? value.length : jsonSize(value);\n}\n\n/** Pinned to en-US: these digits are written INTO the copied payload, which must not change with who copied it. */\nconst n = (value: number) => formatCount(value, { locale: \"en-US\" });\n\n/**\n * The one-line stub that stands in for a node: its header (a string's first line, an object's\n * short scalar members) and its original size.\n */\nexport function stubText(value: Json): string {\n const chars = n(nodeChars(value));\n if (typeof value === \"string\") {\n const first = (value.split(\"\\n\", 1)[0] ?? \"\").trim();\n const head = first.length > 120 ? `${first.slice(0, 120)}…` : first;\n return `${head ? `${head} ` : \"\"}[stubbed — ${chars} chars]`;\n }\n if (Array.isArray(value)) return `[stubbed — ${n(value.length)} items, ${chars} chars]`;\n if (value && typeof value === \"object\") {\n const header = Object.entries(value)\n .filter(([, item]) => (typeof item === \"string\" && item.length <= 60 && !item.includes(\"\\n\")) || typeof item === \"number\" || typeof item === \"boolean\")\n .slice(0, 4)\n .map(([key, item]) => `${key}: ${String(item)}`);\n return `[stubbed — ${header.length ? `${header.join(\", \")} — ` : \"\"}${n(Object.keys(value).length)} keys, ${chars} chars]`;\n }\n return `[stubbed — ${chars} chars]`;\n}\nfunction truncateText(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max)} … [truncated — ${n(text.length)} chars]` : text;\n}\n\nfunction assertLimit(limit: NodeLimit, pattern: string) {\n if (limit.kind !== \"stub\" && (!Number.isSafeInteger(limit.value) || limit.value < 0)) {\n throw new ContentTransferError(\"invalid-limit\", `The limit on ${displayPath(pattern)} must be a whole number of 0 or more.`);\n }\n}\n\n/** Every concrete pointer in `value` a pattern names (for counts, diffs and highlights). */\nexport function concretePointers(value: Json, pattern: string): string[] {\n const want = pointerSegments(pattern);\n const out: string[] = [];\n const walk = (node: Json, depth: number, at: string[]) => {\n if (depth === want.length) { out.push(joinPointer(at)); return; }\n if (node === null || typeof node !== \"object\") return;\n const segment = want[depth] as string;\n const entries: [string, Json][] = Array.isArray(node) ? node.map((item, index) => [String(index), item]) : Object.entries(node);\n for (const [key, child] of entries) if (segment === \"*\" || segment === key) walk(child, depth + 1, [...at, key]);\n };\n walk(value, 0, []);\n return out;\n}\n\ninterface Tally { count: number; chars: number }\n\n/** Apply exclusions and per-node limits to a JSON value; returns the new value and what changed. */\nexport function applyStructureToJson(\n value: Json,\n recipe: StructureRecipe,\n labels: Readonly<Record<string, string>> = {},\n): { value: Json; omissions: Omission[] } {\n recipe.exclude.forEach((pattern) => pointerSegments(pattern));\n const limitEntries = Object.entries(recipe.limits);\n limitEntries.forEach(([pattern, limit]) => { pointerSegments(pattern); assertLimit(limit, pattern); });\n const excluded = new Map<string, Tally>();\n const limited = new Map<string, Tally>();\n const tally = (map: Map<string, Tally>, pattern: string, chars: number) => {\n const current = map.get(pattern) ?? { count: 0, chars: 0 };\n map.set(pattern, { count: current.count + 1, chars: current.chars + chars });\n };\n const walk = (node: Json, segments: string[], cap: { pattern: string; max: number } | null): Json | undefined => {\n const pointer = joinPointer(segments);\n const exclusion = segments.length ? recipe.exclude.find((pattern) => patternMatches(pattern, pointer)) : undefined;\n if (exclusion !== undefined) { tally(excluded, exclusion, nodeChars(node)); return undefined; }\n const limitEntry = limitEntries.find(([pattern]) => patternMatches(pattern, pointer));\n const limit = limitEntry?.[1];\n if (limitEntry && limit?.kind === \"stub\") { tally(limited, limitEntry[0], nodeChars(node)); return stubText(node); }\n const nextCap = limitEntry && limit?.kind === \"maxChars\" ? { pattern: limitEntry[0], max: limit.value } : cap;\n if (typeof node === \"string\") {\n if (nextCap && node.length > nextCap.max) { tally(limited, nextCap.pattern, node.length); return truncateText(node, nextCap.max); }\n return node;\n }\n if (node === null || typeof node !== \"object\") return node;\n if (Array.isArray(node)) {\n let items = node.map((item, index) => walk(item, [...segments, String(index)], nextCap)).filter((item): item is Json => item !== undefined);\n if (limitEntry && limit?.kind === \"maxItems\" && items.length > limit.value) {\n tally(limited, limitEntry[0], items.length - limit.value);\n items = [...items.slice(0, limit.value), `[… ${n(items.length - limit.value)} more items]`];\n }\n return items;\n }\n const out: Record<string, Json> = {};\n for (const [key, item] of Object.entries(node)) {\n const kept = walk(item, [...segments, key], nextCap);\n if (kept !== undefined) out[key] = kept;\n }\n return out;\n };\n const next = walk(value, [], null) ?? null;\n const omissions: Omission[] = [];\n for (const [pattern, { count, chars }] of excluded) {\n omissions.push({ path: pattern, reason: \"excluded\", count, label: labels[pattern] ?? `${displayPath(pattern)} — ${n(chars)} chars` });\n }\n for (const [pattern, { count, chars }] of limited) {\n const limit = recipe.limits[pattern]!;\n const what = limit.kind === \"stub\" ? `stubbed (${n(chars)} chars)` : limit.kind === \"maxChars\" ? `cut to ${n(limit.value)} chars` : `kept the first ${n(limit.value)} items`;\n omissions.push({ path: pattern, reason: \"truncated\", count, label: `${labels[pattern] ?? displayPath(pattern)} — ${what}` });\n }\n return { value: next, omissions };\n}\n\n/** A JSON (or registered) draft with the person's structure choices applied. */\nexport function applyJsonStructure(draft: Draft, recipe: StructureRecipe, labels: Readonly<Record<string, string>> = {}): Draft {\n const payload = draft.payload;\n if (payload.kind !== \"json\" && payload.kind !== \"registered\") return draft;\n if (!recipe.exclude.length && !Object.keys(recipe.limits).length) return draft;\n const { value, omissions } = applyStructureToJson(payload.value, recipe, labels);\n return deriveDraft(draft, { ...payload, value }, omissions, \"Structure choices\");\n}\n\n/**\n * Where an ORIGINAL node sits in the output value after `recipe` (array items shift when an\n * earlier sibling is excluded). Null when the node is excluded or cut; a stubbed ancestor answers\n * with the stub's own pointer.\n */\nexport function outputPointer(value: Json, recipe: StructureRecipe, pointer: string): string | null {\n const segments = pointerSegments(pointer);\n const out: string[] = [];\n let node: Json | undefined = value;\n for (let depth = 0; depth <= segments.length; depth++) {\n const here = joinPointer(segments.slice(0, depth));\n if (depth > 0 && recipe.exclude.some((pattern) => patternMatches(pattern, here))) return null;\n const limitEntry = Object.entries(recipe.limits).find(([pattern]) => patternMatches(pattern, here));\n if (limitEntry?.[1].kind === \"stub\") return joinPointer(out);\n if (depth === segments.length) return joinPointer(out);\n const segment = segments[depth] as string;\n if (node === null || typeof node !== \"object\" || node === undefined) return null;\n if (Array.isArray(node)) {\n const index = Number(segment);\n if (!Number.isSafeInteger(index) || index >= node.length) return null;\n let shifted = index;\n for (let j = 0; j < index; j++) if (recipe.exclude.some((pattern) => patternMatches(pattern, `${here}/${j}`))) shifted--;\n if (limitEntry?.[1].kind === \"maxItems\" && shifted >= limitEntry[1].value) return null;\n out.push(String(shifted));\n node = node[index];\n } else {\n if (!Object.prototype.hasOwnProperty.call(node, segment)) return null;\n out.push(segment);\n node = (node as Record<string, Json>)[segment];\n }\n }\n return joinPointer(out);\n}\n\n// ── Prose sections ───────────────────────────────────────────────────────────────────────────\n\nconst RANGE = /^\\/text\\/(\\d+)-(\\d+)$/;\nexport function isProseSection(section: Section): boolean {\n return RANGE.test(section.path);\n}\nexport interface SectionLayout {\n text: string;\n omissions: Omission[];\n /** Where each kept section landed in `text` (a stub's own line for a stubbed one). */\n ranges: Record<string, { start: number; end: number }>;\n}\n/**\n * The text a prose source becomes with only `included` sections, each at its limit. Excluded\n * ranges are cut exactly as `applySectionSelection` cuts them; a stub keeps the range's trailing\n * line break so the next section still starts on its own line.\n */\nexport function sectionLayout(\n text: string,\n sections: readonly Section[],\n included: readonly string[],\n limits: Readonly<Record<string, NodeLimit>> = {},\n): SectionLayout {\n const keep = new Set(included);\n const parsed = sections.map((section) => {\n const m = RANGE.exec(section.path);\n const start = m ? Number(m[1]) : NaN;\n const end = m ? Number(m[2]) : NaN;\n if (!m || start > end || end > text.length) {\n throw new ContentTransferError(\"invalid-section\", `Section \"${section.path}\" is not a range of this text. Declare a prose section as /text/<start>-<end> within the text.`);\n }\n const limit = limits[section.id];\n if (limit) assertLimit(limit, section.path);\n return { section, start, end, limit };\n }).sort((a, b) => a.start - b.start);\n let out = \"\";\n let at = 0;\n const omissions: Omission[] = [];\n const ranges: SectionLayout[\"ranges\"] = {};\n for (const { section, start, end, limit } of parsed) {\n if (start < at) throw new ContentTransferError(\"invalid-section\", `Section \"${section.label}\" overlaps the section before it.`);\n out += text.slice(at, start);\n at = end;\n const body = text.slice(start, end);\n if (!keep.has(section.id)) {\n omissions.push({ path: section.path, reason: \"excluded\", label: `${section.label} — ${n(body.length)} chars` });\n continue;\n }\n const trailing = /\\s*$/.exec(body)?.[0] ?? \"\";\n let written = body;\n if (limit?.kind === \"stub\") {\n written = `${stubText(body.slice(0, body.length - trailing.length))}${trailing}`;\n omissions.push({ path: section.path, reason: \"truncated\", label: `${section.label} — stubbed (${n(body.length)} chars)` });\n } else if (limit?.kind === \"maxChars\" && body.length - trailing.length > limit.value) {\n written = `${truncateText(body.slice(0, body.length - trailing.length), limit.value)}${trailing}`;\n omissions.push({ path: section.path, reason: \"truncated\", label: `${section.label} — cut to ${n(limit.value)} chars` });\n }\n ranges[section.id] = { start: out.length, end: out.length + written.length - trailing.length };\n out += written;\n }\n out += text.slice(at);\n return { text: out, omissions, ranges };\n}\n\n/**\n * A draft with the person's section choices applied, projected from the draft's own payload (call\n * it on a fresh draft of the snapshot, as `applySectionSelection` projects from the snapshot).\n * Prose payloads use `sectionLayout`; JSON payloads exclude and limit each section's pointer.\n */\nexport function applySectionStructure(\n draft: Draft,\n sections: readonly Section[],\n included: readonly string[],\n limits: Readonly<Record<string, NodeLimit>> = {},\n): Draft {\n const payload = draft.payload;\n if (payload.kind === \"text\" || payload.kind === \"markdown\") {\n const layout = sectionLayout(payload.text, sections, included, limits);\n return deriveDraft(draft, { ...payload, text: layout.text }, layout.omissions, \"Selected sections\");\n }\n if (payload.kind === \"json\" || payload.kind === \"registered\") {\n const keep = new Set(included);\n const labels = Object.fromEntries(sections.map((section) => [section.path, section.label]));\n const recipe: StructureRecipe = {\n exclude: sections.filter((section) => !keep.has(section.id)).map((section) => section.path),\n limits: Object.fromEntries(sections.filter((section) => keep.has(section.id) && limits[section.id]).map((section) => [section.path, limits[section.id]!])),\n };\n const { value, omissions } = applyStructureToJson(payload.value, recipe, labels);\n return deriveDraft(draft, { ...payload, value }, omissions, \"Selected sections\");\n }\n return draft;\n}\n","/**\n * Default preparation recipes (Preparation parity PP-13a): which recipe a preparation workspace\n * opens with for one source kind, layered exactly like every setting on the platform —\n *\n * the person's own default (PersistencePort, setting \"alchemy.transfer.default_recipe\")\n * → the organization default (TransferKnobsPort — the Feature Knob ladder: organization → platform)\n * → built in (null recipe: the workspace opens on Full, nothing trimmed)\n *\n * The recipe KEY is the declaration / source-kind id (`\"cx.conversation\"`, `\"data.table-rows\"`), the\n * same string in every host, so a recipe saved on the dashboard is the recipe the frontend opens.\n * Both stores hold one map, source-kind id → recipe; this module is the only reader and writer of the\n * person's map, so the merge rules live once.\n *\n * Nothing fails silently: a rung that cannot be read or holds a malformed value is skipped with a\n * notice (and captured in diagnostics), and the answer says which rung it came from. A write never\n * merges into a map it failed to read.\n */\nimport type { AlchemyHostPorts, Json } from \"../ports\";\nimport { ContentTransferError } from \"./core\";\n\n/** The person's setting (PersistencePort) — one map of source-kind id → recipe. */\nexport const TRANSFER_DEFAULT_RECIPE_SETTING = \"alchemy.transfer.default_recipe\";\n\nexport type RecipeOrigin = \"person\" | \"organization\" | \"built-in\";\nexport interface ResolvedRecipe {\n /** The recipe to open with; null = built in (Full, nothing trimmed). */\n recipe: { [key: string]: Json } | null;\n from: RecipeOrigin;\n /** Rungs that were skipped, each with what to do about it. */\n notices: { sentence: string; remedy: string }[];\n}\n\nconst KEY = /^[a-z0-9][a-z0-9._:-]{0,127}$/;\n\n/** The recipe key for a source kind: the declaration / source-kind id itself, validated. */\nexport function recipeKey(sourceKind: string): string {\n if (!KEY.test(sourceKind)) {\n throw new ContentTransferError(\n \"invalid-recipe-key\",\n `\"${sourceKind}\" is not a source-kind id (lowercase letters, digits and . _ : -, up to 128 characters).`,\n );\n }\n return sourceKind;\n}\n\nconst isRecord = (v: unknown): v is { [key: string]: Json } =>\n v !== null && typeof v === \"object\" && !Array.isArray(v);\n\ntype RecipePorts = Pick<AlchemyHostPorts, \"persistence\" | \"transferKnobs\" | \"diagnostics\">;\n\n/** Which recipe a workspace for `sourceKind` opens with, and where it came from. */\nexport async function resolveDefaultRecipe(\n ports: RecipePorts,\n sourceKind: string,\n organizationId: string | null,\n): Promise<ResolvedRecipe> {\n const key = recipeKey(sourceKind);\n const notices: ResolvedRecipe[\"notices\"] = [];\n const skip = (error: unknown, sentence: string, remedy: string) => {\n notices.push({ sentence, remedy });\n ports.diagnostics.capture(error, { area: \"operate\", detail: { recipeKey: key, sentence } });\n };\n\n if (ports.persistence) {\n try {\n const own = await ports.persistence.readSetting(TRANSFER_DEFAULT_RECIPE_SETTING);\n if (own !== null) {\n if (!isRecord(own)) {\n skip(new Error(\"person default recipes are not a map\"), \"Your saved default recipes could not be read (they are not a list of recipes), so they were skipped.\", \"Save your default recipe for this source again.\");\n } else if (own[key] !== undefined) {\n const recipe = own[key];\n if (isRecord(recipe)) return { recipe, from: \"person\", notices };\n skip(new Error(\"person default recipe is not an object\"), \"Your default recipe for this source is not a recipe, so it was skipped.\", \"Save your default recipe for this source again.\");\n }\n }\n } catch (error) {\n skip(error, \"Your own default recipe could not be read, so the organization's default applies.\", \"Reopen the workspace to try again.\");\n }\n }\n\n if (ports.transferKnobs) {\n try {\n const org = await ports.transferKnobs.defaultRecipe(key, organizationId);\n if (org !== null) {\n if (isRecord(org)) return { recipe: org, from: \"organization\", notices };\n skip(new Error(\"organization default recipe is not an object\"), \"Your organization's default recipe for this source is not a recipe, so it was skipped.\", \"Ask an organization admin to set the default recipe again.\");\n }\n } catch (error) {\n skip(error, \"Your organization's default recipe could not be read, so the workspace opens on Full.\", \"Reopen the workspace to try again.\");\n }\n }\n\n return { recipe: null, from: \"built-in\", notices };\n}\n\n/**\n * Set (recipe) or clear (null) the person's own default for one source kind, keeping every other\n * source kind's default. Throws a sentence when nothing was saved; clearing the last entry clears\n * the setting itself, so the person inherits the organization default again.\n */\nexport async function setPersonDefaultRecipe(\n ports: Pick<AlchemyHostPorts, \"persistence\">,\n sourceKind: string,\n recipe: { [key: string]: Json } | null,\n): Promise<void> {\n const key = recipeKey(sourceKind);\n const persistence = ports.persistence;\n if (!persistence) {\n throw new ContentTransferError(\"capability-absent\", \"This app cannot save your own settings, so a personal default recipe is not available here.\");\n }\n let current: Json | null;\n try {\n current = await persistence.readSetting(TRANSFER_DEFAULT_RECIPE_SETTING);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new ContentTransferError(\n \"read-failed\",\n `Nothing was saved: your other default recipes could not be read (${reason}), and saving now would have replaced all of them. Try again in a moment.`,\n );\n }\n if (current !== null && !isRecord(current)) {\n throw new ContentTransferError(\"invalid-setting\", \"Nothing was saved: your saved default recipes are not a list of recipes, so one cannot be changed without replacing them all.\");\n }\n const map: { [key: string]: Json } = { ...(current ?? {}) };\n if (recipe === null) {\n if (!(key in map)) return;\n delete map[key];\n } else {\n map[key] = recipe;\n }\n await persistence.writeSetting(TRANSFER_DEFAULT_RECIPE_SETTING, Object.keys(map).length === 0 ? null : map);\n}\n"],"mappings":"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","names":["ContentTransferError","normalizeTransferJson","encode","copy","ContentTransferError","ContentTransferError","n","enc","capture","enc","markdownPlainText","documentHtmlEngine","ContentTransferError","ContentTransferError","at","ContentTransferError","at","ContentTransferError","assertLimit","at","ContentTransferError"]}
1
+ {"version":3,"sources":["../src/operate/types.ts","../src/operate/fenced-code.ts","../src/operate/agent-payload.ts","../src/operate/core.ts","../src/operate/formats/rich-html.ts","../src/operate/formats/document.ts","../src/operate.ts","../src/operate/door.ts","../src/operate/thinking.ts","../src/operate/formats.ts","../src/operate/preparation.ts","../src/operate/spans.ts","../src/operate/tree.ts","../src/operate/recipes.ts","../src/operate/build-file.ts"],"sourcesContent":["/**\n * Framework-neutral transfer contracts (Alchemy Operate, CONTRACT §2.3). All data crossing this boundary is JSON.\n * Moved in ALC-16; `Json`/`Payload`/`Column` now live in `@ai-matrx/kit/transfer-json`; the format-adapter contract lives in `./contract`.\n */\nimport type { Column, Json, Payload } from \"@ai-matrx/kit/transfer-json\";\nexport type { Column, Json, Payload };\nexport type ExportProjection = {\n rules: {\n target: \"payload\" | \"row\";\n path: string;\n exportable: boolean;\n classification: \"ordinary\" | \"secret\" | \"credential\";\n }[];\n};\nexport type TransferScope =\n \"target\" | \"row\" | \"selected\" | \"view\" | \"loaded\" | \"all-matching\";\nexport type Section = {\n id: string;\n label: string;\n path: string;\n includedByDefault: boolean;\n};\nexport type Coverage = {\n status: \"complete\" | \"loaded\" | \"partial\" | \"unknown\";\n included: number;\n total: number | null;\n reason?: string;\n /** What is counted, singular (\"message\", \"row\"); a workspace with sections counts the ticked ones in this unit. */\n unit?: string;\n};\nexport type Omission = {\n path: string;\n reason:\n | \"excluded\"\n | \"filtered\"\n | \"truncated\"\n | \"unsupported\"\n | \"escaped\"\n | \"duplicate\";\n count?: number;\n /** What a person reads for this omission (a section's name, a dotted path, a stub's size). */\n label?: string;\n};\nexport type RawSnapshot = {\n id: string;\n sourceId: string;\n revision: string;\n capturedAt: string;\n label: string;\n payload: Payload;\n coverage: Coverage;\n unsavedChanges: boolean;\n omissions: Omission[];\n sections: Section[];\n limits?: TransferLimits;\n};\ndeclare const projected: unique symbol;\nexport type Snapshot = RawSnapshot & { readonly [projected]: true };\nexport type QuerySnapshot = {\n sourceId: string;\n revision: string;\n query: Json;\n order: { field: string; direction: \"asc\" | \"desc\" }[];\n};\nexport type ExportPage = {\n rows: Record<string, Json>[];\n nextCursor: string | null;\n coverage: Coverage;\n consistencyToken: string | null;\n};\nexport type CapturedAllMatching = {\n query: QuerySnapshot;\n getRowId(row: Record<string, Json>): string;\n page(request: {\n query: QuerySnapshot;\n cursor: string | null;\n consistencyToken: string | null;\n signal: AbortSignal;\n }): Promise<ExportPage>;\n stableSnapshot?: boolean;\n};\nexport type CapturedSource = {\n snapshot: RawSnapshot;\n projection: ExportProjection;\n allMatching?: CapturedAllMatching;\n};\nexport type Source = {\n id: string;\n label: string;\n capture(request: {\n scope: TransferScope;\n signal: AbortSignal;\n }): Promise<CapturedSource>;\n};\nexport type Draft = {\n snapshotId: string;\n sourceId: string;\n sourceRevision: string;\n revision: number;\n payload: Payload;\n omissions: Omission[];\n manuallyEdited: boolean;\n provenance: {\n kind: \"original\" | \"deterministic\" | \"manual\" | \"ai\";\n operationId?: string;\n description: string;\n }[];\n /** Frozen prior states, with history omitted to avoid recursive duplication. */\n history?: readonly Omit<Draft, \"history\">[];\n};\nexport type Transform = {\n id: string;\n apply(draft: Draft, options: Json, signal: AbortSignal): Promise<Draft>;\n};\nexport type Artifact = {\n snapshotId: string;\n draftRevision: number;\n format: string;\n plainText: string;\n html?: string;\n file?: { filename: string; mime: string; bytes: Uint8Array };\n omissions: Omission[];\n};\n/** A concrete destination receipt; opening an editor is not a persisted save. */\nexport type TransferTarget = { kind: string; id: string; label: string; href?: string };\nexport type TransferOutcome =\n | {\n status: \"success\";\n delivered: \"clipboard\" | \"download-started\" | \"action\";\n mimeTypes: string[];\n /** Host-provided completion text for an explicit page action. */\n message?: string;\n target?: TransferTarget;\n }\n | { status: \"degraded\"; delivered: \"plain-text\"; reason: string }\n /**\n * Accepted for review; NOTHING was written and NOTHING failed.\n *\n * A destination whose organization reviews this kind of change first answers\n * \"filed, waiting for a person\" — a queued write is neither a delivery nor a\n * failure, and reporting it as either lies in one of two directions: claiming\n * a record that does not exist, or telling someone their work was lost while\n * it sits in a queue with their name on it.\n *\n * It carries the same sentence/remedy pair the other members carry, both\n * REQUIRED: `message` is what happened in the host's own words, `remedy` is\n * the half that sentence never states — what has NOT happened yet and what\n * the person does next. `target`, when the host can name it, is the pending\n * request itself (the approval row, which exists and opens) and NEVER the\n * destination record, which does not exist yet.\n */\n | { status: \"queued\"; message: string; remedy: string; target?: TransferTarget }\n | { status: \"cancelled\" }\n | { status: \"error\"; code: string; message: string; retryable: boolean; target?: TransferTarget };\nexport type Transport = {\n copy(artifact: Artifact, signal: AbortSignal): Promise<TransferOutcome>;\n download(artifact: Artifact, signal: AbortSignal): Promise<TransferOutcome>;\n};\nexport type SurfaceHandle = {\n instanceId: string;\n surfaceName: string;\n isMounted(): boolean;\n capture(signal: AbortSignal): Promise<CapturedSource>;\n};\nexport type AiPreparation = {\n supports(snapshot: Snapshot): boolean;\n run(request: {\n snapshot: Snapshot;\n draft: Draft;\n instruction: string;\n signal: AbortSignal;\n }): Promise<Draft>;\n /** Create an isolated adapter session for one preparation workspace. */\n fork?(): AiPreparation;\n /** Cancel the retained provider request; closing a host UI does not imply this. */\n cancel?(): Promise<void>;\n /** Revalidate the frozen source and recover a previously saved provider result. */\n recover?(input: {\n snapshot: Snapshot;\n draft: Draft;\n signal: AbortSignal;\n }): Promise<Draft>;\n};\nexport type TransferLimits = {\n maxRows: number | null;\n maxStringChars: number | null;\n maxDepth: number | null;\n maxArrayItems?: number | null;\n targetTokens: number | null;\n};\nexport type TransferPreferences = {\n initialFormat: string;\n initialPreset: \"full\" | \"compact\" | \"brief\";\n /**\n * What the preparation workspace's one preview and one Copy start on (PP-10): `\"ai\"` = the\n * sealed AI envelope around the chosen format, `\"text\"` = the format's bare bytes. The person\n * switches it in the workspace; this is only where it starts.\n */\n initialEnvelope: \"ai\" | \"text\";\n limits: TransferLimits;\n};\nexport type PageAction = {\n /** Alternate click-time source, captured through the same projection and limits before run. */\n source?: Source;\n id: string;\n label: string;\n supports(snapshot: Snapshot, draft?: Draft): boolean;\n run(request: {\n snapshot: Snapshot;\n draft: Draft;\n signal: AbortSignal;\n }): Promise<TransferOutcome>;\n};\n","/**\n * Wrap text in a Markdown code fence that cannot be closed by its contents.\n *\n * Fence writing is deliberately centralized here. Consumers should not grow\n * their own backtick-run detection when exporting code-shaped payloads.\n */\nexport function fencedCodeBlock(text: string, language: string): string {\n const runs = text.match(/`+/g) ?? [];\n const fence = \"`\".repeat(Math.max(3, ...runs.map((run) => run.length + 1)));\n return `${fence}${language}\\n${text}${text.endsWith(\"\\n\") ? \"\" : \"\\n\"}${fence}`;\n}\n","import { fencedCodeBlock } from \"./fenced-code\";\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 * How `data` travels (PP-09). `\"json\"` (the default): `data` is any JSON value, written as a\n * fenced JSON body with `<`, `>` and `&` escaped. Any other name (`\"text\"`, `\"markdown\"`,\n * `\"csv\"`, …): `data` is TEXT, written verbatim — real line breaks, no quoting, no escapes —\n * inside a Markdown fence longer than any backtick run in it, under `<data format=\"<name>\">`.\n * A text source is never wrapped as one escaped JSON string.\n */\n dataFormat?: string;\n /**\n * A person's instructions for the model (PP-10). Sealed with the envelope as its first block,\n * `<instructions>…</instructions>`, so the preview, the clipboard and the token total all\n * include it. Empty or whitespace-only = no block.\n */\n instructions?: string;\n}\n\nexport interface AgentPayloadEnvironment {\n url?: string;\n route?: string;\n capturedAt?: string;\n}\n\nconst escapeXml = (value: string) => value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\").replace(/'/g, \"&apos;\");\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 return fencedCodeBlock(json.trimEnd(), \"json\");\n}\n\n/** Capture location at invocation; environment injection makes non-browser use explicit. */\nexport function buildAgentPayload(input: AgentPayloadInput, environment: AgentPayloadEnvironment = {}): string {\n return assembleAgentPayload(input, environment).text;\n}\n\n/**\n * The envelope, plus where its JSON body sits: `body` is the exact JSON text written between the\n * fence lines, starting at `bodyOffset` (so a span map of the body lands in the envelope at that\n * offset — PP-06a).\n */\nexport function assembleAgentPayload(\n input: AgentPayloadInput,\n environment: AgentPayloadEnvironment = {},\n): { text: string; body: string; bodyOffset: number } {\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 dataFormat = input.dataFormat ?? \"json\";\n if (dataFormat !== \"json\" && !/^[a-z][a-z0-9-]*$/.test(dataFormat)) throw new Error(`Invalid AI envelope data format: ${dataFormat}`);\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 const instructions = input.instructions?.trim()\n ? `<instructions>\\n${input.instructions.trim().replace(/<\\/instructions>/gi, \"<\\\\/instructions>\")}\\n</instructions>\\n\\n`\n : \"\";\n const head = `${instructions}<${kind}${attrs}>\\n<context>\\n${context}\\n</context>\\n${summary}<data format=\"${dataFormat}\">\\n`;\n let fenced: string;\n let body: string;\n if (dataFormat === \"json\") {\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 fenced = fenceJsonBlock(safeJson);\n body = safeJson.trimEnd();\n } else {\n if (typeof input.data !== \"string\") throw new Error(`AI envelope ${dataFormat} data must be text.`);\n // Text travels verbatim: the fence (longer than any backtick run inside) is its only delimiter.\n fenced = fencedCodeBlock(input.data, dataFormat === \"text\" ? \"text\" : dataFormat);\n body = input.data;\n }\n return {\n text: `${head}${fenced}\\n</data>\\n</${kind}>`,\n body,\n // The fence line is backticks + the language + a line break; the body follows it verbatim.\n bodyOffset: head.length + fenced.indexOf(\"\\n\") + 1,\n };\n}\n","import { downloadFile } from \"@ai-matrx/kit/download\";\nimport { stringifyJson } from \"@ai-matrx/kit/json-format\";\nimport { escapeHtml } from \"@ai-matrx/kit/html-escape\";\nimport {\n ContentTransferError,\n cloneTransferJson,\n normalizeTransferJsonAtPath,\n} from \"@ai-matrx/kit/transfer-json\";\nexport {\n ContentTransferError,\n normalizeTransferJson,\n type NormalizeTransferJsonOptions,\n} from \"@ai-matrx/kit/transfer-json\";\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 \"./types\";\nexport * from \"./types\";\nexport * from \"./agent-payload\";\n\n/** A realm-wide brand (Symbol.for), so a binding made by one loaded copy is recognised by another. */\nconst bound: unique symbol = Symbol.for(\"ai-matrx.alchemy.operate.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, \"~\");\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 normalizeTransferJsonAtPath(value, path, {\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}\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 cloneTransferJson(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 excludedColumn(column: Column): boolean {\n return (\n column.exportable === false ||\n column.classification === \"secret\" ||\n column.classification === \"credential\"\n );\n}\nfunction rowProjectionExcludesColumnSchema(\n column: Column,\n rules: ExportProjection[\"rules\"],\n): boolean {\n return rules.some(\n (rule) =>\n rule.target === \"row\" &&\n (!rule.exportable || rule.classification !== \"ordinary\") &&\n (rule.path === column.path || column.path.startsWith(`${rule.path}/`)),\n );\n}\n/** Project the schema with the same payload rules that govern column metadata. */\nfunction projectColumnSchema(\n column: Column,\n rules: ExportProjection[\"rules\"],\n omit: Omission[],\n): Column[\"schema\"] | undefined {\n if (column.schema === undefined) return undefined;\n const root = `/columns/${enc(column.id)}/schema`;\n const schemaRules = rules\n .filter((rule) => rule.target === \"payload\" && (rule.path === root || rule.path.startsWith(`${root}/`)))\n .map((rule) => ({ ...rule, path: rule.path.slice(root.length) }));\n const projected = projectValue(column.schema, schemaRules, \"payload\", omit);\n if (schemaRules.some((rule) => rule.path === \"\" && (!rule.exportable || rule.classification !== \"ordinary\")))\n return undefined;\n return projected as Column[\"schema\"];\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 const text = typeof value === \"string\" ? value : \"\";\n // A code block keeps its language (downloads take its extension; Markdown fences it).\n return p.kind === \"text\" && typeof p.language === \"string\" && p.language.trim()\n ? { kind: \"text\", text, language: p.language.trim() }\n : { kind: p.kind, text };\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 sourceColumns = rowsPayload.columns.map((column) => ({ ...column }));\n const columns = sourceColumns\n .filter((column) => !excludedColumn(column))\n .map((column) => {\n // Do not spread source schema back after an explicit schema or row exclusion.\n const { schema: _sourceSchema, ...withoutSchema } = column;\n const schema = rowProjectionExcludesColumnSchema(column, projection.rules)\n ? undefined\n : projectColumnSchema(column, projection.rules, omit);\n return {\n ...withoutSchema,\n ...(schema === undefined ? {} : { schema }),\n };\n });\n resolveTransferRegistry(columns);\n columns.forEach((column) => validatePointer(column.path));\n const rules = [\n ...projection.rules,\n ...sourceColumns\n .filter(excludedColumn)\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: cloneTransferJson(all.query.query),\n order: all.query.order.map((x) => ({ ...x })),\n },\n },\n projection: { rules: captured.projection.rules.map((x) => ({ ...x })) },\n // Page rows must be normalized against the original declaration so excluded\n // column values are removed before stable IDs or any caller can observe them.\n columns:\n captured.snapshot.payload.kind === \"rows\"\n ? captured.snapshot.payload.columns.map((column) => ({ ...column }))\n : [],\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\");\n/**\n * A deterministic revision of `d` (the structure trees, PP-06/07): same snapshot, next revision,\n * the given omissions added. `baseOmissions` replaces the draft's own when a step re-projects from\n * the snapshot (a section selection), exactly as `applySectionSelection` does.\n */\nexport const deriveDraft = (\n d: Draft,\n p: Payload,\n o: Omission[],\n description: string,\n baseOmissions: readonly Omission[] = d.omissions,\n) => revise(d, p, o, description, d.manuallyEdited, \"deterministic\", baseOmissions);\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 if (s.payload.kind === \"markdown\" || s.payload.kind === \"text\") {\n // A prose section is a character range of the text: `/text/<start>-<end>`.\n const text = s.payload.text;\n const ranges = paths\n .map((path) => {\n const m = /^\\/text\\/(\\d+)-(\\d+)$/.exec(path);\n const start = m ? Number(m[1]) : NaN,\n end = m ? Number(m[2]) : NaN;\n if (!m || start > end || end > text.length)\n throw new ContentTransferError(\n \"invalid-section\",\n `Section \"${path}\" is not a range of this text. Declare a prose section as /text/<start>-<end> within the text.`,\n );\n return [start, end] as const;\n })\n .sort((a, b) => b[0] - a[0]);\n let kept = text;\n for (const [start, end] of ranges) kept = kept.slice(0, start) + kept.slice(end);\n return revise(\n d,\n { ...s.payload, text: kept },\n omit,\n \"Selected sections\",\n d.manuallyEdited,\n \"deterministic\",\n baseOmissions,\n );\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 const excludedColumns = d.payload.columns.length - cols.length;\n if (excludedColumns > 0)\n omit.push({\n path: \"/columns\",\n reason: \"excluded\",\n count: excludedColumns,\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(cloneTransferJson(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}\n// An EMPTY cell is empty text. `null` is how a row carries \"nothing here\"\n// (hosts normalise a missing cell to JSON null so the row keeps its shape), and\n// until 2026-09-21 it serialized as the word \"null\" in every plain / CSV / TSV\n// / Markdown copy — six \"null\"s across a copied row of a data table.\nconst textValue = (value: Json | undefined): string =>\n value === undefined || value === null\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\n/** The columns a text serialization writes: visible, exportable, never secret or credential. */\nexport function exportedColumns(columns: readonly Column[]): Column[] {\n return columns.filter(\n (c) =>\n c.visible &&\n c.exportable !== false &&\n c.classification !== \"secret\" &&\n c.classification !== \"credential\",\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 = exportedColumns(payload.columns);\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 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 try {\n // THE download door (kit): the object URL outlives the click by a beat, so Safari keeps the save.\n downloadFile(a.file.filename, a.file.bytes.slice().buffer as ArrayBuffer, a.file.mime);\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 }\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 initialEnvelope: menu.initialEnvelope ?? provider.initialEnvelope ?? \"ai\",\n limits,\n });\n}\n/**\n * True for the objects React uses to represent a component or an element —\n * `forwardRef`, `memo`, `lazy`, portals, elements. They are all tagged with the\n * `$$typeof` symbol, which is exactly the test React uses itself.\n */\nfunction isReactElementType(value: object): boolean {\n const tag = (value as { $$typeof?: unknown }).$$typeof;\n return typeof tag === \"symbol\";\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 // A React component or element is registered BEHAVIOUR too — it is rendered,\n // never inspected — and `React.forwardRef` / `React.memo` produce OBJECTS\n // rather than functions. React's development build defines their\n // `displayName` as an ACCESSOR, so walking into one threw \"cannot use\n // accessors\" at `registration/icon/displayName` and took EVERY dashboard page\n // that renders a transfer menu down behind its error boundary (2026-09-14;\n // every AI variant the admin dashboard registers carries a lucide `icon`).\n // Recognised the way React itself recognises them.\n if (isReactElementType(value)) 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","/**\n * `@ai-matrx/alchemy/operate/formats/rich-html` — the rich clipboard format (CONTRACT §1.9a).\n *\n * Engine: THE one Markdown→HTML engine (`@ai-matrx/print/markdown-html`, loaded lazily) with the\n * `inline` skin — styles on elements, no class dependence, because Google Docs and Word drop\n * `<style>` and classes on paste. Docs and Word are one action (\"Copy formatted\") until a\n * destination profile produces different bytes. Private images go through the host's asset\n * port. Every HTML string ends in print's allow-list.\n */\n\nimport type { MarkdownHtmlEngine } from \"@ai-matrx/print/markdown-html\";\nimport { ContentTransferError, sealTransferArtifact } from \"../core\";\nimport type { FormatEngine, FormatOptions } from \"../contract\";\nimport type { Artifact, Draft } from \"../types\";\n\nconst ENGINE = Symbol.for(\"ai-matrx.alchemy.operate.markdown-html-engine\");\n\n/** One engine per realm, created on first use (the print module itself loads only here). */\nexport async function loadMarkdownHtmlEngine(): Promise<MarkdownHtmlEngine> {\n const g = globalThis as unknown as Record<symbol, Promise<MarkdownHtmlEngine> | undefined>;\n g[ENGINE] ??= import(\"@ai-matrx/print/markdown-html\").then((m) => m.createMarkdownHtmlEngine());\n return g[ENGINE] as Promise<MarkdownHtmlEngine>;\n}\n\nfunction parseOptions(options: FormatOptions, signal: AbortSignal) {\n return {\n signal,\n ...(options.onNotice ? { onNotice: options.onNotice } : {}),\n ...(options.assets ? { assets: options.assets } : {}),\n };\n}\n\n/** Plain text from the one parse (the `plain` format for Markdown payloads). */\nexport async function markdownPlainText(markdown: string, options: FormatOptions, signal: AbortSignal): Promise<string> {\n const engine = await loadMarkdownHtmlEngine();\n return engine.plainText(await engine.parse(markdown, parseOptions(options, signal)));\n}\n\nexport const richHtmlEngine: FormatEngine = {\n async build(draft: Draft, options: FormatOptions, signal: AbortSignal): Promise<Artifact> {\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n if (draft.payload.kind !== \"markdown\") {\n throw new ContentTransferError(\"unsupported-format\", \"Formatted copy needs Markdown content. Copy it as plain text instead.\");\n }\n const engine = await loadMarkdownHtmlEngine();\n const tree = await engine.parse(draft.payload.text, parseOptions(options, signal));\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n const html = engine.fragment(tree, { skin: options.skin ?? \"inline\", profile: options.profile ?? \"generic\" });\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format: \"rich-html\",\n plainText: engine.plainText(tree),\n html,\n file: { filename: options.filename ?? \"export.html\", mime: \"text/html;charset=utf-8\", bytes: new TextEncoder().encode(html) },\n omissions: draft.omissions.map((o) => ({ ...o })),\n });\n },\n};\n","/**\n * `@ai-matrx/alchemy/operate/formats/document` — HTML page, PDF, DOCX and EPUB (CONTRACT §1.9).\n *\n * One tree: the HTML page is THE one Markdown→HTML engine's `document()` (print's\n * `documentToHtml`, body allow-listed); PDF (vector, selectable text), DOCX and EPUB are print's\n * `/document` writers over the same parse. Print loads only when one of these is chosen.\n * A text payload with a language exports as its fenced code block.\n */\n\nimport { ContentTransferError, sealTransferArtifact } from \"../core\";\nimport type { FormatEngine, FormatOptions } from \"../contract\";\nimport { fencedCodeBlock } from \"../fenced-code\";\nimport type { Artifact, Draft } from \"../types\";\nimport { loadMarkdownHtmlEngine } from \"./rich-html\";\n\nconst enc = new TextEncoder();\n\nfunction markdownOf(draft: Draft): string {\n const p = draft.payload;\n if (p.kind === \"markdown\") return p.text;\n if (p.kind === \"text\") {\n if (!p.language) return p.text;\n return fencedCodeBlock(p.text, p.language);\n }\n throw new ContentTransferError(\"unsupported-format\", \"A document needs text or Markdown content. Download it as JSON or CSV instead.\");\n}\n\nconst stem = (filename: string | undefined) => (filename ? filename.replace(/\\.[a-z0-9]+$/i, \"\") : undefined);\n\n/** The standalone HTML page (the `html` format for prose). */\nexport const documentHtmlEngine: FormatEngine = {\n async build(draft: Draft, options: FormatOptions, signal: AbortSignal): Promise<Artifact> {\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n const engine = await loadMarkdownHtmlEngine();\n const tree = await engine.parse(markdownOf(draft), {\n signal,\n ...(options.onNotice ? { onNotice: options.onNotice } : {}),\n ...(options.assets ? { assets: options.assets } : {}),\n });\n const page = engine.document(tree);\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format: \"html\",\n plainText: engine.plainText(tree),\n html: page,\n file: { filename: options.filename ?? \"export.html\", mime: \"text/html;charset=utf-8\", bytes: enc.encode(page) },\n omissions: draft.omissions.map((o) => ({ ...o })),\n });\n },\n};\n\n/** PDF / DOCX / EPUB through print's `/document` (lazy). */\nexport function documentEngine(format: \"pdf\" | \"docx\" | \"epub\"): FormatEngine {\n return {\n async build(draft: Draft, options: FormatOptions, signal: AbortSignal): Promise<Artifact> {\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n const source = markdownOf(draft);\n const { exportDocument } = await import(\"@ai-matrx/print/document\");\n const name = stem(options.filename);\n const out = await exportDocument(source, format, {\n ...(name ? { fileName: name } : {}),\n ...(options.onNotice ? { onNotice: (n) => options.onNotice?.({ code: n.code, sentence: n.message, remedy: n.remedy }) } : {}),\n });\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format,\n plainText: source,\n file: { filename: out.fileName, mime: out.mime, bytes: out.bytes },\n omissions: draft.omissions.map((o) => ({ ...o })),\n });\n },\n };\n}\n","/**\n * `@ai-matrx/alchemy/operate` — THE transfer engine (Matrx Alchemy CONTRACT §2.3, ALC-16).\n *\n * capture → projection → draft → a SEALED artifact → delivery. Built-in formats need no heavy\n * dependency; rich HTML, the HTML page, PDF, DOCX and EPUB load `@ai-matrx/print` on first use,\n * and the Excel workbook loads SheetJS on first use. No React.\n */\nexport * from \"./operate/core\";\nexport type {\n BuiltInFormatId,\n Delivery,\n DeliveryOutcome,\n FormatAdapter,\n FormatEngine,\n FormatOptions,\n Notice,\n Receipt,\n SealedArtifact,\n ServerOperation,\n TransferOperation,\n WriteTargetRef,\n} from \"./operate/contract\";\nexport {\n DuplicateWriteHandlerError,\n createWriteDoor,\n type CannotApply,\n type WriteApplyRequest,\n type WriteCaller,\n type WriteDoor,\n type WriteDoorDeclarations,\n type WriteDoorPorts,\n type WriteHandler,\n type WriteHandlerResult,\n type WriteOp,\n type WriteRefusalReason,\n type WriteRequest,\n type WriteReviewPort,\n} from \"./operate/door\";\nexport { hasThinking, stripThinking } from \"./operate/thinking\";\nexport { FORMAT_ADAPTERS, eligibleFormats, extensionForLanguage, formatAdapter } from \"./operate/formats\";\nexport {\n createDelivery,\n isSealed,\n openPreparation,\n sealArtifact,\n sealDraft,\n type PreparationOptions,\n type PreparationSession,\n} from \"./operate/preparation\";\nexport {\n agentPayloadWithSpans,\n jsonTextSpans,\n offsetSpans,\n spanMap,\n type OutputSpan,\n type SpanMap,\n} from \"./operate/spans\";\nexport {\n EMPTY_STRUCTURE,\n applyJsonStructure,\n applySectionStructure,\n applyStructureToJson,\n concretePointers,\n displayPath,\n isProseSection,\n joinPointer,\n jsonSize,\n nodeChars,\n outputPointer,\n patternBelow,\n patternCovers,\n patternMatches,\n pointerSegments,\n sectionLayout,\n stubText,\n type NodeLimit,\n type SectionLayout,\n type StructureRecipe,\n} from \"./operate/tree\";\nexport {\n TRANSFER_DEFAULT_RECIPE_SETTING,\n recipeKey,\n resolveDefaultRecipe,\n setPersonDefaultRecipe,\n type RecipeOrigin,\n type ResolvedRecipe,\n} from \"./operate/recipes\";\nexport { buildFile, type BuildFileOptions, type BuiltFile } from \"./operate/build-file\";\n","/**\n * THE ONE WRITE DOOR (Matrx Alchemy ALC-17; Applets CONTRACTS §6 \"receipts through the one write door\").\n *\n * Every write — a person's edit, a menu row, a destination send, an agent, an applet, an automation,\n * an Action projected from a write target — lands through `door.write`. The door:\n *\n * 1. resolves the DECLARED write target (the surface's own, then its ancestors'); an undeclared\n * target is refused by name;\n * 2. enforces the mode: `stream` takes ops from the target's `streamOps`; ops on any other target\n * need `patchable` (+ `updatesValue`); a value on a `stream` target is refused;\n * 3. checks the kind (rule 10): a person's mismatch WARNS (the receipt is still applied, with a\n * `warning` and a `fix`); an agent's, applet's or automation's malformed write is REFUSED;\n * 4. applies the policy: manual → a person only; ask → a person's own act is the approval, anyone\n * else asks through `approvals`; queued → filed through `review`; auto → applies;\n * 5. applies through the handler: the mounted page's LIVE handler wins over the HEADLESS one;\n * neither → refused `unapplicable` (\"open <surface> to apply it\");\n * 6. turns stale / missing record / broken protected span into \"cannot apply\" with a one-click\n * remedy (rule 11).\n *\n * Every outcome is a `Receipt` carrying the system's own sentence. `write` never throws.\n *\n * Who counts as a person: `person`, `menu` and `destination` (a destination send is a person's own\n * click on \"Send to …\"). `agent`, `applet` and `automation` are not.\n *\n * Open-risk ruling — stream ops into an entity target: an entity write is ONE atomic save. Ops reach\n * an entity target only when it is declared `patchable` (the ops are handed to the handler in one\n * call and commit as one save); a non-patchable entity target refuses ops with the remedy \"stream\n * into the editor, then save\". Op-by-op persistence into a record does not exist.\n */\nimport type { AlchemyHostPorts, Json } from \"../ports\";\nimport type { ItemType, StreamOp, WriteTarget } from \"../declare/types\";\nimport type { Receipt, WriteTargetRef } from \"./contract\";\n\n/** Who is writing. `menu` and `destination` are a person's own act. */\nexport type WriteCaller = \"person\" | \"agent\" | \"applet\" | \"automation\" | \"destination\" | \"menu\";\n\n/** One text op for a `stream` (or `patchable`) target — the WidgetHandle op set. */\nexport interface WriteOp {\n op: StreamOp;\n /** The text the op inserts or replaces with. */\n text?: string;\n /** What `replace` / `insert_before` / `insert_after` / `patch` anchor on. */\n find?: string;\n}\n\nexport interface WriteRequest {\n surfaceName: string;\n /** A write target name; `\"<itemType>.<name>\"` names an item's target. */\n target: string;\n itemType?: string;\n /** Which item, by its declared identity values. Required for an item target. */\n itemIdentity?: Record<string, string>;\n /** A whole value. Exactly one of `value` / `ops`. */\n value?: unknown;\n /** Text ops (stream / patchable targets). */\n ops?: readonly WriteOp[];\n by: WriteCaller;\n runId?: string;\n}\n\n/** What a handler receives: the request plus the declared target it resolved to. */\nexport interface WriteApplyRequest {\n surfaceName: string;\n /** The surface that declares the target (an ancestor when inherited). */\n declaredOn: string;\n target: WriteTarget;\n item?: { itemType: string; identity: Record<string, string> };\n value?: unknown;\n ops?: readonly WriteOp[];\n by: WriteCaller;\n runId?: string;\n}\n\n/** Rule 11: the three \"cannot apply\" signals. */\nexport type CannotApply = \"stale\" | \"missing-record\" | \"broken-span\";\n\n/**\n * A handler applies the write. Return nothing (or `{ status: \"applied\" }`) when it landed, or a\n * `cannotApply` signal; THROWING an error whose `code` is a `CannotApply` signal means the same.\n */\nexport type WriteHandlerResult =\n | void\n | { status: \"applied\"; sentence?: string; /** What the write produced (e.g. the created record); passed to `receipt.result` unchanged. */ result?: Json }\n | { status: \"cannot-apply\"; cannotApply: CannotApply; sentence?: string; remedy?: string };\n\nexport type WriteHandler = (request: WriteApplyRequest, signal: AbortSignal) => WriteHandlerResult | Promise<WriteHandlerResult>;\n\n/** Files a `queued` write for an organization's review. */\nexport interface WriteReviewPort {\n file(request: WriteApplyRequest): Promise<{ sentence?: string; remedy?: string } | void>;\n}\n\n/** Why a write was refused. */\nexport type WriteRefusalReason =\n | \"undeclared\"\n | \"needs_item\"\n | \"malformed\"\n | \"declaration_broken\"\n | \"manual_only\"\n | \"needs_approval\"\n | \"declined\"\n | \"no_review\"\n | \"unapplicable\"\n | \"cannot_apply\"\n | \"cancelled\"\n | \"failed\";\n\nexport interface WriteDoor {\n write(request: WriteRequest, signal?: AbortSignal): Promise<Receipt>;\n /** A feature's write handler that works with no page mounted. Refuses a second one for the same target. */\n registerHeadless(surfaceName: string, targetName: string, handler: WriteHandler): () => void;\n /** A mounted page's handler; wins over the headless one while registered. Returns unregister. */\n registerLive(surfaceName: string, targetName: string, handler: WriteHandler): () => void;\n}\n\n/** The declarations the door reads: a `DeclarationRegistry` satisfies it. */\nexport interface WriteDoorDeclarations {\n get(surfaceName: string): { writeTargets?: readonly WriteTarget[]; itemTypes?: readonly ItemType[] } | undefined;\n /** Parent chain, root first (the registry's `ancestry`). Absent = no inheritance. */\n ancestry?(surfaceName: string): string[];\n}\n\nexport type WriteDoorPorts = Pick<AlchemyHostPorts, \"diagnostics\" | \"kinds\" | \"approvals\" | \"review\">;\n\nconst PERSON: ReadonlySet<WriteCaller> = new Set([\"person\", \"menu\", \"destination\"]);\nconst POLICIES: ReadonlySet<string> = new Set([\"manual\", \"ask\", \"auto\", \"queued\"]);\n\nexport class DuplicateWriteHandlerError extends Error {\n constructor(surfaceName: string, targetName: string) {\n super(`[door] \"${surfaceName}\" already has a headless handler for \"${targetName}\". One handler per target; nothing was overwritten.`);\n this.name = \"DuplicateWriteHandlerError\";\n }\n}\n\nfunction handlerKey(surfaceName: string, itemType: string, name: string): string {\n return `${surfaceName}\\u0000${itemType}\\u0000${name}`;\n}\n\nfunction splitTarget(target: string, itemType?: string): { itemType: string; name: string } {\n const dot = target.indexOf(\".\");\n if (dot > 0 && !itemType) return { itemType: target.slice(0, dot), name: target.slice(dot + 1) };\n return { itemType: itemType ?? \"\", name: target };\n}\n\nfunction qualified(itemType: string, name: string): string {\n return itemType ? `${itemType}.${name}` : name;\n}\n\nfunction messageOf(error: unknown): string {\n if (error instanceof Error && error.message.trim()) return error.message;\n if (typeof error === \"string\" && error.trim()) return error;\n return \"The save failed without saying why.\";\n}\n\nfunction toJson(value: unknown): Json {\n if (value === undefined) return null;\n if (value instanceof Uint8Array) return `<${value.byteLength} bytes>`;\n try {\n return JSON.parse(JSON.stringify(value)) as Json;\n } catch {\n return String(value);\n }\n}\n\n/** Does `value` have the declared value type? `document` takes text or a structured document. */\nfunction typeMatches(valueType: WriteTarget[\"valueType\"], value: unknown): boolean {\n switch (valueType) {\n case \"string\":\n return typeof value === \"string\";\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value);\n case \"boolean\":\n return typeof value === \"boolean\";\n case \"array\":\n return Array.isArray(value);\n case \"object\":\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && !(value instanceof Uint8Array);\n case \"document\":\n return typeof value === \"string\" || value instanceof Uint8Array || (typeof value === \"object\" && value !== null);\n default:\n return true;\n }\n}\n\nconst CANNOT_APPLY_WORDS: Record<CannotApply, { sentence: string; remedy: string }> = {\n stale: {\n sentence: \"it changed since this was written\",\n remedy: \"Reload the latest version and apply it again.\",\n },\n \"missing-record\": {\n sentence: \"the record it belongs to no longer exists\",\n remedy: \"Pick where it should go instead and apply it again.\",\n },\n \"broken-span\": {\n sentence: \"it would break a protected part of the content\",\n remedy: \"Review the change against the protected part and apply it again.\",\n },\n};\n\nfunction cannotApplyOf(error: unknown): CannotApply | null {\n const code = (error as { code?: unknown } | null)?.code;\n return code === \"stale\" || code === \"missing-record\" || code === \"broken-span\" ? code : null;\n}\n\nexport function createWriteDoor(options: { ports: WriteDoorPorts; declarations: WriteDoorDeclarations }): WriteDoor {\n const { ports, declarations } = options;\n const headless = new Map<string, WriteHandler>();\n const live = new Map<string, WriteHandler[]>();\n\n const capture = (error: unknown, detail: Json) => {\n try {\n ports.diagnostics.capture(error, { area: \"write\", detail });\n } catch {\n // A broken diagnostics port never turns a receipt into a throw.\n }\n };\n\n function resolveTarget(\n surfaceName: string,\n itemType: string,\n name: string,\n ): { target: WriteTarget; declaredOn: string; itemType: string; identity: readonly string[] | null } | null {\n let chain: string[] = [surfaceName];\n try {\n chain = [surfaceName, ...(declarations.ancestry?.(surfaceName) ?? []).slice().reverse()];\n } catch (error) {\n capture(error, { stage: \"ancestry\", surfaceName });\n }\n for (const surface of chain) {\n const declaration = declarations.get(surface);\n if (!declaration) continue;\n const screen = (declaration.writeTargets ?? []).find((t) => t.name === name && (t.itemType ?? \"\") === itemType);\n if (screen) {\n const item = itemType ? declaration.itemTypes?.find((i) => i.name === itemType) : undefined;\n return { target: screen, declaredOn: surface, itemType, identity: itemType ? (item?.identity ?? []) : null };\n }\n if (itemType) {\n const item = declaration.itemTypes?.find((i) => i.name === itemType);\n const own = item?.writeTargets?.find((t) => t.name === name);\n if (item && own) return { target: own, declaredOn: surface, itemType, identity: item.identity };\n }\n }\n return null;\n }\n\n /** The surfaces from the writing one up to (and including) the one that declared the target, nearest first. */\n function chainUpTo(surfaceName: string, declaredOn: string): string[] {\n let chain: string[] = [surfaceName];\n try {\n chain = [surfaceName, ...(declarations.ancestry?.(surfaceName) ?? []).slice().reverse()];\n } catch (error) {\n capture(error, { stage: \"ancestry\", surfaceName });\n }\n const end = chain.indexOf(declaredOn);\n return end >= 0 ? chain.slice(0, end + 1) : [surfaceName, declaredOn];\n }\n\n function handlerFor(surfaces: readonly string[], itemType: string, name: string): WriteHandler | null {\n for (const surface of surfaces) {\n const key = handlerKey(surface, itemType, name);\n const stack = live.get(key);\n if (stack?.length) return stack[stack.length - 1] ?? null;\n }\n for (const surface of surfaces) {\n const handler = headless.get(handlerKey(surface, itemType, name));\n if (handler) return handler;\n }\n return null;\n }\n\n async function write(request: WriteRequest, signal: AbortSignal = new AbortController().signal): Promise<Receipt> {\n if (!request || typeof request.target !== \"string\" || !request.target) {\n // The door never throws to its caller, even for a request the types forbid.\n return {\n status: \"refused\",\n to: { surfaceName: String(request?.surfaceName ?? \"\"), target: String(request?.target ?? \"\") },\n reason: \"malformed\",\n sentence: \"This write names no place to save, so nothing was saved.\",\n remedy: \"Name the declared write target to save into.\",\n };\n }\n const { itemType, name } = splitTarget(request.target, request.itemType);\n const to: WriteTargetRef = {\n surfaceName: request.surfaceName,\n target: qualified(itemType, name),\n ...(request.itemIdentity && itemType ? { item: { itemType, identity: request.itemIdentity } } : {}),\n };\n const refuse = (reason: WriteRefusalReason, sentence: string, remedy: string): Receipt => ({ status: \"refused\", to, reason, sentence, remedy });\n const isPerson = PERSON.has(request.by);\n try {\n if (!request.surfaceName) {\n return refuse(\"undeclared\", `This write names no screen, so \"${to.target}\" can't be found.`, \"Send it from the screen it belongs to.\");\n }\n const resolved = resolveTarget(request.surfaceName, itemType, name);\n if (!resolved) {\n return refuse(\n \"undeclared\",\n `${request.surfaceName} declares no write target ${to.target}, so nothing was saved.`,\n `Pick one of ${request.surfaceName}'s declared places to save, or declare \"${to.target}\" on it.`,\n );\n }\n const { target, declaredOn } = resolved;\n const label = target.label || target.name;\n\n // Item targets need to know which item.\n let item: WriteApplyRequest[\"item\"];\n if (resolved.identity) {\n const identity = request.itemIdentity ?? {};\n const missing = resolved.identity.filter((key) => !identity[key]);\n if (!request.itemIdentity || missing.length) {\n return refuse(\n \"needs_item\",\n `\"${label}\" saves into one ${resolved.itemType}, and this write doesn't say which${missing.length ? ` (missing ${missing.join(\", \")})` : \"\"}.`,\n `Pick the ${resolved.itemType} first, then save again.`,\n );\n }\n item = { itemType: resolved.itemType, identity: { ...identity } };\n }\n\n // ── Mode ────────────────────────────────────────────────────────────\n const hasOps = request.ops !== undefined;\n if (hasOps === (request.value !== undefined)) {\n return refuse(\n \"malformed\",\n hasOps ? `A write to \"${label}\" carries both a value and edits; send one.` : `A write to \"${label}\" carries nothing to save.`,\n \"Send either the whole value or the edits, then try again.\",\n );\n }\n if (target.mode === \"stream\" || (hasOps && target.patchable)) {\n if (!target.updatesValue) {\n capture(new Error(`write target \"${to.target}\" on ${declaredOn} edits text but declares no updatesValue`), { stage: \"declaration\", surfaceName: declaredOn, target: to.target });\n return refuse(\n \"declaration_broken\",\n `\"${label}\" edits text but doesn't say which value it edits, so it can't be applied safely.`,\n `Declare updatesValue on ${declaredOn}'s \"${to.target}\".`,\n );\n }\n }\n if (target.mode === \"stream\") {\n if (!hasOps) {\n return refuse(\"malformed\", `\"${label}\" takes edits, not a whole value.`, `Send it as edits (${(target.streamOps ?? []).join(\", \") || \"none declared\"}).`);\n }\n if (!target.streamOps?.length) {\n capture(new Error(`stream target \"${to.target}\" on ${declaredOn} declares no streamOps`), { stage: \"declaration\", surfaceName: declaredOn, target: to.target });\n return refuse(\"declaration_broken\", `\"${label}\" takes edits but declares none it accepts.`, `Declare streamOps on ${declaredOn}'s \"${to.target}\".`);\n }\n } else if (hasOps) {\n if (!target.patchable) {\n return refuse(\n \"malformed\",\n target.mode === \"entity\"\n ? `\"${label}\" saves a whole record at once and takes no live edits.`\n : `\"${label}\" takes a whole value, not edits.`,\n target.mode === \"entity\" ? \"Stream the edits into the editor, then save the result.\" : \"Send the whole value instead.\",\n );\n }\n }\n if (hasOps) {\n const allowed = new Set<string>(target.mode === \"stream\" ? (target.streamOps ?? []) : (target.streamOps ?? [\"patch\"]));\n const bad = (request.ops ?? []).filter((op) => !op || !allowed.has(op.op)).map((op) => String(op?.op));\n if (!request.ops?.length || bad.length) {\n const sentence = !request.ops?.length\n ? `A write to \"${label}\" carries no edits.`\n : `\"${label}\" doesn't accept the edit${bad.length > 1 ? \"s\" : \"\"} ${bad.join(\", \")}.`;\n return refuse(\"malformed\", sentence, `Use only ${[...allowed].join(\", \")}.`);\n }\n }\n\n // ── Kind (rule 10) ──────────────────────────────────────────────────\n let warning: { warning: string; fix: string } | null = null;\n if (!hasOps) {\n let problem: { sentence: string; remedy: string } | null = null;\n if (!typeMatches(target.valueType, request.value)) {\n problem = { sentence: `\"${label}\" expects ${target.valueType === \"array\" ? \"a list\" : `a ${target.valueType}`}.`, remedy: `Send it as ${target.valueType === \"array\" ? \"a list\" : `a ${target.valueType}`}.` };\n } else if (target.valueKind) {\n if (!ports.kinds) {\n problem = { sentence: `\"${label}\" holds ${target.valueKind}, and it can't be checked here.`, remedy: \"Check the content before relying on it.\" };\n } else {\n const verdict = await ports.kinds.validate(target.valueKind, request.value, signal);\n if (!verdict.ok) problem = { sentence: verdict.sentence, remedy: verdict.remedy };\n }\n }\n if (problem) {\n if (!isPerson) return refuse(\"malformed\", `The write to \"${label}\" was refused: ${problem.sentence}`, problem.remedy);\n warning = { warning: problem.sentence, fix: problem.remedy };\n }\n }\n\n // ── Policy ──────────────────────────────────────────────────────────\n const applyRequest: WriteApplyRequest = {\n surfaceName: request.surfaceName,\n declaredOn,\n target,\n ...(item ? { item } : {}),\n ...(request.ops ? { ops: request.ops } : { value: request.value }),\n by: request.by,\n ...(request.runId ? { runId: request.runId } : {}),\n };\n const declaredPolicy = target.applyPolicy ?? \"manual\";\n // An unrecognised policy (a typo in a row) is the strictest one, announced — never auto.\n const policy = POLICIES.has(declaredPolicy) ? declaredPolicy : \"manual\";\n if (policy !== declaredPolicy) {\n capture(new Error(`write target \"${to.target}\" on ${declaredOn} declares unknown applyPolicy \"${String(declaredPolicy)}\"; treated as manual`), {\n stage: \"declaration\",\n surfaceName: declaredOn,\n target: to.target,\n });\n }\n if (policy === \"manual\" && !isPerson) {\n return refuse(\"manual_only\", `\"${label}\" is saved only by a person, so the ${request.by}'s write was not applied.`, \"Ask a person to review it and save it themselves.\");\n }\n if (policy === \"ask\" && !isPerson) {\n if (!ports.approvals) {\n return refuse(\"needs_approval\", `\"${label}\" needs a person's approval, and there is no one to ask here.`, `Open ${request.surfaceName} so a person can approve it.`);\n }\n if (signal.aborted) return refuse(\"cancelled\", `\"${label}\" was cancelled before anyone was asked, so nothing was saved.`, \"Send it again when you're ready.\");\n let approved: boolean;\n try {\n approved = await ports.approvals.ask({\n action: to.target,\n label,\n description: target.description,\n input: hasOps ? ({ ops: toJson(request.ops) } as Json) : toJson(request.value),\n by: request.by as \"agent\" | \"applet\" | \"automation\",\n surfaceName: request.surfaceName,\n ...(request.runId ? { runId: request.runId } : {}),\n });\n } catch (error) {\n capture(error, { stage: \"approval\", surfaceName: request.surfaceName, target: to.target, by: request.by });\n return refuse(\"failed\", `Couldn't ask a person to approve \"${label}\", so nothing was saved: ${messageOf(error)}`, \"Try again; if it keeps failing, open the page and save it yourself.\");\n }\n if (!approved) return refuse(\"declined\", `\"${label}\" was not approved, so nothing was saved.`, \"Change it and propose it again.\");\n }\n if (policy === \"queued\") {\n if (!ports.review) {\n return refuse(\"no_review\", `\"${label}\" is saved only after review, and review isn't available here.`, `Open ${request.surfaceName} where review is available, then send it again.`);\n }\n const filed = await ports.review.file(applyRequest);\n return {\n status: \"queued\",\n to,\n sentence: filed?.sentence ?? `Sent \"${label}\" for review; it will be saved once approved.`,\n remedy: filed?.remedy ?? \"Open the review queue to approve it.\",\n };\n }\n\n // ── Apply ───────────────────────────────────────────────────────────\n // The nearest registered handler anywhere on the chain applies it (a middle surface may own the page).\n const handler = handlerFor(chainUpTo(request.surfaceName, declaredOn), resolved.itemType, name);\n if (!handler) {\n return refuse(\"unapplicable\", `\"${label}\" can only be saved with ${request.surfaceName} open, so nothing was saved.`, `Open ${request.surfaceName} to apply it.`);\n }\n if (signal.aborted) return refuse(\"cancelled\", `\"${label}\" was cancelled, so nothing was saved.`, \"Send it again when you're ready.\");\n let result: WriteHandlerResult;\n try {\n result = await handler(applyRequest, signal);\n } catch (error) {\n const signalled = cannotApplyOf(error);\n if (signalled) {\n const words = CANNOT_APPLY_WORDS[signalled];\n return refuse(\"cannot_apply\", `Can't apply \"${label}\": ${words.sentence}.`, words.remedy);\n }\n capture(error, { stage: \"apply\", surfaceName: request.surfaceName, target: to.target, by: request.by });\n return refuse(\"failed\", `\"${label}\" was not saved: ${messageOf(error)}`, \"Try again; if it keeps failing, copy it and paste it in by hand.\");\n }\n if (result && result.status === \"cannot-apply\") {\n const words = CANNOT_APPLY_WORDS[result.cannotApply];\n return refuse(\"cannot_apply\", result.sentence ?? `Can't apply \"${label}\": ${words.sentence}.`, result.remedy ?? words.remedy);\n }\n return {\n status: \"applied\",\n to,\n sentence: (result && result.sentence) || `Saved to \"${label}\".`,\n ...(result && result.status === \"applied\" && result.result !== undefined ? { result: result.result } : {}),\n ...(warning ?? {}),\n };\n } catch (error) {\n capture(error, { stage: \"door\", surfaceName: request.surfaceName, target: to.target, by: request.by });\n return refuse(\"failed\", `\"${to.target}\" was not saved: ${messageOf(error)}`, \"Try again; if it keeps failing, copy it and paste it in by hand.\");\n }\n }\n\n return {\n write,\n registerHeadless(surfaceName, targetName, handler) {\n const { itemType, name } = splitTarget(targetName);\n const key = handlerKey(surfaceName, itemType, name);\n if (headless.has(key)) throw new DuplicateWriteHandlerError(surfaceName, targetName);\n headless.set(key, handler);\n return () => {\n if (headless.get(key) === handler) headless.delete(key);\n };\n },\n registerLive(surfaceName, targetName, handler) {\n const { itemType, name } = splitTarget(targetName);\n const key = handlerKey(surfaceName, itemType, name);\n const stack = live.get(key) ?? [];\n stack.push(handler);\n live.set(key, stack);\n return () => {\n const current = live.get(key);\n if (!current) return;\n const index = current.lastIndexOf(handler);\n if (index !== -1) current.splice(index, 1);\n if (!current.length) live.delete(key);\n };\n },\n };\n}\n","/**\n * Reasoning (\"thinking\") blocks in model output. A copy of an answer leaves them out by default;\n * the menu's \"Copy including thinking\" variant puts them back (`stripThinking` prop of\n * `MatrxCopyMenu`). Pure and tiny: no engine is loaded.\n *\n * Same contract as print's `removeThinkingContent` — `thinking.test.ts` runs both over one corpus\n * so the two cannot drift apart.\n */\n\n/** Does this content carry any reasoning block? */\nexport function hasThinking(text: string): boolean {\n return !!text && /<thinking>|<think>|<reasoning>/i.test(text);\n}\n\n/**\n * The content without its reasoning blocks. A block between blank lines (its own paragraph) leaves two\n * paragraphs; a block inside a paragraph collapses to one line break; three or more newlines collapse to two.\n */\nexport function stripThinking(text: string): string {\n if (!text) return \"\";\n const hide = (_match: string, before: string, after: string) => (before.length >= 2 || after.length >= 2 ? \"\\n\\n\" : \"\\n\");\n return text\n .replace(/(\\n*)<thinking>[\\s\\S]*?<\\/thinking>(\\n*)/gi, hide)\n .replace(/(\\n*)<think>[\\s\\S]*?<\\/think>(\\n*)/gi, hide)\n .replace(/(\\n*)<reasoning>[\\s\\S]*?<\\/reasoning>(\\n*)/gi, hide)\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n","/**\n * Operate formats — one adapter per format, stable ids, synchronous eligibility, lazy engines\n * (Matrx Alchemy CONTRACT §1.9 / §2.3, ALC-16).\n *\n * Built in (no heavy dependency): plain, markdown, json, compact-json, csv, tsv, rows→html.\n * Loaded on first use: rich-html, html (documents), pdf, docx, epub (print's one Markdown→HTML\n * engine and document writers) and xlsx (SheetJS). The heavy libraries are only ever reached\n * through `import()`, so choosing plain text never downloads a PDF writer.\n */\n\nimport { ContentTransferError, resolveTransferRegistry, sealTransferArtifact, serialize } from \"./core\";\nimport type { FormatAdapter, FormatEngine, FormatOptions } from \"./contract\";\nimport { fencedCodeBlock } from \"./fenced-code\";\nimport type { Artifact, Draft, Payload } from \"./types\";\n\nconst enc = new TextEncoder();\nconst isRows = (p: Payload) => p.kind === \"rows\";\nconst isProse = (p: Payload) => p.kind === \"markdown\" || p.kind === \"text\";\nconst always = () => true;\n\n/** File extension for a code block's language (T17); unknown → txt. */\nconst LANGUAGE_EXTENSION: Readonly<Record<string, string>> = {\n typescript: \"ts\", ts: \"ts\", tsx: \"tsx\", javascript: \"js\", js: \"js\", jsx: \"jsx\", python: \"py\", py: \"py\",\n json: \"json\", html: \"html\", css: \"css\", sql: \"sql\", bash: \"sh\", sh: \"sh\", shell: \"sh\", zsh: \"sh\",\n yaml: \"yaml\", yml: \"yaml\", markdown: \"md\", md: \"md\", go: \"go\", rust: \"rs\", java: \"java\", ruby: \"rb\",\n php: \"php\", csharp: \"cs\", cs: \"cs\", cpp: \"cpp\", c: \"c\", swift: \"swift\", kotlin: \"kt\", xml: \"xml\", toml: \"toml\",\n};\nexport function extensionForLanguage(language: string | undefined): string {\n return (language && LANGUAGE_EXTENSION[language.trim().toLowerCase()]) || \"txt\";\n}\n\nfunction checkSignal(signal: AbortSignal) {\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n}\n\nfunction textArtifact(draft: Draft, format: string, text: string, mime: string, filename: string, html?: string): Artifact {\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format,\n plainText: text,\n ...(html === undefined ? {} : { html }),\n file: { filename, mime, bytes: enc.encode(html ?? text) },\n omissions: draft.omissions.map((o) => ({ ...o })),\n });\n}\n\n/** kit's `serialize` for the formats it owns, with the contract's filename and format id. */\nfunction serialized(format: \"json\" | \"compact-json\" | \"csv\" | \"tsv\", extension: string): FormatEngine {\n return {\n async build(draft, options, signal) {\n checkSignal(signal);\n const a = serialize(draft, format, {\n filename: options.filename ?? `export.${extension}`,\n ...(options.spreadsheetSafe === undefined ? { spreadsheetSafe: format === \"csv\" || format === \"tsv\" } : { spreadsheetSafe: options.spreadsheetSafe }),\n });\n return a;\n },\n };\n}\n\nconst plainEngine: FormatEngine = {\n async build(draft, options, signal) {\n checkSignal(signal);\n if (draft.payload.kind === \"markdown\") {\n // Plain text from the ONE parse: markdown chrome removed, tables as TSV, TeX kept.\n const { markdownPlainText } = await import(\"./formats/rich-html\");\n const text = await markdownPlainText(draft.payload.text, options, signal);\n return textArtifact(draft, \"plain\", text, \"text/plain;charset=utf-8\", options.filename ?? \"export.txt\");\n }\n const ext = draft.payload.kind === \"text\" ? extensionForLanguage(draft.payload.language) : \"txt\";\n const a = serialize(draft, \"plain\", { filename: options.filename ?? `export.${ext}` });\n return a;\n },\n};\n\nconst markdownEngine: FormatEngine = {\n async build(draft, options, signal) {\n checkSignal(signal);\n const p = draft.payload;\n if (p.kind === \"text\" && p.language) {\n // A code block's Markdown is a fence in its own language (longer than any fence inside it).\n const text = fencedCodeBlock(p.text, p.language);\n return textArtifact(draft, \"markdown\", text, \"text/markdown;charset=utf-8\", options.filename ?? \"export.md\");\n }\n return serialize(draft, \"markdown\", { filename: options.filename ?? \"export.md\" });\n },\n};\n\nconst htmlEngine: FormatEngine = {\n async build(draft, options, signal) {\n checkSignal(signal);\n if (isProse(draft.payload)) {\n const { documentHtmlEngine } = await import(\"./formats/document\");\n return documentHtmlEngine.build(draft, options, signal);\n }\n // Rows → the escaped <table>; JSON → an escaped <pre>. No print needed.\n return serialize(draft, \"html\", { filename: options.filename ?? \"export.html\" });\n },\n};\n\nconst lazy = (pick: () => Promise<FormatEngine>): (() => Promise<FormatEngine>) => pick;\n\n/** THE format adapters. Order is menu order. Ids are stable; labels are what a person reads. */\nexport const FORMAT_ADAPTERS: readonly FormatAdapter[] = Object.freeze([\n { id: \"plain\", label: \"Plain text\", extension: \"txt\", mime: \"text/plain;charset=utf-8\", modes: [\"copy\", \"download\"], runsOn: \"client\", supports: always, load: async () => plainEngine },\n { id: \"markdown\", label: \"Markdown\", extension: \"md\", mime: \"text/markdown;charset=utf-8\", modes: [\"copy\", \"download\"], runsOn: \"client\", supports: (p: Payload) => p.kind !== \"json\" && p.kind !== \"registered\", load: async () => markdownEngine },\n {\n // Google Docs and Word are ONE action until a destination profile produces different bytes (1.9a).\n id: \"rich-html\", label: \"Copy formatted\", extension: \"html\", mime: \"text/html;charset=utf-8\", modes: [\"copy\"], runsOn: \"client\",\n supports: (p: Payload) => p.kind === \"markdown\",\n load: lazy(async () => (await import(\"./formats/rich-html\")).richHtmlEngine),\n },\n { id: \"html\", label: \"HTML page\", extension: \"html\", mime: \"text/html;charset=utf-8\", modes: [\"copy\", \"download\"], runsOn: \"client\", supports: (p: Payload) => p.kind !== \"registered\", load: async () => htmlEngine },\n { id: \"json\", label: \"JSON\", extension: \"json\", mime: \"application/json;charset=utf-8\", modes: [\"copy\", \"download\"], runsOn: \"client\", supports: (p: Payload) => p.kind !== \"registered\", load: async () => serialized(\"json\", \"json\") },\n { id: \"compact-json\", label: \"Compact JSON\", extension: \"json\", mime: \"application/json;charset=utf-8\", modes: [\"copy\", \"download\"], runsOn: \"client\", supports: (p: Payload) => p.kind !== \"registered\", load: async () => serialized(\"compact-json\", \"json\") },\n { id: \"csv\", label: \"CSV\", extension: \"csv\", mime: \"text/csv;charset=utf-8\", modes: [\"copy\", \"download\"], runsOn: \"client\", supports: isRows, load: async () => serialized(\"csv\", \"csv\") },\n { id: \"tsv\", label: \"Google Sheets\", extension: \"tsv\", mime: \"text/tab-separated-values;charset=utf-8\", modes: [\"copy\", \"download\"], runsOn: \"client\", supports: isRows, load: async () => serialized(\"tsv\", \"tsv\") },\n {\n id: \"xlsx\", label: \"Excel workbook\", extension: \"xlsx\", mime: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", modes: [\"download\"], runsOn: \"client\",\n supports: isRows,\n load: lazy(async () => (await import(\"@ai-matrx/alchemy/operate/formats/xlsx\")).xlsxEngine),\n },\n {\n // A workbook WITH structure: many sheets, typed cells, formulas, merges (a `registered` payload of\n // format \"workbook\", value `WorkbookJson`). The table menu's plain \"Excel workbook\" stays `xlsx`.\n id: \"xlsx-workbook\", label: \"Excel workbook\", extension: \"xlsx\", mime: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", modes: [\"download\"], runsOn: \"client\",\n supports: (p: Payload) => p.kind === \"registered\" && p.format === \"workbook\",\n load: lazy(async () => (await import(\"@ai-matrx/alchemy/operate/formats/xlsx\")).workbookEngine),\n },\n {\n id: \"pdf\", label: \"PDF\", extension: \"pdf\", mime: \"application/pdf\", modes: [\"download\"], runsOn: \"client\",\n supports: isProse,\n load: lazy(async () => (await import(\"./formats/document\")).documentEngine(\"pdf\")),\n },\n {\n id: \"docx\", label: \"Word document\", extension: \"docx\", mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", modes: [\"download\"], runsOn: \"client\",\n supports: isProse,\n load: lazy(async () => (await import(\"./formats/document\")).documentEngine(\"docx\")),\n },\n {\n id: \"epub\", label: \"EPUB book\", extension: \"epub\", mime: \"application/epub+zip\", modes: [\"download\"], runsOn: \"client\",\n supports: isProse,\n load: lazy(async () => (await import(\"./formats/document\")).documentEngine(\"epub\")),\n },\n] satisfies FormatAdapter[]);\n\n/**\n * The adapters for a payload, in menu order: built-ins first, then registered formats (a\n * duplicate id is refused — a registered format can never shadow a built-in).\n */\nexport function eligibleFormats(payload: Payload, registered: readonly FormatAdapter[] = [], mode?: \"copy\" | \"download\"): FormatAdapter[] {\n return resolveTransferRegistry<FormatAdapter>(FORMAT_ADAPTERS, registered).filter(\n (f) => f.supports(payload) && (mode === undefined || f.modes.includes(mode)),\n );\n}\n\n/** Find an adapter by id (built-in or registered); an unknown id is an error with a remedy. */\nexport function formatAdapter(id: string, registered: readonly FormatAdapter[] = []): FormatAdapter {\n const found = resolveTransferRegistry<FormatAdapter>(FORMAT_ADAPTERS, registered).find((f) => f.id === id);\n if (!found) throw new ContentTransferError(\"unsupported-format\", `There is no \"${id}\" format. Choose one of the formats offered for this content.`);\n return found;\n}\n\nexport type { FormatOptions };\n","/**\n * The preparation workspace and delivery (CONTRACT §2.3, \"exact bytes: preview = copy = download = send\").\n *\n * capture → draft edits → SEAL → copy / download / send, and delivery takes the sealed artifact as-is.\n *\n * `seal` builds once per (draft revision, format, options) and brands the result; `copy`,\n * `copyPending`, `download` and `send` accept only a branded artifact and never rebuild, so the\n * bytes a person previewed are the bytes that reach the clipboard, the file or the destination.\n */\n\nimport {\n ContentTransferError,\n applySectionSelection,\n capture,\n createBrowserTransport,\n createDraft,\n editDraft,\n sealTransferArtifact,\n undoDraft,\n} from \"./core\";\nimport type {\n Delivery,\n DeliveryOutcome,\n FormatAdapter,\n FormatOptions,\n SealedArtifact,\n} from \"./contract\";\nimport type { WriteDoor } from \"./door\";\nimport { formatAdapter } from \"./formats\";\nimport type { Artifact, Draft, Json, Payload, Snapshot, Source, Transform, TransferScope, Transport } from \"./types\";\n\nconst SEALED = Symbol.for(\"ai-matrx.alchemy.operate.sealed-artifacts\");\n\nfunction sealedSet(): WeakSet<object> {\n const g = globalThis as unknown as Record<symbol, WeakSet<object> | undefined>;\n g[SEALED] ??= new WeakSet<object>();\n return g[SEALED] as WeakSet<object>;\n}\n\n/** Freeze an artifact's bytes and brand it; the only way to make a `SealedArtifact`. */\nexport function sealArtifact(artifact: Artifact): SealedArtifact {\n const frozen = sealTransferArtifact(artifact);\n sealedSet().add(frozen);\n return frozen as SealedArtifact;\n}\n\n/** True only for an artifact `sealArtifact` (or a preparation session's `seal`) produced. */\nexport function isSealed(artifact: unknown): artifact is SealedArtifact {\n return typeof artifact === \"object\" && artifact !== null && sealedSet().has(artifact);\n}\n\nconst notSealed: DeliveryOutcome = {\n status: \"error\",\n code: \"not-sealed\",\n message: \"This content was not prepared for delivery, so nothing was copied or saved. Prepare it again and retry.\",\n retryable: true,\n};\n\nexport interface PreparationSession {\n readonly snapshot: Snapshot;\n readonly draft: Draft;\n /** Deterministic transform, AI preparation or any registered transform — bumps draft.revision. */\n transform(id: string, options: Json, signal: AbortSignal): Promise<Draft>;\n /** A manual edit. */\n edit(payload: Payload): Draft;\n /** Keep only these sections (ids from the snapshot). */\n selectSections(ids: readonly string[]): Draft;\n undo(): Draft;\n /** Build once and seal; cached per (draft revision, format, options). */\n seal(format: string, options: FormatOptions, signal: AbortSignal): Promise<SealedArtifact>;\n}\n\nexport interface PreparationOptions {\n /** Transforms this session may run, by id (a duplicate id is refused). */\n transforms?: readonly Transform[];\n /** Registered row formats beside the built-ins (a duplicate id is refused). */\n formats?: readonly FormatAdapter[];\n}\n\n/** The cache key never includes callbacks or ports; options that change bytes do. */\nconst optionsKey = (o: FormatOptions) =>\n JSON.stringify({ f: o.filename ?? null, s: o.spreadsheetSafe ?? null, k: o.skin ?? null, p: o.profile ?? null, h: o.highlightCode ?? false });\n\nexport async function openPreparation(\n source: Source | Payload,\n scope: TransferScope,\n signal: AbortSignal,\n options: PreparationOptions = {},\n): Promise<PreparationSession> {\n const { snapshot } = await capture(source, signal, scope);\n let draft = createDraft(snapshot);\n const transforms = new Map<string, Transform>();\n for (const t of options.transforms ?? []) {\n if (transforms.has(t.id)) throw new ContentTransferError(\"duplicate-registration\", `Transform \"${t.id}\" is registered more than once`);\n transforms.set(t.id, t);\n }\n const cache = new Map<string, Promise<SealedArtifact>>();\n\n return {\n get snapshot() {\n return snapshot;\n },\n get draft() {\n return draft;\n },\n async transform(id, transformOptions, transformSignal) {\n const t = transforms.get(id);\n if (!t) throw new ContentTransferError(\"unsupported-transform\", `There is no \"${id}\" preparation step here.`);\n draft = await t.apply(draft, transformOptions, transformSignal);\n return draft;\n },\n edit(payload) {\n draft = editDraft(draft, payload);\n return draft;\n },\n selectSections(ids) {\n draft = applySectionSelection(draft, snapshot, ids);\n return draft;\n },\n undo() {\n draft = undoDraft(draft);\n return draft;\n },\n seal(format, formatOptions, sealSignal) {\n const adapter = formatAdapter(format, options.formats);\n if (!adapter.supports(draft.payload)) {\n return Promise.reject(new ContentTransferError(\"unsupported-format\", `${adapter.label} is not available for this content.`));\n }\n const key = `${draft.revision}\\u0000${format}\\u0000${optionsKey(formatOptions)}`;\n const hit = cache.get(key);\n if (hit) return hit;\n const at = draft;\n const built = adapter\n .load()\n .then((engine) => engine.build(at, formatOptions, sealSignal))\n .then(sealArtifact);\n // A failed or cancelled build is not cached: the next seal tries again.\n built.catch(() => cache.delete(key));\n cache.set(key, built);\n return built;\n },\n };\n}\n\n/** Seal a draft directly (hosts without a workspace, e.g. a one-click \"Copy as CSV\"). */\nexport async function sealDraft(\n draft: Draft,\n format: string,\n options: FormatOptions,\n signal: AbortSignal,\n formats?: readonly FormatAdapter[],\n): Promise<SealedArtifact> {\n const adapter = formatAdapter(format, formats);\n if (!adapter.supports(draft.payload)) throw new ContentTransferError(\"unsupported-format\", `${adapter.label} is not available for this content.`);\n return sealArtifact(await (await adapter.load()).build(draft, options, signal));\n}\n\ntype ClipboardWrite = (items: ClipboardItem[]) => Promise<void>;\n\nfunction narrow(outcome: Awaited<ReturnType<Transport[\"copy\"]>>): DeliveryOutcome {\n if (outcome.status === \"success\" && outcome.delivered === \"action\") {\n return { status: \"success\", delivered: \"clipboard\", mimeTypes: outcome.mimeTypes };\n }\n if (outcome.status === \"queued\") {\n return { status: \"error\", code: \"unexpected-queued\", message: outcome.message, retryable: false };\n }\n return outcome as DeliveryOutcome;\n}\n\n/**\n * The one delivery. `transport` defaults to the browser (clipboard + download link); a non-browser\n * host binds its own (`TransportPort`). `send` goes through the one write door (ALC-17): without one it is\n * refused with a remedy, never faked.\n */\nexport function createDelivery(\n ports: {\n transport?: Transport;\n /** The one write door (`createWriteDoor`). Absent → `send` is refused with a remedy. */\n door?: Pick<WriteDoor, \"write\">;\n } = {},\n): Delivery {\n const transport = ports.transport ?? createBrowserTransport();\n return {\n async copy(artifact, signal) {\n if (!isSealed(artifact)) return notSealed;\n return narrow(await transport.copy(artifact, signal));\n },\n copyPending(pending, signal, options = {}) {\n // SYNCHRONOUS part first: Safari only honours a clipboard write made inside the click.\n const clipboard = globalThis.navigator?.clipboard as (Clipboard & { write?: ClipboardWrite }) | undefined;\n const Item = globalThis.ClipboardItem as (typeof ClipboardItem & { supports?(type: string): boolean }) | undefined;\n const checked = pending.then((a) => {\n if (!isSealed(a)) throw new ContentTransferError(\"not-sealed\", notSealed.status === \"error\" ? notSealed.message : \"\");\n return a;\n });\n if (clipboard?.write && typeof Item === \"function\") {\n const text = checked.then((a) => new Blob([a.plainText], { type: \"text/plain\" }));\n const entries: Record<string, Promise<Blob>> = { \"text/plain\": text };\n if (options.html) entries[\"text/html\"] = checked.then((a) => new Blob([a.html ?? a.plainText], { type: \"text/html\" }));\n let item: ClipboardItem | null = null;\n try {\n item = new Item(entries as unknown as Record<string, Blob>);\n } catch {\n item = null; // this browser cannot take promise-valued items → build-then-write below\n }\n if (item) {\n const written = clipboard.write([item]);\n return written.then(\n async (): Promise<DeliveryOutcome> =>\n signal.aborted\n ? { status: \"cancelled\" }\n : { status: \"success\", delivered: \"clipboard\", mimeTypes: options.html ? [\"text/plain\", \"text/html\"] : [\"text/plain\"] },\n async (): Promise<DeliveryOutcome> => {\n // Refused (or not sealed): fall back to the plain-text write of the SAME sealed bytes.\n try {\n const a = await checked;\n return narrow(await transport.copy(a, signal));\n } catch (error) {\n return error instanceof ContentTransferError && error.code === \"not-sealed\"\n ? notSealed\n : { status: \"error\", code: \"clipboard-rejected\", message: \"The clipboard refused the copy. Try again.\", retryable: true };\n }\n },\n );\n }\n }\n return checked.then(\n async (a) => narrow(await transport.copy(a, signal)),\n (): DeliveryOutcome => notSealed,\n );\n },\n async download(artifact, signal) {\n if (!isSealed(artifact)) return notSealed;\n return narrow(await transport.download(artifact, signal));\n },\n async send(artifact, to, via) {\n if (!isSealed(artifact)) {\n return { status: \"refused\", to, reason: \"failed\", sentence: notSealed.status === \"error\" ? notSealed.message : \"\", remedy: \"Prepare the content again, then send it.\" };\n }\n if (!ports.door) {\n return {\n status: \"refused\",\n to,\n reason: \"unapplicable\",\n sentence: \"Sending to a destination is not available here yet, so nothing was sent.\",\n remedy: \"Copy or download it instead, then paste it where it belongs.\",\n };\n }\n void via;\n return ports.door.write({\n surfaceName: to.surfaceName ?? \"\",\n target: to.target,\n ...(to.item ? { itemType: to.item.itemType, itemIdentity: to.item.identity } : {}),\n value: artifact.file ? artifact.file.bytes : artifact.plainText,\n by: \"destination\",\n });\n },\n };\n}\n","/**\n * Serializer span maps (Preparation parity PP-06a): every node of the draft payload → the exact\n * span of the SEALED text it became.\n *\n * A span map is computed from the sealed artifact's own `plainText` (the bytes the preview shows,\n * the clipboard receives and the download holds), never from a second rendering of the draft — so\n * a span can never describe text that is not there. Offsets are UTF-16 code units into\n * `artifact.plainText`, `[start, end)`, exactly what `String.prototype.slice` and a DOM text range\n * take.\n *\n * Paths are the JSON Pointers the rest of Operate already uses for omissions:\n * \"\" the whole payload (a text or Markdown payload is one node)\n * \"/messages/0/content\" a node inside a JSON payload\n * \"/rows\" the row array (JSON formats of a rows payload)\n * \"/rows/3\" one row (its whole line in CSV / TSV / Markdown / plain)\n * \"/rows/3/name\" one cell (the column's own path under the row)\n * \"/columns/name\" one header cell (CSV / TSV / Markdown / plain), keyed by column id\n *\n * Spans nest (a row contains its cells, an object its members) and never partially overlap.\n * PP-06b–d (the structure trees) and PP-07 (the removed-text diff) highlight through this map.\n */\nimport { assembleAgentPayload, type AgentPayloadEnvironment, type AgentPayloadInput } from \"./agent-payload\";\nimport { ContentTransferError, exportedColumns } from \"./core\";\nimport { fencedCodeBlock } from \"./fenced-code\";\nimport type { Artifact, Column, Draft } from \"./types\";\n\nexport interface OutputSpan {\n /** JSON Pointer of the node in the draft payload (see the module header). */\n path: string;\n /** UTF-16 offset of the node's first character in `artifact.plainText`. */\n start: number;\n /** UTF-16 offset one past the node's last character. */\n end: number;\n}\nexport type SpanMap = readonly OutputSpan[];\n\nconst pointerSegment = (x: string) => x.replace(/~/g, \"~0\").replace(/\\//g, \"~1\");\n\nfunction spanError(message: string): ContentTransferError {\n return new ContentTransferError(\"unsupported-format\", message);\n}\n\n/**\n * Spans of every value in a JSON text, found by reading the text itself (whatever writer laid it\n * out: pretty, compact, minified, escaped). Pre-order: a container before its members.\n * Throws when the text is not exactly one JSON value.\n */\nexport function jsonTextSpans(text: string, basePath = \"\", offset = 0): OutputSpan[] {\n const spans: OutputSpan[] = [];\n let i = 0;\n const fail = (what: string): never => {\n throw spanError(`The sealed text is not JSON at character ${i}: ${what}.`);\n };\n const ws = () => {\n while (i < text.length && (text[i] === \" \" || text[i] === \"\\n\" || text[i] === \"\\r\" || text[i] === \"\\t\")) i++;\n };\n const readString = (): string => {\n if (text[i] !== '\"') fail(\"expected a string\");\n const start = i;\n i++;\n while (i < text.length && text[i] !== '\"') i += text[i] === \"\\\\\" ? 2 : 1;\n if (i >= text.length) fail(\"unterminated string\");\n i++;\n return JSON.parse(text.slice(start, i)) as string;\n };\n const value = (path: string): void => {\n ws();\n const start = i;\n const slot = spans.length;\n spans.push({ path, start: offset + start, end: offset + start });\n const ch = text[i];\n if (ch === \"{\") {\n i++;\n ws();\n if (text[i] === \"}\") i++;\n else\n for (;;) {\n ws();\n const key = readString();\n ws();\n if (text[i] !== \":\") fail(\"expected ':'\");\n i++;\n value(`${path}/${pointerSegment(key)}`);\n ws();\n if (text[i] === \",\") {\n i++;\n continue;\n }\n if (text[i] === \"}\") {\n i++;\n break;\n }\n fail(\"expected ',' or '}'\");\n }\n } else if (ch === \"[\") {\n i++;\n ws();\n if (text[i] === \"]\") i++;\n else\n for (let index = 0; ; index++) {\n value(`${path}/${index}`);\n ws();\n if (text[i] === \",\") {\n i++;\n continue;\n }\n if (text[i] === \"]\") {\n i++;\n break;\n }\n fail(\"expected ',' or ']'\");\n }\n } else if (ch === '\"') {\n readString();\n } else {\n const m = /^(?:-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?|true|false|null)/.exec(text.slice(i, i + 400));\n if (!m) fail(\"expected a value\");\n i += (m as RegExpExecArray)[0].length;\n }\n (spans[slot] as OutputSpan).end = offset + i;\n };\n value(basePath);\n ws();\n if (i !== text.length) fail(\"text after the value\");\n return spans;\n}\n\n/**\n * CSV / TSV / plain rows: the header line, then one line per row, cells quoted exactly as Operate's\n * serializer quotes them (a cell holding the delimiter, a quote or a line break is wrapped in\n * quotes, so a row's line may itself hold line breaks).\n */\nfunction delimitedSpans(text: string, delimiter: string, columns: readonly Column[], rowCount: number): OutputSpan[] {\n const spans: OutputSpan[] = [];\n let i = 0;\n const readLine = (paths: readonly string[], linePath: string | null) => {\n const lineStart = i;\n const lineSlot = spans.length;\n if (linePath !== null) spans.push({ path: linePath, start: lineStart, end: lineStart });\n paths.forEach((path, index) => {\n const start = i;\n if (text[i] === '\"') {\n i++;\n for (;;) {\n if (i >= text.length) throw spanError(`An unterminated quoted cell starts at character ${start}.`);\n if (text[i] === '\"') {\n if (text[i + 1] === '\"') {\n i += 2;\n continue;\n }\n i++;\n break;\n }\n i++;\n }\n } else {\n while (i < text.length && text[i] !== delimiter && text[i] !== \"\\n\") i++;\n }\n spans.push({ path, start, end: i });\n const last = index === paths.length - 1;\n const expected = last ? \"\\n\" : delimiter;\n if (last && i === text.length) return;\n if (text[i] !== expected) throw spanError(`Expected ${last ? \"a line break\" : \"a delimiter\"} at character ${i}.`);\n if (!last) i++;\n });\n if (linePath !== null) (spans[lineSlot] as OutputSpan).end = i;\n if (i < text.length) i++;\n };\n readLine(columns.map((c) => `/columns/${pointerSegment(c.id)}`), null);\n for (let row = 0; row < rowCount; row++) readLine(columns.map((c) => `/rows/${row}${c.path}`), `/rows/${row}`);\n if (i < text.length) throw spanError(`Text continues after the last row at character ${i}.`);\n return spans;\n}\n\n/** Markdown table rows: `| a | b |`, with `\\|` and `\\\\` escapes inside cells. */\nfunction markdownTableSpans(text: string, columns: readonly Column[], rowCount: number): OutputSpan[] {\n const spans: OutputSpan[] = [];\n const lines: { start: number; end: number }[] = [];\n let at = 0;\n for (const line of text.split(\"\\n\")) {\n lines.push({ start: at, end: at + line.length });\n at += line.length + 1;\n }\n if (lines.length !== rowCount + 2) throw spanError(`A Markdown table of ${rowCount} rows has ${lines.length} lines.`);\n const cells = (line: { start: number; end: number }, paths: readonly string[]) => {\n let i = line.start;\n if (text.slice(i, i + 2) !== \"| \") throw spanError(`A table line must open with \"| \" at character ${i}.`);\n i += 2;\n paths.forEach((path) => {\n const start = i;\n while (i < line.end && text[i] !== \"|\") i += text[i] === \"\\\\\" ? 2 : 1;\n if (text[i] !== \"|\" || text[i - 1] !== \" \") throw spanError(`A table cell must close with \" |\" at character ${i}.`);\n spans.push({ path, start, end: i - 1 });\n i += 2;\n });\n if (i - 1 !== line.end) throw spanError(`A table line has more cells than columns at character ${i}.`);\n };\n cells(lines[0] as { start: number; end: number }, columns.map((c) => `/columns/${pointerSegment(c.id)}`));\n for (let row = 0; row < rowCount; row++) {\n const line = lines[row + 2] as { start: number; end: number };\n spans.push({ path: `/rows/${row}`, start: line.start, end: line.end });\n cells(line, columns.map((c) => `/rows/${row}${c.path}`));\n }\n return spans;\n}\n\n/**\n * The span map of a sealed artifact built from `draft` (same snapshot, same draft revision).\n * Covers the text formats the preparation workspace previews: plain, markdown, json,\n * compact-json, csv, tsv, and html's plain text. Binary and document formats have no text to map\n * and are refused by name.\n */\nexport function spanMap(draft: Draft, artifact: Artifact): SpanMap {\n if (artifact.snapshotId !== draft.snapshotId || artifact.draftRevision !== draft.revision) {\n throw spanError(\"This artifact was built from a different draft, so its spans cannot be read from this one. Seal the current draft again.\");\n }\n const text = artifact.plainText;\n const payload = draft.payload;\n const format = artifact.format;\n if (format === \"json\" || format === \"compact-json\") return jsonTextSpans(text, payload.kind === \"rows\" ? \"/rows\" : \"\");\n if (format === \"csv\" || format === \"tsv\") {\n if (payload.kind !== \"rows\") throw spanError(`${format.toUpperCase()} requires tabular data`);\n return delimitedSpans(text, format === \"csv\" ? \",\" : \"\\t\", exportedColumns(payload.columns), payload.rows.length);\n }\n if (format !== \"plain\" && format !== \"markdown\" && format !== \"html\") {\n throw spanError(`The ${format} format has no text span map; spans cover plain, Markdown, JSON, CSV and TSV text.`);\n }\n if (payload.kind === \"rows\") {\n const columns = exportedColumns(payload.columns);\n return format === \"markdown\"\n ? markdownTableSpans(text, columns, payload.rows.length)\n : delimitedSpans(text, \"\\t\", columns, payload.rows.length);\n }\n if (payload.kind === \"json\" || payload.kind === \"registered\") return jsonTextSpans(text);\n if (payload.kind === \"text\" && payload.language && format === \"markdown\") {\n const fenced = fencedCodeBlock(payload.text, payload.language);\n if (fenced !== text) throw spanError(\"The Markdown code block does not hold this draft's text.\");\n const start = text.indexOf(\"\\n\") + 1;\n return [{ path: \"\", start, end: start + payload.text.length }];\n }\n return [{ path: \"\", start: 0, end: text.length }];\n}\n\n/** The same spans at `offset` characters later — a map carried inside a larger sealed text. */\nexport function offsetSpans(spans: SpanMap, offset: number): OutputSpan[] {\n return spans.map((s) => ({ path: s.path, start: s.start + offset, end: s.end + offset }));\n}\n\n/**\n * The AI envelope with the span map of its data: every node of `input.data` → its span in the\n * envelope text. The body is read where the envelope wrote it, so the spans stay exact even where\n * the envelope escapes `<`, `>` and `&`; for data without those characters they are the bare JSON's\n * spans moved by exactly the envelope header.\n */\nexport function agentPayloadWithSpans(\n input: AgentPayloadInput,\n environment: AgentPayloadEnvironment = {},\n): { text: string; spans: SpanMap } {\n const { text, body, bodyOffset } = assembleAgentPayload(input, environment);\n // A text body (PP-09) is one node written verbatim; a JSON body is read value by value.\n if ((input.dataFormat ?? \"json\") !== \"json\") return { text, spans: [{ path: \"\", start: bodyOffset, end: bodyOffset + body.length }] };\n return { text, spans: jsonTextSpans(body, \"\", bodyOffset) };\n}\n","/**\n * The structure trees' pure core (Preparation parity PP-06b–d, PP-07): what a person's choices in\n * the preparation workspace's Structure pane do to a draft — without React, so an agent can apply\n * the same choices (\"the extraction is a pure function of (data, options)\").\n *\n * exclude JSON Pointer PATTERNS whose segment `*` matches every array item or member:\n * `/messages/* /metadata` (no space) drops every message's metadata.\n * limits per pattern: `stub` (one line that keeps the header and states the original size),\n * `maxChars` (strings under the node cut to N characters), `maxItems` (arrays under the\n * node keep their first N items).\n *\n * The trees only ever REMOVE or SHORTEN. They run on a draft that capture has already projected\n * (secret and non-exportable values are gone before a tree sees them), so no choice here can bring\n * a declared-secret value back. Every change is an omission with a label a person can read.\n *\n * Prose sections (`/text/<start>-<end>` ranges) get the same include / stub / cap choices through\n * `sectionLayout`, which also says where each kept section landed in the text (for highlighting).\n */\nimport { formatCount } from \"@ai-matrx/kit/format\";\n\nimport { ContentTransferError, deriveDraft } from \"./core\";\nimport type { Draft, Json, Omission, Section } from \"./types\";\n\nexport type NodeLimit = { kind: \"stub\" } | { kind: \"maxChars\"; value: number } | { kind: \"maxItems\"; value: number };\nexport interface StructureRecipe {\n exclude: readonly string[];\n limits: Readonly<Record<string, NodeLimit>>;\n}\nexport const EMPTY_STRUCTURE: StructureRecipe = Object.freeze({ exclude: Object.freeze([]) as readonly string[], limits: Object.freeze({}) });\n\nconst encode = (segment: string) => segment.replace(/~/g, \"~0\").replace(/\\//g, \"~1\");\nconst decode = (segment: string) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n\n/** \"\" → []; \"/a/b~1c\" → [\"a\", \"b/c\"]. */\nexport function pointerSegments(pointer: string): string[] {\n if (pointer === \"\") return [];\n if (!pointer.startsWith(\"/\")) throw new ContentTransferError(\"invalid-pointer\", `\"${pointer}\" is not a JSON Pointer (it must start with \"/\").`);\n return pointer.slice(1).split(\"/\").map(decode);\n}\nexport function joinPointer(segments: readonly string[]): string {\n return segments.map((segment) => `/${encode(segment)}`).join(\"\");\n}\n\n/** A pattern names this exact node (`*` matches any one segment). */\nexport function patternMatches(pattern: string, pointer: string): boolean {\n const p = pointerSegments(pattern);\n const s = pointerSegments(pointer);\n return p.length === s.length && p.every((segment, index) => segment === \"*\" || segment === s[index]);\n}\n/** A pattern names this node or one of its ancestors. */\nexport function patternCovers(pattern: string, pointer: string): boolean {\n const p = pointerSegments(pattern);\n const s = pointerSegments(pointer);\n return p.length <= s.length && p.every((segment, index) => segment === \"*\" || segment === s[index]);\n}\n/** A pattern names a strict descendant of this node (for a parent's mixed state). */\nexport function patternBelow(pattern: string, pointer: string): boolean {\n const p = pointerSegments(pattern);\n const s = pointerSegments(pointer);\n return p.length > s.length && s.every((segment, index) => p[index] === \"*\" || p[index] === segment);\n}\n\n/** The path a person reads and copies: `/messages/*\\/metadata` → `data.messages[*].metadata`. */\nexport function displayPath(pointer: string, root = \"data\"): string {\n let out = root;\n for (const segment of pointerSegments(pointer)) {\n if (segment === \"*\" || /^(0|[1-9]\\d*)$/.test(segment)) out += `[${segment}]`;\n else if (/^[A-Za-z_$][\\w$]*$/.test(segment)) out += `${out ? \".\" : \"\"}${segment}`;\n else out += `[${JSON.stringify(segment)}]`;\n }\n return out;\n}\n\nconst sizes = new WeakMap<object, number>();\n/** Exactly `JSON.stringify(value).length`, computed once per object (large sources stay cheap). */\nexport function jsonSize(value: Json): number {\n if (value === null) return 4;\n if (typeof value === \"string\") return JSON.stringify(value).length;\n if (typeof value === \"number\") return (JSON.stringify(value) ?? \"null\").length;\n if (typeof value === \"boolean\") return value ? 4 : 5;\n const cached = sizes.get(value);\n if (cached !== undefined) return cached;\n let total = 2;\n if (Array.isArray(value)) {\n value.forEach((item, index) => { total += jsonSize(item) + (index ? 1 : 0); });\n } else {\n let index = 0;\n for (const [key, item] of Object.entries(value)) {\n total += JSON.stringify(key).length + 1 + jsonSize(item) + (index++ ? 1 : 0);\n }\n }\n sizes.set(value, total);\n return total;\n}\n/** The size a person expects for a node: a string's own length, else its JSON. */\nexport function nodeChars(value: Json): number {\n return typeof value === \"string\" ? value.length : jsonSize(value);\n}\n\n/** Pinned to en-US: these digits are written INTO the copied payload, which must not change with who copied it. */\nconst n = (value: number) => formatCount(value, { locale: \"en-US\" });\n\n/**\n * The one-line stub that stands in for a node: its header (a string's first line, an object's\n * short scalar members) and its original size.\n */\nexport function stubText(value: Json): string {\n const chars = n(nodeChars(value));\n if (typeof value === \"string\") {\n const first = (value.split(\"\\n\", 1)[0] ?? \"\").trim();\n const head = first.length > 120 ? `${first.slice(0, 120)}…` : first;\n return `${head ? `${head} ` : \"\"}[stubbed — ${chars} chars]`;\n }\n if (Array.isArray(value)) return `[stubbed — ${n(value.length)} items, ${chars} chars]`;\n if (value && typeof value === \"object\") {\n const header = Object.entries(value)\n .filter(([, item]) => (typeof item === \"string\" && item.length <= 60 && !item.includes(\"\\n\")) || typeof item === \"number\" || typeof item === \"boolean\")\n .slice(0, 4)\n .map(([key, item]) => `${key}: ${String(item)}`);\n return `[stubbed — ${header.length ? `${header.join(\", \")} — ` : \"\"}${n(Object.keys(value).length)} keys, ${chars} chars]`;\n }\n return `[stubbed — ${chars} chars]`;\n}\nfunction truncateText(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max)} … [truncated — ${n(text.length)} chars]` : text;\n}\n\nfunction assertLimit(limit: NodeLimit, pattern: string) {\n if (limit.kind !== \"stub\" && (!Number.isSafeInteger(limit.value) || limit.value < 0)) {\n throw new ContentTransferError(\"invalid-limit\", `The limit on ${displayPath(pattern)} must be a whole number of 0 or more.`);\n }\n}\n\n/** Every concrete pointer in `value` a pattern names (for counts, diffs and highlights). */\nexport function concretePointers(value: Json, pattern: string): string[] {\n const want = pointerSegments(pattern);\n const out: string[] = [];\n const walk = (node: Json, depth: number, at: string[]) => {\n if (depth === want.length) { out.push(joinPointer(at)); return; }\n if (node === null || typeof node !== \"object\") return;\n const segment = want[depth] as string;\n const entries: [string, Json][] = Array.isArray(node) ? node.map((item, index) => [String(index), item]) : Object.entries(node);\n for (const [key, child] of entries) if (segment === \"*\" || segment === key) walk(child, depth + 1, [...at, key]);\n };\n walk(value, 0, []);\n return out;\n}\n\ninterface Tally { count: number; chars: number }\n\n/** Apply exclusions and per-node limits to a JSON value; returns the new value and what changed. */\nexport function applyStructureToJson(\n value: Json,\n recipe: StructureRecipe,\n labels: Readonly<Record<string, string>> = {},\n): { value: Json; omissions: Omission[] } {\n recipe.exclude.forEach((pattern) => pointerSegments(pattern));\n const limitEntries = Object.entries(recipe.limits);\n limitEntries.forEach(([pattern, limit]) => { pointerSegments(pattern); assertLimit(limit, pattern); });\n const excluded = new Map<string, Tally>();\n const limited = new Map<string, Tally>();\n const tally = (map: Map<string, Tally>, pattern: string, chars: number) => {\n const current = map.get(pattern) ?? { count: 0, chars: 0 };\n map.set(pattern, { count: current.count + 1, chars: current.chars + chars });\n };\n const walk = (node: Json, segments: string[], cap: { pattern: string; max: number } | null): Json | undefined => {\n const pointer = joinPointer(segments);\n const exclusion = segments.length ? recipe.exclude.find((pattern) => patternMatches(pattern, pointer)) : undefined;\n if (exclusion !== undefined) { tally(excluded, exclusion, nodeChars(node)); return undefined; }\n const limitEntry = limitEntries.find(([pattern]) => patternMatches(pattern, pointer));\n const limit = limitEntry?.[1];\n if (limitEntry && limit?.kind === \"stub\") { tally(limited, limitEntry[0], nodeChars(node)); return stubText(node); }\n const nextCap = limitEntry && limit?.kind === \"maxChars\" ? { pattern: limitEntry[0], max: limit.value } : cap;\n if (typeof node === \"string\") {\n if (nextCap && node.length > nextCap.max) { tally(limited, nextCap.pattern, node.length); return truncateText(node, nextCap.max); }\n return node;\n }\n if (node === null || typeof node !== \"object\") return node;\n if (Array.isArray(node)) {\n let items = node.map((item, index) => walk(item, [...segments, String(index)], nextCap)).filter((item): item is Json => item !== undefined);\n if (limitEntry && limit?.kind === \"maxItems\" && items.length > limit.value) {\n tally(limited, limitEntry[0], items.length - limit.value);\n items = [...items.slice(0, limit.value), `[… ${n(items.length - limit.value)} more items]`];\n }\n return items;\n }\n const out: Record<string, Json> = {};\n for (const [key, item] of Object.entries(node)) {\n const kept = walk(item, [...segments, key], nextCap);\n if (kept !== undefined) out[key] = kept;\n }\n return out;\n };\n const next = walk(value, [], null) ?? null;\n const omissions: Omission[] = [];\n for (const [pattern, { count, chars }] of excluded) {\n omissions.push({ path: pattern, reason: \"excluded\", count, label: labels[pattern] ?? `${displayPath(pattern)} — ${n(chars)} chars` });\n }\n for (const [pattern, { count, chars }] of limited) {\n const limit = recipe.limits[pattern]!;\n const what = limit.kind === \"stub\" ? `stubbed (${n(chars)} chars)` : limit.kind === \"maxChars\" ? `cut to ${n(limit.value)} chars` : `kept the first ${n(limit.value)} items`;\n omissions.push({ path: pattern, reason: \"truncated\", count, label: `${labels[pattern] ?? displayPath(pattern)} — ${what}` });\n }\n return { value: next, omissions };\n}\n\n/** A JSON (or registered) draft with the person's structure choices applied. */\nexport function applyJsonStructure(draft: Draft, recipe: StructureRecipe, labels: Readonly<Record<string, string>> = {}): Draft {\n const payload = draft.payload;\n if (payload.kind !== \"json\" && payload.kind !== \"registered\") return draft;\n if (!recipe.exclude.length && !Object.keys(recipe.limits).length) return draft;\n const { value, omissions } = applyStructureToJson(payload.value, recipe, labels);\n return deriveDraft(draft, { ...payload, value }, omissions, \"Structure choices\");\n}\n\n/**\n * Where an ORIGINAL node sits in the output value after `recipe` (array items shift when an\n * earlier sibling is excluded). Null when the node is excluded or cut; a stubbed ancestor answers\n * with the stub's own pointer.\n */\nexport function outputPointer(value: Json, recipe: StructureRecipe, pointer: string): string | null {\n const segments = pointerSegments(pointer);\n const out: string[] = [];\n let node: Json | undefined = value;\n for (let depth = 0; depth <= segments.length; depth++) {\n const here = joinPointer(segments.slice(0, depth));\n if (depth > 0 && recipe.exclude.some((pattern) => patternMatches(pattern, here))) return null;\n const limitEntry = Object.entries(recipe.limits).find(([pattern]) => patternMatches(pattern, here));\n if (limitEntry?.[1].kind === \"stub\") return joinPointer(out);\n if (depth === segments.length) return joinPointer(out);\n const segment = segments[depth] as string;\n if (node === null || typeof node !== \"object\" || node === undefined) return null;\n if (Array.isArray(node)) {\n const index = Number(segment);\n if (!Number.isSafeInteger(index) || index >= node.length) return null;\n let shifted = index;\n for (let j = 0; j < index; j++) if (recipe.exclude.some((pattern) => patternMatches(pattern, `${here}/${j}`))) shifted--;\n if (limitEntry?.[1].kind === \"maxItems\" && shifted >= limitEntry[1].value) return null;\n out.push(String(shifted));\n node = node[index];\n } else {\n if (!Object.prototype.hasOwnProperty.call(node, segment)) return null;\n out.push(segment);\n node = (node as Record<string, Json>)[segment];\n }\n }\n return joinPointer(out);\n}\n\n// ── Prose sections ───────────────────────────────────────────────────────────────────────────\n\nconst RANGE = /^\\/text\\/(\\d+)-(\\d+)$/;\nexport function isProseSection(section: Section): boolean {\n return RANGE.test(section.path);\n}\nexport interface SectionLayout {\n text: string;\n omissions: Omission[];\n /** Where each kept section landed in `text` (a stub's own line for a stubbed one). */\n ranges: Record<string, { start: number; end: number }>;\n}\n/**\n * The text a prose source becomes with only `included` sections, each at its limit. Excluded\n * ranges are cut exactly as `applySectionSelection` cuts them; a stub keeps the range's trailing\n * line break so the next section still starts on its own line.\n */\nexport function sectionLayout(\n text: string,\n sections: readonly Section[],\n included: readonly string[],\n limits: Readonly<Record<string, NodeLimit>> = {},\n): SectionLayout {\n const keep = new Set(included);\n const parsed = sections.map((section) => {\n const m = RANGE.exec(section.path);\n const start = m ? Number(m[1]) : NaN;\n const end = m ? Number(m[2]) : NaN;\n if (!m || start > end || end > text.length) {\n throw new ContentTransferError(\"invalid-section\", `Section \"${section.path}\" is not a range of this text. Declare a prose section as /text/<start>-<end> within the text.`);\n }\n const limit = limits[section.id];\n if (limit) assertLimit(limit, section.path);\n return { section, start, end, limit };\n }).sort((a, b) => a.start - b.start);\n let out = \"\";\n let at = 0;\n const omissions: Omission[] = [];\n const ranges: SectionLayout[\"ranges\"] = {};\n for (const { section, start, end, limit } of parsed) {\n if (start < at) throw new ContentTransferError(\"invalid-section\", `Section \"${section.label}\" overlaps the section before it.`);\n out += text.slice(at, start);\n at = end;\n const body = text.slice(start, end);\n if (!keep.has(section.id)) {\n omissions.push({ path: section.path, reason: \"excluded\", label: `${section.label} — ${n(body.length)} chars` });\n continue;\n }\n const trailing = /\\s*$/.exec(body)?.[0] ?? \"\";\n let written = body;\n if (limit?.kind === \"stub\") {\n written = `${stubText(body.slice(0, body.length - trailing.length))}${trailing}`;\n omissions.push({ path: section.path, reason: \"truncated\", label: `${section.label} — stubbed (${n(body.length)} chars)` });\n } else if (limit?.kind === \"maxChars\" && body.length - trailing.length > limit.value) {\n written = `${truncateText(body.slice(0, body.length - trailing.length), limit.value)}${trailing}`;\n omissions.push({ path: section.path, reason: \"truncated\", label: `${section.label} — cut to ${n(limit.value)} chars` });\n }\n ranges[section.id] = { start: out.length, end: out.length + written.length - trailing.length };\n out += written;\n }\n out += text.slice(at);\n return { text: out, omissions, ranges };\n}\n\n/**\n * A draft with the person's section choices applied, projected from the draft's own payload (call\n * it on a fresh draft of the snapshot, as `applySectionSelection` projects from the snapshot).\n * Prose payloads use `sectionLayout`; JSON payloads exclude and limit each section's pointer.\n */\nexport function applySectionStructure(\n draft: Draft,\n sections: readonly Section[],\n included: readonly string[],\n limits: Readonly<Record<string, NodeLimit>> = {},\n): Draft {\n const payload = draft.payload;\n if (payload.kind === \"text\" || payload.kind === \"markdown\") {\n const layout = sectionLayout(payload.text, sections, included, limits);\n return deriveDraft(draft, { ...payload, text: layout.text }, layout.omissions, \"Selected sections\");\n }\n if (payload.kind === \"json\" || payload.kind === \"registered\") {\n const keep = new Set(included);\n const labels = Object.fromEntries(sections.map((section) => [section.path, section.label]));\n const recipe: StructureRecipe = {\n exclude: sections.filter((section) => !keep.has(section.id)).map((section) => section.path),\n limits: Object.fromEntries(sections.filter((section) => keep.has(section.id) && limits[section.id]).map((section) => [section.path, limits[section.id]!])),\n };\n const { value, omissions } = applyStructureToJson(payload.value, recipe, labels);\n return deriveDraft(draft, { ...payload, value }, omissions, \"Selected sections\");\n }\n return draft;\n}\n","/**\n * Default preparation recipes (Preparation parity PP-13a): which recipe a preparation workspace\n * opens with for one source kind, layered exactly like every setting on the platform —\n *\n * the person's own default (PersistencePort, setting \"alchemy.transfer.default_recipe\")\n * → the organization default (TransferKnobsPort — the Feature Knob ladder: organization → platform)\n * → built in (null recipe: the workspace opens on Full, nothing trimmed)\n *\n * The recipe KEY is the declaration / source-kind id (`\"cx.conversation\"`, `\"data.table-rows\"`), the\n * same string in every host, so a recipe saved on the dashboard is the recipe the frontend opens.\n * Both stores hold one map, source-kind id → recipe; this module is the only reader and writer of the\n * person's map, so the merge rules live once.\n *\n * Nothing fails silently: a rung that cannot be read or holds a malformed value is skipped with a\n * notice (and captured in diagnostics), and the answer says which rung it came from. A write never\n * merges into a map it failed to read.\n */\nimport type { AlchemyHostPorts, Json } from \"../ports\";\nimport { ContentTransferError } from \"./core\";\n\n/** The person's setting (PersistencePort) — one map of source-kind id → recipe. */\nexport const TRANSFER_DEFAULT_RECIPE_SETTING = \"alchemy.transfer.default_recipe\";\n\nexport type RecipeOrigin = \"person\" | \"organization\" | \"built-in\";\nexport interface ResolvedRecipe {\n /** The recipe to open with; null = built in (Full, nothing trimmed). */\n recipe: { [key: string]: Json } | null;\n from: RecipeOrigin;\n /** Rungs that were skipped, each with what to do about it. */\n notices: { sentence: string; remedy: string }[];\n}\n\nconst KEY = /^[a-z0-9][a-z0-9._:-]{0,127}$/;\n\n/** The recipe key for a source kind: the declaration / source-kind id itself, validated. */\nexport function recipeKey(sourceKind: string): string {\n if (!KEY.test(sourceKind)) {\n throw new ContentTransferError(\n \"invalid-recipe-key\",\n `\"${sourceKind}\" is not a source-kind id (lowercase letters, digits and . _ : -, up to 128 characters).`,\n );\n }\n return sourceKind;\n}\n\nconst isRecord = (v: unknown): v is { [key: string]: Json } =>\n v !== null && typeof v === \"object\" && !Array.isArray(v);\n\ntype RecipePorts = Pick<AlchemyHostPorts, \"persistence\" | \"transferKnobs\" | \"diagnostics\">;\n\n/** Which recipe a workspace for `sourceKind` opens with, and where it came from. */\nexport async function resolveDefaultRecipe(\n ports: RecipePorts,\n sourceKind: string,\n organizationId: string | null,\n): Promise<ResolvedRecipe> {\n const key = recipeKey(sourceKind);\n const notices: ResolvedRecipe[\"notices\"] = [];\n const skip = (error: unknown, sentence: string, remedy: string) => {\n notices.push({ sentence, remedy });\n ports.diagnostics.capture(error, { area: \"operate\", detail: { recipeKey: key, sentence } });\n };\n\n if (ports.persistence) {\n try {\n const own = await ports.persistence.readSetting(TRANSFER_DEFAULT_RECIPE_SETTING);\n if (own !== null) {\n if (!isRecord(own)) {\n skip(new Error(\"person default recipes are not a map\"), \"Your saved default recipes could not be read (they are not a list of recipes), so they were skipped.\", \"Save your default recipe for this source again.\");\n } else if (own[key] !== undefined) {\n const recipe = own[key];\n if (isRecord(recipe)) return { recipe, from: \"person\", notices };\n skip(new Error(\"person default recipe is not an object\"), \"Your default recipe for this source is not a recipe, so it was skipped.\", \"Save your default recipe for this source again.\");\n }\n }\n } catch (error) {\n skip(error, \"Your own default recipe could not be read, so the organization's default applies.\", \"Reopen the workspace to try again.\");\n }\n }\n\n if (ports.transferKnobs) {\n try {\n const org = await ports.transferKnobs.defaultRecipe(key, organizationId);\n if (org !== null) {\n if (isRecord(org)) return { recipe: org, from: \"organization\", notices };\n skip(new Error(\"organization default recipe is not an object\"), \"Your organization's default recipe for this source is not a recipe, so it was skipped.\", \"Ask an organization admin to set the default recipe again.\");\n }\n } catch (error) {\n skip(error, \"Your organization's default recipe could not be read, so the workspace opens on Full.\", \"Reopen the workspace to try again.\");\n }\n }\n\n return { recipe: null, from: \"built-in\", notices };\n}\n\n/**\n * Set (recipe) or clear (null) the person's own default for one source kind, keeping every other\n * source kind's default. Throws a sentence when nothing was saved; clearing the last entry clears\n * the setting itself, so the person inherits the organization default again.\n */\nexport async function setPersonDefaultRecipe(\n ports: Pick<AlchemyHostPorts, \"persistence\">,\n sourceKind: string,\n recipe: { [key: string]: Json } | null,\n): Promise<void> {\n const key = recipeKey(sourceKind);\n const persistence = ports.persistence;\n if (!persistence) {\n throw new ContentTransferError(\"capability-absent\", \"This app cannot save your own settings, so a personal default recipe is not available here.\");\n }\n let current: Json | null;\n try {\n current = await persistence.readSetting(TRANSFER_DEFAULT_RECIPE_SETTING);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new ContentTransferError(\n \"read-failed\",\n `Nothing was saved: your other default recipes could not be read (${reason}), and saving now would have replaced all of them. Try again in a moment.`,\n );\n }\n if (current !== null && !isRecord(current)) {\n throw new ContentTransferError(\"invalid-setting\", \"Nothing was saved: your saved default recipes are not a list of recipes, so one cannot be changed without replacing them all.\");\n }\n const map: { [key: string]: Json } = { ...(current ?? {}) };\n if (recipe === null) {\n if (!(key in map)) return;\n delete map[key];\n } else {\n map[key] = recipe;\n }\n await persistence.writeSetting(TRANSFER_DEFAULT_RECIPE_SETTING, Object.keys(map).length === 0 ? null : map);\n}\n","/**\n * `buildFile` — the headless export door (ALC-19 T4–T12): payload → the SAME sealed artifact the\n * Alchemy menu previews, copies and downloads (createDraft → formatAdapter(id).load() → build).\n * A host that needs bytes without the menu (a toolbar \"Excel\" button, an upload, a test) calls this;\n * it never imports a format library itself.\n */\n\nimport { createDraft, directSource, projectSnapshot } from \"./core\";\nimport type { FormatAdapter, FormatOptions } from \"./contract\";\nimport { formatAdapter } from \"./formats\";\nimport type { Artifact, Payload } from \"./types\";\n\nexport type BuiltFile = {\n bytes: Uint8Array;\n filename: string;\n mime: string;\n /** The sealed artifact (plain text, html, omissions) the bytes came from. */\n artifact: Artifact;\n /** The bytes as a Blob typed with `mime` (browser hosts). */\n blob(): Blob;\n};\n\nexport type BuildFileOptions = FormatOptions & {\n /** Host-registered formats (a built-in id is never shadowed). */\n registered?: readonly FormatAdapter[];\n signal?: AbortSignal;\n /** The snapshot label (what the content is called). */\n label?: string;\n};\n\nexport async function buildFile(payload: Payload, formatId: string, options: BuildFileOptions = {}): Promise<BuiltFile> {\n const { registered, signal = new AbortController().signal, label, ...formatOptions } = options;\n const adapter = formatAdapter(formatId, registered);\n const captured = directSource(payload, label ? { label } : {});\n const draft = createDraft(projectSnapshot(captured.snapshot, captured.projection));\n const engine = await adapter.load();\n const artifact = await engine.build(draft, { ...formatOptions, filename: formatOptions.filename ?? `export.${adapter.extension}` }, signal);\n const file = artifact.file;\n const bytes = file?.bytes ?? new TextEncoder().encode(artifact.html ?? artifact.plainText);\n const filename = file?.filename ?? formatOptions.filename ?? `export.${adapter.extension}`;\n const mime = file?.mime ?? adapter.mime;\n return {\n bytes,\n filename,\n mime,\n artifact,\n blob: () => new Blob([bytes as BlobPart], { type: mime }),\n };\n}\n"],"mappings":"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","names":["ContentTransferError","encode","copy","ContentTransferError","ContentTransferError","n","enc","capture","enc","markdownPlainText","documentHtmlEngine","ContentTransferError","ContentTransferError","at","ContentTransferError","at","ContentTransferError","assertLimit","at","ContentTransferError"]}