@nhtio/adk 0.1.0-master-bfedd81c → 0.1.0-master-0e75bb0f

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 (107) hide show
  1. package/batteries/media/engines/audio_decode.cjs.map +1 -1
  2. package/batteries/media/engines/audio_decode.d.ts +7 -3
  3. package/batteries/media/engines/audio_decode.mjs.map +1 -1
  4. package/batteries/media/index.d.ts +2 -2
  5. package/batteries/media/lint.cjs +1 -1
  6. package/batteries/media/lint.cjs.map +1 -1
  7. package/batteries/media/lint.d.ts +1 -1
  8. package/batteries/media/lint.mjs +1 -1
  9. package/batteries/media/lint.mjs.map +1 -1
  10. package/batteries/media/pipe.d.ts +1 -1
  11. package/batteries/media.cjs +1 -1
  12. package/batteries/media.cjs.map +1 -1
  13. package/batteries/media.mjs +1 -1
  14. package/batteries/media.mjs.map +1 -1
  15. package/batteries/tools/scrapper/index.d.ts +1 -0
  16. package/batteries/tools/scrapper.cjs +1 -1
  17. package/batteries/tools/scrapper.mjs +1 -1
  18. package/batteries/tools/searxng.cjs +1 -1
  19. package/batteries/tools/searxng.mjs +1 -1
  20. package/batteries/tools/web_retrieval/index.d.ts +4 -4
  21. package/batteries/tools/web_retrieval.cjs +3 -3
  22. package/batteries/tools/web_retrieval.cjs.map +1 -1
  23. package/batteries/tools/web_retrieval.mjs +3 -3
  24. package/batteries/tools/web_retrieval.mjs.map +1 -1
  25. package/batteries/tools.cjs +2 -2
  26. package/batteries/tools.mjs +2 -2
  27. package/batteries/vector/arangodb.cjs +1 -1
  28. package/batteries/vector/arangodb.mjs +1 -1
  29. package/batteries/vector/builder.cjs +1 -1
  30. package/batteries/vector/builder.mjs +1 -1
  31. package/batteries/vector/chroma.cjs +2 -2
  32. package/batteries/vector/chroma.mjs +2 -2
  33. package/batteries/vector/clickhouse.cjs +2 -2
  34. package/batteries/vector/clickhouse.mjs +2 -2
  35. package/batteries/vector/cloudflare.cjs +2 -2
  36. package/batteries/vector/cloudflare.mjs +2 -2
  37. package/batteries/vector/couchbase.cjs +2 -2
  38. package/batteries/vector/couchbase.mjs +2 -2
  39. package/batteries/vector/duckdb.cjs +2 -2
  40. package/batteries/vector/duckdb.mjs +2 -2
  41. package/batteries/vector/elasticsearch.cjs +2 -2
  42. package/batteries/vector/elasticsearch.mjs +2 -2
  43. package/batteries/vector/hnswlib.cjs +2 -2
  44. package/batteries/vector/hnswlib.mjs +2 -2
  45. package/batteries/vector/in_memory.cjs +2 -2
  46. package/batteries/vector/in_memory.mjs +2 -2
  47. package/batteries/vector/lancedb.cjs +2 -2
  48. package/batteries/vector/lancedb.mjs +2 -2
  49. package/batteries/vector/mariadb.cjs +2 -2
  50. package/batteries/vector/mariadb.mjs +2 -2
  51. package/batteries/vector/meilisearch.cjs +1 -1
  52. package/batteries/vector/meilisearch.mjs +1 -1
  53. package/batteries/vector/milvus.cjs +2 -2
  54. package/batteries/vector/milvus.mjs +2 -2
  55. package/batteries/vector/mongodb.cjs +1 -1
  56. package/batteries/vector/mongodb.mjs +1 -1
  57. package/batteries/vector/neo4j.cjs +1 -1
  58. package/batteries/vector/neo4j.mjs +1 -1
  59. package/batteries/vector/opensearch.cjs +2 -2
  60. package/batteries/vector/opensearch.mjs +2 -2
  61. package/batteries/vector/oracle23ai.cjs +2 -2
  62. package/batteries/vector/oracle23ai.mjs +2 -2
  63. package/batteries/vector/orama.cjs +2 -2
  64. package/batteries/vector/orama.mjs +2 -2
  65. package/batteries/vector/pgvector.cjs +2 -2
  66. package/batteries/vector/pgvector.mjs +2 -2
  67. package/batteries/vector/pinecone.cjs +2 -2
  68. package/batteries/vector/pinecone.mjs +2 -2
  69. package/batteries/vector/qdrant.cjs +2 -2
  70. package/batteries/vector/qdrant.mjs +2 -2
  71. package/batteries/vector/redis.cjs +2 -2
  72. package/batteries/vector/redis.mjs +2 -2
  73. package/batteries/vector/s3vectors.cjs +2 -2
  74. package/batteries/vector/s3vectors.mjs +2 -2
  75. package/batteries/vector/solr.cjs +1 -1
  76. package/batteries/vector/solr.mjs +1 -1
  77. package/batteries/vector/sqlite_vec.cjs +2 -2
  78. package/batteries/vector/sqlite_vec.mjs +2 -2
  79. package/batteries/vector/surrealdb.cjs +1 -1
  80. package/batteries/vector/surrealdb.mjs +1 -1
  81. package/batteries/vector/typesense.cjs +2 -2
  82. package/batteries/vector/typesense.mjs +2 -2
  83. package/batteries/vector/validation.cjs +1 -1
  84. package/batteries/vector/validation.mjs +1 -1
  85. package/batteries/vector/vespa.cjs +2 -2
  86. package/batteries/vector/vespa.mjs +2 -2
  87. package/batteries/vector/weaviate.cjs +2 -2
  88. package/batteries/vector/weaviate.mjs +2 -2
  89. package/batteries/vector.cjs +3 -3
  90. package/batteries/vector.mjs +3 -3
  91. package/batteries.cjs +16 -16
  92. package/batteries.mjs +16 -16
  93. package/eslint.cjs +1 -1
  94. package/eslint.mjs +1 -1
  95. package/index.cjs +2 -2
  96. package/index.mjs +2 -2
  97. package/mcp/adk-docs-corpus.json +1 -1
  98. package/package.json +172 -172
  99. package/{scrapper-BXlRzMaG.js → scrapper-7DB7dSae.js} +2 -2
  100. package/{scrapper-BXlRzMaG.js.map → scrapper-7DB7dSae.js.map} +1 -1
  101. package/{scrapper-DKy8Cx3L.mjs → scrapper-DEEbpQYp.mjs} +2 -2
  102. package/{scrapper-DKy8Cx3L.mjs.map → scrapper-DEEbpQYp.mjs.map} +1 -1
  103. package/{searxng-Cxsfv_sr.mjs → searxng-CHivYbnV.mjs} +2 -2
  104. package/{searxng-Cxsfv_sr.mjs.map → searxng-CHivYbnV.mjs.map} +1 -1
  105. package/{searxng-DMV9TpMv.js → searxng-D0igol3B.js} +2 -2
  106. package/{searxng-DMV9TpMv.js.map → searxng-D0igol3B.js.map} +1 -1
  107. package/skills/adk-assembly/SKILL.md +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"media.cjs","names":["#toks","#pos","#parseSegment","#peek","#next","#parseValue","#parseScalar","#ops","#exec","#with","#chain"],"sources":["../../src/batteries/media/pipe.ts","../../src/batteries/media/builder.ts","../../src/batteries/media/runtime.ts","../../src/batteries/media/formats.ts","../../src/batteries/media/steps/text.ts","../../src/batteries/media/steps/doc.ts","../../src/batteries/media/steps/sheet.ts","../../src/batteries/media/steps/slides.ts","../../src/batteries/media/steps/ingest.ts","../../src/batteries/media/registry.ts","../../src/batteries/media/steps/image_audio.ts","../../src/batteries/media/steps/pages.ts","../../src/batteries/media/index.ts"],"sourcesContent":["/**\n * The pipe-expression front-end: a moo lexer plus a hand-rolled recursive-descent parser that\n * compiles `select pages=2-5 | redact match=/…/ | convert to=pdf` into a {@link MediaPlan}.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. The grammar is frozen in the\n * design doc (section 0):\n *\n * - `pipeline := segment ('|' segment)*` ; `segment := verb arg*` ; `arg := IDENT '=' value` —\n * named args only, no positionals (an IDENT followed by `=` is an arg; otherwise it is the\n * verb's second word — 2-token lookahead, no verb table needed at parse time).\n * - Verb matching is separator-insensitive (`extract_text` ≡ `extract text` ≡ `extract.text`).\n * - Values: bareword idents, ints/floats, `a-b` ranges, comma lists, `true`/`false`, quoted\n * strings (single or double), class-aware `/regex/flags` literals, `@id` media refs, and\n * quoted-JSON structured payloads (a quoted string that the verb's arg schema declares as\n * `json` is JSON-parsed).\n * - `#` line comments are tolerated (models add them; ignoring them is free robustness).\n * - Two error layers: syntactic ({@link E_MEDIA_PIPE_SYNTAX}, with line/col and a corrective\n * exemplar) and semantic ({@link E_MEDIA_UNKNOWN_VERB} etc., produced by the validator in\n * `validate.ts` — this module only parses to a raw AST and lowers to the plan).\n *\n * Parsing is deployment-independent: the full verb table drives folding, and engine narrowing\n * happens later in validation (frozen 0.3).\n */\n\nimport { foldVerb } from './verbs'\nimport { default as moo } from 'moo'\nimport { canonicalFlags } from './plan'\nimport { E_MEDIA_PIPE_SYNTAX } from './exceptions'\nimport { isError, isObject } from '@nhtio/adk/guards'\nimport type { MediaPlan, MediaStep, MediaArgValue, MediaArgScalar, SourceSpan } from './plan'\n\n// ── lexer ────────────────────────────────────────────────────────────────────\n\n/**\n * The moo ruleset. Order matters: first match wins, so `range` must precede `int`, `float`\n * precedes `int`, and `comment` precedes nothing it could shadow. String/regex bodies exclude\n * raw newlines (escape them); `ws` carries `lineBreaks` so spans stay accurate across lines.\n */\nconst lexer = moo.compile({\n ws: { match: /[ \\t\\r\\n]+/, lineBreaks: true },\n comment: /#[^\\n]*/,\n pipe: '|',\n eq: '=',\n comma: ',',\n ref: /@[A-Za-z0-9_-]+/,\n regex: /\\/(?:\\\\.|\\[(?:\\\\.|[^\\]\\\\\\n])*\\]|[^/\\\\[\\n])+\\/[a-z]*/,\n dstring: /\"(?:\\\\.|[^\"\\\\\\n])*\"/,\n sstring: /'(?:\\\\.|[^'\\\\\\n])*'/,\n range: /\\d+-\\d+/,\n float: /\\d+\\.\\d+/,\n int: /\\d+/,\n ident: /[A-Za-z_][A-Za-z0-9_.]*/,\n dash: '-',\n})\n\ninterface Tok {\n type: string\n value: string\n text: string\n offset: number\n line: number\n col: number\n}\n\n/** Tokenize, skipping ws/comments, surfacing lexer errors as syntax exceptions. */\nconst tokenize = (input: string): Tok[] => {\n lexer.reset(input)\n const out: Tok[] = []\n let tok: moo.Token | undefined\n try {\n while ((tok = lexer.next())) {\n if (tok.type === 'ws' || tok.type === 'comment') continue\n out.push({\n type: tok.type as string,\n value: tok.value,\n text: tok.text,\n offset: tok.offset,\n line: tok.line,\n col: tok.col,\n })\n }\n } catch (err) {\n const detail = isError(err) ? err.message.split('\\n')[0] : String(err)\n throw new E_MEDIA_PIPE_SYNTAX([\n `${detail}. Values containing special characters must be quoted — write it like: name=\"my-value\"`,\n ])\n }\n return out\n}\n\n// ── parser ───────────────────────────────────────────────────────────────────\n\n/** A parsed-but-unvalidated arg value, before the verb's arg schema refines it. */\nexport interface RawArgValue {\n /** The lowered value. Quoted strings stay strings here; schema may JSON-parse `json` args. */\n value: MediaArgValue\n /** Whether the source token was a quoted string (drives json-arg parsing + name/index rules). */\n quoted: boolean\n /** Source position of the value token. */\n span: SourceSpan\n}\n\n/** One parsed segment: verb words plus named args, all position-bearing. */\nexport interface RawSegment {\n /** Canonical verb id when fold-matching succeeded, else the raw folded text. */\n verb: string\n /** Whether `verb` resolved against the verb table. */\n known: boolean\n /** The parsed named args, in source order. */\n args: Map<string, RawArgValue>\n /** Source position of the verb token(s). */\n span: SourceSpan\n}\n\nconst spanOf = (tok: Tok, length?: number): SourceSpan => ({\n offset: tok.offset,\n line: tok.line,\n col: tok.col,\n length: length ?? tok.text.length,\n})\n\nconst unquote = (raw: string): string =>\n raw\n .slice(1, -1)\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\t/g, '\\t')\n .replace(/\\\\([\"'\\\\/])/g, '$1')\n\nconst fail = (tok: Tok | undefined, message: string, exemplar: string): never => {\n const where = tok ? ` at line ${tok.line}, col ${tok.col}` : ' at end of input'\n throw new E_MEDIA_PIPE_SYNTAX([`${message}${where}. Write it like: ${exemplar}`])\n}\n\nclass Parser {\n #toks: Tok[]\n #pos = 0\n\n constructor(toks: Tok[]) {\n this.#toks = toks\n }\n\n #peek(ahead = 0): Tok | undefined {\n return this.#toks[this.#pos + ahead]\n }\n\n #next(): Tok | undefined {\n return this.#toks[this.#pos++]\n }\n\n parsePipeline(): RawSegment[] {\n const segments: RawSegment[] = []\n if (this.#toks.length === 0) {\n fail(undefined, 'empty pipe expression', 'extract text | chunk by=sentence')\n }\n segments.push(this.#parseSegment())\n while (this.#peek()?.type === 'pipe') {\n this.#next()\n segments.push(this.#parseSegment())\n }\n const trailing = this.#peek()\n if (trailing) {\n fail(\n trailing,\n `unexpected \"${trailing.text}\" after a complete segment`,\n 'segment | segment (segments are separated by |)'\n )\n }\n return segments\n }\n\n #parseSegment(): RawSegment {\n const first = this.#peek()\n if (!first || first.type !== 'ident') {\n fail(first, 'expected a verb to start the segment', 'convert to=pdf')\n }\n const head = this.#next() as Tok\n // Verb words: idents NOT followed by `=` (named-args-only makes this unambiguous), up to\n // the longest canonical verb (3 words, e.g. `sheet update cells`). When the greedy\n // collection over-reaches, back off to the longest prefix that fold-matches and rewind so\n // the leftover bareword surfaces as the args-must-be-named error. The fold uses the FULL\n // static verb table — deployment-independent (engine narrowing is a later validation pass).\n const collected = [head.value]\n const posAfterWord: number[] = [this.#pos]\n while (collected.length < 3) {\n const next = this.#peek()\n if (next?.type !== 'ident' || this.#peek(1)?.type === 'eq') break\n collected.push((this.#next() as Tok).value)\n posAfterWord.push(this.#pos)\n }\n let take = collected.length\n if (foldVerb(collected) === undefined) {\n // Back off to the longest prefix that folds; if none folds at any length, keep the full\n // sequence as the unknown verb so did-you-mean sees the model's whole attempt.\n let prefix = collected.length - 1\n while (prefix >= 1 && foldVerb(collected.slice(0, prefix)) === undefined) prefix -= 1\n if (prefix >= 1) take = prefix\n }\n const words = collected.slice(0, take)\n this.#pos = posAfterWord[take - 1]\n const folded = foldVerb(words)\n const verbText = words.join(' ')\n const args = new Map<string, RawArgValue>()\n for (;;) {\n const tok = this.#peek()\n if (!tok || tok.type === 'pipe') break\n if (tok.type === 'dash') {\n fail(\n tok,\n 'unexpected \"-\" — values containing dashes must be quoted',\n `${verbText} name=\"value-with-dashes\"`\n )\n }\n if (tok.type !== 'ident' || this.#peek(1)?.type !== 'eq') {\n fail(tok, `unexpected \"${tok.text}\" — args must be name=value`, `${verbText} name=value`)\n }\n const name = (this.#next() as Tok).value\n this.#next() // eq\n const value = this.#parseValue(verbText, name)\n if (args.has(name)) {\n fail(tok, `duplicate arg \"${name}\"`, `${verbText} ${name}=value (give each arg once)`)\n }\n args.set(name, value)\n }\n return {\n verb: folded ?? verbText,\n known: folded !== undefined,\n args,\n span: spanOf(head, verbText.length),\n }\n }\n\n #parseValue(verbText: string, argName: string): RawArgValue {\n const first = this.#parseScalar(verbText, argName)\n if (this.#peek()?.type !== 'comma') return first\n const items: MediaArgScalar[] = [...asScalarList(first, verbText, argName)]\n let quoted = first.quoted\n while (this.#peek()?.type === 'comma') {\n this.#next()\n const next = this.#parseScalar(verbText, argName)\n quoted = quoted || next.quoted\n items.push(...asScalarList(next, verbText, argName))\n }\n return { value: items, quoted, span: first.span }\n }\n\n #parseScalar(verbText: string, argName: string): RawArgValue {\n const tok = this.#peek()\n if (!tok) {\n fail(tok, `missing value for \"${argName}\"`, `${verbText} ${argName}=value`)\n }\n const t = tok as Tok\n switch (t.type) {\n case 'int':\n this.#next()\n return { value: Number(t.value), quoted: false, span: spanOf(t) }\n case 'float':\n this.#next()\n return { value: Number(t.value), quoted: false, span: spanOf(t) }\n case 'range': {\n this.#next()\n const [lo, hi] = t.value.split('-').map(Number)\n if (lo > hi) {\n fail(t, `range ${t.value} is descending (start must be ≤ end)`, `${argName}=${hi}-${lo}`)\n }\n const nums: number[] = []\n for (let n = lo; n <= hi; n++) nums.push(n)\n return { value: nums, quoted: false, span: spanOf(t) }\n }\n case 'ident': {\n this.#next()\n if (t.value === 'true') return { value: true, quoted: false, span: spanOf(t) }\n if (t.value === 'false') return { value: false, quoted: false, span: spanOf(t) }\n return { value: t.value, quoted: false, span: spanOf(t) }\n }\n case 'dstring':\n case 'sstring':\n this.#next()\n return { value: unquote(t.text), quoted: true, span: spanOf(t) }\n case 'regex': {\n this.#next()\n const lastSlash = t.text.lastIndexOf('/')\n const source = t.text.slice(1, lastSlash)\n const flags = canonicalFlags(t.text.slice(lastSlash + 1))\n try {\n // Validate the pattern compiles; the IR stores the serializable ref.\n void new RegExp(source, flags)\n } catch (err) {\n const detail = isError(err) ? err.message : String(err)\n fail(t, `invalid regex ${t.text}: ${detail}`, `${argName}=/pattern/flags`)\n }\n return { value: { source, flags }, quoted: false, span: spanOf(t) }\n }\n case 'ref':\n this.#next()\n return {\n value: { kind: 'id', id: t.value.slice(1) },\n quoted: false,\n span: spanOf(t),\n }\n case 'dash':\n fail(\n t,\n 'unexpected \"-\" in a bare value',\n `${argName}=\"value-with-dashes\" (quote values containing dashes)`\n )\n break\n default:\n fail(t, `unexpected \"${t.text}\"`, `${verbText} ${argName}=value`)\n }\n /* unreachable */\n throw new E_MEDIA_PIPE_SYNTAX(['internal parser error'])\n }\n}\n\nconst asScalarList = (raw: RawArgValue, verbText: string, argName: string): MediaArgScalar[] => {\n if (Array.isArray(raw.value)) return raw.value as MediaArgScalar[]\n if (raw.value === null || typeof raw.value === 'object') {\n const v = raw.value as MediaArgValue\n if (isObject(v) && !Array.isArray(v) && !('source' in v) && !('kind' in v)) {\n throw new E_MEDIA_PIPE_SYNTAX([\n `structured values cannot appear in a comma list for \"${argName}\" on \"${verbText}\"`,\n ])\n }\n }\n return [raw.value as MediaArgScalar]\n}\n\n// ── public surface ───────────────────────────────────────────────────────────\n\n/**\n * Parse a pipe expression into raw, position-bearing segments.\n *\n * @remarks\n * Purely syntactic — verbs are fold-matched against the full verb table for canonicalization\n * but unknown verbs are NOT an error here (the validator reports them with did-you-mean and the\n * deployment's narrowed verb list). Use {@link parsePipe} for the validated path.\n *\n * @param input - The pipe expression.\n * @returns The raw segments.\n */\nexport const parsePipeRaw = (input: string): RawSegment[] => {\n return new Parser(tokenize(input)).parsePipeline()\n}\n\n/**\n * Lower raw segments to an (unvalidated) {@link MediaPlan}. Quoted-JSON arg parsing and\n * type/enum checks happen in the validator, which consumes the raw segments — this lowering\n * exists for tooling that wants the structural plan without validation.\n *\n * @param segments - Output of {@link parsePipeRaw}.\n * @returns The structural plan (args carried as parsed, json args still strings).\n */\nexport const lowerSegments = (segments: RawSegment[]): MediaPlan => ({\n steps: segments.map(\n (seg): MediaStep => ({\n verb: seg.verb,\n args: Object.fromEntries(Array.from(seg.args.entries(), ([k, v]) => [k, v.value])),\n span: seg.span,\n })\n ),\n})\n","/**\n * The chainable, thenable media builder — the implementor-facing front-end that compiles to\n * the same {@link MediaPlan} as the pipe string and JSON ops.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. The knex lessons applied:\n * `mp(input)` opens a fresh immutable builder; every verb returns a new builder; awaiting the\n * builder executes the chain (no `.execute()`). Domain verbs hang off typed namespaces\n * (`.sheet`, `.slides`, `.image`, `.audio`); shared transforms live on the root.\n *\n * Each verb method appends an op and revalidates lazily — the full plan validates (verb table,\n * arg schemas, engine narrowing) when the chain executes, so building is cheap and the same\n * validator serves all three front-ends.\n */\n\nimport { toPipe } from './plan'\nimport type { PlanResult, StepPayload } from './runtime'\nimport type { MediaPlan, MediaOp, MediaArgValue, MediaArgJson, MediaRef } from './plan'\n\n/** The function a builder calls to execute its accumulated ops. Bound by the pipeline. */\nexport type ChainExecutor = (ops: MediaOp[]) => Promise<PlanResult>\n\n/** Options accepted by image resize. */\nexport interface ResizeOptions {\n /** Target width in pixels. */\n width?: number\n /** Target height in pixels. */\n height?: number\n /** Resize fit mode (default cover). */\n fit?: 'cover' | 'contain' | 'fill' | 'inside' | 'outside'\n}\n\n/** A cell update for `sheet.updateCells`. */\nexport interface CellUpdate {\n /** A1-notation address, e.g. `B2`. Alternative to row/col. */\n address?: string\n /** One-based row index. Pair with `col`. */\n row?: number\n /** One-based column index, or a column letter. Pair with `row`. */\n col?: number | string\n /** The value to set. A leading `=` writes a formula. */\n value: string | number | boolean | null\n}\n\nconst refOf = (other: MediaChainRef): MediaRef =>\n typeof other === 'string' ? { kind: 'id', id: other } : { kind: 'id', id: other.mediaId }\n\n/** How other media are referenced from builder verbs: an id string or `{ mediaId }`. */\nexport type MediaChainRef = string | { mediaId: string }\n\n/**\n * The chainable builder. Immutable — every verb returns a new instance sharing the executor.\n * Thenable — `await` runs the chain and resolves to the terminal step's natural type.\n */\nexport class MediaChain implements PromiseLike<unknown> {\n readonly #ops: MediaOp[]\n readonly #exec: ChainExecutor\n\n constructor(exec: ChainExecutor, ops: MediaOp[] = []) {\n this.#exec = exec\n this.#ops = ops\n }\n\n #with(verb: string, args: Record<string, MediaArgValue>): MediaChain {\n return new MediaChain(this.#exec, [...this.#ops, { verb, args }])\n }\n\n // ── root transforms ─────────────────────────────────────────────────────────\n\n /** Convert to another format (requires a convert engine). */\n convert(to: string): MediaChain {\n return this.#with('convert', { to })\n }\n\n /** Keep only the listed 1-based pages. */\n select(options: { pages: number[] }): MediaChain {\n return this.#with('select', { pages: options.pages })\n }\n\n /** Split by page (optionally grouped `[[start,end], …]`). Terminal: resolves to media list. */\n split(options: { by?: 'page' | 'section'; ranges?: number[][] } = {}): MediaChain {\n const args: Record<string, MediaArgValue> = {}\n if (options.by) args.by = options.by\n if (options.ranges) args.ranges = options.ranges as MediaArgJson\n return this.#with('split', args)\n }\n\n /** Merge other media into this one, in order. */\n merge(...others: MediaChainRef[]): MediaChain {\n return this.#with('merge', { with: others.map(refOf) })\n }\n\n /** Reorder pages by 1-based index. */\n reorder(order: number[]): MediaChain {\n return this.#with('reorder', { order })\n }\n\n /** Redact matching text (literals or RegExp). */\n redact(options: {\n match: Array<string | RegExp> | string | RegExp\n replace?: string\n }): MediaChain {\n const list = Array.isArray(options.match) ? options.match : [options.match]\n const match = list.map((m) =>\n typeof m === 'string' ? m : { source: m.source, flags: Array.from(m.flags).sort().join('') }\n )\n const args: Record<string, MediaArgValue> = { match }\n if (options.replace !== undefined) args.replace = options.replace\n return this.#with('redact', args)\n }\n\n /** Remove potentially unsafe embedded content. */\n sanitize(): MediaChain {\n return this.#with('sanitize', {})\n }\n\n /** Normalize structure/encoding. */\n normalize(): MediaChain {\n return this.#with('normalize', {})\n }\n\n /** Replace the first occurrence of anchor text. */\n updateText(anchor: string, replace: string): MediaChain {\n return this.#with('update_text', { anchor, replace })\n }\n\n /** Compare against another media. Terminal: resolves to a structured diff. */\n diff(other: MediaChainRef): MediaChain {\n return this.#with('diff', { with: refOf(other) })\n }\n\n /** Apply a unified-diff patch. */\n applyPatch(patch: string, options: { with?: MediaChainRef[] } = {}): MediaChain {\n const args: Record<string, MediaArgValue> = { patch }\n if (options.with) args.with = options.with.map(refOf)\n return this.#with('apply_patch', args)\n }\n\n /** Extract text (routes by format; OCR engine used when needed). Terminal: resolves to text. */\n extractText(\n options: {\n ocr?: 'off' | 'auto' | 'force'\n ocrOut?: 'txt' | 'hocr' | 'json'\n lang?: string[]\n } = {}\n ): MediaChain {\n const args: Record<string, MediaArgValue> = {}\n if (options.ocr) args.ocr = options.ocr\n if (options.ocrOut) args.ocr_out = options.ocrOut\n if (options.lang) args.lang = options.lang\n return this.#with('extract.text', args)\n }\n\n /** Extract metadata. Terminal: resolves to a metadata object. */\n extractMetadata(): MediaChain {\n return this.#with('extract.metadata', {})\n }\n\n /** Extract embedded assets. Terminal: resolves to a media list. */\n extractAssets(\n options: { types?: Array<'image' | 'font' | 'attachment' | 'all'> } = {}\n ): MediaChain {\n const args: Record<string, MediaArgValue> = {}\n if (options.types) args.types = options.types\n return this.#with('extract.assets', args)\n }\n\n /** Chunk extracted text. Terminal: resolves to a chunk array. */\n chunk(\n options: { strategy?: 'sentence' | 'paragraph' | 'fixed'; size?: number; overlap?: number } = {}\n ): MediaChain {\n const args: Record<string, MediaArgValue> = {}\n if (options.strategy) args.by = options.strategy\n if (options.size !== undefined) args.size = options.size\n if (options.overlap !== undefined) args.overlap = options.overlap\n return this.#with('chunk', args)\n }\n\n // ── domain namespaces ───────────────────────────────────────────────────────\n\n /** Spreadsheet mutations. */\n get sheet(): SheetNamespace {\n return new SheetNamespace(this)\n }\n\n /** Presentation mutations. */\n get slides(): SlidesNamespace {\n return new SlidesNamespace(this)\n }\n\n /** Image transforms. */\n get image(): ImageNamespace {\n return new ImageNamespace(this)\n }\n\n /** Audio operations. */\n get audio(): AudioNamespace {\n return new AudioNamespace(this)\n }\n\n // ── serialization + execution ───────────────────────────────────────────────\n\n /** The accumulated ops (a copy). */\n toOps(): MediaOp[] {\n return this.#ops.map((op) => ({ verb: op.verb, args: { ...op.args } }))\n }\n\n /** The canonical pipe form of the accumulated chain. */\n toPipe(): string {\n const plan: MediaPlan = { steps: this.#ops.map((op) => ({ verb: op.verb, args: op.args })) }\n return toPipe(plan)\n }\n\n /** Internal — used by namespaces to append. */\n withOp(verb: string, args: Record<string, MediaArgValue>): MediaChain {\n return this.#with(verb, args)\n }\n\n /** Thenable: awaiting the chain executes it. */\n then<TResult1 = unknown, TResult2 = never>(\n onfulfilled?: ((value: unknown) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): PromiseLike<TResult1 | TResult2> {\n return this.#exec(this.toOps()).then(unwrapResult).then(onfulfilled, onrejected)\n }\n\n /** Execute and return the raw {@link PlanResult} (no unwrapping). */\n async run(): Promise<PlanResult> {\n return this.#exec(this.toOps())\n }\n}\n\n/** Resolve a plan result to its natural awaited type. */\nconst unwrapResult = (result: PlanResult): unknown => {\n if (result.kind === 'media') return result.payload\n if (result.kind === 'media-list') return result.payloads\n return result.data\n}\n\n/** `sheet.*` verbs, mirrored from the verb table. */\nexport class SheetNamespace {\n readonly #chain: MediaChain\n constructor(chain: MediaChain) {\n this.#chain = chain\n }\n /** Insert rows. */\n addRows(\n rows: Array<Array<string | number | boolean | null>>,\n options: { sheet?: string | number; before?: number; after?: number } = {}\n ): MediaChain {\n return this.#chain.withOp(\n 'sheet.add_rows',\n compact({\n rows: rows as MediaArgJson,\n ...targetArgs(options),\n before: options.before,\n after: options.after,\n })\n )\n }\n /** Insert columns. */\n addColumns(options: {\n sheet?: string | number\n headers?: string[]\n columns?: Array<{ header: string; values?: Array<string | number | boolean | null> }>\n before?: number\n after?: number\n }): MediaChain {\n return this.#chain.withOp(\n 'sheet.add_columns',\n compact({\n ...targetArgs(options),\n headers: options.headers,\n columns: options.columns as MediaArgJson,\n before: options.before,\n after: options.after,\n })\n )\n }\n /** Update cells. */\n updateCells(updates: CellUpdate[], options: { sheet?: string | number } = {}): MediaChain {\n return this.#chain.withOp(\n 'sheet.update_cells',\n compact({ updates: updates as unknown as MediaArgJson, ...targetArgs(options) })\n )\n }\n /** Delete rows by 1-based index. */\n deleteRows(rows: number[], options: { sheet?: string | number } = {}): MediaChain {\n return this.#chain.withOp('sheet.delete_rows', compact({ rows, ...targetArgs(options) }))\n }\n /** Delete columns by 1-based index. */\n deleteColumns(columns: number[], options: { sheet?: string | number } = {}): MediaChain {\n return this.#chain.withOp('sheet.delete_columns', compact({ columns, ...targetArgs(options) }))\n }\n /** Rename a worksheet (name-targeted). */\n renameSheet(sheet: string, to: string): MediaChain {\n return this.#chain.withOp('sheet.rename_sheet', { sheet, to })\n }\n /** Add a worksheet. */\n addSheet(name: string, options: { at?: number } = {}): MediaChain {\n return this.#chain.withOp('sheet.add_sheet', compact({ name, at: options.at }))\n }\n /** Remove a worksheet (name-targeted). */\n removeSheet(sheet: string): MediaChain {\n return this.#chain.withOp('sheet.remove_sheet', { sheet })\n }\n /** Reorder worksheets by names and/or 1-based indices. */\n reorderSheets(order: Array<string | number>): MediaChain {\n return this.#chain.withOp('sheet.reorder_sheets', { order: order as MediaArgJson })\n }\n /** Table transforms by header name. */\n transformTable(options: {\n sheet?: string | number\n headerRow?: number\n select?: string[]\n drop?: string[]\n rename?: Array<{ from: string; to: string }>\n }): MediaChain {\n return this.#chain.withOp(\n 'sheet.transform_table',\n compact({\n ...targetArgs(options),\n header_row: options.headerRow,\n select: options.select,\n drop: options.drop,\n rename: options.rename as MediaArgJson,\n })\n )\n }\n}\n\n/** `slides.*` verbs. */\nexport class SlidesNamespace {\n readonly #chain: MediaChain\n constructor(chain: MediaChain) {\n this.#chain = chain\n }\n /** Add a slide. */\n add(options: { at?: number; title?: string; layout?: string } = {}): MediaChain {\n return this.#chain.withOp(\n 'slides.add',\n compact({ at: options.at, title: options.title, layout: options.layout })\n )\n }\n /** Update text on a slide. */\n updateText(\n text: string,\n options: { slide?: string | number; placeholder?: string } = {}\n ): MediaChain {\n return this.#chain.withOp(\n 'slides.update_text',\n compact({ text, slide: slideArg(options.slide), placeholder: options.placeholder })\n )\n }\n /** Update table cells on a slide. */\n updateTable(\n updates: Array<{ row: number; col: number; value: string }>,\n options: { slide?: string | number } = {}\n ): MediaChain {\n return this.#chain.withOp(\n 'slides.update_table',\n compact({ updates: updates as unknown as MediaArgJson, slide: slideArg(options.slide) })\n )\n }\n /** Replace an image on a slide with another media. */\n updateImage(\n withMedia: MediaChainRef,\n options: { slide?: string | number; placeholder?: string } = {}\n ): MediaChain {\n return this.#chain.withOp(\n 'slides.update_image',\n compact({\n with: refOf(withMedia),\n slide: slideArg(options.slide),\n placeholder: options.placeholder,\n })\n )\n }\n /** Update chart data on a slide. */\n updateChart(data: unknown[][], options: { slide?: string | number } = {}): MediaChain {\n return this.#chain.withOp(\n 'slides.update_chart',\n compact({ data: data as MediaArgJson, slide: slideArg(options.slide) })\n )\n }\n /** Delete slides by 1-based index. */\n delete(slides: number[]): MediaChain {\n return this.#chain.withOp('slides.delete', { slides })\n }\n /** Reorder slides. */\n reorder(order: number[]): MediaChain {\n return this.#chain.withOp('slides.reorder', { order })\n }\n /** Duplicate a slide. */\n duplicate(slide: number, options: { at?: number } = {}): MediaChain {\n return this.#chain.withOp('slides.duplicate', compact({ slide, at: options.at }))\n }\n}\n\n/** `image.*` verbs (the runtime fuses adjacent image steps into one engine pass). */\nexport class ImageNamespace {\n readonly #chain: MediaChain\n constructor(chain: MediaChain) {\n this.#chain = chain\n }\n /** Resize. */\n resize(options: ResizeOptions): MediaChain {\n return this.#chain.withOp(\n 'image.resize',\n compact({ width: options.width, height: options.height, fit: options.fit })\n )\n }\n /** Re-encode to another format. */\n format(to: string, options: { quality?: number; stripMetadata?: boolean } = {}): MediaChain {\n return this.#chain.withOp(\n 'image.format',\n compact({ to, quality: options.quality, strip_metadata: options.stripMetadata })\n )\n }\n /** Rotate clockwise. */\n rotate(deg: 90 | 180 | 270): MediaChain {\n return this.#chain.withOp('image.rotate', { deg: String(deg) })\n }\n /** Flip. */\n flip(axis: 'horizontal' | 'vertical' | 'both'): MediaChain {\n return this.#chain.withOp('image.flip', { axis })\n }\n /** Strip EXIF/ICC metadata. */\n stripMetadata(): MediaChain {\n return this.#chain.withOp('image.strip_metadata', {})\n }\n}\n\n/** `audio.*` verbs. */\nexport class AudioNamespace {\n readonly #chain: MediaChain\n constructor(chain: MediaChain) {\n this.#chain = chain\n }\n /** Transcribe speech. Terminal: resolves to text (or srt/vtt/json per `out`). */\n transcribe(\n options: { language?: string; out?: 'txt' | 'srt' | 'vtt' | 'json'; translate?: boolean } = {}\n ): MediaChain {\n return this.#chain.withOp(\n 'audio.transcribe',\n compact({ lang: options.language, out: options.out, translate: options.translate })\n )\n }\n}\n\nconst targetArgs = (options: { sheet?: string | number }): Record<string, MediaArgValue> =>\n options.sheet === undefined ? {} : { sheet: options.sheet }\n\nconst slideArg = (slide: string | number | undefined): string | number | undefined => slide\n\nconst compact = (\n args: Record<string, MediaArgValue | undefined>\n): Record<string, MediaArgValue> => {\n const out: Record<string, MediaArgValue> = {}\n for (const [k, v] of Object.entries(args)) {\n if (v !== undefined) out[k] = v\n }\n return out\n}\n\n/** The input shapes `mp(...)` accepts. */\nexport type ChainInput = StepPayload\n","/**\n * The step runtime: executes a validated {@link MediaPlan} as an `@nhtio/middleware` onion,\n * one stage per step, with consumer interceptors wrapping every step.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. A fresh `Runner` is minted per\n * execution (middleware runners are single-use), so the same compiled chain can be awaited\n * repeatedly. Each step stage:\n *\n * 1. runs the consumer's `use` interceptors (the documented seam for DLP/AV scanning, caching\n * via `shortCircuit(bytes)`, byte limits, and telemetry — the battery ships no built-in\n * scanner/cache/limiter: those are policies, this is the seam), then\n * 2. dispatches to the verb's registered {@link StepImpl}, validating the output at the step\n * boundary so a misbehaving engine produces a clear error instead of corrupt bytes.\n *\n * Steps stream bytes in memory; nothing touches disk except inside a binary engine's\n * `ScratchWorkspace`. Adjacent `image.*` steps are fused by the compiler before execution so\n * a resize→format→rotate chain costs a single decode/encode.\n */\n\nimport { VERB_INDEX } from './verbs'\nimport { Middleware } from '@nhtio/middleware'\nimport { isError, isObject, isInstanceOf } from '@nhtio/adk/guards'\nimport { E_MEDIA_STEP_FAILED, E_MEDIA_STEP_UNAVAILABLE } from './exceptions'\nimport type { NextFn } from '@nhtio/middleware'\nimport type { EngineRegistry } from './registry'\nimport type { MediaPlan, MediaStep, MediaArgValue } from './plan'\n\n/** A single in-flight value travelling between steps. */\nexport interface StepPayload {\n /** The raw content bytes. */\n bytes: Uint8Array\n /** The content MIME type. */\n mimeType: string\n /** The filename (extension informs format dispatch). */\n filename: string\n}\n\n/**\n * What a step produces. `media` continues the chain (or terminates as bytes); `media-list`\n * and `data` are terminal-only shapes enforced by the plan compiler.\n */\nexport type StepResult =\n | { kind: 'media'; payload: StepPayload }\n | { kind: 'media-list'; payloads: StepPayload[] }\n | { kind: 'data'; data: unknown; asText?: string }\n\n/** The mutable execution context threaded through interceptors and step impls. */\nexport interface StepContext {\n /** The whole plan being executed. */\n readonly plan: MediaPlan\n /** Zero-based index of the current step. */\n readonly stepIndex: number\n /** The current step. */\n readonly step: MediaStep\n /** The input payload for this step. */\n payload: StepPayload\n /** Abort signal threaded from the caller. */\n readonly signal?: AbortSignal\n /** Scratchpad shared across the execution (interceptors may stash timings, hashes…). */\n readonly stash: Map<string, unknown>\n /**\n * Short-circuit this step: skip the implementation and continue the chain with `bytes`\n * (the cache idiom). Throws internally — call it, don't return it.\n */\n shortCircuit(payload: StepPayload): never\n /** The deployment's engine registry — ordered, capability-filtered dispatch. */\n readonly engines: EngineRegistry\n /**\n * Resolve another media participating in this step (merge/diff targets), by ref id.\n * Supplied by the pipeline from its configured media resolver.\n */\n resolveRef(id: string): Promise<StepPayload>\n}\n\n/** One verb's implementation. Registered into the runtime's step registry. */\nexport type StepImpl = (ctx: StepContext) => Promise<StepResult>\n\n/** Consumer step interceptor — the `use` seam. Same onion shape as the tool batteries. */\nexport type MediaStepMiddlewareFn = (ctx: StepContext, next: NextFn) => void | Promise<void>\n\n/** Internal sentinel for {@link StepContext.shortCircuit}. */\nconst SHORT_CIRCUIT = Symbol('adk.media.shortCircuit')\n\ninterface ShortCircuitSignal {\n [SHORT_CIRCUIT]: true\n payload: StepPayload\n}\n\nconst isShortCircuit = (value: unknown): value is ShortCircuitSignal =>\n isObject(value) && (value as Record<symbol, unknown>)[SHORT_CIRCUIT] === true\n\n/** Options for {@link executePlan}. */\nexport interface ExecutePlanOptions {\n /** The input payload the first step consumes. */\n input: StepPayload\n /** Verb id → implementation registry. */\n steps: ReadonlyMap<string, StepImpl>\n /** Consumer interceptors wrapping every step. */\n use: readonly MediaStepMiddlewareFn[]\n /** The deployment's engine registry. */\n engines: EngineRegistry\n /** Media-ref resolution for multi-input verbs. */\n resolveRef: StepContext['resolveRef']\n /** Abort signal. */\n signal?: AbortSignal\n}\n\n/** The settled result of executing a whole plan. */\nexport type PlanResult = StepResult\n\n/**\n * Execute a validated plan. Returns the final step's result; intermediate steps must produce\n * `media` results (the compiler guarantees non-terminal steps are media-shaped).\n *\n * @param plan - The validated plan.\n * @param options - Input payload, step registry, interceptors, engine access.\n * @returns The terminal step's result.\n */\nexport const executePlan = async (\n plan: MediaPlan,\n options: ExecutePlanOptions\n): Promise<PlanResult> => {\n const stash = new Map<string, unknown>()\n let payload = options.input\n let result: PlanResult = { kind: 'media', payload }\n\n for (let i = 0; i < plan.steps.length; i++) {\n const step = plan.steps[i]\n options.signal?.throwIfAborted()\n const impl = options.steps.get(step.verb)\n if (!impl) {\n throw new E_MEDIA_STEP_UNAVAILABLE([step.verb])\n }\n\n const ctx: StepContext = {\n plan,\n stepIndex: i,\n step,\n payload,\n signal: options.signal,\n stash,\n shortCircuit: (sc: StepPayload): never => {\n const signal: ShortCircuitSignal = { [SHORT_CIRCUIT]: true, payload: sc }\n throw signal\n },\n engines: options.engines,\n resolveRef: options.resolveRef,\n }\n\n try {\n result = await runStep(ctx, impl, options.use)\n } catch (err) {\n if (isShortCircuit(err)) {\n result = { kind: 'media', payload: err.payload }\n } else if (isError(err) && err.name.startsWith('E_MEDIA_')) {\n throw err\n } else {\n const detail = isError(err) ? err.message : String(err)\n throw new E_MEDIA_STEP_FAILED([step.verb, detail], { cause: err })\n }\n }\n\n if (result.kind === 'media') {\n payload = result.payload\n } else if (i < plan.steps.length - 1) {\n if (\n result.kind === 'data' &&\n typeof result.asText === 'string' &&\n VERB_INDEX.get(step.verb)?.output === 'text'\n ) {\n // R-step materialization (frozen 0.10): a non-terminal read step yields a text Media\n // into the chain, so `extract text | chunk` is type-sound.\n payload = {\n bytes: new TextEncoder().encode(result.asText),\n mimeType: 'text/plain',\n filename: materializedName(payload.filename),\n }\n result = { kind: 'media', payload }\n } else {\n throw new E_MEDIA_STEP_FAILED([\n step.verb,\n 'a non-terminal step produced a terminal result; only the last step may yield data or multiple media',\n ])\n }\n }\n }\n return result\n}\n\n/** Run one step: interceptor onion (fresh runner) terminating in the implementation. */\nconst runStep = async (\n ctx: StepContext,\n impl: StepImpl,\n use: readonly MediaStepMiddlewareFn[]\n): Promise<StepResult> => {\n if (use.length === 0) {\n return validated(ctx, await impl(ctx))\n }\n const mw = new Middleware<MediaStepMiddlewareFn>()\n for (const fn of use) mw.add(fn)\n\n let result: StepResult | undefined\n let caught: unknown\n await mw\n .runner()\n .errorHandler(async (error: unknown) => {\n caught = error\n })\n .finalHandler(async () => {\n result = validated(ctx, await impl(ctx))\n })\n .run((fn, next) => Promise.resolve(fn(ctx, next)))\n\n if (caught !== undefined) throw caught\n if (result === undefined) {\n throw new E_MEDIA_STEP_FAILED([\n ctx.step.verb,\n 'a step interceptor did not call next() and did not short-circuit',\n ])\n }\n return result\n}\n\n/** Validate a step implementation's output shape at the boundary. */\nconst validated = (ctx: StepContext, result: StepResult): StepResult => {\n const bad = (msg: string): never => {\n throw new E_MEDIA_STEP_FAILED([ctx.step.verb, `implementation returned ${msg}`])\n }\n const isBytes = (value: unknown): value is Uint8Array =>\n isInstanceOf(value, 'Uint8Array', Uint8Array)\n if (result.kind === 'media') {\n if (!isBytes(result.payload?.bytes)) bad('a media result without bytes')\n if (typeof result.payload.mimeType !== 'string') bad('a media result without a mimeType')\n return result\n }\n if (result.kind === 'media-list') {\n if (!Array.isArray(result.payloads) || result.payloads.some((p) => !isBytes(p.bytes))) {\n bad('a media-list result with invalid payloads')\n }\n return result\n }\n if (result.kind === 'data') return result\n return bad('an unknown result kind')\n}\n\n/** Filename for an R-step's materialized text payload. */\nconst materializedName = (filename: string): string => {\n const dot = filename.lastIndexOf('.')\n const base = dot > 0 ? filename.slice(0, dot) : filename\n return `${base}.txt`\n}\n\n/** Convenience: read a step arg with a typed cast (validation already ran). */\nexport const argOf = <T extends MediaArgValue>(step: MediaStep, name: string): T | undefined =>\n step.args[name] as T | undefined\n","/**\n * MIME tables and format-family classification for the media pipeline.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. Ported from the source server's\n * `format_families.ts` support tiers, reshaped for the DSL's verb-applicability checks:\n *\n * - Tier 1 (full read + mutate): OOXML (docx/xlsx/pptx) and ODF (odt/ods/odp, via a normalize\n * engine), plus PDF for page-level operations.\n * - Tier 2 (extraction only): legacy Office (doc/xls/ppt) and Apple iWork — mutation verbs\n * reject these with a reason string rather than a throw, so callers can surface\n * model-actionable failures.\n * - Everything else classifies by top-level MIME family (image/audio/text).\n */\n\nimport type { FormatFamily } from './verbs'\n\n/** Well-known MIME constants used across the battery. */\nexport const MIME = {\n DOCX: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n XLSX: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n PPTX: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n ODT: 'application/vnd.oasis.opendocument.text',\n ODS: 'application/vnd.oasis.opendocument.spreadsheet',\n ODP: 'application/vnd.oasis.opendocument.presentation',\n PDF: 'application/pdf',\n DOC: 'application/msword',\n XLS: 'application/vnd.ms-excel',\n PPT: 'application/vnd.ms-powerpoint',\n PAGES: 'application/x-iwork-pages-sffpages',\n NUMBERS: 'application/x-iwork-numbers-sffnumbers',\n KEYNOTE: 'application/x-iwork-keynote-sffkey',\n TXT: 'text/plain',\n MD: 'text/markdown',\n CSV: 'text/csv',\n HTML: 'text/html',\n JSON: 'application/json',\n PNG: 'image/png',\n JPEG: 'image/jpeg',\n WEBP: 'image/webp',\n TIFF: 'image/tiff',\n AVIF: 'image/avif',\n WAV: 'audio/wav',\n MP3: 'audio/mpeg',\n} as const\n\n/** Legacy Office MIME types (extraction only — mutation is rejected). */\nexport const LEGACY_OFFICE_MIMES: ReadonlySet<string> = new Set([MIME.DOC, MIME.XLS, MIME.PPT])\n\n/** Apple iWork MIME types (extraction only — mutation is rejected). */\nexport const IWORK_MIMES: ReadonlySet<string> = new Set([MIME.PAGES, MIME.NUMBERS, MIME.KEYNOTE])\n\nconst SPREADSHEET_MIMES: ReadonlySet<string> = new Set([MIME.XLSX, MIME.ODS, MIME.XLS, MIME.CSV])\nconst PRESENTATION_MIMES: ReadonlySet<string> = new Set([\n MIME.PPTX,\n MIME.ODP,\n MIME.PPT,\n MIME.KEYNOTE,\n])\nconst DOCUMENT_MIMES: ReadonlySet<string> = new Set([\n MIME.PDF,\n MIME.DOCX,\n MIME.ODT,\n MIME.DOC,\n MIME.PAGES,\n MIME.TXT,\n MIME.MD,\n MIME.HTML,\n MIME.JSON,\n 'application/rtf',\n 'text/rtf',\n])\n\n/**\n * Classify a MIME type into the verb table's broad format family.\n *\n * @param mimeType - The media MIME type.\n * @returns The family used by verb-applicability checks.\n */\nexport const familyOf = (mimeType: string): FormatFamily => {\n const mime = mimeType.toLowerCase().split(';')[0].trim()\n if (SPREADSHEET_MIMES.has(mime)) return 'spreadsheet'\n if (PRESENTATION_MIMES.has(mime)) return 'presentation'\n if (DOCUMENT_MIMES.has(mime)) return 'document'\n if (mime.startsWith('image/')) return 'image'\n if (mime.startsWith('audio/')) return 'audio'\n if (mime.startsWith('text/')) return 'document'\n return 'document'\n}\n\n/**\n * Reason a mutation verb cannot run against this MIME type, or `undefined` when mutation is\n * allowed. Returns a reason string (not a throw) so callers compose model-actionable failures.\n *\n * @param mimeType - The media MIME type.\n * @returns A human-readable reason, or `undefined` when mutation is supported.\n */\nexport const unsupportedForMutationReason = (mimeType: string): string | undefined => {\n const mime = mimeType.toLowerCase().split(';')[0].trim()\n if (LEGACY_OFFICE_MIMES.has(mime)) {\n return `legacy Office format (${mime}) supports extraction only — convert it first (e.g. convert to=docx)`\n }\n if (IWORK_MIMES.has(mime)) {\n return `Apple iWork format (${mime}) supports extraction only`\n }\n return undefined\n}\n\n/** A small extension → MIME lookup for filenames produced by transforms. */\nexport const EXT_TO_MIME: Readonly<Record<string, string>> = {\n pdf: MIME.PDF,\n docx: MIME.DOCX,\n xlsx: MIME.XLSX,\n pptx: MIME.PPTX,\n odt: MIME.ODT,\n ods: MIME.ODS,\n odp: MIME.ODP,\n doc: MIME.DOC,\n xls: MIME.XLS,\n ppt: MIME.PPT,\n txt: MIME.TXT,\n md: MIME.MD,\n csv: MIME.CSV,\n html: MIME.HTML,\n json: MIME.JSON,\n rtf: 'application/rtf',\n png: MIME.PNG,\n jpg: MIME.JPEG,\n jpeg: MIME.JPEG,\n webp: MIME.WEBP,\n tiff: MIME.TIFF,\n avif: MIME.AVIF,\n wav: MIME.WAV,\n mp3: MIME.MP3,\n}\n\n/**\n * Replace (or add) a filename's extension.\n *\n * @param filename - The original filename.\n * @param ext - The new extension, without the dot.\n * @returns The filename with the new extension.\n */\nexport const replaceExtension = (filename: string, ext: string): string => {\n const dot = filename.lastIndexOf('.')\n const base = dot > 0 ? filename.slice(0, dot) : filename\n return `${base}.${ext}`\n}\n","/**\n * Pure text-shaped step implementations: chunking, plain-text extraction, text diff/patch,\n * and the text-mode redact/update_text paths.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. The split functions are ported\n * verbatim from the source server's `chunk_text` adapter (its green unit suite ports with\n * them). All implementations here operate on in-memory bytes and run in any environment.\n */\n\nimport { argOf } from '../runtime'\nimport { E_MEDIA_STEP_FAILED } from '../exceptions'\nimport { familyOf, replaceExtension, MIME } from '../formats'\nimport type { StepImpl, StepPayload } from '../runtime'\nimport type { RegExpRef, MediaRef, MediaArgScalar } from '../plan'\n\n/** One text chunk with its position in the source. */\nexport interface Chunk {\n index: number\n text: string\n char_start: number\n char_end: number\n}\n\n/** Split text on double-newline paragraph boundaries, with optional character overlap. */\nexport const splitParagraph = (text: string, overlap: number): Chunk[] => {\n const blocks = text\n .split(/\\n{2,}/)\n .map((b) => b.trim())\n .filter(Boolean)\n const chunks: Chunk[] = []\n let pos = 0\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i]\n const overlapText =\n i > 0 && overlap > 0\n ? blocks\n .slice(Math.max(0, i - 1), i)\n .join('\\n\\n')\n .slice(-overlap)\n : ''\n const chunkText = overlapText ? `${overlapText}\\n\\n${block}` : block\n chunks.push({ index: i, text: chunkText, char_start: pos, char_end: pos + block.length })\n pos += block.length + 2\n }\n return chunks\n}\n\n/** Split text on sentence-ending punctuation, with optional character overlap. */\nexport const splitSentence = (text: string, overlap: number): Chunk[] => {\n const sentences = text.match(/[^.!?]+[.!?](?:\\s|$)|[^.!?]+$/g) ?? [text]\n const chunks: Chunk[] = []\n let pos = 0\n for (let i = 0; i < sentences.length; i++) {\n const sentence = sentences[i].trim()\n if (!sentence) continue\n const overlapText =\n i > 0 && overlap > 0\n ? sentences\n .slice(Math.max(0, i - 1), i)\n .join(' ')\n .slice(-overlap)\n : ''\n const chunkText = overlapText ? `${overlapText} ${sentence}` : sentence\n chunks.push({\n index: chunks.length,\n text: chunkText,\n char_start: pos,\n char_end: pos + sentence.length,\n })\n pos += sentence.length + 1\n }\n return chunks\n}\n\n/** Split text into fixed-size character windows with optional overlap. */\nexport const splitFixed = (text: string, chunkSize: number, overlap: number): Chunk[] => {\n const chunks: Chunk[] = []\n const step = Math.max(1, chunkSize - overlap)\n let i = 0\n let idx = 0\n while (i < text.length) {\n const start = Math.max(0, i - overlap)\n const end = i + chunkSize\n chunks.push({\n index: idx++,\n text: text.slice(start, end),\n char_start: start,\n char_end: Math.min(end, text.length),\n })\n i += step\n }\n return chunks\n}\n\nconst decoder = new TextDecoder('utf-8', { fatal: false })\nconst encoder = new TextEncoder()\n\n/** Decode payload bytes as UTF-8 text (UTF-16 BOM aware). */\nexport const decodeText = (bytes: Uint8Array): string => {\n if (bytes.length >= 2) {\n if (bytes[0] === 0xff && bytes[1] === 0xfe) {\n return new TextDecoder('utf-16le').decode(bytes.subarray(2))\n }\n if (bytes[0] === 0xfe && bytes[1] === 0xff) {\n return new TextDecoder('utf-16be').decode(bytes.subarray(2))\n }\n }\n return decoder.decode(bytes).replace(/\\r\\n?/g, '\\n')\n}\n\nconst textPayload = (source: StepPayload, text: string, suffix: string): StepPayload => ({\n bytes: encoder.encode(text),\n mimeType: MIME.TXT,\n filename: replaceExtension(source.filename, suffix),\n})\n\n// ── step implementations ─────────────────────────────────────────────────────\n\n/** `chunk` — split text content into retrieval chunks (data result). */\nexport const chunkStep: StepImpl = async (ctx) => {\n const by = argOf<string>(ctx.step, 'by') ?? 'paragraph'\n const size = argOf<number>(ctx.step, 'size') ?? 1000\n const overlap = argOf<number>(ctx.step, 'overlap') ?? 0\n const text = decodeText(ctx.payload.bytes)\n const chunks =\n by === 'sentence'\n ? splitSentence(text, overlap)\n : by === 'fixed'\n ? splitFixed(text, size, overlap)\n : splitParagraph(text, overlap)\n return { kind: 'data', data: chunks, asText: JSON.stringify(chunks) }\n}\n\n/**\n * `extract.text` — Phase 0 covers the native-text path (txt/md/csv/json/html). Document\n * formats (pdf/docx/…) and OCR routes are added by later phases; until then they fail with a\n * clear reason.\n */\nexport const extractTextStep: StepImpl = async (ctx) => {\n const family = familyOf(ctx.payload.mimeType)\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n const isNativeText =\n mime.startsWith('text/') || mime === MIME.JSON || mime === MIME.MD || mime === MIME.CSV\n if (!isNativeText) {\n throw new E_MEDIA_STEP_FAILED([\n 'extract.text',\n `extraction for ${family} media (${mime}) is not yet implemented in this build`,\n ])\n }\n const text = decodeText(ctx.payload.bytes)\n return {\n kind: 'data',\n data: text,\n asText: text,\n }\n}\n\n/** `extract.metadata` — Phase 0: size/MIME/filename basics (format-aware fields come later). */\nexport const extractMetadataStep: StepImpl = async (ctx) => {\n const meta = {\n filename: ctx.payload.filename,\n mime_type: ctx.payload.mimeType,\n size_bytes: ctx.payload.bytes.byteLength,\n family: familyOf(ctx.payload.mimeType),\n }\n return { kind: 'data', data: meta, asText: JSON.stringify(meta) }\n}\n\nconst toPattern = (value: MediaArgScalar): RegExp | string => {\n if (typeof value === 'string') return value\n const ref = value as RegExpRef\n return new RegExp(ref.source, ref.flags.includes('g') ? ref.flags : `${ref.flags}g`)\n}\n\nconst applyRedaction = (text: string, patterns: MediaArgScalar[], replacement: string): string => {\n let out = text\n for (const p of patterns) {\n const pattern = toPattern(p)\n out =\n typeof pattern === 'string'\n ? out.split(pattern).join(replacement)\n : out.replace(pattern, replacement)\n }\n return out\n}\n\n/** `redact` — Phase 0: the text-media path. Document-format in-place redaction lands later. */\nexport const redactStep: StepImpl = async (ctx) => {\n const mime = ctx.payload.mimeType.toLowerCase()\n if (!mime.startsWith('text/')) {\n throw new E_MEDIA_STEP_FAILED([\n 'redact',\n `redaction for ${ctx.payload.mimeType} is not yet implemented in this build`,\n ])\n }\n const raw = ctx.step.args.match\n const patterns = (Array.isArray(raw) ? raw : [raw]) as MediaArgScalar[]\n const replacement = argOf<string>(ctx.step, 'replace') ?? '█'\n const text = applyRedaction(decodeText(ctx.payload.bytes), patterns, replacement)\n return { kind: 'media', payload: textPayload(ctx.payload, text, 'txt') }\n}\n\n/** `update_text` — Phase 0: the text-media path. */\nexport const updateTextStep: StepImpl = async (ctx) => {\n const mime = ctx.payload.mimeType.toLowerCase()\n if (!mime.startsWith('text/')) {\n throw new E_MEDIA_STEP_FAILED([\n 'update_text',\n `text update for ${ctx.payload.mimeType} is not yet implemented in this build`,\n ])\n }\n const anchor = argOf<string>(ctx.step, 'anchor') as string\n const replace = argOf<string>(ctx.step, 'replace') ?? ''\n const text = decodeText(ctx.payload.bytes)\n if (!text.includes(anchor)) {\n throw new E_MEDIA_STEP_FAILED([\n 'update_text',\n `anchor text not found: \"${anchor.slice(0, 80)}\"`,\n ])\n }\n const updated = text.replace(anchor, replace)\n return { kind: 'media', payload: { ...ctx.payload, bytes: encoder.encode(updated) } }\n}\n\n/** Build a unified diff between two texts using the `diff` peer (lazy import). */\nconst unifiedDiff = async (aName: string, bName: string, a: string, b: string): Promise<string> => {\n const mod = await import('diff')\n return mod.createTwoFilesPatch(aName, bName, a, b)\n}\n\n/** `diff` — compare against another media (text-comparable formats in Phase 0). */\nexport const diffStep: StepImpl = async (ctx) => {\n const ref = ctx.step.args.with as MediaRef\n if (ref.kind !== 'id') {\n throw new E_MEDIA_STEP_FAILED(['diff', 'builder refs are not yet supported here'])\n }\n const other = await ctx.resolveRef(ref.id)\n const a = decodeText(ctx.payload.bytes)\n const b = decodeText(other.bytes)\n const patch = await unifiedDiff(ctx.payload.filename, other.filename, a, b)\n const mod = await import('diff')\n const structured = mod.diffLines(a, b).map((part) => ({\n added: part.added === true,\n removed: part.removed === true,\n count: part.count ?? 0,\n value: part.value,\n }))\n const data = { patch, changes: structured }\n return { kind: 'data', data, asText: patch }\n}\n\n/** `apply_patch` — apply a unified diff to the media text. */\nexport const applyPatchStep: StepImpl = async (ctx) => {\n const patch = argOf<string>(ctx.step, 'patch') as string\n const text = decodeText(ctx.payload.bytes)\n const mod = await import('diff')\n const result = mod.applyPatch(text, patch)\n if (result === false) {\n throw new E_MEDIA_STEP_FAILED([\n 'apply_patch',\n 'the patch does not apply to this media content (context mismatch)',\n ])\n }\n return { kind: 'media', payload: { ...ctx.payload, bytes: encoder.encode(result) } }\n}\n","/**\n * Doc-domain step extensions: format-preserving text mutation for DOCX/PPTX, asset\n * extraction from OOXML/ODF archives and PDFs, and format conversion via the convert engine.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. Ported from the source server's\n * doc adapters; the format-dispatch contract follows the server's green e2e suite: DOCX and\n * PPTX redact/sanitize/normalize/update_text mutate text in place inside the container\n * (preserving the source format); text-like inputs mutate as text; PDF redact falls back to\n * text extraction (the server's PDF \"visual annotation\" path is content-stream-preserving and\n * out of scope here — the failure message says exactly that).\n */\n\nimport { MIME } from '../formats'\nimport { argOf } from '../runtime'\nimport { isError } from '@nhtio/adk/guards'\nimport { E_MEDIA_STEP_FAILED } from '../exceptions'\nimport { redactStep as textRedactStep, updateTextStep as textUpdateTextStep } from './text'\nimport type { default as JSZipNS } from 'jszip'\nimport type { RegExpRef, MediaArgScalar } from '../plan'\nimport type { StepImpl, StepContext, StepResult, StepPayload } from '../runtime'\n\ntype JSZipModule = typeof JSZipNS\n\nlet zipPromise: Promise<JSZipModule> | undefined\nconst jszip = (): Promise<JSZipModule> => {\n zipPromise ??= import('jszip').then((m) => ('default' in m ? m.default : m) as JSZipModule)\n return zipPromise\n}\n\nconst fail = (verb: string, message: string): never => {\n throw new E_MEDIA_STEP_FAILED([verb, message])\n}\n\nconst escapeXml = (value: string): string =>\n value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n\nconst unescapeXml = (value: string): string =>\n value\n .replace(/&apos;/g, \"'\")\n .replace(/&quot;/g, '\"')\n .replace(/&gt;/g, '>')\n .replace(/&lt;/g, '<')\n .replace(/&amp;/g, '&')\n\n// ── OOXML text mutation (ported run-aggregation semantics) ───────────────────\n\n/**\n * Replace matches inside text nodes of OOXML, aggregating runs per paragraph so patterns\n * spanning split runs still match (Word splits text across `w:t` runs on formatting changes).\n */\nconst replaceInOoxml = (\n xml: string,\n paragraphTag: 'w:p' | 'a:p',\n textTag: 'w:t' | 'a:t',\n pattern: RegExp,\n replacement: string\n): { xml: string; matchCount: number } => {\n let totalMatches = 0\n const pRegex = new RegExp(`<${paragraphTag}\\\\b[^>]*>[\\\\s\\\\S]*?</${paragraphTag}>`, 'g')\n const result = xml.replace(pRegex, (pXml) => {\n const tElements: Array<{ start: number; end: number; content: string }> = []\n const tRegex = new RegExp(`<${textTag}(?:\\\\s[^>]*)?>([^<]*)</${textTag}>`, 'g')\n let tMatch: RegExpExecArray | null\n while ((tMatch = tRegex.exec(pXml))) {\n tElements.push({\n start: tMatch.index,\n end: tMatch.index + tMatch[0].length,\n content: unescapeXml(tMatch[1]),\n })\n }\n if (tElements.length === 0) return pXml\n const aggregated = tElements.map((t) => t.content).join('')\n const p = new RegExp(pattern.source, pattern.flags)\n const replaced = aggregated.replace(p, replacement)\n if (replaced === aggregated) return pXml\n const counter = new RegExp(pattern.source, pattern.flags)\n while (counter.exec(aggregated)) {\n totalMatches += 1\n if (!counter.global) break\n }\n let out = pXml\n for (let i = tElements.length - 1; i >= 0; i--) {\n const el = tElements[i]\n const space = textTag === 'w:t' && i === 0 ? ' xml:space=\"preserve\"' : ''\n const content = i === 0 ? escapeXml(replaced) : ''\n out =\n out.slice(0, el.start) + `<${textTag}${space}>${content}</${textTag}>` + out.slice(el.end)\n }\n return out\n })\n return { xml: result, matchCount: totalMatches }\n}\n\n/** Map text-node mutation over every relevant part of a DOCX or PPTX archive. */\nconst mutateOoxmlText = async (\n ctx: StepContext,\n verb: string,\n mutateXml: (xml: string, kind: 'docx' | 'pptx') => string\n): Promise<StepResult> => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n const kind = mime === MIME.DOCX ? 'docx' : 'pptx'\n const JSZip = await jszip()\n let zip: JSZipNS\n try {\n zip = await JSZip.loadAsync(ctx.payload.bytes)\n } catch (err) {\n const detail = isError(err) ? err.message : String(err)\n fail(verb, `could not open the document container: ${detail}`)\n /* unreachable */ throw err\n }\n const parts =\n kind === 'docx'\n ? Object.keys(zip.files).filter((n) => /^word\\/(document|header\\d*|footer\\d*)\\.xml$/.test(n))\n : Object.keys(zip.files).filter((n) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(n))\n if (parts.length === 0) fail(verb, 'the container has no text parts to mutate (corrupt file?)')\n for (const part of parts) {\n const xml = await zip.file(part)!.async('text')\n const next = mutateXml(xml, kind)\n if (next !== xml) zip.file(part, next)\n }\n const bytes = await zip.generateAsync({ type: 'uint8array', compression: 'DEFLATE' })\n return { kind: 'media', payload: { ...ctx.payload, bytes } }\n}\n\nconst toGlobalRegex = (value: MediaArgScalar): RegExp => {\n if (typeof value === 'string') {\n const escaped = value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n return new RegExp(escaped, 'g')\n }\n const ref = value as RegExpRef\n return new RegExp(ref.source, ref.flags.includes('g') ? ref.flags : `${ref.flags}g`)\n}\n\n// ── doc-aware step dispatch ──────────────────────────────────────────────────\n\n/** `redact` — format dispatch: text media → text path; DOCX/PPTX → in-place container edit. */\nexport const docRedactStep: StepImpl = async (ctx) => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n if (mime.startsWith('text/')) return textRedactStep(ctx)\n if (mime === MIME.DOCX || mime === MIME.PPTX) {\n const raw = ctx.step.args.match\n const patterns = (Array.isArray(raw) ? raw : [raw]) as MediaArgScalar[]\n const replacement = argOf<string>(ctx.step, 'replace') ?? '█'\n return mutateOoxmlText(ctx, 'redact', (xml, kind) => {\n let out = xml\n for (const p of patterns) {\n out = replaceInOoxml(\n out,\n kind === 'docx' ? 'w:p' : 'a:p',\n kind === 'docx' ? 'w:t' : 'a:t',\n toGlobalRegex(p),\n replacement\n ).xml\n }\n return out\n })\n }\n fail(\n 'redact',\n `redaction for ${mime} is not supported in this build (text, DOCX, and PPTX are). For PDF, extract the text first: extract text | redact …`\n )\n /* unreachable */ throw new Error('unreachable')\n}\n\nconst BLOCKED_CONTROL = (code: number): boolean =>\n (code >= 0 && code <= 8) ||\n code === 11 ||\n code === 12 ||\n (code >= 14 && code <= 31) ||\n code === 127\n\nconst stripControlChars = (text: string): string => {\n let out = ''\n for (const ch of text) {\n if (BLOCKED_CONTROL(ch.charCodeAt(0))) continue\n out += ch\n }\n return out\n}\n\nconst sanitizeTextNodes = (xml: string, textTag: 'w:t' | 'a:t'): string =>\n xml.replace(\n new RegExp(`<${textTag}(?:\\\\s[^>]*)?>([^<]*)</${textTag}>`, 'g'),\n (full, content: string) => {\n const cleaned = stripControlChars(unescapeXml(content))\n if (cleaned === unescapeXml(content)) return full\n return full.replace(content, escapeXml(cleaned))\n }\n )\n\n/** `sanitize` — strip blocked control characters from text nodes / text media. */\nexport const docSanitizeStep: StepImpl = async (ctx) => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n if (mime.startsWith('text/')) {\n const text = new TextDecoder().decode(ctx.payload.bytes)\n const cleaned = stripControlChars(text)\n return { kind: 'media', payload: { ...ctx.payload, bytes: new TextEncoder().encode(cleaned) } }\n }\n if (mime === MIME.DOCX || mime === MIME.PPTX) {\n return mutateOoxmlText(ctx, 'sanitize', (xml, kind) =>\n sanitizeTextNodes(xml, kind === 'docx' ? 'w:t' : 'a:t')\n )\n }\n fail('sanitize', `sanitize for ${mime} is not supported in this build (text, DOCX, PPTX are)`)\n /* unreachable */ throw new Error('unreachable')\n}\n\nconst normalizeText = (text: string): string =>\n text\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\r/g, '\\n')\n .replace(/[\\t ]+$/gm, '')\n\n/** `normalize` — CRLF→LF + trailing-whitespace removal in text nodes / text media. */\nexport const docNormalizeStep: StepImpl = async (ctx) => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n if (mime.startsWith('text/')) {\n const text = new TextDecoder().decode(ctx.payload.bytes)\n return {\n kind: 'media',\n payload: { ...ctx.payload, bytes: new TextEncoder().encode(normalizeText(text)) },\n }\n }\n if (mime === MIME.DOCX || mime === MIME.PPTX) {\n return mutateOoxmlText(ctx, 'normalize', (xml, kind) => {\n const tag = kind === 'docx' ? 'w:t' : 'a:t'\n return xml.replace(\n new RegExp(`<${tag}(?:\\\\s[^>]*)?>([^<]*)</${tag}>`, 'g'),\n (full, content: string) => {\n const normalized = normalizeText(unescapeXml(content))\n if (normalized === unescapeXml(content)) return full\n return full.replace(content, escapeXml(normalized))\n }\n )\n })\n }\n fail('normalize', `normalize for ${mime} is not supported in this build (text, DOCX, PPTX are)`)\n /* unreachable */ throw new Error('unreachable')\n}\n\n/** `update_text` — anchor replacement; DOCX/PPTX in-place, TARGET_NOT_FOUND when absent. */\nexport const docUpdateTextStep: StepImpl = async (ctx) => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n if (mime.startsWith('text/')) return textUpdateTextStep(ctx)\n if (mime === MIME.DOCX || mime === MIME.PPTX) {\n const anchor = argOf<string>(ctx.step, 'anchor') as string\n const replace = argOf<string>(ctx.step, 'replace') ?? ''\n let found = 0\n const result = await mutateOoxmlText(ctx, 'update_text', (xml, kind) => {\n if (found > 0) return xml\n const escaped = anchor.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const { xml: next, matchCount } = replaceInOoxml(\n xml,\n kind === 'docx' ? 'w:p' : 'a:p',\n kind === 'docx' ? 'w:t' : 'a:t',\n new RegExp(escaped),\n replace\n )\n found += matchCount\n return next\n })\n if (found === 0) {\n fail('update_text', `anchor text not found: \"${anchor.slice(0, 80)}\"`)\n }\n return result\n }\n fail(\n 'update_text',\n `text update for ${mime} is not supported (text, DOCX, PPTX are; PDF text is not reliably editable)`\n )\n /* unreachable */ throw new Error('unreachable')\n}\n\n// ── extract.assets ───────────────────────────────────────────────────────────\n\nconst ASSET_PATTERNS: Record<string, RegExp> = {\n image: /\\.(png|jpe?g|gif|bmp|tiff?|emf|wmf|svg|webp)$/i,\n font: /\\.(ttf|otf|woff2?|odttf)$/i,\n attachment: /\\.(bin|ole|docx?|xlsx?|pptx?|pdf|txt|csv)$/i,\n}\n\nconst EXT_MIME: Record<string, string> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n bmp: 'image/bmp',\n tif: 'image/tiff',\n tiff: 'image/tiff',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n emf: 'image/emf',\n wmf: 'image/wmf',\n ttf: 'font/ttf',\n otf: 'font/otf',\n woff: 'font/woff',\n woff2: 'font/woff2',\n}\n\n/**\n * `extract.assets` — enumerate embedded assets. OOXML/ODF archives are walked natively\n * (cross-env); PDF inputs use the pdfImages engine.\n */\nexport const extractAssetsStep: StepImpl = async (ctx) => {\n const verb = 'extract assets'\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n const requested = (ctx.step.args.types as string[] | undefined) ?? ['all']\n const wantAll = requested.includes('all')\n const want = (kind: string): boolean => wantAll || requested.includes(kind)\n\n if (mime === MIME.PDF) {\n if (!want('image')) {\n fail(verb, 'PDF asset extraction currently supports images (types=image or all)')\n }\n if (!ctx.engines.hasConvert(mime, 'images')) {\n fail(\n verb,\n 'PDF asset extraction requires an engine that converts application/pdf to \"images\", and none is configured. Do not retry this verb on PDFs in this deployment.'\n )\n }\n const format = argOf<string>(ctx.step, 'format')\n const result = await ctx.engines.convert({\n bytes: ctx.payload.bytes,\n mimeType: mime,\n filename: ctx.payload.filename,\n to: 'images',\n options: format ? { format } : undefined,\n signal: ctx.signal,\n })\n if (result.outputs.length === 0) fail(verb, 'no embedded images were found in the PDF')\n const wantedMime = format ? (EXT_MIME[format] ?? `image/${format}`) : undefined\n const payloads: StepPayload[] = []\n for (const [i, img] of result.outputs.entries()) {\n let bytes = img.bytes\n let mimeType = img.mimeType\n // Two-tier encoding: outputs already in the requested format pass through (native\n // collapse); the rest re-encode via an ordinary registry dispatch.\n if (wantedMime && mimeType.toLowerCase() !== wantedMime) {\n const reencoded = await ctx.engines.mutate({\n bytes,\n mimeType,\n format: { to: format! },\n signal: ctx.signal,\n })\n bytes = reencoded.bytes\n mimeType = reencoded.mimeType\n }\n payloads.push({\n bytes,\n mimeType,\n filename: `asset-${i + 1}.${mimeType.split('/')[1]?.replace('jpeg', 'jpg') ?? 'bin'}`,\n })\n }\n return { kind: 'media-list', payloads }\n }\n\n // Archive formats: OOXML + ODF are zip containers.\n const isArchive = [MIME.DOCX, MIME.XLSX, MIME.PPTX, MIME.ODT, MIME.ODS, MIME.ODP].includes(\n mime as never\n )\n if (!isArchive) {\n fail(verb, `asset extraction for ${mime} is not supported (OOXML/ODF archives and PDF are)`)\n }\n const JSZip = await jszip()\n const zip = await JSZip.loadAsync(ctx.payload.bytes)\n const payloads: StepPayload[] = []\n for (const [name, entry] of Object.entries(zip.files)) {\n if (entry.dir) continue\n const basename = name.split('/').pop() ?? name\n const matchKind = Object.entries(ASSET_PATTERNS).find(([, re]) => re.test(basename))?.[0]\n if (!matchKind || !want(matchKind)) continue\n // Only media/embeddings/fonts directories carry real assets in these containers.\n if (!/(^|\\/)(media|embeddings|fonts|Pictures|ObjectReplacements)\\//i.test(name)) continue\n const ext = basename.split('.').pop()?.toLowerCase() ?? 'bin'\n payloads.push({\n bytes: await entry.async('uint8array'),\n mimeType: EXT_MIME[ext] ?? 'application/octet-stream',\n filename: basename,\n })\n }\n if (payloads.length === 0) fail(verb, 'no embedded assets matched the requested types')\n return { kind: 'media-list', payloads }\n}\n\n// ── convert ──────────────────────────────────────────────────────────────────\n\n/** `convert` — dispatch through the engine registry (direct edge or computed path). */\nexport const convertStep: StepImpl = async (ctx) => {\n const verb = 'convert'\n const to = argOf<string>(ctx.step, 'to') as string\n const supported = ctx.engines.convertTargets(ctx.payload.mimeType)\n if (!supported.includes(to)) {\n fail(\n verb,\n `no configured engine (or computed path) can produce \"${to}\" from ${ctx.payload.mimeType}; reachable targets: ${supported.join(', ') || '(none)'}`\n )\n }\n const result = await ctx.engines.convert({\n bytes: ctx.payload.bytes,\n mimeType: ctx.payload.mimeType,\n filename: ctx.payload.filename,\n to,\n signal: ctx.signal,\n })\n const output = result.outputs[0]\n if (!output) fail(verb, 'the conversion produced no output')\n const dot = ctx.payload.filename.lastIndexOf('.')\n const base = dot > 0 ? ctx.payload.filename.slice(0, dot) : ctx.payload.filename\n return {\n kind: 'media',\n payload: { bytes: output!.bytes, mimeType: output!.mimeType, filename: `${base}.${to}` },\n }\n}\n\n/** The doc step registry fragment (overrides the Phase 0 text-only redact/update_text). */\nexport const DOC_STEPS: ReadonlyArray<[string, StepImpl]> = [\n ['redact', docRedactStep],\n ['sanitize', docSanitizeStep],\n ['normalize', docNormalizeStep],\n ['update_text', docUpdateTextStep],\n ['extract.assets', extractAssetsStep],\n ['convert', convertStep],\n]\n","/**\n * `sheet.*` step implementations: ExcelJS workbook mutations on in-memory bytes.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. Ported from the source server's\n * sheet adapters (its green e2e suite informs the spec coverage). All ten mutations operate on\n * xlsx natively via ExcelJS (optional peer, lazily imported); ODS and legacy-xls inputs are\n * normalized to xlsx first through the configured `sheetNormalize` engine, degrading to a\n * readable failure when none is configured. Output is always xlsx.\n */\n\nimport { argOf } from '../runtime'\nimport { isError } from '@nhtio/adk/guards'\nimport { E_MEDIA_STEP_FAILED } from '../exceptions'\nimport { MIME, replaceExtension, unsupportedForMutationReason } from '../formats'\nimport type { MediaArgJson } from '../plan'\nimport type { default as ExcelJSNS } from 'exceljs'\nimport type { StepImpl, StepContext, StepPayload } from '../runtime'\n\ntype ExcelJSModule = typeof ExcelJSNS\n\nlet excelPromise: Promise<ExcelJSModule> | undefined\nconst excel = (): Promise<ExcelJSModule> => {\n excelPromise ??= import('exceljs').then((m) => ('default' in m ? m.default : m) as ExcelJSModule)\n return excelPromise\n}\n\nconst fail = (verb: string, message: string): never => {\n throw new E_MEDIA_STEP_FAILED([verb, message])\n}\n\n/** Acquire xlsx bytes for the step, converting ODS/xls to xlsx via the engine registry. */\nconst acquireXlsx = async (ctx: StepContext, verb: string): Promise<Uint8Array> => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n if (mime === MIME.XLSX) return ctx.payload.bytes\n const mutationBlock = unsupportedForMutationReason(mime)\n if (mime === MIME.ODS || mime === MIME.XLS) {\n if (!ctx.engines.hasConvert(mime, 'xlsx')) {\n fail(\n verb,\n `this input is ${mime} — an engine that converts it to xlsx is required first, and none is configured. Do not retry this verb on this media in this deployment.`\n )\n }\n const result = await ctx.engines.convert({\n bytes: ctx.payload.bytes,\n mimeType: mime,\n filename: ctx.payload.filename,\n to: 'xlsx',\n signal: ctx.signal,\n })\n const output = result.outputs[0]\n if (!output) fail(verb, 'normalizing the workbook to xlsx produced no output')\n return output!.bytes\n }\n if (mutationBlock) fail(verb, mutationBlock)\n fail(verb, `sheet operations expect a spreadsheet; the media is ${mime}`)\n /* unreachable */ throw new Error('unreachable')\n}\n\ninterface MutationSummary {\n added?: number\n removed?: number\n modified?: number\n warnings?: string[]\n}\n\n/** The shared open → mutate → write-back lifecycle every sheet verb uses. */\nconst withWorkbook = async (\n ctx: StepContext,\n verb: string,\n mutate: (wb: ExcelJSNS.Workbook) => MutationSummary | Promise<MutationSummary>\n): Promise<{ kind: 'media'; payload: StepPayload }> => {\n const xlsxBytes = await acquireXlsx(ctx, verb)\n const ExcelJS = await excel()\n const wb = new ExcelJS.Workbook()\n try {\n await wb.xlsx.load(\n xlsxBytes.buffer.slice(\n xlsxBytes.byteOffset,\n xlsxBytes.byteOffset + xlsxBytes.byteLength\n ) as ArrayBuffer\n )\n } catch (err) {\n const detail = isError(err) ? err.message : String(err)\n fail(verb, `could not open the spreadsheet: ${detail}`)\n }\n await mutate(wb)\n const out = new Uint8Array(await wb.xlsx.writeBuffer())\n return {\n kind: 'media',\n payload: {\n bytes: out,\n mimeType: MIME.XLSX,\n filename: replaceExtension(ctx.payload.filename, 'xlsx'),\n },\n }\n}\n\n/** Resolve the target worksheet from the frozen `sheet=` rule (bare number=index, string=name). */\nconst resolveSheet = (\n verb: string,\n wb: ExcelJSNS.Workbook,\n sheetArg: string | number | undefined\n): ExcelJSNS.Worksheet => {\n if (sheetArg === undefined) {\n const first = wb.worksheets[0]\n if (!first) fail(verb, 'the workbook has no worksheets')\n return first\n }\n // Frozen 0.11: bare number targets by 1-based index; quoted string targets by name.\n if (typeof sheetArg === 'number') {\n const byIndex = wb.worksheets[sheetArg - 1]\n if (byIndex) return byIndex\n const byName = wb.getWorksheet(String(sheetArg))\n if (byName) {\n fail(\n verb,\n `no sheet at index ${sheetArg}, but a sheet NAMED \"${sheetArg}\" exists — quote it: sheet=\"${sheetArg}\"`\n )\n }\n fail(\n verb,\n `sheet index ${sheetArg} is out of range (1-based; the workbook has ${wb.worksheets.length})`\n )\n }\n const ws = wb.getWorksheet(sheetArg as string)\n if (!ws) {\n const names = wb.worksheets.map((w) => `\"${w.name}\"`).join(', ')\n fail(verb, `no sheet named \"${sheetArg}\". Sheets: ${names}`)\n }\n return ws!\n}\n\nconst columnLetterToNumber = (col: string): number => {\n let n = 0\n for (const ch of col.toUpperCase()) n = n * 26 + (ch.charCodeAt(0) - 64)\n return n\n}\n\ntype CellValue = string | number | boolean | null\n\nconst asCellValue = (verb: string, value: unknown): ExcelJSNS.CellValue => {\n if (value === null) return null\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value\n }\n fail(verb, `cell values must be string, number, boolean, or null; got ${typeof value}`)\n /* unreachable */ throw new Error('unreachable')\n}\n\n// ── step implementations ─────────────────────────────────────────────────────\n\n/** `sheet.add_rows` — insert rows before/after an index, or append. */\nexport const sheetAddRowsStep: StepImpl = async (ctx) => {\n const verb = 'sheet add_rows'\n const rows = ctx.step.args.rows as MediaArgJson\n if (!Array.isArray(rows) || rows.length === 0 || !rows.every(Array.isArray)) {\n fail(verb, `rows must be a non-empty JSON array of arrays, e.g. rows='[[\"a\",1]]'`)\n }\n const before = argOf<number>(ctx.step, 'before')\n const after = argOf<number>(ctx.step, 'after')\n return withWorkbook(ctx, verb, (wb) => {\n const ws = resolveSheet(verb, wb, argOf<string | number>(ctx.step, 'sheet'))\n const insertAt =\n before !== undefined ? before : after !== undefined ? after + 1 : ws.rowCount + 1\n const cellRows = (rows as unknown[][]).map((r) => r.map((v) => asCellValue(verb, v)))\n ws.spliceRows(insertAt, 0, ...cellRows)\n return { added: cellRows.length }\n })\n}\n\n/** `sheet.add_columns` — insert columns with headers or full descriptors. */\nexport const sheetAddColumnsStep: StepImpl = async (ctx) => {\n const verb = 'sheet add_columns'\n const headers = ctx.step.args.headers as string[] | undefined\n const columnsJson = ctx.step.args.columns as MediaArgJson | undefined\n const columns: Array<{ header: string; values?: CellValue[] }> | undefined =\n (columnsJson as Array<{ header: string; values?: CellValue[] }> | undefined) ??\n headers?.map((header) => ({ header }) as { header: string; values?: CellValue[] })\n if (!Array.isArray(columns) || columns.length === 0) {\n fail(verb, `provide headers=a,b or columns='[{\"header\":\"X\",\"values\":[1]}]'`)\n }\n const before = argOf<number>(ctx.step, 'before')\n const after = argOf<number>(ctx.step, 'after')\n return withWorkbook(ctx, verb, (wb) => {\n const ws = resolveSheet(verb, wb, argOf<string | number>(ctx.step, 'sheet'))\n const insertAt =\n before !== undefined ? before : after !== undefined ? after + 1 : ws.columnCount + 1\n for (const [i, col] of columns!.entries()) {\n if (typeof col?.header !== 'string') fail(verb, 'every column needs a string header')\n ws.spliceColumns(insertAt + i, 0, [\n col.header,\n ...(col.values ?? []).map((v) => asCellValue(verb, v)),\n ])\n }\n return { added: columns!.length }\n })\n}\n\n/** `sheet.update_cells` — set cells by A1 address or row/col. Leading `=` writes a formula. */\nexport const sheetUpdateCellsStep: StepImpl = async (ctx) => {\n const verb = 'sheet update_cells'\n const updates = ctx.step.args.updates as MediaArgJson\n if (!Array.isArray(updates) || updates.length === 0) {\n fail(\n verb,\n `updates must be a non-empty JSON array, e.g. updates='[{\"address\":\"B2\",\"value\":3}]'`\n )\n }\n return withWorkbook(ctx, verb, (wb) => {\n const ws = resolveSheet(verb, wb, argOf<string | number>(ctx.step, 'sheet'))\n let modified = 0\n for (const raw of updates as Array<Record<string, unknown>>) {\n const address = raw.address as string | undefined\n const row = raw.row as number | undefined\n const col = raw.col as number | string | undefined\n let cell: ExcelJSNS.Cell\n if (address) {\n cell = ws.getCell(address)\n } else if (row !== undefined && col !== undefined) {\n cell =\n typeof col === 'string'\n ? ws.getCell(row, columnLetterToNumber(col))\n : ws.getCell(row, col)\n } else {\n fail(verb, 'each update needs address, or both row and col')\n continue\n }\n const value = raw.value\n if (typeof value === 'string' && value.startsWith('=')) {\n cell.value = { formula: value.slice(1) } as ExcelJSNS.CellValue\n } else {\n cell.value = asCellValue(verb, value)\n }\n modified += 1\n }\n return { modified }\n })\n}\n\n/** `sheet.delete_rows` — delete 1-based rows (bottom-up so indices stay valid). */\nexport const sheetDeleteRowsStep: StepImpl = async (ctx) => {\n const verb = 'sheet delete_rows'\n const rows = ctx.step.args.rows as number[]\n return withWorkbook(ctx, verb, (wb) => {\n const ws = resolveSheet(verb, wb, argOf<string | number>(ctx.step, 'sheet'))\n for (const r of [...rows].sort((a, b) => b - a)) ws.spliceRows(r, 1)\n return { removed: rows.length }\n })\n}\n\n/** `sheet.delete_columns` — delete 1-based columns. */\nexport const sheetDeleteColumnsStep: StepImpl = async (ctx) => {\n const verb = 'sheet delete_columns'\n const columns = ctx.step.args.columns as number[]\n return withWorkbook(ctx, verb, (wb) => {\n const ws = resolveSheet(verb, wb, argOf<string | number>(ctx.step, 'sheet'))\n for (const c of [...columns].sort((a, b) => b - a)) ws.spliceColumns(c, 1)\n return { removed: columns.length }\n })\n}\n\n/** `sheet.rename_sheet` — rename by NAME (the server contract; index targeting is rejected). */\nexport const sheetRenameSheetStep: StepImpl = async (ctx) => {\n const verb = 'sheet rename_sheet'\n const sheet = argOf<string | number>(ctx.step, 'sheet') as string\n const to = argOf<string>(ctx.step, 'to') as string\n return withWorkbook(ctx, verb, (wb) => {\n const ws = wb.getWorksheet(sheet)\n if (!ws) {\n const names = wb.worksheets.map((w) => `\"${w.name}\"`).join(', ')\n fail(verb, `rename targets a sheet NAME; no sheet named \"${sheet}\". Sheets: ${names}`)\n }\n ws!.name = to\n return { modified: 1 }\n })\n}\n\n/** `sheet.add_sheet` — add a worksheet, optionally at a 1-based position. */\nexport const sheetAddSheetStep: StepImpl = async (ctx) => {\n const verb = 'sheet add_sheet'\n const name = argOf<string>(ctx.step, 'name') as string\n const at = argOf<number>(ctx.step, 'at')\n return withWorkbook(ctx, verb, (wb) => {\n if (wb.getWorksheet(name)) fail(verb, `a sheet named \"${name}\" already exists`)\n const ws = wb.addWorksheet(name)\n if (at !== undefined) {\n const all = wb.worksheets\n const wsIdx = all.indexOf(ws)\n if (wsIdx !== at - 1) {\n all.forEach((w, i) => {\n ;(w as unknown as { orderNo: number }).orderNo =\n w === ws ? at : i + 1 >= at && i < wsIdx ? i + 2 : i + 1\n })\n }\n }\n return { added: 1 }\n })\n}\n\n/** `sheet.remove_sheet` — remove by NAME (the server contract). */\nexport const sheetRemoveSheetStep: StepImpl = async (ctx) => {\n const verb = 'sheet remove_sheet'\n const sheet = argOf<string | number>(ctx.step, 'sheet') as string\n return withWorkbook(ctx, verb, (wb) => {\n const ws = wb.getWorksheet(sheet)\n if (!ws) {\n const names = wb.worksheets.map((w) => `\"${w.name}\"`).join(', ')\n fail(verb, `remove targets a sheet NAME; no sheet named \"${sheet}\". Sheets: ${names}`)\n }\n wb.removeWorksheet(ws!.id)\n return { removed: 1 }\n })\n}\n\n/** `sheet.reorder_sheets` — every sheet exactly once, by name or 1-based index. */\nexport const sheetReorderSheetsStep: StepImpl = async (ctx) => {\n const verb = 'sheet reorder_sheets'\n const order = ctx.step.args.order as MediaArgJson\n if (!Array.isArray(order) || order.length === 0) {\n fail(verb, `order must be a JSON array of names/indices, e.g. order='[\"Summary\",2]'`)\n }\n return withWorkbook(ctx, verb, (wb) => {\n const refs = order as Array<string | number>\n if (refs.length !== wb.worksheets.length) {\n fail(\n verb,\n `order must include every worksheet exactly once (the workbook has ${wb.worksheets.length})`\n )\n }\n const reordered: ExcelJSNS.Worksheet[] = []\n const seen = new Set<number>()\n for (const ref of refs) {\n const ws = typeof ref === 'number' ? wb.worksheets[ref - 1] : wb.getWorksheet(ref)\n if (!ws) fail(verb, `sheet not found: ${String(ref)}`)\n if (seen.has(ws!.id)) fail(verb, `duplicate sheet reference: ${String(ref)}`)\n seen.add(ws!.id)\n reordered.push(ws!)\n }\n // ExcelJS serializes by orderNo; the worksheets getter returns a sorted clone.\n reordered.forEach((ws, i) => {\n ;(ws as unknown as { orderNo: number }).orderNo = i + 1\n })\n return { modified: reordered.length }\n })\n}\n\n/** `sheet.transform_table` — rename/select/drop columns by header name. */\nexport const sheetTransformTableStep: StepImpl = async (ctx) => {\n const verb = 'sheet transform_table'\n const headerRow = argOf<number>(ctx.step, 'header_row') ?? 1\n const rename = ctx.step.args.rename as Array<{ from: string; to: string }> | undefined\n const select = ctx.step.args.select as string[] | undefined\n const drop = ctx.step.args.drop as string[] | undefined\n return withWorkbook(ctx, verb, (wb) => {\n const ws = resolveSheet(verb, wb, argOf<string | number>(ctx.step, 'sheet'))\n let modified = 0\n const headerMap = new Map<string, number>()\n ws.getRow(headerRow).eachCell({ includeEmpty: false }, (cell, colNumber) => {\n if (typeof cell.value === 'string') headerMap.set(cell.value, colNumber)\n })\n if (rename) {\n for (const { from, to } of rename) {\n const colNum = headerMap.get(from)\n if (colNum !== undefined) {\n ws.getRow(headerRow).getCell(colNum).value = to\n headerMap.delete(from)\n headerMap.set(to, colNum)\n modified += 1\n }\n }\n }\n if (drop) {\n const cols = drop\n .map((name) => headerMap.get(name))\n .filter((n): n is number => n !== undefined)\n .sort((a, b) => b - a)\n for (const col of cols) {\n ws.spliceColumns(col, 1)\n modified += 1\n }\n }\n if (select) {\n const keep = new Set(select)\n const cols: number[] = []\n ws.getRow(headerRow).eachCell({ includeEmpty: false }, (cell, colNumber) => {\n if (typeof cell.value === 'string' && !keep.has(cell.value)) cols.push(colNumber)\n })\n cols.sort((a, b) => b - a)\n for (const col of cols) {\n ws.spliceColumns(col, 1)\n modified += 1\n }\n }\n return { modified }\n })\n}\n\n/** The sheet step registry fragment, keyed by canonical verb id. */\nexport const SHEET_STEPS: ReadonlyArray<[string, StepImpl]> = [\n ['sheet.add_rows', sheetAddRowsStep],\n ['sheet.add_columns', sheetAddColumnsStep],\n ['sheet.update_cells', sheetUpdateCellsStep],\n ['sheet.delete_rows', sheetDeleteRowsStep],\n ['sheet.delete_columns', sheetDeleteColumnsStep],\n ['sheet.rename_sheet', sheetRenameSheetStep],\n ['sheet.add_sheet', sheetAddSheetStep],\n ['sheet.remove_sheet', sheetRemoveSheetStep],\n ['sheet.reorder_sheets', sheetReorderSheetsStep],\n ['sheet.transform_table', sheetTransformTableStep],\n]\n","/**\n * `slides.*` step implementations: native PPTX container mutation via JSZip + targeted XML\n * edits, on in-memory bytes.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. Ported from the source server's\n * slides adapters (regex-over-zip XML surgery — no XML parser dependency). PPTX is mutated\n * natively; ODP inputs are normalized to PPTX through the configured `convert` engine first,\n * degrading to a readable failure when none is configured. All implementations are\n * cross-environment (jszip operates on Uint8Array).\n */\n\nimport { argOf } from '../runtime'\nimport { isError } from '@nhtio/adk/guards'\nimport { E_MEDIA_STEP_FAILED } from '../exceptions'\nimport { MIME, replaceExtension, unsupportedForMutationReason } from '../formats'\nimport type { default as JSZipNS } from 'jszip'\nimport type { MediaRef, MediaArgJson } from '../plan'\nimport type { StepImpl, StepContext, StepPayload } from '../runtime'\n\ntype JSZipModule = typeof JSZipNS\n\nlet zipPromise: Promise<JSZipModule> | undefined\nconst jszip = (): Promise<JSZipModule> => {\n zipPromise ??= import('jszip').then((m) => ('default' in m ? m.default : m) as JSZipModule)\n return zipPromise\n}\n\nconst SLIDE_REL_TYPE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide'\n\nconst fail = (verb: string, message: string): never => {\n throw new E_MEDIA_STEP_FAILED([verb, message])\n}\n\n// ── XML helpers (ported verbatim semantics) ──────────────────────────────────\n\nconst escapeXml = (value: string): string =>\n value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n\nconst escapeRegex = (value: string): string => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n/** Pure posix-style path resolution for zip entries (no node:path). */\nconst resolveZipPath = (basePart: string, relTarget: string): string => {\n const baseDir = basePart.split('/').slice(0, -1)\n const parts = [...baseDir, ...relTarget.split('/')]\n const out: string[] = []\n for (const part of parts) {\n if (part === '' || part === '.') continue\n if (part === '..') out.pop()\n else out.push(part)\n }\n return out.join('/')\n}\n\ninterface SlideEntry {\n rid: string\n slideId: number\n sldIdTag: string\n target: string\n title?: string\n}\n\ninterface ParsedPresentation {\n presentationXml: string\n relsXml: string\n entries: SlideEntry[]\n}\n\nconst readZipText = async (verb: string, zip: JSZipNS, path: string): Promise<string> => {\n const file = zip.file(path)\n if (!file) fail(verb, `the presentation is missing an expected part: ${path}`)\n return file!.async('text')\n}\n\nconst parseRelationshipTarget = (relsXml: string, relId: string): string | null => {\n const re = new RegExp(\n `<Relationship\\\\b[^>]*Id=\"${escapeRegex(relId)}\"[^>]*Target=\"([^\"]+)\"[^>]*>`,\n 'i'\n )\n return relsXml.match(re)?.[1] ?? null\n}\n\nconst parsePresentation = async (verb: string, zip: JSZipNS): Promise<ParsedPresentation> => {\n const presentationXml = await readZipText(verb, zip, 'ppt/presentation.xml')\n const relsXml = await readZipText(verb, zip, 'ppt/_rels/presentation.xml.rels')\n const sldIdListMatch = presentationXml.match(/<p:sldIdLst>([\\s\\S]*?)<\\/p:sldIdLst>/)\n if (!sldIdListMatch) fail(verb, 'the presentation has no slide list (corrupt PPTX?)')\n const sldIdTags = sldIdListMatch![1].match(/<p:sldId\\b[^>]*\\/>/g) ?? []\n const entries: SlideEntry[] = []\n for (const tag of sldIdTags) {\n const rid = tag.match(/r:id=\"([^\"]+)\"/)?.[1]\n const idText = tag.match(/\\bid=\"(\\d+)\"/)?.[1]\n if (!rid || !idText) continue\n const target = parseRelationshipTarget(relsXml, rid)\n if (!target) continue\n const slidePath = resolveZipPath('ppt/presentation.xml', target)\n let title: string | undefined\n const slideFile = zip.file(slidePath)\n if (slideFile) {\n const slideXml = await slideFile.async('text')\n title = slideXml.match(/<p:cSld\\b[^>]*\\bname=\"([^\"]*)\"/)?.[1]\n }\n entries.push({ rid, slideId: Number(idText), sldIdTag: tag, target, title })\n }\n return { presentationXml, relsXml, entries }\n}\n\nconst replaceSlideIdList = (presentationXml: string, tags: string[]): string =>\n presentationXml.replace(\n /<p:sldIdLst>[\\s\\S]*?<\\/p:sldIdLst>/,\n `<p:sldIdLst>${tags.join('')}</p:sldIdLst>`\n )\n\n/** Resolve a slide by the frozen `slide=` rule: digits = 1-based index, otherwise title. */\nconst resolveSlide = (\n verb: string,\n entries: SlideEntry[],\n slideArg: string | number | undefined\n): SlideEntry => {\n if (slideArg === undefined) {\n const first = entries[0]\n if (!first) fail(verb, 'the presentation has no slides')\n return first\n }\n // Frozen 0.11: bare number targets by 1-based index; quoted string targets by title.\n if (typeof slideArg === 'number') {\n const found = entries[slideArg - 1]\n if (!found) {\n fail(verb, `slide index ${slideArg} is out of range (1-based; ${entries.length} slides)`)\n }\n return found!\n }\n const byTitle = entries.find((e) => e.title === slideArg)\n if (!byTitle) fail(verb, `no slide titled \"${slideArg}\"`)\n return byTitle!\n}\n\nconst getMaxRidNumber = (relsXml: string): number => {\n let max = 0\n for (const match of relsXml.matchAll(/\\bId=\"rId(\\d+)\"/g)) max = Math.max(max, Number(match[1]))\n return max\n}\n\nconst getMaxSlideNumber = (zip: JSZipNS): number => {\n let max = 0\n for (const name of Object.keys(zip.files)) {\n const match = name.match(/^ppt\\/slides\\/slide(\\d+)\\.xml$/)\n if (match) max = Math.max(max, Number(match[1]))\n }\n return max\n}\n\nconst getMaxSlideId = (entries: SlideEntry[]): number =>\n entries.reduce((max, e) => Math.max(max, e.slideId), 255)\n\nconst ensureSlideContentType = (contentTypesXml: string, slideNumber: number): string => {\n const partName = `/ppt/slides/slide${slideNumber}.xml`\n if (contentTypesXml.includes(`PartName=\"${partName}\"`)) return contentTypesXml\n const override =\n `<Override PartName=\"${partName}\" ` +\n `ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slide+xml\"/>`\n return contentTypesXml.replace('</Types>', `${override}</Types>`)\n}\n\nconst setSlideTitle = (slideXml: string, title: string): string => {\n if (/<p:cSld\\b[^>]*\\bname=\"[^\"]*\"/.test(slideXml)) {\n return slideXml.replace(/(<p:cSld\\b[^>]*\\bname=\")[^\"]*(\")/, `$1${escapeXml(title)}$2`)\n }\n return slideXml\n}\n\n// ── lifecycle ────────────────────────────────────────────────────────────────\n\n/** Acquire pptx bytes, converting ODP to PPTX via the engine registry. */\nconst acquirePptx = async (ctx: StepContext, verb: string): Promise<Uint8Array> => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n if (mime === MIME.PPTX) return ctx.payload.bytes\n if (mime === MIME.ODP) {\n if (!ctx.engines.hasConvert(mime, 'pptx')) {\n fail(\n verb,\n 'this input is ODP — an engine that converts it to PPTX is required first, and none is configured. Do not retry this verb on this media in this deployment.'\n )\n }\n const result = await ctx.engines.convert({\n bytes: ctx.payload.bytes,\n mimeType: mime,\n filename: ctx.payload.filename,\n to: 'pptx',\n signal: ctx.signal,\n })\n const output = result.outputs[0]\n if (!output) fail(verb, 'normalizing the presentation to PPTX produced no output')\n return output!.bytes\n }\n const reason = unsupportedForMutationReason(mime)\n if (reason) fail(verb, reason)\n fail(verb, `slides operations expect a presentation; the media is ${mime}`)\n /* unreachable */ throw new Error('unreachable')\n}\n\nconst withPresentation = async (\n ctx: StepContext,\n verb: string,\n mutate: (zip: JSZipNS, parsed: ParsedPresentation) => Promise<void>\n): Promise<{ kind: 'media'; payload: StepPayload }> => {\n const bytes = await acquirePptx(ctx, verb)\n const JSZip = await jszip()\n let zip: JSZipNS\n try {\n zip = await JSZip.loadAsync(bytes)\n } catch (err) {\n const detail = isError(err) ? err.message : String(err)\n fail(verb, `could not open the presentation: ${detail}`)\n /* unreachable */ throw err\n }\n const parsed = await parsePresentation(verb, zip)\n await mutate(zip, parsed)\n const out = await zip.generateAsync({ type: 'uint8array', compression: 'DEFLATE' })\n return {\n kind: 'media',\n payload: {\n bytes: out,\n mimeType: MIME.PPTX,\n filename: replaceExtension(ctx.payload.filename, 'pptx'),\n },\n }\n}\n\n// ── step implementations ─────────────────────────────────────────────────────\n\n/** `slides.add` — clone the last slide as a template, optionally retitle/position it. */\nexport const slidesAddStep: StepImpl = async (ctx) => {\n const verb = 'slides add'\n const at = argOf<number>(ctx.step, 'at')\n const title = argOf<string>(ctx.step, 'title')\n return withPresentation(ctx, verb, async (zip, parsed) => {\n if (parsed.entries.length === 0) fail(verb, 'the presentation has no slides to clone from')\n const template = parsed.entries[parsed.entries.length - 1]\n const templatePath = resolveZipPath('ppt/presentation.xml', template.target)\n const templateXml = await readZipText(verb, zip, templatePath)\n const newSlideNumber = getMaxSlideNumber(zip) + 1\n const newSlidePath = `ppt/slides/slide${newSlideNumber}.xml`\n zip.file(newSlidePath, title ? setSlideTitle(templateXml, title) : templateXml)\n const templateNum = templatePath.match(/slide(\\d+)\\.xml$/)?.[1]\n const templateRels = templateNum\n ? zip.file(`ppt/slides/_rels/slide${templateNum}.xml.rels`)\n : null\n if (templateRels) {\n const relsXml = await templateRels.async('text')\n zip.file(\n `ppt/slides/_rels/slide${newSlideNumber}.xml.rels`,\n relsXml.replace(/<Relationship\\b[^>]*Type=\"[^\"]*notesSlide\"[^>]*\\/>/g, '')\n )\n }\n const newRid = `rId${getMaxRidNumber(parsed.relsXml) + 1}`\n const newSldTag = `<p:sldId id=\"${getMaxSlideId(parsed.entries) + 1}\" r:id=\"${newRid}\"/>`\n const relNode = `<Relationship Id=\"${newRid}\" Type=\"${SLIDE_REL_TYPE}\" Target=\"slides/slide${newSlideNumber}.xml\"/>`\n zip.file(\n 'ppt/_rels/presentation.xml.rels',\n parsed.relsXml.replace('</Relationships>', `${relNode}</Relationships>`)\n )\n const insertAt =\n at !== undefined\n ? Math.min(Math.max(1, at), parsed.entries.length + 1)\n : parsed.entries.length + 1\n const tags = parsed.entries.map((e) => e.sldIdTag)\n tags.splice(insertAt - 1, 0, newSldTag)\n zip.file('ppt/presentation.xml', replaceSlideIdList(parsed.presentationXml, tags))\n const contentTypes = await readZipText(verb, zip, '[Content_Types].xml')\n zip.file('[Content_Types].xml', ensureSlideContentType(contentTypes, newSlideNumber))\n })\n}\n\n/** `slides.update_text` — replace text in the first node or a named placeholder shape. */\nexport const slidesUpdateTextStep: StepImpl = async (ctx) => {\n const verb = 'slides update_text'\n const text = argOf<string>(ctx.step, 'text') as string\n const placeholder = argOf<string>(ctx.step, 'placeholder')\n return withPresentation(ctx, verb, async (zip, parsed) => {\n const target = resolveSlide(verb, parsed.entries, argOf<string | number>(ctx.step, 'slide'))\n const slidePath = resolveZipPath('ppt/presentation.xml', target.target)\n const slideXml = await readZipText(verb, zip, slidePath)\n let updated = slideXml\n let changed = false\n if (placeholder) {\n let placeholderFound = false\n updated = slideXml.replace(/<p:sp\\b[\\s\\S]*?<\\/p:sp>/g, (shapeXml) => {\n if (\n !new RegExp(`<p:cNvPr\\\\b[^>]*\\\\bname=\"${escapeRegex(placeholder)}\"[^>]*>`, 'i').test(\n shapeXml\n )\n ) {\n return shapeXml\n }\n placeholderFound = true\n return shapeXml.replace(/<a:t>[\\s\\S]*?<\\/a:t>/, () => {\n changed = true\n return `<a:t>${escapeXml(text)}</a:t>`\n })\n })\n if (!placeholderFound)\n fail(verb, `no placeholder named \"${placeholder}\" on the selected slide`)\n } else {\n updated = slideXml.replace(/<a:t>[\\s\\S]*?<\\/a:t>/, () => {\n changed = true\n return `<a:t>${escapeXml(text)}</a:t>`\n })\n }\n if (!changed) fail(verb, 'no text node found on the selected slide')\n zip.file(slidePath, updated)\n })\n}\n\n/** `slides.update_table` — set table cell text by 1-based row/col. */\nexport const slidesUpdateTableStep: StepImpl = async (ctx) => {\n const verb = 'slides update_table'\n const updates = ctx.step.args.updates as MediaArgJson\n if (!Array.isArray(updates) || updates.length === 0) {\n fail(verb, `updates must be a JSON array: updates='[{\"row\":1,\"col\":2,\"value\":\"x\"}]'`)\n }\n return withPresentation(ctx, verb, async (zip, parsed) => {\n const target = resolveSlide(verb, parsed.entries, argOf<string | number>(ctx.step, 'slide'))\n const slidePath = resolveZipPath('ppt/presentation.xml', target.target)\n let slideXml = await readZipText(verb, zip, slidePath)\n const tableMatch = slideXml.match(/<a:tbl>[\\s\\S]*?<\\/a:tbl>/)\n if (!tableMatch) fail(verb, 'no table found on the selected slide')\n let tableXml = tableMatch![0]\n const rowMatches = tableXml.match(/<a:tr\\b[\\s\\S]*?<\\/a:tr>/g) ?? []\n for (const raw of updates as Array<Record<string, unknown>>) {\n const row = Number(raw.row)\n const col = Number(raw.col)\n const value = String(raw.value ?? '')\n const rowIndex = row - 1\n const colIndex = col - 1\n if (rowIndex < 0 || colIndex < 0 || rowIndex >= rowMatches.length) {\n fail(verb, `table cell out of range: r${row}c${col} (1-based)`)\n }\n const rowXml = rowMatches[rowIndex]\n const cellMatches = rowXml.match(/<a:tc\\b[\\s\\S]*?<\\/a:tc>/g) ?? []\n if (colIndex >= cellMatches.length)\n fail(verb, `table cell out of range: r${row}c${col} (1-based)`)\n const cellXml = cellMatches[colIndex]\n if (!/<a:t>/.test(cellXml)) fail(verb, `cell r${row}c${col} has no text node`)\n cellMatches[colIndex] = cellXml.replace(\n /<a:t>[\\s\\S]*?<\\/a:t>/,\n `<a:t>${escapeXml(value)}</a:t>`\n )\n rowMatches[rowIndex] = rowXml.replace(/<a:tc\\b[\\s\\S]*?<\\/a:tc>/g, () => cellMatches.shift()!)\n }\n tableXml = tableXml.replace(/<a:tr\\b[\\s\\S]*?<\\/a:tr>/g, () => rowMatches.shift()!)\n slideXml = slideXml.replace(/<a:tbl>[\\s\\S]*?<\\/a:tbl>/, tableXml)\n zip.file(slidePath, slideXml)\n })\n}\n\n/** `slides.update_image` — replace an image part's bytes with another media (`with=@id`). */\nexport const slidesUpdateImageStep: StepImpl = async (ctx) => {\n const verb = 'slides update_image'\n const ref = ctx.step.args.with as MediaRef\n const placeholder = argOf<string>(ctx.step, 'placeholder')\n if (ref.kind !== 'id') fail(verb, 'builder refs are not supported here; use an @id ref')\n const replacement = await ctx.resolveRef((ref as { kind: 'id'; id: string }).id)\n return withPresentation(ctx, verb, async (zip, parsed) => {\n const target = resolveSlide(verb, parsed.entries, argOf<string | number>(ctx.step, 'slide'))\n const slidePath = resolveZipPath('ppt/presentation.xml', target.target)\n const slideXml = await readZipText(verb, zip, slidePath)\n const slideNum = slidePath.match(/slide(\\d+)\\.xml$/)?.[1]\n if (!slideNum) fail(verb, 'unable to resolve the slide number (corrupt PPTX?)')\n const relsPath = `ppt/slides/_rels/slide${slideNum}.xml.rels`\n const relsXml = await readZipText(verb, zip, relsPath)\n let imagePartPath: string | null = null\n if (placeholder) {\n for (const picXml of slideXml.match(/<p:pic\\b[\\s\\S]*?<\\/p:pic>/g) ?? []) {\n if (\n !new RegExp(`<p:cNvPr\\\\b[^>]*\\\\bname=\"${escapeRegex(placeholder)}\"[^>]*>`, 'i').test(\n picXml\n )\n ) {\n continue\n }\n const rid = picXml.match(/<a:blip\\b[^>]*\\br:embed=\"([^\"]+)\"/i)?.[1]\n if (rid) {\n const relTarget = parseRelationshipTarget(relsXml, rid)\n if (relTarget) imagePartPath = resolveZipPath(relsPath, relTarget)\n }\n break\n }\n if (!imagePartPath)\n fail(verb, `no image placeholder named \"${placeholder}\" on the selected slide`)\n } else {\n const fallback = relsXml.match(\n /<Relationship\\b[^>]*Type=\"[^\"]*\\/image\"[^>]*Target=\"([^\"]+)\"[^>]*>/i\n )\n if (fallback) imagePartPath = resolveZipPath(relsPath, fallback[1])\n }\n if (!imagePartPath) fail(verb, 'no image relationship found on the selected slide')\n zip.file(imagePartPath!, replacement.bytes)\n })\n}\n\n/** `slides.update_chart` — overwrite the chart's cached values in document order. */\nexport const slidesUpdateChartStep: StepImpl = async (ctx) => {\n const verb = 'slides update_chart'\n const data = ctx.step.args.data as MediaArgJson\n if (!Array.isArray(data) || data.length === 0) {\n fail(verb, `data must be a non-empty JSON array of arrays: data='[[\"Q1\",10]]'`)\n }\n return withPresentation(ctx, verb, async (zip, parsed) => {\n const target = resolveSlide(verb, parsed.entries, argOf<string | number>(ctx.step, 'slide'))\n const slidePath = resolveZipPath('ppt/presentation.xml', target.target)\n const slideNum = slidePath.match(/slide(\\d+)\\.xml$/)?.[1]\n if (!slideNum) fail(verb, 'unable to resolve the slide number (corrupt PPTX?)')\n const relsPath = `ppt/slides/_rels/slide${slideNum}.xml.rels`\n const relsXml = await readZipText(verb, zip, relsPath)\n const chartRel = relsXml.match(\n /<Relationship\\b[^>]*Type=\"[^\"]*\\/chart\"[^>]*Target=\"([^\"]+)\"[^>]*>/i\n )\n if (!chartRel) fail(verb, 'no chart found on the selected slide')\n const chartPath = resolveZipPath(relsPath, chartRel![1])\n let chartXml = await readZipText(verb, zip, chartPath)\n const values = (data as unknown[][]).flat().map((v) => String(v))\n let replaced = 0\n chartXml = chartXml.replace(/<c:v>[\\s\\S]*?<\\/c:v>/g, (full) => {\n if (replaced >= values.length) return full\n const next = `<c:v>${escapeXml(values[replaced])}</c:v>`\n replaced += 1\n return next\n })\n if (replaced === 0) fail(verb, 'the chart has no cached values to update')\n zip.file(chartPath, chartXml)\n })\n}\n\n/** `slides.delete` — remove slides by 1-based index (cannot remove all). */\nexport const slidesDeleteStep: StepImpl = async (ctx) => {\n const verb = 'slides delete'\n const slides = ctx.step.args.slides as number[]\n return withPresentation(ctx, verb, async (zip, parsed) => {\n const unique = [...new Set(slides)]\n for (const index of unique) {\n if (!Number.isInteger(index) || index < 1 || index > parsed.entries.length) {\n fail(\n verb,\n `slide index ${index} is out of range (1-based; ${parsed.entries.length} slides)`\n )\n }\n }\n const toDelete = new Set(unique)\n const kept = parsed.entries.filter((_, idx) => !toDelete.has(idx + 1))\n if (kept.length === 0) fail(verb, 'cannot delete every slide in the presentation')\n zip.file(\n 'ppt/presentation.xml',\n replaceSlideIdList(\n parsed.presentationXml,\n kept.map((e) => e.sldIdTag)\n )\n )\n let relsXml = parsed.relsXml\n parsed.entries.forEach((entry, idx) => {\n if (!toDelete.has(idx + 1)) return\n const targetPath = resolveZipPath('ppt/presentation.xml', entry.target)\n zip.remove(targetPath)\n const slideNum = targetPath.match(/slide(\\d+)\\.xml$/)?.[1]\n if (slideNum) zip.remove(`ppt/slides/_rels/slide${slideNum}.xml.rels`)\n relsXml = relsXml.replace(\n new RegExp(`<Relationship\\\\b[^>]*Id=\"${entry.rid}\"[^>]*/>`, 'g'),\n ''\n )\n })\n zip.file('ppt/_rels/presentation.xml.rels', relsXml)\n })\n}\n\n/** `slides.reorder` — every slide exactly once, by 1-based index. */\nexport const slidesReorderStep: StepImpl = async (ctx) => {\n const verb = 'slides reorder'\n const order = ctx.step.args.order as number[]\n return withPresentation(ctx, verb, async (zip, parsed) => {\n if (order.length !== parsed.entries.length) {\n fail(verb, `order must list all ${parsed.entries.length} slides exactly once`)\n }\n const seen = new Set<number>()\n const reordered: SlideEntry[] = []\n for (const index of order) {\n if (!Number.isInteger(index) || index < 1 || index > parsed.entries.length) {\n fail(verb, `slide index ${index} is out of range (1-based)`)\n }\n if (seen.has(index)) fail(verb, `duplicate slide index: ${index}`)\n seen.add(index)\n reordered.push(parsed.entries[index - 1])\n }\n zip.file(\n 'ppt/presentation.xml',\n replaceSlideIdList(\n parsed.presentationXml,\n reordered.map((e) => e.sldIdTag)\n )\n )\n })\n}\n\n/** `slides.duplicate` — copy a slide, optionally inserting at a position. */\nexport const slidesDuplicateStep: StepImpl = async (ctx) => {\n const verb = 'slides duplicate'\n const slide = argOf<number>(ctx.step, 'slide') as number\n const at = argOf<number>(ctx.step, 'at')\n return withPresentation(ctx, verb, async (zip, parsed) => {\n if (!Number.isInteger(slide) || slide < 1 || slide > parsed.entries.length) {\n fail(verb, `slide index ${slide} is out of range (1-based; ${parsed.entries.length} slides)`)\n }\n const source = parsed.entries[slide - 1]\n const sourcePath = resolveZipPath('ppt/presentation.xml', source.target)\n const sourceXml = await readZipText(verb, zip, sourcePath)\n const newSlideNumber = getMaxSlideNumber(zip) + 1\n zip.file(`ppt/slides/slide${newSlideNumber}.xml`, sourceXml)\n const sourceNum = sourcePath.match(/slide(\\d+)\\.xml$/)?.[1]\n if (sourceNum) {\n const sourceRels = zip.file(`ppt/slides/_rels/slide${sourceNum}.xml.rels`)\n if (sourceRels) {\n const relsXml = await sourceRels.async('text')\n zip.file(\n `ppt/slides/_rels/slide${newSlideNumber}.xml.rels`,\n relsXml.replace(/<Relationship\\b[^>]*Type=\"[^\"]*notesSlide\"[^>]*\\/>/g, '')\n )\n }\n }\n const newRid = `rId${getMaxRidNumber(parsed.relsXml) + 1}`\n const newTag = `<p:sldId id=\"${getMaxSlideId(parsed.entries) + 1}\" r:id=\"${newRid}\"/>`\n const relNode = `<Relationship Id=\"${newRid}\" Type=\"${SLIDE_REL_TYPE}\" Target=\"slides/slide${newSlideNumber}.xml\"/>`\n zip.file(\n 'ppt/_rels/presentation.xml.rels',\n parsed.relsXml.replace('</Relationships>', `${relNode}</Relationships>`)\n )\n const targetPos =\n at !== undefined ? Math.min(Math.max(1, at), parsed.entries.length + 1) : slide + 1\n const tags = parsed.entries.map((e) => e.sldIdTag)\n tags.splice(targetPos - 1, 0, newTag)\n zip.file('ppt/presentation.xml', replaceSlideIdList(parsed.presentationXml, tags))\n const contentTypes = await readZipText(verb, zip, '[Content_Types].xml')\n zip.file('[Content_Types].xml', ensureSlideContentType(contentTypes, newSlideNumber))\n })\n}\n\n/** Count slides in pptx bytes — exported for spec assertions. */\nexport const countSlides = async (bytes: Uint8Array): Promise<number> => {\n const JSZip = await jszip()\n const zip = await JSZip.loadAsync(bytes)\n const parsed = await parsePresentation('slides', zip)\n return parsed.entries.length\n}\n\n/** The slides step registry fragment, keyed by canonical verb id. */\nexport const SLIDES_STEPS: ReadonlyArray<[string, StepImpl]> = [\n ['slides.add', slidesAddStep],\n ['slides.update_text', slidesUpdateTextStep],\n ['slides.update_table', slidesUpdateTableStep],\n ['slides.update_image', slidesUpdateImageStep],\n ['slides.update_chart', slidesUpdateChartStep],\n ['slides.delete', slidesDeleteStep],\n ['slides.reorder', slidesReorderStep],\n ['slides.duplicate', slidesDuplicateStep],\n]\n","/**\n * Ingest-depth step extensions: the unified `extract.text` format dispatch (PDF text layer,\n * DOCX via mammoth, XLSX via ExcelJS, ODT/ODS via ODF XML, PPTX via slide XML, images via the\n * OCR engine) and format-aware `extract.metadata`.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. Ported from the source server's\n * four extractors, collapsed into one verb that routes on the resolved media's format family\n * (the single biggest order-out-of-chaos win — the model says `extract text` and doesn't care\n * what the container is). OCR runs through the configured `ocr` engine when the input is an\n * image, or when a PDF has no text layer with `ocr=auto`, or always with `ocr=force`.\n */\n\nimport { argOf } from '../runtime'\nimport { decodeText } from './text'\nimport { isError } from '@nhtio/adk/guards'\nimport { MIME, familyOf } from '../formats'\nimport { E_MEDIA_STEP_FAILED } from '../exceptions'\nimport type { default as JSZipNS } from 'jszip'\nimport type { default as ExcelJSNS } from 'exceljs'\nimport type { StepImpl, StepContext } from '../runtime'\n\ntype JSZipModule = typeof JSZipNS\n\nlet zipPromise: Promise<JSZipModule> | undefined\nconst jszip = (): Promise<JSZipModule> => {\n zipPromise ??= import('jszip').then((m) => ('default' in m ? m.default : m) as JSZipModule)\n return zipPromise\n}\n\nconst fail = (verb: string, message: string): never => {\n throw new E_MEDIA_STEP_FAILED([verb, message])\n}\n\nconst VERB = 'extract text'\n\n// ── per-format extraction ────────────────────────────────────────────────────\n\nconst extractPdfText = async (ctx: StepContext): Promise<string> => {\n const { PDFParse } = await import('pdf-parse')\n try {\n const parser = new PDFParse({ data: ctx.payload.bytes })\n const result = await parser.getText()\n return result.text ?? ''\n } catch (err) {\n const detail = isError(err) ? err.message : String(err)\n fail(VERB, `could not read the PDF: ${detail}`)\n /* unreachable */ throw err\n }\n}\n\nconst extractDocxText = async (ctx: StepContext): Promise<string> => {\n const mod = await import('mammoth')\n const mammoth = ('extractRawText' in mod ? mod : (mod as { default: unknown }).default) as {\n extractRawText: (input: Record<string, unknown>) => Promise<{ value: string }>\n }\n const bytes = ctx.payload.bytes\n // mammoth's Node entry expects { buffer: Buffer }; its browser entry expects { arrayBuffer }.\n const input =\n typeof globalThis.Buffer !== 'undefined'\n ? { buffer: globalThis.Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength) }\n : {\n arrayBuffer: bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength\n ) as ArrayBuffer,\n }\n const result = await mammoth.extractRawText(input)\n return result.value\n}\n\nconst extractXlsxText = async (ctx: StepContext): Promise<string> => {\n const mod = await import('exceljs')\n const ExcelJS = ('default' in mod ? mod.default : mod) as typeof ExcelJSNS\n const wb = new ExcelJS.Workbook()\n await wb.xlsx.load(\n ctx.payload.bytes.buffer.slice(\n ctx.payload.bytes.byteOffset,\n ctx.payload.bytes.byteOffset + ctx.payload.bytes.byteLength\n ) as ArrayBuffer\n )\n const lines: string[] = []\n for (const ws of wb.worksheets) {\n lines.push(`# ${ws.name}`)\n ws.eachRow({ includeEmpty: false }, (row) => {\n const cells: string[] = []\n row.eachCell({ includeEmpty: false }, (cell) => {\n cells.push(String(cell.value ?? ''))\n })\n lines.push(cells.join('\\t'))\n })\n }\n return lines.join('\\n')\n}\n\n/** ODF content.xml → visible text (ported transformation order). */\nconst extractOdfXmlText = (xml: string): string =>\n xml\n .replace(/<\\/text:p>/g, '\\n')\n .replace(/<\\/text:h>/g, '\\n')\n .replace(/<\\/table:table-row>/g, '\\n')\n .replace(/<text:tab[^>]*\\/>/g, '\\t')\n .replace(/<text:line-break[^>]*\\/>/g, '\\n')\n .replace(/<[^>]+>/g, '')\n .replace(/&apos;/g, \"'\")\n .replace(/&quot;/g, '\"')\n .replace(/&gt;/g, '>')\n .replace(/&lt;/g, '<')\n .replace(/&amp;/g, '&')\n .replace(/[ \\t]+/g, ' ')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n\nconst extractOdfText = async (ctx: StepContext): Promise<string> => {\n const JSZip = await jszip()\n const zip = await JSZip.loadAsync(ctx.payload.bytes)\n const content = zip.file('content.xml')\n if (!content) fail(VERB, 'the ODF archive is missing content.xml (corrupt file?)')\n return extractOdfXmlText(await content!.async('text'))\n}\n\nconst extractPptxText = async (ctx: StepContext): Promise<string> => {\n const JSZip = await jszip()\n const zip = await JSZip.loadAsync(ctx.payload.bytes)\n const slideNames = Object.keys(zip.files)\n .filter((n) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(n))\n .sort((a, b) => {\n const na = Number(a.match(/slide(\\d+)/)?.[1] ?? 0)\n const nb = Number(b.match(/slide(\\d+)/)?.[1] ?? 0)\n return na - nb\n })\n if (slideNames.length === 0) fail(VERB, 'the presentation has no slides')\n const parts: string[] = []\n for (const name of slideNames) {\n const xml = await zip.file(name)!.async('text')\n const texts = (xml.match(/<a:t>([^<]*)<\\/a:t>/g) ?? []).map((t) =>\n t\n .replace(/<[^>]+>/g, '')\n .replace(/&apos;/g, \"'\")\n .replace(/&quot;/g, '\"')\n .replace(/&gt;/g, '>')\n .replace(/&lt;/g, '<')\n .replace(/&amp;/g, '&')\n )\n parts.push(texts.join('\\n'))\n }\n return parts.join('\\n\\n')\n}\n\nconst runOcr = async (ctx: StepContext): Promise<string> => {\n const out = (argOf<string>(ctx.step, 'ocr_out') ?? 'txt') as 'txt' | 'hocr' | 'json'\n if (!ctx.engines.hasConvert(ctx.payload.mimeType, out)) {\n fail(\n VERB,\n `this input requires OCR, and no engine that converts ${ctx.payload.mimeType} to \"${out}\" is configured. Do not retry this verb on this media in this deployment.`\n )\n }\n const langArg = ctx.step.args.lang as string[] | string | undefined\n const languages = langArg === undefined ? undefined : Array.isArray(langArg) ? langArg : [langArg]\n const result = await ctx.engines.convert({\n bytes: ctx.payload.bytes,\n mimeType: ctx.payload.mimeType,\n filename: ctx.payload.filename,\n to: out,\n options: { languages },\n signal: ctx.signal,\n })\n const output = result.outputs[0]\n if (!output) fail(VERB, 'OCR produced no output')\n return new TextDecoder().decode(output!.bytes)\n}\n\n// ── the unified step ─────────────────────────────────────────────────────────\n\n/**\n * `extract.text` — full format dispatch. Routes by MIME, with OCR engine fallback for images\n * and force-OCR for any input via `ocr=force`.\n */\nexport const extractTextDeepStep: StepImpl = async (ctx) => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n const ocrMode = argOf<string>(ctx.step, 'ocr') ?? 'auto'\n\n const asData = (text: string): { kind: 'data'; data: string; asText: string } => ({\n kind: 'data',\n data: text,\n asText: text,\n })\n\n if (mime.startsWith('image/')) return asData(await runOcr(ctx))\n\n if (ocrMode === 'force') return asData(await runOcr(ctx))\n\n if (mime === MIME.PDF) {\n const text = await extractPdfText(ctx)\n if (text.trim().length === 0 && ocrMode === 'auto') {\n // Scanned PDF: no text layer. OCR-from-PDF is engine territory (the engine must accept\n // application/pdf); surface the actionable path instead of silently returning nothing.\n if (!ctx.engines.hasConvert(mime, 'txt')) {\n fail(\n VERB,\n 'this PDF has no text layer (scanned?). An engine that converts application/pdf to text (OCR) is required to read it, and none is configured. Do not retry this verb on this media in this deployment.'\n )\n }\n return asData(await runOcr(ctx))\n }\n return asData(text)\n }\n if (mime === MIME.DOCX || mime === MIME.DOC) return asData(await extractDocxText(ctx))\n if (mime === MIME.XLSX) return asData(await extractXlsxText(ctx))\n if (mime === MIME.ODT || mime === MIME.ODS || mime === MIME.ODP) {\n return asData(await extractOdfText(ctx))\n }\n if (mime === MIME.PPTX) return asData(await extractPptxText(ctx))\n if (mime.startsWith('text/') || mime === MIME.JSON) {\n return asData(decodeText(ctx.payload.bytes))\n }\n fail(\n VERB,\n `text extraction for ${mime} is not supported in this build. For PPT/legacy formats: convert to=pptx | extract text (requires a convert engine).`\n )\n /* unreachable */ throw new Error('unreachable')\n}\n\n/** `extract.metadata` — format-aware metadata (page counts, sheet/slide inventories). */\nexport const extractMetadataDeepStep: StepImpl = async (ctx) => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n const meta: Record<string, unknown> = {\n filename: ctx.payload.filename,\n mime_type: ctx.payload.mimeType,\n size_bytes: ctx.payload.bytes.byteLength,\n family: familyOf(ctx.payload.mimeType),\n }\n try {\n if (mime === MIME.PDF) {\n const { PDFDocument } = await import('pdf-lib')\n const doc = await PDFDocument.load(ctx.payload.bytes, { ignoreEncryption: true })\n meta.page_count = doc.getPageCount()\n meta.title = doc.getTitle() ?? undefined\n meta.author = doc.getAuthor() ?? undefined\n } else if (mime === MIME.XLSX) {\n const mod = await import('exceljs')\n const ExcelJS = ('default' in mod ? mod.default : mod) as typeof ExcelJSNS\n const wb = new ExcelJS.Workbook()\n await wb.xlsx.load(\n ctx.payload.bytes.buffer.slice(\n ctx.payload.bytes.byteOffset,\n ctx.payload.bytes.byteOffset + ctx.payload.bytes.byteLength\n ) as ArrayBuffer\n )\n meta.sheets = wb.worksheets.map((ws) => ({ name: ws.name, rows: ws.rowCount }))\n } else if (mime === MIME.PPTX) {\n const JSZip = await jszip()\n const zip = await JSZip.loadAsync(ctx.payload.bytes)\n meta.slide_count = Object.keys(zip.files).filter((n) =>\n /^ppt\\/slides\\/slide\\d+\\.xml$/.test(n)\n ).length\n }\n } catch {\n // Metadata enrichment is best-effort; the basics above always report.\n }\n return { kind: 'data', data: meta, asText: JSON.stringify(meta) }\n}\n\n/** The ingest step registry fragment (overrides the Phase 0 native-text-only versions). */\nexport const INGEST_STEPS: ReadonlyArray<[string, StepImpl]> = [\n ['extract.text', extractTextDeepStep],\n ['extract.metadata', extractMetadataDeepStep],\n]\n","/**\n * The engine registry: capability-filtered, middleware-arbitrated, ordered dispatch over the\n * pipeline's engine array.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry (re-exported through the barrel).\n * One selection rule everywhere: gather every engine whose declarations match the request\n * (capability filter), run the consumer's selection onion (stages may exclude or reorder\n * candidates, never add), then the first survivor in supply order wins.\n *\n * Convert dispatch additionally computes multi-hop paths: when no single engine declares a\n * direct edge for the requested (input, target) pair, a breadth-first search over the format\n * graph finds the shortest chain of hops (capped at {@link MAX_HOPS}), with supply order\n * breaking ties at equal length. Pathfinding explores capability declarations only — cheap\n * and synchronous; the selection onion runs once per executed hop with real bytes in hand.\n */\n\nimport { EXT_TO_MIME } from './formats'\nimport { Middleware } from '@nhtio/middleware'\nimport type { NextFn } from '@nhtio/middleware'\nimport type { CapabilityProbe } from './validate'\nimport type {\n MediaEngine,\n ConvertRequest,\n ConvertResult,\n ConvertCapability,\n MutateRequest,\n MutateCapability,\n EngineBytesResult,\n} from './contracts'\n\n/** The maximum number of conversion hops a computed path may take. */\nconst MAX_HOPS = 3\n\n/**\n * Format tokens that are valid conversion endpoints but never intermediate path nodes.\n * Without this rule the pathfinder would happily route `docx → txt → …` (lossy garbage in,\n * garbage out) or auto-chain `audio → pcm → txt` (skipping the resample the transcription\n * step performs between those legs).\n */\nconst TERMINAL_TOKENS: ReadonlySet<string> = new Set([\n 'txt',\n 'json',\n 'hocr',\n 'srt',\n 'vtt',\n 'md',\n 'csv',\n 'pcm',\n 'images',\n])\n\n/** Normalize a MIME type for comparison (lowercase, parameters stripped). */\nconst normalizeMime = (mimeType: string): string => mimeType.toLowerCase().split(';')[0].trim()\n\n/** `true` when `mime` matches `pattern` (exact, or a `family/*` wildcard). */\nconst matchesMime = (pattern: string, mime: string): boolean => {\n const p = pattern.toLowerCase()\n if (p.endsWith('/*')) return mime.startsWith(p.slice(0, -1))\n return p === mime\n}\n\n/** `true` when any pattern in `patterns` matches `mime`. */\nconst matchesAny = (patterns: readonly string[], mime: string): boolean =>\n patterns.some((p) => matchesMime(p, mime))\n\n/**\n * The request summary a selection stage sees: enough to implement content- and\n * format-dependent rules without exposing dispatch internals.\n */\nexport interface EngineSelectionContext {\n /** Which capability is being dispatched. */\n kind: 'convert' | 'mutate'\n /** The dispatch request (for convert under multi-hop, the CURRENT hop's input/target). */\n request: {\n /** The input MIME type. */\n mimeType: string\n /** The input filename. */\n filename: string\n /** The input bytes — content-dependent rules (e.g. workbook complexity) need them. */\n bytes: Uint8Array\n /** The convert target token, or the mutate `format.to` when a re-encode was requested. */\n to?: string\n /** The requested mutate operations. */\n ops?: readonly string[]\n }\n /**\n * The capable engines, in supply order. Stages may exclude or reorder (mutate in place or\n * reassign); survivors are re-filtered against the original capable set, so a stage can\n * never add an engine the capability filter rejected.\n */\n candidates: MediaEngine[]\n}\n\n/**\n * A selection-middleware stage — the seam for quality heuristics and implementor overrides\n * when several engines can perform the same transform (e.g. route complex workbooks past a\n * pure-JS converter to LibreOffice). Same onion shape as the battery's `use` interceptors;\n * a fresh runner is minted per dispatch. Keep stages cheap or memoized: they run with bytes\n * in hand on every dispatch.\n */\nexport type EngineSelectionMiddlewareFn = (\n ctx: EngineSelectionContext,\n next: NextFn\n) => void | Promise<void>\n\n/** Ordered capability-filtered dispatch over the pipeline's engines. */\nexport interface EngineRegistry extends CapabilityProbe {\n /** The resolved engines, in supply order (inspection/debugging). */\n readonly engines: readonly MediaEngine[]\n /**\n * Every format token reachable from `fromMime` — directly or through a computed path of up\n * to three hops. Drives \"supported targets\" error messages.\n *\n * @param fromMime - The input MIME type.\n */\n convertTargets(fromMime: string): readonly string[]\n /**\n * Convert via the shortest capable path (direct edge = one hop). The selection rule picks\n * the engine for each executed hop; options are forwarded to every hop (engines ignore\n * keys they don't understand).\n *\n * @param request - The input bytes, target token, and options.\n * @returns The final hop's outputs.\n */\n convert(request: ConvertRequest): Promise<ConvertResult>\n /**\n * Apply a fused same-format transform. Candidates are engines whose `over` matches the\n * input, whose `ops` cover the requested operations, and — when a re-encode is requested —\n * whose `encodes` include the target.\n *\n * @param request - The fused operations and input bytes.\n * @returns The transformed bytes.\n */\n mutate(request: MutateRequest): Promise<EngineBytesResult>\n}\n\n/** One engine's matching capability group for a dispatch. */\ninterface ConvertCandidate {\n engine: MediaEngine\n capability: ConvertCapability\n}\ninterface MutateCandidate {\n engine: MediaEngine\n capability: MutateCapability\n}\n\n/** One hop of a computed conversion path. */\ninterface ConvertHop {\n /** The hop's input MIME. */\n fromMime: string\n /** The format token this hop produces. */\n to: string\n}\n\n/** The mutate operations requested by a fused request. */\nconst requestedOps = (request: MutateRequest): string[] => {\n const ops: string[] = []\n if (request.resize) ops.push('resize')\n if (request.rotate !== undefined) ops.push('rotate')\n if (request.flip) ops.push('flip')\n if (request.stripMetadata) ops.push('strip_metadata')\n return ops\n}\n\n/**\n * Build the registry over a resolved, validated engine array.\n *\n * @param engines - The engines, in supply (priority) order.\n * @param selection - Optional selection-middleware stages arbitrating multi-candidate dispatches.\n * @returns The registry.\n */\nexport const buildEngineRegistry = (\n engines: readonly MediaEngine[],\n selection: readonly EngineSelectionMiddlewareFn[] = []\n): EngineRegistry => {\n // ── capability filters (declaration-only, sync) ───────────────────────────\n const convertCandidates = (fromMime: string, to: string): ConvertCandidate[] => {\n const mime = normalizeMime(fromMime)\n const out: ConvertCandidate[] = []\n for (const engine of engines) {\n for (const capability of engine.converts ?? []) {\n if (capability.to.includes(to) && matchesAny(capability.from, mime)) {\n out.push({ engine, capability })\n break // one entry per engine; its first matching group serves the edge\n }\n }\n }\n return out\n }\n\n const mutateCandidates = (request: MutateRequest): MutateCandidate[] => {\n const mime = normalizeMime(request.mimeType)\n const ops = requestedOps(request)\n const out: MutateCandidate[] = []\n for (const engine of engines) {\n for (const capability of engine.mutates ?? []) {\n if (!matchesAny(capability.over, mime)) continue\n if (!ops.every((op) => capability.ops.includes(op))) continue\n if (request.format && !capability.encodes.includes(request.format.to)) continue\n out.push({ engine, capability })\n break\n }\n }\n return out\n }\n\n // ── the selection rule ─────────────────────────────────────────────────────\n const arbitrate = async <C extends { engine: MediaEngine }>(\n kind: 'convert' | 'mutate',\n request: EngineSelectionContext['request'],\n candidates: C[]\n ): Promise<C | undefined> => {\n if (candidates.length === 0) return undefined\n if (selection.length === 0 || candidates.length === 1) return candidates[0]\n const ctx: EngineSelectionContext = {\n kind,\n request,\n candidates: candidates.map((c) => c.engine),\n }\n const mw = new Middleware<EngineSelectionMiddlewareFn>()\n for (const fn of selection) mw.add(fn)\n let failed: unknown\n await mw\n .runner()\n .errorHandler(async (error: unknown) => {\n failed = error\n })\n .finalHandler(async () => {})\n .run((fn, next) => Promise.resolve(fn(ctx, next)))\n if (failed !== undefined) throw failed\n // Re-filter: stages narrow/reorder, never widen. First survivor in the stages' order wins.\n for (const engine of ctx.candidates) {\n const survivor = candidates.find((c) => c.engine === engine)\n if (survivor) return survivor\n }\n return undefined\n }\n\n // ── convert pathfinding (declarations only) ───────────────────────────────\n const findPath = (fromMime: string, target: string): ConvertHop[] | undefined => {\n const start = normalizeMime(fromMime)\n const queue: Array<{ mime: string; path: ConvertHop[] }> = [{ mime: start, path: [] }]\n const visited = new Set<string>([start])\n while (queue.length > 0) {\n const { mime, path } = queue.shift()!\n if (path.length >= MAX_HOPS) continue\n // Direct edge from this node?\n if (convertCandidates(mime, target).length > 0) {\n return [...path, { fromMime: mime, to: target }]\n }\n // Expand through non-terminal tokens.\n for (const engine of engines) {\n for (const capability of engine.converts ?? []) {\n if (!matchesAny(capability.from, mime)) continue\n for (const to of capability.to) {\n if (TERMINAL_TOKENS.has(to)) continue\n const nextMime = EXT_TO_MIME[to]\n if (!nextMime || visited.has(nextMime)) continue\n visited.add(nextMime)\n queue.push({ mime: nextMime, path: [...path, { fromMime: mime, to }] })\n }\n }\n }\n }\n return undefined\n }\n\n const hasConvert = (from?: string, to?: string): boolean => {\n for (const engine of engines) {\n for (const capability of engine.converts ?? []) {\n if (from !== undefined && !matchesAny(capability.from, normalizeMime(from))) continue\n if (to !== undefined && !capability.to.includes(to)) continue\n return true\n }\n }\n return false\n }\n\n const convertTargets = (fromMime: string): readonly string[] => {\n const reachable: string[] = []\n const seen = new Set<string>()\n let frontier = [normalizeMime(fromMime)]\n const visitedMimes = new Set<string>(frontier)\n for (let hop = 0; hop < MAX_HOPS && frontier.length > 0; hop++) {\n const next: string[] = []\n for (const mime of frontier) {\n for (const engine of engines) {\n for (const capability of engine.converts ?? []) {\n if (!matchesAny(capability.from, mime)) continue\n for (const to of capability.to) {\n if (!seen.has(to)) {\n seen.add(to)\n reachable.push(to)\n }\n if (TERMINAL_TOKENS.has(to)) continue\n const nextMime = EXT_TO_MIME[to]\n if (nextMime && !visitedMimes.has(nextMime)) {\n visitedMimes.add(nextMime)\n next.push(nextMime)\n }\n }\n }\n }\n }\n frontier = next\n }\n return reachable\n }\n\n const ids = (): string => engines.map((e) => e.id).join(', ') || '(none)'\n\n const convert = async (request: ConvertRequest): Promise<ConvertResult> => {\n const path = findPath(request.mimeType, request.to)\n if (!path) {\n const supported = convertTargets(request.mimeType)\n throw new Error(\n `no configured engine (or computed path) can convert ${request.mimeType} to \"${request.to}\"; reachable targets: ${supported.join(', ') || '(none)'} (engines: ${ids()})`\n )\n }\n let bytes = request.bytes\n let mimeType = request.mimeType\n let result: ConvertResult | undefined\n for (const hop of path) {\n const candidates = convertCandidates(mimeType, hop.to)\n const chosen = await arbitrate(\n 'convert',\n { mimeType, filename: request.filename, bytes, to: hop.to },\n candidates\n )\n if (!chosen) {\n throw new Error(\n `all engines capable of converting ${mimeType} to \"${hop.to}\" (${candidates.map((c) => c.engine.id).join(', ')}) were excluded by selection middleware`\n )\n }\n result = await chosen.capability.convert({\n bytes,\n mimeType,\n filename: request.filename,\n to: hop.to,\n options: request.options,\n signal: request.signal,\n })\n const first = result.outputs[0]\n if (!first) {\n throw new Error(\n `engine \"${chosen.engine.id}\" converted ${mimeType} to \"${hop.to}\" but produced no outputs`\n )\n }\n bytes = first.bytes\n mimeType = first.mimeType\n }\n return result!\n }\n\n const mutate = async (request: MutateRequest): Promise<EngineBytesResult> => {\n const candidates = mutateCandidates(request)\n if (candidates.length === 0) {\n const allOps = new Set<string>()\n const allEncodes = new Set<string>()\n for (const engine of engines) {\n for (const capability of engine.mutates ?? []) {\n for (const op of capability.ops) allOps.add(op)\n for (const enc of capability.encodes) allEncodes.add(enc)\n }\n }\n const wanted = requestedOps(request).join(', ') || '(none)'\n const encodeNote = request.format\n ? `; requested encoding \"${request.format.to}\" — declared encodings: ${[...allEncodes].join(', ') || '(none)'}. A different engine (e.g. sharp) may support it`\n : ''\n throw new Error(\n `no configured engine can mutate ${request.mimeType} with ops [${wanted}]${encodeNote} (engines: ${ids()})`\n )\n }\n const chosen = await arbitrate(\n 'mutate',\n {\n mimeType: request.mimeType,\n filename: '',\n bytes: request.bytes,\n to: request.format?.to,\n ops: requestedOps(request),\n },\n candidates\n )\n if (!chosen) {\n throw new Error(\n `all engines capable of this mutate (${candidates.map((c) => c.engine.id).join(', ')}) were excluded by selection middleware`\n )\n }\n return chosen.capability.mutate(request)\n }\n\n return {\n engines,\n hasConvert,\n hasMutate: () => engines.some((e) => (e.mutates ?? []).length > 0),\n convertTargets,\n convert,\n mutate,\n }\n}\n","/**\n * `image.*` and `audio.*` step implementations: fused raster transforms via the\n * imageTransform engine, and transcription via the audioDecode + asr engines.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. The split image verbs\n * (`resize`/`format`/`rotate`/`flip`/`strip_metadata`) read pipe-naturally, and the runtime\n * fuses **adjacent** image steps into a single engine invocation so a resize→format→rotate\n * chain costs one decode/encode (frozen design 0.13). Fusion happens here at execution time:\n * each image step folds its args into a shared fused request stored on the execution stash;\n * the LAST image step in a run performs the engine call.\n *\n * Audio transcription composes two engines: `audioDecode` (container → mono PCM) and `asr`\n * (PCM → text/subtitles). A small pure resampler bridges arbitrary sample rates to the\n * 16 kHz mono Float32Array ASR engines expect.\n */\n\nimport { argOf } from '../runtime'\nimport { E_MEDIA_STEP_FAILED } from '../exceptions'\nimport { PCM_MIME, pcmToBytes, bytesToPcm } from '../contracts'\nimport type { MutateRequest } from '../contracts'\nimport type { StepImpl, StepContext, StepResult } from '../runtime'\n\nconst fail = (verb: string, message: string): never => {\n throw new E_MEDIA_STEP_FAILED([verb, message])\n}\n\n// ── image fusion ─────────────────────────────────────────────────────────────\n\ntype FusedImageOps = Omit<MutateRequest, 'bytes' | 'mimeType' | 'signal'>\n\nconst IMAGE_VERBS = new Set([\n 'image.resize',\n 'image.format',\n 'image.rotate',\n 'image.flip',\n 'image.strip_metadata',\n])\n\nconst requireImage = (ctx: StepContext, verb: string): void => {\n if (!ctx.payload.mimeType.toLowerCase().startsWith('image/')) {\n fail(verb, `image operations expect an image; the media is ${ctx.payload.mimeType}`)\n }\n}\n\n/** Fold this step's args into the fused request. */\nconst foldImageStep = (ctx: StepContext, fused: FusedImageOps): FusedImageOps => {\n const args = ctx.step.args\n switch (ctx.step.verb) {\n case 'image.resize':\n return {\n ...fused,\n resize: {\n width: args.width as number | undefined,\n height: args.height as number | undefined,\n fit: args.fit as FusedImageOps['resize'] extends undefined\n ? never\n : NonNullable<FusedImageOps['resize']>['fit'],\n },\n }\n case 'image.format':\n return {\n ...fused,\n format: { to: args.to as string, quality: args.quality as number | undefined },\n ...(args.strip_metadata !== undefined\n ? { stripMetadata: args.strip_metadata as boolean }\n : {}),\n }\n case 'image.rotate': {\n const deg = Number(args.deg) as 90 | 180 | 270\n const total = (((fused.rotate ?? 0) + deg) % 360) as 0 | 90 | 180 | 270\n return { ...fused, rotate: total === 0 ? undefined : total }\n }\n case 'image.flip': {\n const axis = args.axis as 'horizontal' | 'vertical' | 'both'\n const flip = { ...(fused.flip ?? {}) }\n if (axis === 'horizontal' || axis === 'both') flip.horizontal = !flip.horizontal\n if (axis === 'vertical' || axis === 'both') flip.vertical = !flip.vertical\n return { ...fused, flip }\n }\n case 'image.strip_metadata':\n return { ...fused, stripMetadata: true }\n default:\n return fused\n }\n}\n\n/** `true` when the NEXT step in the plan is also an image verb (so we defer the engine call). */\nconst nextIsImageStep = (ctx: StepContext): boolean => {\n const next = ctx.plan.steps[ctx.stepIndex + 1]\n return next !== undefined && IMAGE_VERBS.has(next.verb)\n}\n\nconst FUSION_KEY = 'media.image.fused'\n\nconst imageStep: StepImpl = async (ctx) => {\n const verb = ctx.step.verb.replace(/\\./g, ' ')\n requireImage(ctx, verb)\n const prior = (ctx.stash.get(FUSION_KEY) as FusedImageOps | undefined) ?? {}\n const fused = foldImageStep(ctx, prior)\n if (nextIsImageStep(ctx)) {\n // Defer: pass the payload through untouched; the last image step executes the engine.\n ctx.stash.set(FUSION_KEY, fused)\n return { kind: 'media', payload: ctx.payload }\n }\n ctx.stash.delete(FUSION_KEY)\n if (!ctx.engines.hasMutate()) {\n fail(\n verb,\n 'no image-mutating engine is configured. Do not retry image verbs in this deployment.'\n )\n }\n const result = await ctx.engines.mutate({\n ...fused,\n bytes: ctx.payload.bytes,\n mimeType: ctx.payload.mimeType,\n signal: ctx.signal,\n })\n const ext = result.mimeType.split('/')[1]?.replace('jpeg', 'jpg') ?? 'bin'\n const dot = ctx.payload.filename.lastIndexOf('.')\n const base = dot > 0 ? ctx.payload.filename.slice(0, dot) : ctx.payload.filename\n return {\n kind: 'media',\n payload: { bytes: result.bytes, mimeType: result.mimeType, filename: `${base}.${ext}` },\n }\n}\n\n// ── audio ────────────────────────────────────────────────────────────────────\n\n/** Downmix to mono and linearly resample to the target rate. Pure, cross-env. */\nexport const resampleTo = (pcm: Float32Array, fromRate: number, toRate: number): Float32Array => {\n if (fromRate === toRate) return pcm\n const ratio = fromRate / toRate\n const outLength = Math.floor(pcm.length / ratio)\n const out = new Float32Array(outLength)\n for (let i = 0; i < outLength; i++) {\n const pos = i * ratio\n const left = Math.floor(pos)\n const right = Math.min(left + 1, pcm.length - 1)\n const frac = pos - left\n out[i] = pcm[left] * (1 - frac) + pcm[right] * frac\n }\n return out\n}\n\nconst ASR_SAMPLE_RATE = 16_000\n\n/**\n * `audio.transcribe` — an explicit two-stage composition: convert the container to PCM,\n * resample to 16 kHz mono, then convert the PCM to the requested text form. The registry\n * never auto-chains through PCM (it is a terminal token), precisely because this resample\n * leg must happen between the two converts.\n */\nconst audioTranscribeStep: StepImpl = async (ctx): Promise<StepResult> => {\n const verb = 'audio transcribe'\n if (!ctx.payload.mimeType.toLowerCase().startsWith('audio/')) {\n fail(verb, `transcription expects audio; the media is ${ctx.payload.mimeType}`)\n }\n const out = (argOf<string>(ctx.step, 'out') ?? 'txt') as 'txt' | 'srt' | 'vtt' | 'json'\n if (!ctx.engines.hasConvert(ctx.payload.mimeType, 'pcm')) {\n fail(\n verb,\n `no engine that decodes ${ctx.payload.mimeType} to PCM is configured. Do not retry this verb in this deployment.`\n )\n }\n if (!ctx.engines.hasConvert(PCM_MIME, out)) {\n fail(\n verb,\n `no engine that transcribes PCM to \"${out}\" is configured. Do not retry this verb in this deployment.`\n )\n }\n const decoded = await ctx.engines.convert({\n bytes: ctx.payload.bytes,\n mimeType: ctx.payload.mimeType,\n filename: ctx.payload.filename,\n to: 'pcm',\n signal: ctx.signal,\n })\n const pcmOut = decoded.outputs[0]\n if (!pcmOut) fail(verb, 'audio decoding produced no output')\n const sourceRate = Number(pcmOut!.meta?.sampleRate)\n if (!Number.isFinite(sourceRate) || sourceRate <= 0) {\n fail(verb, 'the decode engine did not report meta.sampleRate on its PCM output')\n }\n const pcm = resampleTo(bytesToPcm(pcmOut!.bytes), sourceRate, ASR_SAMPLE_RATE)\n const result = await ctx.engines.convert({\n bytes: pcmToBytes(pcm),\n mimeType: PCM_MIME,\n filename: ctx.payload.filename,\n to: out,\n options: {\n lang: argOf<string>(ctx.step, 'lang'),\n translate: argOf<boolean>(ctx.step, 'translate'),\n },\n signal: ctx.signal,\n })\n const final = result.outputs[0]\n if (!final) fail(verb, 'transcription produced no output')\n const text = new TextDecoder().decode(final!.bytes)\n return { kind: 'data', data: text, asText: text }\n}\n\n/** The image + audio step registry fragment. */\nexport const IMAGE_AUDIO_STEPS: ReadonlyArray<[string, StepImpl]> = [\n ['image.resize', imageStep],\n ['image.format', imageStep],\n ['image.rotate', imageStep],\n ['image.flip', imageStep],\n ['image.strip_metadata', imageStep],\n ['audio.transcribe', audioTranscribeStep],\n]\n","/**\n * Pure page-operation step implementations for PDFs: select, split, merge, reorder.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. Implemented with `pdf-lib`\n * (optional peer, lazily imported) on in-memory bytes — no binaries, cross-environment.\n * Phase 0 covers PDF inputs; PPTX slide operations and DOCX section operations join in the\n * sheet/slides/doc phases, sharing these verb ids with format dispatch.\n */\n\nimport { argOf } from '../runtime'\nimport { isError } from '@nhtio/adk/guards'\nimport { E_MEDIA_STEP_FAILED } from '../exceptions'\nimport { MIME, replaceExtension } from '../formats'\nimport type { MediaRef } from '../plan'\nimport type * as PdfLibModule from 'pdf-lib'\nimport type { StepImpl, StepPayload } from '../runtime'\n\ntype PdfLib = typeof PdfLibModule\ntype PDFDocumentType = PdfLibModule.PDFDocument\n\nlet pdfLibPromise: Promise<PdfLib> | undefined\nconst pdfLib = (): Promise<PdfLib> => {\n pdfLibPromise ??= import('pdf-lib')\n return pdfLibPromise\n}\n\nconst requirePdf = (verb: string, payload: StepPayload): void => {\n if (payload.mimeType.toLowerCase().split(';')[0].trim() !== MIME.PDF) {\n throw new E_MEDIA_STEP_FAILED([\n verb,\n `page operations for ${payload.mimeType} are not yet implemented in this build (PDF is supported)`,\n ])\n }\n}\n\nconst loadPdf = async (verb: string, bytes: Uint8Array): Promise<PDFDocumentType> => {\n const { PDFDocument } = await pdfLib()\n try {\n return await PDFDocument.load(bytes, { ignoreEncryption: false })\n } catch (err) {\n const detail = isError(err) ? err.message : String(err)\n throw new E_MEDIA_STEP_FAILED([verb, `could not read the PDF: ${detail}`], { cause: err })\n }\n}\n\nconst checkIndices = (verb: string, indices: number[], pageCount: number): void => {\n for (const i of indices) {\n if (i < 1 || i > pageCount) {\n throw new E_MEDIA_STEP_FAILED([\n verb,\n `page ${i} is out of range — the document has ${pageCount} pages (pages are 1-based)`,\n ])\n }\n }\n}\n\n/** `select` — keep only the listed 1-based pages, producing one document. */\nexport const selectStep: StepImpl = async (ctx) => {\n requirePdf('select', ctx.payload)\n const pages = argOf<number[]>(ctx.step, 'pages') as number[]\n const source = await loadPdf('select', ctx.payload.bytes)\n checkIndices('select', pages, source.getPageCount())\n const { PDFDocument } = await pdfLib()\n const out = await PDFDocument.create()\n const copied = await out.copyPages(\n source,\n pages.map((p) => p - 1)\n )\n for (const page of copied) out.addPage(page)\n const bytes = await out.save()\n return { kind: 'media', payload: { ...ctx.payload, bytes: new Uint8Array(bytes) } }\n}\n\n/** `split` — split into multiple documents by page (optionally grouped by JSON ranges). */\nexport const splitStep: StepImpl = async (ctx) => {\n requirePdf('split', ctx.payload)\n const by = argOf<string>(ctx.step, 'by') ?? 'page'\n if (by !== 'page') {\n throw new E_MEDIA_STEP_FAILED([\n 'split',\n `split by=${by} is not yet implemented in this build (page is supported)`,\n ])\n }\n const source = await loadPdf('split', ctx.payload.bytes)\n const pageCount = source.getPageCount()\n const rawRanges = ctx.step.args.ranges as number[][] | undefined\n const groups: number[][] =\n rawRanges !== undefined\n ? rawRanges.map((pair) => {\n if (!Array.isArray(pair) || pair.length !== 2) {\n throw new E_MEDIA_STEP_FAILED([\n 'split',\n `ranges must be [start,end] pairs, e.g. ranges='[[1,3],[5,7]]'`,\n ])\n }\n const [start, end] = pair\n const pages: number[] = []\n for (let p = start; p <= end; p++) pages.push(p)\n return pages\n })\n : Array.from({ length: pageCount }, (_, i) => [i + 1])\n const { PDFDocument } = await pdfLib()\n const payloads: StepPayload[] = []\n let part = 1\n for (const group of groups) {\n checkIndices('split', group, pageCount)\n const out = await PDFDocument.create()\n const copied = await out.copyPages(\n source,\n group.map((p) => p - 1)\n )\n for (const page of copied) out.addPage(page)\n const bytes = new Uint8Array(await out.save())\n payloads.push({\n bytes,\n mimeType: MIME.PDF,\n filename: replaceExtension(ctx.payload.filename, '').replace(/\\.$/, '') + `.part${part}.pdf`,\n })\n part += 1\n }\n return { kind: 'media-list', payloads }\n}\n\n/** `merge` — append the referenced media's pages, in order. */\nexport const mergeStep: StepImpl = async (ctx) => {\n requirePdf('merge', ctx.payload)\n const raw = ctx.step.args.with\n const refs = (Array.isArray(raw) ? raw : [raw]) as MediaRef[]\n const { PDFDocument } = await pdfLib()\n const out = await PDFDocument.create()\n const appendAll = async (doc: PDFDocumentType): Promise<void> => {\n const copied = await out.copyPages(doc, doc.getPageIndices())\n for (const page of copied) out.addPage(page)\n }\n await appendAll(await loadPdf('merge', ctx.payload.bytes))\n for (const ref of refs) {\n if (ref.kind !== 'id') {\n throw new E_MEDIA_STEP_FAILED(['merge', 'builder refs are not yet supported here'])\n }\n const other = await ctx.resolveRef(ref.id)\n requirePdf('merge', other)\n await appendAll(await loadPdf('merge', other.bytes))\n }\n const bytes = new Uint8Array(await out.save())\n return { kind: 'media', payload: { ...ctx.payload, bytes } }\n}\n\n/** `reorder` — rebuild the document with pages in the given 1-based order. */\nexport const reorderStep: StepImpl = async (ctx) => {\n requirePdf('reorder', ctx.payload)\n const order = argOf<number[]>(ctx.step, 'order') as number[]\n const source = await loadPdf('reorder', ctx.payload.bytes)\n const pageCount = source.getPageCount()\n checkIndices('reorder', order, pageCount)\n if (order.length !== pageCount) {\n throw new E_MEDIA_STEP_FAILED([\n 'reorder',\n `order lists ${order.length} pages but the document has ${pageCount} — list every page exactly once`,\n ])\n }\n const { PDFDocument } = await pdfLib()\n const out = await PDFDocument.create()\n const copied = await out.copyPages(\n source,\n order.map((p) => p - 1)\n )\n for (const page of copied) out.addPage(page)\n const bytes = new Uint8Array(await out.save())\n return { kind: 'media', payload: { ...ctx.payload, bytes } }\n}\n","/**\n * A knex-inspired local media pipeline: one declarative plan, three front-ends (chainable\n * builder, pipe string, JSON ops), engines as composable seams.\n *\n * @module @nhtio/adk/batteries/media\n *\n * @remarks\n * Most implementations give you two ways to process media — ship it to an external API, or\n * flood the model's context window with the bytes. This battery is the third option: **full\n * control of media — local processing, no external APIs by default, cross-environment where\n * possible.** Your data stays in your application and infrastructure unless you deliberately\n * wire an engine that sends it elsewhere.\n *\n * The entry point is {@link createMediaPipeline}:\n *\n * ```ts\n * import { createMediaPipeline } from '@nhtio/adk/batteries/media'\n *\n * const mp = await createMediaPipeline({\n * engines: [\n * // an ordered array of self-declaring engines; resolvers run eagerly at construction,\n * // but each engine's heavy peer dependency loads lazily on first actual use\n * () => import('@nhtio/adk/batteries/media/engines/jimp').then((m) => m.jimpEngine()),\n * ],\n * })\n *\n * // chainable builder (implementor DX)\n * const redacted = await mp(payload)\n * .select({ pages: [2, 3] })\n * .redact({ match: [/\\d{3}-\\d{2}-\\d{4}/] })\n *\n * // pipe string (the LLM-facing DSL — same plan underneath)\n * const result = await mp.query(payload, 'select pages=2-3 | redact match=/\\\\d{3}-\\\\d{2}-\\\\d{4}/')\n * ```\n *\n * Media pipelines have no standard — every tool invented its own grammar. LLMs don't share one\n * mental model of that chaos, so the pipe DSL projects every operation onto the one\n * transformation idiom every model already groks: shell pipes with `key=value` args. The verbs\n * a deployment advertises narrow to the engines it configured; everything else fails loud with\n * a model-actionable message.\n */\n\nimport { parsePipeRaw } from './pipe'\nimport { MediaChain } from './builder'\nimport { executePlan } from './runtime'\nimport { DOC_STEPS } from './steps/doc'\nimport { SHEET_STEPS } from './steps/sheet'\nimport { validator } from '@nhtio/validation'\nimport { SLIDES_STEPS } from './steps/slides'\nimport { INGEST_STEPS } from './steps/ingest'\nimport { buildEngineRegistry } from './registry'\nimport { implementsMediaEngine } from './contracts'\nimport { isError, isObject } from '@nhtio/adk/guards'\nimport { IMAGE_AUDIO_STEPS } from './steps/image_audio'\nimport { validateSegments, validateOps } from './validate'\nimport { E_INVALID_MEDIA_PIPELINE_CONFIG } from './exceptions'\nimport { selectStep, splitStep, mergeStep, reorderStep } from './steps/pages'\nimport {\n chunkStep,\n extractTextStep,\n extractMetadataStep,\n redactStep,\n updateTextStep,\n diffStep,\n applyPatchStep,\n} from './steps/text'\nimport type { MediaOp, MediaPlan } from './plan'\nimport type { CapabilityProbe } from './validate'\nimport type { EngineSelectionMiddlewareFn } from './registry'\nimport type { MediaEngine, EngineResolver } from './contracts'\nimport type { StepImpl, StepPayload, PlanResult, MediaStepMiddlewareFn } from './runtime'\n\nexport { MediaChain } from './builder'\nexport type {\n ChainInput,\n MediaChainRef,\n CellUpdate,\n ResizeOptions,\n SheetNamespace,\n SlidesNamespace,\n ImageNamespace,\n AudioNamespace,\n} from './builder'\nexport { toPipe, toOps, fromOps, isMediaRef, isRegExpRef } from './plan'\nexport type {\n MediaPlan,\n MediaStep,\n MediaOp,\n MediaArgValue,\n MediaArgScalar,\n MediaArgJson,\n MediaRef,\n RegExpRef,\n SourceSpan,\n} from './plan'\nexport { parsePipeRaw, lowerSegments } from './pipe'\nexport type { RawSegment, RawArgValue } from './pipe'\nexport { validateSegments, validateOps, availableVerbs } from './validate'\nexport type { ValidateOptions, CapabilityProbe } from './validate'\nexport { VERBS, VERB_INDEX, FOLDED_VERBS, foldVerb, suggestVerbs } from './verbs'\nexport type {\n VerbSpec,\n VerbArgSpec,\n VerbArgType,\n VerbOutput,\n VerbRequirement,\n FormatFamily,\n} from './verbs'\nexport { PCM_MIME, pcmToBytes, bytesToPcm, implementsMediaEngine } from './contracts'\nexport type {\n MediaEngine,\n EngineResolver,\n ConvertCapability,\n ConvertRequest,\n ConvertResult,\n ConvertOutput,\n ConvertOptions,\n OcrConvertOptions,\n AsrConvertOptions,\n ImagesConvertOptions,\n MutateCapability,\n MutateRequest,\n MimePattern,\n} from './contracts'\nexport { buildEngineRegistry } from './registry'\nexport type {\n EngineRegistry,\n EngineSelectionContext,\n EngineSelectionMiddlewareFn,\n} from './registry'\nexport type {\n StepPayload,\n StepResult,\n PlanResult,\n StepContext,\n StepImpl,\n MediaStepMiddlewareFn,\n} from './runtime'\nexport {\n MIME,\n familyOf,\n unsupportedForMutationReason,\n replaceExtension,\n EXT_TO_MIME,\n} from './formats'\nexport {\n E_INVALID_MEDIA_PIPELINE_CONFIG,\n E_MEDIA_PIPE_SYNTAX,\n E_MEDIA_UNKNOWN_VERB,\n E_MEDIA_UNKNOWN_ARG,\n E_MEDIA_BAD_ARG,\n E_MEDIA_MISSING_ARG,\n E_MEDIA_UNSUPPORTED_OP,\n E_MEDIA_ENGINE_REQUIRED,\n E_MEDIA_NOT_PIPE_EXPRESSIBLE,\n E_MEDIA_STEP_FAILED,\n E_MEDIA_STEP_UNAVAILABLE,\n} from './exceptions'\n\n/** Resolves a media-ref id to its payload — supplied by the consumer (or the agent forge). */\nexport type MediaRefResolver = (id: string) => StepPayload | Promise<StepPayload>\n\n/** Per-run options for `query`/`ops`. */\nexport interface RunOptions {\n /** Abort signal threaded into steps and engines. */\n signal?: AbortSignal\n /** Per-run media-ref resolution, overriding the construction-time resolver (the agent forge uses this to resolve @id refs against the current turn). */\n resolveRef?: MediaRefResolver\n}\n\n/** Configuration for {@link createMediaPipeline}. */\nexport interface MediaPipelineConfig {\n /**\n * The engine array, in priority order. Each entry is a {@link MediaEngine} instance or a\n * resolver returning one (async dynamic import is the canonical form). Engines self-declare\n * their capabilities; verbs whose capability has no provider are not advertised and fail\n * validation with a do-not-retry message if reached. Resolvers run eagerly at construction —\n * bundled engines stay cheap because their heavy peers lazy-load inside capability methods.\n */\n engines?: ReadonlyArray<EngineResolver<MediaEngine>>\n /**\n * Selection-middleware stages arbitrating dispatches where several engines can perform the\n * same transform. Stages may exclude or reorder candidates (quality heuristics, overrides);\n * array order among survivors always breaks the tie. Most deployments need none.\n */\n selection?: EngineSelectionMiddlewareFn[]\n /**\n * Consumer step interceptors wrapping every step — the documented seam for DLP/AV byte\n * scanning, caching (via `ctx.shortCircuit`), byte limits, and telemetry. The battery\n * ships no built-in scanner/cache/limiter.\n */\n use?: MediaStepMiddlewareFn[]\n /**\n * Resolves `@id` media refs (merge/diff/replace targets). Required only when chains use\n * multi-input verbs; the agent forge supplies a turn-state resolver automatically.\n */\n resolveRef?: MediaRefResolver\n}\n\n/**\n * The callable pipeline returned by {@link createMediaPipeline}: `mp(payload)` opens a\n * chainable builder; `mp.query(payload, q)` runs a pipe-string statement; `mp.ops(payload,\n * ops)` runs a JSON ops array. All three compile to the same plan and execute on the same\n * runtime.\n */\nexport interface MediaPipeline {\n /** Open a fresh chainable builder over `input`. */\n (input: StepPayload): MediaChain\n /** Parse, validate, and execute a pipe-string statement. */\n query(input: StepPayload, q: string, options?: RunOptions): Promise<PlanResult>\n /** Validate and execute a JSON ops array. */\n ops(input: StepPayload, ops: MediaOp[], options?: RunOptions): Promise<PlanResult>\n /** Validate a pipe string or ops array to a plan WITHOUT executing (dry-run/compile). */\n compile(statement: string | MediaOp[]): MediaPlan\n /** The deployment's capabilities (drives verb narrowing). */\n readonly capabilities: CapabilityProbe\n /** The resolved engines, in supply order — inspect ids and declared capabilities. */\n readonly engines: readonly MediaEngine[]\n}\n\nconst configSchema = validator\n .object({\n engines: validator\n .array()\n .items(validator.alternatives().try(validator.function(), validator.object().unknown(true)))\n .optional(),\n selection: validator.array().items(validator.function()).optional(),\n use: validator.array().items(validator.function()).optional(),\n resolveRef: validator.function().optional(),\n })\n .unknown(false)\n\n/** The Phase 0 step registry: pure steps available in every deployment. */\nconst PURE_STEPS: ReadonlyArray<[string, StepImpl]> = [\n ['select', selectStep],\n ['split', splitStep],\n ['merge', mergeStep],\n ['reorder', reorderStep],\n ['redact', redactStep],\n ['update_text', updateTextStep],\n ['diff', diffStep],\n ['apply_patch', applyPatchStep],\n ['extract.text', extractTextStep],\n ['extract.metadata', extractMetadataStep],\n ['chunk', chunkStep],\n ...SHEET_STEPS,\n ...SLIDES_STEPS,\n // DOC_STEPS + INGEST_STEPS override the Phase 0 text-only implementations with format dispatch.\n ...DOC_STEPS,\n ...INGEST_STEPS,\n ...IMAGE_AUDIO_STEPS,\n]\n\n/** Resolve one engine entry: invoke a resolver, unwrap `{default}`, guard-check the result. */\nconst resolveEngine = async (\n entry: EngineResolver<MediaEngine>,\n index: number\n): Promise<MediaEngine> => {\n let value: unknown = entry\n if (typeof value === 'function') {\n try {\n value = await (value as () => unknown)()\n } catch (err) {\n const detail = isError(err) ? err.message : String(err)\n throw new E_INVALID_MEDIA_PIPELINE_CONFIG([`engines[${index}] resolver failed: ${detail}`])\n }\n if (isObject(value) && 'default' in value && !implementsMediaEngine(value)) {\n value = (value as { default: unknown }).default\n }\n }\n if (!implementsMediaEngine(value)) {\n const candidate = value as { id?: unknown } | undefined\n const id = isObject(value) && typeof candidate?.id === 'string' ? ` (\"${candidate.id}\")` : ''\n throw new E_INVALID_MEDIA_PIPELINE_CONFIG([\n `engines[${index}]${id} does not implement the MediaEngine contract (a string id plus at least one well-formed converts/mutates capability entry)`,\n ])\n }\n return value\n}\n\n/**\n * Create a media pipeline.\n *\n * @remarks\n * Config is validated eagerly, and so are the engines: every resolver in the array runs at\n * construction (capability declarations drive verb narrowing, so they must be known up\n * front), each result is contract-checked, and failures throw\n * `E_INVALID_MEDIA_PIPELINE_CONFIG` naming the offending index. Construction stays cheap —\n * bundled engine modules import their heavy peer dependencies lazily inside capability\n * methods, on first actual use.\n *\n * @param config - Engines, selection stages, step interceptors, and the media-ref resolver.\n * @returns The callable {@link MediaPipeline}.\n */\nexport const createMediaPipeline = async (\n config: MediaPipelineConfig = {}\n): Promise<MediaPipeline> => {\n const { error } = configSchema.validate(config, { abortEarly: true })\n if (error) {\n throw new E_INVALID_MEDIA_PIPELINE_CONFIG([error.message])\n }\n const use = config.use ?? []\n const resolveRef: MediaRefResolver =\n config.resolveRef ??\n (() => {\n throw new E_INVALID_MEDIA_PIPELINE_CONFIG([\n 'this chain references another media (@id) but no resolveRef was configured',\n ])\n })\n\n const resolvedEngines = await Promise.all((config.engines ?? []).map(resolveEngine))\n const registry = buildEngineRegistry(resolvedEngines, config.selection ?? [])\n\n const steps = new Map<string, StepImpl>(PURE_STEPS)\n\n const run = async (\n input: StepPayload,\n plan: MediaPlan,\n options?: RunOptions\n ): Promise<PlanResult> => {\n const refResolver = options?.resolveRef ?? resolveRef\n return executePlan(plan, {\n input,\n steps,\n use,\n engines: registry,\n resolveRef: async (id) => refResolver(id),\n signal: options?.signal,\n })\n }\n\n const compile = (statement: string | MediaOp[]): MediaPlan =>\n typeof statement === 'string'\n ? validateSegments(parsePipeRaw(statement), { capabilities: registry })\n : validateOps(statement, { capabilities: registry })\n\n const callable = ((input: StepPayload): MediaChain => {\n return new MediaChain(async (ops) => {\n const plan = validateOps(ops, { capabilities: registry })\n return run(input, plan)\n })\n }) as MediaPipeline\n\n Object.defineProperties(callable, {\n query: {\n value: async (input: StepPayload, q: string, options?: RunOptions): Promise<PlanResult> => {\n const plan = validateSegments(parsePipeRaw(q), { capabilities: registry })\n return run(input, plan, options)\n },\n },\n ops: {\n value: async (\n input: StepPayload,\n ops: MediaOp[],\n options?: RunOptions\n ): Promise<PlanResult> => {\n const plan = validateOps(ops, { capabilities: registry })\n return run(input, plan, options)\n },\n },\n compile: { value: compile },\n capabilities: { value: registry },\n engines: { value: registry.engines },\n })\n\n return callable\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,IAAM,QAAQ,IAAA,QAAI,QAAQ;CACxB,IAAI;EAAE,OAAO;EAAc,YAAY;CAAK;CAC5C,SAAS;CACT,MAAM;CACN,IAAI;CACJ,OAAO;CACP,KAAK;CACL,OAAO;CACP,SAAS;CACT,SAAS;CACT,OAAO;CACP,OAAO;CACP,KAAK;CACL,OAAO;CACP,MAAM;AACR,CAAC;;AAYD,IAAM,YAAY,UAAyB;CACzC,MAAM,MAAM,KAAK;CACjB,MAAM,MAAa,CAAC;CACpB,IAAI;CACJ,IAAI;EACF,OAAQ,MAAM,MAAM,KAAK,GAAI;GAC3B,IAAI,IAAI,SAAS,QAAQ,IAAI,SAAS,WAAW;GACjD,IAAI,KAAK;IACP,MAAM,IAAI;IACV,OAAO,IAAI;IACX,MAAM,IAAI;IACV,QAAQ,IAAI;IACZ,MAAM,IAAI;IACV,KAAK,IAAI;GACX,CAAC;EACH;CACF,SAAS,KAAK;EAEZ,MAAM,IAAI,mBAAA,oBAAoB,CAC5B,GAFa,sBAAA,QAAQ,GAAG,IAAI,IAAI,QAAQ,MAAM,IAAI,EAAE,KAAK,OAAO,GAAG,EAEzD,uFACZ,CAAC;CACH;CACA,OAAO;AACT;AA0BA,IAAM,UAAU,KAAU,YAAiC;CACzD,QAAQ,IAAI;CACZ,MAAM,IAAI;CACV,KAAK,IAAI;CACT,QAAQ,UAAU,IAAI,KAAK;AAC7B;AAEA,IAAM,WAAW,QACf,IACG,MAAM,GAAG,EAAE,EACX,QAAQ,QAAQ,IAAI,EACpB,QAAQ,QAAQ,GAAI,EACpB,QAAQ,gBAAgB,IAAI;AAEjC,IAAM,UAAQ,KAAsB,SAAiB,aAA4B;CAE/E,MAAM,IAAI,mBAAA,oBAAoB,CAAC,GAAG,UADpB,MAAM,YAAY,IAAI,KAAK,QAAQ,IAAI,QAAQ,mBACX,mBAAmB,UAAU,CAAC;AAClF;AAEA,IAAM,SAAN,MAAa;CACX;CACA,OAAO;CAEP,YAAY,MAAa;EACvB,KAAKA,QAAQ;CACf;CAEA,MAAM,QAAQ,GAAoB;EAChC,OAAO,KAAKA,MAAM,KAAKC,OAAO;CAChC;CAEA,QAAyB;EACvB,OAAO,KAAKD,MAAM,KAAKC;CACzB;CAEA,gBAA8B;EAC5B,MAAM,WAAyB,CAAC;EAChC,IAAI,KAAKD,MAAM,WAAW,GACxB,OAAK,KAAA,GAAW,yBAAyB,kCAAkC;EAE7E,SAAS,KAAK,KAAKE,cAAc,CAAC;EAClC,OAAO,KAAKC,MAAM,GAAG,SAAS,QAAQ;GACpC,KAAKC,MAAM;GACX,SAAS,KAAK,KAAKF,cAAc,CAAC;EACpC;EACA,MAAM,WAAW,KAAKC,MAAM;EAC5B,IAAI,UACF,OACE,UACA,eAAe,SAAS,KAAK,6BAC7B,iDACF;EAEF,OAAO;CACT;CAEA,gBAA4B;EAC1B,MAAM,QAAQ,KAAKA,MAAM;EACzB,IAAI,CAAC,SAAS,MAAM,SAAS,SAC3B,OAAK,OAAO,wCAAwC,gBAAgB;EAEtE,MAAM,OAAO,KAAKC,MAAM;EAMxB,MAAM,YAAY,CAAC,KAAK,KAAK;EAC7B,MAAM,eAAyB,CAAC,KAAKH,IAAI;EACzC,OAAO,UAAU,SAAS,GAAG;GAE3B,IADa,KAAKE,MACd,GAAM,SAAS,WAAW,KAAKA,MAAM,CAAC,GAAG,SAAS,MAAM;GAC5D,UAAU,KAAM,KAAKC,MAAM,EAAU,KAAK;GAC1C,aAAa,KAAK,KAAKH,IAAI;EAC7B;EACA,IAAI,OAAO,UAAU;EACrB,IAAI,iBAAA,SAAS,SAAS,MAAM,KAAA,GAAW;GAGrC,IAAI,SAAS,UAAU,SAAS;GAChC,OAAO,UAAU,KAAK,iBAAA,SAAS,UAAU,MAAM,GAAG,MAAM,CAAC,MAAM,KAAA,GAAW,UAAU;GACpF,IAAI,UAAU,GAAG,OAAO;EAC1B;EACA,MAAM,QAAQ,UAAU,MAAM,GAAG,IAAI;EACrC,KAAKA,OAAO,aAAa,OAAO;EAChC,MAAM,SAAS,iBAAA,SAAS,KAAK;EAC7B,MAAM,WAAW,MAAM,KAAK,GAAG;EAC/B,MAAM,uBAAO,IAAI,IAAyB;EAC1C,SAAS;GACP,MAAM,MAAM,KAAKE,MAAM;GACvB,IAAI,CAAC,OAAO,IAAI,SAAS,QAAQ;GACjC,IAAI,IAAI,SAAS,QACf,OACE,KACA,8DACA,GAAG,SAAS,0BACd;GAEF,IAAI,IAAI,SAAS,WAAW,KAAKA,MAAM,CAAC,GAAG,SAAS,MAClD,OAAK,KAAK,eAAe,IAAI,KAAK,8BAA8B,GAAG,SAAS,YAAY;GAE1F,MAAM,OAAQ,KAAKC,MAAM,EAAU;GACnC,KAAKA,MAAM;GACX,MAAM,QAAQ,KAAKC,YAAY,UAAU,IAAI;GAC7C,IAAI,KAAK,IAAI,IAAI,GACf,OAAK,KAAK,kBAAkB,KAAK,IAAI,GAAG,SAAS,GAAG,KAAK,4BAA4B;GAEvF,KAAK,IAAI,MAAM,KAAK;EACtB;EACA,OAAO;GACL,MAAM,UAAU;GAChB,OAAO,WAAW,KAAA;GAClB;GACA,MAAM,OAAO,MAAM,SAAS,MAAM;EACpC;CACF;CAEA,YAAY,UAAkB,SAA8B;EAC1D,MAAM,QAAQ,KAAKC,aAAa,UAAU,OAAO;EACjD,IAAI,KAAKH,MAAM,GAAG,SAAS,SAAS,OAAO;EAC3C,MAAM,QAA0B,CAAC,GAAG,aAAa,OAAO,UAAU,OAAO,CAAC;EAC1E,IAAI,SAAS,MAAM;EACnB,OAAO,KAAKA,MAAM,GAAG,SAAS,SAAS;GACrC,KAAKC,MAAM;GACX,MAAM,OAAO,KAAKE,aAAa,UAAU,OAAO;GAChD,SAAS,UAAU,KAAK;GACxB,MAAM,KAAK,GAAG,aAAa,MAAM,UAAU,OAAO,CAAC;EACrD;EACA,OAAO;GAAE,OAAO;GAAO;GAAQ,MAAM,MAAM;EAAK;CAClD;CAEA,aAAa,UAAkB,SAA8B;EAC3D,MAAM,MAAM,KAAKH,MAAM;EACvB,IAAI,CAAC,KACH,OAAK,KAAK,sBAAsB,QAAQ,IAAI,GAAG,SAAS,GAAG,QAAQ,OAAO;EAE5E,MAAM,IAAI;EACV,QAAQ,EAAE,MAAV;GACE,KAAK;IACH,KAAKC,MAAM;IACX,OAAO;KAAE,OAAO,OAAO,EAAE,KAAK;KAAG,QAAQ;KAAO,MAAM,OAAO,CAAC;IAAE;GAClE,KAAK;IACH,KAAKA,MAAM;IACX,OAAO;KAAE,OAAO,OAAO,EAAE,KAAK;KAAG,QAAQ;KAAO,MAAM,OAAO,CAAC;IAAE;GAClE,KAAK,SAAS;IACZ,KAAKA,MAAM;IACX,MAAM,CAAC,IAAI,MAAM,EAAE,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM;IAC9C,IAAI,KAAK,IACP,OAAK,GAAG,SAAS,EAAE,MAAM,uCAAuC,GAAG,QAAQ,GAAG,GAAG,GAAG,IAAI;IAE1F,MAAM,OAAiB,CAAC;IACxB,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC;IAC1C,OAAO;KAAE,OAAO;KAAM,QAAQ;KAAO,MAAM,OAAO,CAAC;IAAE;GACvD;GACA,KAAK;IACH,KAAKA,MAAM;IACX,IAAI,EAAE,UAAU,QAAQ,OAAO;KAAE,OAAO;KAAM,QAAQ;KAAO,MAAM,OAAO,CAAC;IAAE;IAC7E,IAAI,EAAE,UAAU,SAAS,OAAO;KAAE,OAAO;KAAO,QAAQ;KAAO,MAAM,OAAO,CAAC;IAAE;IAC/E,OAAO;KAAE,OAAO,EAAE;KAAO,QAAQ;KAAO,MAAM,OAAO,CAAC;IAAE;GAE1D,KAAK;GACL,KAAK;IACH,KAAKA,MAAM;IACX,OAAO;KAAE,OAAO,QAAQ,EAAE,IAAI;KAAG,QAAQ;KAAM,MAAM,OAAO,CAAC;IAAE;GACjE,KAAK,SAAS;IACZ,KAAKA,MAAM;IACX,MAAM,YAAY,EAAE,KAAK,YAAY,GAAG;IACxC,MAAM,SAAS,EAAE,KAAK,MAAM,GAAG,SAAS;IACxC,MAAM,QAAQ,iBAAA,eAAe,EAAE,KAAK,MAAM,YAAY,CAAC,CAAC;IACxD,IAAI;KAEF,IAAS,OAAO,QAAQ,KAAK;IAC/B,SAAS,KAAK;KACZ,MAAM,SAAS,sBAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG;KACtD,OAAK,GAAG,iBAAiB,EAAE,KAAK,IAAI,UAAU,GAAG,QAAQ,gBAAgB;IAC3E;IACA,OAAO;KAAE,OAAO;MAAE;MAAQ;KAAM;KAAG,QAAQ;KAAO,MAAM,OAAO,CAAC;IAAE;GACpE;GACA,KAAK;IACH,KAAKA,MAAM;IACX,OAAO;KACL,OAAO;MAAE,MAAM;MAAM,IAAI,EAAE,MAAM,MAAM,CAAC;KAAE;KAC1C,QAAQ;KACR,MAAM,OAAO,CAAC;IAChB;GACF,KAAK;IACH,OACE,GACA,oCACA,GAAG,QAAQ,sDACb;IACA;GACF,SACE,OAAK,GAAG,eAAe,EAAE,KAAK,IAAI,GAAG,SAAS,GAAG,QAAQ,OAAO;EACpE;EAEA,MAAM,IAAI,mBAAA,oBAAoB,CAAC,uBAAuB,CAAC;CACzD;AACF;AAEA,IAAM,gBAAgB,KAAkB,UAAkB,YAAsC;CAC9F,IAAI,MAAM,QAAQ,IAAI,KAAK,GAAG,OAAO,IAAI;CACzC,IAAI,IAAI,UAAU,QAAQ,OAAO,IAAI,UAAU,UAAU;EACvD,MAAM,IAAI,IAAI;EACd,IAAI,sBAAA,SAAS,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,YAAY,MAAM,EAAE,UAAU,IACtE,MAAM,IAAI,mBAAA,oBAAoB,CAC5B,wDAAwD,QAAQ,QAAQ,SAAS,EACnF,CAAC;CAEL;CACA,OAAO,CAAC,IAAI,KAAuB;AACrC;;;;;;;;;;;;AAeA,IAAa,gBAAgB,UAAgC;CAC3D,OAAO,IAAI,OAAO,SAAS,KAAK,CAAC,EAAE,cAAc;AACnD;;;;;;;;;AAUA,IAAa,iBAAiB,cAAuC,EACnE,OAAO,SAAS,KACb,SAAoB;CACnB,MAAM,IAAI;CACV,MAAM,OAAO,YAAY,MAAM,KAAK,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;CACjF,MAAM,IAAI;AACZ,EACF,EACF;;;;;;;;;;;;;;;;;AC7TA,IAAM,SAAS,UACb,OAAO,UAAU,WAAW;CAAE,MAAM;CAAM,IAAI;AAAM,IAAI;CAAE,MAAM;CAAM,IAAI,MAAM;AAAQ;;;;;AAS1F,IAAa,aAAb,MAAa,WAA2C;CACtD;CACA;CAEA,YAAY,MAAqB,MAAiB,CAAC,GAAG;EACpD,KAAKI,QAAQ;EACb,KAAKD,OAAO;CACd;CAEA,MAAM,MAAc,MAAiD;EACnE,OAAO,IAAI,WAAW,KAAKC,OAAO,CAAC,GAAG,KAAKD,MAAM;GAAE;GAAM;EAAK,CAAC,CAAC;CAClE;;CAKA,QAAQ,IAAwB;EAC9B,OAAO,KAAKE,MAAM,WAAW,EAAE,GAAG,CAAC;CACrC;;CAGA,OAAO,SAA0C;EAC/C,OAAO,KAAKA,MAAM,UAAU,EAAE,OAAO,QAAQ,MAAM,CAAC;CACtD;;CAGA,MAAM,UAA4D,CAAC,GAAe;EAChF,MAAM,OAAsC,CAAC;EAC7C,IAAI,QAAQ,IAAI,KAAK,KAAK,QAAQ;EAClC,IAAI,QAAQ,QAAQ,KAAK,SAAS,QAAQ;EAC1C,OAAO,KAAKA,MAAM,SAAS,IAAI;CACjC;;CAGA,MAAM,GAAG,QAAqC;EAC5C,OAAO,KAAKA,MAAM,SAAS,EAAE,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;CACxD;;CAGA,QAAQ,OAA6B;EACnC,OAAO,KAAKA,MAAM,WAAW,EAAE,MAAM,CAAC;CACxC;;CAGA,OAAO,SAGQ;EAKb,MAAM,OAAsC,EAAE,QAJjC,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC,QAAQ,KAAK,GACvD,KAAK,MACtB,OAAO,MAAM,WAAW,IAAI;GAAE,QAAQ,EAAE;GAAQ,OAAO,MAAM,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;EAAE,CAE/C,EAAM;EACpD,IAAI,QAAQ,YAAY,KAAA,GAAW,KAAK,UAAU,QAAQ;EAC1D,OAAO,KAAKA,MAAM,UAAU,IAAI;CAClC;;CAGA,WAAuB;EACrB,OAAO,KAAKA,MAAM,YAAY,CAAC,CAAC;CAClC;;CAGA,YAAwB;EACtB,OAAO,KAAKA,MAAM,aAAa,CAAC,CAAC;CACnC;;CAGA,WAAW,QAAgB,SAA6B;EACtD,OAAO,KAAKA,MAAM,eAAe;GAAE;GAAQ;EAAQ,CAAC;CACtD;;CAGA,KAAK,OAAkC;EACrC,OAAO,KAAKA,MAAM,QAAQ,EAAE,MAAM,MAAM,KAAK,EAAE,CAAC;CAClD;;CAGA,WAAW,OAAe,UAAsC,CAAC,GAAe;EAC9E,MAAM,OAAsC,EAAE,MAAM;EACpD,IAAI,QAAQ,MAAM,KAAK,OAAO,QAAQ,KAAK,IAAI,KAAK;EACpD,OAAO,KAAKA,MAAM,eAAe,IAAI;CACvC;;CAGA,YACE,UAII,CAAC,GACO;EACZ,MAAM,OAAsC,CAAC;EAC7C,IAAI,QAAQ,KAAK,KAAK,MAAM,QAAQ;EACpC,IAAI,QAAQ,QAAQ,KAAK,UAAU,QAAQ;EAC3C,IAAI,QAAQ,MAAM,KAAK,OAAO,QAAQ;EACtC,OAAO,KAAKA,MAAM,gBAAgB,IAAI;CACxC;;CAGA,kBAA8B;EAC5B,OAAO,KAAKA,MAAM,oBAAoB,CAAC,CAAC;CAC1C;;CAGA,cACE,UAAsE,CAAC,GAC3D;EACZ,MAAM,OAAsC,CAAC;EAC7C,IAAI,QAAQ,OAAO,KAAK,QAAQ,QAAQ;EACxC,OAAO,KAAKA,MAAM,kBAAkB,IAAI;CAC1C;;CAGA,MACE,UAA8F,CAAC,GACnF;EACZ,MAAM,OAAsC,CAAC;EAC7C,IAAI,QAAQ,UAAU,KAAK,KAAK,QAAQ;EACxC,IAAI,QAAQ,SAAS,KAAA,GAAW,KAAK,OAAO,QAAQ;EACpD,IAAI,QAAQ,YAAY,KAAA,GAAW,KAAK,UAAU,QAAQ;EAC1D,OAAO,KAAKA,MAAM,SAAS,IAAI;CACjC;;CAKA,IAAI,QAAwB;EAC1B,OAAO,IAAI,eAAe,IAAI;CAChC;;CAGA,IAAI,SAA0B;EAC5B,OAAO,IAAI,gBAAgB,IAAI;CACjC;;CAGA,IAAI,QAAwB;EAC1B,OAAO,IAAI,eAAe,IAAI;CAChC;;CAGA,IAAI,QAAwB;EAC1B,OAAO,IAAI,eAAe,IAAI;CAChC;;CAKA,QAAmB;EACjB,OAAO,KAAKF,KAAK,KAAK,QAAQ;GAAE,MAAM,GAAG;GAAM,MAAM,EAAE,GAAG,GAAG,KAAK;EAAE,EAAE;CACxE;;CAGA,SAAiB;EAEf,OAAO,iBAAA,OAAO,EADY,OAAO,KAAKA,KAAK,KAAK,QAAQ;GAAE,MAAM,GAAG;GAAM,MAAM,GAAG;EAAK,EAAE,EAC3E,CAAI;CACpB;;CAGA,OAAO,MAAc,MAAiD;EACpE,OAAO,KAAKE,MAAM,MAAM,IAAI;CAC9B;;CAGA,KACE,aACA,YACkC;EAClC,OAAO,KAAKD,MAAM,KAAK,MAAM,CAAC,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,UAAU;CACjF;;CAGA,MAAM,MAA2B;EAC/B,OAAO,KAAKA,MAAM,KAAK,MAAM,CAAC;CAChC;AACF;;AAGA,IAAM,gBAAgB,WAAgC;CACpD,IAAI,OAAO,SAAS,SAAS,OAAO,OAAO;CAC3C,IAAI,OAAO,SAAS,cAAc,OAAO,OAAO;CAChD,OAAO,OAAO;AAChB;;AAGA,IAAa,iBAAb,MAA4B;CAC1B;CACA,YAAY,OAAmB;EAC7B,KAAKE,SAAS;CAChB;;CAEA,QACE,MACA,UAAwE,CAAC,GAC7D;EACZ,OAAO,KAAKA,OAAO,OACjB,kBACA,QAAQ;GACA;GACN,GAAG,WAAW,OAAO;GACrB,QAAQ,QAAQ;GAChB,OAAO,QAAQ;EACjB,CAAC,CACH;CACF;;CAEA,WAAW,SAMI;EACb,OAAO,KAAKA,OAAO,OACjB,qBACA,QAAQ;GACN,GAAG,WAAW,OAAO;GACrB,SAAS,QAAQ;GACjB,SAAS,QAAQ;GACjB,QAAQ,QAAQ;GAChB,OAAO,QAAQ;EACjB,CAAC,CACH;CACF;;CAEA,YAAY,SAAuB,UAAuC,CAAC,GAAe;EACxF,OAAO,KAAKA,OAAO,OACjB,sBACA,QAAQ;GAAW;GAAoC,GAAG,WAAW,OAAO;EAAE,CAAC,CACjF;CACF;;CAEA,WAAW,MAAgB,UAAuC,CAAC,GAAe;EAChF,OAAO,KAAKA,OAAO,OAAO,qBAAqB,QAAQ;GAAE;GAAM,GAAG,WAAW,OAAO;EAAE,CAAC,CAAC;CAC1F;;CAEA,cAAc,SAAmB,UAAuC,CAAC,GAAe;EACtF,OAAO,KAAKA,OAAO,OAAO,wBAAwB,QAAQ;GAAE;GAAS,GAAG,WAAW,OAAO;EAAE,CAAC,CAAC;CAChG;;CAEA,YAAY,OAAe,IAAwB;EACjD,OAAO,KAAKA,OAAO,OAAO,sBAAsB;GAAE;GAAO;EAAG,CAAC;CAC/D;;CAEA,SAAS,MAAc,UAA2B,CAAC,GAAe;EAChE,OAAO,KAAKA,OAAO,OAAO,mBAAmB,QAAQ;GAAE;GAAM,IAAI,QAAQ;EAAG,CAAC,CAAC;CAChF;;CAEA,YAAY,OAA2B;EACrC,OAAO,KAAKA,OAAO,OAAO,sBAAsB,EAAE,MAAM,CAAC;CAC3D;;CAEA,cAAc,OAA2C;EACvD,OAAO,KAAKA,OAAO,OAAO,wBAAwB,EAAS,MAAsB,CAAC;CACpF;;CAEA,eAAe,SAMA;EACb,OAAO,KAAKA,OAAO,OACjB,yBACA,QAAQ;GACN,GAAG,WAAW,OAAO;GACrB,YAAY,QAAQ;GACpB,QAAQ,QAAQ;GAChB,MAAM,QAAQ;GACd,QAAQ,QAAQ;EAClB,CAAC,CACH;CACF;AACF;;AAGA,IAAa,kBAAb,MAA6B;CAC3B;CACA,YAAY,OAAmB;EAC7B,KAAKA,SAAS;CAChB;;CAEA,IAAI,UAA4D,CAAC,GAAe;EAC9E,OAAO,KAAKA,OAAO,OACjB,cACA,QAAQ;GAAE,IAAI,QAAQ;GAAI,OAAO,QAAQ;GAAO,QAAQ,QAAQ;EAAO,CAAC,CAC1E;CACF;;CAEA,WACE,MACA,UAA6D,CAAC,GAClD;EACZ,OAAO,KAAKA,OAAO,OACjB,sBACA,QAAQ;GAAE;GAAM,OAAO,SAAS,QAAQ,KAAK;GAAG,aAAa,QAAQ;EAAY,CAAC,CACpF;CACF;;CAEA,YACE,SACA,UAAuC,CAAC,GAC5B;EACZ,OAAO,KAAKA,OAAO,OACjB,uBACA,QAAQ;GAAW;GAAoC,OAAO,SAAS,QAAQ,KAAK;EAAE,CAAC,CACzF;CACF;;CAEA,YACE,WACA,UAA6D,CAAC,GAClD;EACZ,OAAO,KAAKA,OAAO,OACjB,uBACA,QAAQ;GACN,MAAM,MAAM,SAAS;GACrB,OAAO,SAAS,QAAQ,KAAK;GAC7B,aAAa,QAAQ;EACvB,CAAC,CACH;CACF;;CAEA,YAAY,MAAmB,UAAuC,CAAC,GAAe;EACpF,OAAO,KAAKA,OAAO,OACjB,uBACA,QAAQ;GAAQ;GAAsB,OAAO,SAAS,QAAQ,KAAK;EAAE,CAAC,CACxE;CACF;;CAEA,OAAO,QAA8B;EACnC,OAAO,KAAKA,OAAO,OAAO,iBAAiB,EAAE,OAAO,CAAC;CACvD;;CAEA,QAAQ,OAA6B;EACnC,OAAO,KAAKA,OAAO,OAAO,kBAAkB,EAAE,MAAM,CAAC;CACvD;;CAEA,UAAU,OAAe,UAA2B,CAAC,GAAe;EAClE,OAAO,KAAKA,OAAO,OAAO,oBAAoB,QAAQ;GAAE;GAAO,IAAI,QAAQ;EAAG,CAAC,CAAC;CAClF;AACF;;AAGA,IAAa,iBAAb,MAA4B;CAC1B;CACA,YAAY,OAAmB;EAC7B,KAAKA,SAAS;CAChB;;CAEA,OAAO,SAAoC;EACzC,OAAO,KAAKA,OAAO,OACjB,gBACA,QAAQ;GAAE,OAAO,QAAQ;GAAO,QAAQ,QAAQ;GAAQ,KAAK,QAAQ;EAAI,CAAC,CAC5E;CACF;;CAEA,OAAO,IAAY,UAAyD,CAAC,GAAe;EAC1F,OAAO,KAAKA,OAAO,OACjB,gBACA,QAAQ;GAAE;GAAI,SAAS,QAAQ;GAAS,gBAAgB,QAAQ;EAAc,CAAC,CACjF;CACF;;CAEA,OAAO,KAAiC;EACtC,OAAO,KAAKA,OAAO,OAAO,gBAAgB,EAAE,KAAK,OAAO,GAAG,EAAE,CAAC;CAChE;;CAEA,KAAK,MAAsD;EACzD,OAAO,KAAKA,OAAO,OAAO,cAAc,EAAE,KAAK,CAAC;CAClD;;CAEA,gBAA4B;EAC1B,OAAO,KAAKA,OAAO,OAAO,wBAAwB,CAAC,CAAC;CACtD;AACF;;AAGA,IAAa,iBAAb,MAA4B;CAC1B;CACA,YAAY,OAAmB;EAC7B,KAAKA,SAAS;CAChB;;CAEA,WACE,UAA4F,CAAC,GACjF;EACZ,OAAO,KAAKA,OAAO,OACjB,oBACA,QAAQ;GAAE,MAAM,QAAQ;GAAU,KAAK,QAAQ;GAAK,WAAW,QAAQ;EAAU,CAAC,CACpF;CACF;AACF;AAEA,IAAM,cAAc,YAClB,QAAQ,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,QAAQ,MAAM;AAE5D,IAAM,YAAY,UAAoE;AAEtF,IAAM,WACJ,SACkC;CAClC,MAAM,MAAqC,CAAC;CAC5C,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,IAAI,GACtC,IAAI,MAAM,KAAA,GAAW,IAAI,KAAK;CAEhC,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;AC7XA,IAAM,gBAAgB,OAAO,wBAAwB;AAOrD,IAAM,kBAAkB,UACtB,sBAAA,SAAS,KAAK,KAAM,MAAkC,mBAAmB;;;;;;;;;AA6B3E,IAAa,cAAc,OACzB,MACA,YACwB;CACxB,MAAM,wBAAQ,IAAI,IAAqB;CACvC,IAAI,UAAU,QAAQ;CACtB,IAAI,SAAqB;EAAE,MAAM;EAAS;CAAQ;CAElD,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;EAC1C,MAAM,OAAO,KAAK,MAAM;EACxB,QAAQ,QAAQ,eAAe;EAC/B,MAAM,OAAO,QAAQ,MAAM,IAAI,KAAK,IAAI;EACxC,IAAI,CAAC,MACH,MAAM,IAAI,mBAAA,yBAAyB,CAAC,KAAK,IAAI,CAAC;EAGhD,MAAM,MAAmB;GACvB;GACA,WAAW;GACX;GACA;GACA,QAAQ,QAAQ;GAChB;GACA,eAAe,OAA2B;IAExC,MAAM;MADgC,gBAAgB;KAAM,SAAS;IAC/D;GACR;GACA,SAAS,QAAQ;GACjB,YAAY,QAAQ;EACtB;EAEA,IAAI;GACF,SAAS,MAAM,QAAQ,KAAK,MAAM,QAAQ,GAAG;EAC/C,SAAS,KAAK;GACZ,IAAI,eAAe,GAAG,GACpB,SAAS;IAAE,MAAM;IAAS,SAAS,IAAI;GAAQ;QAC1C,IAAI,sBAAA,QAAQ,GAAG,KAAK,IAAI,KAAK,WAAW,UAAU,GACvD,MAAM;QACD;IACL,MAAM,SAAS,sBAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG;IACtD,MAAM,IAAI,mBAAA,oBAAoB,CAAC,KAAK,MAAM,MAAM,GAAG,EAAE,OAAO,IAAI,CAAC;GACnE;EACF;EAEA,IAAI,OAAO,SAAS,SAClB,UAAU,OAAO;OACZ,IAAI,IAAI,KAAK,MAAM,SAAS,GACjC,IACE,OAAO,SAAS,UAChB,OAAO,OAAO,WAAW,YACzB,iBAAA,WAAW,IAAI,KAAK,IAAI,GAAG,WAAW,QACtC;GAGA,UAAU;IACR,OAAO,IAAI,YAAY,EAAE,OAAO,OAAO,MAAM;IAC7C,UAAU;IACV,UAAU,iBAAiB,QAAQ,QAAQ;GAC7C;GACA,SAAS;IAAE,MAAM;IAAS;GAAQ;EACpC,OACE,MAAM,IAAI,mBAAA,oBAAoB,CAC5B,KAAK,MACL,qGACF,CAAC;CAGP;CACA,OAAO;AACT;;AAGA,IAAM,UAAU,OACd,KACA,MACA,QACwB;CACxB,IAAI,IAAI,WAAW,GACjB,OAAO,UAAU,KAAK,MAAM,KAAK,GAAG,CAAC;CAEvC,MAAM,KAAK,IAAI,kBAAA,WAAkC;CACjD,KAAK,MAAM,MAAM,KAAK,GAAG,IAAI,EAAE;CAE/B,IAAI;CACJ,IAAI;CACJ,MAAM,GACH,OAAO,EACP,aAAa,OAAO,UAAmB;EACtC,SAAS;CACX,CAAC,EACA,aAAa,YAAY;EACxB,SAAS,UAAU,KAAK,MAAM,KAAK,GAAG,CAAC;CACzC,CAAC,EACA,KAAK,IAAI,SAAS,QAAQ,QAAQ,GAAG,KAAK,IAAI,CAAC,CAAC;CAEnD,IAAI,WAAW,KAAA,GAAW,MAAM;CAChC,IAAI,WAAW,KAAA,GACb,MAAM,IAAI,mBAAA,oBAAoB,CAC5B,IAAI,KAAK,MACT,kEACF,CAAC;CAEH,OAAO;AACT;;AAGA,IAAM,aAAa,KAAkB,WAAmC;CACtE,MAAM,OAAO,QAAuB;EAClC,MAAM,IAAI,mBAAA,oBAAoB,CAAC,IAAI,KAAK,MAAM,2BAA2B,KAAK,CAAC;CACjF;CACA,MAAM,WAAW,UACf,sBAAA,aAAa,OAAO,cAAc,UAAU;CAC9C,IAAI,OAAO,SAAS,SAAS;EAC3B,IAAI,CAAC,QAAQ,OAAO,SAAS,KAAK,GAAG,IAAI,8BAA8B;EACvE,IAAI,OAAO,OAAO,QAAQ,aAAa,UAAU,IAAI,mCAAmC;EACxF,OAAO;CACT;CACA,IAAI,OAAO,SAAS,cAAc;EAChC,IAAI,CAAC,MAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,MAAM,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAClF,IAAI,2CAA2C;EAEjD,OAAO;CACT;CACA,IAAI,OAAO,SAAS,QAAQ,OAAO;CACnC,OAAO,IAAI,wBAAwB;AACrC;;AAGA,IAAM,oBAAoB,aAA6B;CACrD,MAAM,MAAM,SAAS,YAAY,GAAG;CAEpC,OAAO,GADM,MAAM,IAAI,SAAS,MAAM,GAAG,GAAG,IAAI,SACjC;AACjB;;AAGA,IAAa,SAAkC,MAAiB,SAC9D,KAAK,KAAK;;;;AC7OZ,IAAa,OAAO;CAClB,MAAM;CACN,MAAM;CACN,MAAM;CACN,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,OAAO;CACP,SAAS;CACT,SAAS;CACT,KAAK;CACL,IAAI;CACJ,KAAK;CACL,MAAM;CACN,MAAM;CACN,KAAK;CACL,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,KAAK;CACL,KAAK;AACP;;AAGA,IAAa,sBAA2C,IAAI,IAAI;CAAC,KAAK;CAAK,KAAK;CAAK,KAAK;AAAG,CAAC;;AAG9F,IAAa,cAAmC,IAAI,IAAI;CAAC,KAAK;CAAO,KAAK;CAAS,KAAK;AAAO,CAAC;AAEhG,IAAM,oBAAyC,IAAI,IAAI;CAAC,KAAK;CAAM,KAAK;CAAK,KAAK;CAAK,KAAK;AAAG,CAAC;AAChG,IAAM,qBAA0C,IAAI,IAAI;CACtD,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;AACP,CAAC;AACD,IAAM,iBAAsC,IAAI,IAAI;CAClD,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL;CACA;AACF,CAAC;;;;;;;AAQD,IAAa,YAAY,aAAmC;CAC1D,MAAM,OAAO,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK;CACvD,IAAI,kBAAkB,IAAI,IAAI,GAAG,OAAO;CACxC,IAAI,mBAAmB,IAAI,IAAI,GAAG,OAAO;CACzC,IAAI,eAAe,IAAI,IAAI,GAAG,OAAO;CACrC,IAAI,KAAK,WAAW,QAAQ,GAAG,OAAO;CACtC,IAAI,KAAK,WAAW,QAAQ,GAAG,OAAO;CACtC,IAAI,KAAK,WAAW,OAAO,GAAG,OAAO;CACrC,OAAO;AACT;;;;;;;;AASA,IAAa,gCAAgC,aAAyC;CACpF,MAAM,OAAO,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK;CACvD,IAAI,oBAAoB,IAAI,IAAI,GAC9B,OAAO,yBAAyB,KAAK;CAEvC,IAAI,YAAY,IAAI,IAAI,GACtB,OAAO,uBAAuB,KAAK;AAGvC;;AAGA,IAAa,cAAgD;CAC3D,KAAK,KAAK;CACV,MAAM,KAAK;CACX,MAAM,KAAK;CACX,MAAM,KAAK;CACX,KAAK,KAAK;CACV,KAAK,KAAK;CACV,KAAK,KAAK;CACV,KAAK,KAAK;CACV,KAAK,KAAK;CACV,KAAK,KAAK;CACV,KAAK,KAAK;CACV,IAAI,KAAK;CACT,KAAK,KAAK;CACV,MAAM,KAAK;CACX,MAAM,KAAK;CACX,KAAK;CACL,KAAK,KAAK;CACV,KAAK,KAAK;CACV,MAAM,KAAK;CACX,MAAM,KAAK;CACX,MAAM,KAAK;CACX,MAAM,KAAK;CACX,KAAK,KAAK;CACV,KAAK,KAAK;AACZ;;;;;;;;AASA,IAAa,oBAAoB,UAAkB,QAAwB;CACzE,MAAM,MAAM,SAAS,YAAY,GAAG;CAEpC,OAAO,GADM,MAAM,IAAI,SAAS,MAAM,GAAG,GAAG,IAAI,SACjC,GAAG;AACpB;;;;;;;;;;;;;AC1HA,IAAa,kBAAkB,MAAc,YAA6B;CACxE,MAAM,SAAS,KACZ,MAAM,QAAQ,EACd,KAAK,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;CACjB,MAAM,SAAkB,CAAC;CACzB,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;EACtC,MAAM,QAAQ,OAAO;EACrB,MAAM,cACJ,IAAI,KAAK,UAAU,IACf,OACG,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAC3B,KAAK,MAAM,EACX,MAAM,CAAC,OAAO,IACjB;EACN,MAAM,YAAY,cAAc,GAAG,YAAY,MAAM,UAAU;EAC/D,OAAO,KAAK;GAAE,OAAO;GAAG,MAAM;GAAW,YAAY;GAAK,UAAU,MAAM,MAAM;EAAO,CAAC;EACxF,OAAO,MAAM,SAAS;CACxB;CACA,OAAO;AACT;;AAGA,IAAa,iBAAiB,MAAc,YAA6B;CACvE,MAAM,YAAY,KAAK,MAAM,gCAAgC,KAAK,CAAC,IAAI;CACvE,MAAM,SAAkB,CAAC;CACzB,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;EACzC,MAAM,WAAW,UAAU,GAAG,KAAK;EACnC,IAAI,CAAC,UAAU;EACf,MAAM,cACJ,IAAI,KAAK,UAAU,IACf,UACG,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAC3B,KAAK,GAAG,EACR,MAAM,CAAC,OAAO,IACjB;EACN,MAAM,YAAY,cAAc,GAAG,YAAY,GAAG,aAAa;EAC/D,OAAO,KAAK;GACV,OAAO,OAAO;GACd,MAAM;GACN,YAAY;GACZ,UAAU,MAAM,SAAS;EAC3B,CAAC;EACD,OAAO,SAAS,SAAS;CAC3B;CACA,OAAO;AACT;;AAGA,IAAa,cAAc,MAAc,WAAmB,YAA6B;CACvF,MAAM,SAAkB,CAAC;CACzB,MAAM,OAAO,KAAK,IAAI,GAAG,YAAY,OAAO;CAC5C,IAAI,IAAI;CACR,IAAI,MAAM;CACV,OAAO,IAAI,KAAK,QAAQ;EACtB,MAAM,QAAQ,KAAK,IAAI,GAAG,IAAI,OAAO;EACrC,MAAM,MAAM,IAAI;EAChB,OAAO,KAAK;GACV,OAAO;GACP,MAAM,KAAK,MAAM,OAAO,GAAG;GAC3B,YAAY;GACZ,UAAU,KAAK,IAAI,KAAK,KAAK,MAAM;EACrC,CAAC;EACD,KAAK;CACP;CACA,OAAO;AACT;AAEA,IAAM,UAAU,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC;AACzD,IAAM,UAAU,IAAI,YAAY;;AAGhC,IAAa,cAAc,UAA8B;CACvD,IAAI,MAAM,UAAU,GAAG;EACrB,IAAI,MAAM,OAAO,OAAQ,MAAM,OAAO,KACpC,OAAO,IAAI,YAAY,UAAU,EAAE,OAAO,MAAM,SAAS,CAAC,CAAC;EAE7D,IAAI,MAAM,OAAO,OAAQ,MAAM,OAAO,KACpC,OAAO,IAAI,YAAY,UAAU,EAAE,OAAO,MAAM,SAAS,CAAC,CAAC;CAE/D;CACA,OAAO,QAAQ,OAAO,KAAK,EAAE,QAAQ,UAAU,IAAI;AACrD;AAEA,IAAM,eAAe,QAAqB,MAAc,YAAiC;CACvF,OAAO,QAAQ,OAAO,IAAI;CAC1B,UAAU,KAAK;CACf,UAAU,iBAAiB,OAAO,UAAU,MAAM;AACpD;;AAKA,IAAa,YAAsB,OAAO,QAAQ;CAChD,MAAM,KAAK,MAAc,IAAI,MAAM,IAAI,KAAK;CAC5C,MAAM,OAAO,MAAc,IAAI,MAAM,MAAM,KAAK;CAChD,MAAM,UAAU,MAAc,IAAI,MAAM,SAAS,KAAK;CACtD,MAAM,OAAO,WAAW,IAAI,QAAQ,KAAK;CACzC,MAAM,SACJ,OAAO,aACH,cAAc,MAAM,OAAO,IAC3B,OAAO,UACL,WAAW,MAAM,MAAM,OAAO,IAC9B,eAAe,MAAM,OAAO;CACpC,OAAO;EAAE,MAAM;EAAQ,MAAM;EAAQ,QAAQ,KAAK,UAAU,MAAM;CAAE;AACtE;;;;;;AAOA,IAAa,kBAA4B,OAAO,QAAQ;CACtD,MAAM,SAAS,SAAS,IAAI,QAAQ,QAAQ;CAC5C,MAAM,OAAO,IAAI,QAAQ,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK;CAGnE,IAAI,EADF,KAAK,WAAW,OAAO,KAAK,SAAS,KAAK,QAAQ,SAAS,KAAK,MAAM,SAAS,KAAK,MAEpF,MAAM,IAAI,mBAAA,oBAAoB,CAC5B,gBACA,kBAAkB,OAAO,UAAU,KAAK,uCAC1C,CAAC;CAEH,MAAM,OAAO,WAAW,IAAI,QAAQ,KAAK;CACzC,OAAO;EACL,MAAM;EACN,MAAM;EACN,QAAQ;CACV;AACF;;AAGA,IAAa,sBAAgC,OAAO,QAAQ;CAC1D,MAAM,OAAO;EACX,UAAU,IAAI,QAAQ;EACtB,WAAW,IAAI,QAAQ;EACvB,YAAY,IAAI,QAAQ,MAAM;EAC9B,QAAQ,SAAS,IAAI,QAAQ,QAAQ;CACvC;CACA,OAAO;EAAE,MAAM;EAAQ,MAAM;EAAM,QAAQ,KAAK,UAAU,IAAI;CAAE;AAClE;AAEA,IAAM,aAAa,UAA2C;CAC5D,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,MAAM,MAAM;CACZ,OAAO,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,SAAS,GAAG,IAAI,IAAI,QAAQ,GAAG,IAAI,MAAM,EAAE;AACrF;AAEA,IAAM,kBAAkB,MAAc,UAA4B,gBAAgC;CAChG,IAAI,MAAM;CACV,KAAK,MAAM,KAAK,UAAU;EACxB,MAAM,UAAU,UAAU,CAAC;EAC3B,MACE,OAAO,YAAY,WACf,IAAI,MAAM,OAAO,EAAE,KAAK,WAAW,IACnC,IAAI,QAAQ,SAAS,WAAW;CACxC;CACA,OAAO;AACT;;AAGA,IAAa,aAAuB,OAAO,QAAQ;CAEjD,IAAI,CADS,IAAI,QAAQ,SAAS,YAC7B,EAAK,WAAW,OAAO,GAC1B,MAAM,IAAI,mBAAA,oBAAoB,CAC5B,UACA,iBAAiB,IAAI,QAAQ,SAAS,sCACxC,CAAC;CAEH,MAAM,MAAM,IAAI,KAAK,KAAK;CAC1B,MAAM,WAAY,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG;CACjD,MAAM,cAAc,MAAc,IAAI,MAAM,SAAS,KAAK;CAC1D,MAAM,OAAO,eAAe,WAAW,IAAI,QAAQ,KAAK,GAAG,UAAU,WAAW;CAChF,OAAO;EAAE,MAAM;EAAS,SAAS,YAAY,IAAI,SAAS,MAAM,KAAK;CAAE;AACzE;;AAGA,IAAa,iBAA2B,OAAO,QAAQ;CAErD,IAAI,CADS,IAAI,QAAQ,SAAS,YAC7B,EAAK,WAAW,OAAO,GAC1B,MAAM,IAAI,mBAAA,oBAAoB,CAC5B,eACA,mBAAmB,IAAI,QAAQ,SAAS,sCAC1C,CAAC;CAEH,MAAM,SAAS,MAAc,IAAI,MAAM,QAAQ;CAC/C,MAAM,UAAU,MAAc,IAAI,MAAM,SAAS,KAAK;CACtD,MAAM,OAAO,WAAW,IAAI,QAAQ,KAAK;CACzC,IAAI,CAAC,KAAK,SAAS,MAAM,GACvB,MAAM,IAAI,mBAAA,oBAAoB,CAC5B,eACA,2BAA2B,OAAO,MAAM,GAAG,EAAE,EAAE,EACjD,CAAC;CAEH,MAAM,UAAU,KAAK,QAAQ,QAAQ,OAAO;CAC5C,OAAO;EAAE,MAAM;EAAS,SAAS;GAAE,GAAG,IAAI;GAAS,OAAO,QAAQ,OAAO,OAAO;EAAE;CAAE;AACtF;;AAGA,IAAM,cAAc,OAAO,OAAe,OAAe,GAAW,MAA+B;CAEjG,QAAO,MADW,OAAO,SACd,oBAAoB,OAAO,OAAO,GAAG,CAAC;AACnD;;AAGA,IAAa,WAAqB,OAAO,QAAQ;CAC/C,MAAM,MAAM,IAAI,KAAK,KAAK;CAC1B,IAAI,IAAI,SAAS,MACf,MAAM,IAAI,mBAAA,oBAAoB,CAAC,QAAQ,yCAAyC,CAAC;CAEnF,MAAM,QAAQ,MAAM,IAAI,WAAW,IAAI,EAAE;CACzC,MAAM,IAAI,WAAW,IAAI,QAAQ,KAAK;CACtC,MAAM,IAAI,WAAW,MAAM,KAAK;CAChC,MAAM,QAAQ,MAAM,YAAY,IAAI,QAAQ,UAAU,MAAM,UAAU,GAAG,CAAC;CAS1E,OAAO;EAAE,MAAM;EAAQ,MAAA;GADR;GAAO,UANH,MADD,OAAO,SACF,UAAU,GAAG,CAAC,EAAE,KAAK,UAAU;IACpD,OAAO,KAAK,UAAU;IACtB,SAAS,KAAK,YAAY;IAC1B,OAAO,KAAK,SAAS;IACrB,OAAO,KAAK;GACd,EAC+B;EACR;EAAM,QAAQ;CAAM;AAC7C;;AAGA,IAAa,iBAA2B,OAAO,QAAQ;CACrD,MAAM,QAAQ,MAAc,IAAI,MAAM,OAAO;CAC7C,MAAM,OAAO,WAAW,IAAI,QAAQ,KAAK;CAEzC,MAAM,UAAS,MADG,OAAO,SACN,WAAW,MAAM,KAAK;CACzC,IAAI,WAAW,OACb,MAAM,IAAI,mBAAA,oBAAoB,CAC5B,eACA,mEACF,CAAC;CAEH,OAAO;EAAE,MAAM;EAAS,SAAS;GAAE,GAAG,IAAI;GAAS,OAAO,QAAQ,OAAO,MAAM;EAAE;CAAE;AACrF;;;;;;;;;;;;;;;ACjPA,IAAI;AACJ,IAAM,gBAAoC;CACxC,iBAAe,OAAO,SAAS,MAAM,MAAO,aAAa,IAAI,EAAE,UAAU,CAAiB;CAC1F,OAAO;AACT;AAEA,IAAM,UAAQ,MAAc,YAA2B;CACrD,MAAM,IAAI,mBAAA,oBAAoB,CAAC,MAAM,OAAO,CAAC;AAC/C;AAEA,IAAM,eAAa,UACjB,MACG,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAE3B,IAAM,eAAe,UACnB,MACG,QAAQ,WAAW,GAAG,EACtB,QAAQ,WAAW,IAAG,EACtB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,UAAU,GAAG;;;;;AAQ1B,IAAM,kBACJ,KACA,cACA,SACA,SACA,gBACwC;CACxC,IAAI,eAAe;CACnB,MAAM,SAAS,IAAI,OAAO,IAAI,aAAa,uBAAuB,aAAa,IAAI,GAAG;CAgCtF,OAAO;EAAE,KA/BM,IAAI,QAAQ,SAAS,SAAS;GAC3C,MAAM,YAAoE,CAAC;GAC3E,MAAM,SAAS,IAAI,OAAO,IAAI,QAAQ,yBAAyB,QAAQ,IAAI,GAAG;GAC9E,IAAI;GACJ,OAAQ,SAAS,OAAO,KAAK,IAAI,GAC/B,UAAU,KAAK;IACb,OAAO,OAAO;IACd,KAAK,OAAO,QAAQ,OAAO,GAAG;IAC9B,SAAS,YAAY,OAAO,EAAE;GAChC,CAAC;GAEH,IAAI,UAAU,WAAW,GAAG,OAAO;GACnC,MAAM,aAAa,UAAU,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE;GAC1D,MAAM,IAAI,IAAI,OAAO,QAAQ,QAAQ,QAAQ,KAAK;GAClD,MAAM,WAAW,WAAW,QAAQ,GAAG,WAAW;GAClD,IAAI,aAAa,YAAY,OAAO;GACpC,MAAM,UAAU,IAAI,OAAO,QAAQ,QAAQ,QAAQ,KAAK;GACxD,OAAO,QAAQ,KAAK,UAAU,GAAG;IAC/B,gBAAgB;IAChB,IAAI,CAAC,QAAQ,QAAQ;GACvB;GACA,IAAI,MAAM;GACV,KAAK,IAAI,IAAI,UAAU,SAAS,GAAG,KAAK,GAAG,KAAK;IAC9C,MAAM,KAAK,UAAU;IACrB,MAAM,QAAQ,YAAY,SAAS,MAAM,IAAI,4BAA0B;IACvE,MAAM,UAAU,MAAM,IAAI,YAAU,QAAQ,IAAI;IAChD,MACE,IAAI,MAAM,GAAG,GAAG,KAAK,IAAI,IAAI,UAAU,MAAM,GAAG,QAAQ,IAAI,QAAQ,KAAK,IAAI,MAAM,GAAG,GAAG;GAC7F;GACA,OAAO;EACT,CACc;EAAQ,YAAY;CAAa;AACjD;;AAGA,IAAM,kBAAkB,OACtB,KACA,MACA,cACwB;CAExB,MAAM,OADO,IAAI,QAAQ,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,KACjD,MAAS,KAAK,OAAO,SAAS;CAC3C,MAAM,QAAQ,MAAM,QAAM;CAC1B,IAAI;CACJ,IAAI;EACF,MAAM,MAAM,MAAM,UAAU,IAAI,QAAQ,KAAK;CAC/C,SAAS,KAAK;EAEZ,OAAK,MAAM,0CADI,sBAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG,GACO;EAC3C,MAAM;CAC1B;CACA,MAAM,QACJ,SAAS,SACL,OAAO,KAAK,IAAI,KAAK,EAAE,QAAQ,MAAM,8CAA8C,KAAK,CAAC,CAAC,IAC1F,OAAO,KAAK,IAAI,KAAK,EAAE,QAAQ,MAAM,+BAA+B,KAAK,CAAC,CAAC;CACjF,IAAI,MAAM,WAAW,GAAG,OAAK,MAAM,2DAA2D;CAC9F,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,MAAM,MAAM,IAAI,KAAK,IAAI,EAAG,MAAM,MAAM;EAC9C,MAAM,OAAO,UAAU,KAAK,IAAI;EAChC,IAAI,SAAS,KAAK,IAAI,KAAK,MAAM,IAAI;CACvC;CACA,MAAM,QAAQ,MAAM,IAAI,cAAc;EAAE,MAAM;EAAc,aAAa;CAAU,CAAC;CACpF,OAAO;EAAE,MAAM;EAAS,SAAS;GAAE,GAAG,IAAI;GAAS;EAAM;CAAE;AAC7D;AAEA,IAAM,iBAAiB,UAAkC;CACvD,IAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,UAAU,MAAM,QAAQ,uBAAuB,MAAM;EAC3D,OAAO,IAAI,OAAO,SAAS,GAAG;CAChC;CACA,MAAM,MAAM;CACZ,OAAO,IAAI,OAAO,IAAI,QAAQ,IAAI,MAAM,SAAS,GAAG,IAAI,IAAI,QAAQ,GAAG,IAAI,MAAM,EAAE;AACrF;;AAKA,IAAa,gBAA0B,OAAO,QAAQ;CACpD,MAAM,OAAO,IAAI,QAAQ,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK;CACnE,IAAI,KAAK,WAAW,OAAO,GAAG,OAAO,WAAe,GAAG;CACvD,IAAI,SAAS,KAAK,QAAQ,SAAS,KAAK,MAAM;EAC5C,MAAM,MAAM,IAAI,KAAK,KAAK;EAC1B,MAAM,WAAY,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG;EACjD,MAAM,cAAc,MAAc,IAAI,MAAM,SAAS,KAAK;EAC1D,OAAO,gBAAgB,KAAK,WAAW,KAAK,SAAS;GACnD,IAAI,MAAM;GACV,KAAK,MAAM,KAAK,UACd,MAAM,eACJ,KACA,SAAS,SAAS,QAAQ,OAC1B,SAAS,SAAS,QAAQ,OAC1B,cAAc,CAAC,GACf,WACF,EAAE;GAEJ,OAAO;EACT,CAAC;CACH;CACA,OACE,UACA,iBAAiB,KAAK,qHACxB;CACkB,MAAM,IAAI,MAAM,aAAa;AACjD;AAEA,IAAM,mBAAmB,SACtB,QAAQ,KAAK,QAAQ,KACtB,SAAS,MACT,SAAS,MACR,QAAQ,MAAM,QAAQ,MACvB,SAAS;AAEX,IAAM,qBAAqB,SAAyB;CAClD,IAAI,MAAM;CACV,KAAK,MAAM,MAAM,MAAM;EACrB,IAAI,gBAAgB,GAAG,WAAW,CAAC,CAAC,GAAG;EACvC,OAAO;CACT;CACA,OAAO;AACT;AAEA,IAAM,qBAAqB,KAAa,YACtC,IAAI,QACF,IAAI,OAAO,IAAI,QAAQ,yBAAyB,QAAQ,IAAI,GAAG,IAC9D,MAAM,YAAoB;CACzB,MAAM,UAAU,kBAAkB,YAAY,OAAO,CAAC;CACtD,IAAI,YAAY,YAAY,OAAO,GAAG,OAAO;CAC7C,OAAO,KAAK,QAAQ,SAAS,YAAU,OAAO,CAAC;AACjD,CACF;;AAGF,IAAa,kBAA4B,OAAO,QAAQ;CACtD,MAAM,OAAO,IAAI,QAAQ,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK;CACnE,IAAI,KAAK,WAAW,OAAO,GAAG;EAE5B,MAAM,UAAU,kBADH,IAAI,YAAY,EAAE,OAAO,IAAI,QAAQ,KAChB,CAAI;EACtC,OAAO;GAAE,MAAM;GAAS,SAAS;IAAE,GAAG,IAAI;IAAS,OAAO,IAAI,YAAY,EAAE,OAAO,OAAO;GAAE;EAAE;CAChG;CACA,IAAI,SAAS,KAAK,QAAQ,SAAS,KAAK,MACtC,OAAO,gBAAgB,KAAK,aAAa,KAAK,SAC5C,kBAAkB,KAAK,SAAS,SAAS,QAAQ,KAAK,CACxD;CAEF,OAAK,YAAY,gBAAgB,KAAK,uDAAuD;CAC3E,MAAM,IAAI,MAAM,aAAa;AACjD;AAEA,IAAM,iBAAiB,SACrB,KACG,QAAQ,SAAS,IAAI,EACrB,QAAQ,OAAO,IAAI,EACnB,QAAQ,aAAa,EAAE;;AAG5B,IAAa,mBAA6B,OAAO,QAAQ;CACvD,MAAM,OAAO,IAAI,QAAQ,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK;CACnE,IAAI,KAAK,WAAW,OAAO,GAAG;EAC5B,MAAM,OAAO,IAAI,YAAY,EAAE,OAAO,IAAI,QAAQ,KAAK;EACvD,OAAO;GACL,MAAM;GACN,SAAS;IAAE,GAAG,IAAI;IAAS,OAAO,IAAI,YAAY,EAAE,OAAO,cAAc,IAAI,CAAC;GAAE;EAClF;CACF;CACA,IAAI,SAAS,KAAK,QAAQ,SAAS,KAAK,MACtC,OAAO,gBAAgB,KAAK,cAAc,KAAK,SAAS;EACtD,MAAM,MAAM,SAAS,SAAS,QAAQ;EACtC,OAAO,IAAI,QACT,IAAI,OAAO,IAAI,IAAI,yBAAyB,IAAI,IAAI,GAAG,IACtD,MAAM,YAAoB;GACzB,MAAM,aAAa,cAAc,YAAY,OAAO,CAAC;GACrD,IAAI,eAAe,YAAY,OAAO,GAAG,OAAO;GAChD,OAAO,KAAK,QAAQ,SAAS,YAAU,UAAU,CAAC;EACpD,CACF;CACF,CAAC;CAEH,OAAK,aAAa,iBAAiB,KAAK,uDAAuD;CAC7E,MAAM,IAAI,MAAM,aAAa;AACjD;;AAGA,IAAa,oBAA8B,OAAO,QAAQ;CACxD,MAAM,OAAO,IAAI,QAAQ,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK;CACnE,IAAI,KAAK,WAAW,OAAO,GAAG,OAAO,eAAmB,GAAG;CAC3D,IAAI,SAAS,KAAK,QAAQ,SAAS,KAAK,MAAM;EAC5C,MAAM,SAAS,MAAc,IAAI,MAAM,QAAQ;EAC/C,MAAM,UAAU,MAAc,IAAI,MAAM,SAAS,KAAK;EACtD,IAAI,QAAQ;EACZ,MAAM,SAAS,MAAM,gBAAgB,KAAK,gBAAgB,KAAK,SAAS;GACtE,IAAI,QAAQ,GAAG,OAAO;GACtB,MAAM,UAAU,OAAO,QAAQ,uBAAuB,MAAM;GAC5D,MAAM,EAAE,KAAK,MAAM,eAAe,eAChC,KACA,SAAS,SAAS,QAAQ,OAC1B,SAAS,SAAS,QAAQ,OAC1B,IAAI,OAAO,OAAO,GAClB,OACF;GACA,SAAS;GACT,OAAO;EACT,CAAC;EACD,IAAI,UAAU,GACZ,OAAK,eAAe,2BAA2B,OAAO,MAAM,GAAG,EAAE,EAAE,EAAE;EAEvE,OAAO;CACT;CACA,OACE,eACA,mBAAmB,KAAK,4EAC1B;CACkB,MAAM,IAAI,MAAM,aAAa;AACjD;AAIA,IAAM,iBAAyC;CAC7C,OAAO;CACP,MAAM;CACN,YAAY;AACd;AAEA,IAAM,WAAmC;CACvC,KAAK;CACL,KAAK;CACL,MAAM;CACN,KAAK;CACL,KAAK;CACL,KAAK;CACL,MAAM;CACN,KAAK;CACL,MAAM;CACN,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,MAAM;CACN,OAAO;AACT;;;;;AAMA,IAAa,oBAA8B,OAAO,QAAQ;CACxD,MAAM,OAAO;CACb,MAAM,OAAO,IAAI,QAAQ,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK;CACnE,MAAM,YAAa,IAAI,KAAK,KAAK,SAAkC,CAAC,KAAK;CACzE,MAAM,UAAU,UAAU,SAAS,KAAK;CACxC,MAAM,QAAQ,SAA0B,WAAW,UAAU,SAAS,IAAI;CAE1E,IAAI,SAAS,KAAK,KAAK;EACrB,IAAI,CAAC,KAAK,OAAO,GACf,OAAK,MAAM,qEAAqE;EAElF,IAAI,CAAC,IAAI,QAAQ,WAAW,MAAM,QAAQ,GACxC,OACE,MACA,iKACF;EAEF,MAAM,SAAS,MAAc,IAAI,MAAM,QAAQ;EAC/C,MAAM,SAAS,MAAM,IAAI,QAAQ,QAAQ;GACvC,OAAO,IAAI,QAAQ;GACnB,UAAU;GACV,UAAU,IAAI,QAAQ;GACtB,IAAI;GACJ,SAAS,SAAS,EAAE,OAAO,IAAI,KAAA;GAC/B,QAAQ,IAAI;EACd,CAAC;EACD,IAAI,OAAO,QAAQ,WAAW,GAAG,OAAK,MAAM,0CAA0C;EACtF,MAAM,aAAa,SAAU,SAAS,WAAW,SAAS,WAAY,KAAA;EACtE,MAAM,WAA0B,CAAC;EACjC,KAAK,MAAM,CAAC,GAAG,QAAQ,OAAO,QAAQ,QAAQ,GAAG;GAC/C,IAAI,QAAQ,IAAI;GAChB,IAAI,WAAW,IAAI;GAGnB,IAAI,cAAc,SAAS,YAAY,MAAM,YAAY;IACvD,MAAM,YAAY,MAAM,IAAI,QAAQ,OAAO;KACzC;KACA;KACA,QAAQ,EAAE,IAAI,OAAQ;KACtB,QAAQ,IAAI;IACd,CAAC;IACD,QAAQ,UAAU;IAClB,WAAW,UAAU;GACvB;GACA,SAAS,KAAK;IACZ;IACA;IACA,UAAU,SAAS,IAAI,EAAE,GAAG,SAAS,MAAM,GAAG,EAAE,IAAI,QAAQ,QAAQ,KAAK,KAAK;GAChF,CAAC;EACH;EACA,OAAO;GAAE,MAAM;GAAc;EAAS;CACxC;CAMA,IAAI,CAHc;EAAC,KAAK;EAAM,KAAK;EAAM,KAAK;EAAM,KAAK;EAAK,KAAK;EAAK,KAAK;CAAG,EAAE,SAChF,IAEG,GACH,OAAK,MAAM,wBAAwB,KAAK,mDAAmD;CAG7F,MAAM,MAAM,OAAM,MADE,QAAM,GACF,UAAU,IAAI,QAAQ,KAAK;CACnD,MAAM,WAA0B,CAAC;CACjC,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,IAAI,KAAK,GAAG;EACrD,IAAI,MAAM,KAAK;EACf,MAAM,WAAW,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;EAC1C,MAAM,YAAY,OAAO,QAAQ,cAAc,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,QAAQ,CAAC,IAAI;EACvF,IAAI,CAAC,aAAa,CAAC,KAAK,SAAS,GAAG;EAEpC,IAAI,CAAC,gEAAgE,KAAK,IAAI,GAAG;EACjF,MAAM,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY,KAAK;EACxD,SAAS,KAAK;GACZ,OAAO,MAAM,MAAM,MAAM,YAAY;GACrC,UAAU,SAAS,QAAQ;GAC3B,UAAU;EACZ,CAAC;CACH;CACA,IAAI,SAAS,WAAW,GAAG,OAAK,MAAM,gDAAgD;CACtF,OAAO;EAAE,MAAM;EAAc;CAAS;AACxC;;AAKA,IAAa,cAAwB,OAAO,QAAQ;CAClD,MAAM,OAAO;CACb,MAAM,KAAK,MAAc,IAAI,MAAM,IAAI;CACvC,MAAM,YAAY,IAAI,QAAQ,eAAe,IAAI,QAAQ,QAAQ;CACjE,IAAI,CAAC,UAAU,SAAS,EAAE,GACxB,OACE,MACA,wDAAwD,GAAG,SAAS,IAAI,QAAQ,SAAS,uBAAuB,UAAU,KAAK,IAAI,KAAK,UAC1I;CASF,MAAM,UAAS,MAPM,IAAI,QAAQ,QAAQ;EACvC,OAAO,IAAI,QAAQ;EACnB,UAAU,IAAI,QAAQ;EACtB,UAAU,IAAI,QAAQ;EACtB;EACA,QAAQ,IAAI;CACd,CAAC,GACqB,QAAQ;CAC9B,IAAI,CAAC,QAAQ,OAAK,MAAM,mCAAmC;CAC3D,MAAM,MAAM,IAAI,QAAQ,SAAS,YAAY,GAAG;CAChD,MAAM,OAAO,MAAM,IAAI,IAAI,QAAQ,SAAS,MAAM,GAAG,GAAG,IAAI,IAAI,QAAQ;CACxE,OAAO;EACL,MAAM;EACN,SAAS;GAAE,OAAO,OAAQ;GAAO,UAAU,OAAQ;GAAU,UAAU,GAAG,KAAK,GAAG;EAAK;CACzF;AACF;;AAGA,IAAa,YAA+C;CAC1D,CAAC,UAAU,aAAa;CACxB,CAAC,YAAY,eAAe;CAC5B,CAAC,aAAa,gBAAgB;CAC9B,CAAC,eAAe,iBAAiB;CACjC,CAAC,kBAAkB,iBAAiB;CACpC,CAAC,WAAW,WAAW;AACzB;;;;;;;;;;;;;ACvZA,IAAI;AACJ,IAAM,cAAsC;CAC1C,iBAAiB,OAAO,WAAW,MAAM,MAAO,aAAa,IAAI,EAAE,UAAU,CAAmB;CAChG,OAAO;AACT;AAEA,IAAM,UAAQ,MAAc,YAA2B;CACrD,MAAM,IAAI,mBAAA,oBAAoB,CAAC,MAAM,OAAO,CAAC;AAC/C;;AAGA,IAAM,cAAc,OAAO,KAAkB,SAAsC;CACjF,MAAM,OAAO,IAAI,QAAQ,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK;CACnE,IAAI,SAAS,KAAK,MAAM,OAAO,IAAI,QAAQ;CAC3C,MAAM,gBAAgB,6BAA6B,IAAI;CACvD,IAAI,SAAS,KAAK,OAAO,SAAS,KAAK,KAAK;EAC1C,IAAI,CAAC,IAAI,QAAQ,WAAW,MAAM,MAAM,GACtC,OACE,MACA,iBAAiB,KAAK,0IACxB;EASF,MAAM,UAAS,MAPM,IAAI,QAAQ,QAAQ;GACvC,OAAO,IAAI,QAAQ;GACnB,UAAU;GACV,UAAU,IAAI,QAAQ;GACtB,IAAI;GACJ,QAAQ,IAAI;EACd,CAAC,GACqB,QAAQ;EAC9B,IAAI,CAAC,QAAQ,OAAK,MAAM,qDAAqD;EAC7E,OAAO,OAAQ;CACjB;CACA,IAAI,eAAe,OAAK,MAAM,aAAa;CAC3C,OAAK,MAAM,uDAAuD,MAAM;CACtD,MAAM,IAAI,MAAM,aAAa;AACjD;;AAUA,IAAM,eAAe,OACnB,KACA,MACA,WACqD;CACrD,MAAM,YAAY,MAAM,YAAY,KAAK,IAAI;CAE7C,MAAM,KAAK,KAAI,OADO,MAAM,IACL,SAAS;CAChC,IAAI;EACF,MAAM,GAAG,KAAK,KACZ,UAAU,OAAO,MACf,UAAU,YACV,UAAU,aAAa,UAAU,UACnC,CACF;CACF,SAAS,KAAK;EAEZ,OAAK,MAAM,mCADI,sBAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG,GACA;CACxD;CACA,MAAM,OAAO,EAAE;CAEf,OAAO;EACL,MAAM;EACN,SAAS;GACP,OAAO,IAJK,WAAW,MAAM,GAAG,KAAK,YAAY,CAI1C;GACP,UAAU,KAAK;GACf,UAAU,iBAAiB,IAAI,QAAQ,UAAU,MAAM;EACzD;CACF;AACF;;AAGA,IAAM,gBACJ,MACA,IACA,aACwB;CACxB,IAAI,aAAa,KAAA,GAAW;EAC1B,MAAM,QAAQ,GAAG,WAAW;EAC5B,IAAI,CAAC,OAAO,OAAK,MAAM,gCAAgC;EACvD,OAAO;CACT;CAEA,IAAI,OAAO,aAAa,UAAU;EAChC,MAAM,UAAU,GAAG,WAAW,WAAW;EACzC,IAAI,SAAS,OAAO;EAEpB,IADe,GAAG,aAAa,OAAO,QAAQ,CAC1C,GACF,OACE,MACA,qBAAqB,SAAS,uBAAuB,SAAS,8BAA8B,SAAS,EACvG;EAEF,OACE,MACA,eAAe,SAAS,8CAA8C,GAAG,WAAW,OAAO,EAC7F;CACF;CACA,MAAM,KAAK,GAAG,aAAa,QAAkB;CAC7C,IAAI,CAAC,IAEH,OAAK,MAAM,mBAAmB,SAAS,aADzB,GAAG,WAAW,KAAK,MAAM,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,IACP,GAAO;CAE7D,OAAO;AACT;AAEA,IAAM,wBAAwB,QAAwB;CACpD,IAAI,IAAI;CACR,KAAK,MAAM,MAAM,IAAI,YAAY,GAAG,IAAI,IAAI,MAAM,GAAG,WAAW,CAAC,IAAI;CACrE,OAAO;AACT;AAIA,IAAM,eAAe,MAAc,UAAwC;CACzE,IAAI,UAAU,MAAM,OAAO;CAC3B,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,WAC7E,OAAO;CAET,OAAK,MAAM,6DAA6D,OAAO,OAAO;CACpE,MAAM,IAAI,MAAM,aAAa;AACjD;;AAKA,IAAa,mBAA6B,OAAO,QAAQ;CACvD,MAAM,OAAO;CACb,MAAM,OAAO,IAAI,KAAK,KAAK;CAC3B,IAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,KAAK,CAAC,KAAK,MAAM,MAAM,OAAO,GACxE,OAAK,MAAM,sEAAsE;CAEnF,MAAM,SAAS,MAAc,IAAI,MAAM,QAAQ;CAC/C,MAAM,QAAQ,MAAc,IAAI,MAAM,OAAO;CAC7C,OAAO,aAAa,KAAK,OAAO,OAAO;EACrC,MAAM,KAAK,aAAa,MAAM,IAAI,MAAuB,IAAI,MAAM,OAAO,CAAC;EAC3E,MAAM,WACJ,WAAW,KAAA,IAAY,SAAS,UAAU,KAAA,IAAY,QAAQ,IAAI,GAAG,WAAW;EAClF,MAAM,WAAY,KAAqB,KAAK,MAAM,EAAE,KAAK,MAAM,YAAY,MAAM,CAAC,CAAC,CAAC;EACpF,GAAG,WAAW,UAAU,GAAG,GAAG,QAAQ;EACtC,OAAO,EAAE,OAAO,SAAS,OAAO;CAClC,CAAC;AACH;;AAGA,IAAa,sBAAgC,OAAO,QAAQ;CAC1D,MAAM,OAAO;CACb,MAAM,UAAU,IAAI,KAAK,KAAK;CAE9B,MAAM,UADc,IAAI,KAAK,KAAK,WAGhC,SAAS,KAAK,YAAY,EAAE,OAAO,EAA8C;CACnF,IAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,GAChD,OAAK,MAAM,gEAAgE;CAE7E,MAAM,SAAS,MAAc,IAAI,MAAM,QAAQ;CAC/C,MAAM,QAAQ,MAAc,IAAI,MAAM,OAAO;CAC7C,OAAO,aAAa,KAAK,OAAO,OAAO;EACrC,MAAM,KAAK,aAAa,MAAM,IAAI,MAAuB,IAAI,MAAM,OAAO,CAAC;EAC3E,MAAM,WACJ,WAAW,KAAA,IAAY,SAAS,UAAU,KAAA,IAAY,QAAQ,IAAI,GAAG,cAAc;EACrF,KAAK,MAAM,CAAC,GAAG,QAAQ,QAAS,QAAQ,GAAG;GACzC,IAAI,OAAO,KAAK,WAAW,UAAU,OAAK,MAAM,oCAAoC;GACpF,GAAG,cAAc,WAAW,GAAG,GAAG,CAChC,IAAI,QACJ,IAAI,IAAI,UAAU,CAAC,GAAG,KAAK,MAAM,YAAY,MAAM,CAAC,CAAC,CACvD,CAAC;EACH;EACA,OAAO,EAAE,OAAO,QAAS,OAAO;CAClC,CAAC;AACH;;AAGA,IAAa,uBAAiC,OAAO,QAAQ;CAC3D,MAAM,OAAO;CACb,MAAM,UAAU,IAAI,KAAK,KAAK;CAC9B,IAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,GAChD,OACE,MACA,qFACF;CAEF,OAAO,aAAa,KAAK,OAAO,OAAO;EACrC,MAAM,KAAK,aAAa,MAAM,IAAI,MAAuB,IAAI,MAAM,OAAO,CAAC;EAC3E,IAAI,WAAW;EACf,KAAK,MAAM,OAAO,SAA2C;GAC3D,MAAM,UAAU,IAAI;GACpB,MAAM,MAAM,IAAI;GAChB,MAAM,MAAM,IAAI;GAChB,IAAI;GACJ,IAAI,SACF,OAAO,GAAG,QAAQ,OAAO;QACpB,IAAI,QAAQ,KAAA,KAAa,QAAQ,KAAA,GACtC,OACE,OAAO,QAAQ,WACX,GAAG,QAAQ,KAAK,qBAAqB,GAAG,CAAC,IACzC,GAAG,QAAQ,KAAK,GAAG;QACpB;IACL,OAAK,MAAM,gDAAgD;IAC3D;GACF;GACA,MAAM,QAAQ,IAAI;GAClB,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG,GACnD,KAAK,QAAQ,EAAE,SAAS,MAAM,MAAM,CAAC,EAAE;QAEvC,KAAK,QAAQ,YAAY,MAAM,KAAK;GAEtC,YAAY;EACd;EACA,OAAO,EAAE,SAAS;CACpB,CAAC;AACH;;AAGA,IAAa,sBAAgC,OAAO,QAAQ;CAC1D,MAAM,OAAO;CACb,MAAM,OAAO,IAAI,KAAK,KAAK;CAC3B,OAAO,aAAa,KAAK,OAAO,OAAO;EACrC,MAAM,KAAK,aAAa,MAAM,IAAI,MAAuB,IAAI,MAAM,OAAO,CAAC;EAC3E,KAAK,MAAM,KAAK,CAAC,GAAG,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,GAAG,WAAW,GAAG,CAAC;EACnE,OAAO,EAAE,SAAS,KAAK,OAAO;CAChC,CAAC;AACH;;AAGA,IAAa,yBAAmC,OAAO,QAAQ;CAC7D,MAAM,OAAO;CACb,MAAM,UAAU,IAAI,KAAK,KAAK;CAC9B,OAAO,aAAa,KAAK,OAAO,OAAO;EACrC,MAAM,KAAK,aAAa,MAAM,IAAI,MAAuB,IAAI,MAAM,OAAO,CAAC;EAC3E,KAAK,MAAM,KAAK,CAAC,GAAG,OAAO,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,GAAG,cAAc,GAAG,CAAC;EACzE,OAAO,EAAE,SAAS,QAAQ,OAAO;CACnC,CAAC;AACH;;AAGA,IAAa,uBAAiC,OAAO,QAAQ;CAC3D,MAAM,OAAO;CACb,MAAM,QAAQ,MAAuB,IAAI,MAAM,OAAO;CACtD,MAAM,KAAK,MAAc,IAAI,MAAM,IAAI;CACvC,OAAO,aAAa,KAAK,OAAO,OAAO;EACrC,MAAM,KAAK,GAAG,aAAa,KAAK;EAChC,IAAI,CAAC,IAEH,OAAK,MAAM,gDAAgD,MAAM,aADnD,GAAG,WAAW,KAAK,MAAM,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,IACmB,GAAO;EAEvF,GAAI,OAAO;EACX,OAAO,EAAE,UAAU,EAAE;CACvB,CAAC;AACH;;AAGA,IAAa,oBAA8B,OAAO,QAAQ;CACxD,MAAM,OAAO;CACb,MAAM,OAAO,MAAc,IAAI,MAAM,MAAM;CAC3C,MAAM,KAAK,MAAc,IAAI,MAAM,IAAI;CACvC,OAAO,aAAa,KAAK,OAAO,OAAO;EACrC,IAAI,GAAG,aAAa,IAAI,GAAG,OAAK,MAAM,kBAAkB,KAAK,iBAAiB;EAC9E,MAAM,KAAK,GAAG,aAAa,IAAI;EAC/B,IAAI,OAAO,KAAA,GAAW;GACpB,MAAM,MAAM,GAAG;GACf,MAAM,QAAQ,IAAI,QAAQ,EAAE;GAC5B,IAAI,UAAU,KAAK,GACjB,IAAI,SAAS,GAAG,MAAM;IACnB,EAAsC,UACrC,MAAM,KAAK,KAAK,IAAI,KAAK,MAAM,IAAI,QAAQ,IAAI,IAAI,IAAI;GAC3D,CAAC;EAEL;EACA,OAAO,EAAE,OAAO,EAAE;CACpB,CAAC;AACH;;AAGA,IAAa,uBAAiC,OAAO,QAAQ;CAC3D,MAAM,OAAO;CACb,MAAM,QAAQ,MAAuB,IAAI,MAAM,OAAO;CACtD,OAAO,aAAa,KAAK,OAAO,OAAO;EACrC,MAAM,KAAK,GAAG,aAAa,KAAK;EAChC,IAAI,CAAC,IAEH,OAAK,MAAM,gDAAgD,MAAM,aADnD,GAAG,WAAW,KAAK,MAAM,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,IACmB,GAAO;EAEvF,GAAG,gBAAgB,GAAI,EAAE;EACzB,OAAO,EAAE,SAAS,EAAE;CACtB,CAAC;AACH;;AAGA,IAAa,yBAAmC,OAAO,QAAQ;CAC7D,MAAM,OAAO;CACb,MAAM,QAAQ,IAAI,KAAK,KAAK;CAC5B,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAC5C,OAAK,MAAM,yEAAyE;CAEtF,OAAO,aAAa,KAAK,OAAO,OAAO;EACrC,MAAM,OAAO;EACb,IAAI,KAAK,WAAW,GAAG,WAAW,QAChC,OACE,MACA,qEAAqE,GAAG,WAAW,OAAO,EAC5F;EAEF,MAAM,YAAmC,CAAC;EAC1C,MAAM,uBAAO,IAAI,IAAY;EAC7B,KAAK,MAAM,OAAO,MAAM;GACtB,MAAM,KAAK,OAAO,QAAQ,WAAW,GAAG,WAAW,MAAM,KAAK,GAAG,aAAa,GAAG;GACjF,IAAI,CAAC,IAAI,OAAK,MAAM,oBAAoB,OAAO,GAAG,GAAG;GACrD,IAAI,KAAK,IAAI,GAAI,EAAE,GAAG,OAAK,MAAM,8BAA8B,OAAO,GAAG,GAAG;GAC5E,KAAK,IAAI,GAAI,EAAE;GACf,UAAU,KAAK,EAAG;EACpB;EAEA,UAAU,SAAS,IAAI,MAAM;GAC1B,GAAuC,UAAU,IAAI;EACxD,CAAC;EACD,OAAO,EAAE,UAAU,UAAU,OAAO;CACtC,CAAC;AACH;;AAGA,IAAa,0BAAoC,OAAO,QAAQ;CAC9D,MAAM,OAAO;CACb,MAAM,YAAY,MAAc,IAAI,MAAM,YAAY,KAAK;CAC3D,MAAM,SAAS,IAAI,KAAK,KAAK;CAC7B,MAAM,SAAS,IAAI,KAAK,KAAK;CAC7B,MAAM,OAAO,IAAI,KAAK,KAAK;CAC3B,OAAO,aAAa,KAAK,OAAO,OAAO;EACrC,MAAM,KAAK,aAAa,MAAM,IAAI,MAAuB,IAAI,MAAM,OAAO,CAAC;EAC3E,IAAI,WAAW;EACf,MAAM,4BAAY,IAAI,IAAoB;EAC1C,GAAG,OAAO,SAAS,EAAE,SAAS,EAAE,cAAc,MAAM,IAAI,MAAM,cAAc;GAC1E,IAAI,OAAO,KAAK,UAAU,UAAU,UAAU,IAAI,KAAK,OAAO,SAAS;EACzE,CAAC;EACD,IAAI,QACF,KAAK,MAAM,EAAE,MAAM,QAAQ,QAAQ;GACjC,MAAM,SAAS,UAAU,IAAI,IAAI;GACjC,IAAI,WAAW,KAAA,GAAW;IACxB,GAAG,OAAO,SAAS,EAAE,QAAQ,MAAM,EAAE,QAAQ;IAC7C,UAAU,OAAO,IAAI;IACrB,UAAU,IAAI,IAAI,MAAM;IACxB,YAAY;GACd;EACF;EAEF,IAAI,MAAM;GACR,MAAM,OAAO,KACV,KAAK,SAAS,UAAU,IAAI,IAAI,CAAC,EACjC,QAAQ,MAAmB,MAAM,KAAA,CAAS,EAC1C,MAAM,GAAG,MAAM,IAAI,CAAC;GACvB,KAAK,MAAM,OAAO,MAAM;IACtB,GAAG,cAAc,KAAK,CAAC;IACvB,YAAY;GACd;EACF;EACA,IAAI,QAAQ;GACV,MAAM,OAAO,IAAI,IAAI,MAAM;GAC3B,MAAM,OAAiB,CAAC;GACxB,GAAG,OAAO,SAAS,EAAE,SAAS,EAAE,cAAc,MAAM,IAAI,MAAM,cAAc;IAC1E,IAAI,OAAO,KAAK,UAAU,YAAY,CAAC,KAAK,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,SAAS;GAClF,CAAC;GACD,KAAK,MAAM,GAAG,MAAM,IAAI,CAAC;GACzB,KAAK,MAAM,OAAO,MAAM;IACtB,GAAG,cAAc,KAAK,CAAC;IACvB,YAAY;GACd;EACF;EACA,OAAO,EAAE,SAAS;CACpB,CAAC;AACH;;AAGA,IAAa,cAAiD;CAC5D,CAAC,kBAAkB,gBAAgB;CACnC,CAAC,qBAAqB,mBAAmB;CACzC,CAAC,sBAAsB,oBAAoB;CAC3C,CAAC,qBAAqB,mBAAmB;CACzC,CAAC,wBAAwB,sBAAsB;CAC/C,CAAC,sBAAsB,oBAAoB;CAC3C,CAAC,mBAAmB,iBAAiB;CACrC,CAAC,sBAAsB,oBAAoB;CAC3C,CAAC,wBAAwB,sBAAsB;CAC/C,CAAC,yBAAyB,uBAAuB;AACnD;;;;;;;;;;;;;;ACpYA,IAAI;AACJ,IAAM,gBAAoC;CACxC,iBAAe,OAAO,SAAS,MAAM,MAAO,aAAa,IAAI,EAAE,UAAU,CAAiB;CAC1F,OAAO;AACT;AAEA,IAAM,iBAAiB;AAEvB,IAAM,UAAQ,MAAc,YAA2B;CACrD,MAAM,IAAI,mBAAA,oBAAoB,CAAC,MAAM,OAAO,CAAC;AAC/C;AAIA,IAAM,aAAa,UACjB,MACG,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAE3B,IAAM,eAAe,UAA0B,MAAM,QAAQ,uBAAuB,MAAM;;AAG1F,IAAM,kBAAkB,UAAkB,cAA8B;CAEtE,MAAM,QAAQ,CAAC,GADC,SAAS,MAAM,GAAG,EAAE,MAAM,GAAG,EAC3B,GAAS,GAAG,UAAU,MAAM,GAAG,CAAC;CAClD,MAAM,MAAgB,CAAC;CACvB,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,SAAS,MAAM,SAAS,KAAK;EACjC,IAAI,SAAS,MAAM,IAAI,IAAI;OACtB,IAAI,KAAK,IAAI;CACpB;CACA,OAAO,IAAI,KAAK,GAAG;AACrB;AAgBA,IAAM,cAAc,OAAO,MAAc,KAAc,SAAkC;CACvF,MAAM,OAAO,IAAI,KAAK,IAAI;CAC1B,IAAI,CAAC,MAAM,OAAK,MAAM,iDAAiD,MAAM;CAC7E,OAAO,KAAM,MAAM,MAAM;AAC3B;AAEA,IAAM,2BAA2B,SAAiB,UAAiC;CACjF,MAAM,KAAK,IAAI,OACb,4BAA4B,YAAY,KAAK,EAAE,+BAC/C,GACF;CACA,OAAO,QAAQ,MAAM,EAAE,IAAI,MAAM;AACnC;AAEA,IAAM,oBAAoB,OAAO,MAAc,QAA8C;CAC3F,MAAM,kBAAkB,MAAM,YAAY,MAAM,KAAK,sBAAsB;CAC3E,MAAM,UAAU,MAAM,YAAY,MAAM,KAAK,iCAAiC;CAC9E,MAAM,iBAAiB,gBAAgB,MAAM,sCAAsC;CACnF,IAAI,CAAC,gBAAgB,OAAK,MAAM,oDAAoD;CACpF,MAAM,YAAY,eAAgB,GAAG,MAAM,qBAAqB,KAAK,CAAC;CACtE,MAAM,UAAwB,CAAC;CAC/B,KAAK,MAAM,OAAO,WAAW;EAC3B,MAAM,MAAM,IAAI,MAAM,gBAAgB,IAAI;EAC1C,MAAM,SAAS,IAAI,MAAM,cAAc,IAAI;EAC3C,IAAI,CAAC,OAAO,CAAC,QAAQ;EACrB,MAAM,SAAS,wBAAwB,SAAS,GAAG;EACnD,IAAI,CAAC,QAAQ;EACb,MAAM,YAAY,eAAe,wBAAwB,MAAM;EAC/D,IAAI;EACJ,MAAM,YAAY,IAAI,KAAK,SAAS;EACpC,IAAI,WAEF,SAAQ,MADe,UAAU,MAAM,MAAM,GAC5B,MAAM,gCAAgC,IAAI;EAE7D,QAAQ,KAAK;GAAE;GAAK,SAAS,OAAO,MAAM;GAAG,UAAU;GAAK;GAAQ;EAAM,CAAC;CAC7E;CACA,OAAO;EAAE;EAAiB;EAAS;CAAQ;AAC7C;AAEA,IAAM,sBAAsB,iBAAyB,SACnD,gBAAgB,QACd,sCACA,eAAe,KAAK,KAAK,EAAE,EAAE,cAC/B;;AAGF,IAAM,gBACJ,MACA,SACA,aACe;CACf,IAAI,aAAa,KAAA,GAAW;EAC1B,MAAM,QAAQ,QAAQ;EACtB,IAAI,CAAC,OAAO,OAAK,MAAM,gCAAgC;EACvD,OAAO;CACT;CAEA,IAAI,OAAO,aAAa,UAAU;EAChC,MAAM,QAAQ,QAAQ,WAAW;EACjC,IAAI,CAAC,OACH,OAAK,MAAM,eAAe,SAAS,6BAA6B,QAAQ,OAAO,SAAS;EAE1F,OAAO;CACT;CACA,MAAM,UAAU,QAAQ,MAAM,MAAM,EAAE,UAAU,QAAQ;CACxD,IAAI,CAAC,SAAS,OAAK,MAAM,oBAAoB,SAAS,EAAE;CACxD,OAAO;AACT;AAEA,IAAM,mBAAmB,YAA4B;CACnD,IAAI,MAAM;CACV,KAAK,MAAM,SAAS,QAAQ,SAAS,kBAAkB,GAAG,MAAM,KAAK,IAAI,KAAK,OAAO,MAAM,EAAE,CAAC;CAC9F,OAAO;AACT;AAEA,IAAM,qBAAqB,QAAyB;CAClD,IAAI,MAAM;CACV,KAAK,MAAM,QAAQ,OAAO,KAAK,IAAI,KAAK,GAAG;EACzC,MAAM,QAAQ,KAAK,MAAM,gCAAgC;EACzD,IAAI,OAAO,MAAM,KAAK,IAAI,KAAK,OAAO,MAAM,EAAE,CAAC;CACjD;CACA,OAAO;AACT;AAEA,IAAM,iBAAiB,YACrB,QAAQ,QAAQ,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,OAAO,GAAG,GAAG;AAE1D,IAAM,0BAA0B,iBAAyB,gBAAgC;CACvF,MAAM,WAAW,oBAAoB,YAAY;CACjD,IAAI,gBAAgB,SAAS,aAAa,SAAS,EAAE,GAAG,OAAO;CAC/D,MAAM,WACJ,uBAAuB,SAAS;CAElC,OAAO,gBAAgB,QAAQ,YAAY,GAAG,SAAS,SAAS;AAClE;AAEA,IAAM,iBAAiB,UAAkB,UAA0B;CACjE,IAAI,+BAA+B,KAAK,QAAQ,GAC9C,OAAO,SAAS,QAAQ,oCAAoC,KAAK,UAAU,KAAK,EAAE,GAAG;CAEvF,OAAO;AACT;;AAKA,IAAM,cAAc,OAAO,KAAkB,SAAsC;CACjF,MAAM,OAAO,IAAI,QAAQ,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK;CACnE,IAAI,SAAS,KAAK,MAAM,OAAO,IAAI,QAAQ;CAC3C,IAAI,SAAS,KAAK,KAAK;EACrB,IAAI,CAAC,IAAI,QAAQ,WAAW,MAAM,MAAM,GACtC,OACE,MACA,4JACF;EASF,MAAM,UAAS,MAPM,IAAI,QAAQ,QAAQ;GACvC,OAAO,IAAI,QAAQ;GACnB,UAAU;GACV,UAAU,IAAI,QAAQ;GACtB,IAAI;GACJ,QAAQ,IAAI;EACd,CAAC,GACqB,QAAQ;EAC9B,IAAI,CAAC,QAAQ,OAAK,MAAM,yDAAyD;EACjF,OAAO,OAAQ;CACjB;CACA,MAAM,SAAS,6BAA6B,IAAI;CAChD,IAAI,QAAQ,OAAK,MAAM,MAAM;CAC7B,OAAK,MAAM,yDAAyD,MAAM;CACxD,MAAM,IAAI,MAAM,aAAa;AACjD;AAEA,IAAM,mBAAmB,OACvB,KACA,MACA,WACqD;CACrD,MAAM,QAAQ,MAAM,YAAY,KAAK,IAAI;CACzC,MAAM,QAAQ,MAAM,QAAM;CAC1B,IAAI;CACJ,IAAI;EACF,MAAM,MAAM,MAAM,UAAU,KAAK;CACnC,SAAS,KAAK;EAEZ,OAAK,MAAM,oCADI,sBAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG,GACC;EACrC,MAAM;CAC1B;CACA,MAAM,SAAS,MAAM,kBAAkB,MAAM,GAAG;CAChD,MAAM,OAAO,KAAK,MAAM;CAExB,OAAO;EACL,MAAM;EACN,SAAS;GACP,OAAO,MAJO,IAAI,cAAc;IAAE,MAAM;IAAc,aAAa;GAAU,CAAC;GAK9E,UAAU,KAAK;GACf,UAAU,iBAAiB,IAAI,QAAQ,UAAU,MAAM;EACzD;CACF;AACF;;AAKA,IAAa,gBAA0B,OAAO,QAAQ;CACpD,MAAM,OAAO;CACb,MAAM,KAAK,MAAc,IAAI,MAAM,IAAI;CACvC,MAAM,QAAQ,MAAc,IAAI,MAAM,OAAO;CAC7C,OAAO,iBAAiB,KAAK,MAAM,OAAO,KAAK,WAAW;EACxD,IAAI,OAAO,QAAQ,WAAW,GAAG,OAAK,MAAM,8CAA8C;EAC1F,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,SAAS;EACxD,MAAM,eAAe,eAAe,wBAAwB,SAAS,MAAM;EAC3E,MAAM,cAAc,MAAM,YAAY,MAAM,KAAK,YAAY;EAC7D,MAAM,iBAAiB,kBAAkB,GAAG,IAAI;EAChD,MAAM,eAAe,mBAAmB,eAAe;EACvD,IAAI,KAAK,cAAc,QAAQ,cAAc,aAAa,KAAK,IAAI,WAAW;EAC9E,MAAM,cAAc,aAAa,MAAM,kBAAkB,IAAI;EAC7D,MAAM,eAAe,cACjB,IAAI,KAAK,yBAAyB,YAAY,UAAU,IACxD;EACJ,IAAI,cAAc;GAChB,MAAM,UAAU,MAAM,aAAa,MAAM,MAAM;GAC/C,IAAI,KACF,yBAAyB,eAAe,YACxC,QAAQ,QAAQ,uDAAuD,EAAE,CAC3E;EACF;EACA,MAAM,SAAS,MAAM,gBAAgB,OAAO,OAAO,IAAI;EACvD,MAAM,YAAY,gBAAgB,cAAc,OAAO,OAAO,IAAI,EAAE,UAAU,OAAO;EACrF,MAAM,UAAU,qBAAqB,OAAO,UAAU,eAAe,wBAAwB,eAAe;EAC5G,IAAI,KACF,mCACA,OAAO,QAAQ,QAAQ,oBAAoB,GAAG,QAAQ,iBAAiB,CACzE;EACA,MAAM,WACJ,OAAO,KAAA,IACH,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE,GAAG,OAAO,QAAQ,SAAS,CAAC,IACnD,OAAO,QAAQ,SAAS;EAC9B,MAAM,OAAO,OAAO,QAAQ,KAAK,MAAM,EAAE,QAAQ;EACjD,KAAK,OAAO,WAAW,GAAG,GAAG,SAAS;EACtC,IAAI,KAAK,wBAAwB,mBAAmB,OAAO,iBAAiB,IAAI,CAAC;EACjF,MAAM,eAAe,MAAM,YAAY,MAAM,KAAK,qBAAqB;EACvE,IAAI,KAAK,uBAAuB,uBAAuB,cAAc,cAAc,CAAC;CACtF,CAAC;AACH;;AAGA,IAAa,uBAAiC,OAAO,QAAQ;CAC3D,MAAM,OAAO;CACb,MAAM,OAAO,MAAc,IAAI,MAAM,MAAM;CAC3C,MAAM,cAAc,MAAc,IAAI,MAAM,aAAa;CACzD,OAAO,iBAAiB,KAAK,MAAM,OAAO,KAAK,WAAW;EAExD,MAAM,YAAY,eAAe,wBADlB,aAAa,MAAM,OAAO,SAAS,MAAuB,IAAI,MAAM,OAAO,CACjC,EAAO,MAAM;EACtE,MAAM,WAAW,MAAM,YAAY,MAAM,KAAK,SAAS;EACvD,IAAI,UAAU;EACd,IAAI,UAAU;EACd,IAAI,aAAa;GACf,IAAI,mBAAmB;GACvB,UAAU,SAAS,QAAQ,6BAA6B,aAAa;IACnE,IACE,CAAC,IAAI,OAAO,4BAA4B,YAAY,WAAW,EAAE,UAAU,GAAG,EAAE,KAC9E,QACF,GAEA,OAAO;IAET,mBAAmB;IACnB,OAAO,SAAS,QAAQ,8BAA8B;KACpD,UAAU;KACV,OAAO,QAAQ,UAAU,IAAI,EAAE;IACjC,CAAC;GACH,CAAC;GACD,IAAI,CAAC,kBACH,OAAK,MAAM,yBAAyB,YAAY,wBAAwB;EAC5E,OACE,UAAU,SAAS,QAAQ,8BAA8B;GACvD,UAAU;GACV,OAAO,QAAQ,UAAU,IAAI,EAAE;EACjC,CAAC;EAEH,IAAI,CAAC,SAAS,OAAK,MAAM,0CAA0C;EACnE,IAAI,KAAK,WAAW,OAAO;CAC7B,CAAC;AACH;;AAGA,IAAa,wBAAkC,OAAO,QAAQ;CAC5D,MAAM,OAAO;CACb,MAAM,UAAU,IAAI,KAAK,KAAK;CAC9B,IAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,GAChD,OAAK,MAAM,yEAAyE;CAEtF,OAAO,iBAAiB,KAAK,MAAM,OAAO,KAAK,WAAW;EAExD,MAAM,YAAY,eAAe,wBADlB,aAAa,MAAM,OAAO,SAAS,MAAuB,IAAI,MAAM,OAAO,CACjC,EAAO,MAAM;EACtE,IAAI,WAAW,MAAM,YAAY,MAAM,KAAK,SAAS;EACrD,MAAM,aAAa,SAAS,MAAM,0BAA0B;EAC5D,IAAI,CAAC,YAAY,OAAK,MAAM,sCAAsC;EAClE,IAAI,WAAW,WAAY;EAC3B,MAAM,aAAa,SAAS,MAAM,0BAA0B,KAAK,CAAC;EAClE,KAAK,MAAM,OAAO,SAA2C;GAC3D,MAAM,MAAM,OAAO,IAAI,GAAG;GAC1B,MAAM,MAAM,OAAO,IAAI,GAAG;GAC1B,MAAM,QAAQ,OAAO,IAAI,SAAS,EAAE;GACpC,MAAM,WAAW,MAAM;GACvB,MAAM,WAAW,MAAM;GACvB,IAAI,WAAW,KAAK,WAAW,KAAK,YAAY,WAAW,QACzD,OAAK,MAAM,6BAA6B,IAAI,GAAG,IAAI,WAAW;GAEhE,MAAM,SAAS,WAAW;GAC1B,MAAM,cAAc,OAAO,MAAM,0BAA0B,KAAK,CAAC;GACjE,IAAI,YAAY,YAAY,QAC1B,OAAK,MAAM,6BAA6B,IAAI,GAAG,IAAI,WAAW;GAChE,MAAM,UAAU,YAAY;GAC5B,IAAI,CAAC,QAAQ,KAAK,OAAO,GAAG,OAAK,MAAM,SAAS,IAAI,GAAG,IAAI,kBAAkB;GAC7E,YAAY,YAAY,QAAQ,QAC9B,wBACA,QAAQ,UAAU,KAAK,EAAE,OAC3B;GACA,WAAW,YAAY,OAAO,QAAQ,kCAAkC,YAAY,MAAM,CAAE;EAC9F;EACA,WAAW,SAAS,QAAQ,kCAAkC,WAAW,MAAM,CAAE;EACjF,WAAW,SAAS,QAAQ,4BAA4B,QAAQ;EAChE,IAAI,KAAK,WAAW,QAAQ;CAC9B,CAAC;AACH;;AAGA,IAAa,wBAAkC,OAAO,QAAQ;CAC5D,MAAM,OAAO;CACb,MAAM,MAAM,IAAI,KAAK,KAAK;CAC1B,MAAM,cAAc,MAAc,IAAI,MAAM,aAAa;CACzD,IAAI,IAAI,SAAS,MAAM,OAAK,MAAM,qDAAqD;CACvF,MAAM,cAAc,MAAM,IAAI,WAAY,IAAmC,EAAE;CAC/E,OAAO,iBAAiB,KAAK,MAAM,OAAO,KAAK,WAAW;EAExD,MAAM,YAAY,eAAe,wBADlB,aAAa,MAAM,OAAO,SAAS,MAAuB,IAAI,MAAM,OAAO,CACjC,EAAO,MAAM;EACtE,MAAM,WAAW,MAAM,YAAY,MAAM,KAAK,SAAS;EACvD,MAAM,WAAW,UAAU,MAAM,kBAAkB,IAAI;EACvD,IAAI,CAAC,UAAU,OAAK,MAAM,oDAAoD;EAC9E,MAAM,WAAW,yBAAyB,SAAS;EACnD,MAAM,UAAU,MAAM,YAAY,MAAM,KAAK,QAAQ;EACrD,IAAI,gBAA+B;EACnC,IAAI,aAAa;GACf,KAAK,MAAM,UAAU,SAAS,MAAM,4BAA4B,KAAK,CAAC,GAAG;IACvE,IACE,CAAC,IAAI,OAAO,4BAA4B,YAAY,WAAW,EAAE,UAAU,GAAG,EAAE,KAC9E,MACF,GAEA;IAEF,MAAM,MAAM,OAAO,MAAM,oCAAoC,IAAI;IACjE,IAAI,KAAK;KACP,MAAM,YAAY,wBAAwB,SAAS,GAAG;KACtD,IAAI,WAAW,gBAAgB,eAAe,UAAU,SAAS;IACnE;IACA;GACF;GACA,IAAI,CAAC,eACH,OAAK,MAAM,+BAA+B,YAAY,wBAAwB;EAClF,OAAO;GACL,MAAM,WAAW,QAAQ,MACvB,qEACF;GACA,IAAI,UAAU,gBAAgB,eAAe,UAAU,SAAS,EAAE;EACpE;EACA,IAAI,CAAC,eAAe,OAAK,MAAM,mDAAmD;EAClF,IAAI,KAAK,eAAgB,YAAY,KAAK;CAC5C,CAAC;AACH;;AAGA,IAAa,wBAAkC,OAAO,QAAQ;CAC5D,MAAM,OAAO;CACb,MAAM,OAAO,IAAI,KAAK,KAAK;CAC3B,IAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,GAC1C,OAAK,MAAM,mEAAmE;CAEhF,OAAO,iBAAiB,KAAK,MAAM,OAAO,KAAK,WAAW;EAGxD,MAAM,WADY,eAAe,wBADlB,aAAa,MAAM,OAAO,SAAS,MAAuB,IAAI,MAAM,OAAO,CACjC,EAAO,MAC/C,EAAU,MAAM,kBAAkB,IAAI;EACvD,IAAI,CAAC,UAAU,OAAK,MAAM,oDAAoD;EAC9E,MAAM,WAAW,yBAAyB,SAAS;EAEnD,MAAM,YAAW,MADK,YAAY,MAAM,KAAK,QAAQ,GAC5B,MACvB,qEACF;EACA,IAAI,CAAC,UAAU,OAAK,MAAM,sCAAsC;EAChE,MAAM,YAAY,eAAe,UAAU,SAAU,EAAE;EACvD,IAAI,WAAW,MAAM,YAAY,MAAM,KAAK,SAAS;EACrD,MAAM,SAAU,KAAqB,KAAK,EAAE,KAAK,MAAM,OAAO,CAAC,CAAC;EAChE,IAAI,WAAW;EACf,WAAW,SAAS,QAAQ,0BAA0B,SAAS;GAC7D,IAAI,YAAY,OAAO,QAAQ,OAAO;GACtC,MAAM,OAAO,QAAQ,UAAU,OAAO,SAAS,EAAE;GACjD,YAAY;GACZ,OAAO;EACT,CAAC;EACD,IAAI,aAAa,GAAG,OAAK,MAAM,0CAA0C;EACzE,IAAI,KAAK,WAAW,QAAQ;CAC9B,CAAC;AACH;;AAGA,IAAa,mBAA6B,OAAO,QAAQ;CACvD,MAAM,OAAO;CACb,MAAM,SAAS,IAAI,KAAK,KAAK;CAC7B,OAAO,iBAAiB,KAAK,MAAM,OAAO,KAAK,WAAW;EACxD,MAAM,SAAS,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;EAClC,KAAK,MAAM,SAAS,QAClB,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,OAAO,QAAQ,QAClE,OACE,MACA,eAAe,MAAM,6BAA6B,OAAO,QAAQ,OAAO,SAC1E;EAGJ,MAAM,WAAW,IAAI,IAAI,MAAM;EAC/B,MAAM,OAAO,OAAO,QAAQ,QAAQ,GAAG,QAAQ,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;EACrE,IAAI,KAAK,WAAW,GAAG,OAAK,MAAM,+CAA+C;EACjF,IAAI,KACF,wBACA,mBACE,OAAO,iBACP,KAAK,KAAK,MAAM,EAAE,QAAQ,CAC5B,CACF;EACA,IAAI,UAAU,OAAO;EACrB,OAAO,QAAQ,SAAS,OAAO,QAAQ;GACrC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,GAAG;GAC5B,MAAM,aAAa,eAAe,wBAAwB,MAAM,MAAM;GACtE,IAAI,OAAO,UAAU;GACrB,MAAM,WAAW,WAAW,MAAM,kBAAkB,IAAI;GACxD,IAAI,UAAU,IAAI,OAAO,yBAAyB,SAAS,UAAU;GACrE,UAAU,QAAQ,QAChB,IAAI,OAAO,4BAA4B,MAAM,IAAI,WAAW,GAAG,GAC/D,EACF;EACF,CAAC;EACD,IAAI,KAAK,mCAAmC,OAAO;CACrD,CAAC;AACH;;AAGA,IAAa,oBAA8B,OAAO,QAAQ;CACxD,MAAM,OAAO;CACb,MAAM,QAAQ,IAAI,KAAK,KAAK;CAC5B,OAAO,iBAAiB,KAAK,MAAM,OAAO,KAAK,WAAW;EACxD,IAAI,MAAM,WAAW,OAAO,QAAQ,QAClC,OAAK,MAAM,uBAAuB,OAAO,QAAQ,OAAO,qBAAqB;EAE/E,MAAM,uBAAO,IAAI,IAAY;EAC7B,MAAM,YAA0B,CAAC;EACjC,KAAK,MAAM,SAAS,OAAO;GACzB,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,OAAO,QAAQ,QAClE,OAAK,MAAM,eAAe,MAAM,2BAA2B;GAE7D,IAAI,KAAK,IAAI,KAAK,GAAG,OAAK,MAAM,0BAA0B,OAAO;GACjE,KAAK,IAAI,KAAK;GACd,UAAU,KAAK,OAAO,QAAQ,QAAQ,EAAE;EAC1C;EACA,IAAI,KACF,wBACA,mBACE,OAAO,iBACP,UAAU,KAAK,MAAM,EAAE,QAAQ,CACjC,CACF;CACF,CAAC;AACH;;AAGA,IAAa,sBAAgC,OAAO,QAAQ;CAC1D,MAAM,OAAO;CACb,MAAM,QAAQ,MAAc,IAAI,MAAM,OAAO;CAC7C,MAAM,KAAK,MAAc,IAAI,MAAM,IAAI;CACvC,OAAO,iBAAiB,KAAK,MAAM,OAAO,KAAK,WAAW;EACxD,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,OAAO,QAAQ,QAClE,OAAK,MAAM,eAAe,MAAM,6BAA6B,OAAO,QAAQ,OAAO,SAAS;EAE9F,MAAM,SAAS,OAAO,QAAQ,QAAQ;EACtC,MAAM,aAAa,eAAe,wBAAwB,OAAO,MAAM;EACvE,MAAM,YAAY,MAAM,YAAY,MAAM,KAAK,UAAU;EACzD,MAAM,iBAAiB,kBAAkB,GAAG,IAAI;EAChD,IAAI,KAAK,mBAAmB,eAAe,OAAO,SAAS;EAC3D,MAAM,YAAY,WAAW,MAAM,kBAAkB,IAAI;EACzD,IAAI,WAAW;GACb,MAAM,aAAa,IAAI,KAAK,yBAAyB,UAAU,UAAU;GACzE,IAAI,YAAY;IACd,MAAM,UAAU,MAAM,WAAW,MAAM,MAAM;IAC7C,IAAI,KACF,yBAAyB,eAAe,YACxC,QAAQ,QAAQ,uDAAuD,EAAE,CAC3E;GACF;EACF;EACA,MAAM,SAAS,MAAM,gBAAgB,OAAO,OAAO,IAAI;EACvD,MAAM,SAAS,gBAAgB,cAAc,OAAO,OAAO,IAAI,EAAE,UAAU,OAAO;EAClF,MAAM,UAAU,qBAAqB,OAAO,UAAU,eAAe,wBAAwB,eAAe;EAC5G,IAAI,KACF,mCACA,OAAO,QAAQ,QAAQ,oBAAoB,GAAG,QAAQ,iBAAiB,CACzE;EACA,MAAM,YACJ,OAAO,KAAA,IAAY,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE,GAAG,OAAO,QAAQ,SAAS,CAAC,IAAI,QAAQ;EACpF,MAAM,OAAO,OAAO,QAAQ,KAAK,MAAM,EAAE,QAAQ;EACjD,KAAK,OAAO,YAAY,GAAG,GAAG,MAAM;EACpC,IAAI,KAAK,wBAAwB,mBAAmB,OAAO,iBAAiB,IAAI,CAAC;EACjF,MAAM,eAAe,MAAM,YAAY,MAAM,KAAK,qBAAqB;EACvE,IAAI,KAAK,uBAAuB,uBAAuB,cAAc,cAAc,CAAC;CACtF,CAAC;AACH;;AAWA,IAAa,eAAkD;CAC7D,CAAC,cAAc,aAAa;CAC5B,CAAC,sBAAsB,oBAAoB;CAC3C,CAAC,uBAAuB,qBAAqB;CAC7C,CAAC,uBAAuB,qBAAqB;CAC7C,CAAC,uBAAuB,qBAAqB;CAC7C,CAAC,iBAAiB,gBAAgB;CAClC,CAAC,kBAAkB,iBAAiB;CACpC,CAAC,oBAAoB,mBAAmB;AAC1C;;;;;;;;;;;;;;;AC/hBA,IAAI;AACJ,IAAM,cAAoC;CACxC,eAAe,OAAO,SAAS,MAAM,MAAO,aAAa,IAAI,EAAE,UAAU,CAAiB;CAC1F,OAAO;AACT;AAEA,IAAM,UAAQ,MAAc,YAA2B;CACrD,MAAM,IAAI,mBAAA,oBAAoB,CAAC,MAAM,OAAO,CAAC;AAC/C;AAEA,IAAM,OAAO;AAIb,IAAM,iBAAiB,OAAO,QAAsC;CAClE,MAAM,EAAE,aAAa,MAAM,OAAO;CAClC,IAAI;EAGF,QAAO,MADc,IADF,SAAS,EAAE,MAAM,IAAI,QAAQ,MAAM,CACjC,EAAO,QAAQ,GACtB,QAAQ;CACxB,SAAS,KAAK;EAEZ,OAAK,MAAM,2BADI,sBAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG,GACR;EAC5B,MAAM;CAC1B;AACF;AAEA,IAAM,kBAAkB,OAAO,QAAsC;CACnE,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,UAAW,oBAAoB,MAAM,MAAO,IAA6B;CAG/E,MAAM,QAAQ,IAAI,QAAQ;CAE1B,MAAM,QACJ,OAAO,WAAW,WAAW,cACzB,EAAE,QAAQ,WAAW,OAAO,KAAK,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU,EAAE,IACnF,EACE,aAAa,MAAM,OAAO,MACxB,MAAM,YACN,MAAM,aAAa,MAAM,UAC3B,EACF;CAEN,QAAO,MADc,QAAQ,eAAe,KAAK,GACnC;AAChB;AAEA,IAAM,kBAAkB,OAAO,QAAsC;CACnE,MAAM,MAAM,MAAM,OAAO;CAEzB,MAAM,KAAK,KADM,aAAa,MAAM,IAAI,UAAU,KAC3B,SAAS;CAChC,MAAM,GAAG,KAAK,KACZ,IAAI,QAAQ,MAAM,OAAO,MACvB,IAAI,QAAQ,MAAM,YAClB,IAAI,QAAQ,MAAM,aAAa,IAAI,QAAQ,MAAM,UACnD,CACF;CACA,MAAM,QAAkB,CAAC;CACzB,KAAK,MAAM,MAAM,GAAG,YAAY;EAC9B,MAAM,KAAK,KAAK,GAAG,MAAM;EACzB,GAAG,QAAQ,EAAE,cAAc,MAAM,IAAI,QAAQ;GAC3C,MAAM,QAAkB,CAAC;GACzB,IAAI,SAAS,EAAE,cAAc,MAAM,IAAI,SAAS;IAC9C,MAAM,KAAK,OAAO,KAAK,SAAS,EAAE,CAAC;GACrC,CAAC;GACD,MAAM,KAAK,MAAM,KAAK,GAAI,CAAC;EAC7B,CAAC;CACH;CACA,OAAO,MAAM,KAAK,IAAI;AACxB;;AAGA,IAAM,qBAAqB,QACzB,IACG,QAAQ,eAAe,IAAI,EAC3B,QAAQ,eAAe,IAAI,EAC3B,QAAQ,wBAAwB,IAAI,EACpC,QAAQ,sBAAsB,GAAI,EAClC,QAAQ,6BAA6B,IAAI,EACzC,QAAQ,YAAY,EAAE,EACtB,QAAQ,WAAW,GAAG,EACtB,QAAQ,WAAW,IAAG,EACtB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,UAAU,GAAG,EACrB,QAAQ,WAAW,GAAG,EACtB,QAAQ,WAAW,MAAM,EACzB,KAAK;AAEV,IAAM,iBAAiB,OAAO,QAAsC;CAGlE,MAAM,WAAU,OADE,MADE,MAAM,GACF,UAAU,IAAI,QAAQ,KAAK,GAC/B,KAAK,aAAa;CACtC,IAAI,CAAC,SAAS,OAAK,MAAM,wDAAwD;CACjF,OAAO,kBAAkB,MAAM,QAAS,MAAM,MAAM,CAAC;AACvD;AAEA,IAAM,kBAAkB,OAAO,QAAsC;CAEnE,MAAM,MAAM,OAAM,MADE,MAAM,GACF,UAAU,IAAI,QAAQ,KAAK;CACnD,MAAM,aAAa,OAAO,KAAK,IAAI,KAAK,EACrC,QAAQ,MAAM,+BAA+B,KAAK,CAAC,CAAC,EACpD,MAAM,GAAG,MAAM;EAGd,OAFW,OAAO,EAAE,MAAM,YAAY,IAAI,MAAM,CAEzC,IADI,OAAO,EAAE,MAAM,YAAY,IAAI,MAAM,CACpC;CACd,CAAC;CACH,IAAI,WAAW,WAAW,GAAG,OAAK,MAAM,gCAAgC;CACxE,MAAM,QAAkB,CAAC;CACzB,KAAK,MAAM,QAAQ,YAAY;EAE7B,MAAM,UAAS,MADG,IAAI,KAAK,IAAI,EAAG,MAAM,MAAM,GAC3B,MAAM,sBAAsB,KAAK,CAAC,GAAG,KAAK,MAC3D,EACG,QAAQ,YAAY,EAAE,EACtB,QAAQ,WAAW,GAAG,EACtB,QAAQ,WAAW,IAAG,EACtB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,UAAU,GAAG,CAC1B;EACA,MAAM,KAAK,MAAM,KAAK,IAAI,CAAC;CAC7B;CACA,OAAO,MAAM,KAAK,MAAM;AAC1B;AAEA,IAAM,SAAS,OAAO,QAAsC;CAC1D,MAAM,MAAO,MAAc,IAAI,MAAM,SAAS,KAAK;CACnD,IAAI,CAAC,IAAI,QAAQ,WAAW,IAAI,QAAQ,UAAU,GAAG,GACnD,OACE,MACA,wDAAwD,IAAI,QAAQ,SAAS,OAAO,IAAI,0EAC1F;CAEF,MAAM,UAAU,IAAI,KAAK,KAAK;CAC9B,MAAM,YAAY,YAAY,KAAA,IAAY,KAAA,IAAY,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;CASjG,MAAM,UAAS,MARM,IAAI,QAAQ,QAAQ;EACvC,OAAO,IAAI,QAAQ;EACnB,UAAU,IAAI,QAAQ;EACtB,UAAU,IAAI,QAAQ;EACtB,IAAI;EACJ,SAAS,EAAE,UAAU;EACrB,QAAQ,IAAI;CACd,CAAC,GACqB,QAAQ;CAC9B,IAAI,CAAC,QAAQ,OAAK,MAAM,wBAAwB;CAChD,OAAO,IAAI,YAAY,EAAE,OAAO,OAAQ,KAAK;AAC/C;;;;;AAQA,IAAa,sBAAgC,OAAO,QAAQ;CAC1D,MAAM,OAAO,IAAI,QAAQ,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK;CACnE,MAAM,UAAU,MAAc,IAAI,MAAM,KAAK,KAAK;CAElD,MAAM,UAAU,UAAkE;EAChF,MAAM;EACN,MAAM;EACN,QAAQ;CACV;CAEA,IAAI,KAAK,WAAW,QAAQ,GAAG,OAAO,OAAO,MAAM,OAAO,GAAG,CAAC;CAE9D,IAAI,YAAY,SAAS,OAAO,OAAO,MAAM,OAAO,GAAG,CAAC;CAExD,IAAI,SAAS,KAAK,KAAK;EACrB,MAAM,OAAO,MAAM,eAAe,GAAG;EACrC,IAAI,KAAK,KAAK,EAAE,WAAW,KAAK,YAAY,QAAQ;GAGlD,IAAI,CAAC,IAAI,QAAQ,WAAW,MAAM,KAAK,GACrC,OACE,MACA,uMACF;GAEF,OAAO,OAAO,MAAM,OAAO,GAAG,CAAC;EACjC;EACA,OAAO,OAAO,IAAI;CACpB;CACA,IAAI,SAAS,KAAK,QAAQ,SAAS,KAAK,KAAK,OAAO,OAAO,MAAM,gBAAgB,GAAG,CAAC;CACrF,IAAI,SAAS,KAAK,MAAM,OAAO,OAAO,MAAM,gBAAgB,GAAG,CAAC;CAChE,IAAI,SAAS,KAAK,OAAO,SAAS,KAAK,OAAO,SAAS,KAAK,KAC1D,OAAO,OAAO,MAAM,eAAe,GAAG,CAAC;CAEzC,IAAI,SAAS,KAAK,MAAM,OAAO,OAAO,MAAM,gBAAgB,GAAG,CAAC;CAChE,IAAI,KAAK,WAAW,OAAO,KAAK,SAAS,KAAK,MAC5C,OAAO,OAAO,WAAW,IAAI,QAAQ,KAAK,CAAC;CAE7C,OACE,MACA,uBAAuB,KAAK,qHAC9B;CACkB,MAAM,IAAI,MAAM,aAAa;AACjD;;AAGA,IAAa,0BAAoC,OAAO,QAAQ;CAC9D,MAAM,OAAO,IAAI,QAAQ,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK;CACnE,MAAM,OAAgC;EACpC,UAAU,IAAI,QAAQ;EACtB,WAAW,IAAI,QAAQ;EACvB,YAAY,IAAI,QAAQ,MAAM;EAC9B,QAAQ,SAAS,IAAI,QAAQ,QAAQ;CACvC;CACA,IAAI;EACF,IAAI,SAAS,KAAK,KAAK;GACrB,MAAM,EAAE,gBAAgB,MAAM,OAAO;GACrC,MAAM,MAAM,MAAM,YAAY,KAAK,IAAI,QAAQ,OAAO,EAAE,kBAAkB,KAAK,CAAC;GAChF,KAAK,aAAa,IAAI,aAAa;GACnC,KAAK,QAAQ,IAAI,SAAS,KAAK,KAAA;GAC/B,KAAK,SAAS,IAAI,UAAU,KAAK,KAAA;EACnC,OAAO,IAAI,SAAS,KAAK,MAAM;GAC7B,MAAM,MAAM,MAAM,OAAO;GAEzB,MAAM,KAAK,KADM,aAAa,MAAM,IAAI,UAAU,KAC3B,SAAS;GAChC,MAAM,GAAG,KAAK,KACZ,IAAI,QAAQ,MAAM,OAAO,MACvB,IAAI,QAAQ,MAAM,YAClB,IAAI,QAAQ,MAAM,aAAa,IAAI,QAAQ,MAAM,UACnD,CACF;GACA,KAAK,SAAS,GAAG,WAAW,KAAK,QAAQ;IAAE,MAAM,GAAG;IAAM,MAAM,GAAG;GAAS,EAAE;EAChF,OAAO,IAAI,SAAS,KAAK,MAAM;GAE7B,MAAM,MAAM,OAAM,MADE,MAAM,GACF,UAAU,IAAI,QAAQ,KAAK;GACnD,KAAK,cAAc,OAAO,KAAK,IAAI,KAAK,EAAE,QAAQ,MAChD,+BAA+B,KAAK,CAAC,CACvC,EAAE;EACJ;CACF,QAAQ,CAER;CACA,OAAO;EAAE,MAAM;EAAQ,MAAM;EAAM,QAAQ,KAAK,UAAU,IAAI;CAAE;AAClE;;AAGA,IAAa,eAAkD,CAC7D,CAAC,gBAAgB,mBAAmB,GACpC,CAAC,oBAAoB,uBAAuB,CAC9C;;;;;;;;;;;;;;;;;;;;AC3OA,IAAM,WAAW;;;;;;;AAQjB,IAAM,kBAAuC,IAAI,IAAI;CACnD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;AAGD,IAAM,iBAAiB,aAA6B,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK;;AAG9F,IAAM,eAAe,SAAiB,SAA0B;CAC9D,MAAM,IAAI,QAAQ,YAAY;CAC9B,IAAI,EAAE,SAAS,IAAI,GAAG,OAAO,KAAK,WAAW,EAAE,MAAM,GAAG,EAAE,CAAC;CAC3D,OAAO,MAAM;AACf;;AAGA,IAAM,cAAc,UAA6B,SAC/C,SAAS,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC;;AA4F3C,IAAM,gBAAgB,YAAqC;CACzD,MAAM,MAAgB,CAAC;CACvB,IAAI,QAAQ,QAAQ,IAAI,KAAK,QAAQ;CACrC,IAAI,QAAQ,WAAW,KAAA,GAAW,IAAI,KAAK,QAAQ;CACnD,IAAI,QAAQ,MAAM,IAAI,KAAK,MAAM;CACjC,IAAI,QAAQ,eAAe,IAAI,KAAK,gBAAgB;CACpD,OAAO;AACT;;;;;;;;AASA,IAAa,uBACX,SACA,YAAoD,CAAC,MAClC;CAEnB,MAAM,qBAAqB,UAAkB,OAAmC;EAC9E,MAAM,OAAO,cAAc,QAAQ;EACnC,MAAM,MAA0B,CAAC;EACjC,KAAK,MAAM,UAAU,SACnB,KAAK,MAAM,cAAc,OAAO,YAAY,CAAC,GAC3C,IAAI,WAAW,GAAG,SAAS,EAAE,KAAK,WAAW,WAAW,MAAM,IAAI,GAAG;GACnE,IAAI,KAAK;IAAE;IAAQ;GAAW,CAAC;GAC/B;EACF;EAGJ,OAAO;CACT;CAEA,MAAM,oBAAoB,YAA8C;EACtE,MAAM,OAAO,cAAc,QAAQ,QAAQ;EAC3C,MAAM,MAAM,aAAa,OAAO;EAChC,MAAM,MAAyB,CAAC;EAChC,KAAK,MAAM,UAAU,SACnB,KAAK,MAAM,cAAc,OAAO,WAAW,CAAC,GAAG;GAC7C,IAAI,CAAC,WAAW,WAAW,MAAM,IAAI,GAAG;GACxC,IAAI,CAAC,IAAI,OAAO,OAAO,WAAW,IAAI,SAAS,EAAE,CAAC,GAAG;GACrD,IAAI,QAAQ,UAAU,CAAC,WAAW,QAAQ,SAAS,QAAQ,OAAO,EAAE,GAAG;GACvE,IAAI,KAAK;IAAE;IAAQ;GAAW,CAAC;GAC/B;EACF;EAEF,OAAO;CACT;CAGA,MAAM,YAAY,OAChB,MACA,SACA,eAC2B;EAC3B,IAAI,WAAW,WAAW,GAAG,OAAO,KAAA;EACpC,IAAI,UAAU,WAAW,KAAK,WAAW,WAAW,GAAG,OAAO,WAAW;EACzE,MAAM,MAA8B;GAClC;GACA;GACA,YAAY,WAAW,KAAK,MAAM,EAAE,MAAM;EAC5C;EACA,MAAM,KAAK,IAAI,kBAAA,WAAwC;EACvD,KAAK,MAAM,MAAM,WAAW,GAAG,IAAI,EAAE;EACrC,IAAI;EACJ,MAAM,GACH,OAAO,EACP,aAAa,OAAO,UAAmB;GACtC,SAAS;EACX,CAAC,EACA,aAAa,YAAY,CAAC,CAAC,EAC3B,KAAK,IAAI,SAAS,QAAQ,QAAQ,GAAG,KAAK,IAAI,CAAC,CAAC;EACnD,IAAI,WAAW,KAAA,GAAW,MAAM;EAEhC,KAAK,MAAM,UAAU,IAAI,YAAY;GACnC,MAAM,WAAW,WAAW,MAAM,MAAM,EAAE,WAAW,MAAM;GAC3D,IAAI,UAAU,OAAO;EACvB;CAEF;CAGA,MAAM,YAAY,UAAkB,WAA6C;EAC/E,MAAM,QAAQ,cAAc,QAAQ;EACpC,MAAM,QAAqD,CAAC;GAAE,MAAM;GAAO,MAAM,CAAC;EAAE,CAAC;EACrF,MAAM,UAAU,IAAI,IAAY,CAAC,KAAK,CAAC;EACvC,OAAO,MAAM,SAAS,GAAG;GACvB,MAAM,EAAE,MAAM,SAAS,MAAM,MAAM;GACnC,IAAI,KAAK,UAAU,UAAU;GAE7B,IAAI,kBAAkB,MAAM,MAAM,EAAE,SAAS,GAC3C,OAAO,CAAC,GAAG,MAAM;IAAE,UAAU;IAAM,IAAI;GAAO,CAAC;GAGjD,KAAK,MAAM,UAAU,SACnB,KAAK,MAAM,cAAc,OAAO,YAAY,CAAC,GAAG;IAC9C,IAAI,CAAC,WAAW,WAAW,MAAM,IAAI,GAAG;IACxC,KAAK,MAAM,MAAM,WAAW,IAAI;KAC9B,IAAI,gBAAgB,IAAI,EAAE,GAAG;KAC7B,MAAM,WAAW,YAAY;KAC7B,IAAI,CAAC,YAAY,QAAQ,IAAI,QAAQ,GAAG;KACxC,QAAQ,IAAI,QAAQ;KACpB,MAAM,KAAK;MAAE,MAAM;MAAU,MAAM,CAAC,GAAG,MAAM;OAAE,UAAU;OAAM;MAAG,CAAC;KAAE,CAAC;IACxE;GACF;EAEJ;CAEF;CAEA,MAAM,cAAc,MAAe,OAAyB;EAC1D,KAAK,MAAM,UAAU,SACnB,KAAK,MAAM,cAAc,OAAO,YAAY,CAAC,GAAG;GAC9C,IAAI,SAAS,KAAA,KAAa,CAAC,WAAW,WAAW,MAAM,cAAc,IAAI,CAAC,GAAG;GAC7E,IAAI,OAAO,KAAA,KAAa,CAAC,WAAW,GAAG,SAAS,EAAE,GAAG;GACrD,OAAO;EACT;EAEF,OAAO;CACT;CAEA,MAAM,kBAAkB,aAAwC;EAC9D,MAAM,YAAsB,CAAC;EAC7B,MAAM,uBAAO,IAAI,IAAY;EAC7B,IAAI,WAAW,CAAC,cAAc,QAAQ,CAAC;EACvC,MAAM,eAAe,IAAI,IAAY,QAAQ;EAC7C,KAAK,IAAI,MAAM,GAAG,MAAM,YAAY,SAAS,SAAS,GAAG,OAAO;GAC9D,MAAM,OAAiB,CAAC;GACxB,KAAK,MAAM,QAAQ,UACjB,KAAK,MAAM,UAAU,SACnB,KAAK,MAAM,cAAc,OAAO,YAAY,CAAC,GAAG;IAC9C,IAAI,CAAC,WAAW,WAAW,MAAM,IAAI,GAAG;IACxC,KAAK,MAAM,MAAM,WAAW,IAAI;KAC9B,IAAI,CAAC,KAAK,IAAI,EAAE,GAAG;MACjB,KAAK,IAAI,EAAE;MACX,UAAU,KAAK,EAAE;KACnB;KACA,IAAI,gBAAgB,IAAI,EAAE,GAAG;KAC7B,MAAM,WAAW,YAAY;KAC7B,IAAI,YAAY,CAAC,aAAa,IAAI,QAAQ,GAAG;MAC3C,aAAa,IAAI,QAAQ;MACzB,KAAK,KAAK,QAAQ;KACpB;IACF;GACF;GAGJ,WAAW;EACb;EACA,OAAO;CACT;CAEA,MAAM,YAAoB,QAAQ,KAAK,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,KAAK;CAEjE,MAAM,UAAU,OAAO,YAAoD;EACzE,MAAM,OAAO,SAAS,QAAQ,UAAU,QAAQ,EAAE;EAClD,IAAI,CAAC,MAAM;GACT,MAAM,YAAY,eAAe,QAAQ,QAAQ;GACjD,MAAM,IAAI,MACR,uDAAuD,QAAQ,SAAS,OAAO,QAAQ,GAAG,wBAAwB,UAAU,KAAK,IAAI,KAAK,SAAS,aAAa,IAAI,EAAE,EACxK;EACF;EACA,IAAI,QAAQ,QAAQ;EACpB,IAAI,WAAW,QAAQ;EACvB,IAAI;EACJ,KAAK,MAAM,OAAO,MAAM;GACtB,MAAM,aAAa,kBAAkB,UAAU,IAAI,EAAE;GACrD,MAAM,SAAS,MAAM,UACnB,WACA;IAAE;IAAU,UAAU,QAAQ;IAAU;IAAO,IAAI,IAAI;GAAG,GAC1D,UACF;GACA,IAAI,CAAC,QACH,MAAM,IAAI,MACR,qCAAqC,SAAS,OAAO,IAAI,GAAG,KAAK,WAAW,KAAK,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,EAAE,wCACjH;GAEF,SAAS,MAAM,OAAO,WAAW,QAAQ;IACvC;IACA;IACA,UAAU,QAAQ;IAClB,IAAI,IAAI;IACR,SAAS,QAAQ;IACjB,QAAQ,QAAQ;GAClB,CAAC;GACD,MAAM,QAAQ,OAAO,QAAQ;GAC7B,IAAI,CAAC,OACH,MAAM,IAAI,MACR,WAAW,OAAO,OAAO,GAAG,cAAc,SAAS,OAAO,IAAI,GAAG,0BACnE;GAEF,QAAQ,MAAM;GACd,WAAW,MAAM;EACnB;EACA,OAAO;CACT;CAEA,MAAM,SAAS,OAAO,YAAuD;EAC3E,MAAM,aAAa,iBAAiB,OAAO;EAC3C,IAAI,WAAW,WAAW,GAAG;GAC3B,MAAM,yBAAS,IAAI,IAAY;GAC/B,MAAM,6BAAa,IAAI,IAAY;GACnC,KAAK,MAAM,UAAU,SACnB,KAAK,MAAM,cAAc,OAAO,WAAW,CAAC,GAAG;IAC7C,KAAK,MAAM,MAAM,WAAW,KAAK,OAAO,IAAI,EAAE;IAC9C,KAAK,MAAM,OAAO,WAAW,SAAS,WAAW,IAAI,GAAG;GAC1D;GAEF,MAAM,SAAS,aAAa,OAAO,EAAE,KAAK,IAAI,KAAK;GACnD,MAAM,aAAa,QAAQ,SACvB,yBAAyB,QAAQ,OAAO,GAAG,0BAA0B,CAAC,GAAG,UAAU,EAAE,KAAK,IAAI,KAAK,SAAS,oDAC5G;GACJ,MAAM,IAAI,MACR,mCAAmC,QAAQ,SAAS,aAAa,OAAO,GAAG,WAAW,aAAa,IAAI,EAAE,EAC3G;EACF;EACA,MAAM,SAAS,MAAM,UACnB,UACA;GACE,UAAU,QAAQ;GAClB,UAAU;GACV,OAAO,QAAQ;GACf,IAAI,QAAQ,QAAQ;GACpB,KAAK,aAAa,OAAO;EAC3B,GACA,UACF;EACA,IAAI,CAAC,QACH,MAAM,IAAI,MACR,uCAAuC,WAAW,KAAK,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,EAAE,wCACvF;EAEF,OAAO,OAAO,WAAW,OAAO,OAAO;CACzC;CAEA,OAAO;EACL;EACA;EACA,iBAAiB,QAAQ,MAAM,OAAO,EAAE,WAAW,CAAC,GAAG,SAAS,CAAC;EACjE;EACA;EACA;CACF;AACF;;;;;;;;;;;;;;;;;;;AC1XA,IAAM,QAAQ,MAAc,YAA2B;CACrD,MAAM,IAAI,mBAAA,oBAAoB,CAAC,MAAM,OAAO,CAAC;AAC/C;AAMA,IAAM,cAAc,IAAI,IAAI;CAC1B;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,IAAM,gBAAgB,KAAkB,SAAuB;CAC7D,IAAI,CAAC,IAAI,QAAQ,SAAS,YAAY,EAAE,WAAW,QAAQ,GACzD,KAAK,MAAM,kDAAkD,IAAI,QAAQ,UAAU;AAEvF;;AAGA,IAAM,iBAAiB,KAAkB,UAAwC;CAC/E,MAAM,OAAO,IAAI,KAAK;CACtB,QAAQ,IAAI,KAAK,MAAjB;EACE,KAAK,gBACH,OAAO;GACL,GAAG;GACH,QAAQ;IACN,OAAO,KAAK;IACZ,QAAQ,KAAK;IACb,KAAK,KAAK;GAGZ;EACF;EACF,KAAK,gBACH,OAAO;GACL,GAAG;GACH,QAAQ;IAAE,IAAI,KAAK;IAAc,SAAS,KAAK;GAA8B;GAC7E,GAAI,KAAK,mBAAmB,KAAA,IACxB,EAAE,eAAe,KAAK,eAA0B,IAChD,CAAC;EACP;EACF,KAAK,gBAAgB;GACnB,MAAM,MAAM,OAAO,KAAK,GAAG;GAC3B,MAAM,UAAW,MAAM,UAAU,KAAK,OAAO;GAC7C,OAAO;IAAE,GAAG;IAAO,QAAQ,UAAU,IAAI,KAAA,IAAY;GAAM;EAC7D;EACA,KAAK,cAAc;GACjB,MAAM,OAAO,KAAK;GAClB,MAAM,OAAO,EAAE,GAAI,MAAM,QAAQ,CAAC,EAAG;GACrC,IAAI,SAAS,gBAAgB,SAAS,QAAQ,KAAK,aAAa,CAAC,KAAK;GACtE,IAAI,SAAS,cAAc,SAAS,QAAQ,KAAK,WAAW,CAAC,KAAK;GAClE,OAAO;IAAE,GAAG;IAAO;GAAK;EAC1B;EACA,KAAK,wBACH,OAAO;GAAE,GAAG;GAAO,eAAe;EAAK;EACzC,SACE,OAAO;CACX;AACF;;AAGA,IAAM,mBAAmB,QAA8B;CACrD,MAAM,OAAO,IAAI,KAAK,MAAM,IAAI,YAAY;CAC5C,OAAO,SAAS,KAAA,KAAa,YAAY,IAAI,KAAK,IAAI;AACxD;AAEA,IAAM,aAAa;AAEnB,IAAM,YAAsB,OAAO,QAAQ;CACzC,MAAM,OAAO,IAAI,KAAK,KAAK,QAAQ,OAAO,GAAG;CAC7C,aAAa,KAAK,IAAI;CAEtB,MAAM,QAAQ,cAAc,KADb,IAAI,MAAM,IAAI,UAAU,KAAmC,CAAC,CACrC;CACtC,IAAI,gBAAgB,GAAG,GAAG;EAExB,IAAI,MAAM,IAAI,YAAY,KAAK;EAC/B,OAAO;GAAE,MAAM;GAAS,SAAS,IAAI;EAAQ;CAC/C;CACA,IAAI,MAAM,OAAO,UAAU;CAC3B,IAAI,CAAC,IAAI,QAAQ,UAAU,GACzB,KACE,MACA,sFACF;CAEF,MAAM,SAAS,MAAM,IAAI,QAAQ,OAAO;EACtC,GAAG;EACH,OAAO,IAAI,QAAQ;EACnB,UAAU,IAAI,QAAQ;EACtB,QAAQ,IAAI;CACd,CAAC;CACD,MAAM,MAAM,OAAO,SAAS,MAAM,GAAG,EAAE,IAAI,QAAQ,QAAQ,KAAK,KAAK;CACrE,MAAM,MAAM,IAAI,QAAQ,SAAS,YAAY,GAAG;CAChD,MAAM,OAAO,MAAM,IAAI,IAAI,QAAQ,SAAS,MAAM,GAAG,GAAG,IAAI,IAAI,QAAQ;CACxE,OAAO;EACL,MAAM;EACN,SAAS;GAAE,OAAO,OAAO;GAAO,UAAU,OAAO;GAAU,UAAU,GAAG,KAAK,GAAG;EAAM;CACxF;AACF;;AAKA,IAAa,cAAc,KAAmB,UAAkB,WAAiC;CAC/F,IAAI,aAAa,QAAQ,OAAO;CAChC,MAAM,QAAQ,WAAW;CACzB,MAAM,YAAY,KAAK,MAAM,IAAI,SAAS,KAAK;CAC/C,MAAM,MAAM,IAAI,aAAa,SAAS;CACtC,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,KAAK;EAClC,MAAM,MAAM,IAAI;EAChB,MAAM,OAAO,KAAK,MAAM,GAAG;EAC3B,MAAM,QAAQ,KAAK,IAAI,OAAO,GAAG,IAAI,SAAS,CAAC;EAC/C,MAAM,OAAO,MAAM;EACnB,IAAI,KAAK,IAAI,SAAS,IAAI,QAAQ,IAAI,SAAS;CACjD;CACA,OAAO;AACT;AAEA,IAAM,kBAAkB;;;;;;;AAQxB,IAAM,sBAAgC,OAAO,QAA6B;CACxE,MAAM,OAAO;CACb,IAAI,CAAC,IAAI,QAAQ,SAAS,YAAY,EAAE,WAAW,QAAQ,GACzD,KAAK,MAAM,6CAA6C,IAAI,QAAQ,UAAU;CAEhF,MAAM,MAAO,MAAc,IAAI,MAAM,KAAK,KAAK;CAC/C,IAAI,CAAC,IAAI,QAAQ,WAAW,IAAI,QAAQ,UAAU,KAAK,GACrD,KACE,MACA,0BAA0B,IAAI,QAAQ,SAAS,kEACjD;CAEF,IAAI,CAAC,IAAI,QAAQ,WAAA,mBAAqB,GAAG,GACvC,KACE,MACA,sCAAsC,IAAI,4DAC5C;CASF,MAAM,UAAS,MAPO,IAAI,QAAQ,QAAQ;EACxC,OAAO,IAAI,QAAQ;EACnB,UAAU,IAAI,QAAQ;EACtB,UAAU,IAAI,QAAQ;EACtB,IAAI;EACJ,QAAQ,IAAI;CACd,CAAC,GACsB,QAAQ;CAC/B,IAAI,CAAC,QAAQ,KAAK,MAAM,mCAAmC;CAC3D,MAAM,aAAa,OAAO,OAAQ,MAAM,UAAU;CAClD,IAAI,CAAC,OAAO,SAAS,UAAU,KAAK,cAAc,GAChD,KAAK,MAAM,oEAAoE;CAEjF,MAAM,MAAM,WAAW,kCAAA,WAAW,OAAQ,KAAK,GAAG,YAAY,eAAe;CAY7E,MAAM,SAAQ,MAXO,IAAI,QAAQ,QAAQ;EACvC,OAAO,kCAAA,WAAW,GAAG;EACrB,UAAU,kCAAA;EACV,UAAU,IAAI,QAAQ;EACtB,IAAI;EACJ,SAAS;GACP,MAAM,MAAc,IAAI,MAAM,MAAM;GACpC,WAAW,MAAe,IAAI,MAAM,WAAW;EACjD;EACA,QAAQ,IAAI;CACd,CAAC,GACoB,QAAQ;CAC7B,IAAI,CAAC,OAAO,KAAK,MAAM,kCAAkC;CACzD,MAAM,OAAO,IAAI,YAAY,EAAE,OAAO,MAAO,KAAK;CAClD,OAAO;EAAE,MAAM;EAAQ,MAAM;EAAM,QAAQ;CAAK;AAClD;;AAGA,IAAa,oBAAuD;CAClE,CAAC,gBAAgB,SAAS;CAC1B,CAAC,gBAAgB,SAAS;CAC1B,CAAC,gBAAgB,SAAS;CAC1B,CAAC,cAAc,SAAS;CACxB,CAAC,wBAAwB,SAAS;CAClC,CAAC,oBAAoB,mBAAmB;AAC1C;;;;;;;;;;;;AC7LA,IAAI;AACJ,IAAM,eAAgC;CACpC,kBAAkB,OAAO;CACzB,OAAO;AACT;AAEA,IAAM,cAAc,MAAc,YAA+B;CAC/D,IAAI,QAAQ,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,GAAG,KAAK,MAAM,KAAK,KAC/D,MAAM,IAAI,mBAAA,oBAAoB,CAC5B,MACA,uBAAuB,QAAQ,SAAS,0DAC1C,CAAC;AAEL;AAEA,IAAM,UAAU,OAAO,MAAc,UAAgD;CACnF,MAAM,EAAE,gBAAgB,MAAM,OAAO;CACrC,IAAI;EACF,OAAO,MAAM,YAAY,KAAK,OAAO,EAAE,kBAAkB,MAAM,CAAC;CAClE,SAAS,KAAK;EAEZ,MAAM,IAAI,mBAAA,oBAAoB,CAAC,MAAM,2BADtB,sBAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG,GACkB,GAAG,EAAE,OAAO,IAAI,CAAC;CAC3F;AACF;AAEA,IAAM,gBAAgB,MAAc,SAAmB,cAA4B;CACjF,KAAK,MAAM,KAAK,SACd,IAAI,IAAI,KAAK,IAAI,WACf,MAAM,IAAI,mBAAA,oBAAoB,CAC5B,MACA,QAAQ,EAAE,sCAAsC,UAAU,2BAC5D,CAAC;AAGP;;AAGA,IAAa,aAAuB,OAAO,QAAQ;CACjD,WAAW,UAAU,IAAI,OAAO;CAChC,MAAM,QAAQ,MAAgB,IAAI,MAAM,OAAO;CAC/C,MAAM,SAAS,MAAM,QAAQ,UAAU,IAAI,QAAQ,KAAK;CACxD,aAAa,UAAU,OAAO,OAAO,aAAa,CAAC;CACnD,MAAM,EAAE,gBAAgB,MAAM,OAAO;CACrC,MAAM,MAAM,MAAM,YAAY,OAAO;CACrC,MAAM,SAAS,MAAM,IAAI,UACvB,QACA,MAAM,KAAK,MAAM,IAAI,CAAC,CACxB;CACA,KAAK,MAAM,QAAQ,QAAQ,IAAI,QAAQ,IAAI;CAC3C,MAAM,QAAQ,MAAM,IAAI,KAAK;CAC7B,OAAO;EAAE,MAAM;EAAS,SAAS;GAAE,GAAG,IAAI;GAAS,OAAO,IAAI,WAAW,KAAK;EAAE;CAAE;AACpF;;AAGA,IAAa,YAAsB,OAAO,QAAQ;CAChD,WAAW,SAAS,IAAI,OAAO;CAC/B,MAAM,KAAK,MAAc,IAAI,MAAM,IAAI,KAAK;CAC5C,IAAI,OAAO,QACT,MAAM,IAAI,mBAAA,oBAAoB,CAC5B,SACA,YAAY,GAAG,0DACjB,CAAC;CAEH,MAAM,SAAS,MAAM,QAAQ,SAAS,IAAI,QAAQ,KAAK;CACvD,MAAM,YAAY,OAAO,aAAa;CACtC,MAAM,YAAY,IAAI,KAAK,KAAK;CAChC,MAAM,SACJ,cAAc,KAAA,IACV,UAAU,KAAK,SAAS;EACtB,IAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,GAC1C,MAAM,IAAI,mBAAA,oBAAoB,CAC5B,SACA,+DACF,CAAC;EAEH,MAAM,CAAC,OAAO,OAAO;EACrB,MAAM,QAAkB,CAAC;EACzB,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,KAAK,MAAM,KAAK,CAAC;EAC/C,OAAO;CACT,CAAC,IACD,MAAM,KAAK,EAAE,QAAQ,UAAU,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;CACzD,MAAM,EAAE,gBAAgB,MAAM,OAAO;CACrC,MAAM,WAA0B,CAAC;CACjC,IAAI,OAAO;CACX,KAAK,MAAM,SAAS,QAAQ;EAC1B,aAAa,SAAS,OAAO,SAAS;EACtC,MAAM,MAAM,MAAM,YAAY,OAAO;EACrC,MAAM,SAAS,MAAM,IAAI,UACvB,QACA,MAAM,KAAK,MAAM,IAAI,CAAC,CACxB;EACA,KAAK,MAAM,QAAQ,QAAQ,IAAI,QAAQ,IAAI;EAC3C,MAAM,QAAQ,IAAI,WAAW,MAAM,IAAI,KAAK,CAAC;EAC7C,SAAS,KAAK;GACZ;GACA,UAAU,KAAK;GACf,UAAU,iBAAiB,IAAI,QAAQ,UAAU,EAAE,EAAE,QAAQ,OAAO,EAAE,IAAI,QAAQ,KAAK;EACzF,CAAC;EACD,QAAQ;CACV;CACA,OAAO;EAAE,MAAM;EAAc;CAAS;AACxC;;AAGA,IAAa,YAAsB,OAAO,QAAQ;CAChD,WAAW,SAAS,IAAI,OAAO;CAC/B,MAAM,MAAM,IAAI,KAAK,KAAK;CAC1B,MAAM,OAAQ,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG;CAC7C,MAAM,EAAE,gBAAgB,MAAM,OAAO;CACrC,MAAM,MAAM,MAAM,YAAY,OAAO;CACrC,MAAM,YAAY,OAAO,QAAwC;EAC/D,MAAM,SAAS,MAAM,IAAI,UAAU,KAAK,IAAI,eAAe,CAAC;EAC5D,KAAK,MAAM,QAAQ,QAAQ,IAAI,QAAQ,IAAI;CAC7C;CACA,MAAM,UAAU,MAAM,QAAQ,SAAS,IAAI,QAAQ,KAAK,CAAC;CACzD,KAAK,MAAM,OAAO,MAAM;EACtB,IAAI,IAAI,SAAS,MACf,MAAM,IAAI,mBAAA,oBAAoB,CAAC,SAAS,yCAAyC,CAAC;EAEpF,MAAM,QAAQ,MAAM,IAAI,WAAW,IAAI,EAAE;EACzC,WAAW,SAAS,KAAK;EACzB,MAAM,UAAU,MAAM,QAAQ,SAAS,MAAM,KAAK,CAAC;CACrD;CACA,MAAM,QAAQ,IAAI,WAAW,MAAM,IAAI,KAAK,CAAC;CAC7C,OAAO;EAAE,MAAM;EAAS,SAAS;GAAE,GAAG,IAAI;GAAS;EAAM;CAAE;AAC7D;;AAGA,IAAa,cAAwB,OAAO,QAAQ;CAClD,WAAW,WAAW,IAAI,OAAO;CACjC,MAAM,QAAQ,MAAgB,IAAI,MAAM,OAAO;CAC/C,MAAM,SAAS,MAAM,QAAQ,WAAW,IAAI,QAAQ,KAAK;CACzD,MAAM,YAAY,OAAO,aAAa;CACtC,aAAa,WAAW,OAAO,SAAS;CACxC,IAAI,MAAM,WAAW,WACnB,MAAM,IAAI,mBAAA,oBAAoB,CAC5B,WACA,eAAe,MAAM,OAAO,8BAA8B,UAAU,gCACtE,CAAC;CAEH,MAAM,EAAE,gBAAgB,MAAM,OAAO;CACrC,MAAM,MAAM,MAAM,YAAY,OAAO;CACrC,MAAM,SAAS,MAAM,IAAI,UACvB,QACA,MAAM,KAAK,MAAM,IAAI,CAAC,CACxB;CACA,KAAK,MAAM,QAAQ,QAAQ,IAAI,QAAQ,IAAI;CAC3C,MAAM,QAAQ,IAAI,WAAW,MAAM,IAAI,KAAK,CAAC;CAC7C,OAAO;EAAE,MAAM;EAAS,SAAS;GAAE,GAAG,IAAI;GAAS;EAAM;CAAE;AAC7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACkDA,IAAM,eAAe,kBAAA,UAClB,OAAO;CACN,SAAS,kBAAA,UACN,MAAM,EACN,MAAM,kBAAA,UAAU,aAAa,EAAE,IAAI,kBAAA,UAAU,SAAS,GAAG,kBAAA,UAAU,OAAO,EAAE,QAAQ,IAAI,CAAC,CAAC,EAC1F,SAAS;CACZ,WAAW,kBAAA,UAAU,MAAM,EAAE,MAAM,kBAAA,UAAU,SAAS,CAAC,EAAE,SAAS;CAClE,KAAK,kBAAA,UAAU,MAAM,EAAE,MAAM,kBAAA,UAAU,SAAS,CAAC,EAAE,SAAS;CAC5D,YAAY,kBAAA,UAAU,SAAS,EAAE,SAAS;AAC5C,CAAC,EACA,QAAQ,KAAK;;AAGhB,IAAM,aAAgD;CACpD,CAAC,UAAU,UAAU;CACrB,CAAC,SAAS,SAAS;CACnB,CAAC,SAAS,SAAS;CACnB,CAAC,WAAW,WAAW;CACvB,CAAC,UAAU,UAAU;CACrB,CAAC,eAAe,cAAc;CAC9B,CAAC,QAAQ,QAAQ;CACjB,CAAC,eAAe,cAAc;CAC9B,CAAC,gBAAgB,eAAe;CAChC,CAAC,oBAAoB,mBAAmB;CACxC,CAAC,SAAS,SAAS;CACnB,GAAG;CACH,GAAG;CAEH,GAAG;CACH,GAAG;CACH,GAAG;AACL;;AAGA,IAAM,gBAAgB,OACpB,OACA,UACyB;CACzB,IAAI,QAAiB;CACrB,IAAI,OAAO,UAAU,YAAY;EAC/B,IAAI;GACF,QAAQ,MAAO,MAAwB;EACzC,SAAS,KAAK;GAEZ,MAAM,IAAI,mBAAA,gCAAgC,CAAC,WAAW,MAAM,qBAD7C,sBAAA,QAAQ,GAAG,IAAI,IAAI,UAAU,OAAO,GAAG,GACmC,CAAC;EAC5F;EACA,IAAI,sBAAA,SAAS,KAAK,KAAK,aAAa,SAAS,CAAC,kCAAA,sBAAsB,KAAK,GACvE,QAAS,MAA+B;CAE5C;CACA,IAAI,CAAC,kCAAA,sBAAsB,KAAK,GAAG;EACjC,MAAM,YAAY;EAElB,MAAM,IAAI,mBAAA,gCAAgC,CACxC,WAAW,MAAM,GAFR,sBAAA,SAAS,KAAK,KAAK,OAAO,WAAW,OAAO,WAAW,MAAM,UAAU,GAAG,MAAM,GAElE,2HACzB,CAAC;CACH;CACA,OAAO;AACT;;;;;;;;;;;;;;;AAgBA,IAAa,sBAAsB,OACjC,SAA8B,CAAC,MACJ;CAC3B,MAAM,EAAE,UAAU,aAAa,SAAS,QAAQ,EAAE,YAAY,KAAK,CAAC;CACpE,IAAI,OACF,MAAM,IAAI,mBAAA,gCAAgC,CAAC,MAAM,OAAO,CAAC;CAE3D,MAAM,MAAM,OAAO,OAAO,CAAC;CAC3B,MAAM,aACJ,OAAO,qBACA;EACL,MAAM,IAAI,mBAAA,gCAAgC,CACxC,4EACF,CAAC;CACH;CAGF,MAAM,WAAW,oBAAoB,MADP,QAAQ,KAAK,OAAO,WAAW,CAAC,GAAG,IAAI,aAAa,CAAC,GAC7B,OAAO,aAAa,CAAC,CAAC;CAE5E,MAAM,QAAQ,IAAI,IAAsB,UAAU;CAElD,MAAM,MAAM,OACV,OACA,MACA,YACwB;EACxB,MAAM,cAAc,SAAS,cAAc;EAC3C,OAAO,YAAY,MAAM;GACvB;GACA;GACA;GACA,SAAS;GACT,YAAY,OAAO,OAAO,YAAY,EAAE;GACxC,QAAQ,SAAS;EACnB,CAAC;CACH;CAEA,MAAM,WAAW,cACf,OAAO,cAAc,WACjB,iBAAA,iBAAiB,aAAa,SAAS,GAAG,EAAE,cAAc,SAAS,CAAC,IACpE,iBAAA,YAAY,WAAW,EAAE,cAAc,SAAS,CAAC;CAEvD,MAAM,aAAa,UAAmC;EACpD,OAAO,IAAI,WAAW,OAAO,QAAQ;GAEnC,OAAO,IAAI,OADE,iBAAA,YAAY,KAAK,EAAE,cAAc,SAAS,CACrC,CAAI;EACxB,CAAC;CACH;CAEA,OAAO,iBAAiB,UAAU;EAChC,OAAO,EACL,OAAO,OAAO,OAAoB,GAAW,YAA8C;GAEzF,OAAO,IAAI,OADE,iBAAA,iBAAiB,aAAa,CAAC,GAAG,EAAE,cAAc,SAAS,CACtD,GAAM,OAAO;EACjC,EACF;EACA,KAAK,EACH,OAAO,OACL,OACA,KACA,YACwB;GAExB,OAAO,IAAI,OADE,iBAAA,YAAY,KAAK,EAAE,cAAc,SAAS,CACrC,GAAM,OAAO;EACjC,EACF;EACA,SAAS,EAAE,OAAO,QAAQ;EAC1B,cAAc,EAAE,OAAO,SAAS;EAChC,SAAS,EAAE,OAAO,SAAS,QAAQ;CACrC,CAAC;CAED,OAAO;AACT"}
1
+ {"version":3,"file":"media.cjs","names":["#toks","#pos","#parseSegment","#peek","#next","#parseValue","#parseScalar","#ops","#exec","#with","#chain"],"sources":["../../src/batteries/media/pipe.ts","../../src/batteries/media/builder.ts","../../src/batteries/media/runtime.ts","../../src/batteries/media/formats.ts","../../src/batteries/media/steps/text.ts","../../src/batteries/media/steps/doc.ts","../../src/batteries/media/steps/sheet.ts","../../src/batteries/media/steps/slides.ts","../../src/batteries/media/steps/ingest.ts","../../src/batteries/media/registry.ts","../../src/batteries/media/steps/image_audio.ts","../../src/batteries/media/steps/pages.ts","../../src/batteries/media/index.ts"],"sourcesContent":["/**\n * The pipe-expression front-end: a moo lexer plus a hand-rolled recursive-descent parser that\n * compiles `select pages=2-5 | redact match=/…/ | convert to=pdf` into a {@link MediaPlan}.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. The grammar is frozen in the\n * design doc (section 0):\n *\n * - `pipeline := segment ('|' segment)*` ; `segment := verb arg*` ; `arg := IDENT '=' value` —\n * named args only, no positionals (an IDENT followed by `=` is an arg; otherwise it is the\n * verb's second word — 2-token lookahead, no verb table needed at parse time).\n * - Verb matching is separator-insensitive (`extract_text` ≡ `extract text` ≡ `extract.text`).\n * - Values: bareword idents, ints/floats, `a-b` ranges, comma lists, `true`/`false`, quoted\n * strings (single or double), class-aware `/regex/flags` literals, `@id` media refs, and\n * quoted-JSON structured payloads (a quoted string that the verb's arg schema declares as\n * `json` is JSON-parsed).\n * - `#` line comments are tolerated (models add them; ignoring them is free robustness).\n * - Two error layers: syntactic ({@link E_MEDIA_PIPE_SYNTAX}, with line/col and a corrective\n * exemplar) and semantic ({@link E_MEDIA_UNKNOWN_VERB} etc., produced by the validator in\n * `validate.ts` — this module only parses to a raw AST and lowers to the plan).\n *\n * Parsing is deployment-independent: the full verb table drives folding, and engine narrowing\n * happens later in validation (frozen 0.3).\n */\n\nimport { foldVerb } from './verbs'\nimport { default as moo } from 'moo'\nimport { canonicalFlags } from './plan'\nimport { E_MEDIA_PIPE_SYNTAX } from './exceptions'\nimport { isError, isObject } from '@nhtio/adk/guards'\nimport type { MediaPlan, MediaStep, MediaArgValue, MediaArgScalar, SourceSpan } from './plan'\n\n// ── lexer ────────────────────────────────────────────────────────────────────\n\n/**\n * The moo ruleset. Order matters: first match wins, so `range` must precede `int`, `float`\n * precedes `int`, and `comment` precedes nothing it could shadow. String/regex bodies exclude\n * raw newlines (escape them); `ws` carries `lineBreaks` so spans stay accurate across lines.\n */\nconst lexer = moo.compile({\n ws: { match: /[ \\t\\r\\n]+/, lineBreaks: true },\n comment: /#[^\\n]*/,\n pipe: '|',\n eq: '=',\n comma: ',',\n ref: /@[A-Za-z0-9_-]+/,\n regex: /\\/(?:\\\\.|\\[(?:\\\\.|[^\\]\\\\\\n])*\\]|[^/\\\\[\\n])+\\/[a-z]*/,\n dstring: /\"(?:\\\\.|[^\"\\\\\\n])*\"/,\n sstring: /'(?:\\\\.|[^'\\\\\\n])*'/,\n range: /\\d+-\\d+/,\n float: /\\d+\\.\\d+/,\n int: /\\d+/,\n ident: /[A-Za-z_][A-Za-z0-9_.]*/,\n dash: '-',\n})\n\ninterface Tok {\n type: string\n value: string\n text: string\n offset: number\n line: number\n col: number\n}\n\n/** Tokenize, skipping ws/comments, surfacing lexer errors as syntax exceptions. */\nconst tokenize = (input: string): Tok[] => {\n lexer.reset(input)\n const out: Tok[] = []\n let tok: moo.Token | undefined\n try {\n while ((tok = lexer.next())) {\n if (tok.type === 'ws' || tok.type === 'comment') continue\n out.push({\n type: tok.type as string,\n value: tok.value,\n text: tok.text,\n offset: tok.offset,\n line: tok.line,\n col: tok.col,\n })\n }\n } catch (err) {\n const detail = isError(err) ? err.message.split('\\n')[0] : String(err)\n throw new E_MEDIA_PIPE_SYNTAX([\n `${detail}. Values containing special characters must be quoted — write it like: name=\"my-value\"`,\n ])\n }\n return out\n}\n\n// ── parser ───────────────────────────────────────────────────────────────────\n\n/** A parsed-but-unvalidated arg value, before the verb's arg schema refines it. */\nexport interface RawArgValue {\n /** The lowered value. Quoted strings stay strings here; schema may JSON-parse `json` args. */\n value: MediaArgValue\n /** Whether the source token was a quoted string (drives json-arg parsing + name/index rules). */\n quoted: boolean\n /** Source position of the value token. */\n span: SourceSpan\n}\n\n/** One parsed segment: verb words plus named args, all position-bearing. */\nexport interface RawSegment {\n /** Canonical verb id when fold-matching succeeded, else the raw folded text. */\n verb: string\n /** Whether `verb` resolved against the verb table. */\n known: boolean\n /** The parsed named args, in source order. */\n args: Map<string, RawArgValue>\n /** Source position of the verb token(s). */\n span: SourceSpan\n}\n\nconst spanOf = (tok: Tok, length?: number): SourceSpan => ({\n offset: tok.offset,\n line: tok.line,\n col: tok.col,\n length: length ?? tok.text.length,\n})\n\nconst unquote = (raw: string): string =>\n raw\n .slice(1, -1)\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\t/g, '\\t')\n .replace(/\\\\([\"'\\\\/])/g, '$1')\n\nconst fail = (tok: Tok | undefined, message: string, exemplar: string): never => {\n const where = tok ? ` at line ${tok.line}, col ${tok.col}` : ' at end of input'\n throw new E_MEDIA_PIPE_SYNTAX([`${message}${where}. Write it like: ${exemplar}`])\n}\n\nclass Parser {\n #toks: Tok[]\n #pos = 0\n\n constructor(toks: Tok[]) {\n this.#toks = toks\n }\n\n #peek(ahead = 0): Tok | undefined {\n return this.#toks[this.#pos + ahead]\n }\n\n #next(): Tok | undefined {\n return this.#toks[this.#pos++]\n }\n\n parsePipeline(): RawSegment[] {\n const segments: RawSegment[] = []\n if (this.#toks.length === 0) {\n fail(undefined, 'empty pipe expression', 'extract text | chunk by=sentence')\n }\n segments.push(this.#parseSegment())\n while (this.#peek()?.type === 'pipe') {\n this.#next()\n segments.push(this.#parseSegment())\n }\n const trailing = this.#peek()\n if (trailing) {\n fail(\n trailing,\n `unexpected \"${trailing.text}\" after a complete segment`,\n 'segment | segment (segments are separated by |)'\n )\n }\n return segments\n }\n\n #parseSegment(): RawSegment {\n const first = this.#peek()\n if (!first || first.type !== 'ident') {\n fail(first, 'expected a verb to start the segment', 'convert to=pdf')\n }\n const head = this.#next() as Tok\n // Verb words: idents NOT followed by `=` (named-args-only makes this unambiguous), up to\n // the longest canonical verb (3 words, e.g. `sheet update cells`). When the greedy\n // collection over-reaches, back off to the longest prefix that fold-matches and rewind so\n // the leftover bareword surfaces as the args-must-be-named error. The fold uses the FULL\n // static verb table — deployment-independent (engine narrowing is a later validation pass).\n const collected = [head.value]\n const posAfterWord: number[] = [this.#pos]\n while (collected.length < 3) {\n const next = this.#peek()\n if (next?.type !== 'ident' || this.#peek(1)?.type === 'eq') break\n collected.push((this.#next() as Tok).value)\n posAfterWord.push(this.#pos)\n }\n let take = collected.length\n if (foldVerb(collected) === undefined) {\n // Back off to the longest prefix that folds; if none folds at any length, keep the full\n // sequence as the unknown verb so did-you-mean sees the model's whole attempt.\n let prefix = collected.length - 1\n while (prefix >= 1 && foldVerb(collected.slice(0, prefix)) === undefined) prefix -= 1\n if (prefix >= 1) take = prefix\n }\n const words = collected.slice(0, take)\n this.#pos = posAfterWord[take - 1]\n const folded = foldVerb(words)\n const verbText = words.join(' ')\n const args = new Map<string, RawArgValue>()\n for (;;) {\n const tok = this.#peek()\n if (!tok || tok.type === 'pipe') break\n if (tok.type === 'dash') {\n fail(\n tok,\n 'unexpected \"-\" — values containing dashes must be quoted',\n `${verbText} name=\"value-with-dashes\"`\n )\n }\n if (tok.type !== 'ident' || this.#peek(1)?.type !== 'eq') {\n fail(tok, `unexpected \"${tok.text}\" — args must be name=value`, `${verbText} name=value`)\n }\n const name = (this.#next() as Tok).value\n this.#next() // eq\n const value = this.#parseValue(verbText, name)\n if (args.has(name)) {\n fail(tok, `duplicate arg \"${name}\"`, `${verbText} ${name}=value (give each arg once)`)\n }\n args.set(name, value)\n }\n return {\n verb: folded ?? verbText,\n known: folded !== undefined,\n args,\n span: spanOf(head, verbText.length),\n }\n }\n\n #parseValue(verbText: string, argName: string): RawArgValue {\n const first = this.#parseScalar(verbText, argName)\n if (this.#peek()?.type !== 'comma') return first\n const items: MediaArgScalar[] = [...asScalarList(first, verbText, argName)]\n let quoted = first.quoted\n while (this.#peek()?.type === 'comma') {\n this.#next()\n const next = this.#parseScalar(verbText, argName)\n quoted = quoted || next.quoted\n items.push(...asScalarList(next, verbText, argName))\n }\n return { value: items, quoted, span: first.span }\n }\n\n #parseScalar(verbText: string, argName: string): RawArgValue {\n const tok = this.#peek()\n if (!tok) {\n fail(tok, `missing value for \"${argName}\"`, `${verbText} ${argName}=value`)\n }\n const t = tok as Tok\n switch (t.type) {\n case 'int':\n this.#next()\n return { value: Number(t.value), quoted: false, span: spanOf(t) }\n case 'float':\n this.#next()\n return { value: Number(t.value), quoted: false, span: spanOf(t) }\n case 'range': {\n this.#next()\n const [lo, hi] = t.value.split('-').map(Number)\n if (lo > hi) {\n fail(t, `range ${t.value} is descending (start must be ≤ end)`, `${argName}=${hi}-${lo}`)\n }\n const nums: number[] = []\n for (let n = lo; n <= hi; n++) nums.push(n)\n return { value: nums, quoted: false, span: spanOf(t) }\n }\n case 'ident': {\n this.#next()\n if (t.value === 'true') return { value: true, quoted: false, span: spanOf(t) }\n if (t.value === 'false') return { value: false, quoted: false, span: spanOf(t) }\n return { value: t.value, quoted: false, span: spanOf(t) }\n }\n case 'dstring':\n case 'sstring':\n this.#next()\n return { value: unquote(t.text), quoted: true, span: spanOf(t) }\n case 'regex': {\n this.#next()\n const lastSlash = t.text.lastIndexOf('/')\n const source = t.text.slice(1, lastSlash)\n const flags = canonicalFlags(t.text.slice(lastSlash + 1))\n try {\n // Validate the pattern compiles; the IR stores the serializable ref.\n void new RegExp(source, flags)\n } catch (err) {\n const detail = isError(err) ? err.message : String(err)\n fail(t, `invalid regex ${t.text}: ${detail}`, `${argName}=/pattern/flags`)\n }\n return { value: { source, flags }, quoted: false, span: spanOf(t) }\n }\n case 'ref':\n this.#next()\n return {\n value: { kind: 'id', id: t.value.slice(1) },\n quoted: false,\n span: spanOf(t),\n }\n case 'dash':\n fail(\n t,\n 'unexpected \"-\" in a bare value',\n `${argName}=\"value-with-dashes\" (quote values containing dashes)`\n )\n break\n default:\n fail(t, `unexpected \"${t.text}\"`, `${verbText} ${argName}=value`)\n }\n /* unreachable */\n throw new E_MEDIA_PIPE_SYNTAX(['internal parser error'])\n }\n}\n\nconst asScalarList = (raw: RawArgValue, verbText: string, argName: string): MediaArgScalar[] => {\n if (Array.isArray(raw.value)) return raw.value as MediaArgScalar[]\n if (raw.value === null || typeof raw.value === 'object') {\n const v = raw.value as MediaArgValue\n if (isObject(v) && !Array.isArray(v) && !('source' in v) && !('kind' in v)) {\n throw new E_MEDIA_PIPE_SYNTAX([\n `structured values cannot appear in a comma list for \"${argName}\" on \"${verbText}\"`,\n ])\n }\n }\n return [raw.value as MediaArgScalar]\n}\n\n// ── public surface ───────────────────────────────────────────────────────────\n\n/**\n * Parse a pipe expression into raw, position-bearing segments.\n *\n * @remarks\n * Purely syntactic — verbs are fold-matched against the full verb table for canonicalization\n * but unknown verbs are NOT an error here (the validator reports them with did-you-mean and the\n * deployment's narrowed verb list). Pair with `validateSegments` for the validated path.\n *\n * @param input - The pipe expression.\n * @returns The raw segments.\n */\nexport const parsePipeRaw = (input: string): RawSegment[] => {\n return new Parser(tokenize(input)).parsePipeline()\n}\n\n/**\n * Lower raw segments to an (unvalidated) {@link MediaPlan}. Quoted-JSON arg parsing and\n * type/enum checks happen in the validator, which consumes the raw segments — this lowering\n * exists for tooling that wants the structural plan without validation.\n *\n * @param segments - Output of {@link parsePipeRaw}.\n * @returns The structural plan (args carried as parsed, json args still strings).\n */\nexport const lowerSegments = (segments: RawSegment[]): MediaPlan => ({\n steps: segments.map(\n (seg): MediaStep => ({\n verb: seg.verb,\n args: Object.fromEntries(Array.from(seg.args.entries(), ([k, v]) => [k, v.value])),\n span: seg.span,\n })\n ),\n})\n","/**\n * The chainable, thenable media builder — the implementor-facing front-end that compiles to\n * the same {@link MediaPlan} as the pipe string and JSON ops.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. The knex lessons applied:\n * `mp(input)` opens a fresh immutable builder; every verb returns a new builder; awaiting the\n * builder executes the chain (no `.execute()`). Domain verbs hang off typed namespaces\n * (`.sheet`, `.slides`, `.image`, `.audio`); shared transforms live on the root.\n *\n * Each verb method appends an op and revalidates lazily — the full plan validates (verb table,\n * arg schemas, engine narrowing) when the chain executes, so building is cheap and the same\n * validator serves all three front-ends.\n */\n\nimport { toPipe } from './plan'\nimport type { PlanResult, StepPayload } from './runtime'\nimport type { MediaPlan, MediaOp, MediaArgValue, MediaArgJson, MediaRef } from './plan'\n\n/** The function a builder calls to execute its accumulated ops. Bound by the pipeline. */\nexport type ChainExecutor = (ops: MediaOp[]) => Promise<PlanResult>\n\n/** Options accepted by image resize. */\nexport interface ResizeOptions {\n /** Target width in pixels. */\n width?: number\n /** Target height in pixels. */\n height?: number\n /** Resize fit mode (default cover). */\n fit?: 'cover' | 'contain' | 'fill' | 'inside' | 'outside'\n}\n\n/** A cell update for `sheet.updateCells`. */\nexport interface CellUpdate {\n /** A1-notation address, e.g. `B2`. Alternative to row/col. */\n address?: string\n /** One-based row index. Pair with `col`. */\n row?: number\n /** One-based column index, or a column letter. Pair with `row`. */\n col?: number | string\n /** The value to set. A leading `=` writes a formula. */\n value: string | number | boolean | null\n}\n\nconst refOf = (other: MediaChainRef): MediaRef =>\n typeof other === 'string' ? { kind: 'id', id: other } : { kind: 'id', id: other.mediaId }\n\n/** How other media are referenced from builder verbs: an id string or `{ mediaId }`. */\nexport type MediaChainRef = string | { mediaId: string }\n\n/**\n * The chainable builder. Immutable — every verb returns a new instance sharing the executor.\n * Thenable — `await` runs the chain and resolves to the terminal step's natural type.\n */\nexport class MediaChain implements PromiseLike<unknown> {\n readonly #ops: MediaOp[]\n readonly #exec: ChainExecutor\n\n constructor(exec: ChainExecutor, ops: MediaOp[] = []) {\n this.#exec = exec\n this.#ops = ops\n }\n\n #with(verb: string, args: Record<string, MediaArgValue>): MediaChain {\n return new MediaChain(this.#exec, [...this.#ops, { verb, args }])\n }\n\n // ── root transforms ─────────────────────────────────────────────────────────\n\n /** Convert to another format (requires a convert engine). */\n convert(to: string): MediaChain {\n return this.#with('convert', { to })\n }\n\n /** Keep only the listed 1-based pages. */\n select(options: { pages: number[] }): MediaChain {\n return this.#with('select', { pages: options.pages })\n }\n\n /** Split by page (optionally grouped `[[start,end], …]`). Terminal: resolves to media list. */\n split(options: { by?: 'page' | 'section'; ranges?: number[][] } = {}): MediaChain {\n const args: Record<string, MediaArgValue> = {}\n if (options.by) args.by = options.by\n if (options.ranges) args.ranges = options.ranges as MediaArgJson\n return this.#with('split', args)\n }\n\n /** Merge other media into this one, in order. */\n merge(...others: MediaChainRef[]): MediaChain {\n return this.#with('merge', { with: others.map(refOf) })\n }\n\n /** Reorder pages by 1-based index. */\n reorder(order: number[]): MediaChain {\n return this.#with('reorder', { order })\n }\n\n /** Redact matching text (literals or RegExp). */\n redact(options: {\n match: Array<string | RegExp> | string | RegExp\n replace?: string\n }): MediaChain {\n const list = Array.isArray(options.match) ? options.match : [options.match]\n const match = list.map((m) =>\n typeof m === 'string' ? m : { source: m.source, flags: Array.from(m.flags).sort().join('') }\n )\n const args: Record<string, MediaArgValue> = { match }\n if (options.replace !== undefined) args.replace = options.replace\n return this.#with('redact', args)\n }\n\n /** Remove potentially unsafe embedded content. */\n sanitize(): MediaChain {\n return this.#with('sanitize', {})\n }\n\n /** Normalize structure/encoding. */\n normalize(): MediaChain {\n return this.#with('normalize', {})\n }\n\n /** Replace the first occurrence of anchor text. */\n updateText(anchor: string, replace: string): MediaChain {\n return this.#with('update_text', { anchor, replace })\n }\n\n /** Compare against another media. Terminal: resolves to a structured diff. */\n diff(other: MediaChainRef): MediaChain {\n return this.#with('diff', { with: refOf(other) })\n }\n\n /** Apply a unified-diff patch. */\n applyPatch(patch: string, options: { with?: MediaChainRef[] } = {}): MediaChain {\n const args: Record<string, MediaArgValue> = { patch }\n if (options.with) args.with = options.with.map(refOf)\n return this.#with('apply_patch', args)\n }\n\n /** Extract text (routes by format; OCR engine used when needed). Terminal: resolves to text. */\n extractText(\n options: {\n ocr?: 'off' | 'auto' | 'force'\n ocrOut?: 'txt' | 'hocr' | 'json'\n lang?: string[]\n } = {}\n ): MediaChain {\n const args: Record<string, MediaArgValue> = {}\n if (options.ocr) args.ocr = options.ocr\n if (options.ocrOut) args.ocr_out = options.ocrOut\n if (options.lang) args.lang = options.lang\n return this.#with('extract.text', args)\n }\n\n /** Extract metadata. Terminal: resolves to a metadata object. */\n extractMetadata(): MediaChain {\n return this.#with('extract.metadata', {})\n }\n\n /** Extract embedded assets. Terminal: resolves to a media list. */\n extractAssets(\n options: { types?: Array<'image' | 'font' | 'attachment' | 'all'> } = {}\n ): MediaChain {\n const args: Record<string, MediaArgValue> = {}\n if (options.types) args.types = options.types\n return this.#with('extract.assets', args)\n }\n\n /** Chunk extracted text. Terminal: resolves to a chunk array. */\n chunk(\n options: { strategy?: 'sentence' | 'paragraph' | 'fixed'; size?: number; overlap?: number } = {}\n ): MediaChain {\n const args: Record<string, MediaArgValue> = {}\n if (options.strategy) args.by = options.strategy\n if (options.size !== undefined) args.size = options.size\n if (options.overlap !== undefined) args.overlap = options.overlap\n return this.#with('chunk', args)\n }\n\n // ── domain namespaces ───────────────────────────────────────────────────────\n\n /** Spreadsheet mutations. */\n get sheet(): SheetNamespace {\n return new SheetNamespace(this)\n }\n\n /** Presentation mutations. */\n get slides(): SlidesNamespace {\n return new SlidesNamespace(this)\n }\n\n /** Image transforms. */\n get image(): ImageNamespace {\n return new ImageNamespace(this)\n }\n\n /** Audio operations. */\n get audio(): AudioNamespace {\n return new AudioNamespace(this)\n }\n\n // ── serialization + execution ───────────────────────────────────────────────\n\n /** The accumulated ops (a copy). */\n toOps(): MediaOp[] {\n return this.#ops.map((op) => ({ verb: op.verb, args: { ...op.args } }))\n }\n\n /** The canonical pipe form of the accumulated chain. */\n toPipe(): string {\n const plan: MediaPlan = { steps: this.#ops.map((op) => ({ verb: op.verb, args: op.args })) }\n return toPipe(plan)\n }\n\n /** Internal — used by namespaces to append. */\n withOp(verb: string, args: Record<string, MediaArgValue>): MediaChain {\n return this.#with(verb, args)\n }\n\n /** Thenable: awaiting the chain executes it. */\n then<TResult1 = unknown, TResult2 = never>(\n onfulfilled?: ((value: unknown) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): PromiseLike<TResult1 | TResult2> {\n return this.#exec(this.toOps()).then(unwrapResult).then(onfulfilled, onrejected)\n }\n\n /** Execute and return the raw {@link PlanResult} (no unwrapping). */\n async run(): Promise<PlanResult> {\n return this.#exec(this.toOps())\n }\n}\n\n/** Resolve a plan result to its natural awaited type. */\nconst unwrapResult = (result: PlanResult): unknown => {\n if (result.kind === 'media') return result.payload\n if (result.kind === 'media-list') return result.payloads\n return result.data\n}\n\n/** `sheet.*` verbs, mirrored from the verb table. */\nexport class SheetNamespace {\n readonly #chain: MediaChain\n constructor(chain: MediaChain) {\n this.#chain = chain\n }\n /** Insert rows. */\n addRows(\n rows: Array<Array<string | number | boolean | null>>,\n options: { sheet?: string | number; before?: number; after?: number } = {}\n ): MediaChain {\n return this.#chain.withOp(\n 'sheet.add_rows',\n compact({\n rows: rows as MediaArgJson,\n ...targetArgs(options),\n before: options.before,\n after: options.after,\n })\n )\n }\n /** Insert columns. */\n addColumns(options: {\n sheet?: string | number\n headers?: string[]\n columns?: Array<{ header: string; values?: Array<string | number | boolean | null> }>\n before?: number\n after?: number\n }): MediaChain {\n return this.#chain.withOp(\n 'sheet.add_columns',\n compact({\n ...targetArgs(options),\n headers: options.headers,\n columns: options.columns as MediaArgJson,\n before: options.before,\n after: options.after,\n })\n )\n }\n /** Update cells. */\n updateCells(updates: CellUpdate[], options: { sheet?: string | number } = {}): MediaChain {\n return this.#chain.withOp(\n 'sheet.update_cells',\n compact({ updates: updates as unknown as MediaArgJson, ...targetArgs(options) })\n )\n }\n /** Delete rows by 1-based index. */\n deleteRows(rows: number[], options: { sheet?: string | number } = {}): MediaChain {\n return this.#chain.withOp('sheet.delete_rows', compact({ rows, ...targetArgs(options) }))\n }\n /** Delete columns by 1-based index. */\n deleteColumns(columns: number[], options: { sheet?: string | number } = {}): MediaChain {\n return this.#chain.withOp('sheet.delete_columns', compact({ columns, ...targetArgs(options) }))\n }\n /** Rename a worksheet (name-targeted). */\n renameSheet(sheet: string, to: string): MediaChain {\n return this.#chain.withOp('sheet.rename_sheet', { sheet, to })\n }\n /** Add a worksheet. */\n addSheet(name: string, options: { at?: number } = {}): MediaChain {\n return this.#chain.withOp('sheet.add_sheet', compact({ name, at: options.at }))\n }\n /** Remove a worksheet (name-targeted). */\n removeSheet(sheet: string): MediaChain {\n return this.#chain.withOp('sheet.remove_sheet', { sheet })\n }\n /** Reorder worksheets by names and/or 1-based indices. */\n reorderSheets(order: Array<string | number>): MediaChain {\n return this.#chain.withOp('sheet.reorder_sheets', { order: order as MediaArgJson })\n }\n /** Table transforms by header name. */\n transformTable(options: {\n sheet?: string | number\n headerRow?: number\n select?: string[]\n drop?: string[]\n rename?: Array<{ from: string; to: string }>\n }): MediaChain {\n return this.#chain.withOp(\n 'sheet.transform_table',\n compact({\n ...targetArgs(options),\n header_row: options.headerRow,\n select: options.select,\n drop: options.drop,\n rename: options.rename as MediaArgJson,\n })\n )\n }\n}\n\n/** `slides.*` verbs. */\nexport class SlidesNamespace {\n readonly #chain: MediaChain\n constructor(chain: MediaChain) {\n this.#chain = chain\n }\n /** Add a slide. */\n add(options: { at?: number; title?: string; layout?: string } = {}): MediaChain {\n return this.#chain.withOp(\n 'slides.add',\n compact({ at: options.at, title: options.title, layout: options.layout })\n )\n }\n /** Update text on a slide. */\n updateText(\n text: string,\n options: { slide?: string | number; placeholder?: string } = {}\n ): MediaChain {\n return this.#chain.withOp(\n 'slides.update_text',\n compact({ text, slide: slideArg(options.slide), placeholder: options.placeholder })\n )\n }\n /** Update table cells on a slide. */\n updateTable(\n updates: Array<{ row: number; col: number; value: string }>,\n options: { slide?: string | number } = {}\n ): MediaChain {\n return this.#chain.withOp(\n 'slides.update_table',\n compact({ updates: updates as unknown as MediaArgJson, slide: slideArg(options.slide) })\n )\n }\n /** Replace an image on a slide with another media. */\n updateImage(\n withMedia: MediaChainRef,\n options: { slide?: string | number; placeholder?: string } = {}\n ): MediaChain {\n return this.#chain.withOp(\n 'slides.update_image',\n compact({\n with: refOf(withMedia),\n slide: slideArg(options.slide),\n placeholder: options.placeholder,\n })\n )\n }\n /** Update chart data on a slide. */\n updateChart(data: unknown[][], options: { slide?: string | number } = {}): MediaChain {\n return this.#chain.withOp(\n 'slides.update_chart',\n compact({ data: data as MediaArgJson, slide: slideArg(options.slide) })\n )\n }\n /** Delete slides by 1-based index. */\n delete(slides: number[]): MediaChain {\n return this.#chain.withOp('slides.delete', { slides })\n }\n /** Reorder slides. */\n reorder(order: number[]): MediaChain {\n return this.#chain.withOp('slides.reorder', { order })\n }\n /** Duplicate a slide. */\n duplicate(slide: number, options: { at?: number } = {}): MediaChain {\n return this.#chain.withOp('slides.duplicate', compact({ slide, at: options.at }))\n }\n}\n\n/** `image.*` verbs (the runtime fuses adjacent image steps into one engine pass). */\nexport class ImageNamespace {\n readonly #chain: MediaChain\n constructor(chain: MediaChain) {\n this.#chain = chain\n }\n /** Resize. */\n resize(options: ResizeOptions): MediaChain {\n return this.#chain.withOp(\n 'image.resize',\n compact({ width: options.width, height: options.height, fit: options.fit })\n )\n }\n /** Re-encode to another format. */\n format(to: string, options: { quality?: number; stripMetadata?: boolean } = {}): MediaChain {\n return this.#chain.withOp(\n 'image.format',\n compact({ to, quality: options.quality, strip_metadata: options.stripMetadata })\n )\n }\n /** Rotate clockwise. */\n rotate(deg: 90 | 180 | 270): MediaChain {\n return this.#chain.withOp('image.rotate', { deg: String(deg) })\n }\n /** Flip. */\n flip(axis: 'horizontal' | 'vertical' | 'both'): MediaChain {\n return this.#chain.withOp('image.flip', { axis })\n }\n /** Strip EXIF/ICC metadata. */\n stripMetadata(): MediaChain {\n return this.#chain.withOp('image.strip_metadata', {})\n }\n}\n\n/** `audio.*` verbs. */\nexport class AudioNamespace {\n readonly #chain: MediaChain\n constructor(chain: MediaChain) {\n this.#chain = chain\n }\n /** Transcribe speech. Terminal: resolves to text (or srt/vtt/json per `out`). */\n transcribe(\n options: { language?: string; out?: 'txt' | 'srt' | 'vtt' | 'json'; translate?: boolean } = {}\n ): MediaChain {\n return this.#chain.withOp(\n 'audio.transcribe',\n compact({ lang: options.language, out: options.out, translate: options.translate })\n )\n }\n}\n\nconst targetArgs = (options: { sheet?: string | number }): Record<string, MediaArgValue> =>\n options.sheet === undefined ? {} : { sheet: options.sheet }\n\nconst slideArg = (slide: string | number | undefined): string | number | undefined => slide\n\nconst compact = (\n args: Record<string, MediaArgValue | undefined>\n): Record<string, MediaArgValue> => {\n const out: Record<string, MediaArgValue> = {}\n for (const [k, v] of Object.entries(args)) {\n if (v !== undefined) out[k] = v\n }\n return out\n}\n\n/** The input shapes `mp(...)` accepts. */\nexport type ChainInput = StepPayload\n","/**\n * The step runtime: executes a validated {@link MediaPlan} as an `@nhtio/middleware` onion,\n * one stage per step, with consumer interceptors wrapping every step.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. A fresh `Runner` is minted per\n * execution (middleware runners are single-use), so the same compiled chain can be awaited\n * repeatedly. Each step stage:\n *\n * 1. runs the consumer's `use` interceptors (the documented seam for DLP/AV scanning, caching\n * via `shortCircuit(bytes)`, byte limits, and telemetry — the battery ships no built-in\n * scanner/cache/limiter: those are policies, this is the seam), then\n * 2. dispatches to the verb's registered {@link StepImpl}, validating the output at the step\n * boundary so a misbehaving engine produces a clear error instead of corrupt bytes.\n *\n * Steps stream bytes in memory; nothing touches disk except inside a binary engine's\n * `ScratchWorkspace`. Adjacent `image.*` steps are fused by the compiler before execution so\n * a resize→format→rotate chain costs a single decode/encode.\n */\n\nimport { VERB_INDEX } from './verbs'\nimport { Middleware } from '@nhtio/middleware'\nimport { isError, isObject, isInstanceOf } from '@nhtio/adk/guards'\nimport { E_MEDIA_STEP_FAILED, E_MEDIA_STEP_UNAVAILABLE } from './exceptions'\nimport type { NextFn } from '@nhtio/middleware'\nimport type { EngineRegistry } from './registry'\nimport type { MediaPlan, MediaStep, MediaArgValue } from './plan'\n\n/** A single in-flight value travelling between steps. */\nexport interface StepPayload {\n /** The raw content bytes. */\n bytes: Uint8Array\n /** The content MIME type. */\n mimeType: string\n /** The filename (extension informs format dispatch). */\n filename: string\n}\n\n/**\n * What a step produces. `media` continues the chain (or terminates as bytes); `media-list`\n * and `data` are terminal-only shapes enforced by the plan compiler.\n */\nexport type StepResult =\n | { kind: 'media'; payload: StepPayload }\n | { kind: 'media-list'; payloads: StepPayload[] }\n | { kind: 'data'; data: unknown; asText?: string }\n\n/** The mutable execution context threaded through interceptors and step impls. */\nexport interface StepContext {\n /** The whole plan being executed. */\n readonly plan: MediaPlan\n /** Zero-based index of the current step. */\n readonly stepIndex: number\n /** The current step. */\n readonly step: MediaStep\n /** The input payload for this step. */\n payload: StepPayload\n /** Abort signal threaded from the caller. */\n readonly signal?: AbortSignal\n /** Scratchpad shared across the execution (interceptors may stash timings, hashes…). */\n readonly stash: Map<string, unknown>\n /**\n * Short-circuit this step: skip the implementation and continue the chain with `bytes`\n * (the cache idiom). Throws internally — call it, don't return it.\n */\n shortCircuit(payload: StepPayload): never\n /** The deployment's engine registry — ordered, capability-filtered dispatch. */\n readonly engines: EngineRegistry\n /**\n * Resolve another media participating in this step (merge/diff targets), by ref id.\n * Supplied by the pipeline from its configured media resolver.\n */\n resolveRef(id: string): Promise<StepPayload>\n}\n\n/** One verb's implementation. Registered into the runtime's step registry. */\nexport type StepImpl = (ctx: StepContext) => Promise<StepResult>\n\n/** Consumer step interceptor — the `use` seam. Same onion shape as the tool batteries. */\nexport type MediaStepMiddlewareFn = (ctx: StepContext, next: NextFn) => void | Promise<void>\n\n/** Internal sentinel for {@link StepContext.shortCircuit}. */\nconst SHORT_CIRCUIT = Symbol('adk.media.shortCircuit')\n\ninterface ShortCircuitSignal {\n [SHORT_CIRCUIT]: true\n payload: StepPayload\n}\n\nconst isShortCircuit = (value: unknown): value is ShortCircuitSignal =>\n isObject(value) && (value as Record<symbol, unknown>)[SHORT_CIRCUIT] === true\n\n/** Options for {@link executePlan}. */\nexport interface ExecutePlanOptions {\n /** The input payload the first step consumes. */\n input: StepPayload\n /** Verb id → implementation registry. */\n steps: ReadonlyMap<string, StepImpl>\n /** Consumer interceptors wrapping every step. */\n use: readonly MediaStepMiddlewareFn[]\n /** The deployment's engine registry. */\n engines: EngineRegistry\n /** Media-ref resolution for multi-input verbs. */\n resolveRef: StepContext['resolveRef']\n /** Abort signal. */\n signal?: AbortSignal\n}\n\n/** The settled result of executing a whole plan. */\nexport type PlanResult = StepResult\n\n/**\n * Execute a validated plan. Returns the final step's result; intermediate steps must produce\n * `media` results (the compiler guarantees non-terminal steps are media-shaped).\n *\n * @param plan - The validated plan.\n * @param options - Input payload, step registry, interceptors, engine access.\n * @returns The terminal step's result.\n */\nexport const executePlan = async (\n plan: MediaPlan,\n options: ExecutePlanOptions\n): Promise<PlanResult> => {\n const stash = new Map<string, unknown>()\n let payload = options.input\n let result: PlanResult = { kind: 'media', payload }\n\n for (let i = 0; i < plan.steps.length; i++) {\n const step = plan.steps[i]\n options.signal?.throwIfAborted()\n const impl = options.steps.get(step.verb)\n if (!impl) {\n throw new E_MEDIA_STEP_UNAVAILABLE([step.verb])\n }\n\n const ctx: StepContext = {\n plan,\n stepIndex: i,\n step,\n payload,\n signal: options.signal,\n stash,\n shortCircuit: (sc: StepPayload): never => {\n const signal: ShortCircuitSignal = { [SHORT_CIRCUIT]: true, payload: sc }\n throw signal\n },\n engines: options.engines,\n resolveRef: options.resolveRef,\n }\n\n try {\n result = await runStep(ctx, impl, options.use)\n } catch (err) {\n if (isShortCircuit(err)) {\n result = { kind: 'media', payload: err.payload }\n } else if (isError(err) && err.name.startsWith('E_MEDIA_')) {\n throw err\n } else {\n const detail = isError(err) ? err.message : String(err)\n throw new E_MEDIA_STEP_FAILED([step.verb, detail], { cause: err })\n }\n }\n\n if (result.kind === 'media') {\n payload = result.payload\n } else if (i < plan.steps.length - 1) {\n if (\n result.kind === 'data' &&\n typeof result.asText === 'string' &&\n VERB_INDEX.get(step.verb)?.output === 'text'\n ) {\n // R-step materialization (frozen 0.10): a non-terminal read step yields a text Media\n // into the chain, so `extract text | chunk` is type-sound.\n payload = {\n bytes: new TextEncoder().encode(result.asText),\n mimeType: 'text/plain',\n filename: materializedName(payload.filename),\n }\n result = { kind: 'media', payload }\n } else {\n throw new E_MEDIA_STEP_FAILED([\n step.verb,\n 'a non-terminal step produced a terminal result; only the last step may yield data or multiple media',\n ])\n }\n }\n }\n return result\n}\n\n/** Run one step: interceptor onion (fresh runner) terminating in the implementation. */\nconst runStep = async (\n ctx: StepContext,\n impl: StepImpl,\n use: readonly MediaStepMiddlewareFn[]\n): Promise<StepResult> => {\n if (use.length === 0) {\n return validated(ctx, await impl(ctx))\n }\n const mw = new Middleware<MediaStepMiddlewareFn>()\n for (const fn of use) mw.add(fn)\n\n let result: StepResult | undefined\n let caught: unknown\n await mw\n .runner()\n .errorHandler(async (error: unknown) => {\n caught = error\n })\n .finalHandler(async () => {\n result = validated(ctx, await impl(ctx))\n })\n .run((fn, next) => Promise.resolve(fn(ctx, next)))\n\n if (caught !== undefined) throw caught\n if (result === undefined) {\n throw new E_MEDIA_STEP_FAILED([\n ctx.step.verb,\n 'a step interceptor did not call next() and did not short-circuit',\n ])\n }\n return result\n}\n\n/** Validate a step implementation's output shape at the boundary. */\nconst validated = (ctx: StepContext, result: StepResult): StepResult => {\n const bad = (msg: string): never => {\n throw new E_MEDIA_STEP_FAILED([ctx.step.verb, `implementation returned ${msg}`])\n }\n const isBytes = (value: unknown): value is Uint8Array =>\n isInstanceOf(value, 'Uint8Array', Uint8Array)\n if (result.kind === 'media') {\n if (!isBytes(result.payload?.bytes)) bad('a media result without bytes')\n if (typeof result.payload.mimeType !== 'string') bad('a media result without a mimeType')\n return result\n }\n if (result.kind === 'media-list') {\n if (!Array.isArray(result.payloads) || result.payloads.some((p) => !isBytes(p.bytes))) {\n bad('a media-list result with invalid payloads')\n }\n return result\n }\n if (result.kind === 'data') return result\n return bad('an unknown result kind')\n}\n\n/** Filename for an R-step's materialized text payload. */\nconst materializedName = (filename: string): string => {\n const dot = filename.lastIndexOf('.')\n const base = dot > 0 ? filename.slice(0, dot) : filename\n return `${base}.txt`\n}\n\n/** Convenience: read a step arg with a typed cast (validation already ran). */\nexport const argOf = <T extends MediaArgValue>(step: MediaStep, name: string): T | undefined =>\n step.args[name] as T | undefined\n","/**\n * MIME tables and format-family classification for the media pipeline.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. Ported from the source server's\n * `format_families.ts` support tiers, reshaped for the DSL's verb-applicability checks:\n *\n * - Tier 1 (full read + mutate): OOXML (docx/xlsx/pptx) and ODF (odt/ods/odp, via a normalize\n * engine), plus PDF for page-level operations.\n * - Tier 2 (extraction only): legacy Office (doc/xls/ppt) and Apple iWork — mutation verbs\n * reject these with a reason string rather than a throw, so callers can surface\n * model-actionable failures.\n * - Everything else classifies by top-level MIME family (image/audio/text).\n */\n\nimport type { FormatFamily } from './verbs'\n\n/** Well-known MIME constants used across the battery. */\nexport const MIME = {\n DOCX: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n XLSX: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n PPTX: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n ODT: 'application/vnd.oasis.opendocument.text',\n ODS: 'application/vnd.oasis.opendocument.spreadsheet',\n ODP: 'application/vnd.oasis.opendocument.presentation',\n PDF: 'application/pdf',\n DOC: 'application/msword',\n XLS: 'application/vnd.ms-excel',\n PPT: 'application/vnd.ms-powerpoint',\n PAGES: 'application/x-iwork-pages-sffpages',\n NUMBERS: 'application/x-iwork-numbers-sffnumbers',\n KEYNOTE: 'application/x-iwork-keynote-sffkey',\n TXT: 'text/plain',\n MD: 'text/markdown',\n CSV: 'text/csv',\n HTML: 'text/html',\n JSON: 'application/json',\n PNG: 'image/png',\n JPEG: 'image/jpeg',\n WEBP: 'image/webp',\n TIFF: 'image/tiff',\n AVIF: 'image/avif',\n WAV: 'audio/wav',\n MP3: 'audio/mpeg',\n} as const\n\n/** Legacy Office MIME types (extraction only — mutation is rejected). */\nexport const LEGACY_OFFICE_MIMES: ReadonlySet<string> = new Set([MIME.DOC, MIME.XLS, MIME.PPT])\n\n/** Apple iWork MIME types (extraction only — mutation is rejected). */\nexport const IWORK_MIMES: ReadonlySet<string> = new Set([MIME.PAGES, MIME.NUMBERS, MIME.KEYNOTE])\n\nconst SPREADSHEET_MIMES: ReadonlySet<string> = new Set([MIME.XLSX, MIME.ODS, MIME.XLS, MIME.CSV])\nconst PRESENTATION_MIMES: ReadonlySet<string> = new Set([\n MIME.PPTX,\n MIME.ODP,\n MIME.PPT,\n MIME.KEYNOTE,\n])\nconst DOCUMENT_MIMES: ReadonlySet<string> = new Set([\n MIME.PDF,\n MIME.DOCX,\n MIME.ODT,\n MIME.DOC,\n MIME.PAGES,\n MIME.TXT,\n MIME.MD,\n MIME.HTML,\n MIME.JSON,\n 'application/rtf',\n 'text/rtf',\n])\n\n/**\n * Classify a MIME type into the verb table's broad format family.\n *\n * @param mimeType - The media MIME type.\n * @returns The family used by verb-applicability checks.\n */\nexport const familyOf = (mimeType: string): FormatFamily => {\n const mime = mimeType.toLowerCase().split(';')[0].trim()\n if (SPREADSHEET_MIMES.has(mime)) return 'spreadsheet'\n if (PRESENTATION_MIMES.has(mime)) return 'presentation'\n if (DOCUMENT_MIMES.has(mime)) return 'document'\n if (mime.startsWith('image/')) return 'image'\n if (mime.startsWith('audio/')) return 'audio'\n if (mime.startsWith('text/')) return 'document'\n return 'document'\n}\n\n/**\n * Reason a mutation verb cannot run against this MIME type, or `undefined` when mutation is\n * allowed. Returns a reason string (not a throw) so callers compose model-actionable failures.\n *\n * @param mimeType - The media MIME type.\n * @returns A human-readable reason, or `undefined` when mutation is supported.\n */\nexport const unsupportedForMutationReason = (mimeType: string): string | undefined => {\n const mime = mimeType.toLowerCase().split(';')[0].trim()\n if (LEGACY_OFFICE_MIMES.has(mime)) {\n return `legacy Office format (${mime}) supports extraction only — convert it first (e.g. convert to=docx)`\n }\n if (IWORK_MIMES.has(mime)) {\n return `Apple iWork format (${mime}) supports extraction only`\n }\n return undefined\n}\n\n/** A small extension → MIME lookup for filenames produced by transforms. */\nexport const EXT_TO_MIME: Readonly<Record<string, string>> = {\n pdf: MIME.PDF,\n docx: MIME.DOCX,\n xlsx: MIME.XLSX,\n pptx: MIME.PPTX,\n odt: MIME.ODT,\n ods: MIME.ODS,\n odp: MIME.ODP,\n doc: MIME.DOC,\n xls: MIME.XLS,\n ppt: MIME.PPT,\n txt: MIME.TXT,\n md: MIME.MD,\n csv: MIME.CSV,\n html: MIME.HTML,\n json: MIME.JSON,\n rtf: 'application/rtf',\n png: MIME.PNG,\n jpg: MIME.JPEG,\n jpeg: MIME.JPEG,\n webp: MIME.WEBP,\n tiff: MIME.TIFF,\n avif: MIME.AVIF,\n wav: MIME.WAV,\n mp3: MIME.MP3,\n}\n\n/**\n * Replace (or add) a filename's extension.\n *\n * @param filename - The original filename.\n * @param ext - The new extension, without the dot.\n * @returns The filename with the new extension.\n */\nexport const replaceExtension = (filename: string, ext: string): string => {\n const dot = filename.lastIndexOf('.')\n const base = dot > 0 ? filename.slice(0, dot) : filename\n return `${base}.${ext}`\n}\n","/**\n * Pure text-shaped step implementations: chunking, plain-text extraction, text diff/patch,\n * and the text-mode redact/update_text paths.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. The split functions are ported\n * verbatim from the source server's `chunk_text` adapter (its green unit suite ports with\n * them). All implementations here operate on in-memory bytes and run in any environment.\n */\n\nimport { argOf } from '../runtime'\nimport { E_MEDIA_STEP_FAILED } from '../exceptions'\nimport { familyOf, replaceExtension, MIME } from '../formats'\nimport type { StepImpl, StepPayload } from '../runtime'\nimport type { RegExpRef, MediaRef, MediaArgScalar } from '../plan'\n\n/** One text chunk with its position in the source. */\nexport interface Chunk {\n index: number\n text: string\n char_start: number\n char_end: number\n}\n\n/** Split text on double-newline paragraph boundaries, with optional character overlap. */\nexport const splitParagraph = (text: string, overlap: number): Chunk[] => {\n const blocks = text\n .split(/\\n{2,}/)\n .map((b) => b.trim())\n .filter(Boolean)\n const chunks: Chunk[] = []\n let pos = 0\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i]\n const overlapText =\n i > 0 && overlap > 0\n ? blocks\n .slice(Math.max(0, i - 1), i)\n .join('\\n\\n')\n .slice(-overlap)\n : ''\n const chunkText = overlapText ? `${overlapText}\\n\\n${block}` : block\n chunks.push({ index: i, text: chunkText, char_start: pos, char_end: pos + block.length })\n pos += block.length + 2\n }\n return chunks\n}\n\n/** Split text on sentence-ending punctuation, with optional character overlap. */\nexport const splitSentence = (text: string, overlap: number): Chunk[] => {\n const sentences = text.match(/[^.!?]+[.!?](?:\\s|$)|[^.!?]+$/g) ?? [text]\n const chunks: Chunk[] = []\n let pos = 0\n for (let i = 0; i < sentences.length; i++) {\n const sentence = sentences[i].trim()\n if (!sentence) continue\n const overlapText =\n i > 0 && overlap > 0\n ? sentences\n .slice(Math.max(0, i - 1), i)\n .join(' ')\n .slice(-overlap)\n : ''\n const chunkText = overlapText ? `${overlapText} ${sentence}` : sentence\n chunks.push({\n index: chunks.length,\n text: chunkText,\n char_start: pos,\n char_end: pos + sentence.length,\n })\n pos += sentence.length + 1\n }\n return chunks\n}\n\n/** Split text into fixed-size character windows with optional overlap. */\nexport const splitFixed = (text: string, chunkSize: number, overlap: number): Chunk[] => {\n const chunks: Chunk[] = []\n const step = Math.max(1, chunkSize - overlap)\n let i = 0\n let idx = 0\n while (i < text.length) {\n const start = Math.max(0, i - overlap)\n const end = i + chunkSize\n chunks.push({\n index: idx++,\n text: text.slice(start, end),\n char_start: start,\n char_end: Math.min(end, text.length),\n })\n i += step\n }\n return chunks\n}\n\nconst decoder = new TextDecoder('utf-8', { fatal: false })\nconst encoder = new TextEncoder()\n\n/** Decode payload bytes as UTF-8 text (UTF-16 BOM aware). */\nexport const decodeText = (bytes: Uint8Array): string => {\n if (bytes.length >= 2) {\n if (bytes[0] === 0xff && bytes[1] === 0xfe) {\n return new TextDecoder('utf-16le').decode(bytes.subarray(2))\n }\n if (bytes[0] === 0xfe && bytes[1] === 0xff) {\n return new TextDecoder('utf-16be').decode(bytes.subarray(2))\n }\n }\n return decoder.decode(bytes).replace(/\\r\\n?/g, '\\n')\n}\n\nconst textPayload = (source: StepPayload, text: string, suffix: string): StepPayload => ({\n bytes: encoder.encode(text),\n mimeType: MIME.TXT,\n filename: replaceExtension(source.filename, suffix),\n})\n\n// ── step implementations ─────────────────────────────────────────────────────\n\n/** `chunk` — split text content into retrieval chunks (data result). */\nexport const chunkStep: StepImpl = async (ctx) => {\n const by = argOf<string>(ctx.step, 'by') ?? 'paragraph'\n const size = argOf<number>(ctx.step, 'size') ?? 1000\n const overlap = argOf<number>(ctx.step, 'overlap') ?? 0\n const text = decodeText(ctx.payload.bytes)\n const chunks =\n by === 'sentence'\n ? splitSentence(text, overlap)\n : by === 'fixed'\n ? splitFixed(text, size, overlap)\n : splitParagraph(text, overlap)\n return { kind: 'data', data: chunks, asText: JSON.stringify(chunks) }\n}\n\n/**\n * `extract.text` — Phase 0 covers the native-text path (txt/md/csv/json/html). Document\n * formats (pdf/docx/…) and OCR routes are added by later phases; until then they fail with a\n * clear reason.\n */\nexport const extractTextStep: StepImpl = async (ctx) => {\n const family = familyOf(ctx.payload.mimeType)\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n const isNativeText =\n mime.startsWith('text/') || mime === MIME.JSON || mime === MIME.MD || mime === MIME.CSV\n if (!isNativeText) {\n throw new E_MEDIA_STEP_FAILED([\n 'extract.text',\n `extraction for ${family} media (${mime}) is not yet implemented in this build`,\n ])\n }\n const text = decodeText(ctx.payload.bytes)\n return {\n kind: 'data',\n data: text,\n asText: text,\n }\n}\n\n/** `extract.metadata` — Phase 0: size/MIME/filename basics (format-aware fields come later). */\nexport const extractMetadataStep: StepImpl = async (ctx) => {\n const meta = {\n filename: ctx.payload.filename,\n mime_type: ctx.payload.mimeType,\n size_bytes: ctx.payload.bytes.byteLength,\n family: familyOf(ctx.payload.mimeType),\n }\n return { kind: 'data', data: meta, asText: JSON.stringify(meta) }\n}\n\nconst toPattern = (value: MediaArgScalar): RegExp | string => {\n if (typeof value === 'string') return value\n const ref = value as RegExpRef\n return new RegExp(ref.source, ref.flags.includes('g') ? ref.flags : `${ref.flags}g`)\n}\n\nconst applyRedaction = (text: string, patterns: MediaArgScalar[], replacement: string): string => {\n let out = text\n for (const p of patterns) {\n const pattern = toPattern(p)\n out =\n typeof pattern === 'string'\n ? out.split(pattern).join(replacement)\n : out.replace(pattern, replacement)\n }\n return out\n}\n\n/** `redact` — Phase 0: the text-media path. Document-format in-place redaction lands later. */\nexport const redactStep: StepImpl = async (ctx) => {\n const mime = ctx.payload.mimeType.toLowerCase()\n if (!mime.startsWith('text/')) {\n throw new E_MEDIA_STEP_FAILED([\n 'redact',\n `redaction for ${ctx.payload.mimeType} is not yet implemented in this build`,\n ])\n }\n const raw = ctx.step.args.match\n const patterns = (Array.isArray(raw) ? raw : [raw]) as MediaArgScalar[]\n const replacement = argOf<string>(ctx.step, 'replace') ?? '█'\n const text = applyRedaction(decodeText(ctx.payload.bytes), patterns, replacement)\n return { kind: 'media', payload: textPayload(ctx.payload, text, 'txt') }\n}\n\n/** `update_text` — Phase 0: the text-media path. */\nexport const updateTextStep: StepImpl = async (ctx) => {\n const mime = ctx.payload.mimeType.toLowerCase()\n if (!mime.startsWith('text/')) {\n throw new E_MEDIA_STEP_FAILED([\n 'update_text',\n `text update for ${ctx.payload.mimeType} is not yet implemented in this build`,\n ])\n }\n const anchor = argOf<string>(ctx.step, 'anchor') as string\n const replace = argOf<string>(ctx.step, 'replace') ?? ''\n const text = decodeText(ctx.payload.bytes)\n if (!text.includes(anchor)) {\n throw new E_MEDIA_STEP_FAILED([\n 'update_text',\n `anchor text not found: \"${anchor.slice(0, 80)}\"`,\n ])\n }\n const updated = text.replace(anchor, replace)\n return { kind: 'media', payload: { ...ctx.payload, bytes: encoder.encode(updated) } }\n}\n\n/** Build a unified diff between two texts using the `diff` peer (lazy import). */\nconst unifiedDiff = async (aName: string, bName: string, a: string, b: string): Promise<string> => {\n const mod = await import('diff')\n return mod.createTwoFilesPatch(aName, bName, a, b)\n}\n\n/** `diff` — compare against another media (text-comparable formats in Phase 0). */\nexport const diffStep: StepImpl = async (ctx) => {\n const ref = ctx.step.args.with as MediaRef\n if (ref.kind !== 'id') {\n throw new E_MEDIA_STEP_FAILED(['diff', 'builder refs are not yet supported here'])\n }\n const other = await ctx.resolveRef(ref.id)\n const a = decodeText(ctx.payload.bytes)\n const b = decodeText(other.bytes)\n const patch = await unifiedDiff(ctx.payload.filename, other.filename, a, b)\n const mod = await import('diff')\n const structured = mod.diffLines(a, b).map((part) => ({\n added: part.added === true,\n removed: part.removed === true,\n count: part.count ?? 0,\n value: part.value,\n }))\n const data = { patch, changes: structured }\n return { kind: 'data', data, asText: patch }\n}\n\n/** `apply_patch` — apply a unified diff to the media text. */\nexport const applyPatchStep: StepImpl = async (ctx) => {\n const patch = argOf<string>(ctx.step, 'patch') as string\n const text = decodeText(ctx.payload.bytes)\n const mod = await import('diff')\n const result = mod.applyPatch(text, patch)\n if (result === false) {\n throw new E_MEDIA_STEP_FAILED([\n 'apply_patch',\n 'the patch does not apply to this media content (context mismatch)',\n ])\n }\n return { kind: 'media', payload: { ...ctx.payload, bytes: encoder.encode(result) } }\n}\n","/**\n * Doc-domain step extensions: format-preserving text mutation for DOCX/PPTX, asset\n * extraction from OOXML/ODF archives and PDFs, and format conversion via the convert engine.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. Ported from the source server's\n * doc adapters; the format-dispatch contract follows the server's green e2e suite: DOCX and\n * PPTX redact/sanitize/normalize/update_text mutate text in place inside the container\n * (preserving the source format); text-like inputs mutate as text; PDF redact falls back to\n * text extraction (the server's PDF \"visual annotation\" path is content-stream-preserving and\n * out of scope here — the failure message says exactly that).\n */\n\nimport { MIME } from '../formats'\nimport { argOf } from '../runtime'\nimport { isError } from '@nhtio/adk/guards'\nimport { E_MEDIA_STEP_FAILED } from '../exceptions'\nimport { redactStep as textRedactStep, updateTextStep as textUpdateTextStep } from './text'\nimport type { default as JSZipNS } from 'jszip'\nimport type { RegExpRef, MediaArgScalar } from '../plan'\nimport type { StepImpl, StepContext, StepResult, StepPayload } from '../runtime'\n\ntype JSZipModule = typeof JSZipNS\n\nlet zipPromise: Promise<JSZipModule> | undefined\nconst jszip = (): Promise<JSZipModule> => {\n zipPromise ??= import('jszip').then((m) => ('default' in m ? m.default : m) as JSZipModule)\n return zipPromise\n}\n\nconst fail = (verb: string, message: string): never => {\n throw new E_MEDIA_STEP_FAILED([verb, message])\n}\n\nconst escapeXml = (value: string): string =>\n value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n\nconst unescapeXml = (value: string): string =>\n value\n .replace(/&apos;/g, \"'\")\n .replace(/&quot;/g, '\"')\n .replace(/&gt;/g, '>')\n .replace(/&lt;/g, '<')\n .replace(/&amp;/g, '&')\n\n// ── OOXML text mutation (ported run-aggregation semantics) ───────────────────\n\n/**\n * Replace matches inside text nodes of OOXML, aggregating runs per paragraph so patterns\n * spanning split runs still match (Word splits text across `w:t` runs on formatting changes).\n */\nconst replaceInOoxml = (\n xml: string,\n paragraphTag: 'w:p' | 'a:p',\n textTag: 'w:t' | 'a:t',\n pattern: RegExp,\n replacement: string\n): { xml: string; matchCount: number } => {\n let totalMatches = 0\n const pRegex = new RegExp(`<${paragraphTag}\\\\b[^>]*>[\\\\s\\\\S]*?</${paragraphTag}>`, 'g')\n const result = xml.replace(pRegex, (pXml) => {\n const tElements: Array<{ start: number; end: number; content: string }> = []\n const tRegex = new RegExp(`<${textTag}(?:\\\\s[^>]*)?>([^<]*)</${textTag}>`, 'g')\n let tMatch: RegExpExecArray | null\n while ((tMatch = tRegex.exec(pXml))) {\n tElements.push({\n start: tMatch.index,\n end: tMatch.index + tMatch[0].length,\n content: unescapeXml(tMatch[1]),\n })\n }\n if (tElements.length === 0) return pXml\n const aggregated = tElements.map((t) => t.content).join('')\n const p = new RegExp(pattern.source, pattern.flags)\n const replaced = aggregated.replace(p, replacement)\n if (replaced === aggregated) return pXml\n const counter = new RegExp(pattern.source, pattern.flags)\n while (counter.exec(aggregated)) {\n totalMatches += 1\n if (!counter.global) break\n }\n let out = pXml\n for (let i = tElements.length - 1; i >= 0; i--) {\n const el = tElements[i]\n const space = textTag === 'w:t' && i === 0 ? ' xml:space=\"preserve\"' : ''\n const content = i === 0 ? escapeXml(replaced) : ''\n out =\n out.slice(0, el.start) + `<${textTag}${space}>${content}</${textTag}>` + out.slice(el.end)\n }\n return out\n })\n return { xml: result, matchCount: totalMatches }\n}\n\n/** Map text-node mutation over every relevant part of a DOCX or PPTX archive. */\nconst mutateOoxmlText = async (\n ctx: StepContext,\n verb: string,\n mutateXml: (xml: string, kind: 'docx' | 'pptx') => string\n): Promise<StepResult> => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n const kind = mime === MIME.DOCX ? 'docx' : 'pptx'\n const JSZip = await jszip()\n let zip: JSZipNS\n try {\n zip = await JSZip.loadAsync(ctx.payload.bytes)\n } catch (err) {\n const detail = isError(err) ? err.message : String(err)\n fail(verb, `could not open the document container: ${detail}`)\n /* unreachable */ throw err\n }\n const parts =\n kind === 'docx'\n ? Object.keys(zip.files).filter((n) => /^word\\/(document|header\\d*|footer\\d*)\\.xml$/.test(n))\n : Object.keys(zip.files).filter((n) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(n))\n if (parts.length === 0) fail(verb, 'the container has no text parts to mutate (corrupt file?)')\n for (const part of parts) {\n const xml = await zip.file(part)!.async('text')\n const next = mutateXml(xml, kind)\n if (next !== xml) zip.file(part, next)\n }\n const bytes = await zip.generateAsync({ type: 'uint8array', compression: 'DEFLATE' })\n return { kind: 'media', payload: { ...ctx.payload, bytes } }\n}\n\nconst toGlobalRegex = (value: MediaArgScalar): RegExp => {\n if (typeof value === 'string') {\n const escaped = value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n return new RegExp(escaped, 'g')\n }\n const ref = value as RegExpRef\n return new RegExp(ref.source, ref.flags.includes('g') ? ref.flags : `${ref.flags}g`)\n}\n\n// ── doc-aware step dispatch ──────────────────────────────────────────────────\n\n/** `redact` — format dispatch: text media → text path; DOCX/PPTX → in-place container edit. */\nexport const docRedactStep: StepImpl = async (ctx) => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n if (mime.startsWith('text/')) return textRedactStep(ctx)\n if (mime === MIME.DOCX || mime === MIME.PPTX) {\n const raw = ctx.step.args.match\n const patterns = (Array.isArray(raw) ? raw : [raw]) as MediaArgScalar[]\n const replacement = argOf<string>(ctx.step, 'replace') ?? '█'\n return mutateOoxmlText(ctx, 'redact', (xml, kind) => {\n let out = xml\n for (const p of patterns) {\n out = replaceInOoxml(\n out,\n kind === 'docx' ? 'w:p' : 'a:p',\n kind === 'docx' ? 'w:t' : 'a:t',\n toGlobalRegex(p),\n replacement\n ).xml\n }\n return out\n })\n }\n fail(\n 'redact',\n `redaction for ${mime} is not supported in this build (text, DOCX, and PPTX are). For PDF, extract the text first: extract text | redact …`\n )\n /* unreachable */ throw new Error('unreachable')\n}\n\nconst BLOCKED_CONTROL = (code: number): boolean =>\n (code >= 0 && code <= 8) ||\n code === 11 ||\n code === 12 ||\n (code >= 14 && code <= 31) ||\n code === 127\n\nconst stripControlChars = (text: string): string => {\n let out = ''\n for (const ch of text) {\n if (BLOCKED_CONTROL(ch.charCodeAt(0))) continue\n out += ch\n }\n return out\n}\n\nconst sanitizeTextNodes = (xml: string, textTag: 'w:t' | 'a:t'): string =>\n xml.replace(\n new RegExp(`<${textTag}(?:\\\\s[^>]*)?>([^<]*)</${textTag}>`, 'g'),\n (full, content: string) => {\n const cleaned = stripControlChars(unescapeXml(content))\n if (cleaned === unescapeXml(content)) return full\n return full.replace(content, escapeXml(cleaned))\n }\n )\n\n/** `sanitize` — strip blocked control characters from text nodes / text media. */\nexport const docSanitizeStep: StepImpl = async (ctx) => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n if (mime.startsWith('text/')) {\n const text = new TextDecoder().decode(ctx.payload.bytes)\n const cleaned = stripControlChars(text)\n return { kind: 'media', payload: { ...ctx.payload, bytes: new TextEncoder().encode(cleaned) } }\n }\n if (mime === MIME.DOCX || mime === MIME.PPTX) {\n return mutateOoxmlText(ctx, 'sanitize', (xml, kind) =>\n sanitizeTextNodes(xml, kind === 'docx' ? 'w:t' : 'a:t')\n )\n }\n fail('sanitize', `sanitize for ${mime} is not supported in this build (text, DOCX, PPTX are)`)\n /* unreachable */ throw new Error('unreachable')\n}\n\nconst normalizeText = (text: string): string =>\n text\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\r/g, '\\n')\n .replace(/[\\t ]+$/gm, '')\n\n/** `normalize` — CRLF→LF + trailing-whitespace removal in text nodes / text media. */\nexport const docNormalizeStep: StepImpl = async (ctx) => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n if (mime.startsWith('text/')) {\n const text = new TextDecoder().decode(ctx.payload.bytes)\n return {\n kind: 'media',\n payload: { ...ctx.payload, bytes: new TextEncoder().encode(normalizeText(text)) },\n }\n }\n if (mime === MIME.DOCX || mime === MIME.PPTX) {\n return mutateOoxmlText(ctx, 'normalize', (xml, kind) => {\n const tag = kind === 'docx' ? 'w:t' : 'a:t'\n return xml.replace(\n new RegExp(`<${tag}(?:\\\\s[^>]*)?>([^<]*)</${tag}>`, 'g'),\n (full, content: string) => {\n const normalized = normalizeText(unescapeXml(content))\n if (normalized === unescapeXml(content)) return full\n return full.replace(content, escapeXml(normalized))\n }\n )\n })\n }\n fail('normalize', `normalize for ${mime} is not supported in this build (text, DOCX, PPTX are)`)\n /* unreachable */ throw new Error('unreachable')\n}\n\n/** `update_text` — anchor replacement; DOCX/PPTX in-place, TARGET_NOT_FOUND when absent. */\nexport const docUpdateTextStep: StepImpl = async (ctx) => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n if (mime.startsWith('text/')) return textUpdateTextStep(ctx)\n if (mime === MIME.DOCX || mime === MIME.PPTX) {\n const anchor = argOf<string>(ctx.step, 'anchor') as string\n const replace = argOf<string>(ctx.step, 'replace') ?? ''\n let found = 0\n const result = await mutateOoxmlText(ctx, 'update_text', (xml, kind) => {\n if (found > 0) return xml\n const escaped = anchor.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const { xml: next, matchCount } = replaceInOoxml(\n xml,\n kind === 'docx' ? 'w:p' : 'a:p',\n kind === 'docx' ? 'w:t' : 'a:t',\n new RegExp(escaped),\n replace\n )\n found += matchCount\n return next\n })\n if (found === 0) {\n fail('update_text', `anchor text not found: \"${anchor.slice(0, 80)}\"`)\n }\n return result\n }\n fail(\n 'update_text',\n `text update for ${mime} is not supported (text, DOCX, PPTX are; PDF text is not reliably editable)`\n )\n /* unreachable */ throw new Error('unreachable')\n}\n\n// ── extract.assets ───────────────────────────────────────────────────────────\n\nconst ASSET_PATTERNS: Record<string, RegExp> = {\n image: /\\.(png|jpe?g|gif|bmp|tiff?|emf|wmf|svg|webp)$/i,\n font: /\\.(ttf|otf|woff2?|odttf)$/i,\n attachment: /\\.(bin|ole|docx?|xlsx?|pptx?|pdf|txt|csv)$/i,\n}\n\nconst EXT_MIME: Record<string, string> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n bmp: 'image/bmp',\n tif: 'image/tiff',\n tiff: 'image/tiff',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n emf: 'image/emf',\n wmf: 'image/wmf',\n ttf: 'font/ttf',\n otf: 'font/otf',\n woff: 'font/woff',\n woff2: 'font/woff2',\n}\n\n/**\n * `extract.assets` — enumerate embedded assets. OOXML/ODF archives are walked natively\n * (cross-env); PDF inputs use the pdfImages engine.\n */\nexport const extractAssetsStep: StepImpl = async (ctx) => {\n const verb = 'extract assets'\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n const requested = (ctx.step.args.types as string[] | undefined) ?? ['all']\n const wantAll = requested.includes('all')\n const want = (kind: string): boolean => wantAll || requested.includes(kind)\n\n if (mime === MIME.PDF) {\n if (!want('image')) {\n fail(verb, 'PDF asset extraction currently supports images (types=image or all)')\n }\n if (!ctx.engines.hasConvert(mime, 'images')) {\n fail(\n verb,\n 'PDF asset extraction requires an engine that converts application/pdf to \"images\", and none is configured. Do not retry this verb on PDFs in this deployment.'\n )\n }\n const format = argOf<string>(ctx.step, 'format')\n const result = await ctx.engines.convert({\n bytes: ctx.payload.bytes,\n mimeType: mime,\n filename: ctx.payload.filename,\n to: 'images',\n options: format ? { format } : undefined,\n signal: ctx.signal,\n })\n if (result.outputs.length === 0) fail(verb, 'no embedded images were found in the PDF')\n const wantedMime = format ? (EXT_MIME[format] ?? `image/${format}`) : undefined\n const payloads: StepPayload[] = []\n for (const [i, img] of result.outputs.entries()) {\n let bytes = img.bytes\n let mimeType = img.mimeType\n // Two-tier encoding: outputs already in the requested format pass through (native\n // collapse); the rest re-encode via an ordinary registry dispatch.\n if (wantedMime && mimeType.toLowerCase() !== wantedMime) {\n const reencoded = await ctx.engines.mutate({\n bytes,\n mimeType,\n format: { to: format! },\n signal: ctx.signal,\n })\n bytes = reencoded.bytes\n mimeType = reencoded.mimeType\n }\n payloads.push({\n bytes,\n mimeType,\n filename: `asset-${i + 1}.${mimeType.split('/')[1]?.replace('jpeg', 'jpg') ?? 'bin'}`,\n })\n }\n return { kind: 'media-list', payloads }\n }\n\n // Archive formats: OOXML + ODF are zip containers.\n const isArchive = [MIME.DOCX, MIME.XLSX, MIME.PPTX, MIME.ODT, MIME.ODS, MIME.ODP].includes(\n mime as never\n )\n if (!isArchive) {\n fail(verb, `asset extraction for ${mime} is not supported (OOXML/ODF archives and PDF are)`)\n }\n const JSZip = await jszip()\n const zip = await JSZip.loadAsync(ctx.payload.bytes)\n const payloads: StepPayload[] = []\n for (const [name, entry] of Object.entries(zip.files)) {\n if (entry.dir) continue\n const basename = name.split('/').pop() ?? name\n const matchKind = Object.entries(ASSET_PATTERNS).find(([, re]) => re.test(basename))?.[0]\n if (!matchKind || !want(matchKind)) continue\n // Only media/embeddings/fonts directories carry real assets in these containers.\n if (!/(^|\\/)(media|embeddings|fonts|Pictures|ObjectReplacements)\\//i.test(name)) continue\n const ext = basename.split('.').pop()?.toLowerCase() ?? 'bin'\n payloads.push({\n bytes: await entry.async('uint8array'),\n mimeType: EXT_MIME[ext] ?? 'application/octet-stream',\n filename: basename,\n })\n }\n if (payloads.length === 0) fail(verb, 'no embedded assets matched the requested types')\n return { kind: 'media-list', payloads }\n}\n\n// ── convert ──────────────────────────────────────────────────────────────────\n\n/** `convert` — dispatch through the engine registry (direct edge or computed path). */\nexport const convertStep: StepImpl = async (ctx) => {\n const verb = 'convert'\n const to = argOf<string>(ctx.step, 'to') as string\n const supported = ctx.engines.convertTargets(ctx.payload.mimeType)\n if (!supported.includes(to)) {\n fail(\n verb,\n `no configured engine (or computed path) can produce \"${to}\" from ${ctx.payload.mimeType}; reachable targets: ${supported.join(', ') || '(none)'}`\n )\n }\n const result = await ctx.engines.convert({\n bytes: ctx.payload.bytes,\n mimeType: ctx.payload.mimeType,\n filename: ctx.payload.filename,\n to,\n signal: ctx.signal,\n })\n const output = result.outputs[0]\n if (!output) fail(verb, 'the conversion produced no output')\n const dot = ctx.payload.filename.lastIndexOf('.')\n const base = dot > 0 ? ctx.payload.filename.slice(0, dot) : ctx.payload.filename\n return {\n kind: 'media',\n payload: { bytes: output!.bytes, mimeType: output!.mimeType, filename: `${base}.${to}` },\n }\n}\n\n/** The doc step registry fragment (overrides the Phase 0 text-only redact/update_text). */\nexport const DOC_STEPS: ReadonlyArray<[string, StepImpl]> = [\n ['redact', docRedactStep],\n ['sanitize', docSanitizeStep],\n ['normalize', docNormalizeStep],\n ['update_text', docUpdateTextStep],\n ['extract.assets', extractAssetsStep],\n ['convert', convertStep],\n]\n","/**\n * `sheet.*` step implementations: ExcelJS workbook mutations on in-memory bytes.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. Ported from the source server's\n * sheet adapters (its green e2e suite informs the spec coverage). All ten mutations operate on\n * xlsx natively via ExcelJS (optional peer, lazily imported); ODS and legacy-xls inputs are\n * normalized to xlsx first through the configured `sheetNormalize` engine, degrading to a\n * readable failure when none is configured. Output is always xlsx.\n */\n\nimport { argOf } from '../runtime'\nimport { isError } from '@nhtio/adk/guards'\nimport { E_MEDIA_STEP_FAILED } from '../exceptions'\nimport { MIME, replaceExtension, unsupportedForMutationReason } from '../formats'\nimport type { MediaArgJson } from '../plan'\nimport type { default as ExcelJSNS } from 'exceljs'\nimport type { StepImpl, StepContext, StepPayload } from '../runtime'\n\ntype ExcelJSModule = typeof ExcelJSNS\n\nlet excelPromise: Promise<ExcelJSModule> | undefined\nconst excel = (): Promise<ExcelJSModule> => {\n excelPromise ??= import('exceljs').then((m) => ('default' in m ? m.default : m) as ExcelJSModule)\n return excelPromise\n}\n\nconst fail = (verb: string, message: string): never => {\n throw new E_MEDIA_STEP_FAILED([verb, message])\n}\n\n/** Acquire xlsx bytes for the step, converting ODS/xls to xlsx via the engine registry. */\nconst acquireXlsx = async (ctx: StepContext, verb: string): Promise<Uint8Array> => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n if (mime === MIME.XLSX) return ctx.payload.bytes\n const mutationBlock = unsupportedForMutationReason(mime)\n if (mime === MIME.ODS || mime === MIME.XLS) {\n if (!ctx.engines.hasConvert(mime, 'xlsx')) {\n fail(\n verb,\n `this input is ${mime} — an engine that converts it to xlsx is required first, and none is configured. Do not retry this verb on this media in this deployment.`\n )\n }\n const result = await ctx.engines.convert({\n bytes: ctx.payload.bytes,\n mimeType: mime,\n filename: ctx.payload.filename,\n to: 'xlsx',\n signal: ctx.signal,\n })\n const output = result.outputs[0]\n if (!output) fail(verb, 'normalizing the workbook to xlsx produced no output')\n return output!.bytes\n }\n if (mutationBlock) fail(verb, mutationBlock)\n fail(verb, `sheet operations expect a spreadsheet; the media is ${mime}`)\n /* unreachable */ throw new Error('unreachable')\n}\n\ninterface MutationSummary {\n added?: number\n removed?: number\n modified?: number\n warnings?: string[]\n}\n\n/** The shared open → mutate → write-back lifecycle every sheet verb uses. */\nconst withWorkbook = async (\n ctx: StepContext,\n verb: string,\n mutate: (wb: ExcelJSNS.Workbook) => MutationSummary | Promise<MutationSummary>\n): Promise<{ kind: 'media'; payload: StepPayload }> => {\n const xlsxBytes = await acquireXlsx(ctx, verb)\n const ExcelJS = await excel()\n const wb = new ExcelJS.Workbook()\n try {\n await wb.xlsx.load(\n xlsxBytes.buffer.slice(\n xlsxBytes.byteOffset,\n xlsxBytes.byteOffset + xlsxBytes.byteLength\n ) as ArrayBuffer\n )\n } catch (err) {\n const detail = isError(err) ? err.message : String(err)\n fail(verb, `could not open the spreadsheet: ${detail}`)\n }\n await mutate(wb)\n const out = new Uint8Array(await wb.xlsx.writeBuffer())\n return {\n kind: 'media',\n payload: {\n bytes: out,\n mimeType: MIME.XLSX,\n filename: replaceExtension(ctx.payload.filename, 'xlsx'),\n },\n }\n}\n\n/** Resolve the target worksheet from the frozen `sheet=` rule (bare number=index, string=name). */\nconst resolveSheet = (\n verb: string,\n wb: ExcelJSNS.Workbook,\n sheetArg: string | number | undefined\n): ExcelJSNS.Worksheet => {\n if (sheetArg === undefined) {\n const first = wb.worksheets[0]\n if (!first) fail(verb, 'the workbook has no worksheets')\n return first\n }\n // Frozen 0.11: bare number targets by 1-based index; quoted string targets by name.\n if (typeof sheetArg === 'number') {\n const byIndex = wb.worksheets[sheetArg - 1]\n if (byIndex) return byIndex\n const byName = wb.getWorksheet(String(sheetArg))\n if (byName) {\n fail(\n verb,\n `no sheet at index ${sheetArg}, but a sheet NAMED \"${sheetArg}\" exists — quote it: sheet=\"${sheetArg}\"`\n )\n }\n fail(\n verb,\n `sheet index ${sheetArg} is out of range (1-based; the workbook has ${wb.worksheets.length})`\n )\n }\n const ws = wb.getWorksheet(sheetArg as string)\n if (!ws) {\n const names = wb.worksheets.map((w) => `\"${w.name}\"`).join(', ')\n fail(verb, `no sheet named \"${sheetArg}\". Sheets: ${names}`)\n }\n return ws!\n}\n\nconst columnLetterToNumber = (col: string): number => {\n let n = 0\n for (const ch of col.toUpperCase()) n = n * 26 + (ch.charCodeAt(0) - 64)\n return n\n}\n\ntype CellValue = string | number | boolean | null\n\nconst asCellValue = (verb: string, value: unknown): ExcelJSNS.CellValue => {\n if (value === null) return null\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value\n }\n fail(verb, `cell values must be string, number, boolean, or null; got ${typeof value}`)\n /* unreachable */ throw new Error('unreachable')\n}\n\n// ── step implementations ─────────────────────────────────────────────────────\n\n/** `sheet.add_rows` — insert rows before/after an index, or append. */\nexport const sheetAddRowsStep: StepImpl = async (ctx) => {\n const verb = 'sheet add_rows'\n const rows = ctx.step.args.rows as MediaArgJson\n if (!Array.isArray(rows) || rows.length === 0 || !rows.every(Array.isArray)) {\n fail(verb, `rows must be a non-empty JSON array of arrays, e.g. rows='[[\"a\",1]]'`)\n }\n const before = argOf<number>(ctx.step, 'before')\n const after = argOf<number>(ctx.step, 'after')\n return withWorkbook(ctx, verb, (wb) => {\n const ws = resolveSheet(verb, wb, argOf<string | number>(ctx.step, 'sheet'))\n const insertAt =\n before !== undefined ? before : after !== undefined ? after + 1 : ws.rowCount + 1\n const cellRows = (rows as unknown[][]).map((r) => r.map((v) => asCellValue(verb, v)))\n ws.spliceRows(insertAt, 0, ...cellRows)\n return { added: cellRows.length }\n })\n}\n\n/** `sheet.add_columns` — insert columns with headers or full descriptors. */\nexport const sheetAddColumnsStep: StepImpl = async (ctx) => {\n const verb = 'sheet add_columns'\n const headers = ctx.step.args.headers as string[] | undefined\n const columnsJson = ctx.step.args.columns as MediaArgJson | undefined\n const columns: Array<{ header: string; values?: CellValue[] }> | undefined =\n (columnsJson as Array<{ header: string; values?: CellValue[] }> | undefined) ??\n headers?.map((header) => ({ header }) as { header: string; values?: CellValue[] })\n if (!Array.isArray(columns) || columns.length === 0) {\n fail(verb, `provide headers=a,b or columns='[{\"header\":\"X\",\"values\":[1]}]'`)\n }\n const before = argOf<number>(ctx.step, 'before')\n const after = argOf<number>(ctx.step, 'after')\n return withWorkbook(ctx, verb, (wb) => {\n const ws = resolveSheet(verb, wb, argOf<string | number>(ctx.step, 'sheet'))\n const insertAt =\n before !== undefined ? before : after !== undefined ? after + 1 : ws.columnCount + 1\n for (const [i, col] of columns!.entries()) {\n if (typeof col?.header !== 'string') fail(verb, 'every column needs a string header')\n ws.spliceColumns(insertAt + i, 0, [\n col.header,\n ...(col.values ?? []).map((v) => asCellValue(verb, v)),\n ])\n }\n return { added: columns!.length }\n })\n}\n\n/** `sheet.update_cells` — set cells by A1 address or row/col. Leading `=` writes a formula. */\nexport const sheetUpdateCellsStep: StepImpl = async (ctx) => {\n const verb = 'sheet update_cells'\n const updates = ctx.step.args.updates as MediaArgJson\n if (!Array.isArray(updates) || updates.length === 0) {\n fail(\n verb,\n `updates must be a non-empty JSON array, e.g. updates='[{\"address\":\"B2\",\"value\":3}]'`\n )\n }\n return withWorkbook(ctx, verb, (wb) => {\n const ws = resolveSheet(verb, wb, argOf<string | number>(ctx.step, 'sheet'))\n let modified = 0\n for (const raw of updates as Array<Record<string, unknown>>) {\n const address = raw.address as string | undefined\n const row = raw.row as number | undefined\n const col = raw.col as number | string | undefined\n let cell: ExcelJSNS.Cell\n if (address) {\n cell = ws.getCell(address)\n } else if (row !== undefined && col !== undefined) {\n cell =\n typeof col === 'string'\n ? ws.getCell(row, columnLetterToNumber(col))\n : ws.getCell(row, col)\n } else {\n fail(verb, 'each update needs address, or both row and col')\n continue\n }\n const value = raw.value\n if (typeof value === 'string' && value.startsWith('=')) {\n cell.value = { formula: value.slice(1) } as ExcelJSNS.CellValue\n } else {\n cell.value = asCellValue(verb, value)\n }\n modified += 1\n }\n return { modified }\n })\n}\n\n/** `sheet.delete_rows` — delete 1-based rows (bottom-up so indices stay valid). */\nexport const sheetDeleteRowsStep: StepImpl = async (ctx) => {\n const verb = 'sheet delete_rows'\n const rows = ctx.step.args.rows as number[]\n return withWorkbook(ctx, verb, (wb) => {\n const ws = resolveSheet(verb, wb, argOf<string | number>(ctx.step, 'sheet'))\n for (const r of [...rows].sort((a, b) => b - a)) ws.spliceRows(r, 1)\n return { removed: rows.length }\n })\n}\n\n/** `sheet.delete_columns` — delete 1-based columns. */\nexport const sheetDeleteColumnsStep: StepImpl = async (ctx) => {\n const verb = 'sheet delete_columns'\n const columns = ctx.step.args.columns as number[]\n return withWorkbook(ctx, verb, (wb) => {\n const ws = resolveSheet(verb, wb, argOf<string | number>(ctx.step, 'sheet'))\n for (const c of [...columns].sort((a, b) => b - a)) ws.spliceColumns(c, 1)\n return { removed: columns.length }\n })\n}\n\n/** `sheet.rename_sheet` — rename by NAME (the server contract; index targeting is rejected). */\nexport const sheetRenameSheetStep: StepImpl = async (ctx) => {\n const verb = 'sheet rename_sheet'\n const sheet = argOf<string | number>(ctx.step, 'sheet') as string\n const to = argOf<string>(ctx.step, 'to') as string\n return withWorkbook(ctx, verb, (wb) => {\n const ws = wb.getWorksheet(sheet)\n if (!ws) {\n const names = wb.worksheets.map((w) => `\"${w.name}\"`).join(', ')\n fail(verb, `rename targets a sheet NAME; no sheet named \"${sheet}\". Sheets: ${names}`)\n }\n ws!.name = to\n return { modified: 1 }\n })\n}\n\n/** `sheet.add_sheet` — add a worksheet, optionally at a 1-based position. */\nexport const sheetAddSheetStep: StepImpl = async (ctx) => {\n const verb = 'sheet add_sheet'\n const name = argOf<string>(ctx.step, 'name') as string\n const at = argOf<number>(ctx.step, 'at')\n return withWorkbook(ctx, verb, (wb) => {\n if (wb.getWorksheet(name)) fail(verb, `a sheet named \"${name}\" already exists`)\n const ws = wb.addWorksheet(name)\n if (at !== undefined) {\n const all = wb.worksheets\n const wsIdx = all.indexOf(ws)\n if (wsIdx !== at - 1) {\n all.forEach((w, i) => {\n ;(w as unknown as { orderNo: number }).orderNo =\n w === ws ? at : i + 1 >= at && i < wsIdx ? i + 2 : i + 1\n })\n }\n }\n return { added: 1 }\n })\n}\n\n/** `sheet.remove_sheet` — remove by NAME (the server contract). */\nexport const sheetRemoveSheetStep: StepImpl = async (ctx) => {\n const verb = 'sheet remove_sheet'\n const sheet = argOf<string | number>(ctx.step, 'sheet') as string\n return withWorkbook(ctx, verb, (wb) => {\n const ws = wb.getWorksheet(sheet)\n if (!ws) {\n const names = wb.worksheets.map((w) => `\"${w.name}\"`).join(', ')\n fail(verb, `remove targets a sheet NAME; no sheet named \"${sheet}\". Sheets: ${names}`)\n }\n wb.removeWorksheet(ws!.id)\n return { removed: 1 }\n })\n}\n\n/** `sheet.reorder_sheets` — every sheet exactly once, by name or 1-based index. */\nexport const sheetReorderSheetsStep: StepImpl = async (ctx) => {\n const verb = 'sheet reorder_sheets'\n const order = ctx.step.args.order as MediaArgJson\n if (!Array.isArray(order) || order.length === 0) {\n fail(verb, `order must be a JSON array of names/indices, e.g. order='[\"Summary\",2]'`)\n }\n return withWorkbook(ctx, verb, (wb) => {\n const refs = order as Array<string | number>\n if (refs.length !== wb.worksheets.length) {\n fail(\n verb,\n `order must include every worksheet exactly once (the workbook has ${wb.worksheets.length})`\n )\n }\n const reordered: ExcelJSNS.Worksheet[] = []\n const seen = new Set<number>()\n for (const ref of refs) {\n const ws = typeof ref === 'number' ? wb.worksheets[ref - 1] : wb.getWorksheet(ref)\n if (!ws) fail(verb, `sheet not found: ${String(ref)}`)\n if (seen.has(ws!.id)) fail(verb, `duplicate sheet reference: ${String(ref)}`)\n seen.add(ws!.id)\n reordered.push(ws!)\n }\n // ExcelJS serializes by orderNo; the worksheets getter returns a sorted clone.\n reordered.forEach((ws, i) => {\n ;(ws as unknown as { orderNo: number }).orderNo = i + 1\n })\n return { modified: reordered.length }\n })\n}\n\n/** `sheet.transform_table` — rename/select/drop columns by header name. */\nexport const sheetTransformTableStep: StepImpl = async (ctx) => {\n const verb = 'sheet transform_table'\n const headerRow = argOf<number>(ctx.step, 'header_row') ?? 1\n const rename = ctx.step.args.rename as Array<{ from: string; to: string }> | undefined\n const select = ctx.step.args.select as string[] | undefined\n const drop = ctx.step.args.drop as string[] | undefined\n return withWorkbook(ctx, verb, (wb) => {\n const ws = resolveSheet(verb, wb, argOf<string | number>(ctx.step, 'sheet'))\n let modified = 0\n const headerMap = new Map<string, number>()\n ws.getRow(headerRow).eachCell({ includeEmpty: false }, (cell, colNumber) => {\n if (typeof cell.value === 'string') headerMap.set(cell.value, colNumber)\n })\n if (rename) {\n for (const { from, to } of rename) {\n const colNum = headerMap.get(from)\n if (colNum !== undefined) {\n ws.getRow(headerRow).getCell(colNum).value = to\n headerMap.delete(from)\n headerMap.set(to, colNum)\n modified += 1\n }\n }\n }\n if (drop) {\n const cols = drop\n .map((name) => headerMap.get(name))\n .filter((n): n is number => n !== undefined)\n .sort((a, b) => b - a)\n for (const col of cols) {\n ws.spliceColumns(col, 1)\n modified += 1\n }\n }\n if (select) {\n const keep = new Set(select)\n const cols: number[] = []\n ws.getRow(headerRow).eachCell({ includeEmpty: false }, (cell, colNumber) => {\n if (typeof cell.value === 'string' && !keep.has(cell.value)) cols.push(colNumber)\n })\n cols.sort((a, b) => b - a)\n for (const col of cols) {\n ws.spliceColumns(col, 1)\n modified += 1\n }\n }\n return { modified }\n })\n}\n\n/** The sheet step registry fragment, keyed by canonical verb id. */\nexport const SHEET_STEPS: ReadonlyArray<[string, StepImpl]> = [\n ['sheet.add_rows', sheetAddRowsStep],\n ['sheet.add_columns', sheetAddColumnsStep],\n ['sheet.update_cells', sheetUpdateCellsStep],\n ['sheet.delete_rows', sheetDeleteRowsStep],\n ['sheet.delete_columns', sheetDeleteColumnsStep],\n ['sheet.rename_sheet', sheetRenameSheetStep],\n ['sheet.add_sheet', sheetAddSheetStep],\n ['sheet.remove_sheet', sheetRemoveSheetStep],\n ['sheet.reorder_sheets', sheetReorderSheetsStep],\n ['sheet.transform_table', sheetTransformTableStep],\n]\n","/**\n * `slides.*` step implementations: native PPTX container mutation via JSZip + targeted XML\n * edits, on in-memory bytes.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. Ported from the source server's\n * slides adapters (regex-over-zip XML surgery — no XML parser dependency). PPTX is mutated\n * natively; ODP inputs are normalized to PPTX through the configured `convert` engine first,\n * degrading to a readable failure when none is configured. All implementations are\n * cross-environment (jszip operates on Uint8Array).\n */\n\nimport { argOf } from '../runtime'\nimport { isError } from '@nhtio/adk/guards'\nimport { E_MEDIA_STEP_FAILED } from '../exceptions'\nimport { MIME, replaceExtension, unsupportedForMutationReason } from '../formats'\nimport type { default as JSZipNS } from 'jszip'\nimport type { MediaRef, MediaArgJson } from '../plan'\nimport type { StepImpl, StepContext, StepPayload } from '../runtime'\n\ntype JSZipModule = typeof JSZipNS\n\nlet zipPromise: Promise<JSZipModule> | undefined\nconst jszip = (): Promise<JSZipModule> => {\n zipPromise ??= import('jszip').then((m) => ('default' in m ? m.default : m) as JSZipModule)\n return zipPromise\n}\n\nconst SLIDE_REL_TYPE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide'\n\nconst fail = (verb: string, message: string): never => {\n throw new E_MEDIA_STEP_FAILED([verb, message])\n}\n\n// ── XML helpers (ported verbatim semantics) ──────────────────────────────────\n\nconst escapeXml = (value: string): string =>\n value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n\nconst escapeRegex = (value: string): string => value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n/** Pure posix-style path resolution for zip entries (no node:path). */\nconst resolveZipPath = (basePart: string, relTarget: string): string => {\n const baseDir = basePart.split('/').slice(0, -1)\n const parts = [...baseDir, ...relTarget.split('/')]\n const out: string[] = []\n for (const part of parts) {\n if (part === '' || part === '.') continue\n if (part === '..') out.pop()\n else out.push(part)\n }\n return out.join('/')\n}\n\ninterface SlideEntry {\n rid: string\n slideId: number\n sldIdTag: string\n target: string\n title?: string\n}\n\ninterface ParsedPresentation {\n presentationXml: string\n relsXml: string\n entries: SlideEntry[]\n}\n\nconst readZipText = async (verb: string, zip: JSZipNS, path: string): Promise<string> => {\n const file = zip.file(path)\n if (!file) fail(verb, `the presentation is missing an expected part: ${path}`)\n return file!.async('text')\n}\n\nconst parseRelationshipTarget = (relsXml: string, relId: string): string | null => {\n const re = new RegExp(\n `<Relationship\\\\b[^>]*Id=\"${escapeRegex(relId)}\"[^>]*Target=\"([^\"]+)\"[^>]*>`,\n 'i'\n )\n return relsXml.match(re)?.[1] ?? null\n}\n\nconst parsePresentation = async (verb: string, zip: JSZipNS): Promise<ParsedPresentation> => {\n const presentationXml = await readZipText(verb, zip, 'ppt/presentation.xml')\n const relsXml = await readZipText(verb, zip, 'ppt/_rels/presentation.xml.rels')\n const sldIdListMatch = presentationXml.match(/<p:sldIdLst>([\\s\\S]*?)<\\/p:sldIdLst>/)\n if (!sldIdListMatch) fail(verb, 'the presentation has no slide list (corrupt PPTX?)')\n const sldIdTags = sldIdListMatch![1].match(/<p:sldId\\b[^>]*\\/>/g) ?? []\n const entries: SlideEntry[] = []\n for (const tag of sldIdTags) {\n const rid = tag.match(/r:id=\"([^\"]+)\"/)?.[1]\n const idText = tag.match(/\\bid=\"(\\d+)\"/)?.[1]\n if (!rid || !idText) continue\n const target = parseRelationshipTarget(relsXml, rid)\n if (!target) continue\n const slidePath = resolveZipPath('ppt/presentation.xml', target)\n let title: string | undefined\n const slideFile = zip.file(slidePath)\n if (slideFile) {\n const slideXml = await slideFile.async('text')\n title = slideXml.match(/<p:cSld\\b[^>]*\\bname=\"([^\"]*)\"/)?.[1]\n }\n entries.push({ rid, slideId: Number(idText), sldIdTag: tag, target, title })\n }\n return { presentationXml, relsXml, entries }\n}\n\nconst replaceSlideIdList = (presentationXml: string, tags: string[]): string =>\n presentationXml.replace(\n /<p:sldIdLst>[\\s\\S]*?<\\/p:sldIdLst>/,\n `<p:sldIdLst>${tags.join('')}</p:sldIdLst>`\n )\n\n/** Resolve a slide by the frozen `slide=` rule: digits = 1-based index, otherwise title. */\nconst resolveSlide = (\n verb: string,\n entries: SlideEntry[],\n slideArg: string | number | undefined\n): SlideEntry => {\n if (slideArg === undefined) {\n const first = entries[0]\n if (!first) fail(verb, 'the presentation has no slides')\n return first\n }\n // Frozen 0.11: bare number targets by 1-based index; quoted string targets by title.\n if (typeof slideArg === 'number') {\n const found = entries[slideArg - 1]\n if (!found) {\n fail(verb, `slide index ${slideArg} is out of range (1-based; ${entries.length} slides)`)\n }\n return found!\n }\n const byTitle = entries.find((e) => e.title === slideArg)\n if (!byTitle) fail(verb, `no slide titled \"${slideArg}\"`)\n return byTitle!\n}\n\nconst getMaxRidNumber = (relsXml: string): number => {\n let max = 0\n for (const match of relsXml.matchAll(/\\bId=\"rId(\\d+)\"/g)) max = Math.max(max, Number(match[1]))\n return max\n}\n\nconst getMaxSlideNumber = (zip: JSZipNS): number => {\n let max = 0\n for (const name of Object.keys(zip.files)) {\n const match = name.match(/^ppt\\/slides\\/slide(\\d+)\\.xml$/)\n if (match) max = Math.max(max, Number(match[1]))\n }\n return max\n}\n\nconst getMaxSlideId = (entries: SlideEntry[]): number =>\n entries.reduce((max, e) => Math.max(max, e.slideId), 255)\n\nconst ensureSlideContentType = (contentTypesXml: string, slideNumber: number): string => {\n const partName = `/ppt/slides/slide${slideNumber}.xml`\n if (contentTypesXml.includes(`PartName=\"${partName}\"`)) return contentTypesXml\n const override =\n `<Override PartName=\"${partName}\" ` +\n `ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slide+xml\"/>`\n return contentTypesXml.replace('</Types>', `${override}</Types>`)\n}\n\nconst setSlideTitle = (slideXml: string, title: string): string => {\n if (/<p:cSld\\b[^>]*\\bname=\"[^\"]*\"/.test(slideXml)) {\n return slideXml.replace(/(<p:cSld\\b[^>]*\\bname=\")[^\"]*(\")/, `$1${escapeXml(title)}$2`)\n }\n return slideXml\n}\n\n// ── lifecycle ────────────────────────────────────────────────────────────────\n\n/** Acquire pptx bytes, converting ODP to PPTX via the engine registry. */\nconst acquirePptx = async (ctx: StepContext, verb: string): Promise<Uint8Array> => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n if (mime === MIME.PPTX) return ctx.payload.bytes\n if (mime === MIME.ODP) {\n if (!ctx.engines.hasConvert(mime, 'pptx')) {\n fail(\n verb,\n 'this input is ODP — an engine that converts it to PPTX is required first, and none is configured. Do not retry this verb on this media in this deployment.'\n )\n }\n const result = await ctx.engines.convert({\n bytes: ctx.payload.bytes,\n mimeType: mime,\n filename: ctx.payload.filename,\n to: 'pptx',\n signal: ctx.signal,\n })\n const output = result.outputs[0]\n if (!output) fail(verb, 'normalizing the presentation to PPTX produced no output')\n return output!.bytes\n }\n const reason = unsupportedForMutationReason(mime)\n if (reason) fail(verb, reason)\n fail(verb, `slides operations expect a presentation; the media is ${mime}`)\n /* unreachable */ throw new Error('unreachable')\n}\n\nconst withPresentation = async (\n ctx: StepContext,\n verb: string,\n mutate: (zip: JSZipNS, parsed: ParsedPresentation) => Promise<void>\n): Promise<{ kind: 'media'; payload: StepPayload }> => {\n const bytes = await acquirePptx(ctx, verb)\n const JSZip = await jszip()\n let zip: JSZipNS\n try {\n zip = await JSZip.loadAsync(bytes)\n } catch (err) {\n const detail = isError(err) ? err.message : String(err)\n fail(verb, `could not open the presentation: ${detail}`)\n /* unreachable */ throw err\n }\n const parsed = await parsePresentation(verb, zip)\n await mutate(zip, parsed)\n const out = await zip.generateAsync({ type: 'uint8array', compression: 'DEFLATE' })\n return {\n kind: 'media',\n payload: {\n bytes: out,\n mimeType: MIME.PPTX,\n filename: replaceExtension(ctx.payload.filename, 'pptx'),\n },\n }\n}\n\n// ── step implementations ─────────────────────────────────────────────────────\n\n/** `slides.add` — clone the last slide as a template, optionally retitle/position it. */\nexport const slidesAddStep: StepImpl = async (ctx) => {\n const verb = 'slides add'\n const at = argOf<number>(ctx.step, 'at')\n const title = argOf<string>(ctx.step, 'title')\n return withPresentation(ctx, verb, async (zip, parsed) => {\n if (parsed.entries.length === 0) fail(verb, 'the presentation has no slides to clone from')\n const template = parsed.entries[parsed.entries.length - 1]\n const templatePath = resolveZipPath('ppt/presentation.xml', template.target)\n const templateXml = await readZipText(verb, zip, templatePath)\n const newSlideNumber = getMaxSlideNumber(zip) + 1\n const newSlidePath = `ppt/slides/slide${newSlideNumber}.xml`\n zip.file(newSlidePath, title ? setSlideTitle(templateXml, title) : templateXml)\n const templateNum = templatePath.match(/slide(\\d+)\\.xml$/)?.[1]\n const templateRels = templateNum\n ? zip.file(`ppt/slides/_rels/slide${templateNum}.xml.rels`)\n : null\n if (templateRels) {\n const relsXml = await templateRels.async('text')\n zip.file(\n `ppt/slides/_rels/slide${newSlideNumber}.xml.rels`,\n relsXml.replace(/<Relationship\\b[^>]*Type=\"[^\"]*notesSlide\"[^>]*\\/>/g, '')\n )\n }\n const newRid = `rId${getMaxRidNumber(parsed.relsXml) + 1}`\n const newSldTag = `<p:sldId id=\"${getMaxSlideId(parsed.entries) + 1}\" r:id=\"${newRid}\"/>`\n const relNode = `<Relationship Id=\"${newRid}\" Type=\"${SLIDE_REL_TYPE}\" Target=\"slides/slide${newSlideNumber}.xml\"/>`\n zip.file(\n 'ppt/_rels/presentation.xml.rels',\n parsed.relsXml.replace('</Relationships>', `${relNode}</Relationships>`)\n )\n const insertAt =\n at !== undefined\n ? Math.min(Math.max(1, at), parsed.entries.length + 1)\n : parsed.entries.length + 1\n const tags = parsed.entries.map((e) => e.sldIdTag)\n tags.splice(insertAt - 1, 0, newSldTag)\n zip.file('ppt/presentation.xml', replaceSlideIdList(parsed.presentationXml, tags))\n const contentTypes = await readZipText(verb, zip, '[Content_Types].xml')\n zip.file('[Content_Types].xml', ensureSlideContentType(contentTypes, newSlideNumber))\n })\n}\n\n/** `slides.update_text` — replace text in the first node or a named placeholder shape. */\nexport const slidesUpdateTextStep: StepImpl = async (ctx) => {\n const verb = 'slides update_text'\n const text = argOf<string>(ctx.step, 'text') as string\n const placeholder = argOf<string>(ctx.step, 'placeholder')\n return withPresentation(ctx, verb, async (zip, parsed) => {\n const target = resolveSlide(verb, parsed.entries, argOf<string | number>(ctx.step, 'slide'))\n const slidePath = resolveZipPath('ppt/presentation.xml', target.target)\n const slideXml = await readZipText(verb, zip, slidePath)\n let updated = slideXml\n let changed = false\n if (placeholder) {\n let placeholderFound = false\n updated = slideXml.replace(/<p:sp\\b[\\s\\S]*?<\\/p:sp>/g, (shapeXml) => {\n if (\n !new RegExp(`<p:cNvPr\\\\b[^>]*\\\\bname=\"${escapeRegex(placeholder)}\"[^>]*>`, 'i').test(\n shapeXml\n )\n ) {\n return shapeXml\n }\n placeholderFound = true\n return shapeXml.replace(/<a:t>[\\s\\S]*?<\\/a:t>/, () => {\n changed = true\n return `<a:t>${escapeXml(text)}</a:t>`\n })\n })\n if (!placeholderFound)\n fail(verb, `no placeholder named \"${placeholder}\" on the selected slide`)\n } else {\n updated = slideXml.replace(/<a:t>[\\s\\S]*?<\\/a:t>/, () => {\n changed = true\n return `<a:t>${escapeXml(text)}</a:t>`\n })\n }\n if (!changed) fail(verb, 'no text node found on the selected slide')\n zip.file(slidePath, updated)\n })\n}\n\n/** `slides.update_table` — set table cell text by 1-based row/col. */\nexport const slidesUpdateTableStep: StepImpl = async (ctx) => {\n const verb = 'slides update_table'\n const updates = ctx.step.args.updates as MediaArgJson\n if (!Array.isArray(updates) || updates.length === 0) {\n fail(verb, `updates must be a JSON array: updates='[{\"row\":1,\"col\":2,\"value\":\"x\"}]'`)\n }\n return withPresentation(ctx, verb, async (zip, parsed) => {\n const target = resolveSlide(verb, parsed.entries, argOf<string | number>(ctx.step, 'slide'))\n const slidePath = resolveZipPath('ppt/presentation.xml', target.target)\n let slideXml = await readZipText(verb, zip, slidePath)\n const tableMatch = slideXml.match(/<a:tbl>[\\s\\S]*?<\\/a:tbl>/)\n if (!tableMatch) fail(verb, 'no table found on the selected slide')\n let tableXml = tableMatch![0]\n const rowMatches = tableXml.match(/<a:tr\\b[\\s\\S]*?<\\/a:tr>/g) ?? []\n for (const raw of updates as Array<Record<string, unknown>>) {\n const row = Number(raw.row)\n const col = Number(raw.col)\n const value = String(raw.value ?? '')\n const rowIndex = row - 1\n const colIndex = col - 1\n if (rowIndex < 0 || colIndex < 0 || rowIndex >= rowMatches.length) {\n fail(verb, `table cell out of range: r${row}c${col} (1-based)`)\n }\n const rowXml = rowMatches[rowIndex]\n const cellMatches = rowXml.match(/<a:tc\\b[\\s\\S]*?<\\/a:tc>/g) ?? []\n if (colIndex >= cellMatches.length)\n fail(verb, `table cell out of range: r${row}c${col} (1-based)`)\n const cellXml = cellMatches[colIndex]\n if (!/<a:t>/.test(cellXml)) fail(verb, `cell r${row}c${col} has no text node`)\n cellMatches[colIndex] = cellXml.replace(\n /<a:t>[\\s\\S]*?<\\/a:t>/,\n `<a:t>${escapeXml(value)}</a:t>`\n )\n rowMatches[rowIndex] = rowXml.replace(/<a:tc\\b[\\s\\S]*?<\\/a:tc>/g, () => cellMatches.shift()!)\n }\n tableXml = tableXml.replace(/<a:tr\\b[\\s\\S]*?<\\/a:tr>/g, () => rowMatches.shift()!)\n slideXml = slideXml.replace(/<a:tbl>[\\s\\S]*?<\\/a:tbl>/, tableXml)\n zip.file(slidePath, slideXml)\n })\n}\n\n/** `slides.update_image` — replace an image part's bytes with another media (`with=@id`). */\nexport const slidesUpdateImageStep: StepImpl = async (ctx) => {\n const verb = 'slides update_image'\n const ref = ctx.step.args.with as MediaRef\n const placeholder = argOf<string>(ctx.step, 'placeholder')\n if (ref.kind !== 'id') fail(verb, 'builder refs are not supported here; use an @id ref')\n const replacement = await ctx.resolveRef((ref as { kind: 'id'; id: string }).id)\n return withPresentation(ctx, verb, async (zip, parsed) => {\n const target = resolveSlide(verb, parsed.entries, argOf<string | number>(ctx.step, 'slide'))\n const slidePath = resolveZipPath('ppt/presentation.xml', target.target)\n const slideXml = await readZipText(verb, zip, slidePath)\n const slideNum = slidePath.match(/slide(\\d+)\\.xml$/)?.[1]\n if (!slideNum) fail(verb, 'unable to resolve the slide number (corrupt PPTX?)')\n const relsPath = `ppt/slides/_rels/slide${slideNum}.xml.rels`\n const relsXml = await readZipText(verb, zip, relsPath)\n let imagePartPath: string | null = null\n if (placeholder) {\n for (const picXml of slideXml.match(/<p:pic\\b[\\s\\S]*?<\\/p:pic>/g) ?? []) {\n if (\n !new RegExp(`<p:cNvPr\\\\b[^>]*\\\\bname=\"${escapeRegex(placeholder)}\"[^>]*>`, 'i').test(\n picXml\n )\n ) {\n continue\n }\n const rid = picXml.match(/<a:blip\\b[^>]*\\br:embed=\"([^\"]+)\"/i)?.[1]\n if (rid) {\n const relTarget = parseRelationshipTarget(relsXml, rid)\n if (relTarget) imagePartPath = resolveZipPath(relsPath, relTarget)\n }\n break\n }\n if (!imagePartPath)\n fail(verb, `no image placeholder named \"${placeholder}\" on the selected slide`)\n } else {\n const fallback = relsXml.match(\n /<Relationship\\b[^>]*Type=\"[^\"]*\\/image\"[^>]*Target=\"([^\"]+)\"[^>]*>/i\n )\n if (fallback) imagePartPath = resolveZipPath(relsPath, fallback[1])\n }\n if (!imagePartPath) fail(verb, 'no image relationship found on the selected slide')\n zip.file(imagePartPath!, replacement.bytes)\n })\n}\n\n/** `slides.update_chart` — overwrite the chart's cached values in document order. */\nexport const slidesUpdateChartStep: StepImpl = async (ctx) => {\n const verb = 'slides update_chart'\n const data = ctx.step.args.data as MediaArgJson\n if (!Array.isArray(data) || data.length === 0) {\n fail(verb, `data must be a non-empty JSON array of arrays: data='[[\"Q1\",10]]'`)\n }\n return withPresentation(ctx, verb, async (zip, parsed) => {\n const target = resolveSlide(verb, parsed.entries, argOf<string | number>(ctx.step, 'slide'))\n const slidePath = resolveZipPath('ppt/presentation.xml', target.target)\n const slideNum = slidePath.match(/slide(\\d+)\\.xml$/)?.[1]\n if (!slideNum) fail(verb, 'unable to resolve the slide number (corrupt PPTX?)')\n const relsPath = `ppt/slides/_rels/slide${slideNum}.xml.rels`\n const relsXml = await readZipText(verb, zip, relsPath)\n const chartRel = relsXml.match(\n /<Relationship\\b[^>]*Type=\"[^\"]*\\/chart\"[^>]*Target=\"([^\"]+)\"[^>]*>/i\n )\n if (!chartRel) fail(verb, 'no chart found on the selected slide')\n const chartPath = resolveZipPath(relsPath, chartRel![1])\n let chartXml = await readZipText(verb, zip, chartPath)\n const values = (data as unknown[][]).flat().map((v) => String(v))\n let replaced = 0\n chartXml = chartXml.replace(/<c:v>[\\s\\S]*?<\\/c:v>/g, (full) => {\n if (replaced >= values.length) return full\n const next = `<c:v>${escapeXml(values[replaced])}</c:v>`\n replaced += 1\n return next\n })\n if (replaced === 0) fail(verb, 'the chart has no cached values to update')\n zip.file(chartPath, chartXml)\n })\n}\n\n/** `slides.delete` — remove slides by 1-based index (cannot remove all). */\nexport const slidesDeleteStep: StepImpl = async (ctx) => {\n const verb = 'slides delete'\n const slides = ctx.step.args.slides as number[]\n return withPresentation(ctx, verb, async (zip, parsed) => {\n const unique = [...new Set(slides)]\n for (const index of unique) {\n if (!Number.isInteger(index) || index < 1 || index > parsed.entries.length) {\n fail(\n verb,\n `slide index ${index} is out of range (1-based; ${parsed.entries.length} slides)`\n )\n }\n }\n const toDelete = new Set(unique)\n const kept = parsed.entries.filter((_, idx) => !toDelete.has(idx + 1))\n if (kept.length === 0) fail(verb, 'cannot delete every slide in the presentation')\n zip.file(\n 'ppt/presentation.xml',\n replaceSlideIdList(\n parsed.presentationXml,\n kept.map((e) => e.sldIdTag)\n )\n )\n let relsXml = parsed.relsXml\n parsed.entries.forEach((entry, idx) => {\n if (!toDelete.has(idx + 1)) return\n const targetPath = resolveZipPath('ppt/presentation.xml', entry.target)\n zip.remove(targetPath)\n const slideNum = targetPath.match(/slide(\\d+)\\.xml$/)?.[1]\n if (slideNum) zip.remove(`ppt/slides/_rels/slide${slideNum}.xml.rels`)\n relsXml = relsXml.replace(\n new RegExp(`<Relationship\\\\b[^>]*Id=\"${entry.rid}\"[^>]*/>`, 'g'),\n ''\n )\n })\n zip.file('ppt/_rels/presentation.xml.rels', relsXml)\n })\n}\n\n/** `slides.reorder` — every slide exactly once, by 1-based index. */\nexport const slidesReorderStep: StepImpl = async (ctx) => {\n const verb = 'slides reorder'\n const order = ctx.step.args.order as number[]\n return withPresentation(ctx, verb, async (zip, parsed) => {\n if (order.length !== parsed.entries.length) {\n fail(verb, `order must list all ${parsed.entries.length} slides exactly once`)\n }\n const seen = new Set<number>()\n const reordered: SlideEntry[] = []\n for (const index of order) {\n if (!Number.isInteger(index) || index < 1 || index > parsed.entries.length) {\n fail(verb, `slide index ${index} is out of range (1-based)`)\n }\n if (seen.has(index)) fail(verb, `duplicate slide index: ${index}`)\n seen.add(index)\n reordered.push(parsed.entries[index - 1])\n }\n zip.file(\n 'ppt/presentation.xml',\n replaceSlideIdList(\n parsed.presentationXml,\n reordered.map((e) => e.sldIdTag)\n )\n )\n })\n}\n\n/** `slides.duplicate` — copy a slide, optionally inserting at a position. */\nexport const slidesDuplicateStep: StepImpl = async (ctx) => {\n const verb = 'slides duplicate'\n const slide = argOf<number>(ctx.step, 'slide') as number\n const at = argOf<number>(ctx.step, 'at')\n return withPresentation(ctx, verb, async (zip, parsed) => {\n if (!Number.isInteger(slide) || slide < 1 || slide > parsed.entries.length) {\n fail(verb, `slide index ${slide} is out of range (1-based; ${parsed.entries.length} slides)`)\n }\n const source = parsed.entries[slide - 1]\n const sourcePath = resolveZipPath('ppt/presentation.xml', source.target)\n const sourceXml = await readZipText(verb, zip, sourcePath)\n const newSlideNumber = getMaxSlideNumber(zip) + 1\n zip.file(`ppt/slides/slide${newSlideNumber}.xml`, sourceXml)\n const sourceNum = sourcePath.match(/slide(\\d+)\\.xml$/)?.[1]\n if (sourceNum) {\n const sourceRels = zip.file(`ppt/slides/_rels/slide${sourceNum}.xml.rels`)\n if (sourceRels) {\n const relsXml = await sourceRels.async('text')\n zip.file(\n `ppt/slides/_rels/slide${newSlideNumber}.xml.rels`,\n relsXml.replace(/<Relationship\\b[^>]*Type=\"[^\"]*notesSlide\"[^>]*\\/>/g, '')\n )\n }\n }\n const newRid = `rId${getMaxRidNumber(parsed.relsXml) + 1}`\n const newTag = `<p:sldId id=\"${getMaxSlideId(parsed.entries) + 1}\" r:id=\"${newRid}\"/>`\n const relNode = `<Relationship Id=\"${newRid}\" Type=\"${SLIDE_REL_TYPE}\" Target=\"slides/slide${newSlideNumber}.xml\"/>`\n zip.file(\n 'ppt/_rels/presentation.xml.rels',\n parsed.relsXml.replace('</Relationships>', `${relNode}</Relationships>`)\n )\n const targetPos =\n at !== undefined ? Math.min(Math.max(1, at), parsed.entries.length + 1) : slide + 1\n const tags = parsed.entries.map((e) => e.sldIdTag)\n tags.splice(targetPos - 1, 0, newTag)\n zip.file('ppt/presentation.xml', replaceSlideIdList(parsed.presentationXml, tags))\n const contentTypes = await readZipText(verb, zip, '[Content_Types].xml')\n zip.file('[Content_Types].xml', ensureSlideContentType(contentTypes, newSlideNumber))\n })\n}\n\n/** Count slides in pptx bytes — exported for spec assertions. */\nexport const countSlides = async (bytes: Uint8Array): Promise<number> => {\n const JSZip = await jszip()\n const zip = await JSZip.loadAsync(bytes)\n const parsed = await parsePresentation('slides', zip)\n return parsed.entries.length\n}\n\n/** The slides step registry fragment, keyed by canonical verb id. */\nexport const SLIDES_STEPS: ReadonlyArray<[string, StepImpl]> = [\n ['slides.add', slidesAddStep],\n ['slides.update_text', slidesUpdateTextStep],\n ['slides.update_table', slidesUpdateTableStep],\n ['slides.update_image', slidesUpdateImageStep],\n ['slides.update_chart', slidesUpdateChartStep],\n ['slides.delete', slidesDeleteStep],\n ['slides.reorder', slidesReorderStep],\n ['slides.duplicate', slidesDuplicateStep],\n]\n","/**\n * Ingest-depth step extensions: the unified `extract.text` format dispatch (PDF text layer,\n * DOCX via mammoth, XLSX via ExcelJS, ODT/ODS via ODF XML, PPTX via slide XML, images via the\n * OCR engine) and format-aware `extract.metadata`.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. Ported from the source server's\n * four extractors, collapsed into one verb that routes on the resolved media's format family\n * (the single biggest order-out-of-chaos win — the model says `extract text` and doesn't care\n * what the container is). OCR runs through the configured `ocr` engine when the input is an\n * image, or when a PDF has no text layer with `ocr=auto`, or always with `ocr=force`.\n */\n\nimport { argOf } from '../runtime'\nimport { decodeText } from './text'\nimport { isError } from '@nhtio/adk/guards'\nimport { MIME, familyOf } from '../formats'\nimport { E_MEDIA_STEP_FAILED } from '../exceptions'\nimport type { default as JSZipNS } from 'jszip'\nimport type { default as ExcelJSNS } from 'exceljs'\nimport type { StepImpl, StepContext } from '../runtime'\n\ntype JSZipModule = typeof JSZipNS\n\nlet zipPromise: Promise<JSZipModule> | undefined\nconst jszip = (): Promise<JSZipModule> => {\n zipPromise ??= import('jszip').then((m) => ('default' in m ? m.default : m) as JSZipModule)\n return zipPromise\n}\n\nconst fail = (verb: string, message: string): never => {\n throw new E_MEDIA_STEP_FAILED([verb, message])\n}\n\nconst VERB = 'extract text'\n\n// ── per-format extraction ────────────────────────────────────────────────────\n\nconst extractPdfText = async (ctx: StepContext): Promise<string> => {\n const { PDFParse } = await import('pdf-parse')\n try {\n const parser = new PDFParse({ data: ctx.payload.bytes })\n const result = await parser.getText()\n return result.text ?? ''\n } catch (err) {\n const detail = isError(err) ? err.message : String(err)\n fail(VERB, `could not read the PDF: ${detail}`)\n /* unreachable */ throw err\n }\n}\n\nconst extractDocxText = async (ctx: StepContext): Promise<string> => {\n const mod = await import('mammoth')\n const mammoth = ('extractRawText' in mod ? mod : (mod as { default: unknown }).default) as {\n extractRawText: (input: Record<string, unknown>) => Promise<{ value: string }>\n }\n const bytes = ctx.payload.bytes\n // mammoth's Node entry expects { buffer: Buffer }; its browser entry expects { arrayBuffer }.\n const input =\n typeof globalThis.Buffer !== 'undefined'\n ? { buffer: globalThis.Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength) }\n : {\n arrayBuffer: bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength\n ) as ArrayBuffer,\n }\n const result = await mammoth.extractRawText(input)\n return result.value\n}\n\nconst extractXlsxText = async (ctx: StepContext): Promise<string> => {\n const mod = await import('exceljs')\n const ExcelJS = ('default' in mod ? mod.default : mod) as typeof ExcelJSNS\n const wb = new ExcelJS.Workbook()\n await wb.xlsx.load(\n ctx.payload.bytes.buffer.slice(\n ctx.payload.bytes.byteOffset,\n ctx.payload.bytes.byteOffset + ctx.payload.bytes.byteLength\n ) as ArrayBuffer\n )\n const lines: string[] = []\n for (const ws of wb.worksheets) {\n lines.push(`# ${ws.name}`)\n ws.eachRow({ includeEmpty: false }, (row) => {\n const cells: string[] = []\n row.eachCell({ includeEmpty: false }, (cell) => {\n cells.push(String(cell.value ?? ''))\n })\n lines.push(cells.join('\\t'))\n })\n }\n return lines.join('\\n')\n}\n\n/** ODF content.xml → visible text (ported transformation order). */\nconst extractOdfXmlText = (xml: string): string =>\n xml\n .replace(/<\\/text:p>/g, '\\n')\n .replace(/<\\/text:h>/g, '\\n')\n .replace(/<\\/table:table-row>/g, '\\n')\n .replace(/<text:tab[^>]*\\/>/g, '\\t')\n .replace(/<text:line-break[^>]*\\/>/g, '\\n')\n .replace(/<[^>]+>/g, '')\n .replace(/&apos;/g, \"'\")\n .replace(/&quot;/g, '\"')\n .replace(/&gt;/g, '>')\n .replace(/&lt;/g, '<')\n .replace(/&amp;/g, '&')\n .replace(/[ \\t]+/g, ' ')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n\nconst extractOdfText = async (ctx: StepContext): Promise<string> => {\n const JSZip = await jszip()\n const zip = await JSZip.loadAsync(ctx.payload.bytes)\n const content = zip.file('content.xml')\n if (!content) fail(VERB, 'the ODF archive is missing content.xml (corrupt file?)')\n return extractOdfXmlText(await content!.async('text'))\n}\n\nconst extractPptxText = async (ctx: StepContext): Promise<string> => {\n const JSZip = await jszip()\n const zip = await JSZip.loadAsync(ctx.payload.bytes)\n const slideNames = Object.keys(zip.files)\n .filter((n) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(n))\n .sort((a, b) => {\n const na = Number(a.match(/slide(\\d+)/)?.[1] ?? 0)\n const nb = Number(b.match(/slide(\\d+)/)?.[1] ?? 0)\n return na - nb\n })\n if (slideNames.length === 0) fail(VERB, 'the presentation has no slides')\n const parts: string[] = []\n for (const name of slideNames) {\n const xml = await zip.file(name)!.async('text')\n const texts = (xml.match(/<a:t>([^<]*)<\\/a:t>/g) ?? []).map((t) =>\n t\n .replace(/<[^>]+>/g, '')\n .replace(/&apos;/g, \"'\")\n .replace(/&quot;/g, '\"')\n .replace(/&gt;/g, '>')\n .replace(/&lt;/g, '<')\n .replace(/&amp;/g, '&')\n )\n parts.push(texts.join('\\n'))\n }\n return parts.join('\\n\\n')\n}\n\nconst runOcr = async (ctx: StepContext): Promise<string> => {\n const out = (argOf<string>(ctx.step, 'ocr_out') ?? 'txt') as 'txt' | 'hocr' | 'json'\n if (!ctx.engines.hasConvert(ctx.payload.mimeType, out)) {\n fail(\n VERB,\n `this input requires OCR, and no engine that converts ${ctx.payload.mimeType} to \"${out}\" is configured. Do not retry this verb on this media in this deployment.`\n )\n }\n const langArg = ctx.step.args.lang as string[] | string | undefined\n const languages = langArg === undefined ? undefined : Array.isArray(langArg) ? langArg : [langArg]\n const result = await ctx.engines.convert({\n bytes: ctx.payload.bytes,\n mimeType: ctx.payload.mimeType,\n filename: ctx.payload.filename,\n to: out,\n options: { languages },\n signal: ctx.signal,\n })\n const output = result.outputs[0]\n if (!output) fail(VERB, 'OCR produced no output')\n return new TextDecoder().decode(output!.bytes)\n}\n\n// ── the unified step ─────────────────────────────────────────────────────────\n\n/**\n * `extract.text` — full format dispatch. Routes by MIME, with OCR engine fallback for images\n * and force-OCR for any input via `ocr=force`.\n */\nexport const extractTextDeepStep: StepImpl = async (ctx) => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n const ocrMode = argOf<string>(ctx.step, 'ocr') ?? 'auto'\n\n const asData = (text: string): { kind: 'data'; data: string; asText: string } => ({\n kind: 'data',\n data: text,\n asText: text,\n })\n\n if (mime.startsWith('image/')) return asData(await runOcr(ctx))\n\n if (ocrMode === 'force') return asData(await runOcr(ctx))\n\n if (mime === MIME.PDF) {\n const text = await extractPdfText(ctx)\n if (text.trim().length === 0 && ocrMode === 'auto') {\n // Scanned PDF: no text layer. OCR-from-PDF is engine territory (the engine must accept\n // application/pdf); surface the actionable path instead of silently returning nothing.\n if (!ctx.engines.hasConvert(mime, 'txt')) {\n fail(\n VERB,\n 'this PDF has no text layer (scanned?). An engine that converts application/pdf to text (OCR) is required to read it, and none is configured. Do not retry this verb on this media in this deployment.'\n )\n }\n return asData(await runOcr(ctx))\n }\n return asData(text)\n }\n if (mime === MIME.DOCX || mime === MIME.DOC) return asData(await extractDocxText(ctx))\n if (mime === MIME.XLSX) return asData(await extractXlsxText(ctx))\n if (mime === MIME.ODT || mime === MIME.ODS || mime === MIME.ODP) {\n return asData(await extractOdfText(ctx))\n }\n if (mime === MIME.PPTX) return asData(await extractPptxText(ctx))\n if (mime.startsWith('text/') || mime === MIME.JSON) {\n return asData(decodeText(ctx.payload.bytes))\n }\n fail(\n VERB,\n `text extraction for ${mime} is not supported in this build. For PPT/legacy formats: convert to=pptx | extract text (requires a convert engine).`\n )\n /* unreachable */ throw new Error('unreachable')\n}\n\n/** `extract.metadata` — format-aware metadata (page counts, sheet/slide inventories). */\nexport const extractMetadataDeepStep: StepImpl = async (ctx) => {\n const mime = ctx.payload.mimeType.toLowerCase().split(';')[0].trim()\n const meta: Record<string, unknown> = {\n filename: ctx.payload.filename,\n mime_type: ctx.payload.mimeType,\n size_bytes: ctx.payload.bytes.byteLength,\n family: familyOf(ctx.payload.mimeType),\n }\n try {\n if (mime === MIME.PDF) {\n const { PDFDocument } = await import('pdf-lib')\n const doc = await PDFDocument.load(ctx.payload.bytes, { ignoreEncryption: true })\n meta.page_count = doc.getPageCount()\n meta.title = doc.getTitle() ?? undefined\n meta.author = doc.getAuthor() ?? undefined\n } else if (mime === MIME.XLSX) {\n const mod = await import('exceljs')\n const ExcelJS = ('default' in mod ? mod.default : mod) as typeof ExcelJSNS\n const wb = new ExcelJS.Workbook()\n await wb.xlsx.load(\n ctx.payload.bytes.buffer.slice(\n ctx.payload.bytes.byteOffset,\n ctx.payload.bytes.byteOffset + ctx.payload.bytes.byteLength\n ) as ArrayBuffer\n )\n meta.sheets = wb.worksheets.map((ws) => ({ name: ws.name, rows: ws.rowCount }))\n } else if (mime === MIME.PPTX) {\n const JSZip = await jszip()\n const zip = await JSZip.loadAsync(ctx.payload.bytes)\n meta.slide_count = Object.keys(zip.files).filter((n) =>\n /^ppt\\/slides\\/slide\\d+\\.xml$/.test(n)\n ).length\n }\n } catch {\n // Metadata enrichment is best-effort; the basics above always report.\n }\n return { kind: 'data', data: meta, asText: JSON.stringify(meta) }\n}\n\n/** The ingest step registry fragment (overrides the Phase 0 native-text-only versions). */\nexport const INGEST_STEPS: ReadonlyArray<[string, StepImpl]> = [\n ['extract.text', extractTextDeepStep],\n ['extract.metadata', extractMetadataDeepStep],\n]\n","/**\n * The engine registry: capability-filtered, middleware-arbitrated, ordered dispatch over the\n * pipeline's engine array.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry (re-exported through the barrel).\n * One selection rule everywhere: gather every engine whose declarations match the request\n * (capability filter), run the consumer's selection onion (stages may exclude or reorder\n * candidates, never add), then the first survivor in supply order wins.\n *\n * Convert dispatch additionally computes multi-hop paths: when no single engine declares a\n * direct edge for the requested (input, target) pair, a breadth-first search over the format\n * graph finds the shortest chain of hops (capped at {@link MAX_HOPS}), with supply order\n * breaking ties at equal length. Pathfinding explores capability declarations only — cheap\n * and synchronous; the selection onion runs once per executed hop with real bytes in hand.\n */\n\nimport { EXT_TO_MIME } from './formats'\nimport { Middleware } from '@nhtio/middleware'\nimport type { NextFn } from '@nhtio/middleware'\nimport type { CapabilityProbe } from './validate'\nimport type {\n MediaEngine,\n ConvertRequest,\n ConvertResult,\n ConvertCapability,\n MutateRequest,\n MutateCapability,\n EngineBytesResult,\n} from './contracts'\n\n/** The maximum number of conversion hops a computed path may take. */\nconst MAX_HOPS = 3\n\n/**\n * Format tokens that are valid conversion endpoints but never intermediate path nodes.\n * Without this rule the pathfinder would happily route `docx → txt → …` (lossy garbage in,\n * garbage out) or auto-chain `audio → pcm → txt` (skipping the resample the transcription\n * step performs between those legs).\n */\nconst TERMINAL_TOKENS: ReadonlySet<string> = new Set([\n 'txt',\n 'json',\n 'hocr',\n 'srt',\n 'vtt',\n 'md',\n 'csv',\n 'pcm',\n 'images',\n])\n\n/** Normalize a MIME type for comparison (lowercase, parameters stripped). */\nconst normalizeMime = (mimeType: string): string => mimeType.toLowerCase().split(';')[0].trim()\n\n/** `true` when `mime` matches `pattern` (exact, or a `family/*` wildcard). */\nconst matchesMime = (pattern: string, mime: string): boolean => {\n const p = pattern.toLowerCase()\n if (p.endsWith('/*')) return mime.startsWith(p.slice(0, -1))\n return p === mime\n}\n\n/** `true` when any pattern in `patterns` matches `mime`. */\nconst matchesAny = (patterns: readonly string[], mime: string): boolean =>\n patterns.some((p) => matchesMime(p, mime))\n\n/**\n * The request summary a selection stage sees: enough to implement content- and\n * format-dependent rules without exposing dispatch internals.\n */\nexport interface EngineSelectionContext {\n /** Which capability is being dispatched. */\n kind: 'convert' | 'mutate'\n /** The dispatch request (for convert under multi-hop, the CURRENT hop's input/target). */\n request: {\n /** The input MIME type. */\n mimeType: string\n /** The input filename. */\n filename: string\n /** The input bytes — content-dependent rules (e.g. workbook complexity) need them. */\n bytes: Uint8Array\n /** The convert target token, or the mutate `format.to` when a re-encode was requested. */\n to?: string\n /** The requested mutate operations. */\n ops?: readonly string[]\n }\n /**\n * The capable engines, in supply order. Stages may exclude or reorder (mutate in place or\n * reassign); survivors are re-filtered against the original capable set, so a stage can\n * never add an engine the capability filter rejected.\n */\n candidates: MediaEngine[]\n}\n\n/**\n * A selection-middleware stage — the seam for quality heuristics and implementor overrides\n * when several engines can perform the same transform (e.g. route complex workbooks past a\n * pure-JS converter to LibreOffice). Same onion shape as the battery's `use` interceptors;\n * a fresh runner is minted per dispatch. Keep stages cheap or memoized: they run with bytes\n * in hand on every dispatch.\n */\nexport type EngineSelectionMiddlewareFn = (\n ctx: EngineSelectionContext,\n next: NextFn\n) => void | Promise<void>\n\n/** Ordered capability-filtered dispatch over the pipeline's engines. */\nexport interface EngineRegistry extends CapabilityProbe {\n /** The resolved engines, in supply order (inspection/debugging). */\n readonly engines: readonly MediaEngine[]\n /**\n * Every format token reachable from `fromMime` — directly or through a computed path of up\n * to three hops. Drives \"supported targets\" error messages.\n *\n * @param fromMime - The input MIME type.\n */\n convertTargets(fromMime: string): readonly string[]\n /**\n * Convert via the shortest capable path (direct edge = one hop). The selection rule picks\n * the engine for each executed hop; options are forwarded to every hop (engines ignore\n * keys they don't understand).\n *\n * @param request - The input bytes, target token, and options.\n * @returns The final hop's outputs.\n */\n convert(request: ConvertRequest): Promise<ConvertResult>\n /**\n * Apply a fused same-format transform. Candidates are engines whose `over` matches the\n * input, whose `ops` cover the requested operations, and — when a re-encode is requested —\n * whose `encodes` include the target.\n *\n * @param request - The fused operations and input bytes.\n * @returns The transformed bytes.\n */\n mutate(request: MutateRequest): Promise<EngineBytesResult>\n}\n\n/** One engine's matching capability group for a dispatch. */\ninterface ConvertCandidate {\n engine: MediaEngine\n capability: ConvertCapability\n}\ninterface MutateCandidate {\n engine: MediaEngine\n capability: MutateCapability\n}\n\n/** One hop of a computed conversion path. */\ninterface ConvertHop {\n /** The hop's input MIME. */\n fromMime: string\n /** The format token this hop produces. */\n to: string\n}\n\n/** The mutate operations requested by a fused request. */\nconst requestedOps = (request: MutateRequest): string[] => {\n const ops: string[] = []\n if (request.resize) ops.push('resize')\n if (request.rotate !== undefined) ops.push('rotate')\n if (request.flip) ops.push('flip')\n if (request.stripMetadata) ops.push('strip_metadata')\n return ops\n}\n\n/**\n * Build the registry over a resolved, validated engine array.\n *\n * @param engines - The engines, in supply (priority) order.\n * @param selection - Optional selection-middleware stages arbitrating multi-candidate dispatches.\n * @returns The registry.\n */\nexport const buildEngineRegistry = (\n engines: readonly MediaEngine[],\n selection: readonly EngineSelectionMiddlewareFn[] = []\n): EngineRegistry => {\n // ── capability filters (declaration-only, sync) ───────────────────────────\n const convertCandidates = (fromMime: string, to: string): ConvertCandidate[] => {\n const mime = normalizeMime(fromMime)\n const out: ConvertCandidate[] = []\n for (const engine of engines) {\n for (const capability of engine.converts ?? []) {\n if (capability.to.includes(to) && matchesAny(capability.from, mime)) {\n out.push({ engine, capability })\n break // one entry per engine; its first matching group serves the edge\n }\n }\n }\n return out\n }\n\n const mutateCandidates = (request: MutateRequest): MutateCandidate[] => {\n const mime = normalizeMime(request.mimeType)\n const ops = requestedOps(request)\n const out: MutateCandidate[] = []\n for (const engine of engines) {\n for (const capability of engine.mutates ?? []) {\n if (!matchesAny(capability.over, mime)) continue\n if (!ops.every((op) => capability.ops.includes(op))) continue\n if (request.format && !capability.encodes.includes(request.format.to)) continue\n out.push({ engine, capability })\n break\n }\n }\n return out\n }\n\n // ── the selection rule ─────────────────────────────────────────────────────\n const arbitrate = async <C extends { engine: MediaEngine }>(\n kind: 'convert' | 'mutate',\n request: EngineSelectionContext['request'],\n candidates: C[]\n ): Promise<C | undefined> => {\n if (candidates.length === 0) return undefined\n if (selection.length === 0 || candidates.length === 1) return candidates[0]\n const ctx: EngineSelectionContext = {\n kind,\n request,\n candidates: candidates.map((c) => c.engine),\n }\n const mw = new Middleware<EngineSelectionMiddlewareFn>()\n for (const fn of selection) mw.add(fn)\n let failed: unknown\n await mw\n .runner()\n .errorHandler(async (error: unknown) => {\n failed = error\n })\n .finalHandler(async () => {})\n .run((fn, next) => Promise.resolve(fn(ctx, next)))\n if (failed !== undefined) throw failed\n // Re-filter: stages narrow/reorder, never widen. First survivor in the stages' order wins.\n for (const engine of ctx.candidates) {\n const survivor = candidates.find((c) => c.engine === engine)\n if (survivor) return survivor\n }\n return undefined\n }\n\n // ── convert pathfinding (declarations only) ───────────────────────────────\n const findPath = (fromMime: string, target: string): ConvertHop[] | undefined => {\n const start = normalizeMime(fromMime)\n const queue: Array<{ mime: string; path: ConvertHop[] }> = [{ mime: start, path: [] }]\n const visited = new Set<string>([start])\n while (queue.length > 0) {\n const { mime, path } = queue.shift()!\n if (path.length >= MAX_HOPS) continue\n // Direct edge from this node?\n if (convertCandidates(mime, target).length > 0) {\n return [...path, { fromMime: mime, to: target }]\n }\n // Expand through non-terminal tokens.\n for (const engine of engines) {\n for (const capability of engine.converts ?? []) {\n if (!matchesAny(capability.from, mime)) continue\n for (const to of capability.to) {\n if (TERMINAL_TOKENS.has(to)) continue\n const nextMime = EXT_TO_MIME[to]\n if (!nextMime || visited.has(nextMime)) continue\n visited.add(nextMime)\n queue.push({ mime: nextMime, path: [...path, { fromMime: mime, to }] })\n }\n }\n }\n }\n return undefined\n }\n\n const hasConvert = (from?: string, to?: string): boolean => {\n for (const engine of engines) {\n for (const capability of engine.converts ?? []) {\n if (from !== undefined && !matchesAny(capability.from, normalizeMime(from))) continue\n if (to !== undefined && !capability.to.includes(to)) continue\n return true\n }\n }\n return false\n }\n\n const convertTargets = (fromMime: string): readonly string[] => {\n const reachable: string[] = []\n const seen = new Set<string>()\n let frontier = [normalizeMime(fromMime)]\n const visitedMimes = new Set<string>(frontier)\n for (let hop = 0; hop < MAX_HOPS && frontier.length > 0; hop++) {\n const next: string[] = []\n for (const mime of frontier) {\n for (const engine of engines) {\n for (const capability of engine.converts ?? []) {\n if (!matchesAny(capability.from, mime)) continue\n for (const to of capability.to) {\n if (!seen.has(to)) {\n seen.add(to)\n reachable.push(to)\n }\n if (TERMINAL_TOKENS.has(to)) continue\n const nextMime = EXT_TO_MIME[to]\n if (nextMime && !visitedMimes.has(nextMime)) {\n visitedMimes.add(nextMime)\n next.push(nextMime)\n }\n }\n }\n }\n }\n frontier = next\n }\n return reachable\n }\n\n const ids = (): string => engines.map((e) => e.id).join(', ') || '(none)'\n\n const convert = async (request: ConvertRequest): Promise<ConvertResult> => {\n const path = findPath(request.mimeType, request.to)\n if (!path) {\n const supported = convertTargets(request.mimeType)\n throw new Error(\n `no configured engine (or computed path) can convert ${request.mimeType} to \"${request.to}\"; reachable targets: ${supported.join(', ') || '(none)'} (engines: ${ids()})`\n )\n }\n let bytes = request.bytes\n let mimeType = request.mimeType\n let result: ConvertResult | undefined\n for (const hop of path) {\n const candidates = convertCandidates(mimeType, hop.to)\n const chosen = await arbitrate(\n 'convert',\n { mimeType, filename: request.filename, bytes, to: hop.to },\n candidates\n )\n if (!chosen) {\n throw new Error(\n `all engines capable of converting ${mimeType} to \"${hop.to}\" (${candidates.map((c) => c.engine.id).join(', ')}) were excluded by selection middleware`\n )\n }\n result = await chosen.capability.convert({\n bytes,\n mimeType,\n filename: request.filename,\n to: hop.to,\n options: request.options,\n signal: request.signal,\n })\n const first = result.outputs[0]\n if (!first) {\n throw new Error(\n `engine \"${chosen.engine.id}\" converted ${mimeType} to \"${hop.to}\" but produced no outputs`\n )\n }\n bytes = first.bytes\n mimeType = first.mimeType\n }\n return result!\n }\n\n const mutate = async (request: MutateRequest): Promise<EngineBytesResult> => {\n const candidates = mutateCandidates(request)\n if (candidates.length === 0) {\n const allOps = new Set<string>()\n const allEncodes = new Set<string>()\n for (const engine of engines) {\n for (const capability of engine.mutates ?? []) {\n for (const op of capability.ops) allOps.add(op)\n for (const enc of capability.encodes) allEncodes.add(enc)\n }\n }\n const wanted = requestedOps(request).join(', ') || '(none)'\n const encodeNote = request.format\n ? `; requested encoding \"${request.format.to}\" — declared encodings: ${[...allEncodes].join(', ') || '(none)'}. A different engine (e.g. sharp) may support it`\n : ''\n throw new Error(\n `no configured engine can mutate ${request.mimeType} with ops [${wanted}]${encodeNote} (engines: ${ids()})`\n )\n }\n const chosen = await arbitrate(\n 'mutate',\n {\n mimeType: request.mimeType,\n filename: '',\n bytes: request.bytes,\n to: request.format?.to,\n ops: requestedOps(request),\n },\n candidates\n )\n if (!chosen) {\n throw new Error(\n `all engines capable of this mutate (${candidates.map((c) => c.engine.id).join(', ')}) were excluded by selection middleware`\n )\n }\n return chosen.capability.mutate(request)\n }\n\n return {\n engines,\n hasConvert,\n hasMutate: () => engines.some((e) => (e.mutates ?? []).length > 0),\n convertTargets,\n convert,\n mutate,\n }\n}\n","/**\n * `image.*` and `audio.*` step implementations: fused raster transforms via the\n * imageTransform engine, and transcription via the audioDecode + asr engines.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. The split image verbs\n * (`resize`/`format`/`rotate`/`flip`/`strip_metadata`) read pipe-naturally, and the runtime\n * fuses **adjacent** image steps into a single engine invocation so a resize→format→rotate\n * chain costs one decode/encode (frozen design 0.13). Fusion happens here at execution time:\n * each image step folds its args into a shared fused request stored on the execution stash;\n * the LAST image step in a run performs the engine call.\n *\n * Audio transcription composes two engines: `audioDecode` (container → mono PCM) and `asr`\n * (PCM → text/subtitles). A small pure resampler bridges arbitrary sample rates to the\n * 16 kHz mono Float32Array ASR engines expect.\n */\n\nimport { argOf } from '../runtime'\nimport { E_MEDIA_STEP_FAILED } from '../exceptions'\nimport { PCM_MIME, pcmToBytes, bytesToPcm } from '../contracts'\nimport type { MutateRequest } from '../contracts'\nimport type { StepImpl, StepContext, StepResult } from '../runtime'\n\nconst fail = (verb: string, message: string): never => {\n throw new E_MEDIA_STEP_FAILED([verb, message])\n}\n\n// ── image fusion ─────────────────────────────────────────────────────────────\n\ntype FusedImageOps = Omit<MutateRequest, 'bytes' | 'mimeType' | 'signal'>\n\nconst IMAGE_VERBS = new Set([\n 'image.resize',\n 'image.format',\n 'image.rotate',\n 'image.flip',\n 'image.strip_metadata',\n])\n\nconst requireImage = (ctx: StepContext, verb: string): void => {\n if (!ctx.payload.mimeType.toLowerCase().startsWith('image/')) {\n fail(verb, `image operations expect an image; the media is ${ctx.payload.mimeType}`)\n }\n}\n\n/** Fold this step's args into the fused request. */\nconst foldImageStep = (ctx: StepContext, fused: FusedImageOps): FusedImageOps => {\n const args = ctx.step.args\n switch (ctx.step.verb) {\n case 'image.resize':\n return {\n ...fused,\n resize: {\n width: args.width as number | undefined,\n height: args.height as number | undefined,\n fit: args.fit as FusedImageOps['resize'] extends undefined\n ? never\n : NonNullable<FusedImageOps['resize']>['fit'],\n },\n }\n case 'image.format':\n return {\n ...fused,\n format: { to: args.to as string, quality: args.quality as number | undefined },\n ...(args.strip_metadata !== undefined\n ? { stripMetadata: args.strip_metadata as boolean }\n : {}),\n }\n case 'image.rotate': {\n const deg = Number(args.deg) as 90 | 180 | 270\n const total = (((fused.rotate ?? 0) + deg) % 360) as 0 | 90 | 180 | 270\n return { ...fused, rotate: total === 0 ? undefined : total }\n }\n case 'image.flip': {\n const axis = args.axis as 'horizontal' | 'vertical' | 'both'\n const flip = { ...(fused.flip ?? {}) }\n if (axis === 'horizontal' || axis === 'both') flip.horizontal = !flip.horizontal\n if (axis === 'vertical' || axis === 'both') flip.vertical = !flip.vertical\n return { ...fused, flip }\n }\n case 'image.strip_metadata':\n return { ...fused, stripMetadata: true }\n default:\n return fused\n }\n}\n\n/** `true` when the NEXT step in the plan is also an image verb (so we defer the engine call). */\nconst nextIsImageStep = (ctx: StepContext): boolean => {\n const next = ctx.plan.steps[ctx.stepIndex + 1]\n return next !== undefined && IMAGE_VERBS.has(next.verb)\n}\n\nconst FUSION_KEY = 'media.image.fused'\n\nconst imageStep: StepImpl = async (ctx) => {\n const verb = ctx.step.verb.replace(/\\./g, ' ')\n requireImage(ctx, verb)\n const prior = (ctx.stash.get(FUSION_KEY) as FusedImageOps | undefined) ?? {}\n const fused = foldImageStep(ctx, prior)\n if (nextIsImageStep(ctx)) {\n // Defer: pass the payload through untouched; the last image step executes the engine.\n ctx.stash.set(FUSION_KEY, fused)\n return { kind: 'media', payload: ctx.payload }\n }\n ctx.stash.delete(FUSION_KEY)\n if (!ctx.engines.hasMutate()) {\n fail(\n verb,\n 'no image-mutating engine is configured. Do not retry image verbs in this deployment.'\n )\n }\n const result = await ctx.engines.mutate({\n ...fused,\n bytes: ctx.payload.bytes,\n mimeType: ctx.payload.mimeType,\n signal: ctx.signal,\n })\n const ext = result.mimeType.split('/')[1]?.replace('jpeg', 'jpg') ?? 'bin'\n const dot = ctx.payload.filename.lastIndexOf('.')\n const base = dot > 0 ? ctx.payload.filename.slice(0, dot) : ctx.payload.filename\n return {\n kind: 'media',\n payload: { bytes: result.bytes, mimeType: result.mimeType, filename: `${base}.${ext}` },\n }\n}\n\n// ── audio ────────────────────────────────────────────────────────────────────\n\n/** Downmix to mono and linearly resample to the target rate. Pure, cross-env. */\nexport const resampleTo = (pcm: Float32Array, fromRate: number, toRate: number): Float32Array => {\n if (fromRate === toRate) return pcm\n const ratio = fromRate / toRate\n const outLength = Math.floor(pcm.length / ratio)\n const out = new Float32Array(outLength)\n for (let i = 0; i < outLength; i++) {\n const pos = i * ratio\n const left = Math.floor(pos)\n const right = Math.min(left + 1, pcm.length - 1)\n const frac = pos - left\n out[i] = pcm[left] * (1 - frac) + pcm[right] * frac\n }\n return out\n}\n\nconst ASR_SAMPLE_RATE = 16_000\n\n/**\n * `audio.transcribe` — an explicit two-stage composition: convert the container to PCM,\n * resample to 16 kHz mono, then convert the PCM to the requested text form. The registry\n * never auto-chains through PCM (it is a terminal token), precisely because this resample\n * leg must happen between the two converts.\n */\nconst audioTranscribeStep: StepImpl = async (ctx): Promise<StepResult> => {\n const verb = 'audio transcribe'\n if (!ctx.payload.mimeType.toLowerCase().startsWith('audio/')) {\n fail(verb, `transcription expects audio; the media is ${ctx.payload.mimeType}`)\n }\n const out = (argOf<string>(ctx.step, 'out') ?? 'txt') as 'txt' | 'srt' | 'vtt' | 'json'\n if (!ctx.engines.hasConvert(ctx.payload.mimeType, 'pcm')) {\n fail(\n verb,\n `no engine that decodes ${ctx.payload.mimeType} to PCM is configured. Do not retry this verb in this deployment.`\n )\n }\n if (!ctx.engines.hasConvert(PCM_MIME, out)) {\n fail(\n verb,\n `no engine that transcribes PCM to \"${out}\" is configured. Do not retry this verb in this deployment.`\n )\n }\n const decoded = await ctx.engines.convert({\n bytes: ctx.payload.bytes,\n mimeType: ctx.payload.mimeType,\n filename: ctx.payload.filename,\n to: 'pcm',\n signal: ctx.signal,\n })\n const pcmOut = decoded.outputs[0]\n if (!pcmOut) fail(verb, 'audio decoding produced no output')\n const sourceRate = Number(pcmOut!.meta?.sampleRate)\n if (!Number.isFinite(sourceRate) || sourceRate <= 0) {\n fail(verb, 'the decode engine did not report meta.sampleRate on its PCM output')\n }\n const pcm = resampleTo(bytesToPcm(pcmOut!.bytes), sourceRate, ASR_SAMPLE_RATE)\n const result = await ctx.engines.convert({\n bytes: pcmToBytes(pcm),\n mimeType: PCM_MIME,\n filename: ctx.payload.filename,\n to: out,\n options: {\n lang: argOf<string>(ctx.step, 'lang'),\n translate: argOf<boolean>(ctx.step, 'translate'),\n },\n signal: ctx.signal,\n })\n const final = result.outputs[0]\n if (!final) fail(verb, 'transcription produced no output')\n const text = new TextDecoder().decode(final!.bytes)\n return { kind: 'data', data: text, asText: text }\n}\n\n/** The image + audio step registry fragment. */\nexport const IMAGE_AUDIO_STEPS: ReadonlyArray<[string, StepImpl]> = [\n ['image.resize', imageStep],\n ['image.format', imageStep],\n ['image.rotate', imageStep],\n ['image.flip', imageStep],\n ['image.strip_metadata', imageStep],\n ['audio.transcribe', audioTranscribeStep],\n]\n","/**\n * Pure page-operation step implementations for PDFs: select, split, merge, reorder.\n *\n * @remarks\n * Internal sibling of the `@nhtio/adk/batteries/media` entry. Implemented with `pdf-lib`\n * (optional peer, lazily imported) on in-memory bytes — no binaries, cross-environment.\n * Phase 0 covers PDF inputs; PPTX slide operations and DOCX section operations join in the\n * sheet/slides/doc phases, sharing these verb ids with format dispatch.\n */\n\nimport { argOf } from '../runtime'\nimport { isError } from '@nhtio/adk/guards'\nimport { E_MEDIA_STEP_FAILED } from '../exceptions'\nimport { MIME, replaceExtension } from '../formats'\nimport type { MediaRef } from '../plan'\nimport type * as PdfLibModule from 'pdf-lib'\nimport type { StepImpl, StepPayload } from '../runtime'\n\ntype PdfLib = typeof PdfLibModule\ntype PDFDocumentType = PdfLibModule.PDFDocument\n\nlet pdfLibPromise: Promise<PdfLib> | undefined\nconst pdfLib = (): Promise<PdfLib> => {\n pdfLibPromise ??= import('pdf-lib')\n return pdfLibPromise\n}\n\nconst requirePdf = (verb: string, payload: StepPayload): void => {\n if (payload.mimeType.toLowerCase().split(';')[0].trim() !== MIME.PDF) {\n throw new E_MEDIA_STEP_FAILED([\n verb,\n `page operations for ${payload.mimeType} are not yet implemented in this build (PDF is supported)`,\n ])\n }\n}\n\nconst loadPdf = async (verb: string, bytes: Uint8Array): Promise<PDFDocumentType> => {\n const { PDFDocument } = await pdfLib()\n try {\n return await PDFDocument.load(bytes, { ignoreEncryption: false })\n } catch (err) {\n const detail = isError(err) ? err.message : String(err)\n throw new E_MEDIA_STEP_FAILED([verb, `could not read the PDF: ${detail}`], { cause: err })\n }\n}\n\nconst checkIndices = (verb: string, indices: number[], pageCount: number): void => {\n for (const i of indices) {\n if (i < 1 || i > pageCount) {\n throw new E_MEDIA_STEP_FAILED([\n verb,\n `page ${i} is out of range — the document has ${pageCount} pages (pages are 1-based)`,\n ])\n }\n }\n}\n\n/** `select` — keep only the listed 1-based pages, producing one document. */\nexport const selectStep: StepImpl = async (ctx) => {\n requirePdf('select', ctx.payload)\n const pages = argOf<number[]>(ctx.step, 'pages') as number[]\n const source = await loadPdf('select', ctx.payload.bytes)\n checkIndices('select', pages, source.getPageCount())\n const { PDFDocument } = await pdfLib()\n const out = await PDFDocument.create()\n const copied = await out.copyPages(\n source,\n pages.map((p) => p - 1)\n )\n for (const page of copied) out.addPage(page)\n const bytes = await out.save()\n return { kind: 'media', payload: { ...ctx.payload, bytes: new Uint8Array(bytes) } }\n}\n\n/** `split` — split into multiple documents by page (optionally grouped by JSON ranges). */\nexport const splitStep: StepImpl = async (ctx) => {\n requirePdf('split', ctx.payload)\n const by = argOf<string>(ctx.step, 'by') ?? 'page'\n if (by !== 'page') {\n throw new E_MEDIA_STEP_FAILED([\n 'split',\n `split by=${by} is not yet implemented in this build (page is supported)`,\n ])\n }\n const source = await loadPdf('split', ctx.payload.bytes)\n const pageCount = source.getPageCount()\n const rawRanges = ctx.step.args.ranges as number[][] | undefined\n const groups: number[][] =\n rawRanges !== undefined\n ? rawRanges.map((pair) => {\n if (!Array.isArray(pair) || pair.length !== 2) {\n throw new E_MEDIA_STEP_FAILED([\n 'split',\n `ranges must be [start,end] pairs, e.g. ranges='[[1,3],[5,7]]'`,\n ])\n }\n const [start, end] = pair\n const pages: number[] = []\n for (let p = start; p <= end; p++) pages.push(p)\n return pages\n })\n : Array.from({ length: pageCount }, (_, i) => [i + 1])\n const { PDFDocument } = await pdfLib()\n const payloads: StepPayload[] = []\n let part = 1\n for (const group of groups) {\n checkIndices('split', group, pageCount)\n const out = await PDFDocument.create()\n const copied = await out.copyPages(\n source,\n group.map((p) => p - 1)\n )\n for (const page of copied) out.addPage(page)\n const bytes = new Uint8Array(await out.save())\n payloads.push({\n bytes,\n mimeType: MIME.PDF,\n filename: replaceExtension(ctx.payload.filename, '').replace(/\\.$/, '') + `.part${part}.pdf`,\n })\n part += 1\n }\n return { kind: 'media-list', payloads }\n}\n\n/** `merge` — append the referenced media's pages, in order. */\nexport const mergeStep: StepImpl = async (ctx) => {\n requirePdf('merge', ctx.payload)\n const raw = ctx.step.args.with\n const refs = (Array.isArray(raw) ? raw : [raw]) as MediaRef[]\n const { PDFDocument } = await pdfLib()\n const out = await PDFDocument.create()\n const appendAll = async (doc: PDFDocumentType): Promise<void> => {\n const copied = await out.copyPages(doc, doc.getPageIndices())\n for (const page of copied) out.addPage(page)\n }\n await appendAll(await loadPdf('merge', ctx.payload.bytes))\n for (const ref of refs) {\n if (ref.kind !== 'id') {\n throw new E_MEDIA_STEP_FAILED(['merge', 'builder refs are not yet supported here'])\n }\n const other = await ctx.resolveRef(ref.id)\n requirePdf('merge', other)\n await appendAll(await loadPdf('merge', other.bytes))\n }\n const bytes = new Uint8Array(await out.save())\n return { kind: 'media', payload: { ...ctx.payload, bytes } }\n}\n\n/** `reorder` — rebuild the document with pages in the given 1-based order. */\nexport const reorderStep: StepImpl = async (ctx) => {\n requirePdf('reorder', ctx.payload)\n const order = argOf<number[]>(ctx.step, 'order') as number[]\n const source = await loadPdf('reorder', ctx.payload.bytes)\n const pageCount = source.getPageCount()\n checkIndices('reorder', order, pageCount)\n if (order.length !== pageCount) {\n throw new E_MEDIA_STEP_FAILED([\n 'reorder',\n `order lists ${order.length} pages but the document has ${pageCount} — list every page exactly once`,\n ])\n }\n const { PDFDocument } = await pdfLib()\n const out = await PDFDocument.create()\n const copied = await out.copyPages(\n source,\n order.map((p) => p - 1)\n )\n for (const page of copied) out.addPage(page)\n const bytes = new Uint8Array(await out.save())\n return { kind: 'media', payload: { ...ctx.payload, bytes } }\n}\n","/**\n * A knex-inspired local media pipeline: one declarative plan, three front-ends (chainable\n * builder, pipe string, JSON ops), engines as composable seams.\n *\n * @module @nhtio/adk/batteries/media\n *\n * @remarks\n * Most implementations give you two ways to process media — ship it to an external API, or\n * flood the model's context window with the bytes. This battery is the third option: **full\n * control of media — local processing, no external APIs by default, cross-environment where\n * possible.** Your data stays in your application and infrastructure unless you deliberately\n * wire an engine that sends it elsewhere.\n *\n * The entry point is {@link createMediaPipeline}:\n *\n * ```ts\n * import { createMediaPipeline } from '@nhtio/adk/batteries/media'\n *\n * const mp = await createMediaPipeline({\n * engines: [\n * // an ordered array of self-declaring engines; resolvers run eagerly at construction,\n * // but each engine's heavy peer dependency loads lazily on first actual use\n * () => import('@nhtio/adk/batteries/media/engines/jimp').then((m) => m.jimpEngine()),\n * ],\n * })\n *\n * // chainable builder (implementor DX)\n * const redacted = await mp(payload)\n * .select({ pages: [2, 3] })\n * .redact({ match: [/\\d{3}-\\d{2}-\\d{4}/] })\n *\n * // pipe string (the LLM-facing DSL — same plan underneath)\n * const result = await mp.query(payload, 'select pages=2-3 | redact match=/\\\\d{3}-\\\\d{2}-\\\\d{4}/')\n * ```\n *\n * Media pipelines have no standard — every tool invented its own grammar. LLMs don't share one\n * mental model of that chaos, so the pipe DSL projects every operation onto the one\n * transformation idiom every model already groks: shell pipes with `key=value` args. The verbs\n * a deployment advertises narrow to the engines it configured; everything else fails loud with\n * a model-actionable message.\n */\n\nimport { parsePipeRaw } from './pipe'\nimport { MediaChain } from './builder'\nimport { executePlan } from './runtime'\nimport { DOC_STEPS } from './steps/doc'\nimport { SHEET_STEPS } from './steps/sheet'\nimport { validator } from '@nhtio/validation'\nimport { SLIDES_STEPS } from './steps/slides'\nimport { INGEST_STEPS } from './steps/ingest'\nimport { buildEngineRegistry } from './registry'\nimport { implementsMediaEngine } from './contracts'\nimport { isError, isObject } from '@nhtio/adk/guards'\nimport { IMAGE_AUDIO_STEPS } from './steps/image_audio'\nimport { validateSegments, validateOps } from './validate'\nimport { E_INVALID_MEDIA_PIPELINE_CONFIG } from './exceptions'\nimport { selectStep, splitStep, mergeStep, reorderStep } from './steps/pages'\nimport {\n chunkStep,\n extractTextStep,\n extractMetadataStep,\n redactStep,\n updateTextStep,\n diffStep,\n applyPatchStep,\n} from './steps/text'\nimport type { MediaOp, MediaPlan } from './plan'\nimport type { CapabilityProbe } from './validate'\nimport type { EngineSelectionMiddlewareFn } from './registry'\nimport type { MediaEngine, EngineResolver } from './contracts'\nimport type { StepImpl, StepPayload, PlanResult, MediaStepMiddlewareFn } from './runtime'\n\nexport { MediaChain } from './builder'\nexport type {\n ChainExecutor,\n ChainInput,\n MediaChainRef,\n CellUpdate,\n ResizeOptions,\n SheetNamespace,\n SlidesNamespace,\n ImageNamespace,\n AudioNamespace,\n} from './builder'\nexport { toPipe, toOps, fromOps, isMediaRef, isRegExpRef } from './plan'\nexport type {\n MediaPlan,\n MediaStep,\n MediaOp,\n MediaArgValue,\n MediaArgScalar,\n MediaArgJson,\n MediaRef,\n RegExpRef,\n SourceSpan,\n} from './plan'\nexport { parsePipeRaw, lowerSegments } from './pipe'\nexport type { RawSegment, RawArgValue } from './pipe'\nexport { validateSegments, validateOps, availableVerbs } from './validate'\nexport type { ValidateOptions, CapabilityProbe } from './validate'\nexport { VERBS, VERB_INDEX, FOLDED_VERBS, foldVerb, suggestVerbs } from './verbs'\nexport type {\n VerbSpec,\n VerbArgSpec,\n VerbArgType,\n VerbOutput,\n VerbRequirement,\n FormatFamily,\n} from './verbs'\nexport { PCM_MIME, pcmToBytes, bytesToPcm, implementsMediaEngine } from './contracts'\nexport type {\n MediaEngine,\n EngineResolver,\n ConvertCapability,\n ConvertRequest,\n ConvertResult,\n ConvertOutput,\n ConvertOptions,\n OcrConvertOptions,\n AsrConvertOptions,\n ImagesConvertOptions,\n MutateCapability,\n MutateRequest,\n MimePattern,\n} from './contracts'\nexport { buildEngineRegistry } from './registry'\nexport type {\n EngineRegistry,\n EngineSelectionContext,\n EngineSelectionMiddlewareFn,\n} from './registry'\nexport type {\n StepPayload,\n StepResult,\n PlanResult,\n StepContext,\n StepImpl,\n MediaStepMiddlewareFn,\n} from './runtime'\nexport {\n MIME,\n familyOf,\n unsupportedForMutationReason,\n replaceExtension,\n EXT_TO_MIME,\n} from './formats'\nexport {\n E_INVALID_MEDIA_PIPELINE_CONFIG,\n E_MEDIA_PIPE_SYNTAX,\n E_MEDIA_UNKNOWN_VERB,\n E_MEDIA_UNKNOWN_ARG,\n E_MEDIA_BAD_ARG,\n E_MEDIA_MISSING_ARG,\n E_MEDIA_UNSUPPORTED_OP,\n E_MEDIA_ENGINE_REQUIRED,\n E_MEDIA_NOT_PIPE_EXPRESSIBLE,\n E_MEDIA_STEP_FAILED,\n E_MEDIA_STEP_UNAVAILABLE,\n} from './exceptions'\n\n/** Resolves a media-ref id to its payload — supplied by the consumer (or the agent forge). */\nexport type MediaRefResolver = (id: string) => StepPayload | Promise<StepPayload>\n\n/** Per-run options for `query`/`ops`. */\nexport interface RunOptions {\n /** Abort signal threaded into steps and engines. */\n signal?: AbortSignal\n /** Per-run media-ref resolution, overriding the construction-time resolver (the agent forge uses this to resolve `@id` refs against the current turn). */\n resolveRef?: MediaRefResolver\n}\n\n/** Configuration for {@link createMediaPipeline}. */\nexport interface MediaPipelineConfig {\n /**\n * The engine array, in priority order. Each entry is a {@link MediaEngine} instance or a\n * resolver returning one (async dynamic import is the canonical form). Engines self-declare\n * their capabilities; verbs whose capability has no provider are not advertised and fail\n * validation with a do-not-retry message if reached. Resolvers run eagerly at construction —\n * bundled engines stay cheap because their heavy peers lazy-load inside capability methods.\n */\n engines?: ReadonlyArray<EngineResolver<MediaEngine>>\n /**\n * Selection-middleware stages arbitrating dispatches where several engines can perform the\n * same transform. Stages may exclude or reorder candidates (quality heuristics, overrides);\n * array order among survivors always breaks the tie. Most deployments need none.\n */\n selection?: EngineSelectionMiddlewareFn[]\n /**\n * Consumer step interceptors wrapping every step — the documented seam for DLP/AV byte\n * scanning, caching (via `ctx.shortCircuit`), byte limits, and telemetry. The battery\n * ships no built-in scanner/cache/limiter.\n */\n use?: MediaStepMiddlewareFn[]\n /**\n * Resolves `@id` media refs (merge/diff/replace targets). Required only when chains use\n * multi-input verbs; the agent forge supplies a turn-state resolver automatically.\n */\n resolveRef?: MediaRefResolver\n}\n\n/**\n * The callable pipeline returned by {@link createMediaPipeline}: `mp(payload)` opens a\n * chainable builder; `mp.query(payload, q)` runs a pipe-string statement; `mp.ops(payload,\n * ops)` runs a JSON ops array. All three compile to the same plan and execute on the same\n * runtime.\n */\nexport interface MediaPipeline {\n /** Open a fresh chainable builder over `input`. */\n (input: StepPayload): MediaChain\n /** Parse, validate, and execute a pipe-string statement. */\n query(input: StepPayload, q: string, options?: RunOptions): Promise<PlanResult>\n /** Validate and execute a JSON ops array. */\n ops(input: StepPayload, ops: MediaOp[], options?: RunOptions): Promise<PlanResult>\n /** Validate a pipe string or ops array to a plan WITHOUT executing (dry-run/compile). */\n compile(statement: string | MediaOp[]): MediaPlan\n /** The deployment's capabilities (drives verb narrowing). */\n readonly capabilities: CapabilityProbe\n /** The resolved engines, in supply order — inspect ids and declared capabilities. */\n readonly engines: readonly MediaEngine[]\n}\n\nconst configSchema = validator\n .object({\n engines: validator\n .array()\n .items(validator.alternatives().try(validator.function(), validator.object().unknown(true)))\n .optional(),\n selection: validator.array().items(validator.function()).optional(),\n use: validator.array().items(validator.function()).optional(),\n resolveRef: validator.function().optional(),\n })\n .unknown(false)\n\n/** The Phase 0 step registry: pure steps available in every deployment. */\nconst PURE_STEPS: ReadonlyArray<[string, StepImpl]> = [\n ['select', selectStep],\n ['split', splitStep],\n ['merge', mergeStep],\n ['reorder', reorderStep],\n ['redact', redactStep],\n ['update_text', updateTextStep],\n ['diff', diffStep],\n ['apply_patch', applyPatchStep],\n ['extract.text', extractTextStep],\n ['extract.metadata', extractMetadataStep],\n ['chunk', chunkStep],\n ...SHEET_STEPS,\n ...SLIDES_STEPS,\n // DOC_STEPS + INGEST_STEPS override the Phase 0 text-only implementations with format dispatch.\n ...DOC_STEPS,\n ...INGEST_STEPS,\n ...IMAGE_AUDIO_STEPS,\n]\n\n/** Resolve one engine entry: invoke a resolver, unwrap `{default}`, guard-check the result. */\nconst resolveEngine = async (\n entry: EngineResolver<MediaEngine>,\n index: number\n): Promise<MediaEngine> => {\n let value: unknown = entry\n if (typeof value === 'function') {\n try {\n value = await (value as () => unknown)()\n } catch (err) {\n const detail = isError(err) ? err.message : String(err)\n throw new E_INVALID_MEDIA_PIPELINE_CONFIG([`engines[${index}] resolver failed: ${detail}`])\n }\n if (isObject(value) && 'default' in value && !implementsMediaEngine(value)) {\n value = (value as { default: unknown }).default\n }\n }\n if (!implementsMediaEngine(value)) {\n const candidate = value as { id?: unknown } | undefined\n const id = isObject(value) && typeof candidate?.id === 'string' ? ` (\"${candidate.id}\")` : ''\n throw new E_INVALID_MEDIA_PIPELINE_CONFIG([\n `engines[${index}]${id} does not implement the MediaEngine contract (a string id plus at least one well-formed converts/mutates capability entry)`,\n ])\n }\n return value\n}\n\n/**\n * Create a media pipeline.\n *\n * @remarks\n * Config is validated eagerly, and so are the engines: every resolver in the array runs at\n * construction (capability declarations drive verb narrowing, so they must be known up\n * front), each result is contract-checked, and failures throw\n * `E_INVALID_MEDIA_PIPELINE_CONFIG` naming the offending index. Construction stays cheap —\n * bundled engine modules import their heavy peer dependencies lazily inside capability\n * methods, on first actual use.\n *\n * @param config - Engines, selection stages, step interceptors, and the media-ref resolver.\n * @returns The callable {@link MediaPipeline}.\n */\nexport const createMediaPipeline = async (\n config: MediaPipelineConfig = {}\n): Promise<MediaPipeline> => {\n const { error } = configSchema.validate(config, { abortEarly: true })\n if (error) {\n throw new E_INVALID_MEDIA_PIPELINE_CONFIG([error.message])\n }\n const use = config.use ?? []\n const resolveRef: MediaRefResolver =\n config.resolveRef ??\n (() => {\n throw new E_INVALID_MEDIA_PIPELINE_CONFIG([\n 'this chain references another media (@id) but no resolveRef was configured',\n ])\n })\n\n const resolvedEngines = await Promise.all((config.engines ?? []).map(resolveEngine))\n const registry = buildEngineRegistry(resolvedEngines, config.selection ?? [])\n\n const steps = new Map<string, StepImpl>(PURE_STEPS)\n\n const run = async (\n input: StepPayload,\n plan: MediaPlan,\n options?: RunOptions\n ): Promise<PlanResult> => {\n const refResolver = options?.resolveRef ?? resolveRef\n return executePlan(plan, {\n input,\n steps,\n use,\n engines: registry,\n resolveRef: async (id) => refResolver(id),\n signal: options?.signal,\n })\n }\n\n const compile = (statement: string | MediaOp[]): MediaPlan =>\n typeof statement === 'string'\n ? validateSegments(parsePipeRaw(statement), { capabilities: registry })\n : validateOps(statement, { capabilities: registry })\n\n const callable = ((input: StepPayload): MediaChain => {\n return new MediaChain(async (ops) => {\n const plan = validateOps(ops, { capabilities: registry })\n return run(input, plan)\n })\n }) as MediaPipeline\n\n Object.defineProperties(callable, {\n query: {\n value: async (input: StepPayload, q: string, options?: RunOptions): Promise<PlanResult> => {\n const plan = validateSegments(parsePipeRaw(q), { capabilities: registry })\n return run(input, plan, options)\n },\n },\n ops: {\n value: async (\n input: StepPayload,\n ops: MediaOp[],\n options?: RunOptions\n ): Promise<PlanResult> => {\n const plan = validateOps(ops, { capabilities: registry })\n return run(input, plan, options)\n },\n },\n compile: { value: compile },\n capabilities: { value: registry },\n engines: { value: registry.engines },\n })\n\n return callable\n}\n"],"mappings":"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"}