@struktur/sdk 2.1.2 → 2.3.0

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 (200) hide show
  1. package/dist/artifacts/fileToArtifact.d.ts +8 -0
  2. package/dist/artifacts/fileToArtifact.d.ts.map +1 -0
  3. package/dist/artifacts/input.d.ts +60 -0
  4. package/dist/artifacts/input.d.ts.map +1 -0
  5. package/{src/artifacts/providers.ts → dist/artifacts/providers.d.ts} +2 -4
  6. package/dist/artifacts/providers.d.ts.map +1 -0
  7. package/dist/artifacts/urlToArtifact.d.ts +3 -0
  8. package/dist/artifacts/urlToArtifact.d.ts.map +1 -0
  9. package/dist/auth/config.d.ts +34 -0
  10. package/dist/auth/config.d.ts.map +1 -0
  11. package/dist/auth/tokens.d.ts +18 -0
  12. package/dist/auth/tokens.d.ts.map +1 -0
  13. package/dist/chunking/ArtifactBatcher.d.ts +11 -0
  14. package/dist/chunking/ArtifactBatcher.d.ts.map +1 -0
  15. package/dist/chunking/ArtifactSplitter.d.ts +10 -0
  16. package/dist/chunking/ArtifactSplitter.d.ts.map +1 -0
  17. package/dist/debug/logger.d.ts +169 -0
  18. package/dist/debug/logger.d.ts.map +1 -0
  19. package/dist/extract.d.ts +3 -0
  20. package/dist/extract.d.ts.map +1 -0
  21. package/dist/fields.d.ts +75 -0
  22. package/dist/fields.d.ts.map +1 -0
  23. package/dist/index.d.ts +24 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +5603 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/llm/LLMClient.d.ts +40 -0
  28. package/dist/llm/LLMClient.d.ts.map +1 -0
  29. package/dist/llm/RetryingRunner.d.ts +37 -0
  30. package/dist/llm/RetryingRunner.d.ts.map +1 -0
  31. package/dist/llm/message.d.ts +12 -0
  32. package/dist/llm/message.d.ts.map +1 -0
  33. package/dist/llm/models.d.ts +13 -0
  34. package/dist/llm/models.d.ts.map +1 -0
  35. package/dist/llm/resolveModel.d.ts +3 -0
  36. package/dist/llm/resolveModel.d.ts.map +1 -0
  37. package/dist/merge/Deduplicator.d.ts +4 -0
  38. package/dist/merge/Deduplicator.d.ts.map +1 -0
  39. package/dist/merge/SmartDataMerger.d.ts +7 -0
  40. package/dist/merge/SmartDataMerger.d.ts.map +1 -0
  41. package/dist/parsers/collect.d.ts +7 -0
  42. package/dist/parsers/collect.d.ts.map +1 -0
  43. package/{src/parsers/index.ts → dist/parsers/index.d.ts} +1 -0
  44. package/dist/parsers/index.d.ts.map +1 -0
  45. package/dist/parsers/mime.d.ts +12 -0
  46. package/dist/parsers/mime.d.ts.map +1 -0
  47. package/dist/parsers/npm.d.ts +16 -0
  48. package/dist/parsers/npm.d.ts.map +1 -0
  49. package/dist/parsers/pdf.d.ts +36 -0
  50. package/dist/parsers/pdf.d.ts.map +1 -0
  51. package/dist/parsers/runner.d.ts +4 -0
  52. package/dist/parsers/runner.d.ts.map +1 -0
  53. package/dist/parsers/types.d.ts +27 -0
  54. package/dist/parsers/types.d.ts.map +1 -0
  55. package/dist/parsers.d.ts +1 -0
  56. package/dist/parsers.js +492 -0
  57. package/dist/parsers.js.map +1 -0
  58. package/dist/prompts/DeduplicationPrompt.d.ts +5 -0
  59. package/dist/prompts/DeduplicationPrompt.d.ts.map +1 -0
  60. package/dist/prompts/ExtractorPrompt.d.ts +6 -0
  61. package/dist/prompts/ExtractorPrompt.d.ts.map +1 -0
  62. package/dist/prompts/ParallelMergerPrompt.d.ts +5 -0
  63. package/dist/prompts/ParallelMergerPrompt.d.ts.map +1 -0
  64. package/dist/prompts/SequentialExtractorPrompt.d.ts +6 -0
  65. package/dist/prompts/SequentialExtractorPrompt.d.ts.map +1 -0
  66. package/dist/prompts/formatArtifacts.d.ts +3 -0
  67. package/dist/prompts/formatArtifacts.d.ts.map +1 -0
  68. package/dist/strategies/DoublePassAutoMergeStrategy.d.ts +23 -0
  69. package/dist/strategies/DoublePassAutoMergeStrategy.d.ts.map +1 -0
  70. package/dist/strategies/DoublePassStrategy.d.ts +22 -0
  71. package/dist/strategies/DoublePassStrategy.d.ts.map +1 -0
  72. package/dist/strategies/ParallelAutoMergeStrategy.d.ts +27 -0
  73. package/dist/strategies/ParallelAutoMergeStrategy.d.ts.map +1 -0
  74. package/dist/strategies/ParallelStrategy.d.ts +22 -0
  75. package/dist/strategies/ParallelStrategy.d.ts.map +1 -0
  76. package/dist/strategies/SequentialAutoMergeStrategy.d.ts +22 -0
  77. package/dist/strategies/SequentialAutoMergeStrategy.d.ts.map +1 -0
  78. package/dist/strategies/SequentialStrategy.d.ts +20 -0
  79. package/dist/strategies/SequentialStrategy.d.ts.map +1 -0
  80. package/dist/strategies/SimpleStrategy.d.ts +18 -0
  81. package/dist/strategies/SimpleStrategy.d.ts.map +1 -0
  82. package/dist/strategies/agent/AgentStrategy.d.ts +44 -0
  83. package/dist/strategies/agent/AgentStrategy.d.ts.map +1 -0
  84. package/dist/strategies/agent/AgentTools.d.ts +55 -0
  85. package/dist/strategies/agent/AgentTools.d.ts.map +1 -0
  86. package/dist/strategies/agent/ArtifactFilesystem.d.ts +51 -0
  87. package/dist/strategies/agent/ArtifactFilesystem.d.ts.map +1 -0
  88. package/dist/strategies/agent/index.d.ts +4 -0
  89. package/dist/strategies/agent/index.d.ts.map +1 -0
  90. package/dist/strategies/concurrency.d.ts +2 -0
  91. package/dist/strategies/concurrency.d.ts.map +1 -0
  92. package/{src/strategies/index.ts → dist/strategies/index.d.ts} +2 -0
  93. package/dist/strategies/index.d.ts.map +1 -0
  94. package/dist/strategies/utils.d.ts +39 -0
  95. package/dist/strategies/utils.d.ts.map +1 -0
  96. package/dist/strategies.d.ts +1 -0
  97. package/dist/strategies.js +3930 -0
  98. package/dist/strategies.js.map +1 -0
  99. package/dist/tokenization.d.ts +11 -0
  100. package/dist/tokenization.d.ts.map +1 -0
  101. package/dist/types.d.ts +178 -0
  102. package/dist/types.d.ts.map +1 -0
  103. package/dist/validation/validator.d.ts +20 -0
  104. package/dist/validation/validator.d.ts.map +1 -0
  105. package/package.json +30 -14
  106. package/src/agent-cli-integration.test.ts +0 -47
  107. package/src/agent-export.test.ts +0 -17
  108. package/src/agent-tool-labels.test.ts +0 -50
  109. package/src/artifacts/AGENTS.md +0 -16
  110. package/src/artifacts/fileToArtifact.test.ts +0 -37
  111. package/src/artifacts/fileToArtifact.ts +0 -44
  112. package/src/artifacts/input.test.ts +0 -243
  113. package/src/artifacts/input.ts +0 -360
  114. package/src/artifacts/providers.test.ts +0 -19
  115. package/src/artifacts/urlToArtifact.test.ts +0 -23
  116. package/src/artifacts/urlToArtifact.ts +0 -19
  117. package/src/auth/AGENTS.md +0 -11
  118. package/src/auth/config.test.ts +0 -132
  119. package/src/auth/config.ts +0 -186
  120. package/src/auth/tokens.test.ts +0 -58
  121. package/src/auth/tokens.ts +0 -229
  122. package/src/chunking/AGENTS.md +0 -11
  123. package/src/chunking/ArtifactBatcher.test.ts +0 -22
  124. package/src/chunking/ArtifactBatcher.ts +0 -110
  125. package/src/chunking/ArtifactSplitter.test.ts +0 -38
  126. package/src/chunking/ArtifactSplitter.ts +0 -151
  127. package/src/debug/AGENTS.md +0 -79
  128. package/src/debug/logger.test.ts +0 -244
  129. package/src/debug/logger.ts +0 -211
  130. package/src/extract.test.ts +0 -22
  131. package/src/extract.ts +0 -150
  132. package/src/fields.test.ts +0 -681
  133. package/src/fields.ts +0 -246
  134. package/src/index.test.ts +0 -20
  135. package/src/index.ts +0 -110
  136. package/src/llm/AGENTS.md +0 -9
  137. package/src/llm/LLMClient.test.ts +0 -394
  138. package/src/llm/LLMClient.ts +0 -264
  139. package/src/llm/RetryingRunner.test.ts +0 -174
  140. package/src/llm/RetryingRunner.ts +0 -270
  141. package/src/llm/message.test.ts +0 -42
  142. package/src/llm/message.ts +0 -47
  143. package/src/llm/models.test.ts +0 -82
  144. package/src/llm/models.ts +0 -190
  145. package/src/llm/resolveModel.ts +0 -86
  146. package/src/merge/AGENTS.md +0 -6
  147. package/src/merge/Deduplicator.test.ts +0 -108
  148. package/src/merge/Deduplicator.ts +0 -45
  149. package/src/merge/SmartDataMerger.test.ts +0 -177
  150. package/src/merge/SmartDataMerger.ts +0 -56
  151. package/src/parsers/AGENTS.md +0 -58
  152. package/src/parsers/collect.test.ts +0 -56
  153. package/src/parsers/collect.ts +0 -31
  154. package/src/parsers/mime.test.ts +0 -91
  155. package/src/parsers/mime.ts +0 -137
  156. package/src/parsers/npm.ts +0 -26
  157. package/src/parsers/pdf.test.ts +0 -394
  158. package/src/parsers/pdf.ts +0 -194
  159. package/src/parsers/runner.test.ts +0 -95
  160. package/src/parsers/runner.ts +0 -177
  161. package/src/parsers/types.ts +0 -29
  162. package/src/prompts/AGENTS.md +0 -8
  163. package/src/prompts/DeduplicationPrompt.test.ts +0 -41
  164. package/src/prompts/DeduplicationPrompt.ts +0 -37
  165. package/src/prompts/ExtractorPrompt.test.ts +0 -21
  166. package/src/prompts/ExtractorPrompt.ts +0 -72
  167. package/src/prompts/ParallelMergerPrompt.test.ts +0 -8
  168. package/src/prompts/ParallelMergerPrompt.ts +0 -37
  169. package/src/prompts/SequentialExtractorPrompt.test.ts +0 -24
  170. package/src/prompts/SequentialExtractorPrompt.ts +0 -82
  171. package/src/prompts/formatArtifacts.test.ts +0 -39
  172. package/src/prompts/formatArtifacts.ts +0 -46
  173. package/src/strategies/AGENTS.md +0 -6
  174. package/src/strategies/DoublePassAutoMergeStrategy.test.ts +0 -53
  175. package/src/strategies/DoublePassAutoMergeStrategy.ts +0 -410
  176. package/src/strategies/DoublePassStrategy.test.ts +0 -48
  177. package/src/strategies/DoublePassStrategy.ts +0 -266
  178. package/src/strategies/ParallelAutoMergeStrategy.test.ts +0 -152
  179. package/src/strategies/ParallelAutoMergeStrategy.ts +0 -345
  180. package/src/strategies/ParallelStrategy.test.ts +0 -61
  181. package/src/strategies/ParallelStrategy.ts +0 -208
  182. package/src/strategies/SequentialAutoMergeStrategy.test.ts +0 -66
  183. package/src/strategies/SequentialAutoMergeStrategy.ts +0 -325
  184. package/src/strategies/SequentialStrategy.test.ts +0 -53
  185. package/src/strategies/SequentialStrategy.ts +0 -142
  186. package/src/strategies/SimpleStrategy.test.ts +0 -46
  187. package/src/strategies/SimpleStrategy.ts +0 -94
  188. package/src/strategies/concurrency.test.ts +0 -16
  189. package/src/strategies/concurrency.ts +0 -14
  190. package/src/strategies/index.test.ts +0 -20
  191. package/src/strategies/utils.test.ts +0 -76
  192. package/src/strategies/utils.ts +0 -95
  193. package/src/tokenization.test.ts +0 -119
  194. package/src/tokenization.ts +0 -71
  195. package/src/types.test.ts +0 -25
  196. package/src/types.ts +0 -174
  197. package/src/validation/AGENTS.md +0 -7
  198. package/src/validation/validator.test.ts +0 -204
  199. package/src/validation/validator.ts +0 -90
  200. package/tsconfig.json +0 -22
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/parsers/collect.ts","../src/parsers/pdf.ts","../src/fields.ts","../src/extract.ts","../src/artifacts/urlToArtifact.ts","../src/artifacts/providers.ts","../src/artifacts/fileToArtifact.ts","../src/validation/validator.ts","../src/parsers/runner.ts","../src/artifacts/input.ts","../src/parsers/mime.ts","../src/prompts/formatArtifacts.ts","../src/prompts/ExtractorPrompt.ts","../src/tokenization.ts","../src/chunking/ArtifactSplitter.ts","../src/chunking/ArtifactBatcher.ts","../src/llm/message.ts","../src/llm/LLMClient.ts","../src/llm/RetryingRunner.ts","../src/strategies/utils.ts","../src/strategies/SimpleStrategy.ts","../src/prompts/ParallelMergerPrompt.ts","../src/strategies/concurrency.ts","../src/strategies/ParallelStrategy.ts","../src/prompts/SequentialExtractorPrompt.ts","../src/strategies/SequentialStrategy.ts","../src/prompts/DeduplicationPrompt.ts","../src/merge/SmartDataMerger.ts","../src/merge/Deduplicator.ts","../src/strategies/ParallelAutoMergeStrategy.ts","../src/strategies/SequentialAutoMergeStrategy.ts","../src/strategies/DoublePassStrategy.ts","../src/strategies/DoublePassAutoMergeStrategy.ts","../src/strategies/agent/AgentStrategy.ts","../src/strategies/agent/ArtifactFilesystem.ts","../src/strategies/agent/AgentTools.ts","../src/index.ts","../src/debug/logger.ts","../src/auth/tokens.ts","../src/llm/models.ts","../src/llm/resolveModel.ts","../src/auth/config.ts"],"sourcesContent":["/**\n * Collects a ReadableStream<Uint8Array> into a Buffer.\n * Uses Web Streams API — compatible with Bun and Node 18+.\n * Exported as a public utility for npm parser authors.\n */\nexport async function collectStream(stream: ReadableStream<Uint8Array>): Promise<Buffer> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return Buffer.from(result);\n}\n","import type { Artifact, ArtifactContent, ArtifactImage } from \"../types\";\nimport { collectStream } from \"./collect\";\n\nexport type ParsePdfOptions = {\n /**\n * Whether to extract embedded images from each page and include them as\n * base64-encoded ArtifactImage entries in the media field.\n * Defaults to true. Pass false to skip image extraction entirely.\n */\n includeImages?: boolean;\n /**\n * Whether to render page screenshots and include them as ArtifactImage entries.\n * When true, each page is rendered to a PNG image and added to the media field.\n * Defaults to false.\n */\n screenshots?: boolean;\n /**\n * Scale factor for screenshots. Higher values produce larger, higher-quality images.\n * Defaults to 1.5.\n */\n screenshotScale?: number;\n /**\n * Target width in pixels for screenshots. If specified, takes precedence over screenshotScale.\n * Height is calculated to maintain aspect ratio.\n */\n screenshotWidth?: number;\n};\n\n/**\n * Built-in PDF parser using pdf-parse.\n *\n * Accepts a Buffer or ReadableStream<Uint8Array> and extracts text per-page\n * into ArtifactContent[] with page numbers set. Embedded images on each page\n * are extracted and included as base64-encoded ArtifactImage entries in the\n * media field of the corresponding content block (unless includeImages is\n * false). Returns an Artifact with type: \"pdf\".\n */\nexport async function parsePdf(\n input: Buffer | ReadableStream<Uint8Array>,\n options?: ParsePdfOptions,\n): Promise<Artifact> {\n const buffer = Buffer.isBuffer(input) ? input : await collectStream(input);\n\n // Dynamic import to avoid bundling issues\n const { PDFParse } = await import(\"pdf-parse\");\n\n const parser = new PDFParse({ data: buffer });\n const textResult = await parser.getText();\n\n // Build a page-number → text map from per-page results\n const pageTextMap = new Map<number, string>();\n if (textResult.pages.length > 0) {\n for (const page of textResult.pages) {\n if (page.text && page.text.trim().length > 0) {\n pageTextMap.set(page.num, page.text);\n }\n }\n }\n\n // Extract embedded images unless the caller opted out.\n // imageBuffer=false saves memory (we only need the data URL).\n let imageResult;\n if (options?.includeImages !== false) {\n try {\n imageResult = await parser.getImage({ imageBuffer: false, imageDataUrl: true });\n } catch {\n // Image extraction is optional — continue without images if it fails\n }\n }\n\n // Render page screenshots if requested\n let screenshotResult;\n if (options?.screenshots === true) {\n try {\n const screenshotParams: {\n imageBuffer: boolean;\n imageDataUrl: boolean;\n scale?: number;\n desiredWidth?: number;\n } = { imageBuffer: false, imageDataUrl: true };\n \n if (options.screenshotWidth !== undefined) {\n screenshotParams.desiredWidth = options.screenshotWidth;\n } else {\n screenshotParams.scale = options.screenshotScale ?? 1.5;\n }\n \n screenshotResult = await parser.getScreenshot(screenshotParams);\n } catch {\n // Screenshot rendering is optional — continue without screenshots if it fails\n }\n }\n\n // Build a page-number → ArtifactImage[] map from extracted images\n const pageImageMap = new Map<number, ArtifactImage[]>();\n if (imageResult) {\n for (const pageImages of imageResult.pages) {\n const artifactImages: ArtifactImage[] = pageImages.images\n .filter((img) => img.dataUrl)\n .map((img) => {\n // Strip the \"data:<mime>;base64,\" prefix to get the raw base64 string\n const base64 = img.dataUrl.replace(/^data:[^;]+;base64,/, \"\");\n const artifactImage: ArtifactImage = {\n type: \"image\",\n base64,\n width: img.width,\n height: img.height,\n imageType: \"embedded\",\n };\n return artifactImage;\n });\n if (artifactImages.length > 0) {\n pageImageMap.set(pageImages.pageNumber, artifactImages);\n }\n }\n }\n\n // Add screenshots to the pageImageMap\n if (screenshotResult) {\n for (const screenshot of screenshotResult.pages) {\n if (screenshot.dataUrl) {\n // Strip the \"data:<mime>;base64,\" prefix to get the raw base64 string\n const base64 = screenshot.dataUrl.replace(/^data:[^;]+;base64,/, \"\");\n const artifactImage: ArtifactImage = {\n type: \"image\",\n base64,\n width: screenshot.width,\n height: screenshot.height,\n imageType: \"screenshot\",\n };\n // Append to existing images for this page, or create new entry\n const existing = pageImageMap.get(screenshot.pageNumber) ?? [];\n pageImageMap.set(screenshot.pageNumber, [...existing, artifactImage]);\n }\n }\n }\n\n let contents: ArtifactContent[];\n\n if (textResult.pages.length > 0) {\n // Collect all page numbers that have text or images\n const allPageNums = new Set<number>([\n ...pageTextMap.keys(),\n ...pageImageMap.keys(),\n ]);\n\n contents = Array.from(allPageNums)\n .sort((a, b) => a - b)\n .map((pageNum) => {\n const entry: ArtifactContent = { page: pageNum };\n const text = pageTextMap.get(pageNum);\n if (text) entry.text = text;\n const media = pageImageMap.get(pageNum);\n if (media) entry.media = media;\n return entry;\n });\n } else {\n // Fallback: no per-page info — use full concatenated text\n const entry: ArtifactContent = { text: textResult.text };\n // Attach any images from the first page if available\n const firstPageImages = pageImageMap.size > 0\n ? pageImageMap.values().next().value\n : undefined;\n if (firstPageImages) entry.media = firstPageImages;\n contents = [entry];\n }\n\n // Ensure we have at least one content entry\n if (contents.length === 0) {\n contents = [{ text: \"\" }];\n }\n\n let infoResult;\n try {\n infoResult = await parser.getInfo();\n } catch {\n // Info extraction is optional\n }\n\n await parser.destroy();\n\n return {\n id: `artifact-${crypto.randomUUID()}`,\n type: \"pdf\",\n raw: async () => buffer,\n contents,\n metadata: infoResult\n ? {\n numpages: textResult.total,\n info: infoResult,\n }\n : { numpages: textResult.total },\n };\n}\n","/**\n * fields.ts — Shorthand schema builder.\n *\n * Parses a comma-separated fields string into a minimal JSON Schema object.\n * Supported type expressions:\n *\n * string (default) title\n * number / float price:number or price:float\n * boolean / bool active:boolean or active:bool\n * integer count:integer\n * int count:int (integer + multipleOf:1 to disallow fractions)\n * enum status:enum{draft|published|archived}\n * array of scalar tags:array{string}\n * array (shorthand) tags:array (defaults to array{string})\n *\n * Aliases:\n * bool → boolean\n * float → number\n * int → integer (with multipleOf: 1)\n *\n * Examples:\n * parseFieldsString(\"title, description\")\n * parseFieldsString(\"title, price:number\")\n * parseFieldsString(\"title , price: number , active:boolean\")\n * parseFieldsString(\"name, status:enum{draft|published}\")\n * parseFieldsString(\"name, tags:array{string}\")\n * parseFieldsString(\"name, tags:array\")\n * parseFieldsString(\"count:int, ratio:float, enabled:bool\")\n */\n\nimport type { AnyJSONSchema } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ScalarFieldType = \"string\" | \"number\" | \"boolean\" | \"integer\" | \"int\";\n\nexport type ParsedField =\n | { name: string; kind: \"scalar\"; type: ScalarFieldType }\n | { name: string; kind: \"enum\"; values: string[] }\n | { name: string; kind: \"array\"; items: ScalarFieldType };\n\n/** Legacy alias kept for backwards compatibility */\nexport type FieldType = ScalarFieldType;\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst SCALAR_TYPES: ReadonlySet<string> = new Set([\n \"string\",\n \"number\",\n \"boolean\",\n \"integer\",\n \"int\",\n]);\n\n/** Maps alias → canonical type accepted by this parser. */\nconst SCALAR_ALIASES: Readonly<Record<string, ScalarFieldType>> = {\n bool: \"boolean\",\n float: \"number\",\n // Note: \"int\" stays as \"int\" (not aliased to \"integer\") so the schema\n // builder can emit the extra multipleOf:1 constraint.\n};\n\n// ---------------------------------------------------------------------------\n// Internal parser helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Extract the content inside `prefix{...}` from a raw type string.\n * Returns `null` if the pattern doesn't match.\n */\nconst extractBraces = (\n rawType: string,\n prefix: string,\n): string | null => {\n if (!rawType.startsWith(prefix + \"{\") || !rawType.endsWith(\"}\")) {\n return null;\n }\n return rawType.slice(prefix.length + 1, -1);\n};\n\nconst parseScalarType = (raw: string, fieldName: string): ScalarFieldType => {\n // Resolve aliases first.\n const resolved: string = SCALAR_ALIASES[raw] ?? raw;\n if (!SCALAR_TYPES.has(resolved)) {\n const allNames = [...Object.keys(SCALAR_ALIASES), ...SCALAR_TYPES].sort();\n throw new Error(\n `Unknown type \"${raw}\" for field \"${fieldName}\". ` +\n `Scalar types: ${allNames.join(\", \")}. ` +\n `Complex types: enum{a|b|c}, array{string}, or array (shorthand for array{string}).`,\n );\n }\n return resolved as ScalarFieldType;\n};\n\n/**\n * Parse a single `name` or `name:type` token into a ParsedField.\n * Trims whitespace from name and type expression.\n */\nconst parseField = (token: string): ParsedField => {\n const colonIndex = token.indexOf(\":\");\n\n if (colonIndex === -1) {\n const name = token.trim();\n if (!name) throw new Error(\"Empty field name in fields string.\");\n return { name, kind: \"scalar\", type: \"string\" };\n }\n\n const name = token.slice(0, colonIndex).trim();\n const rawType = token.slice(colonIndex + 1).trim();\n\n if (!name) {\n throw new Error(`Empty field name before colon in token: \"${token}\".`);\n }\n if (!rawType) {\n throw new Error(\n `Empty type after colon for field \"${name}\". ` +\n `Omit the colon or specify a type.`,\n );\n }\n\n // enum{a|b|c}\n const enumContent = extractBraces(rawType, \"enum\");\n if (enumContent !== null) {\n const values = enumContent.split(\"|\").map((v) => v.trim()).filter(Boolean);\n if (values.length < 2) {\n throw new Error(\n `enum for field \"${name}\" must have at least two values separated by \"|\", got: \"${enumContent}\".`,\n );\n }\n return { name, kind: \"enum\", values };\n }\n\n // array{itemType}\n const arrayContent = extractBraces(rawType, \"array\");\n if (arrayContent !== null) {\n const itemType = arrayContent.trim();\n if (!itemType) {\n throw new Error(\n `array for field \"${name}\" requires an item type, e.g. array{string}.`,\n );\n }\n return { name, kind: \"array\", items: parseScalarType(itemType, name) };\n }\n\n // array (shorthand for array{string})\n if (rawType === \"array\") {\n return { name, kind: \"array\", items: \"string\" };\n }\n\n // plain scalar\n return { name, kind: \"scalar\", type: parseScalarType(rawType, name) };\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a comma-separated fields string into an array of ParsedField entries.\n *\n * @example\n * parseFieldsString(\"title, price:number\")\n * // => [{ name: \"title\", kind: \"scalar\", type: \"string\" }, { name: \"price\", kind: \"scalar\", type: \"number\" }]\n *\n * parseFieldsString(\"status:enum{draft|published}\")\n * // => [{ name: \"status\", kind: \"enum\", values: [\"draft\", \"published\"] }]\n *\n * parseFieldsString(\"tags:array{string}\")\n * // => [{ name: \"tags\", kind: \"array\", items: \"string\" }]\n */\nexport const parseFieldsString = (fields: string): ParsedField[] => {\n if (!fields.trim()) {\n throw new Error(\"Fields string must not be empty.\");\n }\n\n // Split on commas that are NOT inside braces so enum{a|b,c} would still\n // work if someone added commas — but per spec values use |, so a simple\n // brace-depth split is sufficient and keeps things robust.\n const tokens: string[] = [];\n let depth = 0;\n let current = \"\";\n for (const ch of fields) {\n if (ch === \"{\") { depth++; current += ch; }\n else if (ch === \"}\") { depth--; current += ch; }\n else if (ch === \",\" && depth === 0) { tokens.push(current); current = \"\"; }\n else { current += ch; }\n }\n if (current) tokens.push(current);\n\n if (depth !== 0) {\n throw new Error(\"Unmatched braces in fields string.\");\n }\n\n return tokens.map((token) => parseField(token));\n};\n\n/**\n * Build a minimal JSON Schema `object` from a parsed fields array.\n * All fields are required; additionalProperties is false.\n */\nexport const buildSchemaFromParsedFields = (\n fields: ParsedField[],\n): AnyJSONSchema => {\n if (fields.length === 0) {\n throw new Error(\"Cannot build a schema from an empty fields list.\");\n }\n\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const field of fields) {\n if (field.kind === \"scalar\") {\n properties[field.name] = field.type === \"int\"\n ? { type: \"integer\", multipleOf: 1 }\n : { type: field.type };\n } else if (field.kind === \"enum\") {\n properties[field.name] = { type: \"string\", enum: field.values };\n } else {\n // array\n properties[field.name] = { type: \"array\", items: field.items === \"int\" ? { type: \"integer\", multipleOf: 1 } : { type: field.items } };\n }\n required.push(field.name);\n }\n\n return {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n };\n};\n\n/**\n * Convenience: parse a fields string and immediately build a JSON Schema.\n *\n * @example\n * buildSchemaFromFields(\"title, price:number\")\n * buildSchemaFromFields(\"status:enum{draft|published|archived}\")\n * buildSchemaFromFields(\"tags:array{string}\")\n */\nexport const buildSchemaFromFields = (fields: string): AnyJSONSchema =>\n buildSchemaFromParsedFields(parseFieldsString(fields));\n","import type { ExtractionOptions, ExtractionResult } from \"./types\";\nimport { buildSchemaFromFields } from \"./fields\";\nimport type { TelemetryAdapter } from \"./types\";\n\nconst emptyUsage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n\nconst safeShutdown = async (telemetry: TelemetryAdapter | null | undefined): Promise<void> => {\n if (!telemetry) return;\n try {\n await telemetry.shutdown();\n } catch {\n // Ignore telemetry shutdown errors\n }\n};\n\nconst safeEndSpan = (\n telemetry: TelemetryAdapter | null | undefined,\n span: { id: string } | undefined,\n result: { status: \"ok\" | \"error\"; error?: Error; output?: unknown }\n): void => {\n if (!telemetry || !span) return;\n try {\n telemetry.endSpan(span, result);\n } catch {\n // Ignore telemetry span errors\n }\n};\n\n/**\n * Resolve and validate the schema from ExtractionOptions.\n * Exactly one of `schema` or `fields` must be provided.\n */\nconst resolveSchema = <T>(options: ExtractionOptions<T>) => {\n const hasSchema = options.schema !== undefined;\n const hasFields = options.fields !== undefined;\n\n if (hasSchema && hasFields) {\n throw new Error(\n \"Provide either `schema` or `fields`, not both. They are mutually exclusive.\",\n );\n }\n\n if (!hasSchema && !hasFields) {\n throw new Error(\n \"A schema definition is required. Provide `schema` (a JSON Schema object) or `fields` (a shorthand fields string).\",\n );\n }\n\n if (hasFields) {\n return buildSchemaFromFields(options.fields as string);\n }\n\n return options.schema as NonNullable<typeof options.schema>;\n};\n\nexport const extract = async <T>(\n options: ExtractionOptions<T>,\n): Promise<ExtractionResult<T>> => {\n const debug = options.debug;\n let telemetry = options.telemetry;\n\n // Initialize telemetry if provided, gracefully handle failures\n if (telemetry) {\n try {\n await telemetry.initialize();\n } catch (error) {\n console.error(\"Telemetry initialization failed, continuing without telemetry:\", (error as Error).message);\n telemetry = undefined;\n }\n }\n\n // Start root extraction span\n const rootSpan = telemetry?.startSpan({\n name: \"struktur.extract\",\n kind: \"CHAIN\",\n attributes: {\n \"extraction.strategy\": options.strategy?.name ?? \"default\",\n \"extraction.artifacts.count\": options.artifacts.length,\n },\n });\n\n try {\n // Validate mutual exclusion and resolve the concrete schema early so that\n // every strategy receives a fully-populated options object.\n let resolvedOptions: ExtractionOptions<T>;\n try {\n const schema = resolveSchema(options);\n resolvedOptions = { ...options, schema };\n } catch (error) {\n debug?.extractionComplete({\n success: false,\n totalInputTokens: 0,\n totalOutputTokens: 0,\n totalTokens: 0,\n error: (error as Error).message,\n });\n\n safeEndSpan(telemetry, rootSpan, {\n status: \"error\",\n error: error as Error,\n });\n await safeShutdown(telemetry);\n\n return {\n data: null as unknown as T,\n usage: emptyUsage,\n error: error as Error,\n };\n }\n\n const total = resolvedOptions.strategy.getEstimatedSteps?.(resolvedOptions.artifacts);\n\n debug?.strategyRunStart({\n strategy: resolvedOptions.strategy.name,\n estimatedSteps: total ?? 1,\n artifactCount: resolvedOptions.artifacts.length,\n });\n\n await resolvedOptions.events?.onStep?.({ step: 1, total, label: \"start\" });\n debug?.step({\n step: 1,\n total,\n label: \"start\",\n strategy: resolvedOptions.strategy.name,\n });\n\n const result = await resolvedOptions.strategy.run(resolvedOptions);\n\n await resolvedOptions.events?.onStep?.({\n step: total ?? 1,\n total,\n label: \"complete\",\n });\n debug?.step({\n step: total ?? 1,\n total,\n label: \"complete\",\n strategy: resolvedOptions.strategy.name,\n });\n\n debug?.extractionComplete({\n success: !result.error,\n totalInputTokens: result.usage.inputTokens,\n totalOutputTokens: result.usage.outputTokens,\n totalTokens: result.usage.totalTokens,\n error: result.error?.message,\n });\n\n safeEndSpan(telemetry, rootSpan, {\n status: result.error ? \"error\" : \"ok\",\n output: result.data,\n error: result.error,\n });\n await safeShutdown(telemetry);\n\n return result;\n } catch (error) {\n debug?.extractionComplete({\n success: false,\n totalInputTokens: 0,\n totalOutputTokens: 0,\n totalTokens: 0,\n error: (error as Error).message,\n });\n\n safeEndSpan(telemetry, rootSpan, {\n status: \"error\",\n error: error as Error,\n });\n await safeShutdown(telemetry);\n\n return {\n data: null as unknown as T,\n usage: emptyUsage,\n error: error as Error,\n };\n }\n};\n","import type { Artifact } from \"../types\";\n\nexport const urlToArtifact = async (url: string): Promise<Artifact> => {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch artifact: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as Omit<Artifact, \"raw\"> & {\n raw?: () => Promise<Buffer>;\n };\n\n return {\n ...data,\n raw:\n data.raw ??\n (async () => Buffer.from(JSON.stringify(data.contents ?? []))),\n };\n};\n","import type { Artifact } from \"../types\";\n\nexport type ArtifactProvider = (buffer: Buffer) => Promise<Artifact>;\n\nexport type ArtifactProviders = Record<string, ArtifactProvider>;\n\nexport const defaultArtifactProviders: ArtifactProviders = {};\n","import type { Artifact } from \"../types\";\nimport { defaultArtifactProviders, type ArtifactProviders } from \"./providers\";\n\nexport type FileToArtifactOptions = {\n mimeType: string;\n providers?: ArtifactProviders;\n};\n\nconst bufferToTextArtifact = (buffer: Buffer): Artifact => ({\n id: `artifact-${crypto.randomUUID()}`,\n type: \"text\",\n raw: async () => buffer,\n contents: [{ text: buffer.toString() }],\n});\n\nconst bufferToImageArtifact = (buffer: Buffer): Artifact => ({\n id: `artifact-${crypto.randomUUID()}`,\n type: \"image\",\n raw: async () => buffer,\n contents: [{ media: [{ type: \"image\", contents: buffer }] }],\n});\n\nexport const fileToArtifact = async (\n buffer: Buffer,\n options: FileToArtifactOptions\n): Promise<Artifact> => {\n const providers = options.providers ?? defaultArtifactProviders;\n const provider = providers[options.mimeType];\n if (provider) {\n return provider(buffer);\n }\n\n if (options.mimeType.startsWith(\"text/\")) {\n return bufferToTextArtifact(buffer);\n }\n\n if (options.mimeType.startsWith(\"image/\")) {\n return bufferToImageArtifact(buffer);\n }\n\n throw new Error(\n `No artifact provider registered for ${options.mimeType}`\n );\n};\n","import Ajv, { type AnySchema, type ErrorObject, type JSONSchemaType } from \"ajv\";\nimport addFormats from \"ajv-formats\";\n\nexport type ValidationErrors = ErrorObject[];\n\nexport type ValidationMode = 'strict' | 'lenient';\n\nexport type ValidationResult<T> = \n | { valid: true; data: T }\n | { valid: false; errors: ErrorObject[] };\n\nexport class SchemaValidationError extends Error {\n public readonly errors: ValidationErrors;\n\n constructor(message: string, errors: ValidationErrors) {\n super(message);\n this.name = \"SchemaValidationError\";\n this.errors = errors;\n }\n}\n\nconst ARTIFACT_ID_PATTERN = /^artifact:[^/]+\\/images\\/image\\d+\\.\\w+$/;\n\nexport const createAjv = () => {\n const ajv = new Ajv({\n allErrors: true,\n strict: false,\n allowUnionTypes: true,\n });\n addFormats(ajv);\n \n ajv.addFormat(\"artifact-id\", {\n type: \"string\",\n validate: (data: string) => ARTIFACT_ID_PATTERN.test(data),\n });\n \n return ajv;\n};\n\nexport type SchemaInput<T> = JSONSchemaType<T> | AnySchema;\n\nexport const validateOrThrow = <T>(\n ajv: Ajv,\n schema: SchemaInput<T>,\n data: unknown\n): T => {\n const validate = ajv.compile<T>(schema);\n const valid = validate(data);\n\n if (!valid) {\n const errors = validate.errors ?? [];\n const message = \"Schema validation failed\";\n throw new SchemaValidationError(message, errors);\n }\n\n return data as T;\n};\n\nexport const isRequiredError = (error: ErrorObject): boolean => {\n return error.keyword === \"required\";\n};\n\nexport const validateAllowingMissingRequired = <T>(\n ajv: Ajv,\n schema: SchemaInput<T>,\n data: unknown,\n isFinalAttempt: boolean = true\n): ValidationResult<T> => {\n const validate = ajv.compile<T>(schema);\n const valid = validate(data);\n\n if (valid) {\n return { valid: true, data: data as T };\n }\n\n const errors = validate.errors ?? [];\n const nonRequiredErrors = errors.filter((error) => !isRequiredError(error));\n\n if (nonRequiredErrors.length === 0) {\n // Only required field errors\n // On final attempt, accept partial data\n // On non-final attempts, return invalid to trigger retry\n if (isFinalAttempt) {\n return { valid: true, data: data as T };\n }\n return { valid: false, errors };\n }\n\n return { valid: false, errors: nonRequiredErrors };\n};\n","import os from \"node:os\";\nimport path from \"node:path\";\nimport { rm, writeFile, readFile } from \"node:fs/promises\";\nimport { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { Artifact } from \"../types\";\nimport type { ParserDef, ParserInput } from \"./types\";\nimport type { NpmParserModule } from \"./npm\";\nimport {\n hydrateSerializedArtifacts,\n validateSerializedArtifacts,\n} from \"../artifacts/input\";\n\nconst execAsync = promisify(exec);\n\nconst parseCommandOutput = (stdout: string): Artifact[] => {\n let parsed: unknown;\n try {\n parsed = JSON.parse(stdout);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Parser command produced invalid JSON: ${message}\\nOutput: ${stdout.slice(0, 200)}`);\n }\n const serialized = validateSerializedArtifacts(parsed);\n return hydrateSerializedArtifacts(serialized);\n};\n\nconst spawnAndCapture = async (command: string, stdinBuffer?: Buffer): Promise<string> => {\n if (!command.trim()) {\n throw new Error(`Empty command: ${command}`);\n }\n\n try {\n const options = stdinBuffer\n ? { input: stdinBuffer.toString(), maxBuffer: 50 * 1024 * 1024 }\n : { maxBuffer: 50 * 1024 * 1024 };\n const { stdout } = await execAsync(command, options);\n return stdout;\n } catch (error) {\n if (error instanceof Error && \"stderr\" in error) {\n const stderr = (error as { stderr: string }).stderr;\n throw new Error(\n `Parser command failed: ${command}\\nStderr: ${stderr?.slice(0, 500) ?? \"\"}`\n );\n }\n throw error;\n }\n};\n\nconst runNpmParser = async (\n pkg: string,\n input: ParserInput,\n mimeType: string,\n): Promise<Artifact[]> => {\n const mod = (await import(pkg)) as NpmParserModule;\n\n const hasParseFile = typeof mod.parseFile === \"function\";\n const hasParseStream = typeof mod.parseStream === \"function\";\n\n if (!hasParseFile && !hasParseStream) {\n throw new Error(\n `npm parser package \"${pkg}\" exports neither parseFile nor parseStream`\n );\n }\n\n if (input.kind === \"file\") {\n // Prefer parseFile for zero-copy\n if (hasParseFile) {\n return mod.parseFile!(input.path, mimeType);\n }\n // Fallback: open file as stream\n const { createReadStream } = await import(\"node:fs\");\n const { Readable } = await import(\"node:stream\");\n const nodeStream = createReadStream(input.path);\n const stream = Readable.toWeb(nodeStream) as ReadableStream<Uint8Array>;\n return mod.parseStream!(stream, mimeType);\n }\n\n // input.kind === \"buffer\"\n if (hasParseStream) {\n // Prefer parseStream for buffers\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(input.buffer);\n controller.close();\n },\n });\n return mod.parseStream!(stream, mimeType);\n }\n\n // Fallback: write buffer to temp file, call parseFile, clean up\n const tmpFile = path.join(os.tmpdir(), `struktur-parse-${crypto.randomUUID()}`);\n try {\n await writeFile(tmpFile, input.buffer);\n return await mod.parseFile!(tmpFile, mimeType);\n } finally {\n await rm(tmpFile, { force: true });\n }\n};\n\nconst runCommandFileParser = async (\n command: string,\n input: ParserInput,\n): Promise<Artifact[]> => {\n let filePath: string;\n let tempFile: string | null = null;\n\n if (input.kind === \"file\") {\n filePath = input.path;\n } else {\n // Write buffer to temp file\n tempFile = path.join(os.tmpdir(), `struktur-parse-${crypto.randomUUID()}`);\n await writeFile(tempFile, input.buffer);\n filePath = tempFile;\n }\n\n try {\n const interpolated = command.replace(/FILE_PATH/g, filePath);\n const stdout = await spawnAndCapture(interpolated);\n return parseCommandOutput(stdout);\n } finally {\n if (tempFile) {\n await rm(tempFile, { force: true });\n }\n }\n};\n\nconst runCommandStdinParser = async (\n command: string,\n input: ParserInput,\n): Promise<Artifact[]> => {\n let buffer: Buffer;\n\n if (input.kind === \"file\") {\n buffer = await readFile(input.path);\n } else {\n buffer = input.buffer;\n }\n\n const stdout = await spawnAndCapture(command, buffer);\n return parseCommandOutput(stdout);\n};\n\nexport const runParser = async (\n def: ParserDef,\n input: ParserInput,\n mimeType: string,\n): Promise<Artifact[]> => {\n switch (def.type) {\n case \"npm\":\n return runNpmParser(def.package, input, mimeType);\n case \"command-file\":\n return runCommandFileParser(def.command, input);\n case \"command-stdin\":\n return runCommandStdinParser(def.command, input);\n case \"inline\": {\n let buffer: Buffer;\n if (input.kind === \"file\") {\n buffer = await readFile(input.path);\n } else {\n buffer = input.buffer;\n }\n return [await def.handler(buffer)];\n }\n default: {\n const _exhaustive: never = def;\n throw new Error(`Unknown parser type: ${(_exhaustive as { type: string }).type}`);\n }\n }\n};\n","import type { Artifact, ArtifactContent, ArtifactImage, ArtifactType } from \"../types\";\nimport { createAjv, validateOrThrow } from \"../validation/validator\";\nimport { defaultArtifactProviders, type ArtifactProviders } from \"./providers\";\nimport type { ParsersConfig } from \"../parsers/types\";\nimport { runParser } from \"../parsers/runner\";\nimport type { ParsePdfOptions } from \"../parsers/pdf\";\nimport { readFile } from \"node:fs/promises\";\nimport { detectMimeType } from \"../parsers/mime\";\n\nexport type SerializedArtifactImage = Omit<ArtifactImage, \"contents\"> & {\n contents?: never;\n};\n\nexport type SerializedArtifactContent = Omit<ArtifactContent, \"media\"> & {\n media?: SerializedArtifactImage[];\n};\n\nexport type SerializedArtifact = Omit<Artifact, \"raw\" | \"contents\"> & {\n contents: SerializedArtifactContent[];\n raw?: never;\n};\n\nexport type SerializedArtifacts = SerializedArtifact | SerializedArtifact[];\n\nexport type ArtifactInput =\n | { kind: \"artifact-json\"; data: unknown }\n | { kind: \"text\"; text: string; id?: string }\n | { kind: \"file\"; path: string; mimeType?: string; id?: string }\n | { kind: \"buffer\"; buffer: Buffer; mimeType: string; id?: string };\n\nexport type ArtifactInputParser = {\n name: string;\n canParse: (input: ArtifactInput) => boolean;\n parse: (\n input: ArtifactInput,\n options?: { \n providers?: ArtifactProviders; \n parsers?: ParsersConfig; \n includeImages?: boolean;\n screenshots?: boolean;\n screenshotScale?: number;\n screenshotWidth?: number;\n }\n ) => Promise<Artifact[]>;\n};\n\nconst serializedArtifactImageSchema = {\n type: \"object\",\n required: [\"type\"],\n properties: {\n type: { const: \"image\" },\n url: { type: \"string\", minLength: 1 },\n base64: { type: \"string\", minLength: 1 },\n text: { type: \"string\" },\n x: { type: \"number\" },\n y: { type: \"number\" },\n width: { type: \"number\" },\n height: { type: \"number\" },\n imageType: { enum: [\"embedded\", \"screenshot\"] },\n },\n additionalProperties: false,\n anyOf: [{ required: [\"url\"] }, { required: [\"base64\"] }],\n};\n\nconst serializedArtifactContentSchema = {\n type: \"object\",\n properties: {\n page: { type: \"number\" },\n text: { type: \"string\" },\n media: { type: \"array\", items: serializedArtifactImageSchema },\n },\n additionalProperties: false,\n anyOf: [{ required: [\"text\"] }, { required: [\"media\"] }],\n};\n\nconst serializedArtifactSchema = {\n type: \"object\",\n required: [\"id\", \"type\", \"contents\"],\n properties: {\n id: { type: \"string\", minLength: 1 },\n type: { enum: [\"text\", \"image\", \"pdf\", \"file\"] as ArtifactType[] },\n contents: { type: \"array\", items: serializedArtifactContentSchema },\n metadata: { type: \"object\", additionalProperties: true },\n tokens: { type: \"number\" },\n },\n additionalProperties: false,\n};\n\nconst serializedArtifactsSchema = {\n anyOf: [\n serializedArtifactSchema,\n { type: \"array\", items: serializedArtifactSchema },\n ],\n};\n\nconst inputParsers: ArtifactInputParser[] = [];\n\nexport const registerArtifactInputParser = (parser: ArtifactInputParser) => {\n inputParsers.push(parser);\n};\n\nexport const clearArtifactInputParsers = () => {\n inputParsers.length = 0;\n};\n\nexport const validateSerializedArtifacts = (data: unknown): SerializedArtifact[] => {\n const ajv = createAjv();\n const parsed = validateOrThrow<SerializedArtifacts>(\n ajv,\n serializedArtifactsSchema,\n data\n );\n return Array.isArray(parsed) ? parsed : [parsed];\n};\n\nexport const hydrateSerializedArtifacts = (items: SerializedArtifact[]): Artifact[] => {\n return items.map((item) => ({\n ...item,\n raw: async () => Buffer.from(JSON.stringify(item.contents ?? [])),\n }));\n};\n\nexport const parseSerializedArtifacts = (text: string): SerializedArtifact[] => {\n const parsed = JSON.parse(text) as unknown;\n return validateSerializedArtifacts(parsed);\n};\n\nexport const splitTextIntoContents = (text: string): ArtifactContent[] => {\n const blocks = text\n .split(/\\n\\s*\\n/g)\n .map((block) => block.trim())\n .filter((block) => block.length > 0);\n\n if (blocks.length === 0) {\n return [{ text }];\n }\n\n return blocks.map((block) => ({ text: block }));\n};\n\nconst bufferToTextArtifact = (buffer: Buffer, id?: string): Artifact => {\n const text = buffer.toString();\n return {\n id: id ?? `artifact-${crypto.randomUUID()}`,\n type: \"text\",\n raw: async () => buffer,\n contents: splitTextIntoContents(text),\n };\n};\n\nconst bufferToImageArtifact = (buffer: Buffer, id?: string): Artifact => {\n return {\n id: id ?? `artifact-${crypto.randomUUID()}`,\n type: \"image\",\n raw: async () => buffer,\n contents: [\n {\n media: [{ type: \"image\", contents: buffer }],\n },\n ],\n };\n};\n\nconst parseBufferInput = async (\n buffer: Buffer,\n mimeType: string,\n id?: string,\n providers?: ArtifactProviders,\n parsers?: ParsersConfig,\n includeImages?: boolean,\n screenshots?: boolean,\n screenshotScale?: number,\n screenshotWidth?: number,\n): Promise<Artifact[]> => {\n // Resolution order:\n // 1. parsers config (custom ParserDef) — if MIME type has a configured parser, use it\n if (parsers) {\n const parserDef = parsers[mimeType];\n if (parserDef) {\n return runParser(parserDef, { kind: \"buffer\", buffer }, mimeType);\n }\n }\n\n // 2. providers registry (user-registered ArtifactProvider functions)\n const registry = providers ?? defaultArtifactProviders;\n const provider = registry[mimeType];\n if (provider) {\n return [await provider(buffer)];\n }\n\n // JSON auto-detection: if MIME is application/json, try to parse as SerializedArtifact[]\n if (mimeType === \"application/json\") {\n try {\n const parsed = JSON.parse(buffer.toString()) as unknown;\n const serialized = validateSerializedArtifacts(parsed);\n return hydrateSerializedArtifacts(serialized);\n } catch {\n // If no custom parser is configured for application/json, throw clear error\n throw new Error(\n \"Input is JSON but not in SerializedArtifact format. To parse arbitrary JSON files, configure a parser: struktur config parsers add --mime application/json ...\"\n );\n }\n }\n\n // 3. Built-in PDF → pdf artifact\n if (mimeType === \"application/pdf\") {\n const { parsePdf } = await import(\"../parsers/pdf\");\n const pdfOptions: ParsePdfOptions = { \n includeImages, \n screenshots, \n screenshotScale, \n screenshotWidth \n };\n return [await parsePdf(buffer, pdfOptions)];\n }\n\n // 4. Built-in text/* → text artifact\n if (mimeType.startsWith(\"text/\")) {\n return [bufferToTextArtifact(buffer, id)];\n }\n\n // 5. Built-in image/* → image artifact\n if (mimeType.startsWith(\"image/\")) {\n return [bufferToImageArtifact(buffer, id)];\n }\n\n throw new Error(`Unsupported MIME type: ${mimeType}`);\n};\n\nconst artifactJsonParser: ArtifactInputParser = {\n name: \"artifact-json\",\n canParse: (input) => input.kind === \"artifact-json\",\n parse: async (input) => {\n if (input.kind !== \"artifact-json\") {\n return [];\n }\n const serialized = validateSerializedArtifacts(input.data);\n return hydrateSerializedArtifacts(serialized);\n },\n};\n\nconst textParser: ArtifactInputParser = {\n name: \"text\",\n canParse: (input) => input.kind === \"text\",\n parse: async (input) => {\n if (input.kind !== \"text\") {\n return [];\n }\n const buffer = Buffer.from(input.text);\n return [bufferToTextArtifact(buffer, input.id)];\n },\n};\n\nconst fileParser: ArtifactInputParser = {\n name: \"file\",\n canParse: (input) => input.kind === \"file\",\n parse: async (input, options) => {\n if (input.kind !== \"file\") {\n return [];\n }\n const mimeType = input.mimeType ?? (await detectMimeType({ filePath: input.path })) ?? \"application/octet-stream\";\n\n // JSON auto-detection: if MIME type is application/json, first try to validate as SerializedArtifact[]\n if (mimeType === \"application/json\") {\n const text = await readFile(input.path, \"utf-8\");\n try {\n const parsed = JSON.parse(text) as unknown;\n const serialized = validateSerializedArtifacts(parsed);\n return hydrateSerializedArtifacts(serialized);\n } catch {\n // Not valid artifact JSON — try custom parser or throw\n if (options?.parsers) {\n const parserDef = options.parsers[mimeType];\n if (parserDef) {\n return runParser(parserDef, { kind: \"file\", path: input.path }, mimeType);\n }\n }\n throw new Error(\n `File \"${input.path}\" is JSON but not in SerializedArtifact format. To parse arbitrary JSON files, configure a parser: struktur config parsers add --mime application/json ...`\n );\n }\n }\n\n const buffer = await readFile(input.path);\n return parseBufferInput(\n buffer, \n mimeType, \n input.id, \n options?.providers, \n options?.parsers, \n options?.includeImages,\n options?.screenshots,\n options?.screenshotScale,\n options?.screenshotWidth,\n );\n },\n};\n\nconst bufferParser: ArtifactInputParser = {\n name: \"buffer\",\n canParse: (input) => input.kind === \"buffer\",\n parse: async (input, options) => {\n if (input.kind !== \"buffer\") {\n return [];\n }\n return parseBufferInput(\n input.buffer,\n input.mimeType,\n input.id,\n options?.providers,\n options?.parsers,\n options?.includeImages,\n options?.screenshots,\n options?.screenshotScale,\n options?.screenshotWidth,\n );\n },\n};\n\nexport const parse = async (\n input: ArtifactInput,\n options?: { \n parsers?: ArtifactInputParser[]; \n providers?: ArtifactProviders; \n parserConfig?: ParsersConfig; \n includeImages?: boolean;\n screenshots?: boolean;\n screenshotScale?: number;\n screenshotWidth?: number;\n }\n): Promise<Artifact[]> => {\n const parsers =\n options?.parsers ??\n [\n ...inputParsers,\n artifactJsonParser,\n textParser,\n fileParser,\n bufferParser,\n ];\n const parser = parsers.find((candidate) => candidate.canParse(input));\n\n if (!parser) {\n throw new Error(`No artifact input parser available for ${input.kind}`);\n }\n\n return parser.parse(input, { \n providers: options?.providers, \n parsers: options?.parserConfig, \n includeImages: options?.includeImages,\n screenshots: options?.screenshots,\n screenshotScale: options?.screenshotScale,\n screenshotWidth: options?.screenshotWidth,\n });\n};\n","import path from \"node:path\";\nimport type { NpmParserDef } from \"./types\";\n\n// Magic byte signatures for common file types\nconst MAGIC_BYTES: Array<{ mimeType: string; bytes: number[]; offset?: number }> = [\n // PDF: %PDF\n { mimeType: \"application/pdf\", bytes: [0x25, 0x50, 0x44, 0x46] },\n // PNG: 89 50 4E 47\n { mimeType: \"image/png\", bytes: [0x89, 0x50, 0x4e, 0x47] },\n // JPEG: FF D8 FF\n { mimeType: \"image/jpeg\", bytes: [0xff, 0xd8, 0xff] },\n // GIF: GIF8\n { mimeType: \"image/gif\", bytes: [0x47, 0x49, 0x46, 0x38] },\n // ZIP / Office Open XML (DOCX/XLSX/PPTX all start with PK\\x03\\x04)\n {\n mimeType: \"application/zip\",\n bytes: [0x50, 0x4b, 0x03, 0x04],\n },\n];\n\n// WebP has RIFF at offset 0 and WEBP at offset 8\nconst isWebP = (header: Uint8Array): boolean => {\n if (header.length < 12) return false;\n const riff =\n header[0] === 0x52 && header[1] === 0x49 && header[2] === 0x46 && header[3] === 0x46;\n const webp =\n header[8] === 0x57 && header[9] === 0x45 && header[10] === 0x42 && header[11] === 0x50;\n return riff && webp;\n};\n\nconst matchesMagicBytes = (header: Uint8Array, bytes: number[], offset = 0): boolean => {\n if (header.length < offset + bytes.length) return false;\n return bytes.every((b, i) => header[offset + i] === b);\n};\n\nconst detectFromMagicBytes = (header: Uint8Array): string | null => {\n if (isWebP(header)) return \"image/webp\";\n\n for (const { mimeType, bytes, offset } of MAGIC_BYTES) {\n if (matchesMagicBytes(header, bytes, offset ?? 0)) {\n return mimeType;\n }\n }\n\n return null;\n};\n\n// Extension → MIME type lookup\nconst EXTENSION_MIME_MAP: Record<string, string> = {\n \".txt\": \"text/plain\",\n \".md\": \"text/markdown\",\n \".markdown\": \"text/markdown\",\n \".html\": \"text/html\",\n \".htm\": \"text/html\",\n \".json\": \"application/json\",\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".csv\": \"text/csv\",\n \".xml\": \"application/xml\",\n \".yaml\": \"application/yaml\",\n \".yml\": \"application/yaml\",\n \".docx\":\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".xlsx\":\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \".pptx\":\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \".mp4\": \"video/mp4\",\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".ogg\": \"audio/ogg\",\n \".svg\": \"image/svg+xml\",\n \".ts\": \"text/plain\",\n \".tsx\": \"text/plain\",\n \".js\": \"text/javascript\",\n \".jsx\": \"text/javascript\",\n \".css\": \"text/css\",\n \".toml\": \"application/toml\",\n};\n\nexport type NpmParserEntry = {\n mimeType: string;\n def: NpmParserDef;\n};\n\nexport async function detectMimeType(options: {\n buffer?: Buffer;\n filePath?: string;\n mimeOverride?: string;\n npmParsers?: NpmParserEntry[];\n}): Promise<string | null> {\n const { buffer, filePath, mimeOverride, npmParsers } = options;\n\n // --mime override takes precedence\n if (mimeOverride) {\n return mimeOverride;\n }\n\n // Layer 1: magic bytes (authoritative)\n if (buffer && buffer.length > 0) {\n const header = buffer.subarray(0, 512);\n const magicMime = detectFromMagicBytes(header);\n if (magicMime) {\n return magicMime;\n }\n\n // Layer 3: npm parser detectFileType callbacks (after built-ins)\n if (npmParsers && npmParsers.length > 0) {\n for (const entry of npmParsers) {\n try {\n const mod = await import(entry.def.package) as {\n detectFileType?: (header: Uint8Array) => boolean;\n };\n if (typeof mod.detectFileType === \"function\" && mod.detectFileType(header)) {\n return entry.mimeType;\n }\n } catch {\n // If the package fails to load, skip it\n }\n }\n }\n }\n\n // Layer 2: extension database (for file inputs)\n if (filePath) {\n const ext = path.extname(filePath).toLowerCase();\n if (ext && ext in EXTENSION_MIME_MAP) {\n return EXTENSION_MIME_MAP[ext] ?? null;\n }\n }\n\n return null;\n}\n","import type { Artifact, ArtifactImage } from \"../types\";\n\nconst imageRefFor = (artifactId: string, index: number, image: ArtifactImage) => {\n if (image.url) {\n return image.url;\n }\n\n const extension = image.base64 ? \"png\" : \"bin\";\n return `artifact:${artifactId}/images/image${index + 1}.${extension}`;\n};\n\nconst escapeXml = (value: string) => {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\\\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n};\n\nexport const formatArtifactsXml = (artifacts: Artifact[]) => {\n const parts: string[] = [];\n\n for (const artifact of artifacts) {\n parts.push(`<artifact id=\"${escapeXml(artifact.id)}\" type=\"${artifact.type}\">`);\n\n for (const content of artifact.contents) {\n if (content.text) {\n const pageAttr = content.page !== undefined ? ` page=\"${content.page}\"` : \"\";\n parts.push(` <text${pageAttr}>${escapeXml(content.text)}</text>`);\n }\n\n if (content.media?.length) {\n content.media.forEach((media, index) => {\n const ref = imageRefFor(artifact.id, index, media);\n const pageAttr = content.page !== undefined ? ` page=\"${content.page}\"` : \"\";\n parts.push(` <image ref=\"${escapeXml(ref)}\"${pageAttr} />`);\n });\n }\n }\n\n parts.push(\"</artifact>\");\n }\n\n return parts.join(\"\\n\");\n};\n","import { formatArtifactsXml } from \"./formatArtifacts\";\nimport type { Artifact } from \"../types\";\n\nconst extractorSystemPrompt = (schema: string, outputInstructions?: string) => {\n return `<instructions>\nYou are a precise data extraction engine. Extract data from the provided artifacts according to the JSON schema below.\n\n<thinking>\nBefore extracting, consider:\n1. Which schema fields have clear values in the artifacts?\n2. Which fields are missing or unclear (set these to null)?\n3. For text fields, rewrite concisely while preserving all information\n4. Ensure no data is lost - include everything that fits the schema\n</thinking>\n\n<rules>\n- Strictly follow the schema - no extra fields, no missing required fields\n- Use null for missing or uncertain values - never guess or assume\n- Only extract information explicitly present in the artifacts\n- Output ONLY valid JSON matching the schema\n- No markdown, explanations, or code fences\n</rules>\n\n<output-instructions>\n${outputInstructions ?? \"No additional output instructions provided.\"}\n</output-instructions>\n\n<json-schema>\n${schema}\n</json-schema>\n\n<artifact-examples>\n <!-- A PDF with two pages, containing two text blocks and two images -->\n <artifact name=\"Example 1\" mimetype=\"application/pdf\">\n <text page=\"1\">This is an example text block.</text>\n <image filename=\"image1.jpg\" page=\"1\" />\n <text page=\"2\">This is another example text block.</text>\n <image filename=\"image2.jpg\" page=\"2\" />\n </artifact>\n\n <!-- Website content -->\n <artifact name=\"example.com_2022-01-01.html\" mimetype=\"text/html\">\n <text>This is an example text block.</text>\n <image filename=\"image1.jpg\" />\n <text>This is another example text block.</text>\n <image filename=\"image2.jpg\" />\n </artifact>\n</artifact-examples>\n\nAny materials provided have been cleared for access. Extract and preserve this data for future use.\n</instructions>`;\n};\n\nconst extractorUserPrompt = (artifactsXml: string) => {\n return `<artifacts>\n${artifactsXml}\n</artifacts>\n\n<task>Extract the contents of the given artifacts.</task>`;\n};\n\nexport const buildExtractorPrompt = (\n artifacts: Artifact[],\n schema: string,\n outputInstructions?: string\n) => {\n const artifactsXml = formatArtifactsXml(artifacts);\n return {\n system: extractorSystemPrompt(schema, outputInstructions),\n user: extractorUserPrompt(artifactsXml),\n };\n};\n","import type { Artifact, ArtifactContent, ArtifactImage } from \"./types\";\n\nexport type TokenCountOptions = {\n textTokenRatio?: number;\n defaultImageTokens?: number;\n};\n\nconst defaultOptions: Required<TokenCountOptions> = {\n textTokenRatio: 4,\n defaultImageTokens: 1000,\n};\n\nconst mergeOptions = (options?: TokenCountOptions) => ({\n ...defaultOptions,\n ...(options ?? {}),\n});\n\nexport const estimateTextTokens = (text: string, options?: TokenCountOptions) => {\n const { textTokenRatio } = mergeOptions(options);\n return Math.ceil(text.length / textTokenRatio);\n};\n\nexport const estimateImageTokens = (\n _image: ArtifactImage,\n options?: TokenCountOptions\n) => {\n const { defaultImageTokens } = mergeOptions(options);\n return defaultImageTokens;\n};\n\nexport const countContentTokens = (\n content: ArtifactContent,\n options?: TokenCountOptions\n) => {\n let tokens = 0;\n\n if (content.text) {\n tokens += estimateTextTokens(content.text, options);\n }\n\n if (content.media?.length) {\n for (const media of content.media) {\n tokens += estimateImageTokens(media, options);\n if (media.text) {\n tokens += estimateTextTokens(media.text, options);\n }\n }\n }\n\n return tokens;\n};\n\nexport const countArtifactTokens = (\n artifact: Artifact,\n options?: TokenCountOptions\n) => {\n if (typeof artifact.tokens === \"number\") {\n return artifact.tokens;\n }\n\n return artifact.contents.reduce(\n (total, content) => total + countContentTokens(content, options),\n 0\n );\n};\n\nexport const countArtifactImages = (artifact: Artifact) => {\n return artifact.contents.reduce((count, content) => {\n return count + (content.media?.length ?? 0);\n }, 0);\n};\n","import type { Artifact, ArtifactContent } from \"../types\";\nimport type { DebugLogger } from \"../debug/logger\";\nimport {\n countContentTokens,\n countArtifactImages,\n countArtifactTokens,\n estimateTextTokens,\n type TokenCountOptions,\n} from \"../tokenization\";\n\nexport type SplitOptions = TokenCountOptions & {\n maxTokens: number;\n maxImages?: number;\n debug?: DebugLogger;\n};\n\nconst splitTextIntoChunks = (\n content: ArtifactContent,\n maxTokens: number,\n options?: TokenCountOptions,\n debug?: DebugLogger,\n artifactId?: string\n): ArtifactContent[] => {\n if (!content.text) {\n return [content];\n }\n\n const totalTokens = estimateTextTokens(content.text, options);\n if (totalTokens <= maxTokens) {\n return [content];\n }\n\n const ratio = options?.textTokenRatio ?? 4;\n const chunkSize = Math.max(1, maxTokens * ratio);\n const chunks: ArtifactContent[] = [];\n\n // Log text splitting\n if (debug && artifactId) {\n debug.chunkingSplit({\n artifactId,\n originalContentCount: 1,\n splitContentCount: Math.ceil(content.text.length / chunkSize),\n splitReason: \"text_too_long\",\n originalTokens: totalTokens,\n chunkSize,\n });\n }\n\n for (let offset = 0; offset < content.text.length; offset += chunkSize) {\n const text = content.text.slice(offset, offset + chunkSize);\n chunks.push({\n page: content.page,\n text,\n media: offset === 0 ? content.media : undefined,\n });\n }\n\n return chunks;\n};\n\nexport const splitArtifact = (\n artifact: Artifact,\n options: SplitOptions\n): Artifact[] => {\n const { maxTokens, maxImages, debug } = options;\n const splitContents: ArtifactContent[] = [];\n\n // Log chunking start\n const totalTokens = countArtifactTokens(artifact, options);\n debug?.chunkingStart({\n artifactId: artifact.id,\n totalTokens,\n maxTokens,\n maxImages,\n });\n\n for (const content of artifact.contents) {\n splitContents.push(...splitTextIntoChunks(content, maxTokens, options, debug, artifact.id));\n }\n\n const chunks: Artifact[] = [];\n let currentContents: ArtifactContent[] = [];\n let currentTokens = 0;\n let currentImages = 0;\n\n for (const content of splitContents) {\n const contentTokens = countContentTokens(content, options);\n const contentImages = content.media?.length ?? 0;\n\n const exceedsTokens =\n currentContents.length > 0 && currentTokens + contentTokens > maxTokens;\n const exceedsImages =\n maxImages !== undefined &&\n currentContents.length > 0 &&\n currentImages + contentImages > maxImages;\n\n if (exceedsTokens || exceedsImages) {\n // Log chunk creation\n if (debug) {\n debug.chunkingSplit({\n artifactId: artifact.id,\n originalContentCount: splitContents.length,\n splitContentCount: chunks.length + 1,\n splitReason: exceedsTokens ? \"content_limit\" : \"content_limit\",\n originalTokens: totalTokens,\n chunkSize: maxTokens,\n });\n }\n \n chunks.push({\n ...artifact,\n id: `${artifact.id}:part:${chunks.length + 1}`,\n contents: currentContents,\n tokens: currentTokens,\n });\n currentContents = [];\n currentTokens = 0;\n currentImages = 0;\n }\n\n currentContents.push(content);\n currentTokens += contentTokens;\n currentImages += contentImages;\n }\n\n if (currentContents.length > 0) {\n chunks.push({\n ...artifact,\n id: `${artifact.id}:part:${chunks.length + 1}`,\n contents: currentContents,\n tokens: currentTokens,\n });\n }\n\n if (chunks.length === 0) {\n chunks.push({\n ...artifact,\n id: `${artifact.id}:part:1`,\n tokens: countArtifactTokens(artifact, options),\n });\n }\n\n // Log chunking result\n debug?.chunkingResult({\n artifactId: artifact.id,\n chunksCreated: chunks.length,\n chunkSizes: chunks.map(c => c.tokens ?? 0),\n });\n\n return chunks;\n};\n","import type { Artifact } from \"../types\";\nimport type { DebugLogger } from \"../debug/logger\";\nimport {\n countArtifactTokens,\n countArtifactImages,\n type TokenCountOptions,\n} from \"../tokenization\";\nimport { splitArtifact } from \"./ArtifactSplitter\";\n\nexport type BatchOptions = TokenCountOptions & {\n maxTokens: number;\n maxImages?: number;\n modelMaxTokens?: number;\n debug?: DebugLogger;\n};\n\nexport const batchArtifacts = (\n artifacts: Artifact[],\n options: BatchOptions\n): Artifact[][] => {\n const debug = options.debug;\n const maxTokens = options.modelMaxTokens\n ? Math.min(options.maxTokens, options.modelMaxTokens)\n : options.maxTokens;\n\n // Log batching start\n debug?.batchingStart({\n totalArtifacts: artifacts.length,\n maxTokens: options.maxTokens,\n maxImages: options.maxImages,\n modelMaxTokens: options.modelMaxTokens,\n effectiveMaxTokens: maxTokens,\n });\n\n const batches: Artifact[][] = [];\n let currentBatch: Artifact[] = [];\n let currentTokens = 0;\n let currentImages = 0;\n\n for (const artifact of artifacts) {\n const splitOptions: any = { \n maxTokens,\n debug,\n };\n if (options.maxImages !== undefined) splitOptions.maxImages = options.maxImages;\n if (options.textTokenRatio !== undefined) splitOptions.textTokenRatio = options.textTokenRatio;\n if (options.defaultImageTokens !== undefined) splitOptions.defaultImageTokens = options.defaultImageTokens;\n \n const splits = splitArtifact(artifact, splitOptions);\n\n for (const split of splits) {\n const splitTokens = countArtifactTokens(split, options);\n const splitImages = countArtifactImages(split);\n\n const exceedsTokens =\n currentBatch.length > 0 && currentTokens + splitTokens > maxTokens;\n const exceedsImages =\n options.maxImages !== undefined &&\n currentBatch.length > 0 &&\n currentImages + splitImages > options.maxImages;\n\n if (exceedsTokens || exceedsImages) {\n // Log batch creation\n debug?.batchCreated({\n batchIndex: batches.length,\n artifactCount: currentBatch.length,\n totalTokens: currentTokens,\n totalImages: currentImages,\n artifactIds: currentBatch.map(a => a.id),\n });\n \n batches.push(currentBatch);\n currentBatch = [];\n currentTokens = 0;\n currentImages = 0;\n }\n\n currentBatch.push(split);\n currentTokens += splitTokens;\n currentImages += splitImages;\n }\n }\n\n if (currentBatch.length > 0) {\n // Log final batch\n debug?.batchCreated({\n batchIndex: batches.length,\n artifactCount: currentBatch.length,\n totalTokens: currentTokens,\n totalImages: currentImages,\n artifactIds: currentBatch.map(a => a.id),\n });\n batches.push(currentBatch);\n }\n\n // Log batching complete\n debug?.batchingComplete({\n totalBatches: batches.length,\n batches: batches.map((batch, index) => ({\n index,\n artifactCount: batch.length,\n tokens: batch.reduce((sum, a) => sum + (a.tokens ?? 0), 0),\n images: batch.reduce((sum, a) => \n sum + a.contents.reduce((c, content) => c + (content.media?.length ?? 0), 0), 0\n ),\n })),\n });\n\n return batches;\n};\n","import type { Artifact } from \"../types\";\n\nexport type ImagePart = {\n type: \"image\";\n image: string | Buffer;\n};\n\nexport type TextPart = {\n type: \"text\";\n text: string;\n};\n\nexport type UserContent = string | Array<TextPart | ImagePart>;\n\nconst collectImages = (artifacts: Artifact[]): ImagePart[] => {\n const parts: ImagePart[] = [];\n\n for (const artifact of artifacts) {\n for (const content of artifact.contents) {\n if (!content.media?.length) {\n continue;\n }\n\n for (const media of content.media) {\n if (media.contents) {\n parts.push({ type: \"image\", image: media.contents });\n } else if (media.base64) {\n parts.push({ type: \"image\", image: media.base64 });\n } else if (media.url) {\n parts.push({ type: \"image\", image: media.url });\n }\n }\n }\n }\n\n return parts;\n};\n\nexport const buildUserContent = (text: string, artifacts: Artifact[]): UserContent => {\n const images = collectImages(artifacts);\n\n if (images.length === 0) {\n return text;\n }\n\n return [{ type: \"text\", text }, ...images];\n};\n","import { generateText, Output, jsonSchema, type ModelMessage } from \"ai\";\nimport type { AnyJSONSchema, Usage, TelemetryAdapter } from \"../types\";\nimport type { UserContent } from \"./message\";\n\ntype GenerateTextParams = Parameters<typeof generateText>[0];\ntype ModelType = GenerateTextParams extends { model: infer M } ? M : unknown;\ntype MessageType = Array<ModelMessage>;\n\nexport type StructuredRequest<T> = {\n model: ModelType | unknown;\n system: string;\n user: UserContent;\n messages?: MessageType;\n schema: unknown;\n schemaName?: string;\n schemaDescription?: string;\n strict?: boolean;\n /**\n * Telemetry adapter for tracing LLM calls\n */\n telemetry?: TelemetryAdapter;\n /**\n * Parent span for creating hierarchical traces\n */\n parentSpan?: { id: string; traceId: string; name: string; kind: string; startTime: number; parentId?: string };\n};\n\nexport type StructuredResponse<T> = {\n data: T;\n usage: Usage;\n};\n\nconst isZodSchema = (\n schema: unknown,\n): schema is { safeParse: (data: unknown) => unknown } => {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n \"safeParse\" in schema &&\n typeof (schema as { safeParse?: unknown }).safeParse === \"function\"\n );\n};\n\nexport const generateStructured = async <T>(\n request: StructuredRequest<T>,\n): Promise<StructuredResponse<T>> => {\n const { telemetry, parentSpan } = request;\n \n // Start LLM span if telemetry is enabled\n const llmSpan = telemetry?.startSpan({\n name: \"llm.generateStructured\",\n kind: \"LLM\",\n parentSpan,\n attributes: {\n \"llm.schema_name\": request.schemaName ?? \"extract\",\n \"llm.strict\": request.strict ?? false,\n },\n });\n\n const startTime = Date.now();\n\n const schema = isZodSchema(request.schema)\n ? request.schema\n : jsonSchema(request.schema as AnyJSONSchema);\n\n // Check for OpenRouter provider preference attached to the model\n const preferredProvider = (\n request.model as { __openrouter_provider?: string }\n )?.__openrouter_provider;\n\n if (preferredProvider && process.env.DEBUG) {\n console.error(\n `[DEBUG] Routing to OpenRouter provider: ${preferredProvider}`,\n );\n }\n\n const providerOptions = preferredProvider\n ? {\n openrouter: {\n provider: {\n order: [preferredProvider],\n },\n },\n }\n : undefined;\n\n let result;\n try {\n result = await generateText({\n model: request.model as ModelType,\n output: Output.object({\n schema: schema as GenerateTextParams extends { schema: infer S }\n ? S\n : never,\n name: request.schemaName ?? \"extract\",\n description: request.schemaDescription,\n }),\n providerOptions: {\n openai: {\n strictJsonSchema: request.strict ?? false,\n },\n },\n system: request.system,\n messages: (request.messages ?? [\n { role: \"user\", content: request.user },\n ]) as MessageType,\n ...(providerOptions ? { providerOptions } : {}),\n });\n } catch (error) {\n // Determine model ID for error messages\n const modelId =\n typeof request.model === \"object\" && request.model !== null\n ? (request.model as { modelId?: string }).modelId ??\n JSON.stringify(request.model)\n : String(request.model);\n\n if (\n error &&\n typeof error === \"object\" &&\n \"responseBody\" in error &&\n \"statusCode\" in error\n ) {\n const apiError = error as {\n responseBody: unknown;\n statusCode: number;\n data?: {\n code?: number;\n message?: string;\n type?: string | null;\n param?: string | null;\n };\n };\n\n const responseBody = apiError.responseBody;\n const errorData = apiError.data;\n\n if (\n typeof responseBody === \"string\" &&\n responseBody.includes(\"No endpoints found that support image input\")\n ) {\n throw new Error(\n `Model \"${modelId}\" does not support image input. Please use a model that supports images (e.g., gpt-4o, claude-3-5-sonnet, gemini-1.5-pro) or remove the --images and --screenshots flags.`,\n );\n }\n\n if (errorData?.code === 500 || errorData?.message?.includes(\"Internal Server Error\")) {\n throw new Error(\n `Provider error for model \"${modelId}\": Internal server error. The model or provider may be experiencing issues. Please try again or use a different model.`,\n );\n }\n\n if (apiError.statusCode === 401 || errorData?.code === 401) {\n throw new Error(\n `Authentication failed for model \"${modelId}\". Please check your API key is valid and has the necessary permissions.`,\n );\n }\n\n if (apiError.statusCode === 403 || errorData?.code === 403) {\n throw new Error(\n `Access denied for model \"${modelId}\". Your API key may not have access to this model. Please check your subscription or try a different model.`,\n );\n }\n\n if (apiError.statusCode === 429 || errorData?.code === 429) {\n throw new Error(\n `Rate limit exceeded for model \"${modelId}\". Please wait a moment and try again, or use a different model.`,\n );\n }\n\n if (apiError.statusCode === 404 || errorData?.code === 404) {\n const errorMsg = errorData?.message || \"Model not found\";\n throw new Error(\n `Model \"${modelId}\" not found or unavailable. ${errorMsg} Please check the model name or try a different model.`,\n );\n }\n\n if (errorData?.message) {\n throw new Error(\n `Provider error for model \"${modelId}\": ${errorData.message}`,\n );\n }\n }\n \n // Record error in telemetry\n if (llmSpan && telemetry) {\n const latencyMs = Date.now() - startTime;\n telemetry.recordEvent(llmSpan, {\n type: \"llm_call\",\n model: modelId,\n provider: \"unknown\", // Will be determined by the model\n input: {\n messages: request.messages ?? [{ role: \"user\", content: typeof request.user === \"string\" ? request.user : \"\" }],\n temperature: undefined,\n maxTokens: undefined,\n schema: request.schema,\n },\n error: error instanceof Error ? error : new Error(String(error)),\n latencyMs,\n });\n telemetry.endSpan(llmSpan, {\n status: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n latencyMs,\n });\n }\n \n throw error;\n }\n\n const usageRaw = result.usage ?? {};\n const inputTokens =\n \"promptTokens\" in usageRaw\n ? (usageRaw.promptTokens as number)\n : ((usageRaw as { inputTokens?: number }).inputTokens ?? 0);\n const outputTokens =\n \"completionTokens\" in usageRaw\n ? (usageRaw.completionTokens as number)\n : ((usageRaw as { outputTokens?: number }).outputTokens ?? 0);\n const totalTokens =\n \"totalTokens\" in usageRaw\n ? (usageRaw.totalTokens as number)\n : inputTokens + outputTokens;\n\n const usage: Usage = {\n inputTokens,\n outputTokens,\n totalTokens,\n };\n\n // Record successful LLM call in telemetry\n if (llmSpan && telemetry) {\n const latencyMs = Date.now() - startTime;\n telemetry.recordEvent(llmSpan, {\n type: \"llm_call\",\n model: typeof request.model === \"object\" && request.model !== null\n ? (request.model as { modelId?: string }).modelId ?? \"unknown\"\n : String(request.model),\n provider: preferredProvider ?? \"unknown\",\n input: {\n messages: request.messages ?? [{ role: \"user\", content: typeof request.user === \"string\" ? request.user : \"\" }],\n temperature: undefined,\n maxTokens: undefined,\n schema: request.schema,\n },\n output: {\n content: JSON.stringify(result.output),\n structured: true,\n usage: {\n input: inputTokens,\n output: outputTokens,\n total: totalTokens,\n },\n },\n latencyMs,\n });\n telemetry.endSpan(llmSpan, {\n status: \"ok\",\n output: result.output,\n latencyMs,\n });\n }\n\n return { data: result.output as T, usage };\n};\n","import {\n createAjv,\n validateOrThrow,\n SchemaValidationError,\n validateAllowingMissingRequired,\n} from \"../validation/validator\";\nimport type { ModelMessage } from \"ai\";\nimport type { ExtractionEvents, Usage, TelemetryAdapter } from \"../types\";\nimport type { DebugLogger } from \"../debug/logger\";\nimport { generateStructured } from \"./LLMClient\";\nimport type { UserContent } from \"./message\";\n\nexport type RetryOptions<T> = {\n model: unknown;\n schema: unknown;\n system: string;\n user: UserContent;\n events?: ExtractionEvents;\n maxAttempts?: number;\n schemaName?: string;\n execute?: typeof generateStructured<T>;\n strict?: boolean;\n debug?: DebugLogger;\n callId?: string;\n /**\n * Telemetry adapter for tracing validation and retries\n */\n telemetry?: TelemetryAdapter;\n /**\n * Parent span for creating hierarchical traces\n */\n parentSpan?: { id: string; traceId: string; name: string; kind: string; startTime: number; parentId?: string };\n};\n\nexport const runWithRetries = async <T>(options: RetryOptions<T>) => {\n const { telemetry, parentSpan } = options;\n \n // Start validation/retry span if telemetry is enabled\n const retrySpan = telemetry?.startSpan({\n name: \"struktur.validation_retry\",\n kind: \"CHAIN\",\n parentSpan,\n attributes: {\n \"retry.max_attempts\": options.maxAttempts ?? 3,\n \"retry.schema_name\": options.schemaName ?? \"extract\",\n },\n });\n\n const ajv = createAjv();\n const maxAttempts = options.maxAttempts ?? 3;\n const messages: ModelMessage[] = [{ role: \"user\", content: options.user }];\n const debug = options.debug;\n const callId =\n options.callId ??\n `call_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\n\n let usage: Usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n let lastError: Error | undefined;\n\n // Log LLM call start\n const systemLength = options.system.length;\n const userLength =\n typeof options.user === \"string\"\n ? options.user.length\n : JSON.stringify(options.user).length;\n\n debug?.llmCallStart({\n callId,\n model: JSON.stringify(options.model),\n schemaName: options.schemaName,\n systemLength,\n userLength,\n artifactCount: Array.isArray(options.user) ? options.user.length : 0,\n });\n\n debug?.promptSystem({ callId, system: options.system });\n debug?.promptUser({ callId, user: options.user });\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n const executor = options.execute ?? generateStructured;\n const isFinalAttempt = attempt === maxAttempts;\n const useStrictValidation = options.strict === true || isFinalAttempt;\n\n debug?.validationStart({\n callId,\n attempt,\n maxAttempts,\n strict: useStrictValidation,\n });\n\n const startTime = Date.now();\n const result = await executor({\n model: options.model,\n schema: options.schema,\n schemaName: options.schemaName,\n system: options.system,\n user: options.user,\n messages,\n strict: options.strict,\n telemetry,\n parentSpan: retrySpan,\n });\n const durationMs = Date.now() - startTime;\n\n usage = {\n inputTokens: usage.inputTokens + result.usage.inputTokens,\n outputTokens: usage.outputTokens + result.usage.outputTokens,\n totalTokens: usage.totalTokens + result.usage.totalTokens,\n };\n\n debug?.rawResponse({ callId, response: result.data });\n\n try {\n if (useStrictValidation) {\n const validated = validateOrThrow<T>(\n ajv,\n options.schema as never,\n result.data,\n );\n\n debug?.validationSuccess({ callId, attempt });\n debug?.llmCallComplete({\n callId,\n success: true,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n durationMs,\n });\n\n // Record successful validation\n if (retrySpan && telemetry) {\n telemetry.recordEvent(retrySpan, {\n type: \"validation\",\n attempt,\n maxAttempts,\n schema: options.schema,\n input: result.data,\n success: true,\n latencyMs: durationMs,\n });\n telemetry.endSpan(retrySpan, {\n status: \"ok\",\n output: validated,\n latencyMs: durationMs,\n });\n }\n\n return { data: validated, usage };\n } else {\n const validationResult = validateAllowingMissingRequired<T>(\n ajv,\n options.schema as never,\n result.data,\n isFinalAttempt,\n );\n\n if (validationResult.valid) {\n debug?.validationSuccess({ callId, attempt });\n debug?.llmCallComplete({\n callId,\n success: true,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n durationMs,\n });\n\n // Record successful validation\n if (retrySpan && telemetry) {\n telemetry.recordEvent(retrySpan, {\n type: \"validation\",\n attempt,\n maxAttempts,\n schema: options.schema,\n input: result.data,\n success: true,\n latencyMs: durationMs,\n });\n telemetry.endSpan(retrySpan, {\n status: \"ok\",\n output: validationResult.data,\n latencyMs: durationMs,\n });\n }\n\n return { data: validationResult.data, usage };\n }\n\n throw new SchemaValidationError(\n \"Schema validation failed\",\n validationResult.errors,\n );\n }\n } catch (error) {\n lastError = error as Error;\n\n if (error instanceof SchemaValidationError) {\n debug?.validationFailed({\n callId,\n attempt,\n errors: error.errors,\n });\n\n // Record failed validation\n if (retrySpan && telemetry) {\n telemetry.recordEvent(retrySpan, {\n type: \"validation\",\n attempt,\n maxAttempts,\n schema: options.schema,\n input: result.data,\n success: false,\n errors: error.errors,\n latencyMs: durationMs,\n });\n }\n\n // Emit retry event before attempting retry\n const nextAttempt = attempt + 1;\n if (nextAttempt <= maxAttempts) {\n await options.events?.onRetry?.({\n attempt: nextAttempt,\n maxAttempts,\n reason: \"schema_validation_failed\",\n });\n\n debug?.retry({\n callId,\n attempt: nextAttempt,\n maxAttempts,\n reason: \"schema_validation_failed\",\n });\n }\n\n const errorPayload = JSON.stringify(error.errors, null, 2);\n const errorMessage = `<validation-errors>\\n${errorPayload}\\n</validation-errors>`;\n messages.push({ role: \"user\", content: errorMessage });\n await options.events?.onMessage?.({\n role: \"user\",\n content: errorMessage,\n });\n continue;\n }\n\n debug?.llmCallComplete({\n callId,\n success: false,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n durationMs,\n error: (error as Error).message,\n });\n\n // Record error in telemetry\n if (retrySpan && telemetry) {\n telemetry.endSpan(retrySpan, {\n status: \"error\",\n error: error as Error,\n latencyMs: durationMs,\n });\n }\n\n break;\n }\n }\n\n throw lastError ?? new Error(\"Unknown extraction error\");\n};\n","import type { Artifact, ExtractionEvents, Usage, TelemetryAdapter } from \"../types\";\nimport type { DebugLogger } from \"../debug/logger\";\nimport { batchArtifacts, type BatchOptions } from \"../chunking/ArtifactBatcher\";\nimport { buildUserContent } from \"../llm/message\";\nimport { runWithRetries } from \"../llm/RetryingRunner\";\n\nexport const serializeSchema = (schema: unknown) => {\n return JSON.stringify(schema);\n};\n\nexport const mergeUsage = (usages: Usage[]) => {\n return usages.reduce(\n (acc, usage) => ({\n inputTokens: acc.inputTokens + usage.inputTokens,\n outputTokens: acc.outputTokens + usage.outputTokens,\n totalTokens: acc.totalTokens + usage.totalTokens,\n }),\n { inputTokens: 0, outputTokens: 0, totalTokens: 0 }\n );\n};\n\nexport const getBatches = (\n artifacts: Artifact[],\n options: BatchOptions,\n debug?: DebugLogger,\n telemetry?: TelemetryAdapter,\n parentSpan?: { id: string; traceId: string; name: string; kind: string; startTime: number; parentId?: string }\n) => {\n // Create chunking span if telemetry is enabled\n const chunkingSpan = telemetry?.startSpan({\n name: \"struktur.chunking\",\n kind: \"RETRIEVER\",\n parentSpan,\n attributes: {\n \"chunking.artifact_count\": artifacts.length,\n \"chunking.max_tokens\": options.maxTokens,\n \"chunking.max_images\": options.maxImages,\n },\n });\n \n const batches = batchArtifacts(artifacts, { ...options, debug });\n \n // Record chunking results\n if (chunkingSpan && telemetry) {\n batches.forEach((batch, index) => {\n telemetry.recordEvent(chunkingSpan, {\n type: \"chunk\",\n chunkIndex: index,\n totalChunks: batches.length,\n tokens: batch.reduce((sum, a) => sum + (a.tokens || 0), 0),\n images: batch.reduce((sum, a) => \n sum + (a.contents?.flatMap((c) => c.media || []).length || 0), 0),\n });\n });\n \n telemetry.endSpan(chunkingSpan, {\n status: \"ok\",\n output: { batchCount: batches.length },\n });\n }\n \n return batches;\n};\n\nexport const extractWithPrompt = async <T>(options: {\n model: unknown;\n schema: unknown;\n system: string;\n user: string;\n artifacts: Artifact[];\n events?: ExtractionEvents;\n execute?: typeof runWithRetries<T>;\n strict?: boolean;\n debug?: DebugLogger;\n callId?: string;\n telemetry?: TelemetryAdapter;\n parentSpan?: { id: string; traceId: string; name: string; kind: string; startTime: number; parentId?: string };\n}) => {\n const userContent = buildUserContent(options.user, options.artifacts);\n const result = await runWithRetries<T>({\n model: options.model,\n schema: options.schema,\n system: options.system,\n user: userContent,\n events: options.events,\n execute: options.execute,\n strict: options.strict,\n debug: options.debug,\n callId: options.callId,\n telemetry: options.telemetry,\n parentSpan: options.parentSpan,\n });\n\n return result;\n};\n","import type { ExtractionResult, ExtractionStrategy } from \"../types\";\nimport type { ExtractionOptions } from \"../types\";\nimport { buildExtractorPrompt } from \"../prompts/ExtractorPrompt\";\nimport { extractWithPrompt, serializeSchema } from \"./utils\";\nimport { runWithRetries } from \"../llm/RetryingRunner\";\n\nexport type SimpleStrategyConfig = {\n model: unknown;\n outputInstructions?: string;\n execute?: typeof runWithRetries;\n strict?: boolean;\n};\n\nexport class SimpleStrategy<T> implements ExtractionStrategy<T> {\n public name = \"simple\";\n private config: SimpleStrategyConfig;\n\n constructor(config: SimpleStrategyConfig) {\n this.config = config;\n }\n\n getEstimatedSteps(): number {\n return 3;\n }\n\n async run(options: ExtractionOptions<T>): Promise<ExtractionResult<T>> {\n const debug = options.debug;\n const telemetry = options.telemetry ?? undefined;\n \n // Create strategy-level span\n const strategySpan = telemetry?.startSpan({\n name: \"strategy.simple\",\n kind: \"CHAIN\",\n attributes: {\n \"strategy.name\": this.name,\n \"strategy.artifacts.count\": options.artifacts.length,\n },\n });\n \n const schema = serializeSchema(options.schema);\n const { system, user } = buildExtractorPrompt(\n options.artifacts,\n schema,\n this.config.outputInstructions,\n );\n\n // Emit start event before extraction begins\n await options.events?.onStep?.({\n step: 1,\n total: this.getEstimatedSteps(),\n label: \"extract\",\n });\n debug?.step({\n step: 1,\n total: this.getEstimatedSteps(),\n label: \"extract\",\n strategy: this.name,\n });\n\n const result = await extractWithPrompt<T>({\n model: this.config.model,\n schema: options.schema,\n system,\n user,\n artifacts: options.artifacts,\n events: options.events,\n execute: this.config.execute as never,\n strict: options.strict ?? this.config.strict,\n debug,\n callId: \"simple_extract\",\n telemetry,\n parentSpan: strategySpan,\n });\n\n debug?.step({\n step: 2,\n total: this.getEstimatedSteps(),\n label: \"complete\",\n strategy: this.name,\n });\n\n // End strategy span\n telemetry?.endSpan(strategySpan!, {\n status: \"ok\",\n output: result.data,\n });\n\n return { data: result.data, usage: result.usage };\n }\n}\n\nexport const simple = <T>(config: SimpleStrategyConfig) => {\n return new SimpleStrategy<T>(config);\n};\n","export const buildParallelMergerPrompt = (\n schema: string,\n dataList: unknown[]\n) => {\n const jsonObjects = dataList\n .filter((item) => item !== null && item !== undefined)\n .map((item) => JSON.stringify(item))\n .map((json) => `<json-object>${json}</json-object>`)\n .join(\"\\n\");\n\n const system = `You are a data merger. Combine multiple JSON objects into one object matching the provided schema.\n\n<thinking>\nBefore merging, consider:\n1. Which input objects contain data for each schema field?\n2. How should conflicting values be resolved (prefer more complete/recent data)?\n3. Are there arrays that need to be concatenated vs deduplicated?\n4. Ensure NO information is lost from any input\n</thinking>\n\n<rules>\n- Produce a single JSON object following the schema exactly\n- Combine all information from input objects without losing data\n- Resolve conflicts intelligently (prefer richer/more specific data)\n- Output ONLY valid JSON - no markdown, no explanations\n</rules>`;\n\n const user = `<json-schema>\n${schema}\n</json-schema>\n\n<json-objects>\n${jsonObjects}\n</json-objects>`;\n\n return { system, user };\n};\n","export const runConcurrently = async <T>(\n tasks: Array<() => Promise<T>>,\n concurrency: number\n): Promise<T[]> => {\n const results: T[] = [];\n\n for (let i = 0; i < tasks.length; i += concurrency) {\n const chunk = tasks.slice(i, i + concurrency).map((task) => task());\n const chunkResults = await Promise.all(chunk);\n results.push(...chunkResults);\n }\n\n return results;\n};\n","import type { ExtractionResult, ExtractionStrategy } from \"../types\";\nimport type { ExtractionOptions } from \"../types\";\nimport { buildExtractorPrompt } from \"../prompts/ExtractorPrompt\";\nimport { buildParallelMergerPrompt } from \"../prompts/ParallelMergerPrompt\";\nimport {\n extractWithPrompt,\n getBatches,\n mergeUsage,\n serializeSchema,\n} from \"./utils\";\nimport { runConcurrently } from \"./concurrency\";\nimport { runWithRetries } from \"../llm/RetryingRunner\";\n\nexport type ParallelStrategyConfig = {\n model: unknown;\n mergeModel: unknown;\n chunkSize: number;\n concurrency?: number;\n maxImages?: number;\n outputInstructions?: string;\n execute?: typeof runWithRetries;\n strict?: boolean;\n};\n\nexport class ParallelStrategy<T> implements ExtractionStrategy<T> {\n public name = \"parallel\";\n private config: ParallelStrategyConfig;\n\n constructor(config: ParallelStrategyConfig) {\n this.config = config;\n }\n\n getEstimatedSteps(artifacts: ExtractionOptions<T>[\"artifacts\"]): number {\n const batches = getBatches(artifacts, {\n maxTokens: this.config.chunkSize,\n maxImages: this.config.maxImages,\n });\n return batches.length + 3;\n }\n\n async run(options: ExtractionOptions<T>): Promise<ExtractionResult<T>> {\n const debug = options.debug;\n const { telemetry } = options;\n \n // Create strategy-level span\n const strategySpan = telemetry?.startSpan({\n name: \"strategy.parallel\",\n kind: \"CHAIN\",\n attributes: {\n \"strategy.name\": this.name,\n \"strategy.artifacts.count\": options.artifacts.length,\n \"strategy.chunk_size\": this.config.chunkSize,\n \"strategy.concurrency\": this.config.concurrency,\n },\n });\n \n const batches = getBatches(\n options.artifacts,\n {\n maxTokens: this.config.chunkSize,\n maxImages: this.config.maxImages,\n },\n debug,\n telemetry ?? undefined,\n strategySpan,\n );\n\n const schema = serializeSchema(options.schema);\n const totalSteps = this.getEstimatedSteps(options.artifacts);\n let step = 1;\n\n // Emit start event\n await options.events?.onStep?.({\n step,\n total: totalSteps,\n label: batches.length > 1 ? `batch 1/${batches.length}` : \"extract\",\n });\n debug?.step({\n step,\n total: totalSteps,\n label: batches.length > 1 ? `batch 1/${batches.length}` : \"extract\",\n strategy: this.name,\n });\n\n const tasks = batches.map((batch, index) => async () => {\n const prompt = buildExtractorPrompt(\n batch,\n schema,\n this.config.outputInstructions,\n );\n const result = await extractWithPrompt<T>({\n model: this.config.model,\n schema: options.schema,\n system: prompt.system,\n user: prompt.user,\n artifacts: batch,\n events: options.events,\n execute: this.config.execute as never,\n strict: options.strict ?? this.config.strict,\n debug,\n callId: `parallel_batch_${index + 1}`,\n telemetry: telemetry ?? undefined,\n parentSpan: strategySpan,\n });\n // Emit progress after batch completes (if there are more batches)\n const completedIndex = index + 1;\n if (completedIndex < batches.length) {\n step += 1;\n await options.events?.onStep?.({\n step,\n total: totalSteps,\n label: `batch ${completedIndex + 1}/${batches.length}`,\n });\n debug?.step({\n step,\n total: totalSteps,\n label: `batch ${completedIndex + 1}/${batches.length}`,\n strategy: this.name,\n });\n }\n return result;\n });\n\n const results = await runConcurrently(\n tasks,\n this.config.concurrency ?? batches.length,\n );\n\n debug?.mergeStart({\n mergeId: \"parallel_merge\",\n inputCount: results.length,\n strategy: this.name,\n });\n \n // Create merge span\n const mergeSpan = telemetry?.startSpan({\n name: \"struktur.merge\",\n kind: \"CHAIN\",\n parentSpan: strategySpan,\n attributes: {\n \"merge.strategy\": \"parallel\",\n \"merge.input_count\": results.length,\n },\n });\n\n const mergePrompt = buildParallelMergerPrompt(\n schema,\n results.map((r) => r.data),\n );\n const merged = await extractWithPrompt<T>({\n model: this.config.mergeModel,\n schema: options.schema,\n system: mergePrompt.system,\n user: mergePrompt.user,\n artifacts: [],\n events: options.events,\n execute: this.config.execute as never,\n strict: this.config.strict,\n debug,\n callId: \"parallel_merge\",\n telemetry: telemetry ?? undefined,\n parentSpan: mergeSpan,\n });\n\n step += 1;\n await options.events?.onStep?.({\n step,\n total: totalSteps,\n label: \"merge\",\n });\n debug?.step({\n step,\n total: totalSteps,\n label: \"merge\",\n strategy: this.name,\n });\n debug?.mergeComplete({ mergeId: \"parallel_merge\", success: true });\n \n // End merge span\n if (mergeSpan && telemetry) {\n telemetry.recordEvent(mergeSpan, {\n type: \"merge\",\n strategy: \"parallel\",\n inputCount: results.length,\n outputCount: 1,\n });\n telemetry.endSpan(mergeSpan, {\n status: \"ok\",\n output: merged.data,\n });\n }\n \n // End strategy span\n telemetry?.endSpan(strategySpan!, {\n status: \"ok\",\n output: merged.data,\n });\n\n return {\n data: merged.data,\n usage: mergeUsage([...results.map((r) => r.usage), merged.usage]),\n };\n }\n}\n\nexport const parallel = <T>(config: ParallelStrategyConfig) => {\n return new ParallelStrategy<T>(config);\n};\n","import { formatArtifactsXml } from \"./formatArtifacts\";\nimport type { Artifact } from \"../types\";\n\nconst sequentialSystemPrompt = (schema: string, outputInstructions?: string) => {\n return `<instructions>\nYou are a precise data extraction engine. Extract data from provided artifacts according to the JSON schema, enriching any previous data you receive.\n\n<thinking>\nBefore extracting, consider:\n1. Review previous data - what needs to be preserved vs enriched?\n2. Which new fields have clear values in the artifacts?\n3. Which fields remain missing or unclear (keep null from previous or set to null)?\n4. Can new information improve the structure of existing data?\n5. Ensure NO information is lost from previous data\n</thinking>\n\n<rules>\n- Merge new artifacts into existing data - do not create fresh objects\n- Preserve ALL previous data - losing information breaks the processing chain\n- Use null for missing/uncertain values in new fields\n- Only extract information explicitly present in the artifacts\n- Output ONLY valid JSON matching the schema\n- No markdown, explanations, or code fences\n</rules>\n\n<image-handling>\nSome schema properties may reference artifact IDs (e.g., 'xxx_artifact_id' fields).\nWhen assigning images to properties:\n- Use format: artifact:ID/images/imageNUM.EXT (e.g., 'artifact:123456/images/image1.jpg')\n- Only reference images you can actually see in the provided documents/images\n- Image references are visible in artifact XML or written on images\n- NEVER make up artifact IDs or use normal URLs\n</image-handling>\n\n<output-instructions>\n${outputInstructions ?? \"No additional output instructions provided.\"}\n</output-instructions>\n\n<json-schema>\n${schema}\n</json-schema>\n\n<how-to-output>\nReturn the complete extracted data as valid JSON matching the schema.\nInclude all information from previous data, enriched with the new artifacts.\n</how-to-output>\n</instructions>`;\n};\n\nconst sequentialUserPrompt = (\n artifactsXml: string,\n previousData: string,\n outputInstructions?: string\n) => {\n return `${artifactsXml}\n\n<previous-data>\n${previousData}\n</previous-data>\n\n<task>\n Extract the contents of the given artifacts and ADD/MERGE them into the previous data contained in the <previous-data> tag.\n You MUST NOT lose any information from the previous data. All previous data must be included in your response.\n</task>\n\n<output-instructions>\n${outputInstructions ?? \"\"}\n</output-instructions>`;\n};\n\nexport const buildSequentialPrompt = (\n artifacts: Artifact[],\n schema: string,\n previousData: string,\n outputInstructions?: string\n) => {\n const artifactsXml = formatArtifactsXml(artifacts);\n return {\n system: sequentialSystemPrompt(schema, outputInstructions),\n user: sequentialUserPrompt(artifactsXml, previousData, outputInstructions),\n };\n};\n","import type { ExtractionResult, ExtractionStrategy } from \"../types\";\nimport type { ExtractionOptions } from \"../types\";\nimport { buildSequentialPrompt } from \"../prompts/SequentialExtractorPrompt\";\nimport {\n extractWithPrompt,\n getBatches,\n mergeUsage,\n serializeSchema,\n} from \"./utils\";\nimport { runWithRetries } from \"../llm/RetryingRunner\";\n\nexport type SequentialStrategyConfig = {\n model: unknown;\n chunkSize: number;\n maxImages?: number;\n outputInstructions?: string;\n execute?: typeof runWithRetries;\n strict?: boolean;\n};\n\nexport class SequentialStrategy<T> implements ExtractionStrategy<T> {\n public name = \"sequential\";\n private config: SequentialStrategyConfig;\n\n constructor(config: SequentialStrategyConfig) {\n this.config = config;\n }\n\n getEstimatedSteps(artifacts: ExtractionOptions<T>[\"artifacts\"]): number {\n const batches = getBatches(artifacts, {\n maxTokens: this.config.chunkSize,\n maxImages: this.config.maxImages,\n });\n return batches.length + 2;\n }\n\n async run(options: ExtractionOptions<T>): Promise<ExtractionResult<T>> {\n const debug = options.debug;\n const { telemetry } = options;\n \n // Create strategy-level span\n const strategySpan = telemetry?.startSpan({\n name: \"strategy.sequential\",\n kind: \"CHAIN\",\n attributes: {\n \"strategy.name\": this.name,\n \"strategy.artifacts.count\": options.artifacts.length,\n \"strategy.chunk_size\": this.config.chunkSize,\n },\n });\n \n const batches = getBatches(\n options.artifacts,\n {\n maxTokens: this.config.chunkSize,\n maxImages: this.config.maxImages,\n },\n debug,\n telemetry ?? undefined,\n strategySpan,\n );\n\n const schema = serializeSchema(options.schema);\n let currentData: T | undefined;\n const usages = [];\n const totalSteps = this.getEstimatedSteps(options.artifacts);\n let step = 1;\n\n // Emit start event\n await options.events?.onStep?.({\n step,\n total: totalSteps,\n label: batches.length > 1 ? `batch 1/${batches.length}` : \"extract\",\n });\n debug?.step({\n step,\n total: totalSteps,\n label: batches.length > 1 ? `batch 1/${batches.length}` : \"extract\",\n strategy: this.name,\n });\n\n for (const [index, batch] of batches.entries()) {\n const previousData = currentData ? JSON.stringify(currentData) : \"{}\";\n const prompt = buildSequentialPrompt(\n batch,\n schema,\n previousData,\n this.config.outputInstructions,\n );\n\n const result = await extractWithPrompt<T>({\n model: this.config.model,\n schema: options.schema,\n system: prompt.system,\n user: prompt.user,\n artifacts: batch,\n events: options.events,\n execute: this.config.execute as never,\n strict: options.strict ?? this.config.strict,\n debug,\n callId: `sequential_batch_${index + 1}`,\n telemetry: telemetry ?? undefined,\n parentSpan: strategySpan,\n });\n\n currentData = result.data;\n usages.push(result.usage);\n\n step += 1;\n // Only emit progress if there are more batches\n if (index < batches.length - 1) {\n await options.events?.onStep?.({\n step,\n total: totalSteps,\n label: `batch ${index + 2}/${batches.length}`,\n });\n debug?.step({\n step,\n total: totalSteps,\n label: `batch ${index + 2}/${batches.length}`,\n strategy: this.name,\n });\n }\n }\n\n if (!currentData) {\n throw new Error(\"No data extracted from sequential strategy\");\n }\n\n // End strategy span\n telemetry?.endSpan(strategySpan!, {\n status: \"ok\",\n output: currentData,\n });\n\n return { data: currentData, usage: mergeUsage(usages) };\n }\n}\n\nexport const sequential = <T>(config: SequentialStrategyConfig) => {\n return new SequentialStrategy<T>(config);\n};\n","export const buildDeduplicationPrompt = (\n schema: string,\n data: unknown,\n exampleKeys: string[] = [\"items.3\", \"items.5\"]\n) => {\n const system = `You are a deduplication engine. Identify duplicate entries in structured data.\n\n<thinking>\nBefore deduplicating, consider:\n1. Which fields indicate uniqueness for each entity type?\n2. Are entries duplicates if they share key fields but differ in minor details?\n3. Which entry should be kept (prefer more complete data)?\n</thinking>\n\n<rules>\n- Identify entries that represent the same entity\n- Return paths to duplicates using dot notation (e.g., \"items.3\", \"items.5\")\n- Output ONLY JSON in format: { \"keys\": [\"path1\", \"path2\"] }\n- No markdown, no explanations\n</rules>`;\n\n const user = `<json-schema>\n${schema}\n</json-schema>\n\n<json-data>\n${JSON.stringify(data)}\n</json-data>\n\n<task>Identify duplicate entries in the data and return their paths in the format: { \"keys\": [\"path1\", \"path2\"] }</task>\n\n<example>\nIf items at indices 3 and 5 are duplicates, return: { \"keys\": [\"items.3\", \"items.5\"] }\n</example>`;\n\n return { system, user };\n};\n","import type { AnyJSONSchema } from \"../types\";\n\nconst isArraySchema = (schema: Record<string, unknown>) => {\n if (schema.type === \"array\") {\n return true;\n }\n return false;\n};\n\nconst isObjectSchema = (schema: Record<string, unknown>) => {\n return schema.type === \"object\" && typeof schema.properties === \"object\";\n};\n\nexport class SmartDataMerger {\n private schema: AnyJSONSchema;\n\n constructor(schema: AnyJSONSchema) {\n this.schema = schema;\n }\n\n merge(currentData: Record<string, unknown>, newData: Record<string, unknown>) {\n const merged: Record<string, unknown> = { ...currentData };\n const properties =\n (this.schema as { properties?: Record<string, Record<string, unknown>> })\n .properties ?? {};\n\n for (const [key, propSchema] of Object.entries(properties)) {\n const currentValue = currentData[key];\n const newValue = newData[key];\n\n if (isArraySchema(propSchema)) {\n merged[key] = [\n ...(Array.isArray(currentValue) ? currentValue : []),\n ...(Array.isArray(newValue) ? newValue : []),\n ];\n continue;\n }\n\n if (isObjectSchema(propSchema)) {\n merged[key] = {\n ...(typeof currentValue === \"object\" && currentValue ? currentValue : {}),\n ...(typeof newValue === \"object\" && newValue ? newValue : {}),\n };\n continue;\n }\n\n if (newValue !== undefined && newValue !== null && newValue !== \"\") {\n merged[key] = newValue;\n } else if (currentValue !== undefined) {\n merged[key] = currentValue;\n }\n }\n\n return merged;\n }\n}\n","export const fnv1a32 = (str: string): number => {\n let hash = 2166136261;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n};\n\nconst stableStringify = (value: unknown): string => {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n }\n\n const entries = Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, val]) => `\"${key}\":${stableStringify(val)}`);\n\n return `{${entries.join(\",\")}}`;\n};\n\nexport const findExactDuplicatesWithHashing = (items: unknown[]) => {\n const seen = new Map<number, number>();\n const duplicates: number[] = [];\n\n items.forEach((item, index) => {\n const hash = fnv1a32(stableStringify(item));\n if (seen.has(hash)) {\n duplicates.push(index);\n return;\n }\n seen.set(hash, index);\n });\n\n return duplicates;\n};\n\nexport const deduplicateByIndices = <T>(items: T[], indices: number[]) => {\n const remove = new Set(indices);\n return items.filter((_, index) => !remove.has(index));\n};\n","import type { ExtractionResult, ExtractionStrategy } from \"../types\";\nimport type { ExtractionOptions } from \"../types\";\nimport { buildExtractorPrompt } from \"../prompts/ExtractorPrompt\";\nimport { buildDeduplicationPrompt } from \"../prompts/DeduplicationPrompt\";\nimport {\n extractWithPrompt,\n getBatches,\n mergeUsage,\n serializeSchema,\n} from \"./utils\";\nimport { runConcurrently } from \"./concurrency\";\nimport { SmartDataMerger } from \"../merge/SmartDataMerger\";\nimport {\n findExactDuplicatesWithHashing,\n deduplicateByIndices,\n} from \"../merge/Deduplicator\";\nimport { runWithRetries } from \"../llm/RetryingRunner\";\n\nexport type ParallelAutoMergeStrategyConfig = {\n model: unknown;\n chunkSize: number;\n concurrency?: number;\n maxImages?: number;\n outputInstructions?: string;\n dedupeModel?: unknown;\n execute?: typeof runWithRetries;\n dedupeExecute?: typeof runWithRetries;\n strict?: boolean;\n};\n\nconst dedupeSchema = {\n type: \"object\",\n properties: {\n keys: { type: \"array\", items: { type: \"string\" } },\n },\n required: [\"keys\"],\n additionalProperties: false,\n} as const;\n\nconst dedupeArrays = (data: Record<string, unknown>) => {\n const result: Record<string, unknown> = { ...data };\n for (const [key, value] of Object.entries(result)) {\n if (Array.isArray(value)) {\n const duplicates = findExactDuplicatesWithHashing(value);\n result[key] = deduplicateByIndices(value, duplicates);\n }\n }\n return result;\n};\n\nconst removeByPath = (data: Record<string, unknown>, path: string) => {\n const [root, indexStr] = path.split(\".\");\n const index = Number(indexStr);\n if (!root || Number.isNaN(index)) {\n return data;\n }\n\n const value = data[root];\n if (!Array.isArray(value)) {\n return data;\n }\n\n const next = [...value];\n next.splice(index, 1);\n return { ...data, [root]: next };\n};\n\nexport class ParallelAutoMergeStrategy<T> implements ExtractionStrategy<T> {\n public name = \"parallel-auto-merge\";\n private config: ParallelAutoMergeStrategyConfig;\n\n constructor(config: ParallelAutoMergeStrategyConfig) {\n this.config = config;\n }\n\n getEstimatedSteps(artifacts: ExtractionOptions<T>[\"artifacts\"]): number {\n const batches = getBatches(artifacts, {\n maxTokens: this.config.chunkSize,\n maxImages: this.config.maxImages,\n });\n return batches.length + 3;\n }\n\n async run(options: ExtractionOptions<T>): Promise<ExtractionResult<T>> {\n const debug = options.debug;\n const { telemetry } = options;\n \n // Create strategy-level span\n const strategySpan = telemetry?.startSpan({\n name: \"strategy.parallel-auto-merge\",\n kind: \"CHAIN\",\n attributes: {\n \"strategy.name\": this.name,\n \"strategy.artifacts.count\": options.artifacts.length,\n \"strategy.chunk_size\": this.config.chunkSize,\n \"strategy.concurrency\": this.config.concurrency,\n },\n });\n \n const batches = getBatches(\n options.artifacts,\n {\n maxTokens: this.config.chunkSize,\n maxImages: this.config.maxImages,\n },\n debug,\n telemetry ?? undefined,\n strategySpan,\n );\n\n const schema = serializeSchema(options.schema);\n const totalSteps = this.getEstimatedSteps(options.artifacts);\n let step = 1;\n\n const tasks = batches.map((batch, index) => async () => {\n const prompt = buildExtractorPrompt(\n batch,\n schema,\n this.config.outputInstructions,\n );\n const result = await extractWithPrompt<T>({\n model: this.config.model,\n schema: options.schema,\n system: prompt.system,\n user: prompt.user,\n artifacts: batch,\n events: options.events,\n execute: this.config.execute as never,\n strict: options.strict ?? this.config.strict,\n debug,\n callId: `parallel_auto_batch_${index + 1}`,\n telemetry: telemetry ?? undefined,\n parentSpan: strategySpan,\n });\n step += 1;\n await options.events?.onStep?.({\n step,\n total: totalSteps,\n label: `batch ${index + 1}/${batches.length}`,\n });\n debug?.step({\n step,\n total: totalSteps,\n label: `batch ${index + 1}/${batches.length}`,\n strategy: this.name,\n });\n return result;\n });\n\n const results = await runConcurrently(\n tasks,\n this.config.concurrency ?? batches.length,\n );\n\n const merger = new SmartDataMerger(\n options.schema as Record<string, unknown>,\n );\n let merged = {} as Record<string, unknown>;\n\n debug?.mergeStart({\n mergeId: \"parallel_auto_smart_merge\",\n inputCount: results.length,\n strategy: this.name,\n });\n \n // Create smart merge span\n const mergeSpan = telemetry?.startSpan({\n name: \"struktur.smart_merge\",\n kind: \"CHAIN\",\n parentSpan: strategySpan,\n attributes: {\n \"merge.strategy\": \"smart\",\n \"merge.input_count\": results.length,\n },\n });\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i]!;\n const prevSize = Object.keys(merged).length;\n merged = merger.merge(merged, result.data as Record<string, unknown>);\n const newSize = Object.keys(merged).length;\n\n // Log merge operation per field\n for (const key of Object.keys(result.data as Record<string, unknown>)) {\n const leftArray = Array.isArray(merged[key])\n ? (merged[key] as unknown[]).length\n : undefined;\n const rightArray = Array.isArray(\n (result.data as Record<string, unknown>)[key],\n )\n ? ((result.data as Record<string, unknown>)[key] as unknown[]).length\n : undefined;\n\n debug?.smartMergeField({\n mergeId: \"parallel_auto_smart_merge\",\n field: key,\n operation: \"merge_arrays\",\n leftCount: leftArray,\n rightCount: rightArray,\n });\n \n // Record merge event in telemetry\n if (mergeSpan && telemetry) {\n telemetry.recordEvent(mergeSpan, {\n type: \"merge\",\n strategy: \"smart\",\n inputCount: rightArray ?? 1,\n outputCount: leftArray ?? 1,\n });\n }\n }\n }\n\n debug?.mergeComplete({\n mergeId: \"parallel_auto_smart_merge\",\n success: true,\n });\n \n // End merge span\n if (mergeSpan && telemetry) {\n telemetry.endSpan(mergeSpan, {\n status: \"ok\",\n output: merged,\n });\n }\n\n merged = dedupeArrays(merged);\n \n // Create exact dedupe span\n const exactDedupeSpan = telemetry?.startSpan({\n name: \"struktur.exact_dedupe\",\n kind: \"CHAIN\",\n parentSpan: strategySpan,\n attributes: {\n \"dedupe.method\": \"exact_hashing\",\n },\n });\n \n // End exact dedupe span\n if (exactDedupeSpan && telemetry) {\n telemetry.recordEvent(exactDedupeSpan, {\n type: \"merge\",\n strategy: \"exact_hash_dedupe\",\n inputCount: Object.keys(merged).length,\n outputCount: Object.keys(merged).length,\n });\n telemetry.endSpan(exactDedupeSpan, {\n status: \"ok\",\n output: merged,\n });\n }\n\n const dedupePrompt = buildDeduplicationPrompt(schema, merged);\n\n debug?.dedupeStart({\n dedupeId: \"parallel_auto_dedupe\",\n itemCount: Object.keys(merged).length,\n });\n \n // Create LLM dedupe span\n const llmDedupeSpan = telemetry?.startSpan({\n name: \"struktur.llm_dedupe\",\n kind: \"CHAIN\",\n parentSpan: strategySpan,\n attributes: {\n \"dedupe.method\": \"llm\",\n },\n });\n\n const dedupeResponse = await runWithRetries<{ keys: string[] }>({\n model: this.config.dedupeModel ?? this.config.model,\n schema: dedupeSchema,\n system: dedupePrompt.system,\n user: dedupePrompt.user,\n events: options.events,\n execute: this.config.dedupeExecute,\n strict: this.config.strict,\n debug,\n callId: \"parallel_auto_dedupe\",\n telemetry: telemetry ?? undefined,\n parentSpan: llmDedupeSpan,\n });\n\n step += 1;\n await options.events?.onStep?.({\n step,\n total: totalSteps,\n label: \"dedupe\",\n });\n debug?.step({\n step,\n total: totalSteps,\n label: \"dedupe\",\n strategy: this.name,\n });\n\n let deduped = merged;\n for (const key of dedupeResponse.data.keys) {\n deduped = removeByPath(deduped, key);\n }\n\n debug?.dedupeComplete({\n dedupeId: \"parallel_auto_dedupe\",\n duplicatesFound: dedupeResponse.data.keys.length,\n itemsRemoved: dedupeResponse.data.keys.length,\n });\n \n // End LLM dedupe span\n if (llmDedupeSpan && telemetry) {\n telemetry.recordEvent(llmDedupeSpan, {\n type: \"merge\",\n strategy: \"llm_dedupe\",\n inputCount: Object.keys(merged).length,\n outputCount: Object.keys(deduped).length,\n deduped: dedupeResponse.data.keys.length,\n });\n telemetry.endSpan(llmDedupeSpan, {\n status: \"ok\",\n output: deduped,\n });\n }\n\n // End strategy span\n telemetry?.endSpan(strategySpan!, {\n status: \"ok\",\n output: deduped,\n });\n\n return {\n data: deduped as T,\n usage: mergeUsage([...results.map((r) => r.usage), dedupeResponse.usage]),\n };\n }\n}\n\nexport const parallelAutoMerge = <T>(\n config: ParallelAutoMergeStrategyConfig,\n) => {\n return new ParallelAutoMergeStrategy<T>(config);\n};\n\nexport const __testing__ = {\n dedupeArrays,\n removeByPath,\n};\n","import type { ExtractionResult, ExtractionStrategy } from \"../types\";\nimport type { ExtractionOptions } from \"../types\";\nimport { buildExtractorPrompt } from \"../prompts/ExtractorPrompt\";\nimport { buildDeduplicationPrompt } from \"../prompts/DeduplicationPrompt\";\nimport {\n extractWithPrompt,\n getBatches,\n mergeUsage,\n serializeSchema,\n} from \"./utils\";\nimport { SmartDataMerger } from \"../merge/SmartDataMerger\";\nimport {\n findExactDuplicatesWithHashing,\n deduplicateByIndices,\n} from \"../merge/Deduplicator\";\nimport { runWithRetries } from \"../llm/RetryingRunner\";\n\nexport type SequentialAutoMergeStrategyConfig = {\n model: unknown;\n chunkSize: number;\n maxImages?: number;\n outputInstructions?: string;\n dedupeModel?: unknown;\n execute?: typeof runWithRetries;\n dedupeExecute?: typeof runWithRetries;\n strict?: boolean;\n};\n\nconst dedupeSchema = {\n type: \"object\",\n properties: {\n keys: { type: \"array\", items: { type: \"string\" } },\n },\n required: [\"keys\"],\n additionalProperties: false,\n} as const;\n\nconst dedupeArrays = (data: Record<string, unknown>) => {\n const result: Record<string, unknown> = { ...data };\n for (const [key, value] of Object.entries(result)) {\n if (Array.isArray(value)) {\n const duplicates = findExactDuplicatesWithHashing(value);\n result[key] = deduplicateByIndices(value, duplicates);\n }\n }\n return result;\n};\n\nconst removeByPath = (data: Record<string, unknown>, path: string) => {\n const [root, indexStr] = path.split(\".\");\n const index = Number(indexStr);\n if (!root || Number.isNaN(index)) {\n return data;\n }\n\n const value = data[root];\n if (!Array.isArray(value)) {\n return data;\n }\n\n const next = [...value];\n next.splice(index, 1);\n return { ...data, [root]: next };\n};\n\nexport class SequentialAutoMergeStrategy<T> implements ExtractionStrategy<T> {\n public name = \"sequential-auto-merge\";\n private config: SequentialAutoMergeStrategyConfig;\n\n constructor(config: SequentialAutoMergeStrategyConfig) {\n this.config = config;\n }\n\n getEstimatedSteps(artifacts: ExtractionOptions<T>[\"artifacts\"]): number {\n const batches = getBatches(artifacts, {\n maxTokens: this.config.chunkSize,\n maxImages: this.config.maxImages,\n });\n return batches.length + 3;\n }\n\n async run(options: ExtractionOptions<T>): Promise<ExtractionResult<T>> {\n const debug = options.debug;\n const { telemetry } = options;\n \n // Create strategy-level span\n const strategySpan = telemetry?.startSpan({\n name: \"strategy.sequential-auto-merge\",\n kind: \"CHAIN\",\n attributes: {\n \"strategy.name\": this.name,\n \"strategy.artifacts.count\": options.artifacts.length,\n \"strategy.chunk_size\": this.config.chunkSize,\n },\n });\n \n const batches = getBatches(\n options.artifacts,\n {\n maxTokens: this.config.chunkSize,\n maxImages: this.config.maxImages,\n },\n debug,\n telemetry ?? undefined,\n strategySpan,\n );\n\n const schema = serializeSchema(options.schema);\n const merger = new SmartDataMerger(\n options.schema as Record<string, unknown>,\n );\n let merged = {} as Record<string, unknown>;\n const usages = [];\n const totalSteps = this.getEstimatedSteps(options.artifacts);\n let step = 1;\n\n debug?.mergeStart({\n mergeId: \"sequential_auto_merge\",\n inputCount: batches.length,\n strategy: this.name,\n });\n \n // Create smart merge span\n const mergeSpan = telemetry?.startSpan({\n name: \"struktur.smart_merge\",\n kind: \"CHAIN\",\n parentSpan: strategySpan,\n attributes: {\n \"merge.strategy\": \"smart\",\n \"merge.input_count\": batches.length,\n },\n });\n\n for (const [index, batch] of batches.entries()) {\n const prompt = buildExtractorPrompt(\n batch,\n schema,\n this.config.outputInstructions,\n );\n const result = await extractWithPrompt<T>({\n model: this.config.model,\n schema: options.schema,\n system: prompt.system,\n user: prompt.user,\n artifacts: batch,\n events: options.events,\n execute: this.config.execute as never,\n strict: options.strict ?? this.config.strict,\n debug,\n callId: `sequential_auto_batch_${index + 1}`,\n telemetry: telemetry ?? undefined,\n parentSpan: mergeSpan,\n });\n\n merged = merger.merge(merged, result.data as Record<string, unknown>);\n usages.push(result.usage);\n\n // Log merge operation per field\n for (const key of Object.keys(result.data as Record<string, unknown>)) {\n const leftArray = Array.isArray(merged[key])\n ? (merged[key] as unknown[]).length\n : undefined;\n const rightArray = Array.isArray(\n (result.data as Record<string, unknown>)[key],\n )\n ? ((result.data as Record<string, unknown>)[key] as unknown[]).length\n : undefined;\n\n debug?.smartMergeField({\n mergeId: \"sequential_auto_merge\",\n field: key,\n operation: \"merge_arrays\",\n leftCount: leftArray,\n rightCount: rightArray,\n });\n \n // Record merge event in telemetry\n if (mergeSpan && telemetry) {\n telemetry.recordEvent(mergeSpan, {\n type: \"merge\",\n strategy: \"smart\",\n inputCount: rightArray ?? 1,\n outputCount: leftArray ?? 1,\n });\n }\n }\n\n step += 1;\n await options.events?.onStep?.({\n step,\n total: totalSteps,\n label: `batch ${index + 1}/${batches.length}`,\n });\n debug?.step({\n step,\n total: totalSteps,\n label: `batch ${index + 1}/${batches.length}`,\n strategy: this.name,\n });\n }\n\n debug?.mergeComplete({ mergeId: \"sequential_auto_merge\", success: true });\n \n // End merge span\n if (mergeSpan && telemetry) {\n telemetry.endSpan(mergeSpan, {\n status: \"ok\",\n output: merged,\n });\n }\n\n merged = dedupeArrays(merged);\n \n // Create exact dedupe span\n const exactDedupeSpan = telemetry?.startSpan({\n name: \"struktur.exact_dedupe\",\n kind: \"CHAIN\",\n parentSpan: strategySpan,\n attributes: {\n \"dedupe.method\": \"exact_hashing\",\n },\n });\n \n // End exact dedupe span\n if (exactDedupeSpan && telemetry) {\n telemetry.recordEvent(exactDedupeSpan, {\n type: \"merge\",\n strategy: \"exact_hash_dedupe\",\n inputCount: Object.keys(merged).length,\n outputCount: Object.keys(merged).length,\n });\n telemetry.endSpan(exactDedupeSpan, {\n status: \"ok\",\n output: merged,\n });\n }\n\n const dedupePrompt = buildDeduplicationPrompt(schema, merged);\n\n debug?.dedupeStart({\n dedupeId: \"sequential_auto_dedupe\",\n itemCount: Object.keys(merged).length,\n });\n \n // Create LLM dedupe span\n const llmDedupeSpan = telemetry?.startSpan({\n name: \"struktur.llm_dedupe\",\n kind: \"CHAIN\",\n parentSpan: strategySpan,\n attributes: {\n \"dedupe.method\": \"llm\",\n },\n });\n\n const dedupeResponse = await runWithRetries<{ keys: string[] }>({\n model: this.config.dedupeModel ?? this.config.model,\n schema: dedupeSchema,\n system: dedupePrompt.system,\n user: dedupePrompt.user,\n events: options.events,\n execute: this.config.dedupeExecute,\n strict: this.config.strict,\n debug,\n callId: \"sequential_auto_dedupe\",\n telemetry: telemetry ?? undefined,\n parentSpan: llmDedupeSpan,\n });\n\n step += 1;\n await options.events?.onStep?.({\n step,\n total: totalSteps,\n label: \"dedupe\",\n });\n debug?.step({\n step,\n total: totalSteps,\n label: \"dedupe\",\n strategy: this.name,\n });\n\n let deduped = merged;\n for (const key of dedupeResponse.data.keys) {\n deduped = removeByPath(deduped, key);\n }\n\n debug?.dedupeComplete({\n dedupeId: \"sequential_auto_dedupe\",\n duplicatesFound: dedupeResponse.data.keys.length,\n itemsRemoved: dedupeResponse.data.keys.length,\n });\n \n // End LLM dedupe span\n if (llmDedupeSpan && telemetry) {\n telemetry.recordEvent(llmDedupeSpan, {\n type: \"merge\",\n strategy: \"llm_dedupe\",\n inputCount: Object.keys(merged).length,\n outputCount: Object.keys(deduped).length,\n deduped: dedupeResponse.data.keys.length,\n });\n telemetry.endSpan(llmDedupeSpan, {\n status: \"ok\",\n output: deduped,\n });\n }\n \n // End strategy span\n telemetry?.endSpan(strategySpan!, {\n status: \"ok\",\n output: deduped,\n });\n\n return {\n data: deduped as T,\n usage: mergeUsage([...usages, dedupeResponse.usage]),\n };\n }\n}\n\nexport const sequentialAutoMerge = <T>(\n config: SequentialAutoMergeStrategyConfig,\n) => {\n return new SequentialAutoMergeStrategy<T>(config);\n};\n","import type { ExtractionResult, ExtractionStrategy } from \"../types\";\nimport type { ExtractionOptions } from \"../types\";\nimport { buildExtractorPrompt } from \"../prompts/ExtractorPrompt\";\nimport { buildParallelMergerPrompt } from \"../prompts/ParallelMergerPrompt\";\nimport { buildSequentialPrompt } from \"../prompts/SequentialExtractorPrompt\";\nimport {\n extractWithPrompt,\n getBatches,\n mergeUsage,\n serializeSchema,\n} from \"./utils\";\nimport { runConcurrently } from \"./concurrency\";\nimport { runWithRetries } from \"../llm/RetryingRunner\";\n\nexport type DoublePassStrategyConfig = {\n model: unknown;\n mergeModel: unknown;\n chunkSize: number;\n concurrency?: number;\n maxImages?: number;\n outputInstructions?: string;\n execute?: typeof runWithRetries;\n strict?: boolean;\n};\n\nexport class DoublePassStrategy<T> implements ExtractionStrategy<T> {\n public name = \"double-pass\";\n private config: DoublePassStrategyConfig;\n\n constructor(config: DoublePassStrategyConfig) {\n this.config = config;\n }\n\n getEstimatedSteps(artifacts: ExtractionOptions<T>[\"artifacts\"]): number {\n const batches = getBatches(artifacts, {\n maxTokens: this.config.chunkSize,\n maxImages: this.config.maxImages,\n });\n return batches.length * 2 + 3;\n }\n\n async run(options: ExtractionOptions<T>): Promise<ExtractionResult<T>> {\n const debug = options.debug;\n const { telemetry } = options;\n \n // Create strategy-level span\n const strategySpan = telemetry?.startSpan({\n name: \"strategy.double-pass\",\n kind: \"CHAIN\",\n attributes: {\n \"strategy.name\": this.name,\n \"strategy.artifacts.count\": options.artifacts.length,\n \"strategy.chunk_size\": this.config.chunkSize,\n \"strategy.concurrency\": this.config.concurrency,\n },\n });\n \n const batches = getBatches(\n options.artifacts,\n {\n maxTokens: this.config.chunkSize,\n maxImages: this.config.maxImages,\n },\n debug,\n telemetry ?? undefined,\n strategySpan,\n );\n\n const schema = serializeSchema(options.schema);\n const totalSteps = this.getEstimatedSteps(options.artifacts);\n let step = 1;\n \n // Create pass 1 span\n const pass1Span = telemetry?.startSpan({\n name: \"struktur.pass_1\",\n kind: \"CHAIN\",\n parentSpan: strategySpan,\n attributes: {\n \"pass.number\": 1,\n \"pass.type\": \"parallel_extraction\",\n },\n });\n\n const tasks = batches.map((batch, index) => async () => {\n const prompt = buildExtractorPrompt(\n batch,\n schema,\n this.config.outputInstructions,\n );\n const result = await extractWithPrompt<T>({\n model: this.config.model,\n schema: options.schema,\n system: prompt.system,\n user: prompt.user,\n artifacts: batch,\n events: options.events,\n execute: this.config.execute as never,\n strict: options.strict ?? this.config.strict,\n debug,\n callId: `double_pass_1_batch_${index + 1}`,\n telemetry: telemetry ?? undefined,\n parentSpan: pass1Span,\n });\n step += 1;\n await options.events?.onStep?.({\n step,\n total: totalSteps,\n label: `pass 1 batch ${index + 1}/${batches.length}`,\n });\n debug?.step({\n step,\n total: totalSteps,\n label: `pass 1 batch ${index + 1}/${batches.length}`,\n strategy: this.name,\n });\n return result;\n });\n\n const results = await runConcurrently(\n tasks,\n this.config.concurrency ?? batches.length,\n );\n\n debug?.mergeStart({\n mergeId: \"double_pass_1_merge\",\n inputCount: results.length,\n strategy: this.name,\n });\n \n // Create pass 1 merge span\n const pass1MergeSpan = telemetry?.startSpan({\n name: \"struktur.pass_1_merge\",\n kind: \"CHAIN\",\n parentSpan: pass1Span,\n attributes: {\n \"merge.strategy\": \"parallel\",\n \"merge.input_count\": results.length,\n },\n });\n\n const mergePrompt = buildParallelMergerPrompt(\n schema,\n results.map((r) => r.data),\n );\n const merged = await extractWithPrompt<T>({\n model: this.config.mergeModel,\n schema: options.schema,\n system: mergePrompt.system,\n user: mergePrompt.user,\n artifacts: [],\n events: options.events,\n execute: this.config.execute as never,\n strict: this.config.strict,\n debug,\n callId: \"double_pass_1_merge\",\n telemetry: telemetry ?? undefined,\n parentSpan: pass1MergeSpan,\n });\n\n step += 1;\n await options.events?.onStep?.({\n step,\n total: totalSteps,\n label: \"pass 1 merge\",\n });\n debug?.step({\n step,\n total: totalSteps,\n label: \"pass 1 merge\",\n strategy: this.name,\n });\n debug?.mergeComplete({ mergeId: \"double_pass_1_merge\", success: true });\n \n // End pass 1 merge span\n if (pass1MergeSpan && telemetry) {\n telemetry.recordEvent(pass1MergeSpan, {\n type: \"merge\",\n strategy: \"parallel\",\n inputCount: results.length,\n outputCount: 1,\n });\n telemetry.endSpan(pass1MergeSpan, {\n status: \"ok\",\n output: merged.data,\n });\n }\n \n // End pass 1 span\n telemetry?.endSpan(pass1Span!, {\n status: \"ok\",\n output: merged.data,\n });\n \n // Create pass 2 span\n const pass2Span = telemetry?.startSpan({\n name: \"struktur.pass_2\",\n kind: \"CHAIN\",\n parentSpan: strategySpan,\n attributes: {\n \"pass.number\": 2,\n \"pass.type\": \"sequential_refinement\",\n },\n });\n\n let currentData = merged.data;\n const usages = [...results.map((r) => r.usage), merged.usage];\n\n for (const [index, batch] of batches.entries()) {\n const prompt = buildSequentialPrompt(\n batch,\n schema,\n JSON.stringify(currentData),\n this.config.outputInstructions,\n );\n\n const result = await extractWithPrompt<T>({\n model: this.config.model,\n schema: options.schema,\n system: prompt.system,\n user: prompt.user,\n artifacts: batch,\n events: options.events,\n execute: this.config.execute as never,\n strict: this.config.strict,\n debug,\n callId: `double_pass_2_batch_${index + 1}`,\n telemetry: telemetry ?? undefined,\n parentSpan: pass2Span,\n });\n\n currentData = result.data;\n usages.push(result.usage);\n\n step += 1;\n await options.events?.onStep?.({\n step,\n total: totalSteps,\n label: `pass 2 batch ${index + 1}/${batches.length}`,\n });\n debug?.step({\n step,\n total: totalSteps,\n label: `pass 2 batch ${index + 1}/${batches.length}`,\n strategy: this.name,\n });\n }\n \n // End pass 2 span\n telemetry?.endSpan(pass2Span!, {\n status: \"ok\",\n output: currentData,\n });\n \n // End strategy span\n telemetry?.endSpan(strategySpan!, {\n status: \"ok\",\n output: currentData,\n });\n\n return { data: currentData, usage: mergeUsage(usages) };\n }\n}\n\nexport const doublePass = <T>(config: DoublePassStrategyConfig) => {\n return new DoublePassStrategy<T>(config);\n};\n","import type { ExtractionResult, ExtractionStrategy } from \"../types\";\nimport type { ExtractionOptions } from \"../types\";\nimport { buildExtractorPrompt } from \"../prompts/ExtractorPrompt\";\nimport { buildDeduplicationPrompt } from \"../prompts/DeduplicationPrompt\";\nimport { buildSequentialPrompt } from \"../prompts/SequentialExtractorPrompt\";\nimport {\n extractWithPrompt,\n getBatches,\n mergeUsage,\n serializeSchema,\n} from \"./utils\";\nimport { SmartDataMerger } from \"../merge/SmartDataMerger\";\nimport {\n findExactDuplicatesWithHashing,\n deduplicateByIndices,\n} from \"../merge/Deduplicator\";\nimport { runConcurrently } from \"./concurrency\";\nimport { runWithRetries } from \"../llm/RetryingRunner\";\n\nexport type DoublePassAutoMergeStrategyConfig = {\n model: unknown;\n chunkSize: number;\n concurrency?: number;\n maxImages?: number;\n outputInstructions?: string;\n dedupeModel?: unknown;\n execute?: typeof runWithRetries;\n dedupeExecute?: typeof runWithRetries;\n strict?: boolean;\n};\n\nconst dedupeSchema = {\n type: \"object\",\n properties: {\n keys: { type: \"array\", items: { type: \"string\" } },\n },\n required: [\"keys\"],\n additionalProperties: false,\n} as const;\n\nconst dedupeArrays = (data: Record<string, unknown>) => {\n const result: Record<string, unknown> = { ...data };\n for (const [key, value] of Object.entries(result)) {\n if (Array.isArray(value)) {\n const duplicates = findExactDuplicatesWithHashing(value);\n result[key] = deduplicateByIndices(value, duplicates);\n }\n }\n return result;\n};\n\nconst removeByPath = (data: Record<string, unknown>, path: string) => {\n const [root, indexStr] = path.split(\".\");\n const index = Number(indexStr);\n if (!root || Number.isNaN(index)) {\n return data;\n }\n\n const value = data[root];\n if (!Array.isArray(value)) {\n return data;\n }\n\n const next = [...value];\n next.splice(index, 1);\n return { ...data, [root]: next };\n};\n\nexport class DoublePassAutoMergeStrategy<T> implements ExtractionStrategy<T> {\n public name = \"double-pass-auto-merge\";\n private config: DoublePassAutoMergeStrategyConfig;\n\n constructor(config: DoublePassAutoMergeStrategyConfig) {\n this.config = config;\n }\n\n getEstimatedSteps(artifacts: ExtractionOptions<T>[\"artifacts\"]): number {\n const batches = getBatches(artifacts, {\n maxTokens: this.config.chunkSize,\n maxImages: this.config.maxImages,\n });\n return batches.length * 2 + 3;\n }\n\n async run(options: ExtractionOptions<T>): Promise<ExtractionResult<T>> {\n const debug = options.debug;\n const { telemetry } = options;\n \n // Create strategy-level span\n const strategySpan = telemetry?.startSpan({\n name: \"strategy.double-pass-auto-merge\",\n kind: \"CHAIN\",\n attributes: {\n \"strategy.name\": this.name,\n \"strategy.artifacts.count\": options.artifacts.length,\n \"strategy.chunk_size\": this.config.chunkSize,\n \"strategy.concurrency\": this.config.concurrency,\n },\n });\n \n const batches = getBatches(\n options.artifacts,\n {\n maxTokens: this.config.chunkSize,\n maxImages: this.config.maxImages,\n },\n debug,\n telemetry ?? undefined,\n strategySpan,\n );\n\n const schema = serializeSchema(options.schema);\n const totalSteps = this.getEstimatedSteps(options.artifacts);\n let step = 1;\n \n // Create pass 1 span\n const pass1Span = telemetry?.startSpan({\n name: \"struktur.pass_1\",\n kind: \"CHAIN\",\n parentSpan: strategySpan,\n attributes: {\n \"pass.number\": 1,\n \"pass.type\": \"parallel_extraction\",\n },\n });\n\n const tasks = batches.map((batch, index) => async () => {\n const prompt = buildExtractorPrompt(\n batch,\n schema,\n this.config.outputInstructions,\n );\n const result = await extractWithPrompt<T>({\n model: this.config.model,\n schema: options.schema,\n system: prompt.system,\n user: prompt.user,\n artifacts: batch,\n events: options.events,\n execute: this.config.execute as never,\n strict: options.strict ?? this.config.strict,\n debug,\n callId: `double_pass_auto_1_batch_${index + 1}`,\n telemetry: telemetry ?? undefined,\n parentSpan: pass1Span,\n });\n step += 1;\n await options.events?.onStep?.({\n step,\n total: totalSteps,\n label: `pass 1 batch ${index + 1}/${batches.length}`,\n });\n debug?.step({\n step,\n total: totalSteps,\n label: `pass 1 batch ${index + 1}/${batches.length}`,\n strategy: this.name,\n });\n return result;\n });\n\n const results = await runConcurrently(\n tasks,\n this.config.concurrency ?? batches.length,\n );\n\n const merger = new SmartDataMerger(\n options.schema as Record<string, unknown>,\n );\n let merged = {} as Record<string, unknown>;\n\n debug?.mergeStart({\n mergeId: \"double_pass_auto_merge\",\n inputCount: results.length,\n strategy: this.name,\n });\n \n // Create smart merge span\n const mergeSpan = telemetry?.startSpan({\n name: \"struktur.smart_merge\",\n kind: \"CHAIN\",\n parentSpan: pass1Span,\n attributes: {\n \"merge.strategy\": \"smart\",\n \"merge.input_count\": results.length,\n },\n });\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i]!;\n merged = merger.merge(merged, result.data as Record<string, unknown>);\n\n // Log merge operation per field\n for (const key of Object.keys(result.data as Record<string, unknown>)) {\n const leftArray = Array.isArray(merged[key])\n ? (merged[key] as unknown[]).length\n : undefined;\n const rightArray = Array.isArray(\n (result.data as Record<string, unknown>)[key],\n )\n ? ((result.data as Record<string, unknown>)[key] as unknown[]).length\n : undefined;\n\n debug?.smartMergeField({\n mergeId: \"double_pass_auto_merge\",\n field: key,\n operation: \"merge_arrays\",\n leftCount: leftArray,\n rightCount: rightArray,\n });\n \n // Record merge event in telemetry\n if (mergeSpan && telemetry) {\n telemetry.recordEvent(mergeSpan, {\n type: \"merge\",\n strategy: \"smart\",\n inputCount: rightArray ?? 1,\n outputCount: leftArray ?? 1,\n });\n }\n }\n }\n\n debug?.mergeComplete({ mergeId: \"double_pass_auto_merge\", success: true });\n \n // End merge span\n if (mergeSpan && telemetry) {\n telemetry.endSpan(mergeSpan, {\n status: \"ok\",\n output: merged,\n });\n }\n\n merged = dedupeArrays(merged);\n \n // Create exact dedupe span\n const exactDedupeSpan = telemetry?.startSpan({\n name: \"struktur.exact_dedupe\",\n kind: \"CHAIN\",\n parentSpan: pass1Span,\n attributes: {\n \"dedupe.method\": \"exact_hashing\",\n },\n });\n \n // End exact dedupe span\n if (exactDedupeSpan && telemetry) {\n telemetry.recordEvent(exactDedupeSpan, {\n type: \"merge\",\n strategy: \"exact_hash_dedupe\",\n inputCount: Object.keys(merged).length,\n outputCount: Object.keys(merged).length,\n });\n telemetry.endSpan(exactDedupeSpan, {\n status: \"ok\",\n output: merged,\n });\n }\n\n const dedupePrompt = buildDeduplicationPrompt(schema, merged);\n\n debug?.dedupeStart({\n dedupeId: \"double_pass_auto_dedupe\",\n itemCount: Object.keys(merged).length,\n });\n \n // Create LLM dedupe span\n const llmDedupeSpan = telemetry?.startSpan({\n name: \"struktur.llm_dedupe\",\n kind: \"CHAIN\",\n parentSpan: pass1Span,\n attributes: {\n \"dedupe.method\": \"llm\",\n },\n });\n\n const dedupeResponse = await runWithRetries<{ keys: string[] }>({\n model: this.config.dedupeModel ?? this.config.model,\n schema: dedupeSchema,\n system: dedupePrompt.system,\n user: dedupePrompt.user,\n events: options.events,\n execute: this.config.dedupeExecute,\n strict: this.config.strict,\n debug,\n callId: \"double_pass_auto_dedupe\",\n telemetry: telemetry ?? undefined,\n parentSpan: llmDedupeSpan,\n });\n\n step += 1;\n await options.events?.onStep?.({\n step,\n total: totalSteps,\n label: \"pass 1 dedupe\",\n });\n debug?.step({\n step,\n total: totalSteps,\n label: \"pass 1 dedupe\",\n strategy: this.name,\n });\n\n let deduped = merged;\n for (const key of dedupeResponse.data.keys) {\n deduped = removeByPath(deduped, key);\n }\n\n debug?.dedupeComplete({\n dedupeId: \"double_pass_auto_dedupe\",\n duplicatesFound: dedupeResponse.data.keys.length,\n itemsRemoved: dedupeResponse.data.keys.length,\n });\n \n // End LLM dedupe span\n if (llmDedupeSpan && telemetry) {\n telemetry.recordEvent(llmDedupeSpan, {\n type: \"merge\",\n strategy: \"llm_dedupe\",\n inputCount: Object.keys(merged).length,\n outputCount: Object.keys(deduped).length,\n deduped: dedupeResponse.data.keys.length,\n });\n telemetry.endSpan(llmDedupeSpan, {\n status: \"ok\",\n output: deduped,\n });\n }\n \n // End pass 1 span\n telemetry?.endSpan(pass1Span!, {\n status: \"ok\",\n output: deduped,\n });\n\n let currentData = deduped as T;\n const usages = [...results.map((r) => r.usage), dedupeResponse.usage];\n \n // Create pass 2 span\n const pass2Span = telemetry?.startSpan({\n name: \"struktur.pass_2\",\n kind: \"CHAIN\",\n parentSpan: strategySpan,\n attributes: {\n \"pass.number\": 2,\n \"pass.type\": \"sequential_refinement\",\n },\n });\n\n for (const [index, batch] of batches.entries()) {\n const prompt = buildSequentialPrompt(\n batch,\n schema,\n JSON.stringify(currentData),\n this.config.outputInstructions,\n );\n\n const result = await extractWithPrompt<T>({\n model: this.config.model,\n schema: options.schema,\n system: prompt.system,\n user: prompt.user,\n artifacts: batch,\n events: options.events,\n execute: this.config.execute as never,\n strict: this.config.strict,\n debug,\n callId: `double_pass_auto_2_batch_${index + 1}`,\n telemetry: telemetry ?? undefined,\n parentSpan: pass2Span,\n });\n\n currentData = result.data;\n usages.push(result.usage);\n\n step += 1;\n await options.events?.onStep?.({\n step,\n total: totalSteps,\n label: `pass 2 batch ${index + 1}/${batches.length}`,\n });\n debug?.step({\n step,\n total: totalSteps,\n label: `pass 2 batch ${index + 1}/${batches.length}`,\n strategy: this.name,\n });\n }\n \n // End pass 2 span\n telemetry?.endSpan(pass2Span!, {\n status: \"ok\",\n output: currentData,\n });\n \n // End strategy span\n telemetry?.endSpan(strategySpan!, {\n status: \"ok\",\n output: currentData,\n });\n\n return { data: currentData, usage: mergeUsage(usages) };\n }\n}\n\nexport const doublePassAutoMerge = <T>(\n config: DoublePassAutoMergeStrategyConfig,\n) => {\n return new DoublePassAutoMergeStrategy<T>(config);\n};\n","import type {\n Artifact,\n ExtractionOptions,\n ExtractionResult,\n ExtractionStrategy,\n Usage,\n} from \"../../types\";\nimport type { createDebugLogger } from \"../../debug/logger\";\nimport {\n createAgentSession,\n AuthStorage,\n ModelRegistry,\n SessionManager,\n SettingsManager,\n DefaultResourceLoader,\n} from \"@mariozechner/pi-coding-agent\";\nimport { Bash } from \"just-bash\";\nimport { serializeArtifactsToFilesystem, createVirtualFilesystem } from \"./ArtifactFilesystem\";\nimport { createVirtualFilesystemTools } from \"./AgentTools\";\n\nexport type AgentStrategyConfig = {\n /**\n * The model to use. Can be a pi Model or any model object with provider/id.\n * If not provided, uses the first available model from the registry.\n */\n model?: unknown;\n /**\n * Provider name (e.g., 'anthropic', 'openai').\n * Used with modelId when model object not provided.\n */\n provider?: string;\n /**\n * Model ID (e.g., 'claude-sonnet-4').\n * Used with provider when model object not provided.\n */\n modelId?: string;\n /** Maximum number of agent steps/turns allowed (default: 50) */\n maxSteps?: number;\n /** Additional extraction guidance to append to system prompt */\n outputInstructions?: string;\n /** Override the default system prompt entirely */\n systemPrompt?: string;\n /**\n * API key for authentication. If not provided, uses environment variables\n * or auth storage (ANTHROPIC_API_KEY, OPENAI_API_KEY, etc.)\n */\n apiKey?: string;\n /** Custom agent directory for auth storage (default: ~/.pi/agent) */\n agentDir?: string;\n /** Enable verbose logging */\n verbose?: boolean;\n debug?: ReturnType<typeof createDebugLogger>;\n};\n\nconst defaultSystemPrompt = (schema: string, outputInstructions?: string) => {\n return `You are an autonomous data extraction agent. Your task is to explore the provided artifacts and extract structured data according to the given JSON schema.\n\n## Your Environment\n\nYou have access to a virtual filesystem containing the artifacts to extract from:\n- \"/artifact.json\" - All artifacts in a structured JSON format (with embedded images replaced by virtual file paths)\n- \"/manifest.json\" - Summary and metadata about the artifacts\n- \"/images/\" - Virtual directory containing extracted image files (when artifacts have embedded images)\n\n## Virtual Image Files\n\nWhen artifacts contain embedded images (base64-encoded), they are extracted to separate files in \"/images/\" for easier access:\n- Image files are named: \"/images/{artifact-name}-page-{n}-image-{i}.{ext}\"\n - {artifact-name}: Sanitized artifact ID (lowercase, special chars become dashes)\n - page-{n}: Page number from the artifact (if available)\n - image-{i}: Image index within that page\n - {ext}: File extension determined from base64 (jpg, png, gif, webp, bmp, svg, or bin)\n- Examples: \"/images/invoice-page-3-image-0.jpg\" or \"/images/report-image-1.png\"\n- Use the \"/images/\" directory to access image data\n- The manifest shows which virtual files are available\n- Image format is shown in the file extension for easy identification\n\n## IMPORTANT: Do NOT Install Tools\n\nThis is a **sandboxed environment** - you CANNOT install packages or tools:\n- ❌ DO NOT run: apt-get, pip install, npm install, brew install, etc.\n- ❌ DO NOT try to install tesseract, ocrmypdf, poppler, or any OCR tools\n- ❌ DO NOT check if tools exist with \"which\" or \"command -v\"\n- ✅ ONLY use the provided tools listed below\n- ✅ If a tool is missing, work with what you have or report it via fail()\n\n## Available Tools\n\n### Exploration Tools\n- **read** - Read file contents with pagination support (e.g., read {\"file_path\": \"/manifest.json\", \"limit\": 50})\n- **view_image** - View an image to see its contents visually (e.g., view_image {\"image_path\": \"/images/doc-page-1-image-0.png\"})\n- **bash** - Run shell commands (e.g., bash {\"command\": \"head -20 /artifact.json\"})\n- **grep** - Search for patterns in files\n- **find** - Find files by name or pattern\n- **ls** - List files and directories\n\n### Output Management Tools (IMPORTANT - Use These!)\n- **set_output_data** - Set the initial extraction output. Call this as soon as you find the first piece of data.\n - Example: set_output_data({\"data\": {\"company_name\": \"Acme Corp\"}})\n - The data can be any shape - you'll update it incrementally\n\n- **update_output_data** - Add or modify fields in the existing output data\n - Example: update_output_data({\"changes\": {\"address\": \"123 Main St\"}})\n - This merges new data with existing data (deep merge)\n - Call this frequently as you discover more information\n\n- **finish** - Call this when extraction is complete and data validates against the schema\n - Only works if the data is valid according to the schema\n - This ends the extraction successfully\n\n- **fail** - Call this if the schema cannot be satisfied with available data\n - Provide a reason explaining what data was missing or why extraction failed\n\n## CRITICAL: Incremental Data Updates\n\n**You MUST update the output data continuously as you explore!**\n\n1. **Start immediately**: As soon as you find the first field, call set_output_data\n2. **Update frequently**: Every time you find new information, call update_output_data\n3. **Build incrementally**: Don't wait until the end - keep adding data as you go\n4. **Use all tools**: Combine exploration tools with output tools\n\n### Example Workflow\n\n1. Read manifest: read {\"file_path\": \"/manifest.json\", \"limit\": 20}\n2. Find first data point: grep \"company_name\" /artifact.json\n3. **Set initial data**: set_output_data({\"data\": {\"company_name\": \"Acme Inc\"}})\n4. Continue exploring: read {\"file_path\": \"/artifact.json\", \"offset\": 50, \"limit\": 30}\n5. **Update with more data**: update_output_data({\"changes\": {\"address\": \"123 Main St\", \"city\": \"Berlin\"}})\n6. Check images: view_image {\"image_path\": \"/images/doc-page-1-image-0.png\"}\n7. **Update again**: update_output_data({\"changes\": {\"has_logo\": true}})\n8. Verify complete: Check all schema fields are present\n9. **Finish**: finish()\n\n## Efficient Exploration Strategy\n\n**Don't read entire files at once.** Files may be large. Instead:\n\n1. **Start small**: Read just the first 20-50 lines to understand the structure\n2. **Navigate selectively**: Use offset and limit to jump to relevant sections\n3. **Search first**: Use grep to find specific data before reading full content\n4. **Iterate**: Make multiple small reads rather than one giant read\n5. **Update as you go**: Call update_output_data immediately when you find data\n\n### Pagination Examples\n\nRead first 30 lines:\nread {\"file_path\": \"/artifact.json\", \"limit\": 30}\n\nRead lines 31-60 (page 2):\nread {\"file_path\": \"/artifact.json\", \"offset\": 31, \"limit\": 30}\n\nRead from line 100 to end:\nread {\"file_path\": \"/artifact.json\", \"offset\": 100}\n\n## Output Rules\n\n- **Update continuously**: Call update_output_data every time you find new information\n- **Start early**: Don't wait until the end - set initial data as soon as possible\n- **Use null for missing values**: If a field can't be found, set it to null\n- **Never guess**: Only extract information explicitly present in the artifacts\n- **Validate as you go**: The tools will tell you if your data has validation issues\n- **Finish properly**: You MUST call finish() to complete extraction successfully\n- **Fail if needed**: Use fail() if the schema truly cannot be satisfied\n\n${outputInstructions ? `\\n## Additional Instructions\\n\\n${outputInstructions}\\n` : \"\"}\n\n## JSON Schema\n\n${schema}\n\n## CRITICAL: Tool Calling Format\n\nWhen calling tools, you MUST provide the correct parameters:\n\n**CORRECT - read with file_path:**\nread {\"file_path\": \"/manifest.json\"}\n\n**CORRECT - read with pagination:**\nread {\"file_path\": \"/artifact.json\", \"offset\": 1, \"limit\": 50}\n\n**CORRECT - view image:**\nview_image {\"image_path\": \"/images/doc-page-1-image-0.png\"}\n\n**CORRECT - set output data:**\nset_output_data {\"data\": {\"company_name\": \"Acme Corp\"}}\n\n**CORRECT - update output:**\nupdate_output_data {\"changes\": {\"address\": \"123 Main St\"}}\n\n**CORRECT - finish:**\nfinish {}\n\n**CORRECT - fail:**\nfail {\"reason\": \"Document is not an invoice\"}\n\n## Common Mistakes to AVOID\n\n❌ WRONG: read {} (missing file_path)\n❌ WRONG: read {file_path: \"/path\"} (missing quotes around property names)\n❌ WRONG: read /path (not using JSON format)\n❌ WRONG: set_output_data {company: \"Name\"} (missing quotes and data wrapper)\n❌ WRONG: Trying to install tools with apt-get, pip, npm, etc. (not allowed in sandbox)\n\n## Remember\n\n1. **ALWAYS** use set_output_data or update_output_data when you find information\n2. **ALWAYS** call finish() when done (or fail() if impossible)\n3. **ALWAYS** provide required parameters when calling tools (file_path for read, data for set_output_data, etc.)\n4. **NEVER** try to install packages or external tools - work with what you have\n5. The output tools will validate your data and report issues\n6. You can update data multiple times - keep refining as you explore\n7. The CLI shows your progress in real-time as you update the output`;\n};\n\nexport class AgentStrategy<T> implements ExtractionStrategy<T> {\n public name = \"agent\";\n private config: AgentStrategyConfig;\n\n constructor(config: AgentStrategyConfig) {\n this.config = config;\n }\n\n getEstimatedSteps(): number {\n return this.config.maxSteps ?? 50;\n }\n\n async run(options: ExtractionOptions<T>): Promise<ExtractionResult<T>> {\n const debug = options.debug ?? this.config.debug;\n const { telemetry } = options;\n const maxSteps = this.config.maxSteps ?? 50;\n\n // Create strategy-level AGENT span\n const agentSpan = telemetry?.startSpan({\n name: \"strategy.agent\",\n kind: \"AGENT\",\n attributes: {\n \"strategy.name\": this.name,\n \"agent.max_steps\": maxSteps,\n \"agent.model\": this.config.model\n ? \"custom\"\n : `${this.config.provider}/${this.config.modelId}`,\n \"agent.artifacts.count\": options.artifacts.length,\n },\n });\n\n // Track active spans for messages (LLM calls) and tool calls\n const activeMessageSpans = new Map<string, any>();\n const activeToolSpans = new Map<string, any>();\n\n // Emit start event\n await options.events?.onStep?.({\n step: 1,\n total: this.getEstimatedSteps(),\n label: \"agent_explore\",\n });\n debug?.step({\n step: 1,\n total: this.getEstimatedSteps(),\n label: \"agent_explore\",\n strategy: this.name,\n });\n\n // Serialize artifacts to virtual filesystem with virtual image files\n const filesystem = createVirtualFilesystem(options.artifacts);\n\n // Create just-bash instance with the virtual filesystem including image files\n const files: Record<string, string> = {\n \"/artifact.json\": filesystem[\"/artifact.json\"],\n \"/manifest.json\": filesystem[\"/manifest.json\"],\n };\n\n // Add virtual image files to the filesystem\n for (const [path, content] of filesystem.virtualFiles) {\n files[path] = content;\n }\n\n const bash = new Bash({\n files,\n cwd: \"/\",\n });\n\n // Create custom tools that use the virtual filesystem\n const virtualTools = createVirtualFilesystemTools(bash, filesystem.getImageByPath);\n\n // Build the schema and system prompt\n const schema = JSON.stringify(options.schema, null, 2);\n const systemPrompt =\n this.config.systemPrompt ??\n defaultSystemPrompt(schema, this.config.outputInstructions);\n\n // Log LLM call start\n const callId = `agent_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\n debug?.llmCallStart({\n callId,\n model: this.config.model ? JSON.stringify(this.config.model) : \"default\",\n schemaName: \"extract\",\n systemLength: systemPrompt.length,\n userLength: 0,\n artifactCount: options.artifacts.length,\n });\n debug?.promptSystem({ callId, system: systemPrompt });\n\n const startTime = Date.now();\n\n // Set up auth storage\n const agentDir = this.config.agentDir;\n const authStorage = agentDir\n ? AuthStorage.create(`${agentDir}/auth.json`)\n : AuthStorage.create();\n\n // Set runtime API key if provided\n if (this.config.apiKey && this.config.provider) {\n authStorage.setRuntimeApiKey(this.config.provider, this.config.apiKey);\n }\n\n // Create model registry\n const modelRegistry = new ModelRegistry(authStorage);\n\n // Get the model\n let model = this.config.model;\n if (!model && this.config.provider && this.config.modelId) {\n // Try to find the model in registry\n if (this.config.verbose) {\n console.error(`[AgentStrategy] Looking up model: ${this.config.provider}/${this.config.modelId}`);\n }\n model = modelRegistry.find(this.config.provider, this.config.modelId);\n if (this.config.verbose) {\n console.error(`[AgentStrategy] Model resolved: ${model ? 'success' : 'failed'}`);\n if (model) {\n console.error(`[AgentStrategy] Model info:`, JSON.stringify(model).slice(0, 200));\n }\n }\n } else if (model && this.config.verbose) {\n console.error(`[AgentStrategy] Using pre-configured model`);\n }\n\n // Create resource loader with custom system prompt\n const loader = new DefaultResourceLoader({\n cwd: \"/artifacts\",\n agentDir: agentDir || undefined,\n systemPromptOverride: () => systemPrompt,\n });\n\n await loader.reload();\n\n // Create in-memory settings\n const settingsManager = SettingsManager.inMemory({\n compaction: { enabled: false }, // Disable compaction for extraction tasks\n });\n\n // Output data management state\n let currentOutput: any = null;\n let isFinished = false;\n let finishError: string | null = null;\n let extractionFailed = false;\n let failureReason: string | null = null;\n\n // Helper to validate data against schema\n const validateData = (data: any): { valid: boolean; errors: string[] } => {\n try {\n JSON.stringify(data);\n return { valid: true, errors: [] };\n } catch (e) {\n return { valid: false, errors: [(e as Error).message] };\n }\n };\n\n // Helper to deep merge objects\n const deepMerge = (target: any, source: any): any => {\n const output = Object.assign({}, target);\n if (isObject(target) && isObject(source)) {\n Object.keys(source).forEach((key) => {\n if (isObject(source[key])) {\n if (!(key in target)) {\n Object.assign(output, { [key]: source[key] });\n } else {\n output[key] = deepMerge(target[key], source[key]);\n }\n } else {\n Object.assign(output, { [key]: source[key] });\n }\n });\n }\n return output;\n };\n\n const isObject = (item: any): boolean => {\n return item && typeof item === \"object\" && !Array.isArray(item);\n };\n\n // Emit session initialization event\n await options.events?.onStep?.({\n step: 2,\n total: this.getEstimatedSteps(),\n label: \"agent_init\",\n });\n debug?.step({\n step: 2,\n total: this.getEstimatedSteps(),\n label: \"agent_init\",\n strategy: this.name,\n });\n\n // Create output management tools\n const { Type } = await import(\"@sinclair/typebox\");\n\n const setOutputDataTool = {\n name: \"set_output_data\",\n label: \"Set Output Data\",\n description: \"Set the initial output data. You can use any structure - it will be validated against the schema.\",\n parameters: Type.Object({\n data: Type.Any({ description: \"The output data to set\" }),\n }),\n execute: async (toolCallId: string, params: { data: any }) => {\n currentOutput = params.data;\n const validation = validateData(params.data);\n const status = validation.valid ? \"✓ Valid structure\" : `✗ Validation issues: ${validation.errors.join(\", \")}`;\n\n // Emit progress so CLI shows the update\n await options.events?.onStep?.({\n step: stepCount + 1,\n total: this.getEstimatedSteps(),\n label: `Output: ${JSON.stringify(params.data).slice(0, 50)}...`,\n });\n\n return {\n content: [{ type: \"text\", text: `Output data set. ${status}` }],\n details: { validation },\n };\n },\n };\n\n const updateOutputDataTool = {\n name: \"update_output_data\",\n label: \"Update Output Data\",\n description: \"Update the output data by merging changes. Existing fields are preserved, new fields are added.\",\n parameters: Type.Object({\n changes: Type.Record(Type.String(), Type.Any(), {\n description: \"Changes to merge into existing data\"\n }),\n }),\n execute: async (toolCallId: string, params: { changes: any }) => {\n if (currentOutput === null) {\n return {\n content: [{ type: \"text\", text: \"Error: No output data set yet. Use set_output_data first.\" }],\n isError: true,\n };\n }\n\n currentOutput = deepMerge(currentOutput, params.changes);\n const validation = validateData(currentOutput);\n const status = validation.valid ? \"✓ Valid structure\" : `✗ Validation issues: ${validation.errors.join(\", \")}`;\n\n // Emit progress so CLI shows the update\n await options.events?.onStep?.({\n step: stepCount + 1,\n total: this.getEstimatedSteps(),\n label: `Updated: ${JSON.stringify(params.changes).slice(0, 50)}...`,\n });\n\n return {\n content: [{ type: \"text\", text: `Output data updated. ${status}` }],\n details: { validation, currentOutput },\n };\n },\n };\n\n const finishTool = {\n name: \"finish\",\n label: \"Finish Extraction\",\n description: \"Complete the extraction. Can only be called when data validates against the schema.\",\n parameters: Type.Object({}),\n execute: async (toolCallId: string) => {\n if (extractionFailed) {\n return {\n content: [{ type: \"text\", text: \"Cannot finish - extraction was marked as failed.\" }],\n isError: true,\n };\n }\n\n if (currentOutput === null) {\n return {\n content: [{ type: \"text\", text: \"Error: No output data set. Extract data first.\" }],\n isError: true,\n };\n }\n\n const validation = validateData(currentOutput);\n if (!validation.valid) {\n finishError = `Schema validation failed: ${validation.errors.join(\", \")}`;\n return {\n content: [{\n type: \"text\",\n text: `Cannot finish: ${finishError}\\n\\nFix the data and try again, or use fail() if extraction is impossible.`\n }],\n isError: true,\n };\n }\n\n isFinished = true;\n return {\n content: [{ type: \"text\", text: \"✓ Extraction complete! Data validated successfully.\" }],\n };\n },\n };\n\n const failTool = {\n name: \"fail\",\n label: \"Fail Extraction\",\n description: \"Mark extraction as failed when the schema cannot be satisfied with the available data.\",\n parameters: Type.Object({\n reason: Type.String({ description: \"Why extraction failed or what data was missing\" }),\n }),\n execute: async (toolCallId: string, params: { reason: string }) => {\n extractionFailed = true;\n failureReason = params.reason;\n return {\n content: [{ type: \"text\", text: `Extraction marked as failed: ${params.reason}` }],\n };\n },\n };\n\n // Create session with all tools\n const allTools = [\n virtualTools.read as any,\n virtualTools.bash as any,\n virtualTools.grep as any,\n virtualTools.find as any,\n virtualTools.ls as any,\n setOutputDataTool as any,\n updateOutputDataTool as any,\n finishTool as any,\n failTool as any,\n ];\n\n if (this.config.verbose) {\n console.error(`[AgentStrategy] Creating session with ${allTools.length} tools`);\n console.error(`[AgentStrategy] Tool names: ${allTools.map((t: any) => t.name).join(', ')}`);\n\n // Log detailed tool info for debugging\n allTools.forEach((tool: any) => {\n console.error(`[AgentStrategy] Tool \"${tool.name}\" details:`);\n console.error(` - label: ${tool.label}`);\n console.error(` - description: ${tool.description?.slice(0, 100)}...`);\n console.error(` - has parameters: ${!!tool.parameters}`);\n if (tool.parameters) {\n console.error(` - parameters type: ${tool.parameters.type}`);\n console.error(` - required fields: ${JSON.stringify(tool.parameters.required)}`);\n }\n });\n }\n\n const { session } = await createAgentSession({\n model: model as any,\n authStorage,\n modelRegistry,\n resourceLoader: loader,\n sessionManager: SessionManager.inMemory(),\n settingsManager,\n tools: [], // No default tools\n customTools: allTools,\n });\n\n if (this.config.verbose) {\n console.error(`[AgentStrategy] Session created successfully`);\n }\n\n // Emit session ready event\n await options.events?.onStep?.({\n step: 3,\n total: this.getEstimatedSteps(),\n label: \"agent_session_ready\",\n });\n debug?.step({\n step: 3,\n total: this.getEstimatedSteps(),\n label: \"agent_session_ready\",\n strategy: this.name,\n });\n\n // Track usage and steps\n let usage: Usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n let stepCount = 0;\n let finalResponse = \"\";\n const maxToolCalls = maxSteps;\n\n // Buffer for streaming text - accumulate until we see a newline\n let textBuffer = \"\";\n\n try {\n // Subscribe to events\n const unsubscribe = session.subscribe((event) => {\n try {\n switch (event.type) {\n case \"message_update\": {\n if (event.assistantMessageEvent.type === \"text_delta\") {\n const delta = event.assistantMessageEvent.delta;\n finalResponse += delta;\n\n // Emit agent message event for UI streaming\n options.events?.onAgentMessage?.({\n content: delta,\n role: \"assistant\",\n });\n\n // Buffer the text and only emit when we have complete lines\n textBuffer += delta;\n\n // Check for complete lines in the buffer\n let newlineIndex;\n while ((newlineIndex = textBuffer.indexOf('\\n')) !== -1) {\n const line = textBuffer.slice(0, newlineIndex).trim();\n textBuffer = textBuffer.slice(newlineIndex + 1);\n\n if (line.length > 0) {\n options.events?.onStep?.({\n step: stepCount,\n total: this.getEstimatedSteps(),\n label: `→ ${line.slice(0, 120)}`,\n });\n }\n }\n\n // If buffer gets too long without a newline, emit it anyway\n if (textBuffer.length > 100) {\n const line = textBuffer.trim();\n if (line.length > 0) {\n options.events?.onStep?.({\n step: stepCount,\n total: this.getEstimatedSteps(),\n label: `→ ${line.slice(0, 120)}`,\n });\n }\n textBuffer = \"\";\n }\n }\n break;\n }\n\n case \"tool_execution_start\": {\n stepCount++;\n // Start TOOL span for this tool execution\n if (telemetry && agentSpan) {\n const toolSpan = telemetry.startSpan({\n name: `agent.tool.${event.toolName}`,\n kind: \"TOOL\",\n parentSpan: agentSpan,\n attributes: {\n \"tool.name\": event.toolName,\n \"tool.call_id\": event.toolCallId,\n \"tool.args\": JSON.stringify(event.args || {}),\n },\n });\n activeToolSpans.set(event.toolCallId, toolSpan);\n }\n\n // Format a nice label based on the tool and its arguments\n let label: string;\n let detail: string;\n const args = event.args;\n const toolName = event.toolName;\n\n // Emit detailed agent tool start event for UI\n const toolStartEvent = {\n toolName,\n toolCallId: event.toolCallId,\n args: args || {},\n };\n options.events?.onAgentToolStart?.(toolStartEvent);\n\n // Format labels for exploration tools\n if (toolName === \"read\" && args?.file_path) {\n const fileName = args.file_path.split(\"/\").pop() || args.file_path;\n const pagination: string[] = [];\n if (args.offset && args.offset > 1) {\n pagination.push(`offset ${args.offset}`);\n }\n if (args.limit) {\n pagination.push(`limit ${args.limit}`);\n }\n const paginationStr = pagination.length > 0 ? ` (${pagination.join(\", \")})` : \"\";\n label = `Read ${fileName}${paginationStr}`;\n detail = \"\";\n } else if (toolName === \"bash\" && args?.command) {\n // Truncate long commands\n const cmd = args.command.length > 40\n ? args.command.slice(0, 37) + \"...\"\n : args.command;\n label = `Bash: ${cmd}`;\n detail = \"\";\n } else if (toolName === \"grep\" && args?.pattern) {\n label = `Grep \"${args.pattern}\"`;\n detail = args.path ? `in ${args.path.split(\"/\").pop()}` : \"\";\n } else if (toolName === \"find\" && args?.path) {\n label = `Find`;\n detail = args.name ? `\"${args.name}\" in ${args.path}` : `in ${args.path}`;\n } else if (toolName === \"ls\" && args?.path) {\n label = `List ${args.path}`;\n detail = args.recursive ? \"recursive\" : \"\";\n } else if (toolName === \"set_output_data\") {\n label = \"Set Output\";\n detail = args?.data ? JSON.stringify(args.data).slice(0, 80) : \"\";\n } else if (toolName === \"update_output_data\") {\n label = \"Update Output\";\n detail = args?.changes ? JSON.stringify(args.changes).slice(0, 80) : \"\";\n } else if (toolName === \"finish\") {\n label = \"Finish\";\n detail = \"\";\n } else if (toolName === \"fail\") {\n label = \"Fail\";\n detail = args?.reason || \"\";\n } else {\n // Unknown tool - use raw JSON\n label = toolName;\n detail = args ? JSON.stringify(args).slice(0, 100) : \"\";\n }\n\n // Emit progress event with nice label and detail\n options.events?.onStep?.({\n step: stepCount + 1,\n total: this.getEstimatedSteps(),\n label,\n detail,\n });\n debug?.step({\n step: stepCount + 1,\n total: this.getEstimatedSteps(),\n label,\n strategy: this.name,\n });\n break;\n }\n\n case \"tool_execution_end\": {\n const toolEndEvent = event as any;\n\n // End TOOL span for this tool execution\n const toolSpan = activeToolSpans.get(toolEndEvent.toolCallId);\n if (toolSpan && telemetry) {\n const hasError = toolEndEvent.isError || toolEndEvent.error;\n telemetry.endSpan(toolSpan, {\n status: hasError ? \"error\" : \"ok\",\n error: hasError\n ? new Error(toolEndEvent.error || \"Tool execution failed\")\n : undefined,\n output: toolEndEvent.result,\n });\n activeToolSpans.delete(toolEndEvent.toolCallId);\n }\n\n // Emit detailed agent tool end event for UI\n options.events?.onAgentToolEnd?.({\n toolCallId: toolEndEvent.toolCallId,\n result: toolEndEvent.result,\n error: toolEndEvent.error || toolEndEvent.isError ? toolEndEvent.error || \"Tool execution failed\" : undefined,\n });\n\n // Check if tool execution resulted in an error\n if (toolEndEvent.isError || toolEndEvent.error) {\n const errorMsg = toolEndEvent.error || \"Unknown tool error\";\n const toolName = toolEndEvent.toolName || \"unknown\";\n const toolCallId = toolEndEvent.toolCallId || \"unknown\";\n if (this.config.verbose) {\n console.error(`[AgentStrategy] Tool execution failed: ${errorMsg}`);\n console.error(`[AgentStrategy] Tool: ${toolName}, Call ID: ${toolCallId}`);\n if (toolEndEvent.result) {\n console.error(`[AgentStrategy] Result:`, JSON.stringify(toolEndEvent.result));\n }\n }\n // Don't throw here, let the agent handle it\n }\n break;\n }\n\n case \"agent_end\": {\n // Flush any remaining text in the buffer\n if (textBuffer.trim().length > 0) {\n options.events?.onStep?.({\n step: stepCount,\n total: this.getEstimatedSteps(),\n label: `→ ${textBuffer.trim().slice(0, 120)}`,\n });\n textBuffer = \"\";\n }\n\n // Update usage from agent state if available\n if (event.messages && event.messages.length > 0) {\n // Calculate approximate usage from messages\n const inputTokens = event.messages.reduce((sum, msg) => {\n if (msg.role === \"user\") {\n return sum + Math.ceil(JSON.stringify(msg.content).length / 4);\n }\n return sum;\n }, 0);\n const outputTokens = event.messages.reduce((sum, msg) => {\n if (msg.role === \"assistant\") {\n return sum + Math.ceil(JSON.stringify(msg.content).length / 4);\n }\n return sum;\n }, 0);\n usage = {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n };\n }\n // Emit agent completion event\n options.events?.onStep?.({\n step: stepCount + 1,\n total: this.getEstimatedSteps(),\n label: \"agent_complete\",\n });\n debug?.step({\n step: stepCount + 1,\n total: this.getEstimatedSteps(),\n label: \"agent_complete\",\n strategy: this.name,\n });\n break;\n }\n\n case \"message_start\": {\n // Start LLM span for this message generation\n // Generate a unique key for this message since message objects don't have IDs\n const messageKey = `msg_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\n if (telemetry && agentSpan) {\n const llmSpan = telemetry.startSpan({\n name: \"agent.llm.generate\",\n kind: \"LLM\",\n parentSpan: agentSpan,\n attributes: {\n \"llm.message_type\": event.message?.role || \"unknown\",\n \"llm.type\": \"agent_message\",\n },\n });\n activeMessageSpans.set(messageKey, llmSpan);\n // Store the key on the event for retrieval in message_end\n (event as any)._telemetryKey = messageKey;\n }\n break;\n }\n\n case \"message_end\": {\n // End LLM span for this message generation\n const messageKey = (event as any)._telemetryKey;\n if (messageKey) {\n const llmSpan = activeMessageSpans.get(messageKey);\n if (llmSpan && telemetry) {\n telemetry.endSpan(llmSpan, {\n status: \"ok\",\n output: finalResponse.slice(-200), // Last 200 chars as output preview\n });\n activeMessageSpans.delete(messageKey);\n }\n }\n break;\n }\n\n case \"agent_start\": {\n // Agent has started processing\n if (this.config.verbose) {\n console.error(\"[AgentStrategy] Agent started processing\");\n }\n break;\n }\n\n case \"turn_start\":\n case \"turn_end\": {\n // Turn lifecycle events - track but don't need special handling\n break;\n }\n\n case \"auto_compaction_start\":\n case \"auto_compaction_end\":\n case \"auto_retry_start\":\n case \"auto_retry_end\": {\n // Compaction and retry events - only log in debug mode\n break;\n }\n\n default: {\n // Only log truly unknown/unexpected events\n // Common lifecycle events should be handled above\n const unhandledEvent = event as any;\n if (unhandledEvent.type && !unhandledEvent.type.includes(\"_\")) {\n if (this.config.verbose) {\n console.error(`[AgentStrategy] Unexpected event type: ${unhandledEvent.type}`);\n }\n }\n break;\n }\n }\n } catch (eventHandlerError) {\n // Catch any errors in the event handler itself to prevent them from being swallowed\n if (this.config.verbose) {\n console.error(`[AgentStrategy] Error in event handler: ${(eventHandlerError as Error).message}`);\n console.error(\"AgentStrategy event handler error:\", eventHandlerError);\n }\n // Re-throw to ensure the error is not swallowed\n throw eventHandlerError;\n }\n });\n\n // Send the prompt\n await session.prompt(\n \"Begin exploring the artifacts and extract the required data according to the schema. Start by reading the manifest file.\",\n {\n // Ensure the agent keeps running until it calls finish() or fail()\n }\n );\n\n // Retry logic: if no output after first run, prompt again to force output\n if (currentOutput === null && !extractionFailed && !isFinished) {\n if (this.config.verbose) {\n console.error(\"[AgentStrategy] No output after first run. Sending retry prompt...\");\n }\n\n await options.events?.onStep?.({\n step: stepCount + 1,\n total: this.getEstimatedSteps(),\n label: \"Retry: forcing output extraction\",\n });\n\n // Re-subscribe for the retry\n const retryUnsubscribe = session.subscribe((event) => {\n try {\n switch (event.type) {\n case \"message_update\": {\n if (event.assistantMessageEvent.type === \"text_delta\") {\n const delta = event.assistantMessageEvent.delta;\n finalResponse += delta;\n\n // Emit agent message event for UI streaming\n options.events?.onAgentMessage?.({\n content: delta,\n role: \"assistant\",\n });\n\n // Buffer the text and only emit when we have complete lines\n textBuffer += delta;\n\n // Check for complete lines in the buffer\n let newlineIndex;\n while ((newlineIndex = textBuffer.indexOf('\\n')) !== -1) {\n const line = textBuffer.slice(0, newlineIndex).trim();\n textBuffer = textBuffer.slice(newlineIndex + 1);\n\n if (line.length > 0) {\n options.events?.onStep?.({\n step: stepCount,\n total: this.getEstimatedSteps(),\n label: `→ ${line.slice(0, 120)}`,\n });\n }\n }\n\n // If buffer gets too long without a newline, emit it anyway\n if (textBuffer.length > 100) {\n const line = textBuffer.trim();\n if (line.length > 0) {\n options.events?.onStep?.({\n step: stepCount,\n total: this.getEstimatedSteps(),\n label: `→ ${line.slice(0, 120)}`,\n });\n }\n textBuffer = \"\";\n }\n }\n break;\n }\n\n case \"tool_execution_start\": {\n stepCount++;\n const toolName = event.toolName;\n const args = event.args;\n\n // Format label for retry run\n let label = toolName;\n if (toolName === \"set_output_data\") {\n label = \"Set Output (retry)\";\n } else if (toolName === \"update_output_data\") {\n label = \"Update Output (retry)\";\n } else if (toolName === \"finish\") {\n label = \"Finish (retry)\";\n } else if (toolName === \"fail\") {\n label = \"Fail (retry)\";\n }\n\n options.events?.onStep?.({\n step: stepCount + 1,\n total: this.getEstimatedSteps(),\n label,\n });\n break;\n }\n }\n } catch (eventHandlerError) {\n if (this.config.verbose) {\n console.error(`[AgentStrategy] Error in retry event handler: ${(eventHandlerError as Error).message}`);\n }\n }\n });\n\n // Send a forceful retry prompt\n await session.prompt(\n `You have explored the artifacts but haven't called any output tools yet. You MUST now extract data and call either:\\n` +\n `1. set_output_data with the extracted data, then finish()\\n` +\n `2. fail() if the document doesn't contain the required information\\n\\n` +\n `The schema requires: ${JSON.stringify(options.schema).slice(0, 200)}...\\n\\n` +\n `Extract what you can from the artifacts and set the output data NOW.`,\n {}\n );\n\n retryUnsubscribe();\n }\n\n // Clean up subscription\n unsubscribe();\n\n const durationMs = Date.now() - startTime;\n\n // Determine the extraction result based on agent output tools\n let extractedData: T;\n\n if (extractionFailed) {\n throw new Error(`Extraction failed: ${failureReason}`);\n }\n\n if (!isFinished) {\n // Agent didn't call finish() - check if we have partial data\n if (currentOutput !== null) {\n if (this.config.verbose) {\n console.error(\"[AgentStrategy] Warning: Agent did not call finish(). Using collected data.\");\n }\n const validation = validateData(currentOutput);\n if (!validation.valid && this.config.verbose) {\n console.error(`[AgentStrategy] Data validation issues: ${validation.errors.join(\", \")}`);\n }\n extractedData = currentOutput as T;\n } else {\n // Check if this might be a model compatibility issue\n const toolCallsMade = stepCount > 0;\n const toolsFailed = toolCallsMade && currentOutput === null;\n\n if (toolsFailed) {\n const errorMsg = `Agent did not produce any output data. The model may not support tool calling properly.\n\nTroubleshooting:\n1. Check if your model supports function calling/tool use\n2. Try a different model like anthropic/claude-sonnet-4 or openai/gpt-4o\n3. See MODEL_COMPATIBILITY.md for supported models\n\nIf you continue to see \"Tool execution failed\" errors with empty tool names,\nthe model is not compatible with the agent strategy. Use --strategy simple instead.`;\n throw new Error(errorMsg);\n } else {\n const errorMsg = `Agent did not produce any output data. No data was extracted.\n\nThis can happen when:\n- The model doesn't support tool calling properly\n- The agent got confused and didn't use the output tools\n- The document doesn't contain extractable data\n\nSuggestions:\n1. Try a different model with better tool support (anthropic/claude-sonnet-4)\n2. Use --strategy simple for models without tool calling\n3. Check if the document actually contains the data specified in your schema\n\nRetry was attempted but the agent still didn't produce output.`;\n throw new Error(errorMsg);\n }\n }\n } else {\n // Agent called finish() successfully\n if (currentOutput === null) {\n throw new Error(\"Agent called finish() but no output data was set.\");\n }\n extractedData = currentOutput as T;\n }\n\n debug?.rawResponse({ callId, response: extractedData });\n debug?.llmCallComplete({\n callId,\n success: true,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n durationMs,\n });\n\n await options.events?.onStep?.({\n step: this.getEstimatedSteps(),\n total: this.getEstimatedSteps(),\n label: \"extract\",\n });\n\n debug?.step({\n step: this.getEstimatedSteps(),\n total: this.getEstimatedSteps(),\n label: \"extract\",\n strategy: this.name,\n });\n\n // Clean up any remaining telemetry spans\n if (telemetry) {\n // End any active message spans\n for (const [key, span] of activeMessageSpans.entries()) {\n telemetry.endSpan(span, { status: \"ok\" });\n }\n activeMessageSpans.clear();\n\n // End any active tool spans\n for (const [key, span] of activeToolSpans.entries()) {\n telemetry.endSpan(span, { status: \"ok\" });\n }\n activeToolSpans.clear();\n\n // End the main agent span\n if (agentSpan) {\n telemetry.endSpan(agentSpan, {\n status: \"ok\",\n output: extractedData,\n });\n }\n }\n\n return { data: extractedData, usage };\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n debug?.llmCallComplete({\n callId,\n success: false,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n durationMs,\n error: (error as Error).message,\n });\n\n // Clean up telemetry spans on error\n if (telemetry) {\n // End any active message spans with error\n for (const [key, span] of activeMessageSpans.entries()) {\n telemetry.endSpan(span, {\n status: \"error\",\n error: error instanceof Error ? error : new Error(String(error))\n });\n }\n activeMessageSpans.clear();\n\n // End any active tool spans with error\n for (const [key, span] of activeToolSpans.entries()) {\n telemetry.endSpan(span, {\n status: \"error\",\n error: error instanceof Error ? error : new Error(String(error))\n });\n }\n activeToolSpans.clear();\n\n // End the main agent span with error\n if (agentSpan) {\n telemetry.endSpan(agentSpan, {\n status: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n\n throw error;\n } finally {\n // Clean up session\n session.dispose();\n }\n }\n}\n\nexport const agent = <T>(config: AgentStrategyConfig) => {\n return new AgentStrategy<T>(config);\n};\n","import type { Artifact, ArtifactContent, ArtifactImage } from \"../../types\";\n\n// Image format detection from base64 signatures\nconst detectImageFormat = (base64: string): string => {\n // JPEG: base64 starts with /9j/ (FF D8 FF)\n if (base64.startsWith(\"/9j/\")) {\n return \"jpg\";\n }\n // PNG: base64 starts with iVBOR (89 50 4E 47)\n if (base64.startsWith(\"iVBOR\")) {\n return \"png\";\n }\n // GIF: base64 starts with R0lGOD (47 49 46 38)\n if (base64.startsWith(\"R0lGOD\")) {\n return \"gif\";\n }\n // WebP: base64 starts with UklGR (52 49 46 46)\n if (base64.startsWith(\"UklGR\")) {\n return \"webp\";\n }\n // BMP: base64 starts with Qk (42 4D)\n if (base64.startsWith(\"Qk\")) {\n return \"bmp\";\n }\n // SVG: starts with data URI or PHN2Zy (base64 of <svg)\n if (base64.startsWith(\"PHN2Zy\") || base64.startsWith(\"data:image/svg\")) {\n return \"svg\";\n }\n // Default to bin if unknown\n return \"bin\";\n};\n\n// Sanitize artifact name for use in filename\nconst sanitizeArtifactName = (name: string): string => {\n // Replace spaces and special chars with dashes\n return name\n .replace(/[^a-zA-Z0-9]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .toLowerCase();\n};\n\nexport type TransformedArtifact = {\n id: string;\n type: string;\n metadata?: Record<string, unknown>;\n tokens?: number;\n contents: Array<{\n page?: number;\n text?: string;\n media?: Array<{\n type: string;\n url?: string;\n text?: string;\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n imageType?: string;\n // Replaced base64 with virtual file path\n virtualPath?: string;\n originalBase64?: string; // Kept for internal reference\n }>;\n }>;\n};\n\nexport type ArtifactsManifest = {\n count: number;\n artifacts: TransformedArtifact[];\n totalTokens?: number;\n summary: {\n textArtifacts: number;\n imageArtifacts: number;\n pdfArtifacts: number;\n fileArtifacts: number;\n };\n virtualFiles: {\n count: number;\n paths: string[];\n };\n};\n\nexport type VirtualFilesystemResult = {\n // The main artifact JSON with base64 replaced by virtual paths\n \"/artifact.json\": string;\n // Manifest with summary\n \"/manifest.json\": string;\n // Virtual files mapping: path -> base64 content\n virtualFiles: Map<string, string>;\n // Helper to get image data by virtual path\n getImageByPath: (path: string) => string | undefined;\n};\n\nexport const createVirtualFilesystem = (\n artifacts: Artifact[]\n): VirtualFilesystemResult => {\n const virtualFiles = new Map<string, string>();\n\n // Transform artifacts, extracting base64 images to virtual files\n const transformedArtifacts: TransformedArtifact[] = artifacts.map((artifact) => {\n // Create a sanitized base name from artifact id\n const artifactName = sanitizeArtifactName(artifact.id);\n \n return {\n id: artifact.id,\n type: artifact.type,\n metadata: artifact.metadata,\n tokens: artifact.tokens,\n contents: artifact.contents.map((content: ArtifactContent, contentIndex: number) => {\n const pageNumber = content.page;\n \n return {\n page: content.page,\n text: content.text,\n media: content.media?.map((media: ArtifactImage, mediaIndex: number) => {\n // If there's base64 content, create a virtual file\n if (media.base64 && media.base64.length > 0) {\n // Detect image format from base64\n const extension = detectImageFormat(media.base64);\n \n // Create descriptive filename\n let virtualPath: string;\n if (pageNumber !== undefined) {\n // If we have a page number, include it in the filename\n virtualPath = `/images/${artifactName}-page-${pageNumber}-image-${mediaIndex}.${extension}`;\n } else {\n // No page number, just use artifact name and image index\n virtualPath = `/images/${artifactName}-image-${mediaIndex}.${extension}`;\n }\n \n // Store the base64 content in the virtual filesystem\n virtualFiles.set(virtualPath, media.base64);\n \n return {\n type: media.type,\n url: media.url,\n text: media.text,\n x: media.x,\n y: media.y,\n width: media.width,\n height: media.height,\n imageType: media.imageType,\n virtualPath: virtualPath,\n originalBase64: `[BASE64: ${media.base64.length} chars]`, // For debugging\n };\n }\n \n // No base64, just return the media as-is\n return {\n type: media.type,\n url: media.url,\n text: media.text,\n x: media.x,\n y: media.y,\n width: media.width,\n height: media.height,\n imageType: media.imageType,\n };\n }),\n };\n }),\n };\n });\n\n // Count images with base64\n const totalImagesWithBase64 = Array.from(virtualFiles.keys()).length;\n\n const manifest: ArtifactsManifest = {\n count: artifacts.length,\n artifacts: transformedArtifacts,\n totalTokens: transformedArtifacts.reduce((sum, a) => sum + (a.tokens || 0), 0),\n summary: {\n textArtifacts: artifacts.filter((a) => a.type === \"text\").length,\n imageArtifacts: artifacts.filter((a) => a.type === \"image\").length,\n pdfArtifacts: artifacts.filter((a) => a.type === \"pdf\").length,\n fileArtifacts: artifacts.filter((a) => a.type === \"file\").length,\n },\n virtualFiles: {\n count: totalImagesWithBase64,\n paths: Array.from(virtualFiles.keys()),\n },\n };\n\n // Helper function to retrieve image by path\n const getImageByPath = (path: string): string | undefined => {\n return virtualFiles.get(path);\n };\n\n // Create the filesystem entries\n const filesystem: VirtualFilesystemResult = {\n \"/artifact.json\": JSON.stringify(transformedArtifacts, null, 2),\n \"/manifest.json\": JSON.stringify(manifest, null, 2),\n virtualFiles,\n getImageByPath,\n };\n\n return filesystem;\n};\n\n// Legacy export for backward compatibility\nexport const serializeArtifactsToFilesystem = (\n artifacts: Artifact[]\n): { \n \"/artifact.json\": string; \n \"/manifest.json\": string \n} => {\n const result = createVirtualFilesystem(artifacts);\n return {\n \"/artifact.json\": result[\"/artifact.json\"],\n \"/manifest.json\": result[\"/manifest.json\"],\n };\n};\n\nexport type { Artifact, ArtifactContent, ArtifactImage };\n","import { Bash } from \"just-bash\";\nimport type { ToolDefinition } from \"@mariozechner/pi-coding-agent\";\nimport { Type, type Static } from \"@sinclair/typebox\";\n\n// Parameter schemas\nconst BashParams = Type.Object({\n command: Type.String({\n description: \"The bash command to execute\",\n }),\n timeout: Type.Optional(\n Type.Number({\n description: \"Timeout in milliseconds (default: 30000)\",\n })\n ),\n});\n\nconst ReadParams = Type.Object({\n file_path: Type.String({\n description: \"The absolute path to the file to read\",\n }),\n offset: Type.Optional(\n Type.Number({\n description: \"Line number to start reading from (1-indexed, default: 1)\",\n })\n ),\n limit: Type.Optional(\n Type.Number({\n description: \"Maximum number of lines to read\",\n })\n ),\n});\n\nconst GrepParams = Type.Object({\n pattern: Type.String({\n description: \"The search pattern\",\n }),\n path: Type.String({\n description: \"The file or directory to search in\",\n }),\n options: Type.Optional(\n Type.String({\n description: \"Additional grep options (e.g., '-r' for recursive, '-i' for case-insensitive)\",\n })\n ),\n});\n\nconst FindParams = Type.Object({\n path: Type.String({\n description: \"The directory to search in\",\n }),\n name: Type.Optional(\n Type.String({\n description: \"Filename pattern to match (e.g., '*.json')\",\n })\n ),\n});\n\nconst LsParams = Type.Object({\n path: Type.String({\n description: \"The directory to list\",\n }),\n recursive: Type.Optional(\n Type.Boolean({\n description: \"List recursively\",\n })\n ),\n});\n\nconst SetOutputDataParams = Type.Object({\n data: Type.Any({\n description: \"The output data to set. Can be any shape - will be validated against the schema.\",\n }),\n});\n\nconst UpdateOutputDataParams = Type.Object({\n changes: Type.Record(Type.String(), Type.Any(), {\n description: \"Changes to merge into the existing output data. Uses deep merge. Missing fields are preserved.\",\n }),\n});\n\nconst ViewImageParams = Type.Object({\n image_path: Type.String({\n description: \"The absolute path to the image file to view (e.g., '/artifacts/images/artifact-name-page-1-image-0.png')\",\n }),\n});\n\nconst FinishParams = Type.Object({});\n\nconst FailParams = Type.Object({\n reason: Type.String({\n description: \"Explanation of why extraction failed or what data could not be found.\",\n }),\n});\n\nexport type AgentOutputTools = {\n set_output_data: ToolDefinition<typeof SetOutputDataParams>;\n update_output_data: ToolDefinition<typeof UpdateOutputDataParams>;\n finish: ToolDefinition<typeof FinishParams>;\n fail: ToolDefinition<typeof FailParams>;\n};\n\nexport type VirtualFilesystemTools = {\n bash: ToolDefinition<typeof BashParams>;\n read: ToolDefinition<typeof ReadParams>;\n grep: ToolDefinition<typeof GrepParams>;\n find: ToolDefinition<typeof FindParams>;\n ls: ToolDefinition<typeof LsParams>;\n view_image: ToolDefinition<typeof ViewImageParams>;\n};\n\nexport const createVirtualFilesystemTools = (\n bash: Bash,\n getImageByPath?: (path: string) => string | undefined\n): VirtualFilesystemTools => {\n // Bash tool - executes commands in the virtual filesystem\n const bashTool: ToolDefinition<typeof BashParams> = {\n name: \"bash\",\n label: \"Bash\",\n description:\n \"Execute bash commands in the virtual filesystem. Use this to explore artifacts with commands like cat, grep, head, tail, jq, etc.\",\n parameters: BashParams,\n execute: async (toolCallId, params, signal, onUpdate, ctx) => {\n try {\n const result = await bash.exec(params.command);\n \n return {\n content: [\n {\n type: \"text\",\n text:\n result.exitCode === 0\n ? result.stdout || \"(no output)\"\n : `Exit code ${result.exitCode}: ${result.stderr || result.stdout || \"(no output)\"}`,\n },\n ],\n details: {\n exitCode: result.exitCode,\n ...(result.stderr && { stderr: result.stderr }),\n },\n };\n } catch (error) {\n const errorMsg = (error as Error).message;\n console.error(`[AgentTools] Bash command error: ${errorMsg}`);\n console.error(`[AgentTools] Command: ${params.command}`);\n return {\n content: [\n {\n type: \"text\",\n text: `Error: ${errorMsg}`,\n },\n ],\n details: {\n error: errorMsg,\n },\n isError: true,\n };\n }\n },\n };\n\n // Read tool - reads a file from the virtual filesystem\n const readTool: ToolDefinition<typeof ReadParams> = {\n name: \"read\",\n label: \"Read File\",\n description: \"Read the contents of a file from the virtual filesystem. Supports pagination with offset and limit parameters. Can read virtual image files (binary/base64 content).\",\n parameters: ReadParams,\n execute: async (toolCallId, params, signal, onUpdate, ctx) => {\n try {\n // Check if this is a virtual image file\n if (getImageByPath && params.file_path.startsWith(\"/images/\")) {\n const imageData = getImageByPath(params.file_path);\n if (imageData) {\n // Return the image as base64 content\n // Truncate if it's very large (first 1000 chars)\n const displayData = imageData.length > 1000 \n ? imageData.slice(0, 1000) + \"... [truncated]\" \n : imageData;\n return {\n content: [\n {\n type: \"text\",\n text: `[IMAGE FILE: ${params.file_path}]\\nBase64 content (${imageData.length} chars):\\n${displayData}`,\n },\n ],\n details: {\n path: params.file_path,\n size: imageData.length,\n truncated: imageData.length > 1000,\n },\n };\n }\n }\n\n // Build command with offset and limit support for regular files\n let command: string;\n const offset = params.offset || 1;\n const limit = params.limit;\n \n // Calculate end line if limit is provided\n const endLine = limit ? offset + limit - 1 : undefined;\n \n if (limit && endLine) {\n // Read specific range: use simple sed line range\n command = `sed -n '${offset},${endLine}p' \"${params.file_path}\"`;\n } else if (offset > 1) {\n // Just offset, no limit - read from offset to end\n command = `sed -n '${offset},$p' \"${params.file_path}\"`;\n } else {\n // No offset or limit - read entire file\n command = `cat \"${params.file_path}\"`;\n }\n\n const result = await bash.exec(command);\n\n if (result.exitCode !== 0) {\n return {\n content: [\n {\n type: \"text\",\n text: `Error reading file: ${result.stderr || \"File not found\"}`,\n },\n ],\n details: {\n error: result.stderr || \"File not found\",\n },\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: result.stdout,\n },\n ],\n details: {\n lines: result.stdout.split(\"\\n\").length,\n characters: result.stdout.length,\n },\n };\n } catch (error) {\n const errorMsg = (error as Error).message;\n console.error(`[AgentTools] Read error: ${errorMsg}`);\n console.error(`[AgentTools] File path: ${params.file_path}`);\n return {\n content: [\n {\n type: \"text\",\n text: `Error: ${errorMsg}`,\n },\n ],\n details: {\n error: errorMsg,\n },\n isError: true,\n };\n }\n },\n };\n\n // Grep tool - search for patterns\n const grepTool: ToolDefinition<typeof GrepParams> = {\n name: \"grep\",\n label: \"Grep\",\n description: \"Search for patterns in files using grep\",\n parameters: GrepParams,\n execute: async (toolCallId, params, signal, onUpdate, ctx) => {\n try {\n const options = params.options || \"\";\n const command = `grep ${options} \"${params.pattern}\" \"${params.path}\" 2>/dev/null || echo \"(no matches found)\"`;\n\n const result = await bash.exec(command);\n\n return {\n content: [\n {\n type: \"text\",\n text: result.stdout || \"(no matches found)\",\n },\n ],\n details: {\n matches: result.stdout\n .split(\"\\n\")\n .filter((line) => line.trim()).length,\n },\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: `(no matches found)`,\n },\n ],\n details: {},\n };\n }\n },\n };\n\n // Find tool - find files by name or pattern\n const findTool: ToolDefinition<typeof FindParams> = {\n name: \"find\",\n label: \"Find\",\n description: \"Find files by name or pattern\",\n parameters: FindParams,\n execute: async (toolCallId, params, signal, onUpdate, ctx) => {\n try {\n let command = `find \"${params.path}\" -type f`;\n if (params.name) {\n command = `find \"${params.path}\" -type f -name \"${params.name}\"`;\n }\n\n const result = await bash.exec(command);\n\n return {\n content: [\n {\n type: \"text\",\n text: result.stdout || \"(no files found)\",\n },\n ],\n details: {\n files: result.stdout\n .split(\"\\n\")\n .filter((line) => line.trim()).length,\n },\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: `Error: ${(error as Error).message}`,\n },\n ],\n details: {\n error: (error as Error).message,\n },\n isError: true,\n };\n }\n },\n };\n\n // Ls tool - list files and directories\n const lsTool: ToolDefinition<typeof LsParams> = {\n name: \"ls\",\n label: \"List Directory\",\n description: \"List files and directories\",\n parameters: LsParams,\n execute: async (toolCallId, params, signal, onUpdate, ctx) => {\n try {\n let command = `ls -la \"${params.path}\"`;\n if (params.recursive) {\n command = `ls -laR \"${params.path}\"`;\n }\n\n const result = await bash.exec(command);\n\n if (result.exitCode !== 0) {\n return {\n content: [\n {\n type: \"text\",\n text: `Error: ${result.stderr || \"Directory not found\"}`,\n },\n ],\n details: {\n error: result.stderr || \"Directory not found\",\n },\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: result.stdout,\n },\n ],\n details: {\n entries: result.stdout\n .split(\"\\n\")\n .filter((line) => line.trim() && !line.startsWith(\"total \"))\n .length,\n },\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: `Error: ${(error as Error).message}`,\n },\n ],\n details: {\n error: (error as Error).message,\n },\n isError: true,\n };\n }\n },\n };\n\n // View Image tool - injects an image as a multimodal message for the agent to see\n const viewImageTool: ToolDefinition<typeof ViewImageParams> = {\n name: \"view_image\",\n label: \"View Image\",\n description: \"View an image file from the virtual filesystem. This injects the image as a visual message that the AI can see and analyze. Use this to examine images, screenshots, diagrams, or any visual content in the artifacts.\",\n parameters: ViewImageParams,\n execute: async (toolCallId, params, signal, onUpdate, ctx) => {\n try {\n if (!getImageByPath) {\n return {\n content: [\n {\n type: \"text\",\n text: \"Error: Image viewing is not available\",\n },\n ],\n details: {\n error: \"Image viewing is not available\",\n },\n isError: true,\n };\n }\n\n const imageData = getImageByPath(params.image_path);\n if (!imageData) {\n return {\n content: [\n {\n type: \"text\",\n text: `Error: Image not found at ${params.image_path}`,\n },\n ],\n details: {\n error: `Image not found at ${params.image_path}`,\n },\n isError: true,\n };\n }\n\n // Detect image format from the path or base64 signature\n const getImageFormat = (path: string, data: string): string => {\n // Check path extension first\n if (path.endsWith('.png')) return 'image/png';\n if (path.endsWith('.jpg') || path.endsWith('.jpeg')) return 'image/jpeg';\n if (path.endsWith('.gif')) return 'image/gif';\n if (path.endsWith('.webp')) return 'image/webp';\n if (path.endsWith('.bmp')) return 'image/bmp';\n if (path.endsWith('.svg')) return 'image/svg+xml';\n \n // Check base64 signature\n if (data.startsWith('/9j/')) return 'image/jpeg';\n if (data.startsWith('iVBORw0KGgo')) return 'image/png';\n if (data.startsWith('R0lGOD')) return 'image/gif';\n if (data.startsWith('Qk')) return 'image/bmp';\n if (data.startsWith('PHN2Zy')) return 'image/svg+xml';\n \n return 'image/png'; // Default\n };\n\n const mimeType = getImageFormat(params.image_path, imageData);\n\n // Return the image as an image content type that the model can see\n return {\n content: [\n {\n type: \"text\",\n text: `[Viewing image: ${params.image_path}]`,\n },\n {\n type: \"image\",\n data: imageData,\n mimeType: mimeType,\n },\n ],\n details: {\n path: params.image_path,\n format: mimeType,\n size: imageData.length,\n },\n };\n } catch (error) {\n const errorMsg = (error as Error).message;\n console.error(`[AgentTools] View image error: ${errorMsg}`);\n console.error(`[AgentTools] Image path: ${params.image_path}`);\n return {\n content: [\n {\n type: \"text\",\n text: `Error viewing image: ${errorMsg}`,\n },\n ],\n details: {\n error: errorMsg,\n },\n isError: true,\n };\n }\n },\n };\n\n return {\n bash: bashTool,\n read: readTool,\n grep: grepTool,\n find: findTool,\n ls: lsTool,\n view_image: viewImageTool,\n };\n};\n\n// Type for the complete tool set including output tools\nexport type CompleteVirtualFilesystemTools = VirtualFilesystemTools & AgentOutputTools;\n","export type {\n Artifact,\n ArtifactContent,\n ArtifactImage,\n ArtifactType,\n ExtractionEvents,\n ExtractionOptions,\n ExtractionResult,\n ExtractionStrategy,\n Usage,\n AnyJSONSchema,\n TypedJSONSchema,\n // Agent event types\n AgentEvents,\n AgentToolStartInfo,\n AgentToolEndInfo,\n AgentMessageInfo,\n AgentReasoningInfo,\n // Telemetry\n TelemetryAdapter,\n} from \"./types\";\n\nexport { extract } from \"./extract\";\nexport {\n parseFieldsString,\n buildSchemaFromParsedFields,\n buildSchemaFromFields,\n} from \"./fields\";\nexport type { ParsedField, FieldType } from \"./fields\";\n\nexport type {\n ArtifactInput,\n ArtifactInputParser,\n SerializedArtifact,\n SerializedArtifactContent,\n SerializedArtifactImage,\n SerializedArtifacts,\n} from \"./artifacts/input\";\n\nexport { urlToArtifact } from \"./artifacts/urlToArtifact\";\nexport { fileToArtifact } from \"./artifacts/fileToArtifact\";\nexport type { ArtifactProvider, ArtifactProviders } from \"./artifacts/providers\";\nexport { defaultArtifactProviders } from \"./artifacts/providers\";\nexport {\n registerArtifactInputParser,\n clearArtifactInputParsers,\n validateSerializedArtifacts,\n parseSerializedArtifacts,\n hydrateSerializedArtifacts,\n parse,\n splitTextIntoContents,\n} from \"./artifacts/input\";\n\nexport * from \"./strategies\";\n\n// Parsers public API\nexport { collectStream } from \"./parsers/collect\";\nexport type { ParserDef, ParsersConfig, InlineParserDef, NpmParserDef } from \"./parsers/types\";\nexport { detectMimeType } from \"./parsers/mime\";\nexport type { NpmParserEntry } from \"./parsers/mime\";\nexport { runParser } from \"./parsers/runner\";\nexport { parsePdf } from \"./parsers/pdf\";\n\n// Debug\nexport { createDebugLogger } from \"./debug/logger\";\n\n// LLM models\nexport {\n listAllProviderModels,\n listProviderModels,\n resolveCheapestModel,\n} from \"./llm/models\";\nexport { resolveModel } from \"./llm/resolveModel\";\n\n// Validation\nexport { SchemaValidationError } from \"./validation/validator\";\n\n// Auth (for CLI and SDK users who want to manage tokens)\nexport {\n getDefaultModel,\n setDefaultModel,\n listAliases,\n getAlias,\n setAlias,\n deleteAlias,\n resolveAlias,\n listParsers,\n getParser,\n setParser,\n deleteParser,\n getTelemetryConfig,\n setTelemetryConfig,\n enableTelemetry,\n disableTelemetry,\n deleteTelemetryConfig,\n} from \"./auth/config\";\nexport {\n listStoredProviders,\n setProviderToken,\n deleteProviderToken,\n resolveProviderToken,\n getProviderTokenOrThrow,\n resolveProviderEnvVar,\n maskToken,\n type TokenStorageType,\n type TokenEntry,\n} from \"./auth/tokens\";\n","import type { Artifact, ArtifactContent, ExtractionEvents, Usage, StepInfo, ProgressInfo, RetryInfo, TokenUsageInfo } from \"../types\";\n\nexport type DebugLogger = ReturnType<typeof createDebugLogger>;\n\nexport const createDebugLogger = (enabled: boolean) => {\n const log = (entry: Record<string, unknown>) => {\n if (!enabled) return;\n const timestamp = new Date().toISOString();\n const logEntry = { timestamp, ...entry };\n process.stderr.write(JSON.stringify(logEntry) + \"\\n\");\n };\n\n return {\n // CLI initialization\n cliInit: (data: { args: Record<string, unknown> }) => {\n log({ type: \"cli_init\", ...data });\n },\n\n schemaLoaded: (data: { source: string; schemaSize: number }) => {\n log({ type: \"schema_loaded\", ...data });\n },\n\n artifactsLoaded: (data: { \n count: number; \n artifacts: Array<{ id: string; type: string; contentCount: number; tokens?: number }>;\n totalTokens: number;\n totalImages: number;\n }) => {\n log({ type: \"artifacts_loaded\", ...data });\n },\n\n modelResolved: (data: { modelSpec: string; resolvedModel: string }) => {\n log({ type: \"model_resolved\", ...data });\n },\n\n strategyCreated: (data: { strategy: string; config: Record<string, unknown> }) => {\n log({ type: \"strategy_created\", ...data });\n },\n\n // Chunking\n chunkingStart: (data: { \n artifactId: string; \n totalTokens: number; \n maxTokens: number;\n maxImages?: number;\n }) => {\n log({ type: \"chunking_start\", ...data });\n },\n\n chunkingSplit: (data: {\n artifactId: string;\n originalContentCount: number;\n splitContentCount: number;\n splitReason: \"text_too_long\" | \"content_limit\";\n originalTokens: number;\n chunkSize: number;\n }) => {\n log({ type: \"chunking_split\", ...data });\n },\n\n chunkingResult: (data: {\n artifactId: string;\n chunksCreated: number;\n chunkSizes: number[];\n }) => {\n log({ type: \"chunking_result\", ...data });\n },\n\n batchingStart: (data: {\n totalArtifacts: number;\n maxTokens: number;\n maxImages?: number;\n modelMaxTokens?: number;\n effectiveMaxTokens: number;\n }) => {\n log({ type: \"batching_start\", ...data });\n },\n\n batchCreated: (data: {\n batchIndex: number;\n artifactCount: number;\n totalTokens: number;\n totalImages: number;\n artifactIds: string[];\n }) => {\n log({ type: \"batch_created\", ...data });\n },\n\n batchingComplete: (data: {\n totalBatches: number;\n batches: Array<{ index: number; artifactCount: number; tokens: number; images: number }>;\n }) => {\n log({ type: \"batching_complete\", ...data });\n },\n\n // Strategy execution\n strategyRunStart: (data: { strategy: string; estimatedSteps: number; artifactCount: number }) => {\n log({ type: \"strategy_run_start\", ...data });\n },\n\n step: (data: StepInfo & { strategy: string }) => {\n log({ type: \"step\", ...data });\n },\n\n progress: (data: ProgressInfo & { strategy: string; context?: string }) => {\n log({ type: \"progress\", ...data });\n },\n\n // LLM calls\n llmCallStart: (data: {\n callId: string;\n model: string;\n schemaName?: string;\n systemLength: number;\n userLength: number;\n artifactCount: number;\n }) => {\n log({ type: \"llm_call_start\", ...data });\n },\n\n llmCallComplete: (data: {\n callId: string;\n success: boolean;\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n durationMs?: number;\n error?: string;\n }) => {\n log({ type: \"llm_call_complete\", ...data });\n },\n\n // Retry events\n retry: (data: RetryInfo & { callId: string }) => {\n log({ type: \"retry\", ...data });\n },\n\n // Validation\n validationStart: (data: { callId: string; attempt: number; maxAttempts: number; strict: boolean }) => {\n log({ type: \"validation_start\", ...data });\n },\n\n validationSuccess: (data: { callId: string; attempt: number }) => {\n log({ type: \"validation_success\", ...data });\n },\n\n validationFailed: (data: { callId: string; attempt: number; errors: unknown[] }) => {\n log({ type: \"validation_failed\", ...data });\n },\n\n // Merging\n mergeStart: (data: { mergeId: string; inputCount: number; strategy: string }) => {\n log({ type: \"merge_start\", ...data });\n },\n\n mergeComplete: (data: { mergeId: string; success: boolean; error?: string }) => {\n log({ type: \"merge_complete\", ...data });\n },\n\n // Deduplication\n dedupeStart: (data: { dedupeId: string; itemCount: number }) => {\n log({ type: \"dedupe_start\", ...data });\n },\n\n dedupeComplete: (data: { dedupeId: string; duplicatesFound: number; itemsRemoved: number }) => {\n log({ type: \"dedupe_complete\", ...data });\n },\n\n // Token usage tracking\n tokenUsage: (data: TokenUsageInfo & { context: string }) => {\n log({ type: \"token_usage\", ...data });\n },\n\n // Results\n extractionComplete: (data: {\n success: boolean;\n totalInputTokens: number;\n totalOutputTokens: number;\n totalTokens: number;\n error?: string;\n }) => {\n log({ type: \"extraction_complete\", ...data });\n },\n\n // Prompt details (verbose)\n promptSystem: (data: { callId: string; system: string }) => {\n log({ type: \"prompt_system\", ...data });\n },\n\n promptUser: (data: { callId: string; user: unknown }) => {\n log({ type: \"prompt_user\", ...data });\n },\n\n // Raw response\n rawResponse: (data: { callId: string; response: unknown }) => {\n log({ type: \"raw_response\", ...data });\n },\n\n // Smart merge details\n smartMergeField: (data: {\n mergeId: string;\n field: string;\n operation: \"merge_arrays\" | \"merge_objects\" | \"replace\" | \"concat\";\n leftCount?: number;\n rightCount?: number;\n resultCount?: number;\n }) => {\n log({ type: \"smart_merge_field\", ...data });\n },\n };\n};\n","import path from \"node:path\";\nimport os from \"node:os\";\nimport { chmod, mkdir, readFile, writeFile, stat, access } from \"node:fs/promises\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport type TokenStorageType = \"auto\" | \"keychain\" | \"file\";\n\nexport type TokenEntry = {\n storage: \"keychain\" | \"file\";\n token?: string;\n account?: string;\n service?: string;\n};\n\ntype TokenStore = {\n version: 1;\n providers: Record<string, TokenEntry>;\n};\n\nconst CONFIG_DIR_ENV = \"STRUKTUR_CONFIG_DIR\";\nconst DISABLE_KEYCHAIN_ENV = \"STRUKTUR_DISABLE_KEYCHAIN\";\nconst SERVICE_ENV = \"STRUKTUR_KEYCHAIN_SERVICE\";\nconst DEFAULT_SERVICE = \"struktur\";\n\nconst resolveConfigDir = () => {\n return process.env[CONFIG_DIR_ENV] ?? path.join(os.homedir(), \".config\", \"struktur\");\n};\n\nconst resolveTokensPath = () => path.join(resolveConfigDir(), \"tokens.json\");\n\nconst emptyStore = (): TokenStore => ({ version: 1, providers: {} });\n\nconst readTokenStore = async (): Promise<TokenStore> => {\n const tokensPath = resolveTokensPath();\n try {\n await stat(tokensPath);\n } catch {\n return emptyStore();\n }\n const raw = await readFile(tokensPath, \"utf-8\");\n const parsed = JSON.parse(raw) as TokenStore;\n if (!parsed || parsed.version !== 1 || typeof parsed.providers !== \"object\") {\n return emptyStore();\n }\n return parsed;\n};\n\nconst writeTokenStore = async (store: TokenStore) => {\n const configDir = resolveConfigDir();\n const tokensPath = resolveTokensPath();\n await mkdir(configDir, { recursive: true, mode: 0o700 });\n await writeFile(tokensPath, JSON.stringify(store, null, 2));\n await chmod(configDir, 0o700);\n await chmod(tokensPath, 0o600);\n};\n\nconst isKeychainAvailable = async () => {\n if (process.env[DISABLE_KEYCHAIN_ENV]) {\n return false;\n }\n if (process.platform !== \"darwin\") {\n return false;\n }\n try {\n await access(\"/usr/bin/security\");\n return true;\n } catch {\n return false;\n }\n};\n\nconst keychainService = () => process.env[SERVICE_ENV] ?? DEFAULT_SERVICE;\n\nconst runSecurity = async (args: string[]) => {\n try {\n const { stdout } = await execFileAsync(\"/usr/bin/security\", args);\n return stdout;\n } catch (error) {\n if (error instanceof Error && \"stderr\" in error) {\n const stderr = (error as { stderr: string }).stderr;\n const message = stderr?.trim() || error.message;\n throw new Error(message);\n }\n throw error;\n }\n};\n\nconst writeKeychainToken = async (provider: string, token: string) => {\n await runSecurity([\n \"add-generic-password\",\n \"-a\",\n provider,\n \"-s\",\n keychainService(),\n \"-w\",\n token,\n \"-U\",\n ]);\n};\n\nconst readKeychainToken = async (provider: string) => {\n const output = await runSecurity([\n \"find-generic-password\",\n \"-a\",\n provider,\n \"-s\",\n keychainService(),\n \"-w\",\n ]);\n return output.trim();\n};\n\nconst deleteKeychainToken = async (provider: string) => {\n await runSecurity([\n \"delete-generic-password\",\n \"-a\",\n provider,\n \"-s\",\n keychainService(),\n ]);\n};\n\nexport const listStoredProviders = async () => {\n const store = await readTokenStore();\n return Object.entries(store.providers).map(([provider, entry]) => ({\n provider,\n storage: entry.storage,\n }));\n};\n\nexport const setProviderToken = async (\n provider: string,\n token: string,\n storage: TokenStorageType = \"auto\"\n) => {\n const store = await readTokenStore();\n let resolvedStorage: TokenEntry[\"storage\"] = \"file\";\n\n if (storage === \"keychain\") {\n if (!(await isKeychainAvailable())) {\n throw new Error(\"Keychain is not available on this platform.\");\n }\n resolvedStorage = \"keychain\";\n } else if (storage === \"auto\") {\n resolvedStorage = (await isKeychainAvailable()) ? \"keychain\" : \"file\";\n }\n\n if (resolvedStorage === \"keychain\") {\n await writeKeychainToken(provider, token);\n store.providers[provider] = {\n storage: \"keychain\",\n account: provider,\n service: keychainService(),\n };\n } else {\n store.providers[provider] = {\n storage: \"file\",\n token,\n };\n }\n\n await writeTokenStore(store);\n return resolvedStorage;\n};\n\nexport const deleteProviderToken = async (provider: string) => {\n const store = await readTokenStore();\n const entry = store.providers[provider];\n if (!entry) {\n return false;\n }\n\n if (entry.storage === \"keychain\") {\n try {\n await deleteKeychainToken(provider);\n } catch {\n // ignore errors for missing keychain items\n }\n }\n\n delete store.providers[provider];\n await writeTokenStore(store);\n return true;\n};\n\nexport const resolveProviderToken = async (provider: string) => {\n const store = await readTokenStore();\n const entry = store.providers[provider];\n if (!entry) {\n return undefined;\n }\n\n if (entry.storage === \"file\") {\n return entry.token;\n }\n\n try {\n return await readKeychainToken(provider);\n } catch {\n return undefined;\n }\n};\n\nexport const getProviderTokenOrThrow = async (provider: string) => {\n const token = await resolveProviderToken(provider);\n if (!token) {\n throw new Error(`No token stored for provider: ${provider}`);\n }\n return token;\n};\n\nexport const resolveProviderEnvVar = (provider: string) => {\n switch (provider) {\n case \"openai\":\n return \"OPENAI_API_KEY\";\n case \"anthropic\":\n return \"ANTHROPIC_API_KEY\";\n case \"google\":\n return \"GOOGLE_GENERATIVE_AI_API_KEY\";\n case \"opencode\":\n return \"OPENCODE_API_KEY\";\n case \"openrouter\":\n return \"OPENROUTER_API_KEY\";\n default:\n return undefined;\n }\n};\n\nexport const maskToken = (token: string) => {\n if (token.length <= 8) {\n return \"********\";\n }\n return `${token.slice(0, 4)}...${token.slice(-4)}`;\n};\n","import type { ProviderModelsResult } from \"../types\";\nimport { resolveProviderEnvVar, resolveProviderToken } from \"../auth/tokens\";\n\nconst openAiModelsUrl = \"https://api.openai.com/v1/models\";\nconst anthropicModelsUrl = \"https://api.anthropic.com/v1/models\";\nconst googleModelsUrl = \"https://generativelanguage.googleapis.com/v1beta/models\";\nconst openRouterModelsUrl = \"https://openrouter.ai/api/v1/models\";\n\nconst getTokenForProvider = async (provider: string) => {\n const envVar = resolveProviderEnvVar(provider);\n if (envVar && process.env[envVar]) {\n return process.env[envVar] as string;\n }\n return await resolveProviderToken(provider);\n};\n\nconst parseOpenAiModels = (json: unknown) => {\n const data = (json as { data?: Array<{ id?: string }> } | undefined)?.data ?? [];\n return data.map((item) => item.id).filter((id): id is string => typeof id === \"string\");\n};\n\nconst parseAnthropicModels = (json: unknown) => {\n const data = (json as { data?: Array<{ id?: string }> } | undefined)?.data ?? [];\n return data.map((item) => item.id).filter((id): id is string => typeof id === \"string\");\n};\n\nconst parseGoogleModels = (json: unknown) => {\n const data = (json as { models?: Array<{ name?: string }> } | undefined)?.models ?? [];\n return data\n .map((item) => item.name)\n .filter((name): name is string => typeof name === \"string\")\n .map((name) => name.replace(/^models\\//, \"\"));\n};\n\nconst parseOpenRouterModels = (json: unknown) => {\n const data = (json as { data?: Array<{ id?: string }> } | undefined)?.data ?? [];\n return data.map((item) => item.id).filter((id): id is string => typeof id === \"string\");\n};\n\nconst requestModels = async (provider: string, token: string): Promise<string[]> => {\n if (provider === \"openai\") {\n const response = await fetch(openAiModelsUrl, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!response.ok) {\n throw new Error(await response.text());\n }\n const json = (await response.json()) as unknown;\n return parseOpenAiModels(json);\n }\n\n if (provider === \"anthropic\") {\n const response = await fetch(anthropicModelsUrl, {\n headers: {\n \"x-api-key\": token,\n \"anthropic-version\": \"2023-06-01\",\n },\n });\n if (!response.ok) {\n throw new Error(await response.text());\n }\n const json = (await response.json()) as unknown;\n return parseAnthropicModels(json);\n }\n\n if (provider === \"google\") {\n const response = await fetch(`${googleModelsUrl}?key=${encodeURIComponent(token)}`);\n if (!response.ok) {\n throw new Error(await response.text());\n }\n const json = (await response.json()) as unknown;\n return parseGoogleModels(json);\n }\n\n if (provider === \"openrouter\") {\n const response = await fetch(openRouterModelsUrl, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!response.ok) {\n throw new Error(await response.text());\n }\n const json = (await response.json()) as unknown;\n return parseOpenRouterModels(json);\n }\n\n if (provider === \"opencode\") {\n // OpenCode doesn't have a public models endpoint, return known models\n return [\n \"gpt-5.2\",\n \"gpt-5.2-codex\",\n \"gpt-5.1\",\n \"gpt-5.1-codex\",\n \"gpt-5.1-codex-max\",\n \"gpt-5.1-codex-mini\",\n \"gpt-5\",\n \"gpt-5-codex\",\n \"gpt-5-nano\",\n \"claude-opus-4-6\",\n \"claude-opus-4-5\",\n \"claude-opus-4-1\",\n \"claude-sonnet-4-6\",\n \"claude-sonnet-4-5\",\n \"claude-sonnet-4\",\n \"claude-haiku-4-5\",\n \"claude-haiku-3.5\",\n \"gemini-3.1-pro\",\n \"gemini-3-pro\",\n \"gemini-3-flash\",\n \"minimax-m2.5\",\n \"minimax-m2.5-free\",\n \"minimax-m2.1\",\n \"glm-5\",\n \"glm-5-free\",\n \"glm-4.7\",\n \"glm-4.6\",\n \"kimi-k2.5\",\n \"kimi-k2.5-free\",\n \"kimi-k2-thinking\",\n \"kimi-k2\",\n \"qwen3-coder\",\n \"big-pickle\",\n ];\n }\n\n throw new Error(`Unsupported provider: ${provider}`);\n};\n\nconst cheapestModelPreferences: Record<string, string[]> = {\n openai: [\"gpt-4.1-nano\", \"gpt-4.1-mini\", \"gpt-4o-mini\", \"gpt-4o\"],\n anthropic: [\"claude-3-5-haiku\", \"claude-3-haiku\"],\n google: [\"gemini-1.5-flash-8b\", \"gemini-1.5-flash\", \"gemini-2.0-flash\", \"gemini-1.5-pro\"],\n opencode: [\"gpt-5-nano\", \"claude-haiku-3.5\", \"gemini-3-flash\", \"kimi-k2-free\", \"glm-5-free\", \"minimax-m2.5-free\"],\n openrouter: [\"openai/gpt-4o-mini\", \"anthropic/claude-3.5-haiku\", \"google/gemini-flash-1.5\"],\n};\n\nconst matchesPreference = (model: string, preference: string) => {\n return model === preference || model.startsWith(`${preference}-`);\n};\n\nexport const listProviderModels = async (provider: string): Promise<ProviderModelsResult> => {\n const token = await getTokenForProvider(provider);\n if (!token) {\n return { provider, ok: false, error: \"No token available\" };\n }\n\n try {\n const models = await requestModels(provider, token);\n return { provider, ok: true, models };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { provider, ok: false, error: message };\n }\n};\n\nexport const listAllProviderModels = async (providers: string[]) => {\n const results = await Promise.all(providers.map((provider) => listProviderModels(provider)));\n return results;\n};\n\nexport const pickCheapestModel = (provider: string, models: string[]) => {\n const preferences = cheapestModelPreferences[provider] ?? [];\n for (const preference of preferences) {\n const match = models.find((model) => matchesPreference(model, preference));\n if (match) {\n return match;\n }\n }\n return models[0];\n};\n\nexport const resolveCheapestModel = async (provider: string) => {\n const result = await listProviderModels(provider);\n if (!result.ok) {\n throw new Error(result.error ?? `Unable to list models for provider: ${provider}`);\n }\n const models = result.models ?? [];\n const model = pickCheapestModel(provider, models);\n if (!model) {\n throw new Error(`No models available for provider: ${provider}`);\n }\n return model;\n};\n\nexport const __testing__ = {\n parseOpenAiModels,\n parseAnthropicModels,\n parseGoogleModels,\n parseOpenRouterModels,\n pickCheapestModel,\n};\n","import { resolveProviderEnvVar, resolveProviderToken } from \"../auth/tokens\";\n\n// AI SDK model types have private properties (config, getArgs) that can't be\n// represented in .d.ts files. Using unknown to avoid TS4094 errors.\n// See: https://github.com/microsoft/TypeScript/issues/30369\nexport type AiSdkModel = unknown;\n\nexport const resolveModel = async (model: string): Promise<AiSdkModel> => {\n (globalThis as { AI_SDK_LOG_WARNINGS?: boolean }).AI_SDK_LOG_WARNINGS ??= false;\n process.env.AI_SDK_LOG_WARNINGS ??= \"false\";\n const [provider, ...rest] = model.split(\"/\");\n const modelName = rest.join(\"/\");\n\n if (!provider || !modelName) {\n throw new Error(`Invalid model format: ${model}. Expected format: provider/model (e.g., openai/gpt-4)`);\n }\n\n const envVar = resolveProviderEnvVar(provider);\n if (envVar && !process.env[envVar]) {\n const storedToken = await resolveProviderToken(provider);\n if (storedToken) {\n process.env[envVar] = storedToken;\n }\n }\n\n switch (provider) {\n case \"openai\": {\n const { openai } = await import(\"@ai-sdk/openai\");\n return openai(modelName);\n }\n case \"anthropic\": {\n const { anthropic } = await import(\"@ai-sdk/anthropic\");\n return anthropic(modelName);\n }\n case \"google\": {\n const { google } = await import(\"@ai-sdk/google\");\n return google(modelName);\n }\n case \"opencode\": {\n const envVar = resolveProviderEnvVar(\"opencode\");\n let apiKey = envVar ? process.env[envVar] : undefined;\n if (!apiKey) {\n apiKey = await resolveProviderToken(\"opencode\");\n }\n if (!apiKey) {\n throw new Error(\"OpenCode API key is required. Set OPENCODE_API_KEY environment variable or run 'struktur auth set --provider opencode --token <token>'\");\n }\n \n if (modelName.startsWith(\"claude-\")) {\n const { createAnthropic } = await import(\"@ai-sdk/anthropic\");\n return createAnthropic({\n apiKey,\n baseURL: \"https://opencode.ai/zen/v1\",\n })(modelName);\n } else if (modelName.startsWith(\"gemini-\")) {\n const { createGoogleGenerativeAI } = await import(\"@ai-sdk/google\");\n return createGoogleGenerativeAI({\n apiKey,\n baseURL: \"https://opencode.ai/zen/v1\",\n })(modelName);\n } else {\n const { createOpenAI } = await import(\"@ai-sdk/openai\");\n return createOpenAI({\n apiKey,\n baseURL: \"https://opencode.ai/zen/v1\",\n })(modelName);\n }\n }\n case \"openrouter\": {\n const { openrouter } = await import(\"@openrouter/ai-sdk-provider\");\n const hashIndex = modelName.indexOf(\"#\");\n const actualModelName = hashIndex >= 0 ? modelName.slice(0, hashIndex) : modelName;\n const preferredProvider = hashIndex >= 0 ? modelName.slice(hashIndex + 1) : undefined;\n \n const modelInstance = openrouter(actualModelName);\n \n if (preferredProvider) {\n Object.defineProperty(modelInstance, \"__openrouter_provider\", {\n value: preferredProvider,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n }\n \n return modelInstance;\n }\n default:\n throw new Error(`Unsupported model provider: ${provider}. Supported providers: openai, anthropic, google, opencode, openrouter`);\n }\n};\n","import path from \"node:path\";\nimport os from \"node:os\";\nimport { chmod, mkdir, readFile, writeFile, stat } from \"node:fs/promises\";\nimport type { ParserDef, ParsersConfig } from \"../parsers/types\";\n\ntype TelemetryConfig = {\n enabled: boolean;\n provider: string;\n url?: string;\n apiKey?: string;\n projectName?: string;\n publicKey?: string; // For Langfuse\n secretKey?: string; // For Langfuse\n baseUrl?: string; // For Langfuse\n sampleRate?: number;\n};\n\ntype ConfigStore = {\n version: 1;\n defaultModel?: string;\n aliases?: Record<string, string>;\n parsers?: ParsersConfig;\n telemetry?: TelemetryConfig;\n};\n\nconst CONFIG_DIR_ENV = \"STRUKTUR_CONFIG_DIR\";\n\nconst resolveConfigDir = () => {\n return process.env[CONFIG_DIR_ENV] ?? path.join(os.homedir(), \".config\", \"struktur\");\n};\n\nconst resolveConfigPath = () => path.join(resolveConfigDir(), \"config.json\");\n\nconst emptyStore = (): ConfigStore => ({ version: 1 });\n\nconst readConfigStore = async (): Promise<ConfigStore> => {\n const configPath = resolveConfigPath();\n try {\n await stat(configPath);\n } catch {\n return emptyStore();\n }\n const raw = await readFile(configPath, \"utf-8\");\n const parsed = JSON.parse(raw) as ConfigStore;\n if (!parsed || parsed.version !== 1) {\n return emptyStore();\n }\n return parsed;\n};\n\nconst writeConfigStore = async (store: ConfigStore) => {\n const configDir = resolveConfigDir();\n const configPath = resolveConfigPath();\n await mkdir(configDir, { recursive: true, mode: 0o700 });\n await writeFile(configPath, JSON.stringify(store, null, 2));\n await chmod(configDir, 0o700);\n await chmod(configPath, 0o600);\n};\n\nexport const getDefaultModel = async () => {\n const store = await readConfigStore();\n return store.defaultModel;\n};\n\nexport const setDefaultModel = async (model: string) => {\n const store = await readConfigStore();\n store.defaultModel = model;\n await writeConfigStore(store);\n return model;\n};\n\n// --- Alias management ---\n\nexport const listAliases = async (): Promise<Record<string, string>> => {\n const store = await readConfigStore();\n return store.aliases ?? {};\n};\n\nexport const getAlias = async (alias: string): Promise<string | undefined> => {\n const store = await readConfigStore();\n return store.aliases?.[alias];\n};\n\nexport const setAlias = async (alias: string, model: string): Promise<string> => {\n const store = await readConfigStore();\n store.aliases ??= {};\n store.aliases[alias] = model;\n await writeConfigStore(store);\n return model;\n};\n\nexport const deleteAlias = async (alias: string): Promise<boolean> => {\n const store = await readConfigStore();\n if (!store.aliases?.[alias]) {\n return false;\n }\n delete store.aliases[alias];\n await writeConfigStore(store);\n return true;\n};\n\n/**\n * Resolve a model spec: if it matches a stored alias, return the aliased model string.\n * Otherwise return the original spec unchanged.\n */\nexport const resolveAlias = async (modelSpec: string): Promise<string> => {\n const aliases = await listAliases();\n return aliases[modelSpec] ?? modelSpec;\n};\n\n// --- Parser config management ---\n\nexport const listParsers = async (): Promise<ParsersConfig> => {\n const store = await readConfigStore();\n return store.parsers ?? {};\n};\n\nexport const getParser = async (mimeType: string): Promise<ParserDef | undefined> => {\n const store = await readConfigStore();\n return store.parsers?.[mimeType];\n};\n\nexport const setParser = async (mimeType: string, def: ParserDef): Promise<void> => {\n if (def.type === \"command-file\" && !def.command.includes(\"FILE_PATH\")) {\n throw new Error(\n `command-file parser must contain FILE_PATH placeholder in the command string. Got: \"${def.command}\"`\n );\n }\n const store = await readConfigStore();\n store.parsers ??= {};\n store.parsers[mimeType] = def;\n await writeConfigStore(store);\n};\n\nexport const deleteParser = async (mimeType: string): Promise<boolean> => {\n const store = await readConfigStore();\n if (!store.parsers?.[mimeType]) {\n return false;\n }\n delete store.parsers[mimeType];\n await writeConfigStore(store);\n return true;\n};\n\n// --- Telemetry config management ---\n\nexport const getTelemetryConfig = async (): Promise<TelemetryConfig | undefined> => {\n const store = await readConfigStore();\n return store.telemetry;\n};\n\nexport const setTelemetryConfig = async (config: TelemetryConfig): Promise<void> => {\n const store = await readConfigStore();\n store.telemetry = config;\n await writeConfigStore(store);\n};\n\nexport const enableTelemetry = async (\n provider: string,\n options: Omit<TelemetryConfig, \"enabled\" | \"provider\">\n): Promise<void> => {\n const store = await readConfigStore();\n store.telemetry = {\n enabled: true,\n provider,\n ...options,\n };\n await writeConfigStore(store);\n};\n\nexport const disableTelemetry = async (): Promise<void> => {\n const store = await readConfigStore();\n if (store.telemetry) {\n store.telemetry.enabled = false;\n }\n await writeConfigStore(store);\n};\n\nexport const deleteTelemetryConfig = async (): Promise<boolean> => {\n const store = await readConfigStore();\n if (!store.telemetry) {\n return false;\n }\n delete store.telemetry;\n await writeConfigStore(store);\n return true;\n};\n"],"mappings":"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","names":["name","readFile","path","bufferToTextArtifact","bufferToImageArtifact","parsePdf","readFile","path","dedupeSchema","dedupeArrays","removeByPath","path","dedupeSchema","dedupeArrays","removeByPath","path","Bash","path","path","path","Bash","Type","path","os","readFile","writeFile","promisify","envVar","path","os","chmod","mkdir","readFile","writeFile","stat","CONFIG_DIR_ENV","resolveConfigDir","emptyStore"]}