@absolutejs/rag 0.10.0 → 0.11.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.
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ingestion/ingestion.ts", "../src/internal/constants.ts", "../src/web/transport.ts", "../src/web/index.ts"],
4
+ "sourcesContent": [
5
+ "import { readdir, readFile } from \"node:fs/promises\";\nimport { basename, extname, join, relative, resolve } from \"node:path\";\nimport { gunzipSync, inflateRawSync } from \"node:zlib\";\n\n// Opportunistic HTTP/2 multiplexing for outbound HTTPS (Bun 1.3.14+).\n// URL-source ingestion may receive a batch of same-origin URLs;\n// multiplexing eliminates per-request handshake. The `protocol` option\n// lands in @types/bun 1.3.14; widen locally for now. Hard-skip on\n// non-HTTPS — Bun's h2 client throws HTTP2Unsupported on h2c.\ntype H2Init = RequestInit & { protocol?: \"http2\" };\nconst h2IfHttps = (url: string): H2Init =>\n url.startsWith(\"https://\") ? { protocol: \"http2\" } : {};\nimport type {\n RAGChunkingOptions,\n RAGChunkingProfile,\n RAGChunkingProfileInput,\n RAGChunkingProfileRegistration,\n RAGChunkingRegistryLike,\n RAGContentFormat,\n RAGArchiveExpander,\n RAGArchiveEntry,\n RAGDirectoryIngestInput,\n RAGDocumentChunk,\n RAGDocumentFileInput,\n RAGDocumentIngestInput,\n RAGDocumentUploadIngestInput,\n RAGDocumentUploadInput,\n RAGDocumentUrlInput,\n RAGDocumentUrlIngestInput,\n RAGExtractedFileDocument,\n RAGFileExtractionInput,\n RAGFileExtractor,\n RAGFileExtractorRegistration,\n RAGFileExtractorRegistryInput,\n RAGFileExtractorRegistryLike,\n RAGIngestDocument,\n RAGMediaTranscriber,\n RAGMediaTranscriptionResult,\n RAGOCRResult,\n RAGPDFOCRExtractorOptions,\n RAGOCRProvider,\n RAGPreparedDocument,\n} from \"../../types/engine\";\nimport {\n EXCLUDE_LAST_OFFSET,\n RAG_CHUNK_ID_PAD_LENGTH,\n RAG_DOCUMENT_ID_PREVIEW_LENGTH,\n RAG_DOCUMENT_SLUG_MAX_LENGTH,\n RAG_MIN_CHUNK_LENGTH_FLOOR,\n} from \"../internal/constants\";\n\nconst DEFAULT_MAX_CHUNK_LENGTH = 900;\nconst DEFAULT_CHUNK_OVERLAP = 120;\nconst DEFAULT_MIN_CHUNK_LENGTH = 80;\nconst DEFAULT_STRATEGY = \"paragraphs\";\nconst DEFAULT_BINARY_NAME = \"document\";\n\nconst TEXT_FILE_EXTENSIONS = new Set([\n \".txt\",\n \".md\",\n \".mdx\",\n \".html\",\n \".htm\",\n \".json\",\n \".jsonl\",\n \".ndjson\",\n \".csv\",\n \".tsv\",\n \".xml\",\n \".yaml\",\n \".yml\",\n \".log\",\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n]);\nconst OFFICE_FILE_EXTENSIONS = new Set([\n \".docx\",\n \".xlsx\",\n \".pptx\",\n \".odt\",\n \".ods\",\n \".odp\",\n]);\nconst LEGACY_DOCUMENT_FILE_EXTENSIONS = new Set([\n \".rtf\",\n \".doc\",\n \".xls\",\n \".ppt\",\n \".msg\",\n]);\nconst MAILBOX_CONTAINER_FILE_EXTENSIONS = new Set([\".pst\", \".ost\"]);\nconst EMAIL_FILE_EXTENSIONS = new Set([\".eml\", \".emlx\", \".mbox\", \".mbx\"]);\nconst EPUB_FILE_EXTENSIONS = new Set([\".epub\"]);\n\nconst PDF_FILE_EXTENSIONS = new Set([\".pdf\"]);\nconst AUDIO_FILE_EXTENSIONS = new Set([\n \".mp3\",\n \".wav\",\n \".m4a\",\n \".aac\",\n \".flac\",\n \".ogg\",\n \".opus\",\n]);\nconst VIDEO_FILE_EXTENSIONS = new Set([\n \".mp4\",\n \".mov\",\n \".mkv\",\n \".webm\",\n \".avi\",\n \".m4v\",\n]);\nconst IMAGE_FILE_EXTENSIONS = new Set([\n \".png\",\n \".jpg\",\n \".jpeg\",\n \".webp\",\n \".tiff\",\n \".tif\",\n \".bmp\",\n \".gif\",\n \".heic\",\n]);\nconst ARCHIVE_FILE_EXTENSIONS = new Set([\n \".zip\",\n \".tar\",\n \".gz\",\n \".tgz\",\n \".bz2\",\n \".xz\",\n]);\nconst TAR_FILE_EXTENSIONS = new Set([\".tar\"]);\nconst GZIP_FILE_EXTENSIONS = new Set([\".gz\", \".tgz\"]);\n\nconst HTML_ENTITY_REPLACEMENTS = [\n [/&nbsp;/gi, \" \"],\n [/&amp;/gi, \"&\"],\n [/&lt;/gi, \"<\"],\n [/&gt;/gi, \">\"],\n [/&quot;/gi, '\"'],\n [/&#39;/gi, \"'\"],\n [/&#x27;/gi, \"'\"],\n [/&#x2f;/gi, \"/\"],\n] as const;\n\nconst MAX_MEDIA_GROUP_CONTINUITY_GAP_MS = 3_000;\nconst MAX_MEDIA_BRIDGED_UNKNOWN_SEGMENTS = 2;\n\nconst normalizeWhitespace = (value: string) =>\n value\n .replace(/\\r\\n?/g, \"\\n\")\n .replace(/[ \\t\\f\\v]+/g, \" \")\n .replace(/ *\\n */g, \"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n\nconst formatMediaTimestampForIngest = (value: number | undefined) => {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n return undefined;\n }\n\n const totalSeconds = Math.floor(value / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n const milliseconds = Math.floor(value % 1000);\n\n return `${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(\n 2,\n \"0\",\n )}.${String(milliseconds).padStart(3, \"0\")}`;\n};\n\nconst normalizeMediaSpeaker = (value: unknown) =>\n typeof value === \"string\" && value.trim().length > 0\n ? normalizeWhitespace(value)\n : undefined;\n\nconst canonicalMediaSpeakerKey = (value: unknown) => {\n const normalized = normalizeMediaSpeaker(value);\n return typeof normalized === \"string\"\n ? normalized.toLowerCase().replace(/[^a-z0-9]+/gi, \"\")\n : undefined;\n};\n\nconst normalizeMediaTimestamp = (value: unknown) =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? value\n : undefined;\n\nconst normalizeMediaSegmentWindow = (\n startMs: number | undefined,\n endMs: number | undefined,\n) => {\n if (typeof startMs !== \"number\" && typeof endMs !== \"number\") {\n return { endMs, startMs };\n }\n\n if (\n typeof startMs === \"number\" &&\n typeof endMs === \"number\" &&\n endMs < startMs\n ) {\n return {\n startMs: undefined,\n endMs: undefined,\n };\n }\n\n return {\n startMs,\n endMs,\n };\n};\n\nconst canonicalMediaChannel = (value: unknown) => {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n switch (\n value\n .trim()\n .toLowerCase()\n .replace(/[\\s_-]+/g, \"\")\n ) {\n case \"l\":\n case \"left\":\n case \"ch1\":\n case \"channel1\":\n case \"one\":\n return \"left\";\n case \"r\":\n case \"right\":\n case \"ch2\":\n case \"channel2\":\n case \"two\":\n return \"right\";\n case \"m\":\n case \"mono\":\n case \"center\":\n case \"centre\":\n case \"middle\":\n return \"mono\";\n default:\n return value.trim().toLowerCase();\n }\n};\n\nconst normalizeMediaChannel = (value: unknown) => canonicalMediaChannel(value);\n\ntype RAGMediaTranscriptSegmentWithText = NonNullable<\n RAGMediaTranscriptionResult[\"segments\"]\n>[number];\n\ntype RAGMediaSegmentGroup = {\n channel?: string;\n endMs?: number;\n segments: RAGMediaTranscriptSegmentWithText[];\n speaker?: string;\n speakerKey?: string;\n startMs?: number;\n};\n\nconst buildMediaTimestampBoundary = (\n segments: RAGMediaSegmentGroup[\"segments\"],\n) => {\n let startMs: number | undefined;\n let endMs: number | undefined;\n\n for (const segment of segments) {\n if (\n typeof segment.startMs === \"number\" &&\n Number.isFinite(segment.startMs)\n ) {\n startMs =\n typeof startMs === \"number\"\n ? Math.min(startMs, segment.startMs)\n : segment.startMs;\n }\n }\n\n for (const segment of segments) {\n if (typeof segment.endMs === \"number\" && Number.isFinite(segment.endMs)) {\n endMs =\n typeof endMs === \"number\"\n ? Math.max(endMs, segment.endMs)\n : segment.endMs;\n }\n }\n\n return { endMs, startMs };\n};\n\nconst buildMediaSegmentGapFromPrevious = (\n startMs: number | undefined,\n previousGroupEndMs: number | undefined,\n) => {\n if (\n typeof startMs !== \"number\" ||\n typeof previousGroupEndMs !== \"number\" ||\n !Number.isFinite(startMs) ||\n !Number.isFinite(previousGroupEndMs)\n ) {\n return undefined;\n }\n\n // Only reward true adjacency or forward gaps. Overlaps should not look like\n // gapless continuity because reranking treats a zero gap as the strongest case.\n if (startMs < previousGroupEndMs) {\n return undefined;\n }\n\n return startMs - previousGroupEndMs;\n};\n\nconst buildMediaSegmentGapToNext = (\n endMs: number | undefined,\n nextGroupStartMs: number | undefined,\n) => {\n if (\n typeof endMs !== \"number\" ||\n typeof nextGroupStartMs !== \"number\" ||\n !Number.isFinite(endMs) ||\n !Number.isFinite(nextGroupStartMs)\n ) {\n return undefined;\n }\n\n // Mirror previous-gap semantics: only reward true forward adjacency or gaps.\n // Overlaps should not look like gapless continuity.\n if (nextGroupStartMs < endMs) {\n return undefined;\n }\n\n return nextGroupStartMs - endMs;\n};\n\nconst normalizeMediaSegment = (\n segment: NonNullable<RAGMediaTranscriptionResult[\"segments\"]>[number],\n): RAGMediaTranscriptSegmentWithText => {\n const normalizedTimestampWindow = normalizeMediaSegmentWindow(\n normalizeMediaTimestamp(segment.startMs),\n normalizeMediaTimestamp(segment.endMs),\n );\n\n return {\n ...segment,\n speaker: normalizeMediaSpeaker(segment.speaker),\n channel: canonicalMediaChannel(segment.channel),\n ...normalizedTimestampWindow,\n };\n};\n\nconst hasMediaSegmentTiming = (\n segment:\n | Pick<RAGMediaTranscriptSegmentWithText, \"startMs\" | \"endMs\">\n | undefined,\n) =>\n Boolean(\n segment &&\n ((typeof segment.startMs === \"number\" &&\n Number.isFinite(segment.startMs)) ||\n (typeof segment.endMs === \"number\" && Number.isFinite(segment.endMs))),\n );\n\nconst sortMediaTranscriptSegments = (\n segments: RAGMediaTranscriptSegmentWithText[],\n) => {\n const sortTimedRun = (\n run: Array<{\n index: number;\n segment: RAGMediaTranscriptSegmentWithText;\n }>,\n ) =>\n run.sort((left, right) => {\n const leftStart = left.segment.startMs;\n const rightStart = right.segment.startMs;\n const leftHasStart =\n typeof leftStart === \"number\" && Number.isFinite(leftStart);\n const rightHasStart =\n typeof rightStart === \"number\" && Number.isFinite(rightStart);\n\n if (leftHasStart && rightHasStart && leftStart !== rightStart) {\n return leftStart - rightStart;\n }\n\n if (leftHasStart !== rightHasStart) {\n return leftHasStart ? -1 : 1;\n }\n\n const leftEnd = left.segment.endMs;\n const rightEnd = right.segment.endMs;\n const leftHasEnd =\n typeof leftEnd === \"number\" && Number.isFinite(leftEnd);\n const rightHasEnd =\n typeof rightEnd === \"number\" && Number.isFinite(rightEnd);\n\n if (leftHasEnd && rightHasEnd && leftEnd !== rightEnd) {\n return leftEnd - rightEnd;\n }\n\n if (leftHasEnd !== rightHasEnd) {\n return leftHasEnd ? -1 : 1;\n }\n\n return left.index - right.index;\n });\n\n const ordered: RAGMediaTranscriptSegmentWithText[] = [];\n let timedRun: Array<{\n index: number;\n segment: RAGMediaTranscriptSegmentWithText;\n }> = [];\n\n for (const [index, segment] of segments.entries()) {\n if (hasMediaSegmentTiming(segment)) {\n timedRun.push({ index, segment });\n continue;\n }\n\n if (timedRun.length > 0) {\n ordered.push(...sortTimedRun(timedRun).map((entry) => entry.segment));\n timedRun = [];\n }\n\n ordered.push(segment);\n }\n\n if (timedRun.length > 0) {\n ordered.push(...sortTimedRun(timedRun).map((entry) => entry.segment));\n }\n\n return ordered;\n};\n\nconst findNextInformativeMediaSegment = (\n segments: RAGMediaTranscriptSegmentWithText[],\n resolveValue: (\n segment: RAGMediaTranscriptSegmentWithText,\n ) => string | undefined,\n) => {\n let unknownSegments = 0;\n\n for (const segment of segments) {\n if (!segment || typeof segment !== \"object\") {\n continue;\n }\n\n if (normalizeWhitespace(segment.text ?? \"\").length === 0) {\n continue;\n }\n\n const value = resolveValue(segment);\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n\n unknownSegments += 1;\n if (unknownSegments > MAX_MEDIA_BRIDGED_UNKNOWN_SEGMENTS) {\n return undefined;\n }\n }\n\n return undefined;\n};\n\nconst groupTranscriptSegments = (\n segments: RAGMediaTranscriptSegmentWithText[],\n) => {\n const groups: RAGMediaSegmentGroup[] = [];\n\n for (const [index, segment] of segments.entries()) {\n if (!segment || typeof segment !== \"object\") {\n continue;\n }\n\n const text = normalizeWhitespace(segment.text ?? \"\");\n if (!text) {\n continue;\n }\n\n let speaker = normalizeMediaSpeaker(segment.speaker);\n let speakerKey = canonicalMediaSpeakerKey(segment.speaker);\n let channel = normalizeMediaChannel(segment.channel);\n const lastGroup = groups.at(-1);\n const remainingSegments = segments.slice(index + 1);\n const nextSpeakerKey = findNextInformativeMediaSegment(\n remainingSegments,\n (candidate) => canonicalMediaSpeakerKey(candidate.speaker),\n );\n const nextChannel = findNextInformativeMediaSegment(\n remainingSegments,\n (candidate) => normalizeMediaChannel(candidate.channel),\n );\n if (\n !speakerKey &&\n !channel &&\n lastGroup?.speakerKey &&\n lastGroup.channel &&\n nextSpeakerKey === lastGroup.speakerKey &&\n nextChannel === lastGroup.channel\n ) {\n speakerKey = lastGroup.speakerKey;\n speaker = lastGroup.speaker;\n channel = lastGroup.channel;\n }\n if (\n !speakerKey &&\n lastGroup?.speakerKey &&\n lastGroup.channel === channel &&\n nextSpeakerKey === lastGroup.speakerKey &&\n nextChannel === channel\n ) {\n speakerKey = lastGroup.speakerKey;\n speaker = lastGroup.speaker;\n }\n if (\n !channel &&\n lastGroup?.channel &&\n lastGroup.speakerKey === speakerKey &&\n nextChannel === lastGroup.channel &&\n nextSpeakerKey === speakerKey\n ) {\n channel = lastGroup.channel;\n }\n const shouldSplitForTimingModeChange =\n hasMediaSegmentTiming(segment) !== hasMediaSegmentTiming(lastGroup);\n const shouldSplitForGap =\n typeof segment.startMs === \"number\" &&\n typeof lastGroup?.endMs === \"number\" &&\n Number.isFinite(segment.startMs) &&\n Number.isFinite(lastGroup.endMs) &&\n segment.startMs - lastGroup.endMs > MAX_MEDIA_GROUP_CONTINUITY_GAP_MS;\n if (\n !lastGroup ||\n lastGroup.speakerKey !== speakerKey ||\n lastGroup.channel !== channel ||\n shouldSplitForTimingModeChange ||\n shouldSplitForGap\n ) {\n groups.push({\n channel,\n endMs: segment.endMs,\n segments: [segment],\n speaker,\n speakerKey,\n startMs: segment.startMs,\n });\n continue;\n }\n\n lastGroup.endMs =\n typeof segment.endMs === \"number\" && Number.isFinite(segment.endMs)\n ? segment.endMs\n : lastGroup.endMs;\n lastGroup.segments.push(segment);\n if (\n typeof segment.startMs === \"number\" &&\n Number.isFinite(segment.startMs)\n ) {\n if (\n typeof lastGroup.startMs !== \"number\" ||\n !Number.isFinite(lastGroup.startMs) ||\n segment.startMs < lastGroup.startMs\n ) {\n lastGroup.startMs = segment.startMs;\n }\n }\n }\n\n return groups;\n};\n\nconst decodeHtmlEntities = (value: string) => {\n let output = value;\n for (const [pattern, replacement] of HTML_ENTITY_REPLACEMENTS) {\n output = output.replace(pattern, replacement);\n }\n\n output = output.replace(/&#(\\d+);/g, (_, code) =>\n String.fromCodePoint(Number(code)),\n );\n\n return output.replace(/&#x([0-9a-f]+);/gi, (_, code) =>\n String.fromCodePoint(parseInt(code, 16)),\n );\n};\n\nconst formatHtmlLinkContext = (href: string) => {\n const decoded = decodeHtmlEntities(href.trim());\n if (!decoded) {\n return undefined;\n }\n\n if (decoded.startsWith(\"#\")) {\n return decoded;\n }\n\n if (/^[a-z]+:/i.test(decoded)) {\n try {\n const url = new URL(decoded);\n const path = url.pathname === \"/\" ? \"\" : url.pathname;\n return `${url.hostname}${path}`;\n } catch {\n return decoded;\n }\n }\n\n return decoded;\n};\n\nconst stripHtmlTags = (value: string) => {\n const withoutTags = value\n .replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, \" \")\n .replace(/<style\\b[^>]*>[\\s\\S]*?<\\/style>/gi, \" \")\n .replace(\n /<a\\b[^>]*href=(['\"])(.*?)\\1[^>]*>([\\s\\S]*?)<\\/a>/gi,\n (_match, _quote: string, href: string, inner: string) => {\n const label = normalizeWhitespace(stripHtmlTags(inner));\n const context = formatHtmlLinkContext(href);\n if (!label) {\n return context ?? \" \";\n }\n if (!context || context === label) {\n return label;\n }\n\n return `${label} (${context})`;\n },\n )\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<\\/(p|div|section|article|li|ul|ol|h[1-6]|table|tr)>/gi, \"\\n\")\n .replace(/<li\\b[^>]*>/gi, \"- \")\n .replace(/<[^>]+>/g, \" \");\n\n return decodeHtmlEntities(withoutTags);\n};\n\nconst stripHtmlNoiseBlocks = (value: string) =>\n value\n .replace(/<!--[\\s\\S]*?-->/g, \" \")\n .replace(/<(script|style|template|noscript)\\b[^>]*>[\\s\\S]*?<\\/\\1>/gi, \" \")\n .replace(\n /<([a-z0-9:_-]+)\\b[^>]*\\b(hidden|aria-hidden=(['\"])true\\3)[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n )\n .replace(\n /<(nav|footer|header|aside|form|dialog)\\b[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n )\n .replace(\n /<([a-z0-9:_-]+)\\b[^>]*\\b(?:id|class)=(['\"])[^'\"]*(nav|menu|footer|header|sidebar|promo|banner|cookie|breadcrumb|share|social|subscribe|newsletter|modal)[^'\"]*\\2[^>]*>[\\s\\S]*?<\\/\\1>/gi,\n \" \",\n );\n\nconst collectHtmlContentCandidates = (value: string) => {\n const patterns: Array<{\n contentGroup: number;\n pattern: RegExp;\n }> = [\n {\n contentGroup: 1,\n pattern: /<main\\b[^>]*>([\\s\\S]*?)<\\/main>/gi,\n },\n {\n contentGroup: 1,\n pattern: /<article\\b[^>]*>([\\s\\S]*?)<\\/article>/gi,\n },\n {\n contentGroup: 3,\n pattern:\n /<([a-z0-9:_-]+)\\b[^>]*\\brole=(['\"])main\\2[^>]*>([\\s\\S]*?)<\\/\\1>/gi,\n },\n {\n contentGroup: 4,\n pattern:\n /<([a-z0-9:_-]+)\\b[^>]*\\b(?:id|class)=(['\"])[^'\"]*(content|article|main|post|body)[^'\"]*\\2[^>]*>([\\s\\S]*?)<\\/\\1>/gi,\n },\n ];\n const candidates: string[] = [];\n\n for (const entry of patterns) {\n for (const match of value.matchAll(entry.pattern)) {\n const rawCandidate = match[entry.contentGroup];\n const candidate = typeof rawCandidate === \"string\" ? rawCandidate : \"\";\n if (candidate.trim()) {\n candidates.push(candidate.trim());\n }\n }\n }\n\n return candidates;\n};\n\nconst extractMainHtmlContent = (value: string) => {\n const trimmed = value.trim();\n if (!/<html\\b|<body\\b|<main\\b|<article\\b/i.test(trimmed)) {\n return value;\n }\n\n const stripped = stripHtmlNoiseBlocks(trimmed);\n const candidates = collectHtmlContentCandidates(stripped);\n\n if (candidates.length > 0) {\n const bestCandidate = candidates\n .map((candidate) => ({\n candidate,\n score: stripHtmlTags(candidate).replace(/\\s+/g, \" \").trim().length,\n }))\n .sort((left, right) => right.score - left.score)[0]?.candidate;\n if (bestCandidate) {\n return bestCandidate;\n }\n }\n\n const bodyMatch = stripped.match(/<body\\b[^>]*>([\\s\\S]*?)<\\/body>/i);\n if (bodyMatch?.[1]) {\n return bodyMatch[1];\n }\n\n return stripped;\n};\n\nconst stripHtml = (value: string) => {\n const focused = extractMainHtmlContent(value);\n\n return normalizeWhitespace(stripHtmlTags(focused));\n};\n\nconst stripMarkdown = (value: string) => {\n const withoutCodeBlocks = value.replace(/```[\\s\\S]*?```/g, (block) => {\n const lines = block.split(\"\\n\").slice(1, EXCLUDE_LAST_OFFSET);\n\n return lines.join(\"\\n\");\n });\n\n const stripped = withoutCodeBlocks\n .replace(/`([^`]+)`/g, \"$1\")\n .replace(/!\\[([^\\]]*)\\]\\([^)]+\\)/g, \"$1\")\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\")\n .replace(/^>\\s?/gm, \"\")\n .replace(/^#{1,6}\\s+/gm, \"\")\n .replace(/^[-*+]\\s+/gm, \"\")\n .replace(/^\\d+\\.\\s+/gm, \"\")\n .replace(/\\*\\*([^*]+)\\*\\*/g, \"$1\")\n .replace(/__([^_]+)__/g, \"$1\")\n .replace(/\\*([^*]+)\\*/g, \"$1\")\n .replace(/_([^_]+)_/g, \"$1\")\n .replace(/^---+$/gm, \"\\n\")\n .replace(/^===+$/gm, \"\\n\");\n\n return normalizeWhitespace(stripped);\n};\n\nconst stripMarkdownFence = (value: string) => {\n const lines = value.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n if (lines.length >= 2 && /^```/.test(lines[0] ?? \"\")) {\n lines.shift();\n }\n if (lines.length >= 1 && /^```/.test(lines[lines.length - 1] ?? \"\")) {\n lines.pop();\n }\n\n return lines.join(\"\\n\").trim();\n};\n\nconst splitMarkdownPreferredChunkUnits = (value: string) => {\n const lines = value.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const units: string[] = [];\n let proseBuffer: string[] = [];\n let fenceBuffer: string[] | undefined;\n\n const flushProse = () => {\n if (proseBuffer.length === 0) {\n return;\n }\n\n const text = stripMarkdown(proseBuffer.join(\"\\n\"));\n if (text) {\n units.push(text);\n }\n proseBuffer = [];\n };\n\n const flushFence = () => {\n if (!fenceBuffer || fenceBuffer.length === 0) {\n fenceBuffer = undefined;\n return;\n }\n\n const text = stripMarkdownFence(fenceBuffer.join(\"\\n\"));\n if (text) {\n units.push(text);\n }\n fenceBuffer = undefined;\n };\n\n for (const line of lines) {\n if (/^```/.test(line.trim())) {\n if (fenceBuffer) {\n fenceBuffer.push(line);\n flushFence();\n continue;\n }\n\n flushProse();\n fenceBuffer = [line];\n continue;\n }\n\n if (fenceBuffer) {\n fenceBuffer.push(line);\n continue;\n }\n\n if (line.trim().length === 0) {\n flushProse();\n continue;\n }\n\n proseBuffer.push(line);\n }\n\n flushProse();\n flushFence();\n\n return units;\n};\n\ntype StructuredChunkUnit = {\n text: string;\n sourceAwareChunkReason?:\n | \"section_boundary\"\n | \"size_limit\"\n | \"source_native_unit\";\n sectionTitle?: string;\n sectionPath?: string[];\n sectionDepth?: number;\n sectionFamilyPath?: string[];\n sectionOrdinalPath?: number[];\n sectionSiblingFamilyKey?: string;\n sectionSiblingOrdinal?: number;\n spreadsheetHeaders?: string[];\n spreadsheetColumnStart?: string;\n spreadsheetColumnEnd?: string;\n spreadsheetTableCount?: number;\n spreadsheetTableIndex?: number;\n spreadsheetRowEnd?: number;\n spreadsheetRowStart?: number;\n officeBlockNumber?: number;\n officeBlockKind?: \"title\" | \"heading\" | \"paragraph\" | \"list\" | \"table\";\n officeFamilyPath?: string[];\n officeOrdinalPath?: number[];\n officeSiblingFamilyKey?: string;\n officeSiblingOrdinal?: number;\n officeListContextText?: string;\n officeListGroupItemCount?: number;\n officeListLevel?: number;\n officeListLevels?: number[];\n officeTableBodyRowEnd?: number;\n officeTableBodyRowCount?: number;\n officeTableBodyRowStart?: number;\n officeTableChunkKind?: \"full_table\" | \"table_slice\";\n officeTableColumnCount?: number;\n officeTableContextText?: string;\n officeTableFollowUpText?: string;\n officeTableHeaderText?: string;\n officeTableHeaders?: string[];\n officeTableRowCount?: number;\n officeTableSignature?: string;\n pageNumber?: number;\n pdfBlockNumber?: number;\n pdfFigureCaptionBlockNumber?: number;\n pdfFigureLabel?: string;\n pdfSemanticRole?: \"figure_caption\" | \"figure_body\";\n pdfTableBodyRowEnd?: number;\n pdfTableBodyRowCount?: number;\n pdfTableBodyRowStart?: number;\n pdfTableChunkKind?: \"full_table\" | \"table_slice\";\n pdfTableColumnCount?: number;\n pdfTableHeaderText?: string;\n pdfTableHeaders?: string[];\n pdfTableRowCount?: number;\n pdfTableSignature?: string;\n pdfTextKind?: \"paragraph\" | \"table_like\";\n emailSectionKind?: EmailBodySection[\"kind\"];\n emailForwardedBccAddresses?: string[];\n emailForwardedCcAddresses?: string[];\n emailForwardedDate?: string;\n emailForwardedFromAddress?: string;\n emailForwardedFromDisplayName?: string;\n emailForwardedChainCount?: number;\n emailForwardedOrdinal?: number;\n emailQuotedDepth?: number;\n emailForwardedHeaderFields?: Record<string, string>;\n emailForwardedParticipantAddresses?: string[];\n emailForwardedReplyToAddresses?: string[];\n emailForwardedSubject?: string;\n emailForwardedTimestamp?: string;\n emailForwardedToAddresses?: string[];\n sectionKind?:\n | \"markdown_heading\"\n | \"html_heading\"\n | \"jsonl_record\"\n | \"tsv_row\"\n | \"csv_row\"\n | \"xml_node\"\n | \"yaml_section\"\n | \"office_heading\"\n | \"office_block\"\n | \"code_block\"\n | \"spreadsheet_rows\"\n | \"presentation_slide\"\n | \"pdf_block\"\n | \"email_block\";\n preferredChunkUnits?: string[];\n};\n\ntype EmailBodySection = {\n kind: \"authored_text\" | \"forwarded_headers\" | \"quoted_history\" | \"signature\";\n text: string;\n forwardedHeaderFields?: Record<string, string>;\n forwardedFromAddress?: string;\n forwardedFromDisplayName?: string;\n forwardedToAddresses?: string[];\n forwardedCcAddresses?: string[];\n forwardedBccAddresses?: string[];\n forwardedReplyToAddresses?: string[];\n forwardedParticipantAddresses?: string[];\n forwardedSubject?: string;\n forwardedDate?: string;\n forwardedTimestamp?: string;\n quotedDepth?: number;\n};\n\ntype EmailMessageLineageEntry = {\n attachmentSource?: string;\n messageId?: string;\n messageSource?: string;\n messageSourceKind?: string;\n threadKey?: string;\n};\n\ntype OfficeDocumentBlock = {\n blockNumber: number;\n blockKind: \"title\" | \"heading\" | \"paragraph\" | \"list\" | \"table\";\n text: string;\n style?: string;\n headingLevel?: number;\n listLevel?: number;\n tableBodyRowCount?: number;\n tableColumnCount?: number;\n tableHeaderText?: string;\n tableHeaders?: string[];\n tableRowCount?: number;\n tableSignature?: string;\n};\n\nconst findNearestPDFContextHeading = (\n blockEntries: PDFNativeStructureBlockEntry[],\n pageNumber: number | undefined,\n) => {\n if (typeof pageNumber !== \"number\") {\n return undefined;\n }\n\n for (let index = blockEntries.length - 1; index >= 0; index -= 1) {\n const entry = blockEntries[index];\n if (!entry || entry.pageNumber !== pageNumber) {\n if (\n entry &&\n typeof entry.pageNumber === \"number\" &&\n entry.pageNumber < pageNumber\n ) {\n break;\n }\n continue;\n }\n if (entry.pdfSemanticRole || entry.pdfTextKind !== \"paragraph\") {\n continue;\n }\n const heading = inferPDFBlockHeading(entry.text);\n if (heading) {\n return heading;\n }\n }\n\n return undefined;\n};\n\nconst getPDFTableHeaders = (text: string) => {\n const lines = text\n .split(\"\\n\")\n .map((line) => normalizeWhitespace(line))\n .filter(Boolean);\n const headerLine = lines[0];\n if (!headerLine || !headerLine.includes(\" | \")) {\n return undefined;\n }\n\n const headers = headerLine\n .split(\" | \")\n .map((entry) => normalizeWhitespace(entry))\n .filter(Boolean);\n return headers.length >= 2 ? headers : undefined;\n};\n\nconst pdfNativeStructureUnits = (\n metadata?: Record<string, unknown>,\n): StructuredChunkUnit[] => {\n const blocks = Array.isArray(metadata?.pdfTextBlocks)\n ? metadata.pdfTextBlocks\n : [];\n const blockEntries: PDFNativeStructureBlockEntry[] = [];\n for (const block of blocks) {\n if (!block || typeof block !== \"object\") {\n continue;\n }\n\n const rawText = typeof block.text === \"string\" ? block.text : \"\";\n const pdfTextKind =\n block.textKind === \"table_like\" ? \"table_like\" : \"paragraph\";\n const text =\n pdfTextKind === \"table_like\"\n ? rawText\n .split(\"\\n\")\n .map((line: string) => normalizeWhitespace(line))\n .filter(Boolean)\n .join(\"\\n\")\n : normalizeWhitespace(rawText);\n if (!text) {\n continue;\n }\n\n const pageNumber =\n typeof block.pageNumber === \"number\" && Number.isFinite(block.pageNumber)\n ? block.pageNumber\n : undefined;\n const pdfBlockNumber =\n typeof block.blockNumber === \"number\" &&\n Number.isFinite(block.blockNumber)\n ? block.blockNumber\n : undefined;\n const previousBlock = blockEntries.at(-1);\n const previousFigureCaption =\n previousBlock &&\n previousBlock.pageNumber === pageNumber &&\n previousBlock.pdfSemanticRole === \"figure_caption\"\n ? previousBlock\n : undefined;\n const pdfSemanticRole =\n block.semanticRole === \"figure_caption\"\n ? \"figure_caption\"\n : block.semanticRole === \"figure_body\"\n ? \"figure_body\"\n : pdfTextKind === \"paragraph\" &&\n previousFigureCaption &&\n !inferPDFBlockHeading(text)\n ? \"figure_body\"\n : undefined;\n const currentBlockHeading =\n pdfTextKind === \"paragraph\" && !pdfSemanticRole\n ? inferPDFBlockHeading(text)\n : undefined;\n const contextualHeading =\n pdfTextKind === \"table_like\"\n ? findNearestPDFContextHeading(blockEntries, pageNumber)\n : undefined;\n const contextualTableTitle =\n contextualHeading && pdfTextKind === \"table_like\"\n ? /\\btable\\b/i.test(contextualHeading)\n ? contextualHeading\n : `${contextualHeading} Table`\n : undefined;\n const pdfTableHeaders =\n pdfTextKind === \"table_like\" ? getPDFTableHeaders(text) : undefined;\n const pdfTableHeaderText =\n pdfTextKind === \"table_like\"\n ? text\n .split(\"\\n\")\n .map((line: string) => normalizeWhitespace(line))\n .filter(Boolean)[0]\n : undefined;\n const pdfTableRowCount =\n pdfTextKind === \"table_like\"\n ? text\n .split(\"\\n\")\n .map((line: string) => normalizeWhitespace(line))\n .filter(Boolean).length\n : undefined;\n const pdfTableBodyRowCount =\n typeof pdfTableRowCount === \"number\"\n ? Math.max(0, pdfTableRowCount - 1)\n : undefined;\n const pdfTableBodyRowStart =\n typeof pdfTableBodyRowCount === \"number\" && pdfTableBodyRowCount > 0\n ? 1\n : undefined;\n const pdfTableBodyRowEnd =\n typeof pdfTableBodyRowCount === \"number\" && pdfTableBodyRowCount > 0\n ? pdfTableBodyRowCount\n : undefined;\n const pdfTableColumnCount = Array.isArray(pdfTableHeaders)\n ? pdfTableHeaders.length\n : undefined;\n const pdfTableSignature =\n Array.isArray(pdfTableHeaders) && pdfTableHeaders.length > 0\n ? pdfTableHeaders.join(\" | \")\n : undefined;\n const pdfFigureLabel =\n pdfSemanticRole === \"figure_caption\"\n ? extractPDFFigureLabel(text)\n : previousFigureCaption?.pdfFigureLabel;\n const pdfFigureCaptionBlockNumber =\n pdfSemanticRole === \"figure_caption\"\n ? pdfBlockNumber\n : previousFigureCaption?.pdfFigureCaptionBlockNumber;\n const baseSectionTitle =\n pdfSemanticRole === \"figure_caption\"\n ? pageNumber\n ? `Page ${pageNumber} Figure Caption`\n : \"Figure Caption\"\n : pdfSemanticRole === \"figure_body\"\n ? pdfFigureLabel\n ? `${pdfFigureLabel} Body`\n : pageNumber\n ? `Page ${pageNumber} Figure Body`\n : \"Figure Body\"\n : currentBlockHeading\n ? currentBlockHeading\n : contextualTableTitle\n ? contextualTableTitle\n : pageNumber\n ? pdfTextKind === \"table_like\"\n ? `Page ${pageNumber} Table Block`\n : `Page ${pageNumber} Text Block`\n : pdfTextKind === \"table_like\"\n ? \"Table Block\"\n : \"Text Block\";\n\n blockEntries.push({\n baseSectionTitle,\n pageNumber,\n pdfBlockNumber,\n ...(typeof pdfFigureCaptionBlockNumber === \"number\"\n ? { pdfFigureCaptionBlockNumber }\n : {}),\n ...(pdfFigureLabel ? { pdfFigureLabel } : {}),\n ...(pdfSemanticRole ? { pdfSemanticRole } : {}),\n ...(typeof pdfTableBodyRowEnd === \"number\" ? { pdfTableBodyRowEnd } : {}),\n ...(typeof pdfTableBodyRowCount === \"number\"\n ? { pdfTableBodyRowCount }\n : {}),\n ...(typeof pdfTableBodyRowStart === \"number\"\n ? { pdfTableBodyRowStart }\n : {}),\n ...(pdfTextKind === \"table_like\"\n ? { pdfTableChunkKind: \"full_table\" }\n : {}),\n ...(typeof pdfTableColumnCount === \"number\"\n ? { pdfTableColumnCount }\n : {}),\n ...(typeof pdfTableHeaderText === \"string\" ? { pdfTableHeaderText } : {}),\n ...(Array.isArray(pdfTableHeaders) && pdfTableHeaders.length > 0\n ? { pdfTableHeaders }\n : {}),\n ...(typeof pdfTableRowCount === \"number\" ? { pdfTableRowCount } : {}),\n ...(pdfTableSignature ? { pdfTableSignature } : {}),\n pdfTextKind,\n text,\n });\n }\n const titleCounts = new Map<string, number>();\n for (const block of blockEntries) {\n titleCounts.set(\n block.baseSectionTitle,\n (titleCounts.get(block.baseSectionTitle) ?? 0) + 1,\n );\n }\n const units: StructuredChunkUnit[] = [];\n\n for (const block of blockEntries) {\n const sectionTitle =\n (titleCounts.get(block.baseSectionTitle) ?? 0) > 1 &&\n typeof block.pdfBlockNumber === \"number\"\n ? `${block.baseSectionTitle} ${block.pdfBlockNumber}`\n : block.baseSectionTitle;\n\n units.push({\n pageNumber: block.pageNumber,\n pdfBlockNumber: block.pdfBlockNumber,\n ...(typeof block.pdfFigureCaptionBlockNumber === \"number\"\n ? {\n pdfFigureCaptionBlockNumber: block.pdfFigureCaptionBlockNumber,\n }\n : {}),\n ...(block.pdfFigureLabel ? { pdfFigureLabel: block.pdfFigureLabel } : {}),\n ...(block.pdfSemanticRole\n ? { pdfSemanticRole: block.pdfSemanticRole }\n : {}),\n ...(typeof block.pdfTableBodyRowEnd === \"number\"\n ? { pdfTableBodyRowEnd: block.pdfTableBodyRowEnd }\n : {}),\n ...(typeof block.pdfTableBodyRowCount === \"number\"\n ? { pdfTableBodyRowCount: block.pdfTableBodyRowCount }\n : {}),\n ...(typeof block.pdfTableBodyRowStart === \"number\"\n ? { pdfTableBodyRowStart: block.pdfTableBodyRowStart }\n : {}),\n ...(block.pdfTableChunkKind\n ? { pdfTableChunkKind: block.pdfTableChunkKind }\n : {}),\n ...(typeof block.pdfTableColumnCount === \"number\"\n ? { pdfTableColumnCount: block.pdfTableColumnCount }\n : {}),\n ...(typeof block.pdfTableHeaderText === \"string\"\n ? { pdfTableHeaderText: block.pdfTableHeaderText }\n : {}),\n ...(Array.isArray(block.pdfTableHeaders) &&\n block.pdfTableHeaders.length > 0\n ? { pdfTableHeaders: block.pdfTableHeaders }\n : {}),\n ...(typeof block.pdfTableRowCount === \"number\"\n ? { pdfTableRowCount: block.pdfTableRowCount }\n : {}),\n ...(block.pdfTableSignature\n ? { pdfTableSignature: block.pdfTableSignature }\n : {}),\n pdfTextKind: block.pdfTextKind,\n preferredChunkUnits:\n block.pdfTextKind === \"table_like\"\n ? block.text.split(\"\\n\").filter(Boolean)\n : undefined,\n sectionDepth: 1,\n sectionKind: \"pdf_block\",\n sectionPath: [sectionTitle],\n sectionTitle,\n text: block.text,\n });\n }\n\n return units;\n};\n\nconst officeNativeStructureUnits = (\n metadata?: Record<string, unknown>,\n): StructuredChunkUnit[] => {\n const blocks = Array.isArray(metadata?.officeBlocks)\n ? metadata.officeBlocks\n : [];\n const units: StructuredChunkUnit[] = [];\n const headingStack: string[] = [];\n const headingFamilyStack: string[] = [];\n const headingOrdinalStack: number[] = [];\n const headingSiblingCounts = new Map<string, number>();\n let pendingListContextText: string | undefined;\n let pendingTableContextText: string | undefined;\n let consumedOfficeUntil = -1;\n const decorateOfficeSectionText = (\n text: string,\n sectionTitle: string | undefined,\n ) => {\n if (!sectionTitle || text.includes(sectionTitle)) {\n return text;\n }\n\n return normalizeWhitespace(`${sectionTitle}\\n${text}`);\n };\n const getOfficeShortParagraphText = (value: unknown) => {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const record = value as Record<string, unknown>;\n if (record.blockKind !== \"paragraph\") {\n return undefined;\n }\n\n const paragraphText =\n typeof record.text === \"string\" ? normalizeWhitespace(record.text) : \"\";\n return paragraphText.length > 0 && paragraphText.length <= 200\n ? paragraphText\n : undefined;\n };\n const isOfficeTableHeadingBlock = (value: unknown) => {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const record = value as Record<string, unknown>;\n return (\n record.blockKind === \"heading\" &&\n typeof record.text === \"string\" &&\n /\\btable\\b/i.test(record.text)\n );\n };\n const collectOfficeLeadingParagraphTexts = (\n startIndex: number,\n maxParagraphs = 3,\n ) => {\n const texts: string[] = [];\n let cursor = startIndex;\n\n while (texts.length < maxParagraphs) {\n const paragraphText = getOfficeShortParagraphText(blocks[cursor]);\n if (!paragraphText) {\n break;\n }\n texts.push(paragraphText);\n cursor += 1;\n }\n\n return { nextIndex: cursor, texts };\n };\n const hasFollowingOfficeTableFamily = (startIndex: number) => {\n let cursor = startIndex;\n const leadingParagraphs = collectOfficeLeadingParagraphTexts(cursor);\n cursor = leadingParagraphs.nextIndex;\n\n const sawHeading = isOfficeTableHeadingBlock(blocks[cursor]);\n if (sawHeading) {\n cursor += 1;\n }\n\n const trailingParagraphs = collectOfficeLeadingParagraphTexts(cursor);\n cursor = trailingParagraphs.nextIndex;\n\n return (\n (leadingParagraphs.texts.length > 0 ||\n sawHeading ||\n trailingParagraphs.texts.length > 0 ||\n blocks[startIndex]?.blockKind === \"table\") &&\n blocks[cursor]?.blockKind === \"table\"\n );\n };\n const collectOfficeTrailingTableParagraphTexts = (startIndex: number) => {\n const trailingParagraphs = collectOfficeLeadingParagraphTexts(\n startIndex,\n 5,\n );\n const nextBlock = blocks[trailingParagraphs.nextIndex];\n const nextKind =\n nextBlock && typeof nextBlock === \"object\"\n ? nextBlock.blockKind\n : undefined;\n\n if (\n trailingParagraphs.texts.length === 0 ||\n (nextKind !== \"heading\" && nextKind !== \"title\" && nextBlock) ||\n (nextBlock && isOfficeTableHeadingBlock(nextBlock))\n ) {\n return { nextIndex: startIndex, texts: [] as string[] };\n }\n\n return trailingParagraphs;\n };\n\n for (const [index, block] of blocks.entries()) {\n if (index <= consumedOfficeUntil) {\n continue;\n }\n\n if (!block || typeof block !== \"object\") {\n continue;\n }\n\n const text =\n typeof block.text === \"string\" ? normalizeWhitespace(block.text) : \"\";\n if (!text) {\n continue;\n }\n\n const officeBlockNumber =\n typeof block.blockNumber === \"number\" &&\n Number.isFinite(block.blockNumber)\n ? block.blockNumber\n : undefined;\n const officeBlockKind =\n block.blockKind === \"title\" ||\n block.blockKind === \"heading\" ||\n block.blockKind === \"list\" ||\n block.blockKind === \"table\"\n ? block.blockKind\n : \"paragraph\";\n const headingLevel =\n typeof block.headingLevel === \"number\" &&\n Number.isFinite(block.headingLevel)\n ? block.headingLevel\n : undefined;\n const officeListLevel =\n typeof block.listLevel === \"number\" && Number.isFinite(block.listLevel)\n ? block.listLevel\n : undefined;\n const officeTableBodyRowCount =\n typeof block.tableBodyRowCount === \"number\" &&\n Number.isFinite(block.tableBodyRowCount)\n ? block.tableBodyRowCount\n : undefined;\n const officeTableColumnCount =\n typeof block.tableColumnCount === \"number\" &&\n Number.isFinite(block.tableColumnCount)\n ? block.tableColumnCount\n : undefined;\n const officeTableHeaderText =\n typeof block.tableHeaderText === \"string\" &&\n block.tableHeaderText.length > 0\n ? block.tableHeaderText\n : undefined;\n const officeTableHeaders =\n Array.isArray(block.tableHeaders) && block.tableHeaders.length > 0\n ? block.tableHeaders.filter(\n (value: unknown): value is string =>\n typeof value === \"string\" && value.length > 0,\n )\n : undefined;\n const officeTableRowCount =\n typeof block.tableRowCount === \"number\" &&\n Number.isFinite(block.tableRowCount)\n ? block.tableRowCount\n : undefined;\n const officeTableSignature =\n typeof block.tableSignature === \"string\" &&\n block.tableSignature.length > 0\n ? block.tableSignature\n : undefined;\n\n if (officeBlockKind === \"title\" || officeBlockKind === \"heading\") {\n const level = officeBlockKind === \"title\" ? 1 : (headingLevel ?? 1);\n const parentScope = headingFamilyStack\n .slice(0, Math.max(0, level - 1))\n .join(\" > \");\n const parentOrdinalScope = headingOrdinalStack\n .slice(0, Math.max(0, level - 1))\n .join(\" > \");\n const headingKey = `${level}:${parentScope}:${parentOrdinalScope}:${text}`;\n const headingCount = (headingSiblingCounts.get(headingKey) ?? 0) + 1;\n headingSiblingCounts.set(headingKey, headingCount);\n const resolvedHeadingText =\n headingCount > 1 ? `${text} (${headingCount})` : text;\n headingStack[level - 1] = resolvedHeadingText;\n headingFamilyStack[level - 1] = text;\n headingOrdinalStack[level - 1] = headingCount;\n headingStack.length = level;\n headingFamilyStack.length = level;\n headingOrdinalStack.length = level;\n const nextBlock = blocks[index + 1];\n const nextKind =\n nextBlock && typeof nextBlock === \"object\"\n ? nextBlock.blockKind\n : undefined;\n if (\n nextKind === \"title\" ||\n nextKind === \"heading\" ||\n nextKind === \"list\" ||\n nextKind === \"table\" ||\n !nextBlock\n ) {\n units.push({\n officeBlockKind,\n officeListLevel,\n officeBlockNumber,\n ...(typeof officeTableBodyRowCount === \"number\"\n ? { officeTableBodyRowCount }\n : {}),\n ...(typeof officeTableColumnCount === \"number\"\n ? { officeTableColumnCount }\n : {}),\n ...(typeof officeTableHeaderText === \"string\"\n ? { officeTableHeaderText }\n : {}),\n ...(Array.isArray(officeTableHeaders) && officeTableHeaders.length > 0\n ? { officeTableHeaders }\n : {}),\n ...(typeof officeTableRowCount === \"number\"\n ? { officeTableRowCount }\n : {}),\n ...(typeof officeTableSignature === \"string\"\n ? { officeTableSignature }\n : {}),\n ...(headingFamilyStack.length > 0\n ? { officeFamilyPath: [...headingFamilyStack] }\n : {}),\n ...(headingOrdinalStack.length > 0\n ? { officeOrdinalPath: [...headingOrdinalStack] }\n : {}),\n ...(headingFamilyStack.length > 0\n ? { sectionFamilyPath: [...headingFamilyStack] }\n : {}),\n ...(headingOrdinalStack.length > 0\n ? { sectionOrdinalPath: [...headingOrdinalStack] }\n : {}),\n officeSiblingFamilyKey: text,\n officeSiblingOrdinal: headingCount,\n sectionSiblingFamilyKey: text,\n sectionSiblingOrdinal: headingCount,\n sectionDepth: headingStack.length,\n sectionKind: \"office_heading\",\n sectionPath: [...headingStack],\n sectionTitle: resolvedHeadingText,\n text,\n });\n }\n continue;\n }\n\n const sectionPath = headingStack.length > 0 ? [...headingStack] : undefined;\n const officeFamilyPath =\n headingFamilyStack.length > 0 ? [...headingFamilyStack] : undefined;\n const officeOrdinalPath =\n headingOrdinalStack.length > 0 ? [...headingOrdinalStack] : undefined;\n const sectionTitle = sectionPath?.at(-1);\n\n if (officeBlockKind === \"list\") {\n const runTexts: string[] = [];\n const runLevels: number[] = [];\n let runEnd = index;\n\n for (; runEnd < blocks.length; runEnd += 1) {\n const runBlock = blocks[runEnd];\n if (!runBlock || typeof runBlock !== \"object\") {\n break;\n }\n if (runBlock.blockKind !== \"list\") {\n break;\n }\n const runText =\n typeof runBlock.text === \"string\"\n ? normalizeWhitespace(runBlock.text)\n : \"\";\n if (!runText) {\n break;\n }\n runTexts.push(runText);\n if (\n typeof runBlock.listLevel === \"number\" &&\n Number.isFinite(runBlock.listLevel)\n ) {\n runLevels.push(runBlock.listLevel);\n }\n }\n runEnd -= 1;\n\n const trailingBridgeParagraphs = collectOfficeLeadingParagraphTexts(\n runEnd + 1,\n );\n const trailingTableBridgeText =\n trailingBridgeParagraphs.texts.length > 0 &&\n hasFollowingOfficeTableFamily(runEnd + 1)\n ? normalizeWhitespace(trailingBridgeParagraphs.texts.join(\"\\n\\n\"))\n : undefined;\n const officeListContextText = normalizeWhitespace(\n [\n ...(typeof pendingListContextText === \"string\"\n ? [pendingListContextText]\n : []),\n ...(typeof trailingTableBridgeText === \"string\"\n ? [trailingTableBridgeText]\n : []),\n ].join(\"\\n\\n\"),\n );\n const distinctLevels = [...new Set(runLevels)];\n const officeListLevel =\n distinctLevels.length === 1 ? distinctLevels[0] : undefined;\n const groupedListText = normalizeWhitespace(\n [\n ...(officeListContextText ? [officeListContextText] : []),\n ...runTexts,\n ].join(\"\\n\\n\"),\n );\n\n if (typeof trailingTableBridgeText === \"string\") {\n pendingTableContextText = normalizeWhitespace(\n [\n ...(typeof pendingTableContextText === \"string\"\n ? [pendingTableContextText]\n : []),\n trailingTableBridgeText,\n ].join(\"\\n\\n\"),\n );\n consumedOfficeUntil = trailingBridgeParagraphs.nextIndex - 1;\n } else {\n consumedOfficeUntil = runEnd;\n }\n pendingListContextText = undefined;\n\n units.push({\n officeBlockKind,\n ...(officeListContextText ? { officeListContextText } : {}),\n officeListGroupItemCount: runTexts.length,\n ...(typeof officeListLevel === \"number\" ? { officeListLevel } : {}),\n ...(distinctLevels.length > 0\n ? { officeListLevels: distinctLevels }\n : {}),\n officeBlockNumber,\n ...(officeFamilyPath && officeFamilyPath.length > 0\n ? { officeFamilyPath }\n : {}),\n ...(officeOrdinalPath && officeOrdinalPath.length > 0\n ? { officeOrdinalPath }\n : {}),\n ...(officeFamilyPath && officeFamilyPath.length > 0\n ? { sectionFamilyPath: officeFamilyPath }\n : {}),\n ...(officeOrdinalPath && officeOrdinalPath.length > 0\n ? { sectionOrdinalPath: officeOrdinalPath }\n : {}),\n ...(officeFamilyPath?.at(-1)\n ? { officeSiblingFamilyKey: officeFamilyPath.at(-1) }\n : {}),\n ...(typeof officeOrdinalPath?.at(-1) === \"number\"\n ? { officeSiblingOrdinal: officeOrdinalPath.at(-1) }\n : {}),\n ...(officeFamilyPath?.at(-1)\n ? { sectionSiblingFamilyKey: officeFamilyPath.at(-1) }\n : {}),\n ...(typeof officeOrdinalPath?.at(-1) === \"number\"\n ? { sectionSiblingOrdinal: officeOrdinalPath.at(-1) }\n : {}),\n preferredChunkUnits: [\n ...(officeListContextText ? [officeListContextText] : []),\n ...runTexts,\n ],\n sectionDepth: sectionPath?.length,\n sectionKind: \"office_block\",\n sectionPath,\n sectionTitle,\n text: groupedListText,\n });\n continue;\n }\n const nextBlock = blocks[index + 1];\n const nextKind =\n nextBlock && typeof nextBlock === \"object\"\n ? nextBlock.blockKind\n : undefined;\n const nextNextBlock = blocks[index + 2];\n const nextNextKind =\n nextNextBlock && typeof nextNextBlock === \"object\"\n ? nextNextBlock.blockKind\n : undefined;\n\n if (\n officeBlockKind === \"paragraph\" &&\n (nextKind === \"list\" ||\n (nextKind === \"paragraph\" && nextNextKind === \"list\")) &&\n text.length <= 200\n ) {\n pendingListContextText = normalizeWhitespace(\n [\n ...(typeof pendingListContextText === \"string\"\n ? [pendingListContextText]\n : []),\n text,\n ].join(\"\\n\\n\"),\n );\n continue;\n }\n\n if (\n officeBlockKind === \"paragraph\" &&\n hasFollowingOfficeTableFamily(index + 1) &&\n text.length <= 200\n ) {\n pendingTableContextText = normalizeWhitespace(\n [\n ...(typeof pendingTableContextText === \"string\"\n ? [pendingTableContextText]\n : []),\n text,\n ].join(\"\\n\\n\"),\n );\n continue;\n }\n\n const officeListContextText =\n officeBlockKind === \"list\" ? pendingListContextText : undefined;\n const officeTableContextText =\n officeBlockKind === \"table\" ? pendingTableContextText : undefined;\n const officeTableFollowUpParagraphs =\n officeBlockKind === \"table\"\n ? collectOfficeTrailingTableParagraphTexts(index + 1)\n : { nextIndex: index + 1, texts: [] as string[] };\n const officeTableFollowUpText =\n officeBlockKind === \"table\" &&\n officeTableFollowUpParagraphs.texts.length > 0\n ? normalizeWhitespace(officeTableFollowUpParagraphs.texts.join(\"\\n\\n\"))\n : undefined;\n if (officeBlockKind !== \"list\" || nextKind !== \"list\") {\n pendingListContextText = undefined;\n }\n pendingTableContextText = undefined;\n if (\n officeBlockKind === \"table\" &&\n typeof officeTableFollowUpText === \"string\"\n ) {\n consumedOfficeUntil = officeTableFollowUpParagraphs.nextIndex - 1;\n }\n\n units.push({\n officeBlockKind,\n officeListLevel,\n officeBlockNumber,\n ...(officeFamilyPath && officeFamilyPath.length > 0\n ? { officeFamilyPath }\n : {}),\n ...(officeOrdinalPath && officeOrdinalPath.length > 0\n ? { officeOrdinalPath }\n : {}),\n ...(officeFamilyPath && officeFamilyPath.length > 0\n ? { sectionFamilyPath: officeFamilyPath }\n : {}),\n ...(officeOrdinalPath && officeOrdinalPath.length > 0\n ? { sectionOrdinalPath: officeOrdinalPath }\n : {}),\n ...(officeFamilyPath?.at(-1)\n ? { officeSiblingFamilyKey: officeFamilyPath.at(-1) }\n : {}),\n ...(typeof officeOrdinalPath?.at(-1) === \"number\"\n ? { officeSiblingOrdinal: officeOrdinalPath.at(-1) }\n : {}),\n ...(officeFamilyPath?.at(-1)\n ? { sectionSiblingFamilyKey: officeFamilyPath.at(-1) }\n : {}),\n ...(typeof officeOrdinalPath?.at(-1) === \"number\"\n ? { sectionSiblingOrdinal: officeOrdinalPath.at(-1) }\n : {}),\n ...(typeof officeListContextText === \"string\"\n ? { officeListContextText }\n : {}),\n ...(typeof officeTableContextText === \"string\"\n ? { officeTableContextText }\n : {}),\n ...(typeof officeTableFollowUpText === \"string\"\n ? { officeTableFollowUpText }\n : {}),\n ...(typeof officeTableBodyRowCount === \"number\"\n ? { officeTableBodyRowCount }\n : {}),\n ...(typeof officeTableColumnCount === \"number\"\n ? { officeTableColumnCount }\n : {}),\n ...(typeof officeTableHeaderText === \"string\"\n ? { officeTableHeaderText }\n : {}),\n ...(Array.isArray(officeTableHeaders) && officeTableHeaders.length > 0\n ? { officeTableHeaders }\n : {}),\n ...(typeof officeTableRowCount === \"number\"\n ? { officeTableRowCount }\n : {}),\n ...(typeof officeTableSignature === \"string\"\n ? { officeTableSignature }\n : {}),\n preferredChunkUnits:\n officeBlockKind === \"table\"\n ? [\n ...(typeof officeTableContextText === \"string\"\n ? [officeTableContextText]\n : []),\n ...text.split(\"\\n\").filter(Boolean),\n ...(typeof officeTableFollowUpText === \"string\"\n ? [officeTableFollowUpText]\n : []),\n ]\n : officeBlockKind === \"list\"\n ? [\n ...(typeof officeListContextText === \"string\"\n ? [officeListContextText]\n : []),\n text,\n ]\n : undefined,\n sectionDepth: sectionPath?.length,\n sectionKind:\n officeBlockKind === \"paragraph\" ? \"office_heading\" : \"office_block\",\n sectionPath,\n sectionTitle,\n text:\n officeBlockKind === \"table\" &&\n typeof officeTableContextText === \"string\"\n ? normalizeWhitespace(\n [\n officeTableContextText,\n text,\n ...(typeof officeTableFollowUpText === \"string\"\n ? [officeTableFollowUpText]\n : []),\n ].join(\"\\n\\n\"),\n )\n : officeBlockKind === \"table\" &&\n typeof officeTableFollowUpText === \"string\"\n ? normalizeWhitespace(`${text}\\n\\n${officeTableFollowUpText}`)\n : officeBlockKind === \"list\" &&\n typeof officeListContextText === \"string\"\n ? normalizeWhitespace(`${officeListContextText}\\n\\n${text}`)\n : officeBlockKind === \"paragraph\"\n ? decorateOfficeSectionText(text, sectionTitle)\n : text,\n });\n }\n\n return units;\n};\n\nconst markdownStructureUnits = (value: string): StructuredChunkUnit[] => {\n const lines = value.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const sections: Array<{ lines: string[]; sectionPath: string[] }> = [];\n let current: string[] = [];\n let currentPath: string[] = [];\n const headingStack: string[] = [];\n const flushCurrentSection = () => {\n if (current.length === 0) {\n return;\n }\n\n sections.push({\n lines: current,\n sectionPath: [...currentPath],\n });\n current = [];\n };\n\n for (const line of lines) {\n const headingMatch = line.match(/^\\s*(#{1,6})\\s+(.+)$/);\n if (headingMatch) {\n if (current.length > 0) {\n flushCurrentSection();\n }\n const depth = headingMatch[1]?.length ?? 1;\n const headingText = normalizeWhitespace(headingMatch[2] ?? \"\");\n if (headingText) {\n headingStack[depth - 1] = headingText;\n headingStack.length = depth;\n currentPath = [...headingStack];\n }\n }\n\n current.push(line);\n }\n\n flushCurrentSection();\n\n return sections\n .map(({ lines: sectionLines, sectionPath }) => {\n const sectionText = normalizeWhitespace(\n stripMarkdown(sectionLines.join(\"\\n\")),\n );\n const preferredChunkUnits = splitMarkdownPreferredChunkUnits(\n sectionLines.join(\"\\n\"),\n );\n\n return {\n ...(preferredChunkUnits.length > 0 ? { preferredChunkUnits } : {}),\n sectionDepth: sectionPath.length > 0 ? sectionPath.length : undefined,\n sectionKind:\n sectionPath.length > 0 ? (\"markdown_heading\" as const) : undefined,\n sectionPath: sectionPath.length > 0 ? sectionPath : undefined,\n sectionTitle: sectionPath.at(-1),\n text: sectionText,\n };\n })\n .filter((section) => Boolean(section.text));\n};\n\nconst joinHtmlHeadingSection = (headings: string[], content: string) => {\n const normalizedHeadings = headings.map((heading) =>\n normalizeWhitespace(heading),\n );\n const combined = [...normalizedHeadings, content].filter(Boolean).join(\"\\n\");\n\n return normalizeWhitespace(combined);\n};\n\nconst htmlStructureUnits = (value: string): StructuredChunkUnit[] => {\n const focused = extractMainHtmlContent(value);\n const headingPattern = /<h([1-6])\\b[^>]*>([\\s\\S]*?)<\\/h\\1>/gi;\n const sections: StructuredChunkUnit[] = [];\n const headingStack: string[] = [];\n let cursor = 0;\n let currentContentStart = 0;\n let activeHeadings: string[] = [];\n\n const flushSection = (end: number) => {\n const content = normalizeWhitespace(\n stripHtmlTags(focused.slice(currentContentStart, end)),\n );\n if (!content) {\n return;\n }\n\n const section = joinHtmlHeadingSection(activeHeadings, content);\n if (section) {\n sections.push({\n sectionDepth:\n activeHeadings.length > 0 ? activeHeadings.length : undefined,\n sectionKind: activeHeadings.length > 0 ? \"html_heading\" : undefined,\n sectionPath:\n activeHeadings.length > 0 ? [...activeHeadings] : undefined,\n sectionTitle: activeHeadings.at(-1),\n text: section,\n });\n }\n };\n\n for (const match of focused.matchAll(headingPattern)) {\n const fullMatch = match[0];\n const start = match.index ?? cursor;\n flushSection(start);\n\n const level = Number.parseInt(match[1] ?? \"1\", 10);\n const headingText = normalizeWhitespace(stripHtmlTags(match[2] ?? \"\"));\n if (headingText) {\n headingStack[level - 1] = headingText;\n headingStack.length = level;\n activeHeadings = [...headingStack];\n }\n\n cursor = start + fullMatch.length;\n currentContentStart = cursor;\n }\n\n flushSection(focused.length);\n\n if (sections.length > 0) {\n return sections;\n }\n\n return [{ text: normalizeWhitespace(stripHtmlTags(focused)) }].filter(\n (section) => Boolean(section.text),\n );\n};\n\nconst isLikelyOfficeHeadingParagraph = (value: string) => {\n const normalized = normalizeWhitespace(value);\n if (!normalized || normalized.length > 80) {\n return false;\n }\n\n if (/[.!?]$/.test(normalized)) {\n return false;\n }\n\n const words = normalized.split(/\\s+/);\n if (words.length > 8) {\n return false;\n }\n\n const headingLikeWords = words.filter((word) => {\n const stripped = word.replace(/^[^A-Za-z0-9]+|[^A-Za-z0-9]+$/g, \"\");\n if (!stripped) {\n return false;\n }\n\n return /^[A-Z0-9]/.test(stripped);\n }).length;\n\n return headingLikeWords / words.length >= 0.6;\n};\n\nconst officeHeadingStructureUnits = (value: string): StructuredChunkUnit[] => {\n const paragraphs = paragraphUnits(value);\n const sections: StructuredChunkUnit[] = [];\n let currentHeading: string | undefined;\n let currentParagraphs: string[] = [];\n\n const flush = () => {\n if (!currentHeading && currentParagraphs.length === 0) {\n return;\n }\n\n const text = normalizeWhitespace(\n [currentHeading, ...currentParagraphs].filter(Boolean).join(\"\\n\\n\"),\n );\n if (!text) {\n currentHeading = undefined;\n currentParagraphs = [];\n return;\n }\n\n sections.push({\n sectionDepth: currentHeading ? 1 : undefined,\n sectionKind: currentHeading ? \"office_heading\" : undefined,\n sectionPath: currentHeading ? [currentHeading] : undefined,\n sectionTitle: currentHeading,\n text,\n });\n currentHeading = undefined;\n currentParagraphs = [];\n };\n\n for (const paragraph of paragraphs) {\n if (isLikelyOfficeHeadingParagraph(paragraph)) {\n flush();\n currentHeading = paragraph;\n continue;\n }\n\n currentParagraphs.push(paragraph);\n }\n\n flush();\n\n return sections.length > 0\n ? sections\n : [{ text: normalizeWhitespace(value) }];\n};\n\nconst CODE_FILE_EXTENSIONS = new Set([\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".mts\",\n \".cts\",\n \".py\",\n \".go\",\n \".java\",\n \".rb\",\n \".rs\",\n \".php\",\n]);\n\nconst isCodeLikeSource = (source?: string) => {\n if (!source) {\n return false;\n }\n\n return CODE_FILE_EXTENSIONS.has(extname(source).toLowerCase());\n};\n\nconst countBraceDelta = (value: string) => {\n let delta = 0;\n let inSingle = false;\n let inDouble = false;\n let inTemplate = false;\n\n for (let index = 0; index < value.length; index += 1) {\n const char = value[index];\n const previous = index > 0 ? value[index - 1] : \"\";\n if (char === \"'\" && !inDouble && !inTemplate && previous !== \"\\\\\") {\n inSingle = !inSingle;\n continue;\n }\n if (char === '\"' && !inSingle && !inTemplate && previous !== \"\\\\\") {\n inDouble = !inDouble;\n continue;\n }\n if (char === \"`\" && !inSingle && !inDouble && previous !== \"\\\\\") {\n inTemplate = !inTemplate;\n continue;\n }\n if (inSingle || inDouble || inTemplate) {\n continue;\n }\n if (char === \"{\") {\n delta += 1;\n } else if (char === \"}\") {\n delta -= 1;\n }\n }\n\n return delta;\n};\n\nconst extractCodeSectionTitle = (line: string) => {\n const normalized = line.trim();\n const patterns = [\n /^(?:export\\s+)?(?:default\\s+)?(?:async\\s+)?function\\s+([A-Za-z_$][\\w$]*)/,\n /^(?:export\\s+)?class\\s+([A-Za-z_$][\\w$]*)/,\n /^(?:export\\s+)?interface\\s+([A-Za-z_$][\\w$]*)/,\n /^(?:export\\s+)?type\\s+([A-Za-z_$][\\w$]*)/,\n /^(?:export\\s+)?enum\\s+([A-Za-z_$][\\w$]*)/,\n /^(?:export\\s+)?const\\s+([A-Za-z_$][\\w$]*)\\s*=/,\n /^(?:export\\s+)?let\\s+([A-Za-z_$][\\w$]*)\\s*=/,\n /^(?:export\\s+)?var\\s+([A-Za-z_$][\\w$]*)\\s*=/,\n /^import\\s+.+?\\s+from\\s+['\"][^'\"]+['\"]/,\n /^export\\s+\\{.+\\}/,\n ];\n\n for (const pattern of patterns) {\n const match = normalized.match(pattern);\n if (!match) {\n continue;\n }\n if (match[1]) {\n return match[1];\n }\n return normalized;\n }\n\n return undefined;\n};\n\nconst codeStructureUnits = (value: string): StructuredChunkUnit[] => {\n const lines = value.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const units: StructuredChunkUnit[] = [];\n let currentLines: string[] = [];\n let currentTitle: string | undefined;\n let braceDepth = 0;\n\n const flush = () => {\n const raw = currentLines.join(\"\\n\").trim();\n if (!raw) {\n currentLines = [];\n currentTitle = undefined;\n braceDepth = 0;\n return;\n }\n\n const preferredChunkUnits = raw\n .split(/\\n{2,}/)\n .map((entry) => entry.trim())\n .filter(Boolean);\n units.push({\n ...(preferredChunkUnits.length > 0 ? { preferredChunkUnits } : {}),\n sectionDepth: 1,\n sectionKind: \"code_block\",\n ...(currentTitle\n ? {\n sectionPath: [currentTitle],\n sectionTitle: currentTitle,\n }\n : {}),\n text: raw,\n });\n currentLines = [];\n currentTitle = undefined;\n braceDepth = 0;\n };\n\n for (const line of lines) {\n const trimmed = line.trim();\n const nextTitle =\n braceDepth <= 0 ? extractCodeSectionTitle(trimmed) : undefined;\n if (nextTitle && currentLines.length > 0) {\n flush();\n }\n\n if (!currentTitle && nextTitle) {\n currentTitle = nextTitle;\n }\n\n currentLines.push(line);\n braceDepth += countBraceDelta(line);\n if (braceDepth < 0) {\n braceDepth = 0;\n }\n }\n\n flush();\n\n return units.length > 0\n ? units\n : [{ sectionDepth: 1, sectionKind: \"code_block\", text: value.trim() }];\n};\n\nconst spreadsheetStructureUnits = (\n value: string,\n metadata?: Record<string, unknown>,\n): StructuredChunkUnit[] => {\n const lines = value\n .replace(/\\r\\n?/g, \"\\n\")\n .split(\"\\n\")\n .map((line) => normalizeWhitespace(line))\n .filter(Boolean);\n if (lines.length === 0) {\n return [];\n }\n\n const sheetName =\n (typeof metadata?.sheetName === \"string\" && metadata.sheetName) ||\n lines[0]!.replace(/^Sheet\\s+/i, \"\");\n const spreadsheetHeaders = Array.isArray(metadata?.sheetHeaders)\n ? metadata.sheetHeaders.filter(\n (value): value is string =>\n typeof value === \"string\" && value.trim().length > 0,\n )\n : [];\n const spreadsheetColumnStart =\n typeof metadata?.sheetColumnStart === \"string\" &&\n metadata.sheetColumnStart.trim().length > 0\n ? metadata.sheetColumnStart.trim().toUpperCase()\n : undefined;\n const spreadsheetColumnEnd =\n typeof metadata?.sheetColumnEnd === \"string\" &&\n metadata.sheetColumnEnd.trim().length > 0\n ? metadata.sheetColumnEnd.trim().toUpperCase()\n : undefined;\n const repeatedHeaderRowNumbers = Array.isArray(\n metadata?.repeatedHeaderRowNumbers,\n )\n ? metadata.repeatedHeaderRowNumbers.filter(\n (value): value is number =>\n typeof value === \"number\" && Number.isFinite(value),\n )\n : [];\n const spreadsheetTableCount =\n typeof metadata?.sheetTableCount === \"number\" &&\n Number.isFinite(metadata.sheetTableCount)\n ? metadata.sheetTableCount\n : Math.max(repeatedHeaderRowNumbers.length + 1, 1);\n const sheetTableColumnRanges = Array.isArray(metadata?.sheetTableColumnRanges)\n ? metadata.sheetTableColumnRanges.filter(\n (value): value is SpreadsheetTableColumnRange =>\n Boolean(value) &&\n typeof value === \"object\" &&\n typeof value.tableIndex === \"number\" &&\n Number.isFinite(value.tableIndex),\n )\n : [];\n const sheetTableHeaders = Array.isArray(metadata?.sheetTableHeaders)\n ? metadata.sheetTableHeaders.filter(\n (value): value is SpreadsheetTableHeaders =>\n Boolean(value) &&\n typeof value === \"object\" &&\n typeof value.tableIndex === \"number\" &&\n Number.isFinite(value.tableIndex) &&\n Array.isArray(value.spreadsheetHeaders),\n )\n : [];\n const rowLines = lines.filter((line) => /^Row \\d+\\./.test(line));\n if (rowLines.length === 0) {\n return [\n {\n sectionDepth: 1,\n sectionKind: \"spreadsheet_rows\",\n sectionFamilyPath: [sheetName, \"Spreadsheet Table\"],\n sectionOrdinalPath: [1, 1],\n sectionSiblingFamilyKey: \"Spreadsheet Table\",\n sectionSiblingOrdinal: 1,\n ...(spreadsheetHeaders.length > 0 ? { spreadsheetHeaders } : {}),\n ...(typeof spreadsheetColumnStart === \"string\"\n ? { spreadsheetColumnStart }\n : {}),\n ...(typeof spreadsheetColumnEnd === \"string\"\n ? { spreadsheetColumnEnd }\n : {}),\n ...(spreadsheetTableCount > 1\n ? { spreadsheetTableCount, spreadsheetTableIndex: 1 }\n : {}),\n sectionPath: [sheetName],\n sectionTitle: sheetName,\n text: normalizeWhitespace(lines.join(\"\\n\")),\n },\n ];\n }\n\n const tableSegments: { rows: string[]; tableIndex: number }[] = [];\n let currentTableRows: string[] = [];\n let tableIndex = 1;\n for (const row of rowLines) {\n const rowNumber = Number(row.match(/^Row (\\d+)\\./)?.[1] ?? NaN);\n if (\n currentTableRows.length > 0 &&\n Number.isFinite(rowNumber) &&\n repeatedHeaderRowNumbers.includes(rowNumber)\n ) {\n tableSegments.push({ rows: currentTableRows, tableIndex });\n currentTableRows = [row];\n tableIndex += 1;\n continue;\n }\n\n currentTableRows.push(row);\n }\n if (currentTableRows.length > 0) {\n tableSegments.push({ rows: currentTableRows, tableIndex });\n }\n\n const groups: Array<{\n rows: string[];\n tableIndex: number;\n }> = [];\n for (const segment of tableSegments) {\n let current: string[] = [];\n for (const row of segment.rows) {\n const candidate = [...current, row].join(\"\\n\");\n if (current.length > 0 && candidate.length > DEFAULT_MAX_CHUNK_LENGTH) {\n groups.push({ rows: current, tableIndex: segment.tableIndex });\n current = [row];\n continue;\n }\n\n current.push(row);\n }\n if (current.length > 0) {\n groups.push({ rows: current, tableIndex: segment.tableIndex });\n }\n }\n\n return groups.map(({ rows, tableIndex }) => {\n const rowNumbers = rows\n .map((row) => Number(row.match(/^Row (\\d+)\\./)?.[1] ?? NaN))\n .filter((value) => Number.isFinite(value));\n const tableColumnRange = sheetTableColumnRanges.find(\n (entry) => entry.tableIndex === tableIndex,\n );\n const tableHeaders = sheetTableHeaders.find(\n (entry) => entry.tableIndex === tableIndex,\n );\n const tableSpreadsheetColumnStart =\n typeof tableColumnRange?.spreadsheetColumnStart === \"string\"\n ? tableColumnRange.spreadsheetColumnStart\n : spreadsheetColumnStart;\n const tableSpreadsheetColumnEnd =\n typeof tableColumnRange?.spreadsheetColumnEnd === \"string\"\n ? tableColumnRange.spreadsheetColumnEnd\n : spreadsheetColumnEnd;\n const tableSpreadsheetHeaders =\n Array.isArray(tableHeaders?.spreadsheetHeaders) &&\n tableHeaders.spreadsheetHeaders.length > 0\n ? tableHeaders.spreadsheetHeaders\n : spreadsheetHeaders;\n\n return {\n preferredChunkUnits: rows,\n sectionDepth: 1,\n sectionKind: \"spreadsheet_rows\" as const,\n sectionFamilyPath: [sheetName, \"Spreadsheet Table\"],\n sectionOrdinalPath: [1, tableIndex],\n sectionSiblingFamilyKey: \"Spreadsheet Table\",\n sectionSiblingOrdinal: tableIndex,\n sectionPath: [sheetName],\n sectionTitle: sheetName,\n ...(tableSpreadsheetHeaders.length > 0\n ? { spreadsheetHeaders: tableSpreadsheetHeaders }\n : {}),\n ...(typeof tableSpreadsheetColumnStart === \"string\"\n ? { spreadsheetColumnStart: tableSpreadsheetColumnStart }\n : {}),\n ...(typeof tableSpreadsheetColumnEnd === \"string\"\n ? { spreadsheetColumnEnd: tableSpreadsheetColumnEnd }\n : {}),\n ...(spreadsheetTableCount > 1\n ? { spreadsheetTableCount, spreadsheetTableIndex: tableIndex }\n : {}),\n ...(rowNumbers.length > 0\n ? {\n spreadsheetRowEnd: rowNumbers[rowNumbers.length - 1],\n spreadsheetRowStart: rowNumbers[0],\n }\n : {}),\n text: normalizeWhitespace([`Sheet ${sheetName}`, ...rows].join(\"\\n\")),\n };\n });\n};\n\nconst presentationStructureUnits = (\n value: string,\n metadata?: Record<string, unknown>,\n): StructuredChunkUnit[] => {\n const slideNumber =\n typeof metadata?.slideNumber === \"number\"\n ? metadata.slideNumber\n : typeof metadata?.slideIndex === \"number\"\n ? metadata.slideIndex + 1\n : undefined;\n const slideTitle =\n typeof metadata?.slideTitle === \"string\" && metadata.slideTitle.trim()\n ? metadata.slideTitle.trim()\n : undefined;\n const slideBodyText =\n typeof metadata?.slideBodyText === \"string\" && metadata.slideBodyText.trim()\n ? metadata.slideBodyText.trim()\n : undefined;\n const slideNotesText =\n typeof metadata?.slideNotesText === \"string\" &&\n metadata.slideNotesText.trim()\n ? metadata.slideNotesText.trim()\n : undefined;\n const slideLabel =\n slideTitle || (slideNumber ? `Slide ${slideNumber}` : \"Slide\");\n const paragraphs = [\n slideTitle,\n slideBodyText,\n slideNotesText ? `Speaker notes: ${slideNotesText}` : undefined,\n ]\n .filter((entry): entry is string => Boolean(entry))\n .flatMap((entry) => paragraphUnits(entry));\n\n return [\n {\n preferredChunkUnits: paragraphs,\n sectionDepth: 1,\n sectionKind: \"presentation_slide\",\n sectionFamilyPath: [slideTitle || \"Slide\"],\n sectionOrdinalPath: [slideNumber ?? 1],\n sectionSiblingFamilyKey: slideTitle || \"Slide\",\n sectionSiblingOrdinal: slideNumber ?? 1,\n sectionPath: [slideLabel],\n sectionTitle: slideLabel,\n text: normalizeWhitespace([slideLabel, ...paragraphs].join(\"\\n\\n\")),\n },\n ];\n};\n\nconst emailStructureUnits = (\n value: string,\n metadata?: Record<string, unknown>,\n): StructuredChunkUnit[] => {\n const emailKind =\n typeof metadata?.emailKind === \"string\" ? metadata.emailKind : undefined;\n if (emailKind !== \"message\") {\n return [];\n }\n\n const threadTopic =\n typeof metadata?.threadTopic === \"string\" && metadata.threadTopic.trim()\n ? metadata.threadTopic.trim()\n : undefined;\n const from =\n typeof metadata?.from === \"string\" && metadata.from.trim()\n ? metadata.from.trim()\n : undefined;\n const sections = Array.isArray(metadata?.emailBodySections)\n ? metadata.emailBodySections\n : [];\n const normalizedSections: EmailBodySection[] = sections\n .map((section) => {\n if (!section || typeof section !== \"object\") {\n return undefined;\n }\n const kind =\n section.kind === \"authored_text\" ||\n section.kind === \"forwarded_headers\" ||\n section.kind === \"quoted_history\"\n ? section.kind\n : undefined;\n const text =\n typeof section.text === \"string\"\n ? normalizeWhitespace(section.text)\n : \"\";\n if (!kind || !text) {\n return undefined;\n }\n return {\n ...(Array.isArray(section.forwardedBccAddresses) &&\n section.forwardedBccAddresses.length > 0\n ? { forwardedBccAddresses: section.forwardedBccAddresses }\n : {}),\n ...(Array.isArray(section.forwardedCcAddresses) &&\n section.forwardedCcAddresses.length > 0\n ? { forwardedCcAddresses: section.forwardedCcAddresses }\n : {}),\n ...(typeof section.forwardedDate === \"string\"\n ? { forwardedDate: section.forwardedDate }\n : {}),\n ...(typeof section.forwardedFromAddress === \"string\"\n ? { forwardedFromAddress: section.forwardedFromAddress }\n : {}),\n ...(typeof section.forwardedFromDisplayName === \"string\"\n ? {\n forwardedFromDisplayName: section.forwardedFromDisplayName,\n }\n : {}),\n ...(section.forwardedHeaderFields &&\n typeof section.forwardedHeaderFields === \"object\"\n ? {\n forwardedHeaderFields: section.forwardedHeaderFields as Record<\n string,\n string\n >,\n }\n : {}),\n ...(Array.isArray(section.forwardedParticipantAddresses) &&\n section.forwardedParticipantAddresses.length > 0\n ? {\n forwardedParticipantAddresses:\n section.forwardedParticipantAddresses,\n }\n : {}),\n ...(Array.isArray(section.forwardedReplyToAddresses) &&\n section.forwardedReplyToAddresses.length > 0\n ? {\n forwardedReplyToAddresses: section.forwardedReplyToAddresses,\n }\n : {}),\n ...(typeof section.forwardedSubject === \"string\"\n ? { forwardedSubject: section.forwardedSubject }\n : {}),\n ...(typeof section.forwardedTimestamp === \"string\"\n ? { forwardedTimestamp: section.forwardedTimestamp }\n : {}),\n ...(Array.isArray(section.forwardedToAddresses) &&\n section.forwardedToAddresses.length > 0\n ? { forwardedToAddresses: section.forwardedToAddresses }\n : {}),\n ...(typeof section.quotedDepth === \"number\"\n ? { quotedDepth: section.quotedDepth }\n : {}),\n kind,\n text,\n };\n })\n .filter((section): section is EmailBodySection => Boolean(section));\n if (normalizedSections.length === 0) {\n return [];\n }\n\n const labelForSection = (kind: EmailBodySection[\"kind\"]) => {\n switch (kind) {\n case \"authored_text\":\n return \"Authored Text\";\n case \"forwarded_headers\":\n return \"Forwarded Headers\";\n case \"quoted_history\":\n return \"Quoted History\";\n case \"signature\":\n return \"Signature\";\n }\n };\n\n const familyKeyBase = threadTopic || from || \"Email Message\";\n const pathRoot =\n threadTopic || (from ? `Message from ${from}` : \"Email Message\");\n const forwardedChainCount = normalizedSections.filter(\n (section) => section.kind === \"forwarded_headers\",\n ).length;\n let forwardedOrdinal = 0;\n\n return normalizedSections.map((section, index) => {\n const sectionTitle = labelForSection(section.kind);\n const sectionForwardedOrdinal =\n section.kind === \"forwarded_headers\"\n ? (forwardedOrdinal += 1)\n : undefined;\n return {\n ...(Array.isArray(section.forwardedBccAddresses) &&\n section.forwardedBccAddresses.length > 0\n ? {\n emailForwardedBccAddresses: section.forwardedBccAddresses,\n }\n : {}),\n ...(Array.isArray(section.forwardedCcAddresses) &&\n section.forwardedCcAddresses.length > 0\n ? {\n emailForwardedCcAddresses: section.forwardedCcAddresses,\n }\n : {}),\n ...(typeof section.forwardedDate === \"string\"\n ? { emailForwardedDate: section.forwardedDate }\n : {}),\n ...(typeof section.forwardedFromAddress === \"string\"\n ? {\n emailForwardedFromAddress: section.forwardedFromAddress,\n }\n : {}),\n ...(typeof section.forwardedFromDisplayName === \"string\"\n ? {\n emailForwardedFromDisplayName: section.forwardedFromDisplayName,\n }\n : {}),\n ...(typeof sectionForwardedOrdinal === \"number\"\n ? { emailForwardedChainCount: forwardedChainCount }\n : {}),\n ...(typeof section.quotedDepth === \"number\"\n ? { emailQuotedDepth: section.quotedDepth }\n : {}),\n ...(section.forwardedHeaderFields\n ? { emailForwardedHeaderFields: section.forwardedHeaderFields }\n : {}),\n ...(Array.isArray(section.forwardedParticipantAddresses) &&\n section.forwardedParticipantAddresses.length > 0\n ? {\n emailForwardedParticipantAddresses:\n section.forwardedParticipantAddresses,\n }\n : {}),\n ...(Array.isArray(section.forwardedReplyToAddresses) &&\n section.forwardedReplyToAddresses.length > 0\n ? {\n emailForwardedReplyToAddresses: section.forwardedReplyToAddresses,\n }\n : {}),\n ...(typeof section.forwardedSubject === \"string\"\n ? { emailForwardedSubject: section.forwardedSubject }\n : {}),\n ...(typeof section.forwardedTimestamp === \"string\"\n ? { emailForwardedTimestamp: section.forwardedTimestamp }\n : {}),\n ...(Array.isArray(section.forwardedToAddresses) &&\n section.forwardedToAddresses.length > 0\n ? {\n emailForwardedToAddresses: section.forwardedToAddresses,\n }\n : {}),\n ...(typeof sectionForwardedOrdinal === \"number\"\n ? { emailForwardedOrdinal: sectionForwardedOrdinal }\n : {}),\n emailSectionKind: section.kind,\n preferredChunkUnits: paragraphUnits(section.text),\n sectionDepth: 1,\n sectionKind: \"email_block\",\n sectionFamilyPath: [familyKeyBase, section.kind],\n sectionOrdinalPath: [1, index + 1],\n sectionSiblingFamilyKey: section.kind,\n sectionSiblingOrdinal: index + 1,\n sectionPath: [pathRoot, sectionTitle],\n sectionTitle,\n text: normalizeWhitespace(`${sectionTitle}\\n${section.text}`),\n };\n });\n};\n\nconst inferFormat = (document: RAGIngestDocument) => {\n if (document.format) {\n return document.format;\n }\n\n const source = document.source?.toLowerCase() ?? \"\";\n if (source.endsWith(\".jsonl\") || source.endsWith(\".ndjson\")) {\n return \"jsonl\";\n }\n if (source.endsWith(\".xml\")) {\n return \"xml\";\n }\n if (source.endsWith(\".yaml\") || source.endsWith(\".yml\")) {\n return \"yaml\";\n }\n if (source.endsWith(\".csv\")) {\n return \"csv\";\n }\n if (source.endsWith(\".tsv\")) {\n return \"tsv\";\n }\n if (source.endsWith(\".md\") || source.endsWith(\".mdx\")) {\n return \"markdown\";\n }\n if (source.endsWith(\".html\") || source.endsWith(\".htm\")) {\n return \"html\";\n }\n\n return \"text\";\n};\n\nconst normalizeDocumentText = (text: string, format: RAGContentFormat) => {\n switch (format) {\n case \"html\":\n return stripHtml(text);\n case \"xml\":\n return normalizeWhitespace(stripHtmlTags(text));\n case \"jsonl\":\n case \"tsv\":\n case \"csv\":\n case \"yaml\":\n return normalizeWhitespace(\n text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean)\n .join(\"\\n\\n\"),\n );\n case \"markdown\":\n return stripMarkdown(text);\n case \"text\":\n default:\n return normalizeWhitespace(text);\n }\n};\n\nconst slugify = (value: string) =>\n value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, RAG_DOCUMENT_SLUG_MAX_LENGTH) || \"document\";\n\nconst inferFormatFromPath = (path: string) => {\n const extension = extname(path).toLowerCase();\n if (extension === \".jsonl\" || extension === \".ndjson\") {\n return \"jsonl\";\n }\n if (extension === \".xml\") {\n return \"xml\";\n }\n if (extension === \".yaml\" || extension === \".yml\") {\n return \"yaml\";\n }\n if (extension === \".csv\") {\n return \"csv\";\n }\n if (extension === \".tsv\") {\n return \"tsv\";\n }\n if (extension === \".md\" || extension === \".mdx\") {\n return \"markdown\";\n }\n if (extension === \".html\" || extension === \".htm\") {\n return \"html\";\n }\n\n return \"text\";\n};\n\nconst inferFormatFromUrl = (input: string) => {\n try {\n return inferFormatFromPath(new URL(input).pathname);\n } catch {\n return \"text\";\n }\n};\n\nconst inferFormatFromName = (value: string | undefined) => {\n if (!value) {\n return \"text\";\n }\n\n return inferFormatFromPath(value);\n};\n\nconst inferFormatFromContentType = (contentType: string | null) => {\n const normalizedType = (contentType || \"\").toLowerCase();\n if (normalizedType.includes(\"html\")) {\n return \"html\";\n }\n if (normalizedType.includes(\"xml\")) {\n return \"xml\";\n }\n if (normalizedType.includes(\"yaml\") || normalizedType.includes(\"yml\")) {\n return \"yaml\";\n }\n if (\n normalizedType.includes(\"text/csv\") ||\n normalizedType.includes(\"application/csv\") ||\n normalizedType.includes(\"comma-separated-values\")\n ) {\n return \"csv\";\n }\n if (\n normalizedType.includes(\"tab-separated-values\") ||\n normalizedType.includes(\"text/tsv\") ||\n normalizedType.includes(\"text/tab-separated-values\")\n ) {\n return \"tsv\";\n }\n if (\n normalizedType.includes(\"x-ndjson\") ||\n normalizedType.includes(\"ndjson\") ||\n normalizedType.includes(\"jsonl\")\n ) {\n return \"jsonl\";\n }\n if (normalizedType.includes(\"text/markdown\")) {\n return \"markdown\";\n }\n if (normalizedType.includes(\"text/html\")) {\n return \"html\";\n }\n if (\n normalizedType.startsWith(\"text/\") ||\n normalizedType.includes(\"json\") ||\n normalizedType.includes(\"xml\") ||\n normalizedType.includes(\"yaml\")\n ) {\n return \"text\";\n }\n\n return undefined;\n};\n\nconst formatJSONLValue = (value: unknown, prefix?: string): string[] => {\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return prefix ? [`${prefix}: []`] : [\"[]\"];\n }\n\n const primitiveValues = value.filter(\n (entry) =>\n entry === null ||\n typeof entry === \"string\" ||\n typeof entry === \"number\" ||\n typeof entry === \"boolean\",\n );\n if (primitiveValues.length === value.length) {\n const joined = primitiveValues.map((entry) => String(entry)).join(\", \");\n return prefix ? [`${prefix}: ${joined}`] : [joined];\n }\n\n return value.flatMap((entry, index) =>\n formatJSONLValue(\n entry,\n prefix ? `${prefix}[${index + 1}]` : `[${index + 1}]`,\n ),\n );\n }\n\n if (value && typeof value === \"object\") {\n const entries = Object.entries(value);\n if (entries.length === 0) {\n return prefix ? [`${prefix}: {}`] : [\"{}\"];\n }\n\n return entries.flatMap(([key, entryValue]) =>\n formatJSONLValue(entryValue, prefix ? `${prefix}.${key}` : key),\n );\n }\n\n const rendered =\n value === null\n ? \"null\"\n : typeof value === \"string\"\n ? value\n : typeof value === \"number\" || typeof value === \"boolean\"\n ? String(value)\n : \"\";\n if (!rendered) {\n return [];\n }\n\n return prefix ? [`${prefix}: ${rendered}`] : [rendered];\n};\n\nconst jsonlStructureUnits = (value: string): StructuredChunkUnit[] => {\n const units: StructuredChunkUnit[] = [];\n const lines = value.split(\"\\n\");\n\n for (const [index, line] of lines.entries()) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n\n let text = trimmed;\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n const formatted = formatJSONLValue(parsed);\n if (formatted.length > 0) {\n text = normalizeWhitespace(formatted.join(\"\\n\"));\n }\n } catch {\n text = normalizeWhitespace(trimmed);\n }\n\n if (!text) {\n continue;\n }\n\n const recordLabel = `Record ${units.length + 1}`;\n units.push({\n preferredChunkUnits: text.split(\"\\n\").filter(Boolean),\n sectionDepth: 1,\n sectionKind: \"jsonl_record\",\n sectionPath: [recordLabel],\n sectionTitle: recordLabel,\n sourceAwareChunkReason: \"source_native_unit\",\n text: normalizeWhitespace(`${recordLabel}.\\n${text}`),\n });\n }\n\n return units;\n};\n\nconst parseDelimitedLine = (line: string, delimiter: string) => {\n const cells: string[] = [];\n let current = \"\";\n let inQuotes = false;\n\n for (let index = 0; index < line.length; index += 1) {\n const char = line[index];\n const next = index + 1 < line.length ? line[index + 1] : \"\";\n if (char === '\"') {\n if (inQuotes && next === '\"') {\n current += '\"';\n index += 1;\n continue;\n }\n inQuotes = !inQuotes;\n continue;\n }\n if (char === delimiter && !inQuotes) {\n cells.push(current.trim());\n current = \"\";\n continue;\n }\n current += char;\n }\n\n cells.push(current.trim());\n return cells;\n};\n\nconst formatDelimitedValue = (headers: string[], cells: string[]) => {\n const pairs = cells\n .map((value, index) => {\n const normalizedValue = normalizeWhitespace(value);\n if (!normalizedValue) {\n return undefined;\n }\n\n const header = normalizeWhitespace(headers[index] ?? \"\");\n return header\n ? `${header}: ${normalizedValue}`\n : `${String.fromCharCode(65 + index)}: ${normalizedValue}`;\n })\n .filter((value): value is string => Boolean(value));\n\n return pairs.length > 0 ? pairs.join(\" | \") : undefined;\n};\n\nconst delimitedStructureUnits = ({\n delimiter,\n rowKind,\n value,\n}: {\n delimiter: string;\n rowKind: \"tsv_row\" | \"csv_row\";\n value: string;\n}): StructuredChunkUnit[] => {\n const lines = value\n .replace(/\\r\\n?/g, \"\\n\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n if (lines.length === 0) {\n return [];\n }\n\n const headers = parseDelimitedLine(lines[0] ?? \"\", delimiter).map((entry) =>\n normalizeWhitespace(entry),\n );\n const dataLines =\n headers.length > 0 && lines.length > 1 ? lines.slice(1) : lines;\n const units: StructuredChunkUnit[] = [];\n\n for (const [index, line] of dataLines.entries()) {\n const cells = parseDelimitedLine(line, delimiter);\n const rowText = formatDelimitedValue(headers, cells);\n if (!rowText) {\n continue;\n }\n\n const rowLabel = `Row ${index + 1}`;\n units.push({\n preferredChunkUnits: rowText.split(\" | \"),\n sectionDepth: 1,\n sectionKind: rowKind,\n sectionPath: [rowLabel],\n sectionTitle: rowLabel,\n sourceAwareChunkReason: \"source_native_unit\",\n text: normalizeWhitespace(`${rowLabel}.\\n${rowText}`),\n });\n }\n\n return units;\n};\n\nconst tsvStructureUnits = (value: string) =>\n delimitedStructureUnits({\n delimiter: \"\\t\",\n rowKind: \"tsv_row\",\n value,\n });\n\nconst csvStructureUnits = (value: string) =>\n delimitedStructureUnits({\n delimiter: \",\",\n rowKind: \"csv_row\",\n value,\n });\n\nconst xmlStructureUnits = (value: string): StructuredChunkUnit[] => {\n const normalized = value.replace(/\\r\\n?/g, \"\\n\");\n const units: StructuredChunkUnit[] = [];\n const body = normalized\n .replace(/<\\?xml[\\s\\S]*?\\?>/gi, \"\")\n .replace(/<!DOCTYPE[\\s\\S]*?>/gi, \"\")\n .trim();\n\n const rootMatch = body.match(/^<([A-Za-z_][\\w:.-]*)\\b[^>]*>([\\s\\S]*)<\\/\\1>$/);\n const inner = rootMatch?.[2] ?? body;\n const nodePattern =\n /<([A-Za-z_][\\w:.-]*)\\b[^>]*>([\\s\\S]*?)<\\/\\1>|<([A-Za-z_][\\w:.-]*)\\b[^>]*\\/>/g;\n\n for (const match of inner.matchAll(nodePattern)) {\n const tagName = match[1] ?? match[3];\n if (!tagName) {\n continue;\n }\n const raw = match[0] ?? \"\";\n const text = normalizeWhitespace(stripHtmlTags(raw));\n if (!text) {\n continue;\n }\n\n const label = tagName.replace(/^.*:/, \"\");\n units.push({\n preferredChunkUnits: text.split(\"\\n\").filter(Boolean),\n sectionDepth: 1,\n sectionKind: \"xml_node\",\n sectionPath: [label],\n sectionTitle: label,\n sourceAwareChunkReason: \"source_native_unit\",\n text: normalizeWhitespace(`${label}\\n${text}`),\n });\n }\n\n return units;\n};\n\nconst yamlStructureUnits = (value: string): StructuredChunkUnit[] => {\n const lines = value.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const units: StructuredChunkUnit[] = [];\n let currentTitle: string | undefined;\n let currentLines: string[] = [];\n\n const flush = () => {\n if (!currentTitle && currentLines.length === 0) {\n return;\n }\n const text = normalizeWhitespace(currentLines.join(\"\\n\"));\n if (!text) {\n currentTitle = undefined;\n currentLines = [];\n return;\n }\n const title = currentTitle ?? `Section ${units.length + 1}`;\n units.push({\n preferredChunkUnits: currentLines\n .map((entry) => normalizeWhitespace(entry))\n .filter(Boolean),\n sectionDepth: 1,\n sectionKind: \"yaml_section\",\n sectionPath: [title],\n sectionTitle: title,\n sourceAwareChunkReason: \"source_native_unit\",\n text: normalizeWhitespace(`${title}\\n${text}`),\n });\n currentTitle = undefined;\n currentLines = [];\n };\n\n for (const line of lines) {\n if (!line.trim() || line.trim().startsWith(\"#\")) {\n continue;\n }\n const topLevelKey = line.match(/^([A-Za-z0-9_.-]+):(?:\\s*(.*))?$/);\n const topLevelList = line.match(/^-+\\s+(.+)$/);\n if (topLevelKey && !line.startsWith(\" \")) {\n flush();\n currentTitle = normalizeWhitespace(topLevelKey[1] ?? \"\");\n currentLines = [line];\n continue;\n }\n if (topLevelList && !line.startsWith(\" \")) {\n if (!currentTitle) {\n currentTitle = \"items\";\n }\n currentLines.push(line);\n continue;\n }\n currentLines.push(line);\n }\n\n flush();\n return units;\n};\n\nconst validateJSONLText = (value: string) => {\n const lines = value.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n for (const [index, line] of lines.entries()) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n try {\n JSON.parse(trimmed);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `AbsoluteJS detected malformed JSONL at line ${index + 1}: ${reason}`,\n );\n }\n }\n};\n\nconst validateDelimitedText = (\n value: string,\n formatLabel: \"CSV\" | \"TSV\",\n delimiter: string,\n) => {\n const lines = value.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n for (const [index, line] of lines.entries()) {\n if (!line.trim()) {\n continue;\n }\n let inQuotes = false;\n for (\n let characterIndex = 0;\n characterIndex < line.length;\n characterIndex += 1\n ) {\n const char = line[characterIndex];\n const next =\n characterIndex + 1 < line.length ? line[characterIndex + 1] : \"\";\n if (char === '\"') {\n if (inQuotes && next === '\"') {\n characterIndex += 1;\n continue;\n }\n inQuotes = !inQuotes;\n continue;\n }\n if (char === delimiter && !inQuotes) {\n continue;\n }\n }\n if (inQuotes) {\n throw new Error(\n `AbsoluteJS detected malformed ${formatLabel} at line ${index + 1}: unclosed quoted field`,\n );\n }\n }\n};\n\nconst validateXMLText = (value: string) => {\n const normalized = value\n .replace(/<\\?xml[\\s\\S]*?\\?>/gi, \"\")\n .replace(/<!DOCTYPE[\\s\\S]*?>/gi, \"\")\n .replace(/<!--[\\s\\S]*?-->/g, \"\");\n const tokenPattern = /<\\/?([A-Za-z_][\\w:.-]*)\\b[^>]*\\/?>/g;\n const stack: string[] = [];\n\n for (const match of normalized.matchAll(tokenPattern)) {\n const token = match[0] ?? \"\";\n const name = match[1] ?? \"\";\n if (!name) {\n continue;\n }\n const selfClosing =\n token.endsWith(\"/>\") || token.startsWith(\"<?\") || token.startsWith(\"<!\");\n if (selfClosing) {\n continue;\n }\n if (token.startsWith(\"</\")) {\n const expected = stack.pop();\n if (expected !== name) {\n throw new Error(\n `AbsoluteJS detected malformed XML: expected closing tag for <${expected ?? \"none\"}> but found </${name}>`,\n );\n }\n continue;\n }\n stack.push(name);\n }\n\n if (stack.length > 0) {\n throw new Error(\n `AbsoluteJS detected malformed XML: unclosed tag <${stack[stack.length - 1]}>`,\n );\n }\n};\n\nconst validateYAMLText = (value: string) => {\n const lines = value.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n let seenTopLevelKey = false;\n\n for (const [index, line] of lines.entries()) {\n if (!line.trim() || line.trim().startsWith(\"#\")) {\n continue;\n }\n if (/^\\t+/.test(line)) {\n throw new Error(\n `AbsoluteJS detected malformed YAML at line ${index + 1}: tab indentation is not supported`,\n );\n }\n if (/^\\s+/.test(line) && !seenTopLevelKey) {\n throw new Error(\n `AbsoluteJS detected malformed YAML at line ${index + 1}: nested content appears before any top-level key`,\n );\n }\n if (/^[A-Za-z0-9_.-]+:\\s*(.*)?$/.test(line)) {\n seenTopLevelKey = true;\n }\n }\n};\n\nconst validateStructuredTextInput = (\n value: string,\n format: RAGContentFormat,\n) => {\n switch (format) {\n case \"jsonl\":\n validateJSONLText(value);\n return;\n case \"csv\":\n validateDelimitedText(value, \"CSV\", \",\");\n return;\n case \"tsv\":\n validateDelimitedText(value, \"TSV\", \"\\t\");\n return;\n case \"xml\":\n validateXMLText(value);\n return;\n case \"yaml\":\n validateYAMLText(value);\n return;\n default:\n return;\n }\n};\n\nconst decodeUploadContent = (input: RAGDocumentUploadInput) => {\n if (input.encoding === \"base64\") {\n return Buffer.from(input.content, \"base64\");\n }\n\n return Buffer.from(input.content, \"utf8\");\n};\n\nconst inferNameFromInput = (input: {\n path?: string;\n name?: string;\n source?: string;\n title?: string;\n}) =>\n input.name ??\n input.path?.split(/[\\\\/]/).at(-1) ??\n input.source?.split(\"/\").at(-1) ??\n input.title ??\n DEFAULT_BINARY_NAME;\n\nconst inferExtensionFromInput = (input: {\n path?: string;\n name?: string;\n source?: string;\n}) => {\n const candidate = input.path ?? input.name ?? input.source ?? \"\";\n\n return extname(candidate).toLowerCase();\n};\n\nconst isLikelyTextData = (data: Uint8Array) => {\n if (data.length === 0) {\n return true;\n }\n\n const sample = data.subarray(0, Math.min(512, data.length));\n let suspicious = 0;\n for (const byte of sample) {\n if (byte === 9 || byte === 10 || byte === 13) {\n continue;\n }\n\n if (byte < 32 || byte === 127) {\n suspicious += 1;\n }\n }\n\n return suspicious / sample.length < 0.1;\n};\n\nconst decodePdfLiteral = (value: string) =>\n value\n .replace(/\\\\([\\\\()])/g, \"$1\")\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\r/g, \"\\r\")\n .replace(/\\\\t/g, \"\\t\")\n .replace(/\\\\b/g, \"\\b\")\n .replace(/\\\\f/g, \"\\f\")\n .replace(/\\\\([0-7]{1,3})/g, (_match, octal: string) =>\n String.fromCharCode(parseInt(octal, 8)),\n );\n\nconst PDF_TABLE_GAP_THRESHOLD = 120;\n\nconst extractPdfArrayText = (value: string) => {\n const parts: string[] = [];\n const tokenPattern = /\\(((?:\\\\.|[^\\\\)])*)\\)|([-+]?\\d*\\.?\\d+)/g;\n let pendingColumnGap = false;\n\n for (const match of value.matchAll(tokenPattern)) {\n if (match[1] !== undefined) {\n const decoded = decodePdfLiteral(match[1]);\n if (\n pendingColumnGap &&\n decoded &&\n !/^\\s/.test(decoded) &&\n parts.at(-1) !== \" | \"\n ) {\n parts.push(\" | \");\n }\n\n parts.push(decoded);\n pendingColumnGap = false;\n continue;\n }\n\n const gap = Number(match[2]);\n if (Number.isFinite(gap) && gap >= PDF_TABLE_GAP_THRESHOLD) {\n pendingColumnGap = true;\n }\n }\n\n return normalizeWhitespace(parts.join(\"\"))\n .replace(/\\s+\\|\\s+/g, \" | \")\n .trim();\n};\n\nconst appendPdfText = (parts: string[], value: string) => {\n if (!value) {\n return;\n }\n\n parts.push(value);\n};\n\nconst appendPdfLineBreak = (parts: string[]) => {\n const last = parts.at(-1);\n if (!last || last.endsWith(\"\\n\")) {\n return;\n }\n\n parts.push(\"\\n\");\n};\n\ntype PDFNativeTextBlock = {\n blockNumber: number;\n lineCount: number;\n pageNumber: number;\n semanticRole?: \"figure_caption\" | \"figure_body\";\n text: string;\n textKind: \"paragraph\" | \"table_like\";\n};\n\ntype PDFNativeTextBlockSeed = Omit<PDFNativeTextBlock, \"blockNumber\">;\ntype PDFNativeStructureBlockEntry = {\n baseSectionTitle: string;\n pageNumber?: number;\n pdfBlockNumber?: number;\n pdfFigureCaptionBlockNumber?: number;\n pdfFigureLabel?: string;\n pdfSemanticRole?: \"figure_caption\" | \"figure_body\";\n pdfTableBodyRowEnd?: number;\n pdfTableBodyRowCount?: number;\n pdfTableBodyRowStart?: number;\n pdfTableChunkKind?: \"full_table\" | \"table_slice\";\n pdfTableColumnCount?: number;\n pdfTableHeaderText?: string;\n pdfTableHeaders?: string[];\n pdfTableRowCount?: number;\n pdfTableSignature?: string;\n pdfTextKind: \"paragraph\" | \"table_like\";\n text: string;\n};\n\ntype PDFNativeTextExtraction = {\n pageCount: number;\n text: string;\n textBlockCount: number;\n textBlocks: PDFNativeTextBlock[];\n};\n\nconst PDF_CHROME_LINE_MAX_LENGTH = 80;\nconst PDF_LINK_CLUSTER_LINE_MAX_LENGTH = 120;\nconst PDF_FIGURE_LABEL_PATTERN =\n /^(?:figure|fig\\.)\\s*\\d+[A-Za-z]?(?:\\s*[:.-]\\s*|\\s+|$)/i;\nconst PDF_LINK_CLUSTER_HEADING_PATTERN =\n /^(?:related|quick|useful|reference|references|resources|links|see also)\\b/i;\nconst PDF_PROMO_HEADING_PATTERN =\n /^(?:start|free trial|upgrade|subscribe|newsletter|contact sales|book demo|try|learn more)\\b/i;\nconst PDF_PROMO_BODY_PATTERN =\n /\\b(?:free trial|upgrade|subscribe|newsletter|contact sales|book demo|learn more|pricing|enterprise|demo)\\b/i;\nconst OCR_SUMMARY_CONFIDENCE_THRESHOLD = 0.75;\nconst OCR_SUMMARY_MIN_STRONG_TEXT_RATIO = 0.6;\n\nconst PDF_TEXT_OPERATOR_PATTERN =\n /(\\[((?:\\\\.|[^\\]])*)\\]\\s*TJ)|(\\(((?:\\\\.|[^\\\\)])*)\\)\\s*Tj)|([-+]?\\d*\\.?\\d+\\s+[-+]?\\d*\\.?\\d+\\s+\\(((?:\\\\.|[^\\\\)])*)\\)\\s*\")|(\\(((?:\\\\.|[^\\\\)])*)\\)\\s*')|((?:[-+]?\\d*\\.?\\d+\\s+){2}(?:Td|TD))|(T\\*)|((?:[-+]?\\d*\\.?\\d+\\s+){6}Tm)/g;\n\nconst extractTextFromPDFTextObject = (value: string) => {\n const parts: string[] = [];\n\n for (const match of value.matchAll(PDF_TEXT_OPERATOR_PATTERN)) {\n if (match[2] !== undefined) {\n appendPdfText(parts, extractPdfArrayText(match[2]));\n continue;\n }\n\n if (match[4] !== undefined) {\n appendPdfText(parts, decodePdfLiteral(match[4]));\n continue;\n }\n\n if (match[6] !== undefined) {\n appendPdfLineBreak(parts);\n appendPdfText(parts, decodePdfLiteral(match[6]));\n continue;\n }\n\n if (match[8] !== undefined) {\n appendPdfLineBreak(parts);\n appendPdfText(parts, decodePdfLiteral(match[8]));\n continue;\n }\n\n if (\n match[9] !== undefined ||\n match[10] !== undefined ||\n match[11] !== undefined\n ) {\n appendPdfLineBreak(parts);\n }\n }\n\n return parts.join(\"\");\n};\n\nconst buildPDFNativeTextBlockSeed = (\n lines: string[],\n pageNumber: number,\n): PDFNativeTextBlockSeed | undefined => {\n const normalizedLines = lines\n .map((line) => normalizeWhitespace(line))\n .filter(Boolean);\n if (normalizedLines.length === 0) {\n return undefined;\n }\n const text = normalizedLines.join(\"\\n\");\n const semanticRole =\n normalizedLines.length >= 2 &&\n PDF_FIGURE_LABEL_PATTERN.test(normalizedLines[0] ?? \"\")\n ? \"figure_caption\"\n : undefined;\n\n return {\n lineCount: normalizedLines.length,\n pageNumber,\n ...(semanticRole ? { semanticRole } : {}),\n text,\n textKind: normalizedLines.some((line) => line.includes(\" | \"))\n ? \"table_like\"\n : \"paragraph\",\n };\n};\n\nconst inferPDFBlockHeading = (text: string) => {\n const lines = text\n .split(\"\\n\")\n .map((line) => normalizeWhitespace(line))\n .filter(Boolean);\n const candidate = lines[0];\n if (\n !candidate ||\n candidate.length > 80 ||\n candidate.includes(\" | \") ||\n /[.!?]$/.test(candidate)\n ) {\n return undefined;\n }\n\n return candidate;\n};\n\nconst extractPDFFigureLabel = (text: string) => {\n const lines = text\n .split(\"\\n\")\n .map((line) => normalizeWhitespace(line))\n .filter(Boolean);\n const candidate = lines[0];\n return candidate && PDF_FIGURE_LABEL_PATTERN.test(candidate)\n ? candidate\n : undefined;\n};\n\nconst splitPDFNativeTextBlocks = (\n text: string,\n pageNumber: number,\n): PDFNativeTextBlockSeed[] => {\n const lines = text\n .split(\"\\n\")\n .map((line) => normalizeWhitespace(line))\n .filter(Boolean);\n if (lines.length === 0) {\n return [];\n }\n\n const blocks: PDFNativeTextBlockSeed[] = [];\n let currentLines: string[] = [];\n let currentKind: PDFNativeTextBlock[\"textKind\"] | undefined;\n let currentSemanticRole: PDFNativeTextBlock[\"semanticRole\"] | undefined;\n\n const flush = () => {\n if (currentLines.length === 0) {\n return;\n }\n\n const block = buildPDFNativeTextBlockSeed(currentLines, pageNumber);\n if (block) {\n blocks.push(block);\n }\n currentLines = [];\n currentKind = undefined;\n currentSemanticRole = undefined;\n };\n\n for (const [index, line] of lines.entries()) {\n const lineKind: PDFNativeTextBlock[\"textKind\"] = line.includes(\" | \")\n ? \"table_like\"\n : \"paragraph\";\n const isFigureLabel = PDF_FIGURE_LABEL_PATTERN.test(line);\n\n if (isFigureLabel) {\n flush();\n currentKind = \"paragraph\";\n currentSemanticRole = \"figure_caption\";\n currentLines.push(line);\n continue;\n }\n\n if (currentSemanticRole === \"figure_caption\") {\n if (lineKind === \"paragraph\" && currentLines.length < 2) {\n currentLines.push(line);\n continue;\n }\n flush();\n }\n\n if (currentKind && lineKind !== currentKind) {\n flush();\n }\n\n currentKind = lineKind;\n currentLines.push(line);\n }\n\n flush();\n\n return blocks;\n};\n\nconst assignPDFBlockNumbers = (blocks: PDFNativeTextBlockSeed[]) =>\n blocks.map((block, index) => ({\n ...block,\n blockNumber: index + 1,\n }));\n\nconst isLikelyPDFPageLabel = (value: string) =>\n /^page\\s+\\d+(?:\\s+of\\s+\\d+)?$/i.test(value.trim());\n\nconst isLikelyPDFChromeLine = (value: string) => {\n const normalized = value.trim();\n if (!normalized) {\n return false;\n }\n\n return (\n isLikelyPDFPageLabel(normalized) ||\n /\\b(?:header|footer)\\s*$/i.test(normalized)\n );\n};\n\nconst isLikelyPDFLinkLine = (value: string) => {\n const normalized = value.trim();\n if (!normalized || normalized.length > PDF_LINK_CLUSTER_LINE_MAX_LENGTH) {\n return false;\n }\n\n return (\n /^https?:\\/\\//i.test(normalized) ||\n /^www\\./i.test(normalized) ||\n /^\\/[A-Za-z0-9/_#?&=%.-]+$/.test(normalized) ||\n /\\((?:https?:\\/\\/|\\/)[^)]+\\)/i.test(normalized)\n );\n};\n\nconst isLikelyPDFLinkClusterBlock = (block: PDFNativeTextBlock) => {\n if (block.semanticRole || block.textKind !== \"paragraph\") {\n return false;\n }\n\n const lines = block.text\n .split(\"\\n\")\n .map((line) => normalizeWhitespace(line))\n .filter(Boolean);\n if (lines.length === 1) {\n return isLikelyPDFLinkLine(lines[0] ?? \"\");\n }\n if (lines.length < 2) {\n return false;\n }\n\n const heading = lines[0] ?? \"\";\n const bodyLines = lines.slice(1);\n const linkLikeCount = bodyLines.filter((line) =>\n isLikelyPDFLinkLine(line),\n ).length;\n if (\n bodyLines.length > 0 &&\n linkLikeCount === bodyLines.length &&\n PDF_LINK_CLUSTER_HEADING_PATTERN.test(heading)\n ) {\n return true;\n }\n\n return linkLikeCount >= 2 && linkLikeCount >= Math.ceil(lines.length * 0.6);\n};\n\nconst isLikelyPDFPromoBlock = (block: PDFNativeTextBlock) => {\n if (block.semanticRole || block.textKind !== \"paragraph\") {\n return false;\n }\n\n const lines = block.text\n .split(\"\\n\")\n .map((line) => normalizeWhitespace(line))\n .filter(Boolean);\n if (lines.length === 1) {\n return PDF_PROMO_HEADING_PATTERN.test(lines[0] ?? \"\");\n }\n if (lines.length < 2 || lines.length > 4) {\n return false;\n }\n\n const heading = lines[0] ?? \"\";\n const bodyLines = lines.slice(1);\n const promoLikeCount = bodyLines.filter(\n (line) =>\n line.length <= PDF_LINK_CLUSTER_LINE_MAX_LENGTH &&\n (PDF_PROMO_BODY_PATTERN.test(line) || isLikelyPDFLinkLine(line)),\n ).length;\n\n if (\n PDF_PROMO_HEADING_PATTERN.test(heading) &&\n promoLikeCount >= Math.max(1, bodyLines.length - 1)\n ) {\n return true;\n }\n\n return false;\n};\n\nconst suppressRepeatedPDFChrome = (blocks: PDFNativeTextBlock[]) => {\n const linePages = new Map<string, Set<number>>();\n\n for (const block of blocks) {\n for (const line of block.text.split(\"\\n\")) {\n const normalized = normalizeWhitespace(line);\n if (!normalized || normalized.length > PDF_CHROME_LINE_MAX_LENGTH) {\n continue;\n }\n\n const pages = linePages.get(normalized) ?? new Set<number>();\n pages.add(block.pageNumber);\n linePages.set(normalized, pages);\n }\n }\n\n return blocks\n .map((block) => {\n const keptLines = block.text\n .split(\"\\n\")\n .map((line) => normalizeWhitespace(line))\n .filter((line) => {\n if (!line) {\n return false;\n }\n\n if (isLikelyPDFChromeLine(line)) {\n return false;\n }\n\n const repeatedPages = linePages.get(line);\n if (\n line.length <= PDF_CHROME_LINE_MAX_LENGTH &&\n repeatedPages &&\n repeatedPages.size > 1\n ) {\n return false;\n }\n\n return true;\n });\n const text = keptLines.join(\"\\n\");\n if (!text) {\n return undefined;\n }\n\n return {\n ...block,\n lineCount: text.split(\"\\n\").filter(Boolean).length,\n text,\n textKind: text.includes(\" | \") ? \"table_like\" : \"paragraph\",\n };\n })\n .filter((value): value is PDFNativeTextBlock => Boolean(value));\n};\n\nconst suppressNonContentPDFBlocks = (blocks: PDFNativeTextBlock[]) =>\n blocks.filter(\n (block) =>\n !isLikelyPDFLinkClusterBlock(block) && !isLikelyPDFPromoBlock(block),\n );\n\nconst mergePDFHeadingContinuationBlocks = (blocks: PDFNativeTextBlock[]) => {\n const merged: PDFNativeTextBlock[] = [];\n\n for (let index = 0; index < blocks.length; index += 1) {\n const block = blocks[index];\n if (!block) {\n continue;\n }\n\n const lines = block.text\n .split(\"\\n\")\n .map((line) => normalizeWhitespace(line))\n .filter(Boolean);\n const nextBlock = blocks[index + 1];\n const isHeadingOnlyBlock =\n !block.semanticRole &&\n block.textKind === \"paragraph\" &&\n lines.length === 1 &&\n inferPDFBlockHeading(block.text) === lines[0];\n const canMergeWithNext =\n isHeadingOnlyBlock &&\n nextBlock &&\n nextBlock.pageNumber === block.pageNumber &&\n !nextBlock.semanticRole &&\n nextBlock.textKind === \"paragraph\" &&\n inferPDFBlockHeading(nextBlock.text) === undefined;\n\n if (canMergeWithNext) {\n const text = [block.text, nextBlock.text]\n .flatMap((value) => value.split(\"\\n\"))\n .map((line) => normalizeWhitespace(line))\n .filter(Boolean)\n .join(\"\\n\");\n merged.push({\n ...block,\n lineCount: text.split(\"\\n\").filter(Boolean).length,\n text,\n });\n index += 1;\n continue;\n }\n\n merged.push(block);\n }\n\n return merged;\n};\n\nconst associatePDFNativeFigureBodies = (blocks: PDFNativeTextBlock[]) =>\n blocks.map((block, index) => {\n if (\n block.semanticRole ||\n block.textKind !== \"paragraph\" ||\n inferPDFBlockHeading(block.text)\n ) {\n return block;\n }\n\n const previousBlock = index > 0 ? blocks[index - 1] : undefined;\n if (\n !previousBlock ||\n previousBlock.pageNumber !== block.pageNumber ||\n previousBlock.semanticRole !== \"figure_caption\"\n ) {\n return block;\n }\n\n return {\n ...block,\n semanticRole: \"figure_body\" as const,\n };\n });\n\nconst extractNativePDFText = (data: Uint8Array): PDFNativeTextExtraction => {\n const raw = Buffer.from(data).toString(\"latin1\");\n const count = [...raw.matchAll(/\\/Type\\s*\\/Page\\b/g)].length;\n const pageCount = count > 0 ? count : 1;\n const pageMarkers = [...raw.matchAll(/\\/Type\\s*\\/Page\\b/g)].map(\n (match) => match.index ?? raw.length,\n );\n const blocks = assignPDFBlockNumbers(\n [...raw.matchAll(/BT([\\s\\S]*?)ET/g)].flatMap((match) => {\n const blockText = extractTextFromPDFTextObject(match[1] ?? \"\");\n const objectEnd = (match.index ?? 0) + (match[0]?.length ?? 0);\n const pageIndex = pageMarkers.findIndex((marker) => marker >= objectEnd);\n const pageNumber = pageIndex >= 0 ? pageIndex + 1 : pageCount;\n\n return splitPDFNativeTextBlocks(blockText, pageNumber);\n }),\n );\n const visibleBlocks = assignPDFBlockNumbers(\n associatePDFNativeFigureBodies(\n mergePDFHeadingContinuationBlocks(\n suppressNonContentPDFBlocks(suppressRepeatedPDFChrome(blocks)),\n ),\n ),\n );\n const fallbackText = [...raw.matchAll(/\\(((?:\\\\.|[^\\\\)])*)\\)\\s*Tj/g)]\n .map((match) => decodePdfLiteral(match[1] ?? \"\"))\n .join(\"\\n\");\n const text =\n visibleBlocks.length > 0\n ? normalizeWhitespace(\n visibleBlocks.map((block) => block.text).join(\"\\n\\n\"),\n )\n : normalizeWhitespace(fallbackText);\n\n return {\n pageCount,\n text,\n textBlockCount: visibleBlocks.length,\n textBlocks: visibleBlocks,\n };\n};\n\nconst readUInt16LE = (data: Uint8Array, offset: number) =>\n data[offset]! | (data[offset + 1]! << 8);\n\nconst readUInt32LE = (data: Uint8Array, offset: number) =>\n (data[offset]! |\n (data[offset + 1]! << 8) |\n (data[offset + 2]! << 16) |\n (data[offset + 3]! << 24)) >>>\n 0;\n\nconst decodeUtf8 = (data: Uint8Array) => Buffer.from(data).toString(\"utf8\");\n\n/**\n * Byte-preserving decode: each byte becomes the char with that code.\n *\n * A raw message must NOT be read as utf8 before its parts are parsed — a\n * part declaring iso-8859-1 or shift_jis has already been corrupted into\n * replacement characters by then, and no later decode can recover it. Holding\n * the message as latin1 keeps every byte addressable until the part's own\n * charset is known, at which point decodeWithCharset does the real decode.\n */\nconst decodeLatin1 = (data: Uint8Array) =>\n Buffer.from(data).toString(\"latin1\");\n\nconst isZipData = (data: Uint8Array) =>\n data.length >= 4 &&\n data[0] === 0x50 &&\n data[1] === 0x4b &&\n data[2] === 0x03 &&\n data[3] === 0x04;\n\nconst unzipEntries = (data: Uint8Array): RAGArchiveEntry[] => {\n const entries: RAGArchiveEntry[] = [];\n let offset = 0;\n\n while (offset + 30 <= data.length) {\n const signature = readUInt32LE(data, offset);\n if (signature !== 0x04034b50) {\n break;\n }\n\n const compressionMethod = readUInt16LE(data, offset + 8);\n const compressedSize = readUInt32LE(data, offset + 18);\n const fileNameLength = readUInt16LE(data, offset + 26);\n const extraFieldLength = readUInt16LE(data, offset + 28);\n const fileNameStart = offset + 30;\n const fileNameEnd = fileNameStart + fileNameLength;\n const fileName = decodeUtf8(data.subarray(fileNameStart, fileNameEnd));\n const dataStart = fileNameEnd + extraFieldLength;\n const dataEnd = dataStart + compressedSize;\n const raw = data.subarray(dataStart, dataEnd);\n let entryData: Uint8Array;\n\n if (compressionMethod === 0) {\n entryData = raw;\n } else if (compressionMethod === 8) {\n entryData = inflateRawSync(Buffer.from(raw));\n } else {\n throw new Error(\n `Unsupported ZIP compression method ${compressionMethod} for ${fileName}`,\n );\n }\n\n if (!fileName.endsWith(\"/\")) {\n entries.push({\n data: entryData,\n path: fileName,\n });\n }\n\n offset = dataEnd;\n }\n\n return entries;\n};\n\nconst untarEntries = (data: Uint8Array): RAGArchiveEntry[] => {\n const entries: RAGArchiveEntry[] = [];\n let offset = 0;\n\n while (offset + 512 <= data.length) {\n const header = data.subarray(offset, offset + 512);\n if (header.every((byte) => byte === 0)) {\n break;\n }\n\n const name = decodeUtf8(header.subarray(0, 100)).replace(/\\0.*$/, \"\");\n const sizeText = decodeUtf8(header.subarray(124, 136))\n .replace(/\\0.*$/, \"\")\n .trim();\n const size = sizeText ? parseInt(sizeText, 8) : 0;\n const typeFlag = header[156];\n const dataStart = offset + 512;\n const dataEnd = dataStart + size;\n\n if (typeFlag !== 53 && typeFlag !== 0 && typeFlag !== 48) {\n offset = dataStart + Math.ceil(size / 512) * 512;\n continue;\n }\n\n if (name) {\n entries.push({\n data: data.subarray(dataStart, dataEnd),\n path: name,\n });\n }\n\n offset = dataStart + Math.ceil(size / 512) * 512;\n }\n\n return entries;\n};\n\nconst decodeGzipEntries = (\n data: Uint8Array,\n input: RAGFileExtractionInput,\n): RAGArchiveEntry[] => {\n const ungzipped = gunzipSync(Buffer.from(data));\n const sourceName = inferNameFromInput(input);\n const stripped = sourceName.replace(/\\.t?gz$/i, \"\").replace(/\\.gz$/i, \"\");\n\n if (\n sourceName.toLowerCase().endsWith(\".tgz\") ||\n sourceName.toLowerCase().endsWith(\".tar.gz\")\n ) {\n return untarEntries(ungzipped);\n }\n\n return [\n {\n data: ungzipped,\n path: stripped || \"archive-entry\",\n },\n ];\n};\n\nconst extractXmlText = (value: string) =>\n normalizeWhitespace(\n decodeHtmlEntities(value.replace(/<[^>]+>/g, \" \").replace(/\\s+/g, \" \")),\n );\n\nconst extractOfficeParagraphText = (value: string) =>\n normalizeWhitespace(\n decodeHtmlEntities(\n value\n .replace(/<w:tab\\b[^>]*\\/>/gi, \"\\t\")\n .replace(/<w:br\\b[^>]*\\/>/gi, \"\\n\")\n .replace(/<[^>]+>/g, \" \"),\n ),\n );\n\nconst officeDocumentBlocks = (\n entries: RAGArchiveEntry[],\n): OfficeDocumentBlock[] => {\n const documentEntry = entries.find(\n (entry) => entry.path === \"word/document.xml\",\n );\n if (!documentEntry) {\n return [];\n }\n\n const xml = decodeUtf8(documentEntry.data);\n const bodyMatch = xml.match(/<w:body\\b[^>]*>([\\s\\S]*?)<\\/w:body>/i);\n const body = bodyMatch?.[1] ?? xml;\n const blocks: OfficeDocumentBlock[] = [];\n const blockPattern = /<(w:p|w:tbl)\\b[\\s\\S]*?<\\/\\1>/g;\n\n for (const match of body.matchAll(blockPattern)) {\n const blockXml = match[0] ?? \"\";\n if (blockXml.startsWith(\"<w:tbl\")) {\n const tableRows = [...blockXml.matchAll(/<w:tr\\b[\\s\\S]*?<\\/w:tr>/g)]\n .map((rowMatch) =>\n [...(rowMatch[0] ?? \"\").matchAll(/<w:tc\\b[\\s\\S]*?<\\/w:tc>/g)]\n .map((cellMatch) => extractOfficeParagraphText(cellMatch[0] ?? \"\"))\n .filter(Boolean),\n )\n .filter((cells) => cells.length > 0);\n const rows = tableRows\n .map((cells, rowIndex) => {\n return `Row ${rowIndex + 1}. ${cells\n .map(\n (cell, cellIndex) =>\n `${String.fromCharCode(65 + cellIndex)}: ${cell}`,\n )\n .join(\" | \")}`;\n })\n .filter(Boolean);\n const text = normalizeWhitespace(rows.join(\"\\n\"));\n if (!text) {\n continue;\n }\n const tableHeaders = tableRows[0];\n const tableRowCount = tableRows.length;\n const tableBodyRowCount =\n tableRowCount > 0 ? Math.max(0, tableRowCount - 1) : undefined;\n const tableColumnCount =\n Array.isArray(tableHeaders) && tableHeaders.length > 0\n ? tableHeaders.length\n : tableRows.reduce((max, row) => Math.max(max, row.length), 0) ||\n undefined;\n const tableHeaderText =\n Array.isArray(tableHeaders) && tableHeaders.length > 0\n ? tableHeaders.join(\" | \")\n : undefined;\n const tableSignature =\n Array.isArray(tableHeaders) && tableHeaders.length > 0\n ? tableHeaders.join(\" | \")\n : undefined;\n\n blocks.push({\n blockKind: \"table\",\n blockNumber: blocks.length + 1,\n ...(typeof tableBodyRowCount === \"number\" ? { tableBodyRowCount } : {}),\n ...(typeof tableColumnCount === \"number\" ? { tableColumnCount } : {}),\n ...(typeof tableHeaderText === \"string\" ? { tableHeaderText } : {}),\n ...(Array.isArray(tableHeaders) && tableHeaders.length > 0\n ? { tableHeaders }\n : {}),\n ...(typeof tableRowCount === \"number\" ? { tableRowCount } : {}),\n ...(typeof tableSignature === \"string\" ? { tableSignature } : {}),\n text,\n });\n continue;\n }\n\n const text = extractOfficeParagraphText(blockXml);\n if (!text) {\n continue;\n }\n\n const styleMatch = blockXml.match(\n /<w:pStyle\\b[^>]*w:val=\"([^\"]+)\"[^>]*\\/?>/i,\n );\n const style = (styleMatch?.[1] ?? \"\").toLowerCase();\n const headingMatch = style.match(/^heading([1-6])$/);\n const isListParagraph =\n /<w:numPr\\b/i.test(blockXml) ||\n style.includes(\"list\") ||\n style.includes(\"bullet\");\n const listLevelMatch = blockXml.match(\n /<w:ilvl\\b[^>]*w:val=\"(\\d+)\"[^>]*\\/?>/i,\n );\n const listLevel = listLevelMatch\n ? Number.parseInt(listLevelMatch[1] ?? \"0\", 10)\n : undefined;\n const blockKind: OfficeDocumentBlock[\"blockKind\"] =\n style === \"title\"\n ? \"title\"\n : headingMatch\n ? \"heading\"\n : isListParagraph\n ? \"list\"\n : \"paragraph\";\n const listPrefix =\n blockKind === \"list\"\n ? `${\" \".repeat(Math.max(0, listLevel ?? 0))}- `\n : \"\";\n const decoratedText =\n blockKind === \"list\" && !/^[-*]\\s/.test(text)\n ? `${listPrefix}${text}`\n : text;\n\n blocks.push({\n blockKind,\n blockNumber: blocks.length + 1,\n headingLevel: headingMatch\n ? Number.parseInt(headingMatch[1] ?? \"1\", 10)\n : undefined,\n listLevel:\n blockKind === \"list\" && Number.isFinite(listLevel ?? NaN)\n ? listLevel\n : undefined,\n style: style || undefined,\n text: decoratedText,\n });\n }\n\n return blocks;\n};\n\nconst officeDocumentParagraphs = (entries: RAGArchiveEntry[]) => {\n return officeDocumentBlocks(entries)\n .map((block) => block.text)\n .filter(Boolean);\n};\n\nconst officeDocumentText = (entries: RAGArchiveEntry[]) => {\n const blocks = officeDocumentBlocks(entries);\n if (blocks.length > 0) {\n return normalizeWhitespace(blocks.map((block) => block.text).join(\"\\n\\n\"));\n }\n\n const documentEntry = entries.find(\n (entry) => entry.path === \"word/document.xml\",\n );\n if (!documentEntry) {\n return \"\";\n }\n\n return extractXmlText(decodeUtf8(documentEntry.data));\n};\n\nconst officeDocumentSectionCount = (entries: RAGArchiveEntry[]) => {\n const count = officeDocumentBlocks(entries).length;\n\n return count > 0 ? count : undefined;\n};\n\nconst spreadsheetSharedStrings = (entries: RAGArchiveEntry[]) =>\n entries\n .filter((entry) => entry.path === \"xl/sharedStrings.xml\")\n .flatMap((entry) =>\n [...decodeUtf8(entry.data).matchAll(/<t[^>]*>([\\s\\S]*?)<\\/t>/g)].map(\n (match) => decodeHtmlEntities(match[1] ?? \"\"),\n ),\n );\n\nconst spreadsheetColumnLabel = (reference: string | undefined) => {\n const match = reference?.match(/([A-Z]+)/i);\n return match?.[1]?.toUpperCase() ?? \"\";\n};\n\nconst spreadsheetColumnIndex = (label: string | undefined) => {\n if (typeof label !== \"string\" || label.length === 0) {\n return undefined;\n }\n\n let index = 0;\n for (const character of label.toUpperCase()) {\n const code = character.charCodeAt(0);\n if (code < 65 || code > 90) {\n return undefined;\n }\n index = index * 26 + (code - 64);\n }\n\n return index > 0 ? index : undefined;\n};\n\nconst spreadsheetColumnLabelFromIndex = (index: number | undefined) => {\n if (typeof index !== \"number\" || !Number.isFinite(index) || index < 1) {\n return undefined;\n }\n\n let remaining = Math.floor(index);\n let label = \"\";\n while (remaining > 0) {\n const offset = (remaining - 1) % 26;\n label = String.fromCharCode(65 + offset) + label;\n remaining = Math.floor((remaining - 1) / 26);\n }\n\n return label || undefined;\n};\n\nconst spreadsheetColumnRange = (\n rows: Array<{ column: string; reference?: string; value: string }[]>,\n) => {\n let spreadsheetColumnStart: string | undefined;\n let spreadsheetColumnEnd: string | undefined;\n let startIndex: number | undefined;\n let endIndex: number | undefined;\n\n for (const row of rows) {\n for (const cell of row) {\n const columnIndex = spreadsheetColumnIndex(cell.column);\n if (typeof columnIndex !== \"number\" || !Number.isFinite(columnIndex)) {\n continue;\n }\n\n if (typeof startIndex !== \"number\" || columnIndex < startIndex) {\n startIndex = columnIndex;\n spreadsheetColumnStart = cell.column;\n }\n\n if (typeof endIndex !== \"number\" || columnIndex > endIndex) {\n endIndex = columnIndex;\n spreadsheetColumnEnd = cell.column;\n }\n }\n }\n\n return {\n spreadsheetColumnEnd,\n spreadsheetColumnStart,\n };\n};\n\nconst sortSpreadsheetCellsByColumn = <\n TCell extends { column: string; reference?: string },\n>(\n cells: TCell[],\n) =>\n [...cells].sort((left, right) => {\n const leftIndex = spreadsheetColumnIndex(left.column);\n const rightIndex = spreadsheetColumnIndex(right.column);\n if (\n typeof leftIndex === \"number\" &&\n Number.isFinite(leftIndex) &&\n typeof rightIndex === \"number\" &&\n Number.isFinite(rightIndex) &&\n leftIndex !== rightIndex\n ) {\n return leftIndex - rightIndex;\n }\n\n return (left.reference ?? left.column).localeCompare(\n right.reference ?? right.column,\n );\n });\n\ntype SpreadsheetTableColumnRange = {\n tableIndex: number;\n spreadsheetColumnStart?: string;\n spreadsheetColumnEnd?: string;\n};\n\ntype SpreadsheetTableHeaders = {\n tableIndex: number;\n spreadsheetHeaders: string[];\n};\n\ntype SpreadsheetWorksheetCell = {\n column: string;\n reference?: string;\n value: string;\n};\n\ntype SpreadsheetWorksheetRow = {\n cells: SpreadsheetWorksheetCell[];\n rowNumber: number;\n};\n\ntype SpreadsheetSheetText = {\n headers: string[];\n name: string;\n repeatedHeaderRowNumbers: number[];\n rowCount: number;\n sheetTableHeaders: SpreadsheetTableHeaders[];\n sheetTableColumnRanges: SpreadsheetTableColumnRange[];\n spreadsheetColumnEnd?: string;\n spreadsheetColumnStart?: string;\n tableCount: number;\n text: string;\n};\n\nconst spreadsheetResolveCellValue = (\n cellXml: string,\n sharedStrings: string[],\n) => {\n const inlineMatch = cellXml.match(\n /<is\\b[^>]*>[\\s\\S]*?<t[^>]*>([\\s\\S]*?)<\\/t>[\\s\\S]*?<\\/is>/i,\n );\n if (inlineMatch?.[1]) {\n return normalizeWhitespace(decodeHtmlEntities(inlineMatch[1]));\n }\n\n const valueMatch = cellXml.match(/<v>([\\s\\S]*?)<\\/v>/i);\n if (!valueMatch?.[1]) {\n return \"\";\n }\n\n const rawValue = decodeHtmlEntities(valueMatch[1]);\n const typeMatch = cellXml.match(/\\bt=\"([^\"]+)\"/i);\n if (typeMatch?.[1] === \"s\") {\n const index = Number(rawValue);\n return Number.isInteger(index) && sharedStrings[index]\n ? sharedStrings[index]!\n : rawValue;\n }\n\n return normalizeWhitespace(rawValue);\n};\n\nconst spreadsheetWorksheetRows = (\n worksheetXml: string,\n sharedStrings: string[],\n) =>\n [...worksheetXml.matchAll(/<row\\b([^>]*)>([\\s\\S]*?)<\\/row>/gi)]\n .map((rowMatch) => {\n const rowAttributes = rowMatch[1] ?? \"\";\n const rowXml = rowMatch[2] ?? \"\";\n const cells = sortSpreadsheetCellsByColumn(\n [...rowXml.matchAll(/<c\\b([^>]*)>([\\s\\S]*?)<\\/c>/gi)]\n .map((cellMatch) => {\n const attributes = cellMatch[1] ?? \"\";\n const cellBody = cellMatch[2] ?? \"\";\n const referenceMatch = attributes.match(/\\br=\"([^\"]+)\"/i);\n const reference = referenceMatch?.[1];\n const value = spreadsheetResolveCellValue(\n `<c${attributes}>${cellBody}</c>`,\n sharedStrings,\n );\n\n return {\n column: spreadsheetColumnLabel(reference),\n reference,\n value,\n };\n })\n .filter((cell) => cell.value),\n );\n const explicitRowNumber = Number.parseInt(\n rowAttributes.match(/\\br=\"(\\d+)\"/i)?.[1] ?? \"\",\n 10,\n );\n const fallbackRowNumber = Number.parseInt(\n cells[0]?.reference?.match(/\\d+/)?.[0] ?? \"\",\n 10,\n );\n\n return {\n cells,\n rowNumber: Number.isInteger(explicitRowNumber)\n ? explicitRowNumber\n : Number.isInteger(fallbackRowNumber)\n ? fallbackRowNumber\n : 0,\n };\n })\n .filter((row) => row.cells.length > 0)\n .map((row, index) => ({\n ...row,\n rowNumber: row.rowNumber > 0 ? row.rowNumber : index + 1,\n }));\n\nconst spreadsheetRowText = (\n row: { column: string; reference?: string; value: string }[],\n headers: string[],\n headerColumns?: string[],\n) => {\n const entries = row.map((cell, index) => {\n const exactHeaderIndex = Array.isArray(headerColumns)\n ? headerColumns.findIndex((column) => column === cell.column)\n : -1;\n const headerIndex = exactHeaderIndex >= 0 ? exactHeaderIndex : index;\n const header = headers[headerIndex];\n if (header) {\n return `${header}: ${cell.value}`;\n }\n\n return cell.column ? `${cell.column}: ${cell.value}` : cell.value;\n });\n\n return normalizeWhitespace(entries.join(\" | \"));\n};\n\nconst normalizeSpreadsheetHeaderValue = (value: string) =>\n normalizeWhitespace(value).toLowerCase();\n\nconst isSpreadsheetHeaderRow = (row: { value: string }[], headers: string[]) =>\n row.length === headers.length &&\n row.every(\n (cell, index) =>\n normalizeSpreadsheetHeaderValue(cell.value) ===\n normalizeSpreadsheetHeaderValue(headers[index] ?? \"\"),\n );\n\nconst isSpreadsheetHeaderLikeRow = (row: { value: string }[]) =>\n row.length > 0 &&\n row.every((cell) => {\n const normalized = normalizeSpreadsheetHeaderValue(cell.value);\n return (\n normalized.length > 0 &&\n /[a-z]/i.test(normalized) &&\n !/^\\d+(?:\\.\\d+)?$/.test(normalized)\n );\n });\n\nconst isSpreadsheetWeakHeaderRestartRow = (\n row: { value: string }[],\n headers: string[],\n) => {\n if (row.length === 0 || row.length !== headers.length) {\n return false;\n }\n\n const normalizedRow = row.map((cell) =>\n normalizeSpreadsheetHeaderValue(cell.value),\n );\n const normalizedHeaders = headers.map((value) =>\n normalizeSpreadsheetHeaderValue(value),\n );\n if (\n normalizedRow.every(\n (value, index) => value === (normalizedHeaders[index] ?? \"\"),\n )\n ) {\n return false;\n }\n\n const overlappingHeaderCount = normalizedRow.filter((value, index) => {\n const currentHeader = normalizedHeaders[index] ?? \"\";\n return value.length > 0 && value === currentHeader;\n }).length;\n const alphaishCellCount = normalizedRow.filter(\n (value) => value.length > 0 && /[a-z]/i.test(value),\n ).length;\n\n return (\n overlappingHeaderCount > 0 &&\n alphaishCellCount > 0 &&\n overlappingHeaderCount + alphaishCellCount >=\n Math.max(1, Math.ceil(row.length / 2))\n );\n};\n\nconst isSpreadsheetSparseHeaderRestartRow = (\n row: { column: string; value: string }[],\n headers: string[],\n headerColumns: string[],\n) => {\n if (\n row.length === 0 ||\n row.length >= headers.length ||\n headerColumns.length !== headers.length\n ) {\n return false;\n }\n\n const headerColumnSet = new Set(headerColumns);\n if (!row.every((cell) => headerColumnSet.has(cell.column))) {\n return false;\n }\n\n return row.every((cell) => {\n const normalized = normalizeSpreadsheetHeaderValue(cell.value);\n return (\n normalized.length > 0 &&\n /[a-z]/i.test(normalized) &&\n !/^\\d+(?:\\.\\d+)?$/.test(normalized)\n );\n });\n};\n\nconst isSpreadsheetSparseShiftedHeaderRestartRow = (\n row: { value: string }[],\n headers: string[],\n) => {\n if (row.length === 0 || row.length >= headers.length) {\n return false;\n }\n\n return row.every((cell) => {\n const normalized = normalizeSpreadsheetHeaderValue(cell.value);\n return (\n normalized.length > 0 &&\n /[a-z]/i.test(normalized) &&\n !/^\\d+(?:\\.\\d+)?$/.test(normalized)\n );\n });\n};\n\nconst buildSpreadsheetShiftedHeaderColumns = (\n row: { column: string; value: string }[],\n headerWidth: number,\n) => {\n const startIndex = spreadsheetColumnIndex(row[0]?.column);\n if (\n typeof startIndex !== \"number\" ||\n !Number.isFinite(startIndex) ||\n headerWidth < 1\n ) {\n return row.map((cell) => cell.column);\n }\n\n return Array.from({ length: headerWidth }, (_, index) =>\n spreadsheetColumnLabelFromIndex(startIndex + index),\n ).filter((value): value is string => typeof value === \"string\");\n};\n\nconst mergeSpreadsheetRestartHeaders = (\n row: { column: string; value: string }[],\n previousHeaders: string[],\n previousHeaderColumns: string[],\n) =>\n previousHeaderColumns.map((column, index) => {\n const currentCell = row.find((cell) => cell.column === column);\n const normalized = normalizeSpreadsheetHeaderValue(\n currentCell?.value ?? \"\",\n );\n if (normalized.length > 0) {\n return currentCell!.value;\n }\n\n return previousHeaders[index] ?? currentCell?.value ?? \"\";\n });\n\nconst spreadsheetSheetTexts = (\n entries: RAGArchiveEntry[],\n): SpreadsheetSheetText[] => {\n const sharedStrings = spreadsheetSharedStrings(entries);\n const sheetNames = spreadsheetSheetNames(entries);\n const sheetEntries = entries\n .filter(\n (entry) =>\n entry.path.startsWith(\"xl/worksheets/\") && entry.path.endsWith(\".xml\"),\n )\n .sort((left, right) => left.path.localeCompare(right.path));\n\n const sheets = sheetEntries.map<SpreadsheetSheetText | null>(\n (entry, index) => {\n const rows = spreadsheetWorksheetRows(\n decodeUtf8(entry.data),\n sharedStrings,\n );\n if (rows.length === 0) {\n return null;\n }\n\n const headers = rows[0]!.cells.map((cell) => cell.value);\n const { spreadsheetColumnEnd, spreadsheetColumnStart } =\n spreadsheetColumnRange(rows.map((row) => row.cells));\n const repeatedHeaderRowNumbers: number[] = [];\n const sheetTableHeaders: SpreadsheetTableHeaders[] = [];\n let tableCount = 1;\n const tableRows: Array<{\n rows: SpreadsheetWorksheetCell[][];\n tableIndex: number;\n }> = [];\n let currentTableRows: SpreadsheetWorksheetCell[][] | undefined;\n let currentTableIndex = 1;\n let currentTableHeaders = headers;\n let currentTableHeaderColumns = rows[0]!.cells.map((cell) => cell.column);\n let currentTableColumnStart = spreadsheetColumnRange([\n rows[0]!.cells,\n ]).spreadsheetColumnStart;\n let currentTableColumnEnd = spreadsheetColumnRange([\n rows[0]!.cells,\n ]).spreadsheetColumnEnd;\n const rowTexts = rows.map((rowEntry, rowIndex) => {\n const row = rowEntry.cells;\n const rowNumber = rowEntry.rowNumber;\n const rowColumnRange = spreadsheetColumnRange([row]);\n const previousRowNumber = rows[rowIndex - 1]?.rowNumber;\n const hasBlankRowGap =\n typeof previousRowNumber === \"number\" &&\n rowNumber > previousRowNumber + 1;\n const isShiftedHeaderRow =\n rowIndex > 0 &&\n row.length === currentTableHeaders.length &&\n isSpreadsheetHeaderLikeRow(row) &&\n (rowColumnRange.spreadsheetColumnStart !== currentTableColumnStart ||\n rowColumnRange.spreadsheetColumnEnd !== currentTableColumnEnd);\n const isBlankGapShiftedTableRestart =\n rowIndex > 0 &&\n hasBlankRowGap &&\n (rowColumnRange.spreadsheetColumnStart !== currentTableColumnStart ||\n rowColumnRange.spreadsheetColumnEnd !== currentTableColumnEnd);\n const isBlankGapHeaderRestart =\n rowIndex > 0 &&\n hasBlankRowGap &&\n rowColumnRange.spreadsheetColumnStart === currentTableColumnStart &&\n rowColumnRange.spreadsheetColumnEnd === currentTableColumnEnd &&\n ((isSpreadsheetHeaderLikeRow(row) &&\n !isSpreadsheetHeaderRow(row, currentTableHeaders)) ||\n isSpreadsheetWeakHeaderRestartRow(row, currentTableHeaders));\n const isBlankGapSparseHeaderRestart =\n rowIndex > 0 &&\n hasBlankRowGap &&\n isSpreadsheetSparseHeaderRestartRow(\n row,\n currentTableHeaders,\n currentTableHeaderColumns,\n );\n const isShiftedSparseHeaderRestart =\n rowIndex > 0 &&\n hasBlankRowGap &&\n (rowColumnRange.spreadsheetColumnStart !== currentTableColumnStart ||\n rowColumnRange.spreadsheetColumnEnd !== currentTableColumnEnd) &&\n isSpreadsheetSparseShiftedHeaderRestartRow(row, currentTableHeaders);\n const isAnySparseHeaderRestart =\n isBlankGapSparseHeaderRestart || isShiftedSparseHeaderRestart;\n const isHeaderRow =\n rowIndex === 0 ||\n isSpreadsheetHeaderRow(row, currentTableHeaders) ||\n isShiftedHeaderRow ||\n isBlankGapShiftedTableRestart ||\n isBlankGapHeaderRestart ||\n isAnySparseHeaderRestart;\n if (rowIndex > 0 && isHeaderRow) {\n repeatedHeaderRowNumbers.push(rowNumber);\n tableCount += 1;\n if (currentTableRows && currentTableRows.length > 0) {\n tableRows.push({\n rows: currentTableRows,\n tableIndex: currentTableIndex,\n });\n sheetTableHeaders.push({\n spreadsheetHeaders: currentTableHeaders,\n tableIndex: currentTableIndex,\n });\n }\n currentTableIndex = tableCount;\n const nextTableHeaderColumns = isShiftedSparseHeaderRestart\n ? buildSpreadsheetShiftedHeaderColumns(\n row,\n currentTableHeaderColumns.length,\n )\n : isBlankGapSparseHeaderRestart\n ? currentTableHeaderColumns\n : row.map((cell) => cell.column);\n currentTableHeaders = isAnySparseHeaderRestart\n ? mergeSpreadsheetRestartHeaders(\n row,\n currentTableHeaders,\n nextTableHeaderColumns,\n )\n : row.map((cell) => cell.value);\n currentTableHeaderColumns = nextTableHeaderColumns;\n currentTableColumnStart = isShiftedSparseHeaderRestart\n ? nextTableHeaderColumns[0]\n : isBlankGapSparseHeaderRestart\n ? currentTableColumnStart\n : rowColumnRange.spreadsheetColumnStart;\n currentTableColumnEnd = isShiftedSparseHeaderRestart\n ? nextTableHeaderColumns.at(-1)\n : isBlankGapSparseHeaderRestart\n ? currentTableColumnEnd\n : rowColumnRange.spreadsheetColumnEnd;\n currentTableRows = [row];\n } else {\n currentTableRows = [...(currentTableRows ?? []), row];\n }\n\n return normalizeWhitespace(\n `Row ${rowNumber}. ${spreadsheetRowText(\n row,\n isHeaderRow ? [] : currentTableHeaders,\n isHeaderRow ? [] : currentTableHeaderColumns,\n )}`,\n );\n });\n if (currentTableRows && currentTableRows.length > 0) {\n tableRows.push({\n rows: currentTableRows,\n tableIndex: currentTableIndex,\n });\n sheetTableHeaders.push({\n spreadsheetHeaders: currentTableHeaders,\n tableIndex: currentTableIndex,\n });\n }\n const sheetTableColumnRanges = tableRows.map(\n ({ rows, tableIndex }): SpreadsheetTableColumnRange => ({\n tableIndex,\n ...spreadsheetColumnRange(rows),\n }),\n );\n const text = normalizeWhitespace(rowTexts.join(\"\\n\"));\n if (!text) {\n return null;\n }\n\n return {\n headers,\n name: sheetNames[index] ?? `Sheet ${index + 1}`,\n repeatedHeaderRowNumbers,\n rowCount: rowTexts.length,\n sheetTableHeaders,\n sheetTableColumnRanges,\n spreadsheetColumnEnd,\n spreadsheetColumnStart,\n tableCount,\n text,\n };\n },\n );\n\n return sheets.filter(\n (entry): entry is SpreadsheetSheetText => entry !== null,\n );\n};\n\nconst spreadsheetText = (entries: RAGArchiveEntry[]) =>\n normalizeWhitespace(\n spreadsheetSheetTexts(entries)\n .map((sheet) => `Sheet ${sheet.name}\\n${sheet.text}`)\n .join(\"\\n\\n\"),\n );\n\nconst spreadsheetSheetNames = (entries: RAGArchiveEntry[]) =>\n entries\n .filter((entry) => entry.path === \"xl/workbook.xml\")\n .flatMap((entry) =>\n [...decodeUtf8(entry.data).matchAll(/<sheet[^>]*name=\"([^\"]+)\"/g)].map(\n (match) => match[1] ?? \"\",\n ),\n )\n .filter(Boolean);\n\nconst presentationNotesByIndex = (entries: RAGArchiveEntry[]) =>\n new Map(\n entries\n .filter(\n (entry) =>\n entry.path.startsWith(\"ppt/notesSlides/\") &&\n entry.path.endsWith(\".xml\"),\n )\n .sort((left, right) => left.path.localeCompare(right.path))\n .map((entry) => {\n const indexMatch = entry.path.match(/notesSlide(\\d+)\\.xml$/i);\n const index = Number(indexMatch?.[1] ?? \"0\") - 1;\n return [\n index,\n normalizeWhitespace(extractXmlText(decodeUtf8(entry.data))),\n ] as const;\n })\n .filter((entry) => entry[0] >= 0 && Boolean(entry[1])),\n );\n\nconst presentationSlides = (entries: RAGArchiveEntry[]) => {\n const notesByIndex = presentationNotesByIndex(entries);\n\n return entries\n .filter(\n (entry) =>\n entry.path.startsWith(\"ppt/slides/\") && entry.path.endsWith(\".xml\"),\n )\n .sort((left, right) => left.path.localeCompare(right.path))\n .map((entry, index) => {\n const textRuns = [\n ...decodeUtf8(entry.data).matchAll(/<a:t[^>]*>([\\s\\S]*?)<\\/a:t>/gi),\n ]\n .map((match) => normalizeWhitespace(decodeHtmlEntities(match[1] ?? \"\")))\n .filter(Boolean);\n const slideTitle = textRuns[0];\n const slideBodyText = normalizeWhitespace(textRuns.slice(1).join(\"\\n\"));\n const slideText = normalizeWhitespace(\n [slideTitle, slideBodyText].filter(Boolean).join(\"\\n\"),\n );\n const notesText = notesByIndex.get(index);\n const text = normalizeWhitespace(\n [slideText, notesText ? `Speaker notes: ${notesText}` : \"\"]\n .filter(Boolean)\n .join(\"\\n\"),\n );\n\n return {\n index,\n slideBodyText,\n slideTitle,\n notesText,\n text,\n };\n })\n .filter((slide) => Boolean(slide.text));\n};\n\nconst presentationText = (entries: RAGArchiveEntry[]) =>\n normalizeWhitespace(\n presentationSlides(entries)\n .map((slide) => slide.text)\n .join(\"\\n\\n\"),\n );\n\nconst presentationSlideCount = (entries: RAGArchiveEntry[]) =>\n entries.filter(\n (entry) =>\n entry.path.startsWith(\"ppt/slides/\") && entry.path.endsWith(\".xml\"),\n ).length;\n\nconst epubText = (entries: RAGArchiveEntry[]) => {\n const htmlEntries = entries.filter((entry) =>\n /\\.(xhtml|html|htm)$/i.test(entry.path),\n );\n\n return normalizeWhitespace(\n htmlEntries.map((entry) => stripHtml(decodeUtf8(entry.data))).join(\"\\n\\n\"),\n );\n};\n\nconst splitEmailMessage = (raw: string) => {\n const normalized = raw.replace(/\\r\\n?/g, \"\\n\");\n const separator = normalized.indexOf(\"\\n\\n\");\n if (separator < 0) {\n return {\n body: \"\",\n headerBlock: normalized,\n };\n }\n\n return {\n body: normalized.slice(separator + 2),\n headerBlock: normalized.slice(0, separator),\n };\n};\n\nconst EMAIL_MBOX_BOUNDARY_PATTERN = /^From [^\\s]+ .+$/;\n\nconst looksLikeMboxBoundary = (lines: string[], index: number) => {\n const line = lines[index];\n if (!EMAIL_MBOX_BOUNDARY_PATTERN.test(line ?? \"\")) {\n return false;\n }\n\n for (let offset = index + 1; offset < lines.length; offset += 1) {\n const candidate = lines[offset]?.trim() ?? \"\";\n if (!candidate) {\n return false;\n }\n if (/^[A-Za-z-]+:\\s+\\S+/.test(candidate)) {\n return true;\n }\n if (EMAIL_MBOX_BOUNDARY_PATTERN.test(candidate)) {\n return false;\n }\n }\n\n return false;\n};\n\nconst splitMboxMessages = (raw: string) => {\n const normalized = raw.replace(/\\r\\n?/g, \"\\n\");\n const lines = normalized.split(\"\\n\");\n const messages: string[] = [];\n let currentLines: string[] = [];\n\n const pushCurrent = () => {\n const text = currentLines.join(\"\\n\").trim();\n if (text) {\n messages.push(text);\n }\n currentLines = [];\n };\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index] ?? \"\";\n if (looksLikeMboxBoundary(lines, index)) {\n pushCurrent();\n continue;\n }\n\n currentLines.push(line.replace(/^>(>*From )/, \"$1\"));\n }\n\n pushCurrent();\n\n return messages;\n};\n\nconst buildMailboxStateMetadata = (stateFlags: string[]) => ({\n ...(stateFlags.length > 0 ? { emailMailboxStateFlags: stateFlags } : {}),\n emailMailboxIsDraft: stateFlags.includes(\"draft\"),\n emailMailboxIsFlagged: stateFlags.includes(\"flagged\"),\n emailMailboxIsPassed: stateFlags.includes(\"passed\"),\n emailMailboxIsRead: stateFlags.includes(\"read\"),\n emailMailboxIsReplied: stateFlags.includes(\"replied\"),\n emailMailboxIsTrashed: stateFlags.includes(\"trashed\"),\n emailMailboxIsUnread: stateFlags.includes(\"unread\"),\n});\n\nconst parseMailboxAttachmentNames = (value: string | undefined) => {\n if (!value) {\n return [];\n }\n\n return value\n .split(/[;,|]+/g)\n .map((entry) => normalizeWhitespace(entry))\n .filter(Boolean);\n};\n\nconst parseMailboxStateFlags = (value: string | undefined) => {\n if (!value) {\n return [];\n }\n\n const tokens = value\n .toLowerCase()\n .split(/[^a-z0-9]+/g)\n .map((token) => token.trim())\n .filter(Boolean);\n const flags = new Set<string>();\n const add = (flag: string) => flags.add(flag);\n\n for (const token of tokens) {\n switch (token) {\n case \"read\":\n case \"seen\":\n add(\"read\");\n break;\n case \"unread\":\n case \"unseen\":\n case \"new\":\n add(\"unread\");\n break;\n case \"flagged\":\n case \"starred\":\n case \"important\":\n add(\"flagged\");\n break;\n case \"replied\":\n case \"answered\":\n add(\"replied\");\n break;\n case \"draft\":\n add(\"draft\");\n break;\n case \"trashed\":\n case \"trash\":\n case \"deleted\":\n add(\"trashed\");\n break;\n case \"passed\":\n case \"forwarded\":\n add(\"passed\");\n break;\n }\n }\n\n if (!flags.has(\"read\") && !flags.has(\"unread\")) {\n flags.add(\"unread\");\n }\n\n return [...flags];\n};\n\nconst parseMailboxFolderMetadata = (value: string | undefined) => {\n if (!value) {\n return {};\n }\n\n const pathSegments = value\n .split(/[\\\\/]+/)\n .map((segment) => normalizeWhitespace(segment))\n .filter(Boolean);\n if (pathSegments.length === 0) {\n return {};\n }\n\n const familyKey = pathSegments\n .map((segment) => segment.toLowerCase())\n .join(\"/\");\n const leaf = pathSegments.at(-1);\n\n return {\n emailMailboxFamilyKey: familyKey,\n emailMailboxFolder: leaf,\n emailMailboxLeaf: leaf,\n emailMailboxPathDepth: pathSegments.length,\n emailMailboxPathSegments: pathSegments,\n };\n};\n\nconst MAILBOX_CONTAINER_DECORATOR_KEYS = new Set([\n \"folder\",\n \"mailbox\",\n \"flags\",\n \"sender\",\n \"sender-name\",\n \"sender-email\",\n \"recipients\",\n \"to-recipients\",\n \"cc-recipients\",\n \"bcc-recipients\",\n \"reply-to-recipients\",\n \"sent\",\n \"received\",\n \"internet-message-id\",\n \"client-submit-time\",\n \"delivery-time\",\n \"creation-time\",\n \"last-modified-time\",\n \"parent-message-id\",\n \"reference-chain\",\n \"message-class\",\n \"attachment\",\n \"attachment-content-id\",\n \"attachment-content-location\",\n \"attachment-content-type\",\n \"attachment-data\",\n \"attachment-disposition\",\n \"attachment-transfer-encoding\",\n \"attachments\",\n \"categories\",\n \"conversation-index\",\n \"conversation-topic\",\n \"has-attachments\",\n \"importance\",\n \"normalized-subject\",\n \"read\",\n \"unread\",\n \"flagged\",\n \"replied\",\n \"answered\",\n \"draft\",\n \"passed\",\n \"forwarded\",\n \"sensitivity\",\n \"thread-topic\",\n \"trashed\",\n \"deleted\",\n]);\n\nconst MAILBOX_CONTAINER_EMAIL_HEADER_KEYS = new Set([\n \"subject\",\n \"from\",\n \"to\",\n \"cc\",\n \"bcc\",\n \"reply-to\",\n \"thread-topic\",\n \"date\",\n \"message-id\",\n \"in-reply-to\",\n \"references\",\n \"content-type\",\n]);\n\nconst buildMailboxContainerSenderHeader = (\n leadingMetadata: Record<string, string>,\n) => {\n const explicitSender = normalizeWhitespace(leadingMetadata.sender ?? \"\");\n if (explicitSender) {\n return explicitSender;\n }\n\n const senderEmail = normalizeWhitespace(\n leadingMetadata[\"sender-email\"] ?? \"\",\n );\n const senderName = normalizeWhitespace(leadingMetadata[\"sender-name\"] ?? \"\");\n if (senderEmail && senderName) {\n return `${senderName} <${senderEmail}>`;\n }\n return senderEmail || senderName || undefined;\n};\n\nconst buildMailboxContainerSyntheticHeaders = (\n messageRaw: string,\n leadingMetadata: Record<string, string>,\n) => {\n const { headerBlock, body } = splitEmailMessage(messageRaw);\n const headers = parseHeaderBlock(headerBlock);\n const syntheticHeaderLines: string[] = [];\n const senderHeader = buildMailboxContainerSenderHeader(leadingMetadata);\n const toHeader = normalizeWhitespace(\n leadingMetadata[\"to-recipients\"] ?? leadingMetadata.recipients ?? \"\",\n );\n const ccHeader = normalizeWhitespace(leadingMetadata[\"cc-recipients\"] ?? \"\");\n const bccHeader = normalizeWhitespace(\n leadingMetadata[\"bcc-recipients\"] ?? \"\",\n );\n const replyToHeader = normalizeWhitespace(\n leadingMetadata[\"reply-to-recipients\"] ?? \"\",\n );\n const threadTopicHeader = normalizeWhitespace(\n leadingMetadata[\"conversation-topic\"] ??\n leadingMetadata[\"thread-topic\"] ??\n \"\",\n );\n const subjectHeader = normalizeWhitespace(\n leadingMetadata[\"normalized-subject\"] ?? \"\",\n );\n const conversationIdHeader = normalizeWhitespace(\n leadingMetadata[\"conversation-id\"] ?? \"\",\n );\n const threadIndexHeader = normalizeWhitespace(\n leadingMetadata[\"conversation-index\"] ?? \"\",\n );\n const inReplyToHeader = normalizeWhitespace(\n leadingMetadata[\"parent-message-id\"] ?? \"\",\n );\n const referencesHeader = normalizeWhitespace(\n leadingMetadata[\"reference-chain\"] ?? \"\",\n );\n const sentHeader = normalizeWhitespace(\n leadingMetadata.sent ??\n leadingMetadata[\"client-submit-time\"] ??\n leadingMetadata[\"creation-time\"] ??\n \"\",\n );\n const messageIdHeader = normalizeWhitespace(\n leadingMetadata[\"internet-message-id\"] ?? \"\",\n );\n\n if (!headers.has(\"from\") && senderHeader) {\n syntheticHeaderLines.push(`From: ${senderHeader}`);\n }\n if (!headers.has(\"to\") && toHeader) {\n syntheticHeaderLines.push(`To: ${toHeader}`);\n }\n if (!headers.has(\"cc\") && ccHeader) {\n syntheticHeaderLines.push(`Cc: ${ccHeader}`);\n }\n if (!headers.has(\"bcc\") && bccHeader) {\n syntheticHeaderLines.push(`Bcc: ${bccHeader}`);\n }\n if (!headers.has(\"reply-to\") && replyToHeader) {\n syntheticHeaderLines.push(`Reply-To: ${replyToHeader}`);\n }\n if (!headers.has(\"thread-topic\") && threadTopicHeader) {\n syntheticHeaderLines.push(`Thread-Topic: ${threadTopicHeader}`);\n }\n if (!headers.has(\"subject\") && subjectHeader) {\n syntheticHeaderLines.push(`Subject: ${subjectHeader}`);\n }\n if (!headers.has(\"conversation-id\") && conversationIdHeader) {\n syntheticHeaderLines.push(`Conversation-ID: ${conversationIdHeader}`);\n }\n if (!headers.has(\"thread-index\") && threadIndexHeader) {\n syntheticHeaderLines.push(`Thread-Index: ${threadIndexHeader}`);\n }\n if (!headers.has(\"in-reply-to\") && inReplyToHeader) {\n syntheticHeaderLines.push(`In-Reply-To: ${inReplyToHeader}`);\n }\n if (!headers.has(\"references\") && referencesHeader) {\n syntheticHeaderLines.push(`References: ${referencesHeader}`);\n }\n if (!headers.has(\"date\") && sentHeader) {\n syntheticHeaderLines.push(`Date: ${sentHeader}`);\n }\n if (!headers.has(\"message-id\") && messageIdHeader) {\n syntheticHeaderLines.push(`Message-ID: ${messageIdHeader}`);\n }\n\n if (syntheticHeaderLines.length === 0) {\n return messageRaw;\n }\n\n const normalizedHeaderBlock = normalizeWhitespace(headerBlock);\n const normalizedBody = normalizeWhitespace(body);\n return [\n ...syntheticHeaderLines,\n ...(normalizedHeaderBlock ? [normalizedHeaderBlock] : []),\n \"\",\n ...(normalizedBody ? [normalizedBody] : []),\n ]\n .join(\"\\n\")\n .trim();\n};\n\ntype ParsedMailboxContainerMessage = {\n attachments?: {\n contentId?: string;\n contentLocation?: string;\n contentType?: string;\n data: Uint8Array;\n dispositionType?: string;\n fileName: string;\n role: \"attached_message\" | \"file_attachment\" | \"inline_resource\";\n }[];\n metadata: Record<string, unknown>;\n raw: string;\n};\n\nconst decodeMailboxContainerAttachmentData = (\n value: string,\n encoding: string | undefined,\n) => {\n const normalized = normalizeWhitespace(value);\n if (!normalized) {\n return undefined;\n }\n\n const format = normalizeWhitespace(encoding ?? \"\").toLowerCase();\n try {\n if (format === \"base64\") {\n return Uint8Array.from(Buffer.from(normalized, \"base64\"));\n }\n if (format === \"hex\") {\n return Uint8Array.from(Buffer.from(normalized, \"hex\"));\n }\n return Uint8Array.from(Buffer.from(value, \"utf8\"));\n } catch {\n return undefined;\n }\n};\n\nconst extractMailboxRecoveredEmbeddedReferences = (raw: string) => {\n const { body } = splitEmailMessage(raw);\n const normalizedBody = body.replace(/\\r\\n?/g, \"\\n\");\n const contentIds = [\n ...new Set(\n Array.from(\n normalizedBody.matchAll(/cid:([A-Za-z0-9._%+\\-@:$]+)/gi),\n (match) => normalizeEmailContentId(match[1]),\n ).filter((value): value is string => typeof value === \"string\"),\n ),\n ];\n\n return {\n contentIds,\n contentLocations: normalizedBody\n .split(/\\s+/)\n .map((token) =>\n normalizeWhitespace(token.replace(/^[(\"'`<]+|[)\"'`>,.;:!?]+$/g, \"\")),\n )\n .filter((token) => token.includes(\"/\") || token.includes(\".\")),\n };\n};\n\nconst splitMailboxContainerMessages = (\n raw: string,\n): ParsedMailboxContainerMessage[] => {\n const normalized = raw.replace(/\\r\\n?/g, \"\\n\");\n const lines = normalized.split(\"\\n\");\n const segments: string[] = [];\n let currentLines: string[] = [];\n let sawBody = false;\n let seenEmailHeaders = new Set<string>();\n\n const pushCurrent = () => {\n const segment = normalizeWhitespace(currentLines.join(\"\\n\"));\n if (segment) {\n segments.push(segment);\n }\n currentLines = [];\n sawBody = false;\n seenEmailHeaders = new Set<string>();\n };\n\n for (const line of lines) {\n const headerMatch = line.match(/^([A-Za-z-]+):\\s*(.*)$/);\n const key = headerMatch?.[1]?.toLowerCase() ?? \"\";\n const isDecorator = MAILBOX_CONTAINER_DECORATOR_KEYS.has(key);\n const isEmailHeader = MAILBOX_CONTAINER_EMAIL_HEADER_KEYS.has(key);\n const startsNewDecoratedMessage =\n isDecorator &&\n currentLines.length > 0 &&\n (seenEmailHeaders.size > 0 || sawBody);\n const startsNewSubjectMessage =\n key === \"subject\" &&\n currentLines.length > 0 &&\n (sawBody ||\n (seenEmailHeaders.has(\"subject\") &&\n (seenEmailHeaders.has(\"message-id\") ||\n seenEmailHeaders.has(\"from\"))));\n\n if (startsNewDecoratedMessage || startsNewSubjectMessage) {\n pushCurrent();\n }\n\n currentLines.push(line);\n if (isEmailHeader) {\n seenEmailHeaders.add(key);\n continue;\n }\n if (line.trim().length === 0) {\n if (seenEmailHeaders.size > 0) {\n sawBody = true;\n }\n continue;\n }\n if (seenEmailHeaders.size > 0 && !isDecorator) {\n sawBody = true;\n }\n }\n\n pushCurrent();\n\n return segments\n .map((segment) => {\n const lines = segment.split(\"\\n\");\n const leadingMetadata: Record<string, string> = {};\n const attachmentDescriptorNames: string[] = [];\n const recoverableAttachments: NonNullable<\n ParsedMailboxContainerMessage[\"attachments\"]\n > = [];\n let currentAttachment:\n | {\n contentId?: string;\n contentLocation?: string;\n contentType?: string;\n dataValue?: string;\n dispositionType?: string;\n fileName?: string;\n transferEncoding?: string;\n }\n | undefined;\n const pushCurrentAttachment = () => {\n if (!currentAttachment?.fileName || !currentAttachment.dataValue) {\n currentAttachment = undefined;\n return;\n }\n\n const data = decodeMailboxContainerAttachmentData(\n currentAttachment.dataValue,\n currentAttachment.transferEncoding,\n );\n if (!data || data.length === 0) {\n currentAttachment = undefined;\n return;\n }\n\n const normalizedContentType = normalizeWhitespace(\n currentAttachment.contentType ?? \"\",\n ).toLowerCase();\n const role = normalizedContentType.includes(\"message/rfc822\")\n ? \"attached_message\"\n : currentAttachment.dispositionType === \"inline\" ||\n typeof currentAttachment.contentId === \"string\" ||\n typeof currentAttachment.contentLocation === \"string\"\n ? \"inline_resource\"\n : \"file_attachment\";\n recoverableAttachments.push({\n contentId: currentAttachment.contentId,\n contentLocation: currentAttachment.contentLocation,\n contentType: currentAttachment.contentType,\n data,\n dispositionType: currentAttachment.dispositionType,\n fileName: currentAttachment.fileName,\n role,\n });\n currentAttachment = undefined;\n };\n let startIndex = 0;\n for (; startIndex < lines.length; startIndex += 1) {\n const line = lines[startIndex] ?? \"\";\n const headerMatch = line.match(/^([A-Za-z-]+):\\s*(.*)$/);\n if (!headerMatch) {\n continue;\n }\n const key = headerMatch[1]?.toLowerCase() ?? \"\";\n if (\n key === \"subject\" ||\n key === \"from\" ||\n key === \"to\" ||\n key === \"cc\" ||\n key === \"bcc\" ||\n key === \"reply-to\" ||\n key === \"thread-topic\" ||\n key === \"date\" ||\n key === \"message-id\" ||\n key === \"in-reply-to\" ||\n key === \"references\" ||\n key === \"content-type\"\n ) {\n pushCurrentAttachment();\n break;\n }\n if (key === \"attachment\") {\n const names = parseMailboxAttachmentNames(headerMatch[2]);\n attachmentDescriptorNames.push(...names);\n if (names.length === 1) {\n pushCurrentAttachment();\n currentAttachment = { fileName: names[0] };\n }\n continue;\n }\n if (key === \"attachments\") {\n attachmentDescriptorNames.push(\n ...parseMailboxAttachmentNames(headerMatch[2]),\n );\n leadingMetadata[key] = headerMatch[2] ?? \"\";\n continue;\n }\n if (key === \"attachment-content-type\") {\n if (currentAttachment) {\n currentAttachment.contentType = headerMatch[2] ?? \"\";\n }\n continue;\n }\n if (key === \"attachment-transfer-encoding\") {\n if (currentAttachment) {\n currentAttachment.transferEncoding = headerMatch[2] ?? \"\";\n }\n continue;\n }\n if (key === \"attachment-data\") {\n if (currentAttachment) {\n currentAttachment.dataValue = headerMatch[2] ?? \"\";\n }\n continue;\n }\n if (key === \"attachment-disposition\") {\n if (currentAttachment) {\n currentAttachment.dispositionType = normalizeWhitespace(\n headerMatch[2] ?? \"\",\n ).toLowerCase();\n }\n continue;\n }\n if (key === \"attachment-content-id\") {\n if (currentAttachment) {\n currentAttachment.contentId = normalizeWhitespace(\n headerMatch[2] ?? \"\",\n );\n }\n continue;\n }\n if (key === \"attachment-content-location\") {\n if (currentAttachment) {\n currentAttachment.contentLocation = normalizeWhitespace(\n headerMatch[2] ?? \"\",\n );\n }\n continue;\n }\n if (\n key === \"folder\" ||\n key === \"mailbox\" ||\n key === \"sender\" ||\n key === \"sender-name\" ||\n key === \"sender-email\" ||\n key === \"recipients\" ||\n key === \"to-recipients\" ||\n key === \"cc-recipients\" ||\n key === \"bcc-recipients\" ||\n key === \"reply-to-recipients\" ||\n key === \"sent\" ||\n key === \"received\" ||\n key === \"internet-message-id\" ||\n key === \"client-submit-time\" ||\n key === \"delivery-time\" ||\n key === \"creation-time\" ||\n key === \"last-modified-time\" ||\n key === \"parent-message-id\" ||\n key === \"reference-chain\" ||\n key === \"message-class\" ||\n key === \"categories\" ||\n key === \"conversation-id\" ||\n key === \"conversation-index\" ||\n key === \"conversation-topic\" ||\n key === \"flags\" ||\n key === \"has-attachments\" ||\n key === \"importance\" ||\n key === \"normalized-subject\" ||\n key === \"read\" ||\n key === \"sensitivity\" ||\n key === \"thread-topic\" ||\n key === \"unread\" ||\n key === \"flagged\" ||\n key === \"replied\" ||\n key === \"answered\" ||\n key === \"draft\" ||\n key === \"passed\" ||\n key === \"forwarded\" ||\n key === \"trashed\" ||\n key === \"deleted\"\n ) {\n leadingMetadata[key] = headerMatch[2] ?? \"\";\n }\n }\n pushCurrentAttachment();\n\n const messageRaw = buildMailboxContainerSyntheticHeaders(\n normalizeWhitespace(lines.slice(startIndex).join(\"\\n\")),\n leadingMetadata,\n );\n const mailboxFolderValue =\n leadingMetadata.folder ?? leadingMetadata.mailbox;\n const attachmentNames = [\n ...new Set([\n ...attachmentDescriptorNames,\n ...parseMailboxAttachmentNames(leadingMetadata.attachments),\n ]),\n ];\n const categories = parseMailboxAttachmentNames(\n leadingMetadata.categories,\n );\n const explicitStateFlags = parseMailboxStateFlags(leadingMetadata.flags);\n const booleanStateFlags = parseMailboxStateFlags(\n [\n leadingMetadata.read === \"true\" ? \"read\" : undefined,\n leadingMetadata.unread === \"true\" ? \"unread\" : undefined,\n leadingMetadata.flagged === \"true\" ? \"flagged\" : undefined,\n leadingMetadata.replied === \"true\" ||\n leadingMetadata.answered === \"true\"\n ? \"replied\"\n : undefined,\n leadingMetadata.draft === \"true\" ? \"draft\" : undefined,\n leadingMetadata.passed === \"true\" ||\n leadingMetadata.forwarded === \"true\"\n ? \"passed\"\n : undefined,\n leadingMetadata.trashed === \"true\" ||\n leadingMetadata.deleted === \"true\"\n ? \"trashed\"\n : undefined,\n ]\n .filter((value): value is string => typeof value === \"string\")\n .join(\" \"),\n );\n const stateFlags = [\n ...new Set([...explicitStateFlags, ...booleanStateFlags]),\n ];\n\n return {\n metadata: {\n ...parseMailboxFolderMetadata(mailboxFolderValue),\n ...buildMailboxStateMetadata(stateFlags),\n ...(attachmentNames.length > 0\n ? {\n attachmentCount: attachmentNames.length,\n attachmentNames,\n hasAttachments: true,\n }\n : leadingMetadata[\"has-attachments\"] === \"true\"\n ? {\n attachmentCount: 1,\n hasAttachments: true,\n }\n : {}),\n ...(categories.length > 0 ? { emailCategories: categories } : {}),\n ...(typeof leadingMetadata.importance === \"string\" &&\n leadingMetadata.importance.trim().length > 0\n ? {\n emailImportance: normalizeWhitespace(\n leadingMetadata.importance,\n ),\n }\n : {}),\n ...(typeof leadingMetadata[\"normalized-subject\"] === \"string\" &&\n leadingMetadata[\"normalized-subject\"].trim().length > 0\n ? {\n emailNormalizedSubject: normalizeWhitespace(\n leadingMetadata[\"normalized-subject\"],\n ),\n }\n : {}),\n ...(typeof leadingMetadata.sensitivity === \"string\" &&\n leadingMetadata.sensitivity.trim().length > 0\n ? {\n emailSensitivity: normalizeWhitespace(\n leadingMetadata.sensitivity,\n ),\n }\n : {}),\n ...(typeof leadingMetadata[\"conversation-topic\"] === \"string\" &&\n leadingMetadata[\"conversation-topic\"].trim().length > 0\n ? {\n emailConversationTopic: normalizeWhitespace(\n leadingMetadata[\"conversation-topic\"],\n ),\n threadTopic: normalizeWhitespace(\n leadingMetadata[\"conversation-topic\"],\n ),\n }\n : typeof leadingMetadata[\"thread-topic\"] === \"string\" &&\n leadingMetadata[\"thread-topic\"].trim().length > 0\n ? {\n threadTopic: normalizeWhitespace(\n leadingMetadata[\"thread-topic\"],\n ),\n }\n : {}),\n ...(typeof leadingMetadata[\"conversation-id\"] === \"string\" &&\n leadingMetadata[\"conversation-id\"].trim().length > 0\n ? {\n emailConversationId: normalizeWhitespace(\n leadingMetadata[\"conversation-id\"],\n ),\n }\n : {}),\n ...(typeof leadingMetadata[\"conversation-index\"] === \"string\" &&\n leadingMetadata[\"conversation-index\"].trim().length > 0\n ? {\n emailConversationIndex: normalizeWhitespace(\n leadingMetadata[\"conversation-index\"],\n ),\n }\n : {}),\n ...(typeof leadingMetadata.sent === \"string\" &&\n leadingMetadata.sent.trim().length > 0\n ? {\n emailSentAt: normalizeWhitespace(leadingMetadata.sent),\n }\n : typeof leadingMetadata[\"client-submit-time\"] === \"string\" &&\n leadingMetadata[\"client-submit-time\"].trim().length > 0\n ? {\n emailSentAt: normalizeWhitespace(\n leadingMetadata[\"client-submit-time\"],\n ),\n }\n : typeof leadingMetadata[\"creation-time\"] === \"string\" &&\n leadingMetadata[\"creation-time\"].trim().length > 0\n ? {\n emailSentAt: normalizeWhitespace(\n leadingMetadata[\"creation-time\"],\n ),\n }\n : {}),\n ...(typeof leadingMetadata.received === \"string\" &&\n leadingMetadata.received.trim().length > 0\n ? {\n emailReceivedAt: normalizeWhitespace(leadingMetadata.received),\n }\n : typeof leadingMetadata[\"delivery-time\"] === \"string\" &&\n leadingMetadata[\"delivery-time\"].trim().length > 0\n ? {\n emailReceivedAt: normalizeWhitespace(\n leadingMetadata[\"delivery-time\"],\n ),\n }\n : {}),\n ...(typeof leadingMetadata[\"internet-message-id\"] === \"string\" &&\n leadingMetadata[\"internet-message-id\"].trim().length > 0\n ? {\n emailInternetMessageId: normalizeWhitespace(\n leadingMetadata[\"internet-message-id\"],\n ),\n }\n : {}),\n ...(typeof leadingMetadata[\"client-submit-time\"] === \"string\" &&\n leadingMetadata[\"client-submit-time\"].trim().length > 0\n ? {\n emailClientSubmitTime: normalizeWhitespace(\n leadingMetadata[\"client-submit-time\"],\n ),\n }\n : {}),\n ...(typeof leadingMetadata[\"delivery-time\"] === \"string\" &&\n leadingMetadata[\"delivery-time\"].trim().length > 0\n ? {\n emailDeliveryTime: normalizeWhitespace(\n leadingMetadata[\"delivery-time\"],\n ),\n }\n : {}),\n ...(typeof leadingMetadata[\"creation-time\"] === \"string\" &&\n leadingMetadata[\"creation-time\"].trim().length > 0\n ? {\n emailCreationTime: normalizeWhitespace(\n leadingMetadata[\"creation-time\"],\n ),\n }\n : {}),\n ...(typeof leadingMetadata[\"last-modified-time\"] === \"string\" &&\n leadingMetadata[\"last-modified-time\"].trim().length > 0\n ? {\n emailLastModifiedTime: normalizeWhitespace(\n leadingMetadata[\"last-modified-time\"],\n ),\n }\n : {}),\n ...(typeof leadingMetadata[\"message-class\"] === \"string\" &&\n leadingMetadata[\"message-class\"].trim().length > 0\n ? {\n emailMessageClass: normalizeWhitespace(\n leadingMetadata[\"message-class\"],\n ),\n }\n : {}),\n },\n ...(recoverableAttachments.length > 0\n ? { attachments: recoverableAttachments }\n : {}),\n raw: messageRaw,\n };\n })\n .filter((segment) => {\n const { headerBlock } = splitEmailMessage(segment.raw);\n const headers = parseHeaderBlock(headerBlock);\n return (\n headers.size >= 3 &&\n (headers.has(\"subject\") || headers.has(\"message-id\")) &&\n (headers.has(\"from\") || headers.has(\"to\") || headers.has(\"date\"))\n );\n });\n};\n\nconst decodeEmlxMessageData = (data: Uint8Array) => {\n if (data.length === 0) {\n return {\n hasTrailingMetadata: false,\n messageByteLength: 0,\n raw: \"\",\n };\n }\n\n let lineEnd = data.indexOf(0x0a);\n if (lineEnd < 0) {\n lineEnd = data.length;\n }\n const headerLine = Buffer.from(data.slice(0, lineEnd))\n .toString(\"utf8\")\n .replace(/\\r$/, \"\")\n .trim();\n const messageByteLength = Number.parseInt(headerLine, 10);\n if (!Number.isFinite(messageByteLength) || messageByteLength <= 0) {\n return {\n hasTrailingMetadata: false,\n messageByteLength: undefined,\n raw: decodeUtf8(data),\n };\n }\n\n let messageOffset = lineEnd;\n while (\n messageOffset < data.length &&\n (data[messageOffset] === 0x0a || data[messageOffset] === 0x0d)\n ) {\n messageOffset += 1;\n }\n const messageEnd = Math.min(data.length, messageOffset + messageByteLength);\n return {\n hasTrailingMetadata: messageEnd < data.length,\n messageByteLength,\n raw: decodeUtf8(data.slice(messageOffset, messageEnd)),\n };\n};\n\nconst MAILDIR_FOLDER_NAMES = new Set([\"cur\", \"new\"]);\n\nconst isLikelyRawEmailData = (raw: string) => {\n const { headerBlock } = splitEmailMessage(raw);\n if (!headerBlock || !headerBlock.includes(\":\")) {\n return false;\n }\n\n const headers = parseHeaderBlock(headerBlock);\n let score = 0;\n for (const name of [\n \"from\",\n \"to\",\n \"subject\",\n \"date\",\n \"message-id\",\n \"in-reply-to\",\n \"references\",\n \"content-type\",\n \"return-path\",\n \"delivered-to\",\n ]) {\n if (headers.has(name)) {\n score += 1;\n }\n }\n\n return score >= 2;\n};\n\nconst parseMaildirMetadata = (source: string | undefined) => {\n if (!source) {\n return undefined;\n }\n\n const normalized = source.replace(/\\\\/g, \"/\");\n const segments = normalized.split(\"/\").filter(Boolean);\n const folderIndex = segments.findLastIndex((segment) =>\n MAILDIR_FOLDER_NAMES.has(segment),\n );\n if (folderIndex < 0) {\n return undefined;\n }\n\n const folder = segments[folderIndex];\n const fileName = segments.at(-1);\n if (!folder || !fileName) {\n return undefined;\n }\n\n const [maildirKey, flagSuffix] = fileName.split(\":2,\");\n const flags = flagSuffix\n ? [...new Set(flagSuffix.split(\"\").filter(Boolean).sort())]\n : [];\n const stateFlags = [\n ...(flags.includes(\"D\") ? [\"draft\"] : []),\n ...(flags.includes(\"F\") ? [\"flagged\"] : []),\n ...(flags.includes(\"P\") ? [\"passed\"] : []),\n ...(flags.includes(\"R\") ? [\"replied\"] : []),\n ...(flags.includes(\"S\") ? [\"read\"] : [\"unread\"]),\n ...(flags.includes(\"T\") ? [\"trashed\"] : []),\n ];\n const pathSegments = segments.slice(0, folderIndex);\n const containerSource = pathSegments.join(\"/\");\n const familyKey = pathSegments\n .map((segment) => segment.trim().toLowerCase())\n .filter(Boolean)\n .join(\"/\");\n const leaf = pathSegments.at(-1);\n\n return {\n emailMailboxFormat: \"maildir\",\n emailMailboxFolder: folder,\n ...(familyKey ? { emailMailboxFamilyKey: familyKey } : {}),\n ...(leaf ? { emailMailboxLeaf: leaf } : {}),\n ...(pathSegments.length > 0\n ? {\n emailMailboxPathDepth: pathSegments.length,\n emailMailboxPathSegments: pathSegments,\n }\n : {}),\n ...(containerSource\n ? { emailMailboxContainerSource: containerSource }\n : {}),\n ...(flags.length > 0 ? { emailMailboxFlags: flags } : {}),\n ...(stateFlags.length > 0 ? { emailMailboxStateFlags: stateFlags } : {}),\n emailMailboxIsDraft: flags.includes(\"D\"),\n emailMailboxIsFlagged: flags.includes(\"F\"),\n emailMailboxIsPassed: flags.includes(\"P\"),\n emailMailboxIsRead: flags.includes(\"S\"),\n emailMailboxIsReplied: flags.includes(\"R\"),\n emailMailboxIsTrashed: flags.includes(\"T\"),\n emailMailboxIsUnread: !flags.includes(\"S\"),\n ...(maildirKey ? { emailMailboxKey: maildirKey } : {}),\n };\n};\n\n// RFC 2047 encoded-words: =?charset?B|Q?text?=. Undecoded, these poison every\n// header they appear in — subject, display names, and (because threadKey is\n// derived from the subject) thread grouping itself, which is how two unrelated\n// encoded subjects can collide or one thread can split.\nconst RFC2047_WORD = /=\\?([^?]+)\\?([BbQq])\\?([^?]*)\\?=/g;\n\nconst decodeEncodedWord = (charset: string, encoding: string, text: string) => {\n const bytes =\n encoding.toUpperCase() === \"B\"\n ? Buffer.from(text, \"base64\")\n : // Q differs from plain quoted-printable in exactly one way: `_` is a\n // space. latin1 for the same reason as decodeEmailPartBody.\n Buffer.from(decodeQuotedPrintable(text.replace(/_/g, \" \")), \"latin1\");\n\n try {\n return new TextDecoder(charset.trim().toLowerCase()).decode(bytes);\n } catch {\n // Unknown charset — utf8 is the best available guess, and still beats\n // leaving the raw =?...?= in place.\n return bytes.toString(\"utf8\");\n }\n};\n\nconst decodeRfc2047 = (value: string) =>\n value.includes(\"=?\")\n ? value\n // Whitespace separating two adjacent encoded-words is not content\n // (RFC 2047 s6.2), so it must go before decoding splits them apart.\n .replace(/\\?=\\s+=\\?/g, \"?==?\")\n .replace(RFC2047_WORD, (_match, charset: string, enc: string, text: string) =>\n decodeEncodedWord(charset, enc, text),\n )\n : value;\n\nconst parseHeaderBlock = (headerBlock: string) => {\n const unfolded = headerBlock.replace(/\\n[ \\t]+/g, \" \");\n const headers = new Map<string, string>();\n\n for (const line of unfolded.split(\"\\n\")) {\n const separator = line.indexOf(\":\");\n if (separator < 0) {\n continue;\n }\n\n headers.set(\n line.slice(0, separator).trim().toLowerCase(),\n decodeRfc2047(line.slice(separator + 1).trim()),\n );\n }\n\n return headers;\n};\n\nconst decodeQuotedPrintable = (value: string) =>\n value\n .replace(/=\\r?\\n/g, \"\")\n .replace(/=([0-9A-F]{2})/gi, (_match, hex: string) =>\n String.fromCharCode(parseInt(hex, 16)),\n );\n\nconst decodeEmailPartBody = (body: string, encoding: string | undefined) => {\n const normalizedEncoding = encoding?.toLowerCase();\n const trimmed = body.trim();\n\n if (normalizedEncoding === \"base64\") {\n return new Uint8Array(Buffer.from(trimmed.replace(/\\s+/g, \"\"), \"base64\"));\n }\n\n if (normalizedEncoding === \"quoted-printable\") {\n // latin1, NOT utf8. decodeQuotedPrintable turns each =XX into a char whose\n // code IS that byte, so the string is a byte sequence, not text. Reading it\n // back as utf8 re-encoded every char above 0x7F a second time: =C3=A9 (\"é\")\n // became U+00C3 U+00A9 and embedded as \"é\".\n return new Uint8Array(Buffer.from(decodeQuotedPrintable(body), \"latin1\"));\n }\n\n // latin1 to match decodeLatin1 above: the body string holds bytes, not text,\n // so utf8 here would re-encode everything above 0x7F a second time.\n return new Uint8Array(Buffer.from(body, \"latin1\"));\n};\n\n// Content-Type: text/plain; charset=\"iso-8859-1\"\nconst parseMimeCharset = (contentType: string | undefined) =>\n contentType?.match(/charset\\s*=\\s*\"?([^\";\\s]+)\"?/i)?.[1];\n\n/**\n * Decode a part's bytes using the charset it DECLARED, not utf8.\n *\n * Every part body was read as utf8 regardless, so a Shift-JIS, ISO-8859-1 or\n * windows-1252 message decoded into replacement characters and mojibake and was\n * embedded that way — unsearchable, and worse than useless in a vector.\n * Unknown or unsupported labels fall back to utf8, which is what the code did\n * unconditionally before, so this can only improve on the previous behaviour.\n */\nconst decodeWithCharset = (data: Uint8Array, contentType: string | undefined) => {\n const charset = parseMimeCharset(contentType)?.trim().toLowerCase();\n if (!charset || charset === \"utf-8\" || charset === \"utf8\") {\n return decodeUtf8(data);\n }\n\n try {\n return new TextDecoder(charset).decode(data);\n } catch {\n return decodeUtf8(data);\n }\n};\n\nconst parseMimeBoundary = (contentType: string | undefined) => {\n const match = contentType?.match(/boundary=\"?([^\";]+)\"?/i);\n return match?.[1];\n};\n\nconst EMAIL_ATTACHMENT_EXTENSION_BY_CONTENT_TYPE: Record<string, string> = {\n \"application/gzip\": \".gz\",\n \"application/json\": \".json\",\n \"application/pdf\": \".pdf\",\n \"application/rtf\": \".rtf\",\n \"application/zip\": \".zip\",\n \"application/x-gzip\": \".gz\",\n \"application/xml\": \".xml\",\n \"image/gif\": \".gif\",\n \"image/jpeg\": \".jpg\",\n \"image/png\": \".png\",\n \"image/svg+xml\": \".svg\",\n \"message/rfc822\": \".eml\",\n \"text/csv\": \".csv\",\n \"text/html\": \".html\",\n \"text/markdown\": \".md\",\n \"text/plain\": \".txt\",\n \"text/tsv\": \".tsv\",\n \"text/xml\": \".xml\",\n};\n\nconst normalizeEmailContentId = (value: string | undefined) => {\n const normalized = normalizeWhitespace(value ?? \"\")\n .replace(/^cid:/i, \"\")\n .replace(/^<|>$/g, \"\");\n return normalized ? `<${normalized}>` : undefined;\n};\n\nconst inferEmailAttachmentExtension = (contentType: string | undefined) => {\n if (!contentType) {\n return \".bin\";\n }\n\n const normalized = contentType.split(\";\")[0]?.trim().toLowerCase();\n return (\n (normalized\n ? EMAIL_ATTACHMENT_EXTENSION_BY_CONTENT_TYPE[normalized]\n : undefined) ?? \".bin\"\n );\n};\n\nconst inferEmailAttachmentName = ({\n contentId,\n contentLocation,\n contentType,\n filename,\n}: {\n contentId?: string;\n contentLocation?: string;\n contentType?: string;\n filename?: string;\n}) => {\n if (filename) {\n return filename;\n }\n\n if (contentLocation) {\n const locationHead = contentLocation.split(/[?#]/)[0];\n const normalizedLocation = locationHead?.split(/[/\\\\]/).pop()?.trim();\n if (normalizedLocation) {\n return normalizedLocation;\n }\n }\n\n const contentIdToken = contentId\n ?.replace(/^<|>$/g, \"\")\n .replace(/[^a-z0-9._-]+/gi, \"-\")\n .replace(/^-+|-+$/g, \"\");\n if (contentIdToken) {\n return `${contentIdToken}${inferEmailAttachmentExtension(contentType)}`;\n }\n\n return `email-attachment${inferEmailAttachmentExtension(contentType)}`;\n};\n\nconst parseEmailEmbeddedResourceReferences = (bodyHtml: string | undefined) => {\n if (!bodyHtml) {\n return {\n contentIds: [] as string[],\n contentLocations: [] as string[],\n };\n }\n\n const contentIds = [\n ...new Set(\n Array.from(bodyHtml.matchAll(/cid:([^\"'>\\s)]+)/gi), (match) =>\n normalizeEmailContentId(match[1]),\n ).filter((value): value is string => Boolean(value)),\n ),\n ];\n const contentLocations = [\n ...new Set(\n Array.from(\n bodyHtml.matchAll(/\\b(?:src|href)=[\"']([^\"'#][^\"']*)[\"']/gi),\n (match) => normalizeWhitespace(match[1] ?? \"\"),\n ).filter(\n (value) =>\n Boolean(value) && !/^(?:https?:|mailto:|data:|cid:)/i.test(value),\n ),\n ),\n ];\n\n return {\n contentIds,\n contentLocations,\n };\n};\n\ntype ParsedEmailAddressEntry = {\n address: string;\n displayName?: string;\n raw: string;\n};\n\nconst parseEmailAddressList = (value: string | undefined) => {\n if (!value) {\n return {\n addresses: [] as string[],\n displayNames: [] as string[],\n entries: [] as ParsedEmailAddressEntry[],\n };\n }\n\n const tokens = value\n .split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/)\n .map((entry) => normalizeWhitespace(entry))\n .filter(Boolean);\n const entries = tokens\n .map((entry) => {\n const angleMatch = entry.match(/^(.*?)(?:<([^>]+)>)$/);\n if (angleMatch) {\n const address = normalizeWhitespace(\n angleMatch[2]?.trim().toLowerCase() ?? \"\",\n );\n if (!address) {\n return undefined;\n }\n const displayName = normalizeWhitespace(\n (angleMatch[1] ?? \"\").trim().replace(/^\"+|\"+$/g, \"\"),\n );\n return {\n address,\n ...(displayName ? { displayName } : {}),\n raw: entry,\n };\n }\n const bareAddressMatch =\n entry.match(/\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/i)?.[0] ?? \"\";\n const address = normalizeWhitespace(\n bareAddressMatch.trim().toLowerCase(),\n );\n if (!address) {\n return undefined;\n }\n const displayName = normalizeWhitespace(\n entry.replace(bareAddressMatch, \"\").replace(/[()\"]/g, \"\"),\n );\n return {\n address,\n ...(displayName ? { displayName } : {}),\n raw: entry,\n };\n })\n .filter((entry): entry is ParsedEmailAddressEntry => Boolean(entry));\n\n return {\n addresses: entries.map((entry) => entry.address),\n displayNames: entries\n .map((entry) => entry.displayName)\n .filter((value): value is string => typeof value === \"string\"),\n entries,\n };\n};\n\nconst normalizeEmailTimestamp = (value: string | undefined) => {\n if (!value) {\n return undefined;\n }\n\n const candidates = [\n value,\n value\n .replace(/\\bat\\b/gi, \" \")\n .replace(/\\s+/g, \" \")\n .trim(),\n `${value\n .replace(/\\bat\\b/gi, \" \")\n .replace(/\\s+/g, \" \")\n .trim()} UTC`,\n ];\n\n for (const candidate of candidates) {\n const timestamp = Date.parse(candidate);\n if (Number.isFinite(timestamp)) {\n return new Date(timestamp).toISOString();\n }\n }\n\n return undefined;\n};\n\nconst parseEmailMessageLineage = (\n metadata?: Record<string, unknown>,\n): EmailMessageLineageEntry[] => {\n if (!Array.isArray(metadata?.emailMessageLineage)) {\n return [];\n }\n\n return metadata.emailMessageLineage\n .map((entry) => {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n return undefined;\n }\n\n const attachmentSource =\n typeof entry.attachmentSource === \"string\" &&\n entry.attachmentSource.length > 0\n ? entry.attachmentSource\n : undefined;\n const messageId =\n typeof entry.messageId === \"string\" && entry.messageId.length > 0\n ? entry.messageId\n : undefined;\n const messageSource =\n typeof entry.messageSource === \"string\" &&\n entry.messageSource.length > 0\n ? entry.messageSource\n : undefined;\n const messageSourceKind =\n typeof entry.messageSourceKind === \"string\" &&\n entry.messageSourceKind.length > 0\n ? entry.messageSourceKind\n : undefined;\n const threadKey =\n typeof entry.threadKey === \"string\" && entry.threadKey.length > 0\n ? entry.threadKey\n : undefined;\n\n if (\n !attachmentSource &&\n !messageId &&\n !messageSource &&\n !messageSourceKind &&\n !threadKey\n ) {\n return undefined;\n }\n\n return {\n ...(attachmentSource ? { attachmentSource } : {}),\n ...(messageId ? { messageId } : {}),\n ...(messageSource ? { messageSource } : {}),\n ...(messageSourceKind ? { messageSourceKind } : {}),\n ...(threadKey ? { threadKey } : {}),\n };\n })\n .filter((entry): entry is EmailMessageLineageEntry => Boolean(entry));\n};\n\nconst EMAIL_FORWARDED_HEADER_PATTERN =\n /^(?:from|sent|to|cc|bcc|subject|date|reply-to):\\s+/i;\nconst EMAIL_FORWARDED_SEPARATOR_PATTERN =\n /^-{2,}\\s*forwarded message\\s*-{2,}$/i;\nconst EMAIL_HTML_QUOTE_OPEN_TOKEN = \"[[ABS_EMAIL_QUOTE_OPEN]]\";\nconst EMAIL_HTML_QUOTE_CLOSE_TOKEN = \"[[ABS_EMAIL_QUOTE_CLOSE]]\";\n\n// Attribution lines that open a quoted reply, across the clients and locales\n// that actually appear in mail. Promoted from a host implementation that had\n// grown these cases in production; the previous single `on .+wrote:` pattern\n// missed the \"at <time>\" variant, Original Message rules, underscore rules and\n// every non-English client.\nconst EMAIL_ATTRIBUTION_PATTERNS = [\n /^on\\s.+\\bwrote:$/iu,\n /^on\\s.+\\bat\\s.+\\bwrote:$/iu,\n /^-+\\s*original message\\s*-+$/iu,\n // NB: no \"---- Forwarded message ----\" rule here. The host implementation\n // this was promoted from lumped that in with quoted history, but the\n // forwarded-separator handling below classifies it as forwarded_headers,\n // which is strictly more precise — claiming it here would regress that.\n /^_{5,}$/u,\n /^el\\s.+\\bescribió:$/iu,\n /^le\\s.+\\ba écrit\\s*:$/iu,\n];\n\n// RFC 3676 §4.3: a line of exactly \"-- \" opens the sender's signature block.\nconst EMAIL_SIGNATURE_DELIMITER = /^--\\s?$/u;\n\nconst classifyEmailBodyLine = (\n line: string,\n currentKind?: EmailBodySection[\"kind\"],\n): EmailBodySection[\"kind\"] | undefined => {\n const trimmed = line.trim();\n if (!trimmed) {\n return currentKind;\n }\n // Both are terminal: everything after the delimiter belongs to the block.\n if (currentKind === \"signature\") {\n return \"signature\";\n }\n if (EMAIL_SIGNATURE_DELIMITER.test(line)) {\n return \"signature\";\n }\n if (/^>+/.test(trimmed)) {\n return \"quoted_history\";\n }\n if (EMAIL_ATTRIBUTION_PATTERNS.some((pattern) => pattern.test(trimmed))) {\n return \"quoted_history\";\n }\n if (EMAIL_FORWARDED_SEPARATOR_PATTERN.test(trimmed)) {\n return \"forwarded_headers\";\n }\n if (\n currentKind === \"forwarded_headers\" &&\n (EMAIL_FORWARDED_HEADER_PATTERN.test(trimmed) ||\n /^[A-Za-z-]+:\\s+\\S+/.test(trimmed))\n ) {\n return \"forwarded_headers\";\n }\n if (EMAIL_FORWARDED_HEADER_PATTERN.test(trimmed)) {\n return \"forwarded_headers\";\n }\n return \"authored_text\";\n};\n\nconst parseEmailForwardedHeaderFields = (lines: string[]) => {\n const fields: Record<string, string> = {};\n\n for (const line of lines) {\n const trimmed = line.trim();\n const match = trimmed.match(/^([A-Za-z-]+):\\s*(.+)$/);\n if (!match) {\n continue;\n }\n const key = normalizeWhitespace(match[1] ?? \"\").toLowerCase();\n const value = normalizeWhitespace(match[2] ?? \"\");\n if (!key || !value) {\n continue;\n }\n fields[key] = value;\n }\n\n return Object.keys(fields).length > 0 ? fields : undefined;\n};\n\nconst parseForwardedHeaderMetadata = (lines: string[]) => {\n const forwardedHeaderFields = parseEmailForwardedHeaderFields(lines);\n const from = forwardedHeaderFields?.from;\n const to = forwardedHeaderFields?.to;\n const cc = forwardedHeaderFields?.cc;\n const bcc = forwardedHeaderFields?.bcc;\n const replyTo = forwardedHeaderFields?.[\"reply-to\"];\n const fromParsed = parseEmailAddressList(from);\n const toParsed = parseEmailAddressList(to);\n const ccParsed = parseEmailAddressList(cc);\n const bccParsed = parseEmailAddressList(bcc);\n const replyToParsed = parseEmailAddressList(replyTo);\n const forwardedParticipantAddresses = [\n ...new Set([\n ...fromParsed.addresses,\n ...toParsed.addresses,\n ...ccParsed.addresses,\n ...bccParsed.addresses,\n ...replyToParsed.addresses,\n ]),\n ];\n\n return {\n ...(forwardedHeaderFields ? { forwardedHeaderFields } : {}),\n ...(fromParsed.addresses[0]\n ? { forwardedFromAddress: fromParsed.addresses[0] }\n : {}),\n ...(fromParsed.displayNames[0]\n ? { forwardedFromDisplayName: fromParsed.displayNames[0] }\n : {}),\n ...(toParsed.addresses.length > 0\n ? { forwardedToAddresses: toParsed.addresses }\n : {}),\n ...(ccParsed.addresses.length > 0\n ? { forwardedCcAddresses: ccParsed.addresses }\n : {}),\n ...(bccParsed.addresses.length > 0\n ? { forwardedBccAddresses: bccParsed.addresses }\n : {}),\n ...(replyToParsed.addresses.length > 0\n ? { forwardedReplyToAddresses: replyToParsed.addresses }\n : {}),\n ...(forwardedParticipantAddresses.length > 0\n ? { forwardedParticipantAddresses }\n : {}),\n ...(forwardedHeaderFields?.subject\n ? { forwardedSubject: forwardedHeaderFields.subject }\n : {}),\n ...(forwardedHeaderFields?.date\n ? { forwardedDate: forwardedHeaderFields.date }\n : {}),\n ...(forwardedHeaderFields?.date\n ? {\n forwardedTimestamp: normalizeEmailTimestamp(\n forwardedHeaderFields.date,\n ),\n }\n : {}),\n };\n};\n\nconst getEmailQuotedDepth = (lines: string[]) => {\n let depth = 0;\n for (const line of lines) {\n const trimmed = line.trim();\n if (/^on .+wrote:$/i.test(trimmed)) {\n depth = Math.max(depth, 1);\n continue;\n }\n const quoteDepth = (trimmed.match(/^>+/)?.[0].length ?? 0) || 0;\n depth = Math.max(depth, quoteDepth);\n }\n return depth || undefined;\n};\n\nconst parseEmailBodySections = (text: string): EmailBodySection[] => {\n const normalized = text.replace(/\\r\\n?/g, \"\\n\");\n const lines = normalized.split(\"\\n\");\n const sections: EmailBodySection[] = [];\n let currentKind: EmailBodySection[\"kind\"] | undefined;\n let currentLines: string[] = [];\n\n const pushCurrent = () => {\n if (!currentKind) {\n currentLines = [];\n return;\n }\n const sectionText = normalizeWhitespace(currentLines.join(\"\\n\"));\n if (sectionText) {\n sections.push({\n ...(currentKind === \"quoted_history\"\n ? {\n quotedDepth: getEmailQuotedDepth(currentLines),\n }\n : {}),\n ...(currentKind === \"forwarded_headers\"\n ? parseForwardedHeaderMetadata(currentLines)\n : {}),\n kind: currentKind,\n text: sectionText,\n });\n }\n currentKind = undefined;\n currentLines = [];\n };\n\n for (const line of lines) {\n const nextKind = classifyEmailBodyLine(line, currentKind);\n if (!nextKind) {\n continue;\n }\n if (\n currentKind === \"forwarded_headers\" &&\n nextKind === \"forwarded_headers\" &&\n EMAIL_FORWARDED_SEPARATOR_PATTERN.test(line.trim()) &&\n currentLines.some((entry) => normalizeWhitespace(entry).length > 0)\n ) {\n pushCurrent();\n currentKind = \"forwarded_headers\";\n currentLines.push(line);\n continue;\n }\n if (!currentKind) {\n currentKind = nextKind;\n currentLines.push(line);\n continue;\n }\n if (nextKind !== currentKind) {\n pushCurrent();\n currentKind = nextKind;\n }\n currentLines.push(line);\n }\n\n pushCurrent();\n\n const merged: EmailBodySection[] = [];\n for (const section of sections) {\n const previous = merged.at(-1);\n if (\n previous &&\n previous.kind === section.kind &&\n section.kind !== \"forwarded_headers\"\n ) {\n previous.text = normalizeWhitespace(\n `${previous.text}\\n\\n${section.text}`,\n );\n if (\n section.kind === \"quoted_history\" &&\n typeof section.quotedDepth === \"number\"\n ) {\n previous.quotedDepth = Math.max(\n previous.quotedDepth ?? 0,\n section.quotedDepth,\n );\n }\n continue;\n }\n merged.push({ ...section });\n }\n\n return merged;\n};\n\nconst stripEmailHtml = (value: string) => {\n const focused = extractMainHtmlContent(value)\n .replace(/<blockquote\\b[^>]*>/gi, `\\n${EMAIL_HTML_QUOTE_OPEN_TOKEN}\\n`)\n .replace(/<\\/blockquote>/gi, `\\n${EMAIL_HTML_QUOTE_CLOSE_TOKEN}\\n`);\n const stripped = stripHtmlTags(focused);\n const lines = stripped.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const rendered: string[] = [];\n let quotedDepth = 0;\n\n for (const line of lines) {\n const trimmed = normalizeWhitespace(line);\n if (!trimmed) {\n if (rendered.at(-1) !== \"\") {\n rendered.push(\"\");\n }\n continue;\n }\n if (trimmed === EMAIL_HTML_QUOTE_OPEN_TOKEN) {\n quotedDepth += 1;\n continue;\n }\n if (trimmed === EMAIL_HTML_QUOTE_CLOSE_TOKEN) {\n quotedDepth = Math.max(quotedDepth - 1, 0);\n continue;\n }\n\n const prefixed =\n quotedDepth > 0 ? `${\">\".repeat(quotedDepth)} ${trimmed}` : trimmed;\n rendered.push(prefixed);\n }\n\n return normalizeWhitespace(rendered.join(\"\\n\").replace(/\\n{2,}/g, \"\\n\"));\n};\n\nconst scoreEmailBodyCandidate = (candidate: string | undefined) => {\n if (!candidate) {\n return Number.NEGATIVE_INFINITY;\n }\n\n const sections = parseEmailBodySections(candidate);\n // Rank by how much the candidate says that is NEW. This used to be inverted —\n // +8 per forwarded block and +6 per quoted block against +1 for authored text\n // — so for multipart/alternative the HTML part, which carries the whole\n // <blockquote> chain, always beat a clean text/plain part. That is backwards\n // for retrieval and for an embedding bill: it selected the copy with the most\n // duplicated history in it.\n const authoredChars = sections\n .filter((section) => section.kind === \"authored_text\")\n .reduce((total, section) => total + section.text.trim().length, 0);\n\n return authoredChars * 10 + Math.min(candidate.length, 5_000) / 1_000;\n};\n\nconst choosePreferredEmailBodyText = (\n htmlText: string | undefined,\n plainText: string | undefined,\n) => {\n const htmlScore = scoreEmailBodyCandidate(htmlText);\n const plainScore = scoreEmailBodyCandidate(plainText);\n\n return htmlScore >= plainScore ? htmlText : plainText;\n};\n\nconst chooseEmailBodyCandidate = (\n current: string | undefined,\n candidate: string | undefined,\n) => {\n if (!candidate) {\n return current;\n }\n if (!current) {\n return candidate;\n }\n\n return candidate.length > current.length ? candidate : current;\n};\n\nconst parseEmailMimeParts = (\n body: string,\n contentType: string | undefined,\n transferEncoding?: string,\n): {\n bodyHtml?: string;\n bodyText?: string;\n attachments: {\n contentId?: string;\n contentLocation?: string;\n contentType?: string;\n data: Uint8Array;\n dispositionType?: string;\n fileName: string;\n role: \"attached_message\" | \"file_attachment\" | \"inline_resource\";\n }[];\n} => {\n const attachments: {\n contentId?: string;\n contentLocation?: string;\n contentType?: string;\n data: Uint8Array;\n dispositionType?: string;\n fileName: string;\n role: \"attached_message\" | \"file_attachment\" | \"inline_resource\";\n }[] = [];\n let bodyText: string | undefined;\n let bodyHtml: string | undefined;\n const collectMimeParts = (\n partBody: string,\n partContentType: string | undefined,\n ) => {\n const boundary = parseMimeBoundary(partContentType);\n if (!boundary) {\n const htmlMatch = partBody.match(/<html[\\s\\S]*<\\/html>/i);\n bodyHtml = chooseEmailBodyCandidate(bodyHtml, htmlMatch?.[0]);\n bodyText = chooseEmailBodyCandidate(\n bodyText,\n htmlMatch ? undefined : partBody,\n );\n return;\n }\n\n for (const rawPart of partBody.split(`--${boundary}`)) {\n const trimmed = rawPart.trim();\n if (!trimmed || trimmed === \"--\") {\n continue;\n }\n\n const { body: nestedBody, headerBlock } = splitEmailMessage(trimmed);\n const headers = parseHeaderBlock(headerBlock);\n const nestedContentType = headers.get(\"content-type\");\n const disposition = headers.get(\"content-disposition\");\n const dispositionType = disposition?.split(\";\")[0]?.trim().toLowerCase();\n const transferEncoding = headers.get(\"content-transfer-encoding\");\n const contentId = normalizeEmailContentId(headers.get(\"content-id\"));\n const contentLocation = normalizeWhitespace(\n headers.get(\"content-location\") ?? \"\",\n );\n const filename =\n disposition?.match(/filename=\"?([^\";]+)\"?/i)?.[1] ??\n nestedContentType?.match(/name=\"?([^\";]+)\"?/i)?.[1];\n const decodedBytes = decodeEmailPartBody(nestedBody, transferEncoding);\n const decodedText = decodeWithCharset(decodedBytes, nestedContentType);\n const normalizedContentType = nestedContentType?.toLowerCase() ?? \"\";\n const isMultipart = normalizedContentType.startsWith(\"multipart/\");\n const isHtml = normalizedContentType.includes(\"text/html\");\n const isAttachedMessage =\n normalizedContentType.includes(\"message/rfc822\");\n const isPlain = normalizedContentType.includes(\"text/plain\");\n const isBodyLikeTextPart =\n (isHtml || isPlain) &&\n !filename &&\n dispositionType !== \"attachment\" &&\n !contentId &&\n !contentLocation;\n\n if (isMultipart) {\n collectMimeParts(decodedText, nestedContentType);\n continue;\n }\n\n if (isBodyLikeTextPart) {\n if (isHtml) {\n bodyHtml = chooseEmailBodyCandidate(bodyHtml, decodedText);\n continue;\n }\n if (isPlain) {\n bodyText = chooseEmailBodyCandidate(bodyText, decodedText);\n }\n continue;\n }\n\n if (\n filename ||\n dispositionType === \"attachment\" ||\n dispositionType === \"inline\" ||\n contentId ||\n contentLocation\n ) {\n attachments.push({\n contentId,\n contentLocation: contentLocation || undefined,\n contentType: nestedContentType,\n data: decodedBytes,\n dispositionType,\n fileName: inferEmailAttachmentName({\n contentId,\n contentLocation: contentLocation || undefined,\n contentType: nestedContentType,\n filename,\n }),\n role: isAttachedMessage\n ? \"attached_message\"\n : dispositionType === \"inline\" || contentId || contentLocation\n ? \"inline_resource\"\n : \"file_attachment\",\n });\n continue;\n }\n\n if (isHtml) {\n bodyHtml = chooseEmailBodyCandidate(bodyHtml, decodedText);\n continue;\n }\n\n if (isPlain) {\n bodyText = chooseEmailBodyCandidate(bodyText, decodedText);\n }\n }\n };\n\n // A single-part message has no boundary, so its body never reaches the\n // per-part loop below — which is the ONLY place content-transfer-encoding was\n // read. A base64 top-level body was therefore embedded as raw base64 text.\n // Decode it here, where the top-level header is still in scope.\n const topLevelBody =\n transferEncoding && !parseMimeBoundary(contentType)\n ? decodeWithCharset(\n decodeEmailPartBody(body, transferEncoding),\n contentType,\n )\n : body;\n collectMimeParts(topLevelBody, contentType);\n\n return {\n attachments,\n bodyHtml,\n bodyText,\n };\n};\n\n/**\n * The part of a mail body that this message ADDS — authored text only, with\n * quoted history, forwarded headers and the signature block dropped.\n *\n * Exposed rather than applied by default, deliberately. The extractor's own\n * output is a faithful reconstruction of the message (thread lineage and\n * forwarded chains are built from it), so stripping there would break that\n * contract. Embedding is the case that wants only the new content: in a thread,\n * the full text means message N re-embeds the whole of 1..N-1 plus a signature\n * and a confidentiality footer, every time — quadratic in thread length.\n *\n * A message that is nothing but a forward is kept whole rather than reduced to\n * nothing.\n */\nexport const authoredEmailText = (text: string) => {\n const authored = parseEmailBodySections(text)\n .filter((section) => section.kind === \"authored_text\")\n .map((section) => section.text.trim())\n .filter(Boolean)\n .join(\"\\n\\n\")\n .trim();\n\n return authored || text;\n};\n\nconst extractEmailText = (raw: string) => {\n const { body, headerBlock } = splitEmailMessage(raw);\n const headers = parseHeaderBlock(headerBlock);\n const parsed = parseEmailMimeParts(\n body,\n headers.get(\"content-type\"),\n headers.get(\"content-transfer-encoding\"),\n );\n const htmlText = parsed.bodyHtml\n ? stripEmailHtml(parsed.bodyHtml)\n : undefined;\n const plainText = parsed.bodyText\n ? normalizeWhitespace(parsed.bodyText)\n : undefined;\n const preferredBodyText = choosePreferredEmailBodyText(htmlText, plainText);\n if (preferredBodyText) {\n return preferredBodyText;\n }\n if (!body) {\n return normalizeWhitespace(raw.replace(/\\r\\n?/g, \"\\n\"));\n }\n\n const htmlMatch = body.match(/<html[\\s\\S]*<\\/html>/i);\n if (htmlMatch) {\n return stripEmailHtml(htmlMatch[0]);\n }\n\n return normalizeWhitespace(body);\n};\n\nconst parseEmailHeaders = (raw: string) => {\n const { headerBlock } = splitEmailMessage(raw);\n const headers = parseHeaderBlock(headerBlock);\n const getHeader = (name: string) => headers.get(name.toLowerCase());\n const from = getHeader(\"From\");\n const to = getHeader(\"To\");\n const cc = getHeader(\"Cc\");\n const bcc = getHeader(\"Bcc\");\n const replyTo = getHeader(\"Reply-To\");\n const fromParsed = parseEmailAddressList(from);\n const toParsed = parseEmailAddressList(to);\n const ccParsed = parseEmailAddressList(cc);\n const bccParsed = parseEmailAddressList(bcc);\n const replyToParsed = parseEmailAddressList(replyTo);\n const participantAddresses = [\n ...new Set([\n ...fromParsed.addresses,\n ...toParsed.addresses,\n ...ccParsed.addresses,\n ...bccParsed.addresses,\n ...replyToParsed.addresses,\n ]),\n ];\n const participantDisplayNames = [\n ...new Set([\n ...fromParsed.displayNames,\n ...toParsed.displayNames,\n ...ccParsed.displayNames,\n ...bccParsed.displayNames,\n ...replyToParsed.displayNames,\n ]),\n ];\n\n return {\n bcc,\n bccAddressEntries: bccParsed.entries,\n bccAddresses: bccParsed.addresses,\n cc,\n ccAddressEntries: ccParsed.entries,\n ccAddresses: ccParsed.addresses,\n contentType: getHeader(\"Content-Type\"),\n contentTransferEncoding: getHeader(\"Content-Transfer-Encoding\"),\n from,\n fromAddress: fromParsed.addresses[0],\n fromAddressEntries: fromParsed.entries,\n fromDisplayName: fromParsed.displayNames[0],\n inReplyTo: getHeader(\"In-Reply-To\"),\n messageId: getHeader(\"Message-ID\"),\n conversationId: getHeader(\"Conversation-ID\"),\n participantAddresses,\n participantDisplayNames,\n replyTo,\n replyToAddressEntries: replyToParsed.entries,\n replyToAddresses: replyToParsed.addresses,\n references: getHeader(\"References\"),\n subject: getHeader(\"Subject\"),\n threadIndex: getHeader(\"Thread-Index\"),\n threadTopic: getHeader(\"Thread-Topic\") ?? getHeader(\"Subject\"),\n to,\n toAddressEntries: toParsed.entries,\n toAddresses: toParsed.addresses,\n };\n};\n\nconst extractEmailDocumentsFromRawMessage = async (\n input: RAGFileExtractionInput,\n raw: string,\n options?: {\n metadata?: Record<string, unknown>;\n source?: string;\n title?: string;\n },\n) => {\n const headers = parseEmailHeaders(raw);\n const { body } = splitEmailMessage(raw);\n const parsed = parseEmailMimeParts(\n body,\n headers.contentType,\n headers.contentTransferEncoding,\n );\n const source =\n options?.source ??\n input.source ??\n input.path ??\n input.name ??\n `${slugify(input.title ?? DEFAULT_BINARY_NAME)}.eml`;\n const maildirMetadata = parseMaildirMetadata(source);\n const mergedMetadata = {\n ...(input.metadata ?? {}),\n ...(options?.metadata ?? {}),\n };\n const referenceChain = parseEmailReferenceChain(headers.references);\n const messageId = normalizeEmailMessageId(headers.messageId);\n const inReplyTo = normalizeEmailMessageId(headers.inReplyTo);\n const threadMessageIds = [\n ...new Set(\n [\n ...referenceChain.map((entry) => normalizeEmailMessageId(entry)),\n messageId,\n ].filter((value): value is string => typeof value === \"string\"),\n ),\n ];\n const replyDepth = Math.max(referenceChain.length, headers.inReplyTo ? 1 : 0);\n const threadIndex = headers.threadIndex;\n const threadTopic = headers.threadTopic ?? headers.subject;\n const conversationId =\n headers.conversationId ??\n (typeof mergedMetadata.emailConversationId === \"string\" &&\n mergedMetadata.emailConversationId.length > 0\n ? mergedMetadata.emailConversationId\n : undefined);\n const threadRootMessageId =\n normalizeEmailMessageId(referenceChain[0]) ?? inReplyTo ?? messageId;\n const threadKey =\n normalizeEmailThreadKey(threadTopic) ??\n normalizeEmailThreadKey(conversationId) ??\n normalizeEmailThreadKey(messageId) ??\n normalizeEmailThreadKey(headers.subject);\n const parentMessageId = normalizeEmailMessageId(\n typeof options?.metadata?.messageId === \"string\"\n ? options.metadata.messageId\n : typeof input.metadata?.messageId === \"string\"\n ? input.metadata.messageId\n : undefined,\n );\n const parentMessageSource =\n typeof options?.metadata?.emailMessageSource === \"string\" &&\n options.metadata.emailMessageSource.length > 0\n ? options.metadata.emailMessageSource\n : typeof input.metadata?.emailMessageSource === \"string\" &&\n input.metadata.emailMessageSource.length > 0\n ? input.metadata.emailMessageSource\n : undefined;\n const parentThreadKey =\n typeof options?.metadata?.threadKey === \"string\" &&\n options.metadata.threadKey.length > 0\n ? options.metadata.threadKey\n : typeof input.metadata?.threadKey === \"string\" &&\n input.metadata.threadKey.length > 0\n ? input.metadata.threadKey\n : undefined;\n const parentAttachmentSource =\n typeof options?.metadata?.emailAttachmentSource === \"string\" &&\n options.metadata.emailAttachmentSource.length > 0\n ? options.metadata.emailAttachmentSource\n : typeof input.metadata?.emailAttachmentSource === \"string\" &&\n input.metadata.emailAttachmentSource.length > 0\n ? input.metadata.emailAttachmentSource\n : undefined;\n const parentMessageLineage = parseEmailMessageLineage(mergedMetadata);\n const parentAncestorMessageIds = Array.isArray(\n mergedMetadata.emailAncestorMessageIds,\n )\n ? mergedMetadata.emailAncestorMessageIds.filter(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0,\n )\n : [];\n const parentAncestorMessageSources = Array.isArray(\n mergedMetadata.emailAncestorMessageSources,\n )\n ? mergedMetadata.emailAncestorMessageSources.filter(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0,\n )\n : [];\n const emailMessageLineage = parentAttachmentSource\n ? [\n ...parentMessageLineage,\n {\n attachmentSource: parentAttachmentSource,\n ...(parentMessageId ? { messageId: parentMessageId } : {}),\n ...(parentMessageSource\n ? { messageSource: parentMessageSource }\n : {}),\n ...(typeof mergedMetadata.emailMessageSourceKind === \"string\" &&\n mergedMetadata.emailMessageSourceKind.length > 0\n ? {\n messageSourceKind: mergedMetadata.emailMessageSourceKind,\n }\n : {}),\n ...(parentThreadKey ? { threadKey: parentThreadKey } : {}),\n },\n ]\n : parentMessageLineage;\n const emailMessageLineageMessageIds = emailMessageLineage\n .map((entry) => entry.messageId)\n .filter((value): value is string => typeof value === \"string\");\n const emailMessageLineageSources = emailMessageLineage\n .map((entry) => entry.messageSource)\n .filter((value): value is string => typeof value === \"string\");\n const emailMessageLineageAttachmentSources = emailMessageLineage\n .map((entry) => entry.attachmentSource)\n .filter((value): value is string => typeof value === \"string\");\n const emailMessageDepth = emailMessageLineage.length;\n const emailAncestorMessageIds = [\n ...new Set([...parentAncestorMessageIds, ...emailMessageLineageMessageIds]),\n ];\n const emailAncestorMessageSources = [\n ...new Set([\n ...parentAncestorMessageSources,\n ...emailMessageLineageSources,\n ]),\n ];\n const embeddedResourceReferences = parseEmailEmbeddedResourceReferences(\n parsed.bodyHtml,\n );\n const messageText = extractEmailText(raw);\n const emailBodySections = parseEmailBodySections(messageText);\n const forwardedSections = emailBodySections.filter(\n (section) => section.kind === \"forwarded_headers\",\n );\n const primaryForwardedSection = emailBodySections.find(\n (section) => section.kind === \"forwarded_headers\",\n );\n const forwardedHeaderFieldNames = [\n ...new Set(\n emailBodySections.flatMap((section) =>\n Object.keys(section.forwardedHeaderFields ?? {}),\n ),\n ),\n ];\n const quotedDepths = emailBodySections\n .map((section) =>\n typeof section.quotedDepth === \"number\" ? section.quotedDepth : undefined,\n )\n .filter((value): value is number => typeof value === \"number\");\n const inheritedAttachmentNames = Array.isArray(mergedMetadata.attachmentNames)\n ? mergedMetadata.attachmentNames.filter(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0,\n )\n : [];\n const attachmentNames =\n parsed.attachments.length > 0\n ? parsed.attachments.map((attachment) => attachment.fileName)\n : inheritedAttachmentNames;\n const attachmentCount =\n parsed.attachments.length > 0\n ? parsed.attachments.length\n : typeof mergedMetadata.attachmentCount === \"number\" &&\n Number.isFinite(mergedMetadata.attachmentCount)\n ? mergedMetadata.attachmentCount\n : attachmentNames.length;\n const messageMetadata = {\n ...mergedMetadata,\n ...(maildirMetadata ?? {}),\n attachmentCount,\n attachmentNames,\n emailKind: \"message\",\n fileKind: \"email\",\n ...(typeof conversationId === \"string\" && conversationId.trim().length > 0\n ? { emailConversationId: normalizeWhitespace(conversationId) }\n : {}),\n from: headers.from,\n fromAddress: headers.fromAddress,\n fromAddressEntries: headers.fromAddressEntries,\n fromDisplayName: headers.fromDisplayName,\n inReplyTo,\n messageId,\n emailAncestorMessageIds,\n emailAncestorMessageSources,\n emailContainerAttachmentSource: parentAttachmentSource,\n emailContainerMessageId: parentAttachmentSource\n ? parentMessageId\n : undefined,\n emailContainerMessageSource: parentAttachmentSource\n ? parentMessageSource\n : undefined,\n emailContainerThreadKey: parentAttachmentSource\n ? parentThreadKey\n : undefined,\n emailMessageLineage,\n emailMessageLineageAttachmentSources,\n emailMessageLineageCount: emailMessageLineage.length,\n emailMessageLineageMessageIds,\n emailMessageLineageSources,\n emailMessageDepth,\n emailMessageSourceKind: parentAttachmentSource\n ? \"attached_message\"\n : \"root_message\",\n references: headers.references,\n replyDepth,\n replyReferenceCount: referenceChain.length,\n threadMessageCount: threadMessageIds.length,\n threadMessageIds,\n ...(typeof threadIndex === \"string\" && threadIndex.trim().length > 0\n ? { threadIndex: normalizeWhitespace(threadIndex) }\n : {}),\n threadKey,\n threadRootMessageId,\n threadTopic,\n to: headers.to,\n toAddressEntries: headers.toAddressEntries,\n toAddresses: headers.toAddresses,\n hasAttachments: attachmentCount > 0,\n hasInlineResources: parsed.attachments.some(\n (attachment) => attachment.role === \"inline_resource\",\n ),\n embeddedResourceCount:\n embeddedResourceReferences.contentIds.length +\n embeddedResourceReferences.contentLocations.length,\n embeddedResourceContentIds: embeddedResourceReferences.contentIds,\n embeddedResourceContentLocations:\n embeddedResourceReferences.contentLocations,\n bcc: headers.bcc,\n bccAddressEntries: headers.bccAddressEntries,\n bccAddresses: headers.bccAddresses,\n cc: headers.cc,\n ccAddressEntries: headers.ccAddressEntries,\n ccAddresses: headers.ccAddresses,\n emailAuthoredSectionCount: emailBodySections.filter(\n (section) => section.kind === \"authored_text\",\n ).length,\n emailBodySectionCount: emailBodySections.length,\n emailBodySections,\n emailForwardedChainCount: forwardedSections.length,\n emailForwardedChains: forwardedSections.map((section, index) => ({\n ...(Array.isArray(section.forwardedBccAddresses) &&\n section.forwardedBccAddresses.length > 0\n ? { forwardedBccAddresses: section.forwardedBccAddresses }\n : {}),\n ...(Array.isArray(section.forwardedCcAddresses) &&\n section.forwardedCcAddresses.length > 0\n ? { forwardedCcAddresses: section.forwardedCcAddresses }\n : {}),\n ...(typeof section.forwardedDate === \"string\"\n ? { forwardedDate: section.forwardedDate }\n : {}),\n ...(typeof section.forwardedFromAddress === \"string\"\n ? { forwardedFromAddress: section.forwardedFromAddress }\n : {}),\n ...(typeof section.forwardedFromDisplayName === \"string\"\n ? {\n forwardedFromDisplayName: section.forwardedFromDisplayName,\n }\n : {}),\n ...(section.forwardedHeaderFields\n ? { forwardedHeaderFields: section.forwardedHeaderFields }\n : {}),\n ...(Array.isArray(section.forwardedParticipantAddresses) &&\n section.forwardedParticipantAddresses.length > 0\n ? {\n forwardedParticipantAddresses:\n section.forwardedParticipantAddresses,\n }\n : {}),\n ...(Array.isArray(section.forwardedReplyToAddresses) &&\n section.forwardedReplyToAddresses.length > 0\n ? {\n forwardedReplyToAddresses: section.forwardedReplyToAddresses,\n }\n : {}),\n ...(typeof section.forwardedSubject === \"string\"\n ? { forwardedSubject: section.forwardedSubject }\n : {}),\n ...(typeof section.forwardedTimestamp === \"string\"\n ? { forwardedTimestamp: section.forwardedTimestamp }\n : {}),\n ...(Array.isArray(section.forwardedToAddresses) &&\n section.forwardedToAddresses.length > 0\n ? { forwardedToAddresses: section.forwardedToAddresses }\n : {}),\n ordinal: index + 1,\n text: section.text,\n })),\n emailForwardedBccAddresses: primaryForwardedSection?.forwardedBccAddresses,\n emailForwardedCcAddresses: primaryForwardedSection?.forwardedCcAddresses,\n emailForwardedDate: primaryForwardedSection?.forwardedDate,\n emailForwardedFromAddress: primaryForwardedSection?.forwardedFromAddress,\n emailForwardedFromDisplayName:\n primaryForwardedSection?.forwardedFromDisplayName,\n emailForwardedHeaderSectionCount: emailBodySections.filter(\n (section) => section.kind === \"forwarded_headers\",\n ).length,\n emailForwardedHeaderFieldCount: forwardedHeaderFieldNames.length,\n emailForwardedHeaderFieldNames: forwardedHeaderFieldNames,\n emailForwardedHeaderFields: primaryForwardedSection?.forwardedHeaderFields,\n emailForwardedParticipantAddresses:\n primaryForwardedSection?.forwardedParticipantAddresses,\n emailForwardedReplyToAddresses:\n primaryForwardedSection?.forwardedReplyToAddresses,\n emailForwardedSubject: primaryForwardedSection?.forwardedSubject,\n emailForwardedTimestamp: primaryForwardedSection?.forwardedTimestamp,\n emailForwardedToAddresses: primaryForwardedSection?.forwardedToAddresses,\n emailQuotedMaxDepth:\n quotedDepths.length > 0 ? Math.max(...quotedDepths) : undefined,\n emailQuotedSectionCount: emailBodySections.filter(\n (section) => section.kind === \"quoted_history\",\n ).length,\n emailMessageSource: source,\n participantAddresses: headers.participantAddresses,\n participantDisplayNames: headers.participantDisplayNames,\n replyTo: headers.replyTo,\n replyToAddressEntries: headers.replyToAddressEntries,\n replyToAddresses: headers.replyToAddresses,\n };\n const attachmentDocuments = await Promise.all(\n parsed.attachments.map(async (attachment, index) => {\n const attachmentSource = `${source}#attachments/${attachment.fileName}`;\n const matchesEmbeddedReference =\n (attachment.contentId\n ? embeddedResourceReferences.contentIds.includes(attachment.contentId)\n : false) ||\n (attachment.contentLocation\n ? embeddedResourceReferences.contentLocations.includes(\n attachment.contentLocation,\n )\n : false);\n const documents = await extractRAGFileDocuments({\n chunking: input.chunking,\n contentType: attachment.contentType,\n data: attachment.data,\n extractorRegistry: input.extractorRegistry,\n format:\n inferFormatFromContentType(attachment.contentType ?? null) ??\n inferFormatFromName(attachment.fileName),\n metadata: {\n ...messageMetadata,\n attachmentIndex: index,\n attachmentContentId: attachment.contentId,\n attachmentContentLocation: attachment.contentLocation,\n attachmentDisposition: attachment.dispositionType ?? \"attachment\",\n attachmentEmbeddedReferenceMatched: matchesEmbeddedReference,\n attachmentName: attachment.fileName,\n emailAttachmentRole: attachment.role,\n emailAttachmentSource: attachmentSource,\n emailKind: \"attachment\",\n },\n name: attachment.fileName,\n source: attachmentSource,\n title: headers.subject\n ? `${headers.subject} · ${attachment.fileName}`\n : attachment.fileName,\n });\n\n return documents;\n }),\n );\n\n const messageDocument: RAGExtractedFileDocument = {\n chunking: input.chunking,\n contentType: input.contentType,\n format: \"text\",\n metadata: messageMetadata,\n source,\n text: messageText,\n title: options?.title ?? input.title ?? headers.subject,\n };\n\n return [messageDocument, ...attachmentDocuments.flat()];\n};\n\nconst normalizeEmailThreadKey = (value: string | undefined) => {\n const normalized = normalizeWhitespace(\n value\n // Repeat the anchor: /g does NOT re-apply an ^-anchored pattern, so\n // \"Re: Fwd: Re: Pilot\" only lost its first \"Re:\" and became a different\n // key from \"Pilot\" — the same conversation split across several threads.\n ?.replace(/^(?:(?:re|fw|fwd|aw|sv|vs|antw)\\s*:\\s*)+/i, \"\")\n ?.replace(/[<>]/g, \"\")\n ?.toLowerCase() ?? \"\",\n );\n\n return normalized || undefined;\n};\n\nconst normalizeEmailMessageId = (value: string | undefined) => {\n const normalized = normalizeWhitespace(value ?? \"\");\n return normalized || undefined;\n};\n\nconst parseEmailReferenceChain = (references: string | undefined) =>\n (references?.match(/<[^>]+>/g) ?? [])\n .map((entry) => normalizeWhitespace(entry))\n .filter(Boolean);\n\nconst stripRTF = (value: string) => {\n const withoutBinary = value.replace(/\\\\bin\\d+ [\\s\\S]*?(?=[\\\\}])/g, \" \");\n const withoutControls = withoutBinary\n .replace(/\\\\par[d]?/g, \"\\n\")\n .replace(/\\\\tab/g, \"\\t\")\n .replace(/\\\\'[0-9a-fA-F]{2}/g, (match) =>\n String.fromCharCode(parseInt(match.slice(2), 16)),\n )\n .replace(/\\\\[a-zA-Z]+\\d* ?/g, \" \")\n .replace(/[{}]/g, \" \");\n\n return normalizeWhitespace(withoutControls);\n};\n\nconst extractOrderedPrintableStrings = (data: Uint8Array) => {\n const text = Buffer.from(data).toString(\"latin1\");\n const asciiMatches =\n text.match(\n /[A-Za-z0-9][A-Za-z0-9 ,.;:!?@#$%^&*()[\\]_\\-+/\\\\'\"`~|=<>]{3,}/g,\n ) ?? [];\n const utf16Matches =\n Buffer.from(data)\n .toString(\"utf16le\")\n .match(/[A-Za-z0-9][A-Za-z0-9 ,.;:!?@#$%^&*()[\\]_\\-+/\\\\'\"`~|=<>]{3,}/g) ??\n [];\n\n const values = [...asciiMatches, ...utf16Matches].map((entry) =>\n normalizeWhitespace(entry),\n );\n return values.filter((entry) => entry.length >= 4).join(\"\\n\");\n};\n\nconst extractPrintableStrings = (data: Uint8Array) => {\n const values = extractOrderedPrintableStrings(data)\n .split(\"\\n\")\n .filter(Boolean);\n const unique = [...new Set(values)].filter((entry) => entry.length >= 4);\n return unique.join(\"\\n\");\n};\n\nconst ocrMetadata = (result: RAGOCRResult) => {\n const regions = result.regions?.filter(\n (region) => normalizeWhitespace(region.text ?? \"\").length > 0,\n );\n const pageNumbers = [\n ...new Set(\n (regions ?? [])\n .map((region) =>\n typeof region.page === \"number\" && region.page > 0\n ? region.page\n : undefined,\n )\n .filter((value): value is number => value !== undefined),\n ),\n ].sort((left, right) => left - right);\n const confidenceValues = [\n typeof result.confidence === \"number\" ? result.confidence : undefined,\n ...(regions ?? []).map((region) =>\n typeof region.confidence === \"number\" ? region.confidence : undefined,\n ),\n ].filter((value): value is number => value !== undefined);\n\n const averageConfidence =\n confidenceValues.length > 0\n ? confidenceValues.reduce((sum, value) => sum + value, 0) /\n confidenceValues.length\n : undefined;\n const minConfidence =\n confidenceValues.length > 0 ? Math.min(...confidenceValues) : undefined;\n const maxConfidence =\n confidenceValues.length > 0 ? Math.max(...confidenceValues) : undefined;\n const pageStart = pageNumbers[0];\n const pageEnd = pageNumbers.at(-1);\n\n return {\n ...(result.metadata ?? {}),\n ocrConfidence: result.confidence,\n ocrPageCount: pageNumbers.length,\n ...(typeof pageStart === \"number\" ? { ocrPageStart: pageStart } : {}),\n ...(typeof pageEnd === \"number\" ? { ocrPageEnd: pageEnd } : {}),\n ocrPageNumbers: pageNumbers,\n ocrRegionCount: regions?.length,\n ocrRegions: regions,\n ocrAverageConfidence: averageConfidence,\n ...(typeof minConfidence === \"number\"\n ? { ocrMinConfidence: minConfidence }\n : {}),\n ...(typeof maxConfidence === \"number\"\n ? { ocrMaxConfidence: maxConfidence }\n : {}),\n };\n};\n\nconst toOCRReadingOrder = (regions: NonNullable<RAGOCRResult[\"regions\"]>) =>\n [...regions].sort((left, right) => {\n const leftY =\n typeof left.y === \"number\" && Number.isFinite(left.y) ? left.y : 0;\n const rightY =\n typeof right.y === \"number\" && Number.isFinite(right.y) ? right.y : 0;\n const leftHeight =\n typeof left.height === \"number\" && Number.isFinite(left.height)\n ? left.height\n : 0;\n const rightHeight =\n typeof right.height === \"number\" && Number.isFinite(right.height)\n ? right.height\n : 0;\n const lineThreshold = Math.max(leftHeight, rightHeight, 12) * 0.6;\n if (Math.abs(leftY - rightY) > lineThreshold) {\n return leftY - rightY;\n }\n\n const leftX =\n typeof left.x === \"number\" && Number.isFinite(left.x) ? left.x : 0;\n const rightX =\n typeof right.x === \"number\" && Number.isFinite(right.x) ? right.x : 0;\n if (leftX !== rightX) {\n return leftX - rightX;\n }\n\n return normalizeWhitespace(left.text ?? \"\").localeCompare(\n normalizeWhitespace(right.text ?? \"\"),\n );\n });\n\nconst buildOCRReadingLinesText = (\n regions: NonNullable<RAGOCRResult[\"regions\"]>,\n) => {\n const ordered = toOCRReadingOrder(regions);\n const lines: Array<{\n y: number;\n height: number;\n segments: typeof ordered;\n }> = [];\n\n for (const region of ordered) {\n const text = normalizeWhitespace(region.text ?? \"\");\n if (!text) {\n continue;\n }\n const y =\n typeof region.y === \"number\" && Number.isFinite(region.y) ? region.y : 0;\n const height =\n typeof region.height === \"number\" && Number.isFinite(region.height)\n ? region.height\n : 12;\n const line = lines.at(-1);\n const threshold = Math.max(line?.height ?? 0, height, 12) * 0.6;\n if (line && Math.abs(y - line.y) <= threshold) {\n line.segments.push(region);\n line.y = Math.min(line.y, y);\n line.height = Math.max(line.height, height);\n continue;\n }\n\n lines.push({ height, segments: [region], y });\n }\n\n return normalizeWhitespace(\n lines\n .map((line) =>\n toOCRReadingOrder(line.segments)\n .map((segment) => normalizeWhitespace(segment.text ?? \"\"))\n .filter(Boolean)\n .join(\" \"),\n )\n .filter(Boolean)\n .join(\"\\n\"),\n );\n};\n\nconst splitOCRColumns = (regions: NonNullable<RAGOCRResult[\"regions\"]>) => {\n if (regions.length < 4) {\n return [regions];\n }\n\n const xAnchors = regions\n .map((region) =>\n typeof region.x === \"number\" && Number.isFinite(region.x)\n ? region.x\n : undefined,\n )\n .filter((value): value is number => typeof value === \"number\")\n .sort((left, right) => left - right);\n if (xAnchors.length < 4) {\n return [regions];\n }\n\n let largestGap = 0;\n let splitX: number | undefined;\n for (let index = 1; index < xAnchors.length; index += 1) {\n const gap = xAnchors[index]! - xAnchors[index - 1]!;\n if (gap > largestGap) {\n largestGap = gap;\n splitX = xAnchors[index - 1]! + gap / 2;\n }\n }\n\n if (!(largestGap >= 80) || typeof splitX !== \"number\") {\n return [regions];\n }\n\n const leftColumn = regions.filter((region) => {\n const x =\n typeof region.x === \"number\" && Number.isFinite(region.x) ? region.x : 0;\n return x < splitX;\n });\n const rightColumn = regions.filter((region) => {\n const x =\n typeof region.x === \"number\" && Number.isFinite(region.x) ? region.x : 0;\n return x >= splitX;\n });\n\n if (leftColumn.length < 2 || rightColumn.length < 2) {\n return [regions];\n }\n\n const yRange = (column: NonNullable<RAGOCRResult[\"regions\"]>) => {\n const ys = column\n .map((region) =>\n typeof region.y === \"number\" && Number.isFinite(region.y)\n ? region.y\n : undefined,\n )\n .filter((value): value is number => typeof value === \"number\");\n return ys.length > 0\n ? { max: Math.max(...ys), min: Math.min(...ys) }\n : undefined;\n };\n const leftRange = yRange(leftColumn);\n const rightRange = yRange(rightColumn);\n const overlapsVertically =\n leftRange &&\n rightRange &&\n Math.min(leftRange.max, rightRange.max) >=\n Math.max(leftRange.min, rightRange.min);\n if (!overlapsVertically) {\n return [regions];\n }\n\n return [leftColumn, rightColumn];\n};\n\nconst buildOCRReadingText = (regions: NonNullable<RAGOCRResult[\"regions\"]>) =>\n normalizeWhitespace(\n splitOCRColumns(regions)\n .map((column) => buildOCRReadingLinesText(column))\n .filter(Boolean)\n .join(\"\\n\\n\"),\n );\n\nconst getOCRPrimaryText = (result: RAGOCRResult) => {\n const regions = result.regions?.filter(\n (region) => normalizeWhitespace(region.text ?? \"\").length > 0,\n );\n const reconstructed =\n regions && regions.length > 0 ? buildOCRReadingText(regions) : \"\";\n\n return reconstructed || result.text;\n};\n\nconst buildOCRSummaryText = (result: RAGOCRResult) => {\n const regions =\n result.regions?.filter(\n (region) => normalizeWhitespace(region.text ?? \"\").length > 0,\n ) ?? [];\n if (regions.length === 0) {\n return {\n lowConfidenceRegionCount: 0,\n strongRegionCount: 0,\n summaryConfidenceThreshold: OCR_SUMMARY_CONFIDENCE_THRESHOLD,\n text: result.text,\n usedStrongRegionsOnly: false,\n };\n }\n\n const strongRegions = regions.filter(\n (region) =>\n typeof region.confidence !== \"number\" ||\n region.confidence >= OCR_SUMMARY_CONFIDENCE_THRESHOLD,\n );\n const lowConfidenceRegionCount = regions.length - strongRegions.length;\n const strongTextLength = strongRegions.reduce(\n (sum, region) => sum + normalizeWhitespace(region.text ?? \"\").length,\n 0,\n );\n const totalTextLength = regions.reduce(\n (sum, region) => sum + normalizeWhitespace(region.text ?? \"\").length,\n 0,\n );\n const strongCoverageRatio =\n totalTextLength > 0 ? strongTextLength / totalTextLength : 0;\n const useStrongRegionsOnly =\n strongRegions.length > 0 &&\n lowConfidenceRegionCount > 0 &&\n strongCoverageRatio >= OCR_SUMMARY_MIN_STRONG_TEXT_RATIO;\n const strongReconstructed = buildOCRReadingText(strongRegions);\n const allReconstructed = buildOCRReadingText(regions);\n\n return {\n lowConfidenceRegionCount,\n strongRegionCount: strongRegions.length,\n summaryConfidenceThreshold: OCR_SUMMARY_CONFIDENCE_THRESHOLD,\n text:\n (useStrongRegionsOnly ? strongReconstructed : allReconstructed) ||\n result.text,\n usedStrongRegionsOnly: useStrongRegionsOnly,\n };\n};\n\nconst ocrPageDocuments = (\n result: RAGOCRResult,\n input: RAGFileExtractionInput,\n baseMetadata: Record<string, unknown>,\n): RAGExtractedFileDocument[] => {\n const grouped = new Map<number, NonNullable<RAGOCRResult[\"regions\"]>>();\n for (const region of result.regions ?? []) {\n const text = normalizeWhitespace(region.text ?? \"\");\n if (!text || typeof region.page !== \"number\" || region.page < 1) {\n continue;\n }\n\n const bucket = grouped.get(region.page) ?? [];\n bucket.push({ ...region, text });\n grouped.set(region.page, bucket);\n }\n\n return [...grouped.entries()]\n .sort((left, right) => left[0] - right[0])\n .map(([pageNumber, regions]) => {\n const orderedRegions = toOCRReadingOrder(regions);\n const confidenceValues = regions\n .map((region) =>\n typeof region.confidence === \"number\" ? region.confidence : undefined,\n )\n .filter((value): value is number => value !== undefined);\n const averageConfidence =\n confidenceValues.length > 0\n ? confidenceValues.reduce((sum, value) => sum + value, 0) /\n confidenceValues.length\n : undefined;\n const minConfidence =\n confidenceValues.length > 0 ? Math.min(...confidenceValues) : undefined;\n const maxConfidence =\n confidenceValues.length > 0 ? Math.max(...confidenceValues) : undefined;\n\n return {\n chunking: input.chunking,\n contentType: input.contentType,\n format: \"text\",\n metadata: {\n ...(input.metadata ?? {}),\n ...baseMetadata,\n ocrPageAverageConfidence: averageConfidence,\n ocrPageConfidence: averageConfidence,\n ...(typeof minConfidence === \"number\"\n ? { ocrPageMinConfidence: minConfidence }\n : {}),\n ...(typeof maxConfidence === \"number\"\n ? { ocrPageMaxConfidence: maxConfidence }\n : {}),\n ocrRegionCount: regions.length,\n ocrRegionNumbers: regions.map((_region, index) => index + 1),\n ocrRegions: regions,\n pageNumber,\n pageIndex: pageNumber - 1,\n sourceNativeKind: \"pdf_page\",\n },\n source:\n input.source ??\n input.path ??\n input.name ??\n `${slugify(input.title ?? DEFAULT_BINARY_NAME)}.pdf`,\n text: normalizeWhitespace(\n `PDF page ${pageNumber} from ${\n input.title ?? input.name ?? input.path ?? DEFAULT_BINARY_NAME\n }.\\n${buildOCRReadingText(orderedRegions)}`,\n ),\n title: input.title\n ? `${input.title} · Page ${pageNumber}`\n : `Page ${pageNumber}`,\n };\n });\n};\n\nconst ocrRegionDocuments = (\n result: RAGOCRResult,\n input: RAGFileExtractionInput,\n baseMetadata: Record<string, unknown>,\n): RAGExtractedFileDocument[] => {\n const documents: RAGExtractedFileDocument[] = [];\n\n for (const [index, region] of (result.regions ?? []).entries()) {\n const text = normalizeWhitespace(region.text ?? \"\");\n if (!text || typeof region.page !== \"number\" || region.page < 1) {\n continue;\n }\n\n const pageNumber = region.page;\n const regionNumber = index + 1;\n\n documents.push({\n chunking: input.chunking,\n contentType: input.contentType,\n format: \"text\",\n metadata: {\n ...(input.metadata ?? {}),\n ...baseMetadata,\n ocrPageCount: 1,\n ocrPageNumbers: [pageNumber],\n ocrRegionConfidence: region.confidence,\n ocrRegionHeight: region.height,\n ocrRegionWidth: region.width,\n ocrRegionX: region.x,\n ocrRegionY: region.y,\n pageNumber,\n pageIndex: pageNumber - 1,\n regionIndex: index,\n regionNumber,\n sourceNativeKind: \"pdf_region\",\n },\n source:\n input.source ??\n input.path ??\n input.name ??\n `${slugify(input.title ?? DEFAULT_BINARY_NAME)}.pdf`,\n text: normalizeWhitespace(\n `PDF page ${pageNumber} region ${regionNumber} from ${\n input.title ?? input.name ?? input.path ?? DEFAULT_BINARY_NAME\n }.\\n${text}`,\n ),\n title: input.title\n ? `${input.title} · Page ${pageNumber} Region ${regionNumber}`\n : `Page ${pageNumber} Region ${regionNumber}`,\n });\n }\n\n return documents;\n};\n\nconst textExtractorSupports = (input: RAGFileExtractionInput) => {\n if (input.format) {\n return true;\n }\n\n const contentType = (input.contentType ?? \"\").toLowerCase();\n if (\n contentType.startsWith(\"text/\") ||\n contentType.includes(\"json\") ||\n contentType.includes(\"xml\") ||\n contentType.includes(\"yaml\") ||\n contentType.includes(\"javascript\")\n ) {\n return true;\n }\n\n if (TEXT_FILE_EXTENSIONS.has(inferExtensionFromInput(input))) {\n return true;\n }\n\n return isLikelyTextData(input.data);\n};\n\nconst pdfExtractorSupports = (input: RAGFileExtractionInput) => {\n const contentType = (input.contentType ?? \"\").toLowerCase();\n if (contentType.includes(\"application/pdf\")) {\n return true;\n }\n\n return PDF_FILE_EXTENSIONS.has(inferExtensionFromInput(input));\n};\n\nconst mediaExtractorSupports = (input: RAGFileExtractionInput) => {\n const contentType = (input.contentType ?? \"\").toLowerCase();\n if (contentType.startsWith(\"audio/\") || contentType.startsWith(\"video/\")) {\n return true;\n }\n\n const extension = inferExtensionFromInput(input);\n\n return (\n AUDIO_FILE_EXTENSIONS.has(extension) || VIDEO_FILE_EXTENSIONS.has(extension)\n );\n};\n\nconst officeExtractorSupports = (input: RAGFileExtractionInput) => {\n const extension = inferExtensionFromInput(input);\n\n return OFFICE_FILE_EXTENSIONS.has(extension);\n};\n\nconst legacyExtractorSupports = (input: RAGFileExtractionInput) =>\n LEGACY_DOCUMENT_FILE_EXTENSIONS.has(inferExtensionFromInput(input));\n\nconst epubExtractorSupports = (input: RAGFileExtractionInput) =>\n EPUB_FILE_EXTENSIONS.has(inferExtensionFromInput(input));\n\nconst emailExtractorSupports = (input: RAGFileExtractionInput) => {\n const contentType = (input.contentType ?? \"\").toLowerCase();\n if (\n contentType.includes(\"message/rfc822\") ||\n contentType.includes(\"application/eml\") ||\n contentType.includes(\"application/emlx\") ||\n contentType.includes(\"application/x-emlx\") ||\n contentType.includes(\"application/mbox\") ||\n contentType.includes(\"application/x-mbox\")\n ) {\n return true;\n }\n\n const extension = inferExtensionFromInput(input);\n if (EMAIL_FILE_EXTENSIONS.has(extension)) {\n return true;\n }\n\n if (\n parseMaildirMetadata(input.source ?? input.path ?? input.name) &&\n isLikelyRawEmailData(decodeUtf8(input.data))\n ) {\n return true;\n }\n\n return false;\n};\n\nconst mailboxContainerExtractorSupports = (input: RAGFileExtractionInput) => {\n const extension = inferExtensionFromInput(input);\n return MAILBOX_CONTAINER_FILE_EXTENSIONS.has(extension);\n};\n\nconst imageExtractorSupports = (input: RAGFileExtractionInput) => {\n const contentType = (input.contentType ?? \"\").toLowerCase();\n if (contentType.startsWith(\"image/\")) {\n return true;\n }\n\n return IMAGE_FILE_EXTENSIONS.has(inferExtensionFromInput(input));\n};\n\nconst archiveExtractorSupports = (input: RAGFileExtractionInput) => {\n const contentType = (input.contentType ?? \"\").toLowerCase();\n if (\n contentType.includes(\"zip\") ||\n contentType.includes(\"tar\") ||\n contentType.includes(\"gzip\") ||\n contentType.includes(\"x-gzip\")\n ) {\n return true;\n }\n\n return ARCHIVE_FILE_EXTENSIONS.has(inferExtensionFromInput(input));\n};\n\nexport const createBuiltinArchiveExpander = (): RAGArchiveExpander => ({\n name: \"builtin_archive\",\n expand: (input) => {\n const extension = inferExtensionFromInput(input);\n if (isZipData(input.data) || extension === \".zip\") {\n return {\n entries: unzipEntries(input.data),\n metadata: { archiveType: \"zip\" },\n };\n }\n\n if (TAR_FILE_EXTENSIONS.has(extension)) {\n return {\n entries: untarEntries(input.data),\n metadata: { archiveType: \"tar\" },\n };\n }\n\n if (GZIP_FILE_EXTENSIONS.has(extension)) {\n return {\n entries: decodeGzipEntries(input.data, input),\n metadata: {\n archiveType:\n extension === \".tgz\" ||\n (input.name ?? input.path ?? \"\").toLowerCase().endsWith(\".tar.gz\")\n ? \"tgz\"\n : \"gzip\",\n },\n };\n }\n\n throw new Error(\n `Builtin archive expander does not support ${inferNameFromInput(input)}`,\n );\n },\n});\nexport const createEmailExtractor = (): RAGFileExtractor => ({\n name: \"absolute_email\",\n supports: emailExtractorSupports,\n extract: async (input) => {\n const source =\n input.source ??\n input.path ??\n input.name ??\n `${slugify(input.title ?? DEFAULT_BINARY_NAME)}.eml`;\n const extension = inferExtensionFromInput(input);\n const emlx =\n extension === \".emlx\" ? decodeEmlxMessageData(input.data) : undefined;\n const raw = emlx?.raw ?? decodeLatin1(input.data);\n if (extension === \".emlx\") {\n return extractEmailDocumentsFromRawMessage(input, raw, {\n metadata: {\n emailMailboxContainerSource: source,\n emailMailboxFormat: \"emlx\",\n emailMailboxMessageCount: 1,\n emailMailboxMessageIndex: 0,\n emailMailboxMessageOrdinal: 1,\n ...(typeof emlx?.messageByteLength === \"number\"\n ? {\n emailMailboxMessageByteLength: emlx.messageByteLength,\n }\n : {}),\n ...(emlx?.hasTrailingMetadata\n ? { emailMailboxHasTrailingMetadata: true }\n : {}),\n },\n source,\n });\n }\n if (extension === \".mbox\" || extension === \".mbx\") {\n const messages = splitMboxMessages(raw);\n const documents = await Promise.all(\n messages.map((messageRaw, index) =>\n extractEmailDocumentsFromRawMessage(input, messageRaw, {\n metadata: {\n emailMailboxContainerSource: source,\n emailMailboxFormat: \"mbox\",\n emailMailboxMessageCount: messages.length,\n emailMailboxMessageIndex: index,\n emailMailboxMessageOrdinal: index + 1,\n },\n source: `${source}#messages/${index + 1}`,\n }),\n ),\n );\n\n return documents.flat();\n }\n\n return extractEmailDocumentsFromRawMessage(input, raw, { source });\n },\n});\nexport const createMailboxContainerExtractor = (): RAGFileExtractor => ({\n name: \"absolute_mailbox_container\",\n supports: mailboxContainerExtractorSupports,\n extract: async (input) => {\n const extension = inferExtensionFromInput(input);\n const format = extension.replace(/^\\./, \"\") || \"mailbox\";\n const source =\n input.source ??\n input.path ??\n input.name ??\n `${slugify(input.title ?? DEFAULT_BINARY_NAME)}${extension || \".mailbox\"}`;\n const raw = extractOrderedPrintableStrings(input.data);\n\n if (!raw) {\n throw new Error(\n `AbsoluteJS could not extract readable text from ${inferNameFromInput(input)}`,\n );\n }\n\n const messages = splitMailboxContainerMessages(raw);\n if (messages.length > 0) {\n const documents = await Promise.all(\n messages.map(async (message, index) => {\n const messageSource = `${source}#messages/${index + 1}`;\n const extractedDocuments = await extractEmailDocumentsFromRawMessage(\n input,\n message.raw,\n {\n metadata: {\n ...message.metadata,\n emailMailboxContainerSource: source,\n emailMailboxFormat: format,\n emailMailboxMessageCount: messages.length,\n emailMailboxMessageIndex: index,\n emailMailboxMessageOrdinal: index + 1,\n },\n source: messageSource,\n },\n );\n if (!message.attachments || message.attachments.length === 0) {\n return extractedDocuments;\n }\n\n const embeddedReferences = extractMailboxRecoveredEmbeddedReferences(\n message.raw,\n );\n const messageDocument = extractedDocuments.find(\n (document) => document.metadata?.emailKind === \"message\",\n );\n const baseMetadata = {\n ...(messageDocument?.metadata ?? {}),\n emailMailboxContainerSource: source,\n emailMailboxFormat: format,\n emailMailboxMessageCount: messages.length,\n emailMailboxMessageIndex: index,\n emailMailboxMessageOrdinal: index + 1,\n };\n const mailboxAttachmentDocuments = await Promise.all(\n message.attachments.map(async (attachment, attachmentIndex) =>\n extractRAGFileDocuments({\n chunking: input.chunking,\n contentType: attachment.contentType,\n data: attachment.data,\n extractorRegistry: input.extractorRegistry,\n format:\n inferFormatFromContentType(attachment.contentType ?? null) ??\n inferFormatFromName(attachment.fileName),\n metadata: {\n ...baseMetadata,\n attachmentIndex,\n attachmentContentId: attachment.contentId,\n attachmentContentLocation: attachment.contentLocation,\n attachmentDisposition:\n attachment.dispositionType ?? \"attachment\",\n attachmentEmbeddedReferenceMatched:\n (attachment.contentId\n ? embeddedReferences.contentIds.includes(\n attachment.contentId,\n )\n : false) ||\n (attachment.contentLocation\n ? embeddedReferences.contentLocations.includes(\n attachment.contentLocation,\n ) || message.raw.includes(attachment.contentLocation)\n : false),\n attachmentName: attachment.fileName,\n attachmentRecoveredFromMailboxContainer: true,\n emailAttachmentRole: attachment.role,\n emailAttachmentSource: `${messageSource}#attachments/${attachment.fileName}`,\n emailKind: \"attachment\",\n },\n name: attachment.fileName,\n source: `${messageSource}#attachments/${attachment.fileName}`,\n title: messageDocument?.title\n ? `${messageDocument.title} · ${attachment.fileName}`\n : attachment.fileName,\n }),\n ),\n );\n\n return [...extractedDocuments, ...mailboxAttachmentDocuments.flat()];\n }),\n );\n\n return documents.flat();\n }\n\n return {\n chunking: input.chunking,\n contentType: input.contentType,\n format: \"text\",\n metadata: {\n ...(input.metadata ?? {}),\n emailMailboxContainerSource: source,\n emailMailboxFormat: format,\n fileKind: \"email_mailbox\",\n },\n source,\n text: raw,\n title: input.title,\n };\n },\n});\nexport const createEPUBExtractor = (): RAGFileExtractor => ({\n name: \"absolute_epub\",\n supports: epubExtractorSupports,\n extract: (input) => {\n const text = epubText(unzipEntries(input.data));\n if (!text) {\n throw new Error(\n `AbsoluteJS could not extract readable text from ${inferNameFromInput(input)}`,\n );\n }\n\n return {\n chunking: input.chunking,\n contentType: input.contentType,\n format: \"text\",\n metadata: {\n ...(input.metadata ?? {}),\n fileKind: \"epub\",\n },\n source:\n input.source ??\n input.path ??\n input.name ??\n `${slugify(input.title ?? DEFAULT_BINARY_NAME)}.epub`,\n text,\n title: input.title,\n };\n },\n});\nexport const createLegacyDocumentExtractor = (): RAGFileExtractor => ({\n name: \"absolute_legacy_document\",\n supports: legacyExtractorSupports,\n extract: (input) => {\n const extension = inferExtensionFromInput(input);\n const raw =\n extension === \".rtf\"\n ? stripRTF(Buffer.from(input.data).toString(\"latin1\"))\n : extractPrintableStrings(input.data);\n\n if (!raw) {\n throw new Error(\n `AbsoluteJS could not extract readable text from ${inferNameFromInput(input)}`,\n );\n }\n\n const fileKind =\n extension === \".msg\"\n ? \"email\"\n : extension === \".rtf\"\n ? \"rtf\"\n : \"legacy_office\";\n\n return {\n chunking: input.chunking,\n contentType: input.contentType,\n format: \"text\",\n metadata: {\n ...(input.metadata ?? {}),\n fileKind,\n legacyFormat: extension.replace(/^\\./, \"\"),\n },\n source:\n input.source ??\n input.path ??\n input.name ??\n `${slugify(input.title ?? DEFAULT_BINARY_NAME)}${extension || \".legacy\"}`,\n text: raw,\n title: input.title,\n };\n },\n});\nexport const createOfficeDocumentExtractor = (): RAGFileExtractor => ({\n name: \"absolute_office_document\",\n supports: officeExtractorSupports,\n extract: (input) => {\n const extension = inferExtensionFromInput(input);\n const entries = unzipEntries(input.data);\n let text = \"\";\n let officeMetadata: Record<string, unknown> = {};\n let structuredDocuments: RAGExtractedFileDocument[] = [];\n if (extension === \".docx\" || extension === \".odt\") {\n const officeBlocks = officeDocumentBlocks(entries);\n text = officeDocumentText(entries);\n officeMetadata = {\n officeBlocks,\n sectionCount: officeDocumentSectionCount(entries),\n };\n } else if (extension === \".xlsx\" || extension === \".ods\") {\n text = spreadsheetText(entries);\n const sheets = spreadsheetSheetTexts(entries);\n const workbookLabel =\n input.title ??\n input.name ??\n input.path ??\n input.source ??\n DEFAULT_BINARY_NAME;\n officeMetadata = {\n sheetNames: spreadsheetSheetNames(entries),\n };\n structuredDocuments = sheets.map((sheet, index) => ({\n chunking: input.chunking,\n contentType: input.contentType,\n format: \"text\",\n metadata: {\n ...(input.metadata ?? {}),\n fileKind: \"office\",\n ...officeMetadata,\n repeatedHeaderRowNumbers: sheet.repeatedHeaderRowNumbers,\n sheetColumnEnd: sheet.spreadsheetColumnEnd,\n sheetColumnStart: sheet.spreadsheetColumnStart,\n sheetHeaders: sheet.headers,\n sheetTableHeaders: sheet.sheetTableHeaders,\n sheetTableColumnRanges: sheet.sheetTableColumnRanges,\n sourceNativeKind: \"spreadsheet_sheet\",\n sheetIndex: index,\n sheetName: sheet.name,\n sheetRowCount: sheet.rowCount,\n sheetTableCount: sheet.tableCount,\n },\n source:\n input.source ??\n input.path ??\n input.name ??\n `${slugify(input.title ?? DEFAULT_BINARY_NAME)}${extension || \".office\"}`,\n text: normalizeWhitespace(\n `Spreadsheet workbook ${workbookLabel}. ` +\n `Worksheet ${index + 1}. ` +\n `Workbook sheet named ${sheet.name}. ` +\n `Sheet ${sheet.name} from spreadsheet workbook ${workbookLabel}.` +\n `\\n${sheet.text}`,\n ),\n title: input.title\n ? `${input.title} · Sheet ${sheet.name}`\n : `Sheet ${sheet.name}`,\n }));\n } else if (extension === \".pptx\" || extension === \".odp\") {\n text = presentationText(entries);\n const slides = presentationSlides(entries);\n officeMetadata = {\n slideCount: presentationSlideCount(entries),\n };\n structuredDocuments = slides.map((slide) => ({\n chunking: input.chunking,\n contentType: input.contentType,\n format: \"text\",\n metadata: {\n ...(input.metadata ?? {}),\n fileKind: \"office\",\n ...officeMetadata,\n ...(slide.slideBodyText\n ? { slideBodyText: slide.slideBodyText }\n : {}),\n ...(slide.notesText ? { slideNotesText: slide.notesText } : {}),\n ...(slide.slideTitle ? { slideTitle: slide.slideTitle } : {}),\n sourceNativeKind: \"presentation_slide\",\n slideIndex: slide.index,\n slideNumber: slide.index + 1,\n },\n source:\n input.source ??\n input.path ??\n input.name ??\n `${slugify(input.title ?? DEFAULT_BINARY_NAME)}${extension || \".office\"}`,\n text: normalizeWhitespace(\n `Presentation slide ${slide.index + 1} from ${\n input.title ?? input.name ?? input.path ?? DEFAULT_BINARY_NAME\n }.\\n${slide.text}`,\n ),\n title: input.title\n ? `${input.title} · Slide ${slide.index + 1}`\n : `Slide ${slide.index + 1}`,\n }));\n }\n\n if (!text) {\n throw new Error(\n `AbsoluteJS could not extract readable text from ${inferNameFromInput(input)}`,\n );\n }\n\n const summaryDocument: RAGExtractedFileDocument = {\n chunking: input.chunking,\n contentType: input.contentType,\n format: \"text\",\n metadata: {\n ...(input.metadata ?? {}),\n fileKind: \"office\",\n ...officeMetadata,\n },\n source:\n input.source ??\n input.path ??\n input.name ??\n `${slugify(input.title ?? DEFAULT_BINARY_NAME)}${extension || \".office\"}`,\n text,\n title: input.title,\n };\n\n return [summaryDocument, ...structuredDocuments];\n },\n});\nexport const createRAGArchiveExpander = (expander: RAGArchiveExpander) =>\n expander;\nexport const createRAGFileExtractor = (extractor: RAGFileExtractor) =>\n extractor;\nexport const createRAGFileExtractorRegistry = (\n registry: RAGFileExtractorRegistryLike,\n) => registry;\nexport const createRAGChunkingRegistry = (registry: RAGChunkingRegistryLike) =>\n registry;\nexport const createRAGImageOCRExtractor = (\n provider: RAGOCRProvider,\n): RAGFileExtractor => ({\n name: `absolute_image_ocr:${provider.name}`,\n supports: imageExtractorSupports,\n extract: async (input) => {\n const result = await provider.extractText(input);\n const summary = buildOCRSummaryText(result);\n\n return {\n chunking: input.chunking,\n contentType: input.contentType,\n format: \"text\",\n metadata: {\n ...(input.metadata ?? {}),\n ...ocrMetadata(result),\n ocrLowConfidenceRegionCount: summary.lowConfidenceRegionCount,\n ocrStrongRegionCount: summary.strongRegionCount,\n ocrSummaryConfidenceThreshold: summary.summaryConfidenceThreshold,\n ocrSummaryUsedStrongRegionsOnly: summary.usedStrongRegionsOnly,\n fileKind: \"image\",\n sourceNativeKind: \"image_ocr\",\n },\n source:\n input.source ??\n input.path ??\n input.name ??\n `${slugify(input.title ?? DEFAULT_BINARY_NAME)}.image.txt`,\n text: summary.text,\n title: result.title ?? input.title,\n };\n },\n});\nexport const createRAGMediaFileExtractor = (\n transcriber: RAGMediaTranscriber,\n): RAGFileExtractor => ({\n name: `absolute_media:${transcriber.name}`,\n supports: mediaExtractorSupports,\n extract: async (input) => {\n const result = await transcriber.transcribe(input);\n const rawSegments = sortMediaTranscriptSegments(\n (result.segments ?? [])\n .filter((segment): segment is RAGMediaTranscriptSegmentWithText => {\n if (!segment || typeof segment !== \"object\") {\n return false;\n }\n\n return normalizeWhitespace(segment.text ?? \"\").length > 0;\n })\n .map(normalizeMediaSegment),\n );\n const segmentGroups = groupTranscriptSegments(rawSegments);\n const source =\n input.source ??\n input.path ??\n input.name ??\n `${slugify(input.title ?? DEFAULT_BINARY_NAME)}.media.txt`;\n const baseDocumentId = slugify(\n source || input.title || input.name || input.path || DEFAULT_BINARY_NAME,\n );\n const segmentCount = rawSegments.length;\n const mediaDurationMs = rawSegments.reduce<number | undefined>(\n (max, segment) => {\n const endMs =\n typeof segment.endMs === \"number\" ? segment.endMs : undefined;\n if (typeof endMs !== \"number\") {\n return max;\n }\n return typeof max === \"number\" ? Math.max(max, endMs) : endMs;\n },\n undefined,\n );\n const mediaSpeakers = [\n ...new Set(\n rawSegments\n .map((segment) => normalizeMediaSpeaker(segment.speaker))\n .filter((value): value is string => typeof value === \"string\"),\n ),\n ];\n const segmentDocuments: RAGExtractedFileDocument[] = [];\n let previousGroupEndMs: number | undefined;\n for (const [index, segmentGroup] of segmentGroups.entries()) {\n const { endMs, startMs } = buildMediaTimestampBoundary(\n segmentGroup.segments,\n );\n const groupText = normalizeWhitespace(\n segmentGroup.segments\n .map((segment) => normalizeWhitespace(segment.text ?? \"\"))\n .filter((value) => value.length > 0)\n .join(\" \"),\n );\n if (!groupText) {\n continue;\n }\n\n const mediaSegmentStartMs = startMs;\n const mediaSegmentEndMs = endMs;\n const startLabel = formatMediaTimestampForIngest(startMs);\n const endLabel = formatMediaTimestampForIngest(endMs);\n const mediaKind =\n typeof result.metadata?.mediaKind === \"string\"\n ? result.metadata.mediaKind\n : \"media\";\n const mediaSegmentGapFromPreviousMs = buildMediaSegmentGapFromPrevious(\n startMs,\n previousGroupEndMs,\n );\n const nextSegmentGroup = segmentGroups[index + 1];\n const nextSegmentGroupStartMs = nextSegmentGroup\n ? buildMediaTimestampBoundary(nextSegmentGroup.segments).startMs\n : undefined;\n const mediaSegmentGapToNextMs = buildMediaSegmentGapToNext(\n endMs,\n nextSegmentGroupStartMs,\n );\n previousGroupEndMs = endMs;\n const mediaSegmentGroupDurationMs =\n typeof endMs === \"number\" &&\n typeof startMs === \"number\" &&\n Number.isFinite(endMs) &&\n Number.isFinite(startMs) &&\n endMs >= startMs\n ? endMs - startMs\n : undefined;\n\n segmentDocuments.push({\n chunking: input.chunking,\n contentType: input.contentType,\n format: \"text\",\n id: `${baseDocumentId}-segment-${String(index + 1).padStart(2, \"0\")}`,\n metadata: {\n ...(input.metadata ?? {}),\n ...(result.metadata ?? {}),\n fileKind: \"media\",\n sourceNativeKind: \"media_segment\",\n mediaDurationMs,\n mediaSegmentIndex: index,\n mediaSegmentStartMs,\n mediaSegmentEndMs,\n mediaSegmentCount: segmentCount,\n mediaSegmentGroupIndex: index,\n mediaSegmentGroupSize: segmentGroup.segments.length,\n mediaSegmentGroupSpeaker: segmentGroup.speaker,\n mediaChannel: segmentGroup.channel,\n mediaSegmentGroupDurationMs,\n mediaSegmentGapFromPreviousMs,\n mediaSegmentGapToNextMs,\n mediaSegmentGroupStartMs: startMs,\n mediaSegmentGroupEndMs: endMs,\n mediaSegments: segmentGroup.segments,\n startMs: mediaSegmentStartMs,\n endMs: mediaSegmentEndMs,\n ...(mediaSpeakers.length > 0\n ? {\n mediaSpeakerCount: mediaSpeakers.length,\n mediaSpeakers,\n }\n : {}),\n speaker: segmentGroup.speaker,\n },\n source,\n text: normalizeWhitespace(\n `${mediaKind} transcript segment${\n startLabel\n ? ` at timestamp ${startLabel}${\n endLabel ? ` to ${endLabel}` : \"\"\n }`\n : \"\"\n } from ${\n input.title ?? input.name ?? input.path ?? DEFAULT_BINARY_NAME\n }. ` +\n `${mediaKind} timestamp evidence${\n startLabel\n ? ` ${startLabel}${endLabel ? ` to ${endLabel}` : \"\"}`\n : \"\"\n }.` +\n `\\n${groupText}`,\n ),\n title: input.title\n ? `${input.title} · ${\n mediaKind[0]?.toUpperCase() + mediaKind.slice(1)\n } segment ${index + 1}`\n : `${mediaKind[0]?.toUpperCase() + mediaKind.slice(1)} segment ${index + 1}`,\n });\n }\n\n const summaryDocument: RAGExtractedFileDocument = {\n chunking: input.chunking,\n contentType: input.contentType,\n format: \"text\",\n id: baseDocumentId,\n metadata: {\n ...(input.metadata ?? {}),\n ...(result.metadata ?? {}),\n fileKind: \"media\",\n mediaDurationMs,\n mediaSegmentCount: segmentCount,\n mediaSegments: rawSegments,\n ...(mediaSpeakers.length > 0\n ? {\n mediaSpeakerCount: mediaSpeakers.length,\n mediaSpeakers,\n }\n : {}),\n },\n source,\n text: result.text,\n title: result.title ?? input.title,\n };\n\n return [summaryDocument, ...segmentDocuments];\n },\n});\nexport const createRAGMediaTranscriber = (transcriber: RAGMediaTranscriber) =>\n transcriber;\nexport const createRAGOCRProvider = (provider: RAGOCRProvider) => provider;\nexport const createTextFileExtractor = (): RAGFileExtractor => ({\n name: \"absolute_text\",\n supports: textExtractorSupports,\n extract: (input) => {\n const format =\n input.format ??\n inferFormatFromContentType(input.contentType ?? null) ??\n inferFormatFromName(\n input.path ?? input.source ?? input.name ?? input.title,\n );\n const text = Buffer.from(input.data).toString(\"utf8\");\n\n validateStructuredTextInput(text, format);\n\n return {\n chunking: input.chunking,\n contentType: input.contentType,\n format,\n metadata: input.metadata,\n source: input.source ?? input.path ?? input.name,\n text,\n title: input.title,\n };\n },\n});\n\nconst expandArchiveEntry = async (\n entry: RAGArchiveEntry,\n archiveInput: RAGFileExtractionInput,\n extractors?: RAGFileExtractor[],\n registry?: RAGFileExtractorRegistryLike,\n) => {\n const parentArchiveLineage = Array.isArray(\n archiveInput.metadata?.archiveLineage,\n )\n ? archiveInput.metadata.archiveLineage.filter(\n (value): value is string =>\n typeof value === \"string\" && value.trim().length > 0,\n )\n : [];\n const entryArchiveLineage = entry.path\n .split(/[\\\\/]/)\n .map((segment) => normalizeWhitespace(segment))\n .filter(Boolean);\n const archiveLineage = [...parentArchiveLineage, ...entryArchiveLineage];\n const parentArchivePath =\n typeof archiveInput.metadata?.archivePath === \"string\" &&\n archiveInput.metadata.archivePath.trim().length > 0\n ? archiveInput.metadata.archivePath.trim()\n : undefined;\n const archiveFullPath = parentArchivePath\n ? `${parentArchivePath}!${entry.path}`\n : entry.path;\n const archiveRootName =\n (typeof archiveInput.metadata?.archiveRootName === \"string\" &&\n archiveInput.metadata.archiveRootName.trim().length > 0\n ? archiveInput.metadata.archiveRootName.trim()\n : undefined) ??\n archiveInput.name ??\n archiveInput.path?.split(/[/\\\\]/).pop() ??\n archiveInput.source;\n const archiveRootSource =\n (typeof archiveInput.metadata?.archiveRootSource === \"string\" &&\n archiveInput.metadata.archiveRootSource.trim().length > 0\n ? archiveInput.metadata.archiveRootSource.trim()\n : undefined) ??\n archiveInput.source ??\n archiveInput.path ??\n archiveInput.name;\n const documents = await extractRAGFileDocuments(\n {\n chunking: archiveInput.chunking,\n contentType: entry.contentType,\n data: entry.data,\n extractorRegistry: archiveInput.extractorRegistry,\n format: entry.format,\n metadata: {\n ...(archiveInput.metadata ?? {}),\n ...(entry.metadata ?? {}),\n archiveEntryName: basename(entry.path),\n archiveParentName:\n archiveInput.name ??\n archiveInput.path?.split(/[/\\\\]/).pop() ??\n archiveInput.source,\n archiveParentSource:\n archiveInput.source ?? archiveInput.path ?? archiveInput.name,\n archiveContainerPath: parentArchivePath,\n archiveDepth: archiveLineage.length,\n archiveFullPath,\n archiveLineage,\n archivePath: entry.path,\n archiveRootName,\n archiveRootSource,\n archiveNestedDepth: parentArchiveLineage.length + 1,\n fileKind: \"archive_entry\",\n },\n name: basename(entry.path),\n source:\n archiveInput.source && !archiveInput.source.startsWith(\"http\")\n ? `${archiveInput.source}#${entry.path}`\n : entry.path,\n title: basename(entry.path),\n },\n extractors,\n registry,\n );\n\n return documents;\n};\n\nexport const createPDFFileExtractor = (): RAGFileExtractor => ({\n name: \"absolute_pdf\",\n supports: pdfExtractorSupports,\n extract: (input) => {\n const extracted = extractNativePDFText(input.data);\n if (!extracted.text) {\n throw new Error(\n \"AbsoluteJS could not extract readable text from this PDF. Supply a custom extractor for scanned or image-only PDFs.\",\n );\n }\n\n return {\n chunking: input.chunking,\n contentType: input.contentType ?? \"application/pdf\",\n format: \"text\",\n metadata: {\n ...(input.metadata ?? {}),\n fileKind: \"pdf\",\n pageCount: extracted.pageCount,\n pdfEvidenceMode: \"native\",\n pdfEvidenceOrigin: \"native\",\n pdfTextBlockCount: extracted.textBlockCount,\n pdfTextBlocks: extracted.textBlocks,\n },\n source:\n input.source ??\n input.path ??\n input.name ??\n `${slugify(input.title ?? DEFAULT_BINARY_NAME)}.pdf`,\n text: extracted.text,\n title: input.title,\n };\n },\n});\nexport const createRAGArchiveFileExtractor = (\n expander: RAGArchiveExpander,\n options: {\n entryExtractors?: RAGFileExtractor[];\n } = {},\n): RAGFileExtractor => ({\n name: `absolute_archive:${expander.name}`,\n supports: archiveExtractorSupports,\n extract: async (input) => {\n const expanded = await expander.expand(input);\n const documents = await Promise.all(\n expanded.entries.map((entry) =>\n expandArchiveEntry(\n entry,\n input,\n options.entryExtractors ?? DEFAULT_FILE_EXTRACTORS,\n ),\n ),\n );\n\n return documents.flat().map((document) => ({\n ...document,\n metadata: {\n ...(expanded.metadata ?? {}),\n ...(document.metadata ?? {}),\n fileKind: \"archive\",\n },\n }));\n },\n});\nexport const createRAGPDFOCRExtractor = (\n options: RAGPDFOCRExtractorOptions,\n): RAGFileExtractor => ({\n name: `absolute_pdf_ocr:${options.provider.name}`,\n supports: pdfExtractorSupports,\n extract: async (input) => {\n const extracted = extractNativePDFText(input.data);\n const nativeText = extracted.text;\n const minLength = options.minExtractedTextLength ?? 80;\n const shouldUseNativeText =\n !options.alwaysOCR && nativeText.length >= minLength;\n const shouldUseHybridText =\n !options.alwaysOCR &&\n nativeText.length > 0 &&\n nativeText.length < minLength;\n\n if (shouldUseNativeText) {\n return {\n chunking: input.chunking,\n contentType: input.contentType ?? \"application/pdf\",\n format: \"text\",\n metadata: {\n ...(input.metadata ?? {}),\n fileKind: \"pdf\",\n pageCount: extracted.pageCount,\n pdfEvidenceMode: \"native\",\n pdfEvidenceOrigin: \"native\",\n pdfTextBlockCount: extracted.textBlockCount,\n pdfTextBlocks: extracted.textBlocks,\n pdfTextMode: \"native\",\n },\n source:\n input.source ??\n input.path ??\n input.name ??\n `${slugify(input.title ?? DEFAULT_BINARY_NAME)}.pdf`,\n text: nativeText,\n title: input.title,\n };\n }\n\n const ocr = await options.provider.extractText({\n ...input,\n contentType: input.contentType ?? \"application/pdf\",\n });\n const summary = buildOCRSummaryText(ocr);\n const baseMetadata = {\n ...ocrMetadata(ocr),\n ocrLowConfidenceRegionCount: summary.lowConfidenceRegionCount,\n ocrStrongRegionCount: summary.strongRegionCount,\n ocrSummaryConfidenceThreshold: summary.summaryConfidenceThreshold,\n ocrSummaryUsedStrongRegionsOnly: summary.usedStrongRegionsOnly,\n fileKind: \"pdf\",\n pageCount: extracted.pageCount,\n pdfEvidenceMode: \"ocr\",\n pdfEvidenceOrigin: \"ocr\",\n pdfTextMode: \"ocr\",\n };\n\n if (shouldUseHybridText) {\n const hybridMetadata = {\n ...(input.metadata ?? {}),\n ...baseMetadata,\n pageCount: extracted.pageCount,\n pdfEvidenceMode: \"hybrid\",\n pdfEvidenceOrigin: \"native\",\n pdfEvidenceSupplement: \"ocr\",\n pdfHybridOCRSupplement: true,\n pdfNativeTextBlockCount: extracted.textBlockCount,\n pdfNativeTextLength: nativeText.length,\n pdfOCRFallbackReason: \"native_below_min_length\",\n pdfOCRTextLength: summary.text.length,\n pdfTextBlockCount: extracted.textBlockCount,\n pdfTextBlocks: extracted.textBlocks,\n pdfTextMode: \"hybrid\",\n };\n const hybridDocument: RAGExtractedFileDocument = {\n chunking: input.chunking,\n contentType: input.contentType ?? \"application/pdf\",\n format: \"text\",\n metadata: hybridMetadata,\n source:\n input.source ??\n input.path ??\n input.name ??\n `${slugify(input.title ?? DEFAULT_BINARY_NAME)}.pdf`,\n text: nativeText,\n title: input.title,\n };\n const pageDocuments = ocrPageDocuments(ocr, input, baseMetadata);\n const regionDocuments = ocrRegionDocuments(ocr, input, baseMetadata);\n\n return [hybridDocument, ...pageDocuments, ...regionDocuments];\n }\n\n const summaryDocument: RAGExtractedFileDocument = {\n chunking: input.chunking,\n contentType: input.contentType ?? \"application/pdf\",\n format: \"text\",\n metadata: {\n ...(input.metadata ?? {}),\n ...baseMetadata,\n },\n source:\n input.source ??\n input.path ??\n input.name ??\n `${slugify(input.title ?? DEFAULT_BINARY_NAME)}.pdf`,\n text: summary.text,\n title: ocr.title ?? input.title,\n };\n const pageDocuments = ocrPageDocuments(ocr, input, baseMetadata);\n const regionDocuments = ocrRegionDocuments(ocr, input, baseMetadata);\n\n return [summaryDocument, ...pageDocuments, ...regionDocuments];\n },\n});\n\nconst DEFAULT_FILE_EXTRACTORS = [\n createOfficeDocumentExtractor(),\n createMailboxContainerExtractor(),\n createLegacyDocumentExtractor(),\n createEPUBExtractor(),\n createEmailExtractor(),\n createRAGArchiveFileExtractor(createBuiltinArchiveExpander()),\n createPDFFileExtractor(),\n createTextFileExtractor(),\n] satisfies RAGFileExtractor[];\n\nconst resolveExtractorRegistry = (\n registry?: RAGFileExtractorRegistryLike,\n): {\n defaultOrder: \"registry_first\" | \"defaults_first\";\n includeDefaults: boolean;\n registrations: RAGFileExtractorRegistration[];\n} => {\n if (!registry) {\n return {\n defaultOrder: \"registry_first\",\n includeDefaults: true,\n registrations: [],\n };\n }\n\n if (Array.isArray(registry)) {\n return {\n defaultOrder: \"registry_first\",\n includeDefaults: true,\n registrations: registry,\n };\n }\n\n return {\n defaultOrder: registry.defaultOrder ?? \"registry_first\",\n includeDefaults: registry.includeDefaults ?? true,\n registrations: registry.registrations,\n };\n};\n\nconst createExtractorRegistryInput = (\n input: RAGFileExtractionInput,\n): RAGFileExtractorRegistryInput => ({\n ...input,\n inferredContentType: input.contentType ?? null,\n inferredExtension: inferExtensionFromInput(input) || null,\n inferredFormat:\n input.format ??\n inferFormatFromContentType(input.contentType ?? null) ??\n inferFormatFromName(\n input.path ?? input.source ?? input.name ?? input.title,\n ),\n});\n\nconst registrationMatches = async (\n registration: RAGFileExtractorRegistration,\n input: RAGFileExtractorRegistryInput,\n) => {\n const normalizedContentType = input.inferredContentType?.toLowerCase();\n const normalizedExtension = input.inferredExtension?.toLowerCase();\n const normalizedName = (\n input.path ??\n input.source ??\n input.name ??\n input.title ??\n \"\"\n ).toLowerCase();\n\n if (\n registration.contentTypes?.length &&\n !registration.contentTypes.some(\n (entry) => normalizedContentType === entry.toLowerCase(),\n )\n ) {\n return false;\n }\n\n if (\n registration.extensions?.length &&\n !registration.extensions.some(\n (entry) => normalizedExtension === entry.toLowerCase(),\n )\n ) {\n return false;\n }\n\n if (\n registration.formats?.length &&\n (!input.inferredFormat ||\n !registration.formats.includes(input.inferredFormat))\n ) {\n return false;\n }\n\n if (\n registration.names?.length &&\n !registration.names.some((entry) =>\n normalizedName.includes(entry.toLowerCase()),\n )\n ) {\n return false;\n }\n\n if (registration.match) {\n return registration.match(input);\n }\n\n return true;\n};\n\nconst dedupeExtractors = (extractors: RAGFileExtractor[]) => {\n const seen = new Set<string>();\n const ordered: RAGFileExtractor[] = [];\n\n for (const extractor of extractors) {\n if (seen.has(extractor.name)) {\n continue;\n }\n seen.add(extractor.name);\n ordered.push(extractor);\n }\n\n return ordered;\n};\n\ntype ResolvedFileExtractor = {\n extractor: RAGFileExtractor;\n registryMatchName?: string;\n};\n\nconst dedupeResolvedExtractors = (extractors: ResolvedFileExtractor[]) => {\n const seen = new Set<string>();\n const ordered: ResolvedFileExtractor[] = [];\n\n for (const entry of extractors) {\n if (seen.has(entry.extractor.name)) {\n continue;\n }\n seen.add(entry.extractor.name);\n ordered.push(entry);\n }\n\n return ordered;\n};\n\nconst resolveFileExtractors = async (\n input: RAGFileExtractionInput,\n extractors?: RAGFileExtractor[],\n registry?: RAGFileExtractorRegistryLike,\n): Promise<ResolvedFileExtractor[]> => {\n const explicit = extractors ?? [];\n const resolvedRegistry = resolveExtractorRegistry(registry);\n const registryInput = createExtractorRegistryInput(input);\n const matchedRegistrations = (\n await Promise.all(\n resolvedRegistry.registrations.map(async (registration) => ({\n matches: await registrationMatches(registration, registryInput),\n priority: registration.priority ?? 0,\n registration,\n })),\n )\n )\n .filter((entry) => entry.matches)\n .sort((left, right) => right.priority - left.priority)\n .map((entry) => ({\n extractor: entry.registration.extractor,\n registryMatchName:\n entry.registration.name ?? entry.registration.extractor.name,\n }));\n const defaults = resolvedRegistry.includeDefaults\n ? DEFAULT_FILE_EXTRACTORS.map((extractor) => ({ extractor }))\n : [];\n const explicitResolved = explicit.map((extractor) => ({ extractor }));\n\n return dedupeResolvedExtractors(\n resolvedRegistry.defaultOrder === \"defaults_first\"\n ? [...explicitResolved, ...defaults, ...matchedRegistrations]\n : [...explicitResolved, ...matchedRegistrations, ...defaults],\n );\n};\n\nconst applyExtractorDefaults = (\n document: RAGExtractedFileDocument,\n input: RAGFileExtractionInput,\n extractorName: string,\n registryMatchName?: string,\n): RAGIngestDocument => ({\n chunking: document.chunking ?? input.chunking,\n format:\n document.format ??\n input.format ??\n inferFormatFromContentType(\n document.contentType ?? input.contentType ?? null,\n ) ??\n inferFormatFromName(\n document.source ?? input.source ?? input.path ?? input.name,\n ),\n id: document.id,\n metadata: {\n ...(input.metadata ?? {}),\n ...(document.metadata ?? {}),\n contentType: document.contentType ?? input.contentType,\n extractor: document.extractor ?? extractorName,\n ...(registryMatchName ? { extractorRegistryMatch: registryMatchName } : {}),\n },\n source: document.source ?? input.source ?? input.path ?? input.name,\n text: document.text,\n title: document.title ?? input.title,\n});\n\nconst extractRAGFileDocuments = async (\n input: RAGFileExtractionInput,\n extractors?: RAGFileExtractor[],\n registry?: RAGFileExtractorRegistryLike,\n) => {\n for (const resolvedExtractor of await resolveFileExtractors(\n input,\n extractors,\n registry,\n )) {\n const { extractor, registryMatchName } = resolvedExtractor;\n if (!(await extractor.supports(input))) {\n continue;\n }\n\n const extracted = await extractor.extract(input);\n const documents = Array.isArray(extracted) ? extracted : [extracted];\n\n return documents.map((document) =>\n applyExtractorDefaults(\n document,\n input,\n extractor.name,\n registryMatchName,\n ),\n );\n }\n\n throw new Error(\n `No RAG file extractor matched ${inferNameFromInput(input)}. Register a custom extractor for this file type.`,\n );\n};\n\nconst getFirstExtractedDocument = (\n documents: RAGIngestDocument[],\n label: string,\n) => {\n const document = documents[0];\n if (!document) {\n throw new Error(`RAG extractor ${label} did not return a document`);\n }\n\n return document;\n};\n\nconst loadExtractedDocuments = async (\n input: RAGFileExtractionInput,\n extractors?: RAGFileExtractor[],\n registry?: RAGFileExtractorRegistryLike,\n) => extractRAGFileDocuments(input, extractors, registry);\n\nconst collectEmailThreadParticipants = (documents: RAGIngestDocument[]) => {\n const participants = new Set<string>();\n const participantAddresses = new Set<string>();\n const participantDisplayNames = new Set<string>();\n\n for (const document of documents) {\n const parsedParticipantAddresses = Array.isArray(\n document.metadata?.participantAddresses,\n )\n ? document.metadata.participantAddresses\n : [];\n for (const address of parsedParticipantAddresses) {\n if (typeof address === \"string\" && address.trim().length > 0) {\n participantAddresses.add(address.trim());\n participants.add(address.trim());\n }\n }\n const parsedParticipantDisplayNames = Array.isArray(\n document.metadata?.participantDisplayNames,\n )\n ? document.metadata.participantDisplayNames\n : [];\n for (const name of parsedParticipantDisplayNames) {\n if (typeof name === \"string\" && name.trim().length > 0) {\n participantDisplayNames.add(name.trim());\n }\n }\n\n const from = document.metadata?.from;\n if (typeof from === \"string\" && from.trim().length > 0) {\n participants.add(from.trim());\n }\n\n const to = document.metadata?.to;\n if (typeof to === \"string\" && to.trim().length > 0) {\n for (const recipient of to\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean)) {\n participants.add(recipient);\n }\n }\n }\n\n return {\n participantAddresses: [...participantAddresses],\n participantDisplayNames: [...participantDisplayNames],\n participants: [...participants],\n };\n};\n\nconst reconcileLoadedEmailThreads = (documents: RAGIngestDocument[]) => {\n const messageDocuments = documents.filter(\n (document) => document.metadata?.emailKind === \"message\",\n );\n if (messageDocuments.length === 0) {\n return documents;\n }\n\n const parent = messageDocuments.map((_, index) => index);\n const find = (index: number): number => {\n let current = index;\n while (parent[current] !== current) {\n parent[current] = parent[parent[current]!]!;\n current = parent[current]!;\n }\n return current;\n };\n const union = (left: number, right: number) => {\n const leftRoot = find(left);\n const rightRoot = find(right);\n if (leftRoot !== rightRoot) {\n parent[rightRoot] = leftRoot;\n }\n };\n const messageIndexById = new Map<string, number>();\n const messageIndexBySource = new Map<string, number>();\n const messageIndexesByThreadKey = new Map<string, number[]>();\n for (const [index, document] of messageDocuments.entries()) {\n const messageId = document.metadata?.messageId;\n if (typeof messageId === \"string\" && messageId.length > 0) {\n messageIndexById.set(messageId, index);\n }\n if (typeof document.source === \"string\" && document.source.length > 0) {\n messageIndexBySource.set(document.source, index);\n }\n const threadKey = document.metadata?.threadKey;\n if (typeof threadKey === \"string\" && threadKey.trim().length > 0) {\n const normalizedThreadKey = threadKey.trim();\n const current = messageIndexesByThreadKey.get(normalizedThreadKey);\n if (current) {\n current.push(index);\n } else {\n messageIndexesByThreadKey.set(normalizedThreadKey, [index]);\n }\n }\n }\n\n for (const indexes of messageIndexesByThreadKey.values()) {\n for (let index = 1; index < indexes.length; index += 1) {\n union(indexes[0]!, indexes[index]!);\n }\n }\n for (const [index, document] of messageDocuments.entries()) {\n const inReplyTo = document.metadata?.inReplyTo;\n if (typeof inReplyTo === \"string\" && inReplyTo.length > 0) {\n const parentIndex = messageIndexById.get(inReplyTo);\n if (typeof parentIndex === \"number\") {\n union(index, parentIndex);\n }\n }\n const threadMessageIds = Array.isArray(document.metadata?.threadMessageIds)\n ? document.metadata.threadMessageIds\n : [];\n for (const relatedMessageId of threadMessageIds) {\n if (\n typeof relatedMessageId !== \"string\" ||\n relatedMessageId.length === 0\n ) {\n continue;\n }\n const relatedIndex = messageIndexById.get(relatedMessageId);\n if (typeof relatedIndex === \"number\") {\n union(index, relatedIndex);\n }\n }\n }\n\n const threadGroups = new Map<number, RAGIngestDocument[]>();\n for (const [index, document] of messageDocuments.entries()) {\n const component = find(index);\n const current = threadGroups.get(component);\n if (current) {\n current.push(document);\n } else {\n threadGroups.set(component, [document]);\n }\n }\n for (const document of documents) {\n if (document.metadata?.emailKind === \"message\") {\n continue;\n }\n const messageSource = document.metadata?.emailMessageSource;\n if (typeof messageSource === \"string\" && messageSource.length > 0) {\n const messageIndex = messageIndexBySource.get(messageSource);\n if (typeof messageIndex === \"number\") {\n const component = find(messageIndex);\n const current = threadGroups.get(component);\n if (current) {\n current.push(document);\n } else {\n threadGroups.set(component, [document]);\n }\n continue;\n }\n }\n\n const threadKey = document.metadata?.threadKey;\n if (typeof threadKey === \"string\" && threadKey.trim().length > 0) {\n const candidateIndexes = messageIndexesByThreadKey.get(threadKey.trim());\n const candidateIndex = candidateIndexes?.[0];\n if (typeof candidateIndex === \"number\") {\n const component = find(candidateIndex);\n const current = threadGroups.get(component);\n if (current) {\n current.push(document);\n } else {\n threadGroups.set(component, [document]);\n }\n }\n }\n }\n\n for (const [, threadDocuments] of threadGroups.entries()) {\n const componentMessages = threadDocuments.filter(\n (document) => document.metadata?.emailKind === \"message\",\n );\n if (componentMessages.length === 0) {\n continue;\n }\n const threadKey = (() => {\n const rootByReply = componentMessages.find(\n (document) =>\n typeof document.metadata?.inReplyTo !== \"string\" ||\n document.metadata.inReplyTo.length === 0,\n );\n const rootCandidate = rootByReply ?? componentMessages[0];\n return (\n (typeof rootCandidate?.metadata?.threadKey === \"string\" &&\n rootCandidate.metadata.threadKey.trim().length > 0\n ? rootCandidate.metadata.threadKey.trim()\n : undefined) ??\n componentMessages\n .map((document) => document.metadata?.threadKey)\n .find(\n (value): value is string =>\n typeof value === \"string\" && value.trim().length > 0,\n )\n ?.trim() ??\n \"email-thread\"\n );\n })();\n\n const knownThreadMessageIds: string[] = [];\n const seenKnownThreadMessageIds = new Set<string>();\n for (const document of threadDocuments) {\n const threadMessageIds = Array.isArray(\n document.metadata?.threadMessageIds,\n )\n ? document.metadata?.threadMessageIds\n : [];\n for (const messageId of threadMessageIds) {\n if (\n typeof messageId === \"string\" &&\n messageId.length > 0 &&\n !seenKnownThreadMessageIds.has(messageId)\n ) {\n seenKnownThreadMessageIds.add(messageId);\n knownThreadMessageIds.push(messageId);\n }\n }\n const messageId = document.metadata?.messageId;\n if (\n typeof messageId === \"string\" &&\n messageId.length > 0 &&\n !seenKnownThreadMessageIds.has(messageId)\n ) {\n seenKnownThreadMessageIds.add(messageId);\n knownThreadMessageIds.push(messageId);\n }\n }\n\n const loadedMessageIds = componentMessages\n .map((document) => document.metadata?.messageId)\n .filter(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0,\n );\n const loadedMessageIdSet = new Set(loadedMessageIds);\n const loadedMessageSourceById = new Map<string, string>();\n for (const document of componentMessages) {\n const messageId = document.metadata?.messageId;\n if (\n typeof messageId === \"string\" &&\n messageId.length > 0 &&\n typeof document.source === \"string\" &&\n document.source.length > 0\n ) {\n loadedMessageSourceById.set(messageId, document.source);\n }\n }\n const replySiblingGroups = new Map<string, typeof componentMessages>();\n for (const document of componentMessages) {\n const inReplyTo = document.metadata?.inReplyTo;\n if (\n typeof inReplyTo !== \"string\" ||\n inReplyTo.length === 0 ||\n !loadedMessageIdSet.has(inReplyTo)\n ) {\n continue;\n }\n\n const current = replySiblingGroups.get(inReplyTo);\n if (current) {\n current.push(document);\n } else {\n replySiblingGroups.set(inReplyTo, [document]);\n }\n }\n const replySiblingMetadataByMessageId = new Map<\n string,\n {\n count: number;\n index: number;\n messageIds: string[];\n parentMessageId: string;\n sources: string[];\n }\n >();\n for (const [parentMessageId, siblings] of replySiblingGroups.entries()) {\n const orderedSiblings = [...siblings].sort((left, right) => {\n const leftSource = typeof left.source === \"string\" ? left.source : \"\";\n const rightSource =\n typeof right.source === \"string\" ? right.source : \"\";\n if (leftSource !== rightSource) {\n return leftSource.localeCompare(rightSource);\n }\n const leftMessageId =\n typeof left.metadata?.messageId === \"string\"\n ? left.metadata.messageId\n : \"\";\n const rightMessageId =\n typeof right.metadata?.messageId === \"string\"\n ? right.metadata.messageId\n : \"\";\n return leftMessageId.localeCompare(rightMessageId);\n });\n const siblingMessageIds = orderedSiblings\n .map((document) => document.metadata?.messageId)\n .filter(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0,\n );\n const siblingSources = orderedSiblings\n .map((document) => document.source)\n .filter(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0,\n );\n for (const [index, sibling] of orderedSiblings.entries()) {\n const messageId = sibling.metadata?.messageId;\n if (typeof messageId !== \"string\" || messageId.length === 0) {\n continue;\n }\n replySiblingMetadataByMessageId.set(messageId, {\n count: orderedSiblings.length,\n index,\n messageIds: siblingMessageIds,\n parentMessageId,\n sources: siblingSources,\n });\n }\n }\n\n const threadParticipants = collectEmailThreadParticipants(threadDocuments);\n const loadedMessageSources = messageDocuments\n .map((document) => document.source)\n .filter(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0,\n );\n const loadedAttachmentCount = threadDocuments.filter(\n (document) => document.metadata?.emailKind === \"attachment\",\n ).length;\n const threadRootMessageId = (() => {\n const existingRoot = threadDocuments\n .map((document) => document.metadata?.threadRootMessageId)\n .find(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0,\n );\n return existingRoot ?? loadedMessageIds[0];\n })();\n\n for (const document of threadDocuments) {\n const messageId =\n typeof document.metadata?.messageId === \"string\"\n ? document.metadata.messageId\n : undefined;\n const replySiblingMetadata = messageId\n ? replySiblingMetadataByMessageId.get(messageId)\n : undefined;\n document.metadata = {\n ...(document.metadata ?? {}),\n ...(replySiblingMetadata\n ? {\n emailReplySiblingCount: replySiblingMetadata.count,\n emailReplySiblingIndex: replySiblingMetadata.index,\n emailReplySiblingMessageIds: replySiblingMetadata.messageIds,\n emailReplySiblingOrdinal: replySiblingMetadata.index + 1,\n emailReplySiblingParentMessageId:\n replySiblingMetadata.parentMessageId,\n emailReplySiblingSources: replySiblingMetadata.sources,\n }\n : {}),\n threadKey,\n threadKnownMessageCount: knownThreadMessageIds.length,\n threadKnownMessageIds: knownThreadMessageIds,\n threadLoadedAttachmentCount: loadedAttachmentCount,\n threadLoadedMessageCount: loadedMessageIds.length,\n threadLoadedMessageIds: loadedMessageIds,\n threadLoadedMessageSources: loadedMessageSources,\n threadParticipantAddresses: threadParticipants.participantAddresses,\n threadParticipantDisplayNames:\n threadParticipants.participantDisplayNames,\n threadParticipants: threadParticipants.participants,\n threadRootMessageId,\n };\n\n const inReplyTo = document.metadata?.inReplyTo;\n if (\n typeof inReplyTo === \"string\" &&\n inReplyTo.length > 0 &&\n loadedMessageIdSet.has(inReplyTo)\n ) {\n document.metadata = {\n ...(document.metadata ?? {}),\n emailReplyParentLoaded: true,\n emailReplyParentMessageId: inReplyTo,\n emailReplyParentSource: loadedMessageSourceById.get(inReplyTo),\n };\n }\n }\n }\n\n return documents;\n};\n\nconst sentenceUnits = (text: string) => {\n const matches = text.match(/[^.!?\\n]+(?:[.!?]+|$)/g);\n if (!matches) {\n return [text];\n }\n\n return matches.map((entry) => entry.trim()).filter(Boolean);\n};\n\nconst paragraphUnits = (text: string) => {\n const paragraphs = text\n .split(/\\n\\n+/)\n .map((entry) => entry.trim())\n .filter(Boolean);\n\n return paragraphs.length > 0 ? paragraphs : sentenceUnits(text);\n};\n\nconst fixedUnits = (text: string, maxChunkLength: number) => {\n const units: string[] = [];\n let index = 0;\n while (index < text.length) {\n units.push(text.slice(index, index + maxChunkLength));\n index += maxChunkLength;\n }\n\n return units;\n};\n\nconst sourceAwareUnits = (\n document: RAGIngestDocument,\n format: RAGContentFormat,\n normalizedText: string,\n): StructuredChunkUnit[] => {\n const resolveStructuredUnits = (sections: StructuredChunkUnit[]) =>\n sections.length > 0\n ? sections\n : paragraphUnits(normalizedText).map((text) => ({ text }));\n\n switch (format) {\n case \"jsonl\": {\n const sections = jsonlStructureUnits(document.text);\n\n return resolveStructuredUnits(sections);\n }\n case \"tsv\": {\n const sections = tsvStructureUnits(document.text);\n\n return resolveStructuredUnits(sections);\n }\n case \"csv\": {\n const sections = csvStructureUnits(document.text);\n\n return resolveStructuredUnits(sections);\n }\n case \"xml\": {\n const sections = xmlStructureUnits(document.text);\n\n return resolveStructuredUnits(sections);\n }\n case \"yaml\": {\n const sections = yamlStructureUnits(document.text);\n\n return resolveStructuredUnits(sections);\n }\n case \"markdown\": {\n const sections = markdownStructureUnits(document.text);\n\n return resolveStructuredUnits(sections);\n }\n case \"html\": {\n const sections = htmlStructureUnits(document.text);\n\n return resolveStructuredUnits(sections);\n }\n case \"text\":\n default:\n if (document.metadata?.fileKind === \"office\") {\n const sections = officeNativeStructureUnits(document.metadata);\n if (sections.length > 0) {\n return sections;\n }\n }\n if (document.metadata?.fileKind === \"pdf\") {\n const sections = pdfNativeStructureUnits(document.metadata);\n if (sections.length > 0) {\n return sections;\n }\n }\n if (document.metadata?.sourceNativeKind === \"spreadsheet_sheet\") {\n return spreadsheetStructureUnits(normalizedText, document.metadata);\n }\n if (document.metadata?.sourceNativeKind === \"presentation_slide\") {\n return presentationStructureUnits(normalizedText, document.metadata);\n }\n if (document.metadata?.fileKind === \"email\") {\n const sections = emailStructureUnits(normalizedText, document.metadata);\n if (sections.length > 0) {\n return sections;\n }\n }\n if (\n document.source?.toLowerCase().endsWith(\".docx\") ||\n document.source?.toLowerCase().endsWith(\".odt\")\n ) {\n return officeHeadingStructureUnits(normalizedText);\n }\n if (isCodeLikeSource(document.source)) {\n return codeStructureUnits(document.text);\n }\n return paragraphUnits(normalizedText).map((text) => ({ text }));\n }\n};\n\n// The carry text prepended to the next chunk. Two cases used to return the\n// WHOLE chunk: an overlap of 0 (which must mean \"no carry\" — chunkSourceAwareUnit\n// passes 0, so every structure-aware chunk carried its full predecessor and the\n// document was embedded ~5x over), and a chunk shorter than the overlap (which\n// then got embedded twice in full).\nconst overlapTail = (value: string, overlap: number) => {\n if (overlap <= 0) {\n return \"\";\n }\n if (value.length <= overlap) {\n return value;\n }\n\n const candidate = value.slice(-overlap);\n const boundary = candidate.search(/[\\s,.;:!?-]/);\n\n return boundary > 0 ? candidate.slice(boundary).trim() : candidate.trim();\n};\n\nconst chunkFromUnits = (\n units: string[],\n maxChunkLength: number,\n chunkOverlap: number,\n minChunkLength: number,\n) => {\n const chunks: string[] = [];\n let current = \"\";\n const appendChunk = (chunk: string) => {\n chunks.push(chunk);\n };\n // Folding a runt chunk into its predecessor must not push that predecessor\n // past the limit — the structure-aware path already guards this, this one\n // did not. Unbounded, it also collapsed everything into a single chunk\n // whenever maxChunkLength was configured below minChunkLength (80), because\n // then EVERY chunk counts as small.\n const mergeSmallChunk = (merged: string[], chunk: string) => {\n const last = merged[merged.length - 1];\n if (last === undefined || chunk.length >= minChunkLength) {\n merged.push(chunk);\n\n return;\n }\n const candidate = normalizeWhitespace(`${last} ${chunk}`);\n if (candidate.length > maxChunkLength) {\n merged.push(chunk);\n\n return;\n }\n\n merged[merged.length - 1] = candidate;\n };\n const appendUnitToChunk = (trimmed: string) => {\n if (!current) {\n current = trimmed;\n\n return;\n }\n\n const separator =\n current.includes(\"\\n\") || trimmed.includes(\"\\n\") ? \"\\n\\n\" : \" \";\n const candidate = `${current}${separator}${trimmed}`;\n if (candidate.length <= maxChunkLength) {\n current = candidate;\n\n return;\n }\n\n appendChunk(current);\n const carry = overlapTail(current, chunkOverlap);\n current = carry.length > 0 ? `${carry} ${trimmed}`.trim() : trimmed;\n };\n\n // A unit can itself exceed maxChunkLength — `paragraphUnits` splits only on\n // BLANK lines, so a PDF/HTML/Office extraction that emits single-newline line\n // breaks is one enormous unit, and `appendUnitToChunk` accepted it whole when\n // `current` was empty. maxChunkLength was silently ignored: a 6,249-char\n // document produced exactly one 6,249-char chunk, blowing embedding limits\n // and destroying retrieval granularity. Split oversized units down by\n // sentence, then by hard slice; both terminate because sentenceUnits returns\n // a single-element array when it cannot split further.\n const explodeOversized = (unit: string): string[] => {\n if (unit.length <= maxChunkLength) return [unit];\n const sentences = sentenceUnits(unit);\n if (sentences.length > 1) return sentences.flatMap(explodeOversized);\n\n return fixedUnits(unit, maxChunkLength);\n };\n\n for (const unit of units) {\n for (const piece of explodeOversized(unit.trim())) {\n const trimmed = piece.trim();\n if (!trimmed) continue;\n appendUnitToChunk(trimmed);\n }\n }\n\n if (current) {\n appendChunk(current);\n }\n\n const normalizedChunks = chunks\n .map((entry) => normalizeWhitespace(entry))\n .filter(Boolean);\n\n if (normalizedChunks.length <= 1) {\n return normalizedChunks;\n }\n\n const merged: string[] = [];\n for (const chunk of normalizedChunks) {\n mergeSmallChunk(merged, chunk);\n }\n\n return merged;\n};\n\nconst chunkSourceAwareUnit = (\n unit: StructuredChunkUnit,\n options: Required<\n Pick<\n RAGChunkingOptions,\n \"chunkOverlap\" | \"maxChunkLength\" | \"minChunkLength\" | \"strategy\"\n >\n >,\n): StructuredChunkUnit[] => {\n const defaultSourceAwareChunkReason =\n unit.sectionKind === \"markdown_heading\" ||\n unit.sectionKind === \"html_heading\" ||\n unit.sectionKind === \"office_heading\"\n ? \"section_boundary\"\n : unit.sectionKind\n ? \"source_native_unit\"\n : unit.sourceAwareChunkReason;\n if (\n unit.officeBlockKind === \"table\" &&\n typeof unit.officeTableHeaderText === \"string\" &&\n typeof unit.officeTableBodyRowCount === \"number\" &&\n unit.officeTableBodyRowCount > 0 &&\n unit.text.length > options.maxChunkLength\n ) {\n const headerLine = unit.officeTableHeaderText;\n const contextText =\n typeof unit.officeTableContextText === \"string\"\n ? unit.officeTableContextText\n : undefined;\n const followUpText =\n typeof unit.officeTableFollowUpText === \"string\"\n ? unit.officeTableFollowUpText\n : undefined;\n const bodyRows = unit.text\n .split(\"\\n\")\n .map((line) => normalizeWhitespace(line))\n .filter((line) => /^Row \\d+\\./.test(line))\n .slice(1);\n const slices: Array<{\n bodyRowEnd: number;\n bodyRowStart: number;\n text: string;\n }> = [];\n let currentRows: string[] = [];\n let currentStart = 1;\n\n const pushSlice = () => {\n if (currentRows.length === 0) {\n return;\n }\n slices.push({\n bodyRowEnd: currentStart + currentRows.length - 1,\n bodyRowStart: currentStart,\n text: normalizeWhitespace(\n [\n ...(typeof contextText === \"string\" ? [contextText] : []),\n headerLine,\n ...currentRows,\n ...(typeof followUpText === \"string\" ? [followUpText] : []),\n ].join(\"\\n\"),\n ),\n });\n currentStart += currentRows.length;\n currentRows = [];\n };\n\n for (const row of bodyRows) {\n const candidateRows = [...currentRows, row];\n const candidateText = normalizeWhitespace(\n [\n ...(typeof contextText === \"string\" ? [contextText] : []),\n headerLine,\n ...candidateRows,\n ...(typeof followUpText === \"string\" ? [followUpText] : []),\n ].join(\"\\n\"),\n );\n if (\n currentRows.length > 0 &&\n candidateText.length > options.maxChunkLength\n ) {\n pushSlice();\n }\n currentRows.push(row);\n }\n pushSlice();\n\n if (slices.length > 0) {\n return slices.map((slice) => ({\n ...unit,\n officeTableBodyRowCount: slice.bodyRowEnd - slice.bodyRowStart + 1,\n officeTableBodyRowEnd: slice.bodyRowEnd,\n officeTableBodyRowStart: slice.bodyRowStart,\n officeTableChunkKind: slices.length > 1 ? \"table_slice\" : \"full_table\",\n officeTableRowCount: slice.bodyRowEnd - slice.bodyRowStart + 2,\n sourceAwareChunkReason:\n slices.length > 1 ? \"size_limit\" : defaultSourceAwareChunkReason,\n text: slice.text,\n }));\n }\n }\n if (\n unit.pdfTextKind === \"table_like\" &&\n typeof unit.pdfTableHeaderText === \"string\" &&\n typeof unit.pdfTableBodyRowCount === \"number\" &&\n unit.pdfTableBodyRowCount > 0 &&\n unit.text.length > options.maxChunkLength\n ) {\n const headerLine = unit.pdfTableHeaderText;\n const bodyRows = unit.text\n .split(\"\\n\")\n .map((line) => normalizeWhitespace(line))\n .filter(Boolean)\n .slice(1);\n const slices: Array<{\n bodyRowEnd: number;\n bodyRowStart: number;\n text: string;\n }> = [];\n let currentRows: string[] = [];\n let currentStart = 1;\n\n const pushSlice = () => {\n if (currentRows.length === 0) {\n return;\n }\n slices.push({\n bodyRowEnd: currentStart + currentRows.length - 1,\n bodyRowStart: currentStart,\n text: normalizeWhitespace([headerLine, ...currentRows].join(\"\\n\")),\n });\n currentStart += currentRows.length;\n currentRows = [];\n };\n\n for (const row of bodyRows) {\n const candidateRows = [...currentRows, row];\n const candidateText = normalizeWhitespace(\n [headerLine, ...candidateRows].join(\"\\n\"),\n );\n if (\n currentRows.length > 0 &&\n candidateText.length > options.maxChunkLength\n ) {\n pushSlice();\n }\n currentRows.push(row);\n }\n pushSlice();\n\n if (slices.length > 0) {\n return slices.map((slice) => ({\n ...unit,\n pdfTableBodyRowCount: slice.bodyRowEnd - slice.bodyRowStart + 1,\n pdfTableBodyRowEnd: slice.bodyRowEnd,\n pdfTableBodyRowStart: slice.bodyRowStart,\n pdfTableChunkKind: slices.length > 1 ? \"table_slice\" : \"full_table\",\n pdfTableRowCount: slice.bodyRowEnd - slice.bodyRowStart + 2,\n sourceAwareChunkReason:\n slices.length > 1 ? \"size_limit\" : defaultSourceAwareChunkReason,\n text: slice.text,\n }));\n }\n }\n if (unit.text.length <= options.maxChunkLength) {\n return [\n {\n ...unit,\n ...(defaultSourceAwareChunkReason\n ? { sourceAwareChunkReason: defaultSourceAwareChunkReason }\n : {}),\n },\n ];\n }\n\n const expandOversizedParagraph = (paragraph: string) => {\n if (paragraph.length <= options.maxChunkLength) {\n return [paragraph];\n }\n\n const isLikelyCodeChunk =\n paragraph.includes(\"\\n\") &&\n (/(^|\\n)\\s{2,}\\S/.test(paragraph) ||\n /\\b(function|class|const|let|var|import|export|return|if|else|for|while|switch|case|try|catch|interface|type|enum)\\b/.test(\n paragraph,\n ) ||\n /[{}();=>]/.test(paragraph));\n if (isLikelyCodeChunk) {\n const codeUnits = paragraph.includes(\"\\n\\n\")\n ? paragraph.split(/\\n{2,}/).filter(Boolean)\n : paragraph.split(\"\\n\").filter(Boolean);\n const codeChunks = chunkFromUnits(\n codeUnits,\n options.maxChunkLength,\n 0,\n options.minChunkLength,\n );\n if (codeChunks.length > 1) {\n return codeChunks;\n }\n }\n\n const sentenceChunks = chunkFromUnits(\n sentenceUnits(paragraph),\n options.maxChunkLength,\n 0,\n options.minChunkLength,\n );\n if (sentenceChunks.length > 1) {\n return sentenceChunks;\n }\n\n return chunkFromUnits(\n fixedUnits(paragraph, options.maxChunkLength),\n options.maxChunkLength,\n 0,\n options.minChunkLength,\n );\n };\n\n const stableParagraphs = (\n unit.preferredChunkUnits ?? paragraphUnits(unit.text)\n ).flatMap(expandOversizedParagraph);\n const stableChunks: string[] = [];\n let current = \"\";\n\n const pushCurrent = () => {\n if (!current) {\n return;\n }\n\n stableChunks.push(normalizeWhitespace(current));\n current = \"\";\n };\n\n for (const paragraph of stableParagraphs) {\n const trimmed = paragraph.trim();\n if (!trimmed) {\n continue;\n }\n\n if (!current) {\n current = trimmed;\n continue;\n }\n\n const candidate = `${current}\\n\\n${trimmed}`;\n if (candidate.length <= options.maxChunkLength) {\n current = candidate;\n continue;\n }\n\n pushCurrent();\n current = trimmed;\n }\n\n pushCurrent();\n\n const merged: string[] = [];\n for (const chunk of stableChunks) {\n const last = merged.at(-1);\n if (\n last &&\n chunk.length < options.minChunkLength &&\n `${last}\\n\\n${chunk}`.length <= options.maxChunkLength\n ) {\n merged[merged.length - 1] = normalizeWhitespace(`${last}\\n\\n${chunk}`);\n continue;\n }\n\n merged.push(chunk);\n }\n\n const decorateSourceAwareChunkText = (text: string) => {\n if (!unit.preferredChunkUnits || !unit.sectionTitle) {\n return text;\n }\n\n if (unit.sectionKind === \"spreadsheet_rows\") {\n if (text.includes(`Sheet ${unit.sectionTitle}`)) {\n return text;\n }\n return normalizeWhitespace(`Sheet ${unit.sectionTitle}\\n${text}`);\n }\n\n if (unit.sectionKind === \"presentation_slide\") {\n if (text.includes(unit.sectionTitle)) {\n return text;\n }\n return normalizeWhitespace(`${unit.sectionTitle}\\n${text}`);\n }\n\n return text;\n };\n\n const resolveSpreadsheetChunkRowRange = (text: string) => {\n if (unit.sectionKind !== \"spreadsheet_rows\") {\n return {};\n }\n\n const rowNumbers = [...text.matchAll(/^Row (\\d+)\\./gm)]\n .map((match) => Number(match[1] ?? NaN))\n .filter((value) => Number.isFinite(value));\n\n if (rowNumbers.length === 0) {\n return {};\n }\n\n return {\n spreadsheetRowEnd: rowNumbers[rowNumbers.length - 1],\n spreadsheetRowStart: rowNumbers[0],\n };\n };\n\n return merged.map((text) => {\n const decoratedText = decorateSourceAwareChunkText(text);\n const sourceAwareChunkReason =\n merged.length > 1 ? \"size_limit\" : defaultSourceAwareChunkReason;\n\n return {\n ...unit,\n ...(sourceAwareChunkReason ? { sourceAwareChunkReason } : {}),\n ...resolveSpreadsheetChunkRowRange(decoratedText),\n text: decoratedText,\n };\n });\n};\n\nconst resolveChunkingUnits = (\n text: string,\n options: Required<\n Pick<\n RAGChunkingOptions,\n \"chunkOverlap\" | \"maxChunkLength\" | \"minChunkLength\" | \"strategy\"\n >\n >,\n) => {\n if (options.strategy === \"fixed\") {\n return fixedUnits(text, options.maxChunkLength);\n }\n\n if (options.strategy === \"sentences\") {\n return sentenceUnits(text);\n }\n\n return paragraphUnits(text);\n};\n\nconst resolveChunkingProfiles = (\n registry?: RAGChunkingRegistryLike,\n): RAGChunkingProfile[] => {\n if (!registry) {\n return [];\n }\n\n const profiles = Array.isArray(registry) ? registry : registry.profiles;\n\n return profiles\n .map((profile, index) => normalizeChunkingProfile(profile, index))\n .sort((left, right) => right.priority - left.priority)\n .map(({ profile }) => profile);\n};\n\nconst normalizeChunkingProfile = (\n profile: RAGChunkingProfile | RAGChunkingProfileRegistration,\n index: number,\n) => {\n if (\"resolve\" in profile) {\n return {\n priority: 0,\n profile,\n };\n }\n\n const options = normalizeChunkingProfileOptions(profile.profile);\n const sourceSet =\n profile.sources?.filter((value) => typeof value === \"string\") ?? [];\n const documentIdSet =\n profile.documentIds?.filter((value) => typeof value === \"string\") ?? [];\n const formatSet =\n profile.formats?.filter((value) => typeof value === \"string\") ?? [];\n const sourceNativeKindSet =\n profile.sourceNativeKinds?.filter((value) => typeof value === \"string\") ??\n [];\n\n return {\n priority: profile.priority ?? 0,\n profile: {\n name:\n profile.name ??\n `chunking_profile_${String(index + 1).padStart(2, \"0\")}`,\n resolve: (input: RAGChunkingProfileInput) => {\n const documentId =\n input.document.id?.trim() ||\n (typeof input.metadata.documentId === \"string\"\n ? input.metadata.documentId\n : undefined);\n const source = input.document.source?.trim();\n if (formatSet.length > 0 && !formatSet.includes(input.format)) {\n return undefined;\n }\n if (\n sourceNativeKindSet.length > 0 &&\n (!input.sourceNativeKind ||\n !sourceNativeKindSet.includes(input.sourceNativeKind))\n ) {\n return undefined;\n }\n if (sourceSet.length > 0 && (!source || !sourceSet.includes(source))) {\n return undefined;\n }\n if (\n documentIdSet.length > 0 &&\n (!documentId || !documentIdSet.includes(documentId))\n ) {\n return undefined;\n }\n\n return options;\n },\n },\n };\n};\n\nconst normalizeChunkingProfileOptions = (\n profile:\n | Partial<RAGChunkingOptions>\n | {\n options?: Partial<RAGChunkingOptions>;\n },\n): Partial<RAGChunkingOptions> =>\n isChunkingProfileOptionsWrapper(profile) ? (profile.options ?? {}) : profile;\n\nconst isChunkingProfileOptionsWrapper = (\n profile:\n | Partial<RAGChunkingOptions>\n | {\n options?: Partial<RAGChunkingOptions>;\n },\n): profile is { options?: Partial<RAGChunkingOptions> } =>\n Object.prototype.hasOwnProperty.call(profile, \"options\");\n\nconst resolveChunkingProfileOverrides = ({\n defaults,\n document,\n format,\n normalizedText,\n registry,\n}: {\n defaults?: RAGChunkingOptions;\n document: RAGIngestDocument;\n format: RAGContentFormat;\n normalizedText: string;\n registry?: RAGChunkingRegistryLike;\n}) => {\n const metadata = document.metadata ?? {};\n const sourceNativeKind =\n typeof metadata.sourceNativeKind === \"string\"\n ? metadata.sourceNativeKind\n : undefined;\n\n for (const profile of resolveChunkingProfiles(registry)) {\n const options = profile.resolve({\n defaults,\n document,\n format,\n metadata,\n normalizedText,\n sourceNativeKind,\n });\n if (options) {\n return {\n name: profile.name,\n options,\n };\n }\n }\n\n return undefined;\n};\n\nconst resolveChunkingOptions = (\n document: RAGIngestDocument,\n defaults?: RAGChunkingOptions,\n registry?: RAGChunkingRegistryLike,\n format?: RAGContentFormat,\n normalizedText?: string,\n): Required<\n Pick<\n RAGChunkingOptions,\n \"chunkOverlap\" | \"maxChunkLength\" | \"minChunkLength\" | \"strategy\"\n >\n> => {\n const resolvedFormat = format ?? inferFormat(document);\n const resolvedNormalizedText =\n normalizedText ?? normalizeDocumentText(document.text, resolvedFormat);\n const profileOverrides = resolveChunkingProfileOverrides({\n defaults,\n document,\n format: resolvedFormat,\n normalizedText: resolvedNormalizedText,\n registry,\n });\n const maxChunkLength =\n document.chunking?.maxChunkLength ??\n profileOverrides?.options.maxChunkLength ??\n defaults?.maxChunkLength ??\n DEFAULT_MAX_CHUNK_LENGTH;\n const chunkOverlap =\n document.chunking?.chunkOverlap ??\n profileOverrides?.options.chunkOverlap ??\n defaults?.chunkOverlap ??\n DEFAULT_CHUNK_OVERLAP;\n const minChunkLength =\n document.chunking?.minChunkLength ??\n profileOverrides?.options.minChunkLength ??\n defaults?.minChunkLength ??\n DEFAULT_MIN_CHUNK_LENGTH;\n const strategy =\n document.chunking?.strategy ??\n profileOverrides?.options.strategy ??\n defaults?.strategy ??\n DEFAULT_STRATEGY;\n\n return {\n chunkOverlap: Math.max(0, Math.min(chunkOverlap, maxChunkLength - 1)),\n maxChunkLength: Math.max(RAG_MIN_CHUNK_LENGTH_FLOOR, maxChunkLength),\n minChunkLength: Math.max(1, minChunkLength),\n strategy,\n };\n};\n\nconst createChunkEntries = (\n document: RAGIngestDocument,\n format: RAGContentFormat,\n text: string,\n options: Required<\n Pick<\n RAGChunkingOptions,\n \"chunkOverlap\" | \"maxChunkLength\" | \"minChunkLength\" | \"strategy\"\n >\n >,\n): StructuredChunkUnit[] => {\n if (\n text.length <= options.maxChunkLength &&\n options.strategy !== \"source_aware\"\n ) {\n return [{ text }];\n }\n\n if (options.strategy === \"source_aware\") {\n return sourceAwareUnits(document, format, text).flatMap((unit) =>\n chunkSourceAwareUnit(unit, options),\n );\n }\n\n const units = resolveChunkingUnits(text, options);\n\n return chunkFromUnits(\n units,\n options.maxChunkLength,\n options.chunkOverlap,\n options.minChunkLength,\n ).map((entry) => ({ text: entry }));\n};\n\nexport const prepareRAGDocument = (\n document: RAGIngestDocument,\n defaultChunking?: RAGChunkingOptions,\n chunkingRegistry?: RAGChunkingRegistryLike,\n): RAGPreparedDocument => {\n const format = inferFormat(document);\n const normalizedText = normalizeDocumentText(document.text, format);\n const chunkingProfileOverrides = resolveChunkingProfileOverrides({\n defaults: defaultChunking,\n document,\n format,\n normalizedText,\n registry: chunkingRegistry,\n });\n const chunking = resolveChunkingOptions(\n document,\n defaultChunking,\n chunkingRegistry,\n format,\n normalizedText,\n );\n const documentId =\n document.id?.trim() ||\n slugify(\n document.source ||\n document.title ||\n normalizedText.slice(0, RAG_DOCUMENT_ID_PREVIEW_LENGTH),\n );\n const title = document.title?.trim() || documentId;\n let sourceExtension = \"txt\";\n if (format === \"markdown\") {\n sourceExtension = \"md\";\n } else if (format === \"html\") {\n sourceExtension = \"html\";\n }\n\n const source = document.source?.trim() || `${documentId}.${sourceExtension}`;\n const corpusKey =\n document.corpusKey?.trim() ||\n (typeof document.metadata?.corpusKey === \"string\"\n ? document.metadata.corpusKey.trim()\n : undefined) ||\n undefined;\n const metadata: RAGPreparedDocument[\"metadata\"] = {\n ...(document.metadata ?? {}),\n ...(corpusKey ? { corpusKey } : {}),\n documentId,\n ...(chunkingProfileOverrides?.name\n ? { chunkingProfile: chunkingProfileOverrides.name }\n : {}),\n format,\n source,\n title,\n };\n const chunkEntries = createChunkEntries(\n document,\n format,\n normalizedText,\n chunking,\n );\n const chunks: RAGDocumentChunk[] = chunkEntries.map((entry, index) => {\n const sectionPath = Array.isArray(entry.sectionPath)\n ? entry.sectionPath.filter(\n (value) => typeof value === \"string\" && value.length > 0,\n )\n : undefined;\n const sectionTitle =\n typeof entry.sectionTitle === \"string\" && entry.sectionTitle.length > 0\n ? entry.sectionTitle\n : sectionPath?.at(-1);\n const chunkTitle =\n sectionTitle && sectionTitle !== title\n ? `${title} · ${sectionTitle}`\n : title;\n const sectionChunkId =\n sectionPath && sectionPath.length > 0\n ? `${documentId}:section:${slugify(sectionPath.join(\" \"))}`\n : undefined;\n const sectionSiblingIndexes =\n sectionChunkId === undefined\n ? [index]\n : chunkEntries.reduce<number[]>(\n (indexes, candidate, candidateIndex) => {\n const candidatePath = Array.isArray(candidate.sectionPath)\n ? candidate.sectionPath.filter(\n (value) => typeof value === \"string\" && value.length > 0,\n )\n : undefined;\n const candidateSectionId =\n candidatePath && candidatePath.length > 0\n ? `${documentId}:section:${slugify(candidatePath.join(\" \"))}`\n : undefined;\n if (candidateSectionId === sectionChunkId) {\n indexes.push(candidateIndex);\n }\n return indexes;\n },\n [],\n );\n const sectionChunkIndex = sectionSiblingIndexes.indexOf(index);\n const previousChunkId =\n index > 0\n ? `${documentId}:${String(index).padStart(RAG_CHUNK_ID_PAD_LENGTH, \"0\")}`\n : undefined;\n const nextChunkId =\n index + 1 < chunkEntries.length\n ? `${documentId}:${String(index + 2).padStart(RAG_CHUNK_ID_PAD_LENGTH, \"0\")}`\n : undefined;\n\n return {\n chunkId: `${documentId}:${String(index + 1).padStart(RAG_CHUNK_ID_PAD_LENGTH, \"0\")}`,\n ...(corpusKey ? { corpusKey } : {}),\n metadata: {\n ...metadata,\n chunkCount: chunkEntries.length,\n chunkIndex: index,\n ...(sectionTitle ? { sectionTitle } : {}),\n ...(sectionPath && sectionPath.length > 0 ? { sectionPath } : {}),\n ...(typeof entry.sectionDepth === \"number\"\n ? { sectionDepth: entry.sectionDepth }\n : {}),\n ...(Array.isArray(entry.sectionFamilyPath) &&\n entry.sectionFamilyPath.length > 0\n ? { sectionFamilyPath: entry.sectionFamilyPath }\n : {}),\n ...(Array.isArray(entry.sectionOrdinalPath) &&\n entry.sectionOrdinalPath.length > 0\n ? { sectionOrdinalPath: entry.sectionOrdinalPath }\n : {}),\n ...(typeof entry.sectionSiblingFamilyKey === \"string\"\n ? { sectionSiblingFamilyKey: entry.sectionSiblingFamilyKey }\n : {}),\n ...(typeof entry.sectionSiblingOrdinal === \"number\"\n ? { sectionSiblingOrdinal: entry.sectionSiblingOrdinal }\n : {}),\n ...(Array.isArray(entry.spreadsheetHeaders) &&\n entry.spreadsheetHeaders.length > 0\n ? { spreadsheetHeaders: entry.spreadsheetHeaders }\n : {}),\n ...(typeof entry.spreadsheetColumnStart === \"string\"\n ? { spreadsheetColumnStart: entry.spreadsheetColumnStart }\n : {}),\n ...(typeof entry.spreadsheetColumnEnd === \"string\"\n ? { spreadsheetColumnEnd: entry.spreadsheetColumnEnd }\n : {}),\n ...(typeof entry.spreadsheetTableIndex === \"number\"\n ? { spreadsheetTableIndex: entry.spreadsheetTableIndex }\n : {}),\n ...(typeof entry.spreadsheetTableCount === \"number\"\n ? { spreadsheetTableCount: entry.spreadsheetTableCount }\n : {}),\n ...(typeof entry.spreadsheetRowStart === \"number\"\n ? { spreadsheetRowStart: entry.spreadsheetRowStart }\n : {}),\n ...(typeof entry.spreadsheetRowEnd === \"number\"\n ? { spreadsheetRowEnd: entry.spreadsheetRowEnd }\n : {}),\n ...(typeof entry.pageNumber === \"number\"\n ? { pageNumber: entry.pageNumber }\n : {}),\n ...(typeof entry.officeBlockNumber === \"number\"\n ? { officeBlockNumber: entry.officeBlockNumber }\n : {}),\n ...(entry.officeBlockKind\n ? { officeBlockKind: entry.officeBlockKind }\n : {}),\n ...(Array.isArray(entry.officeFamilyPath) &&\n entry.officeFamilyPath.length > 0\n ? { officeFamilyPath: entry.officeFamilyPath }\n : {}),\n ...(Array.isArray(entry.officeOrdinalPath) &&\n entry.officeOrdinalPath.length > 0\n ? { officeOrdinalPath: entry.officeOrdinalPath }\n : {}),\n ...(typeof entry.officeSiblingFamilyKey === \"string\"\n ? { officeSiblingFamilyKey: entry.officeSiblingFamilyKey }\n : {}),\n ...(typeof entry.officeSiblingOrdinal === \"number\"\n ? { officeSiblingOrdinal: entry.officeSiblingOrdinal }\n : {}),\n ...(typeof entry.officeListContextText === \"string\"\n ? { officeListContextText: entry.officeListContextText }\n : {}),\n ...(typeof entry.officeListGroupItemCount === \"number\"\n ? {\n officeListGroupItemCount: entry.officeListGroupItemCount,\n }\n : {}),\n ...(typeof entry.officeListLevel === \"number\"\n ? { officeListLevel: entry.officeListLevel }\n : {}),\n ...(Array.isArray(entry.officeListLevels) &&\n entry.officeListLevels.length > 0\n ? { officeListLevels: entry.officeListLevels }\n : {}),\n ...(typeof entry.officeTableBodyRowCount === \"number\"\n ? { officeTableBodyRowCount: entry.officeTableBodyRowCount }\n : {}),\n ...(typeof entry.officeTableBodyRowEnd === \"number\"\n ? { officeTableBodyRowEnd: entry.officeTableBodyRowEnd }\n : {}),\n ...(typeof entry.officeTableBodyRowStart === \"number\"\n ? { officeTableBodyRowStart: entry.officeTableBodyRowStart }\n : {}),\n ...(entry.officeTableChunkKind\n ? { officeTableChunkKind: entry.officeTableChunkKind }\n : {}),\n ...(typeof entry.officeTableColumnCount === \"number\"\n ? { officeTableColumnCount: entry.officeTableColumnCount }\n : {}),\n ...(typeof entry.officeTableContextText === \"string\"\n ? { officeTableContextText: entry.officeTableContextText }\n : {}),\n ...(typeof entry.officeTableFollowUpText === \"string\"\n ? { officeTableFollowUpText: entry.officeTableFollowUpText }\n : {}),\n ...(typeof entry.officeTableHeaderText === \"string\"\n ? { officeTableHeaderText: entry.officeTableHeaderText }\n : {}),\n ...(Array.isArray(entry.officeTableHeaders) &&\n entry.officeTableHeaders.length > 0\n ? { officeTableHeaders: entry.officeTableHeaders }\n : {}),\n ...(typeof entry.officeTableRowCount === \"number\"\n ? { officeTableRowCount: entry.officeTableRowCount }\n : {}),\n ...(typeof entry.officeTableSignature === \"string\"\n ? { officeTableSignature: entry.officeTableSignature }\n : {}),\n ...(typeof entry.pdfBlockNumber === \"number\"\n ? { pdfBlockNumber: entry.pdfBlockNumber }\n : {}),\n ...(typeof entry.pdfFigureCaptionBlockNumber === \"number\"\n ? {\n pdfFigureCaptionBlockNumber: entry.pdfFigureCaptionBlockNumber,\n }\n : {}),\n ...(typeof entry.pdfFigureLabel === \"string\"\n ? { pdfFigureLabel: entry.pdfFigureLabel }\n : {}),\n ...(entry.pdfSemanticRole\n ? { pdfSemanticRole: entry.pdfSemanticRole }\n : {}),\n ...(typeof entry.pdfTableBodyRowEnd === \"number\"\n ? { pdfTableBodyRowEnd: entry.pdfTableBodyRowEnd }\n : {}),\n ...(typeof entry.pdfTableBodyRowCount === \"number\"\n ? { pdfTableBodyRowCount: entry.pdfTableBodyRowCount }\n : {}),\n ...(typeof entry.pdfTableBodyRowStart === \"number\"\n ? { pdfTableBodyRowStart: entry.pdfTableBodyRowStart }\n : {}),\n ...(entry.pdfTableChunkKind\n ? { pdfTableChunkKind: entry.pdfTableChunkKind }\n : {}),\n ...(typeof entry.pdfTableColumnCount === \"number\"\n ? { pdfTableColumnCount: entry.pdfTableColumnCount }\n : {}),\n ...(typeof entry.pdfTableHeaderText === \"string\"\n ? { pdfTableHeaderText: entry.pdfTableHeaderText }\n : {}),\n ...(Array.isArray(entry.pdfTableHeaders) &&\n entry.pdfTableHeaders.length > 0\n ? { pdfTableHeaders: entry.pdfTableHeaders }\n : {}),\n ...(typeof entry.pdfTableRowCount === \"number\"\n ? { pdfTableRowCount: entry.pdfTableRowCount }\n : {}),\n ...(typeof entry.pdfTableSignature === \"string\"\n ? { pdfTableSignature: entry.pdfTableSignature }\n : {}),\n ...(entry.pdfTextKind ? { pdfTextKind: entry.pdfTextKind } : {}),\n ...(entry.emailSectionKind\n ? { emailSectionKind: entry.emailSectionKind }\n : {}),\n ...(Array.isArray(entry.emailForwardedBccAddresses) &&\n entry.emailForwardedBccAddresses.length > 0\n ? {\n emailForwardedBccAddresses: entry.emailForwardedBccAddresses,\n }\n : {}),\n ...(Array.isArray(entry.emailForwardedCcAddresses) &&\n entry.emailForwardedCcAddresses.length > 0\n ? {\n emailForwardedCcAddresses: entry.emailForwardedCcAddresses,\n }\n : {}),\n ...(typeof entry.emailForwardedDate === \"string\"\n ? { emailForwardedDate: entry.emailForwardedDate }\n : {}),\n ...(typeof entry.emailForwardedFromAddress === \"string\"\n ? {\n emailForwardedFromAddress: entry.emailForwardedFromAddress,\n }\n : {}),\n ...(typeof entry.emailForwardedFromDisplayName === \"string\"\n ? {\n emailForwardedFromDisplayName:\n entry.emailForwardedFromDisplayName,\n }\n : {}),\n ...(typeof entry.emailForwardedChainCount === \"number\"\n ? {\n emailForwardedChainCount: entry.emailForwardedChainCount,\n }\n : {}),\n ...(typeof entry.emailForwardedOrdinal === \"number\"\n ? { emailForwardedOrdinal: entry.emailForwardedOrdinal }\n : {}),\n ...(typeof entry.emailQuotedDepth === \"number\"\n ? { emailQuotedDepth: entry.emailQuotedDepth }\n : {}),\n ...(entry.emailForwardedHeaderFields\n ? {\n emailForwardedHeaderFields: entry.emailForwardedHeaderFields,\n }\n : {}),\n ...(Array.isArray(entry.emailForwardedParticipantAddresses) &&\n entry.emailForwardedParticipantAddresses.length > 0\n ? {\n emailForwardedParticipantAddresses:\n entry.emailForwardedParticipantAddresses,\n }\n : {}),\n ...(Array.isArray(entry.emailForwardedReplyToAddresses) &&\n entry.emailForwardedReplyToAddresses.length > 0\n ? {\n emailForwardedReplyToAddresses:\n entry.emailForwardedReplyToAddresses,\n }\n : {}),\n ...(typeof entry.emailForwardedSubject === \"string\"\n ? { emailForwardedSubject: entry.emailForwardedSubject }\n : {}),\n ...(typeof entry.emailForwardedTimestamp === \"string\"\n ? { emailForwardedTimestamp: entry.emailForwardedTimestamp }\n : {}),\n ...(Array.isArray(entry.emailForwardedToAddresses) &&\n entry.emailForwardedToAddresses.length > 0\n ? {\n emailForwardedToAddresses: entry.emailForwardedToAddresses,\n }\n : {}),\n ...(entry.sectionKind ? { sectionKind: entry.sectionKind } : {}),\n ...(entry.sourceAwareChunkReason\n ? { sourceAwareChunkReason: entry.sourceAwareChunkReason }\n : {}),\n ...(sectionChunkId ? { sectionChunkId } : {}),\n ...(sectionChunkId && sectionChunkIndex >= 0\n ? {\n sectionChunkCount: sectionSiblingIndexes.length,\n sectionChunkIndex,\n }\n : {}),\n ...(previousChunkId ? { previousChunkId } : {}),\n ...(nextChunkId ? { nextChunkId } : {}),\n },\n source,\n text: entry.text,\n title: chunkTitle,\n };\n });\n\n return {\n ...(corpusKey ? { corpusKey } : {}),\n chunks,\n documentId,\n format,\n metadata,\n normalizedText,\n source,\n title,\n };\n};\n\nexport const prepareRAGDocuments = (input: RAGDocumentIngestInput) =>\n input.documents.map((document) =>\n prepareRAGDocument(document, input.defaultChunking, input.chunkingRegistry),\n );\n\nexport const mergeMetadata = (\n inputMetadata: Record<string, unknown> | undefined,\n extraMetadata: Record<string, unknown> | undefined,\n baseMetadata: Record<string, unknown> | undefined,\n) => ({\n ...(baseMetadata ?? {}),\n ...(inputMetadata ?? {}),\n ...(extraMetadata ?? {}),\n});\n\nexport const buildRAGUpsertInputFromURLs = async (\n input: RAGDocumentUrlIngestInput,\n) => ({\n chunks: prepareRAGDocuments(await loadRAGDocumentsFromURLs(input)).flatMap(\n (document) => document.chunks,\n ),\n});\nexport const loadRAGDocumentFile = async (input: RAGDocumentFileInput) => {\n const data = await readFile(input.path);\n const documents = await extractRAGFileDocuments(\n {\n chunking: input.chunking,\n contentType: input.contentType,\n data,\n extractorRegistry: input.extractorRegistry,\n format: input.format,\n metadata: input.metadata,\n path: input.path,\n source: input.source,\n title: input.title,\n },\n input.extractors,\n input.extractorRegistry,\n );\n\n return getFirstExtractedDocument(documents, \"for file input\");\n};\nexport const loadRAGDocumentFromURL = async (input: RAGDocumentUrlInput) => {\n const url = input.url.trim();\n if (!url) {\n throw new Error(\"RAG URL is required\");\n }\n\n const response = await fetch(url, h2IfHttps(url));\n if (!response.ok) {\n throw new Error(\n `Failed to fetch RAG URL ${url}: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = new Uint8Array(await response.arrayBuffer());\n const documents = await extractRAGFileDocuments(\n {\n chunking: input.chunking,\n contentType:\n input.contentType ?? response.headers.get(\"content-type\") ?? undefined,\n data,\n extractorRegistry: input.extractorRegistry,\n format: input.format ?? inferFormatFromContentType(input.contentType ?? response.headers.get(\"content-type\")) ?? inferFormatFromUrl(url),\n metadata: input.metadata,\n name: basename(new URL(url).pathname),\n source: input.source ?? url,\n title: input.title,\n },\n input.extractors,\n input.extractorRegistry,\n );\n\n return getFirstExtractedDocument(documents, \"for URL input\");\n};\nexport const loadRAGDocumentsFromUploads = async (\n input: RAGDocumentUploadIngestInput,\n) => {\n const documents = await Promise.all(\n input.uploads.map(async (upload) => {\n const loaded = await loadExtractedDocuments(\n {\n chunking: upload.chunking,\n contentType: upload.contentType,\n data: decodeUploadContent(upload),\n extractorRegistry: input.extractorRegistry,\n format: upload.format,\n metadata: upload.metadata,\n name: upload.name,\n source: upload.source ?? upload.name,\n title: upload.title,\n },\n input.extractors,\n input.extractorRegistry,\n );\n\n return loaded.map((document) => ({\n ...document,\n metadata: mergeMetadata(\n document.metadata,\n { uploadFile: upload.name },\n input.baseMetadata,\n ),\n }));\n }),\n );\n\n return {\n defaultChunking: input.defaultChunking,\n chunkingRegistry: input.chunkingRegistry,\n documents: reconcileLoadedEmailThreads(documents.flat()),\n };\n};\nexport const loadRAGDocumentsFromURLs = async (\n input: RAGDocumentUrlIngestInput,\n) => {\n const documents = await Promise.all(\n input.urls.map(async (urlInput) => {\n const url = urlInput.url.trim();\n if (!url) {\n throw new Error(\"RAG URL is required\");\n }\n\n const response = await fetch(url, h2IfHttps(url));\n if (!response.ok) {\n throw new Error(\n `Failed to fetch RAG URL ${url}: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = new Uint8Array(await response.arrayBuffer());\n const loaded = await loadExtractedDocuments(\n {\n chunking: urlInput.chunking,\n contentType:\n urlInput.contentType ??\n response.headers.get(\"content-type\") ??\n undefined,\n data,\n extractorRegistry:\n urlInput.extractorRegistry ?? input.extractorRegistry,\n format: urlInput.format ?? inferFormatFromContentType(urlInput.contentType ?? response.headers.get(\"content-type\")) ?? inferFormatFromUrl(url),\n metadata: urlInput.metadata,\n name: basename(new URL(url).pathname),\n source: urlInput.source ?? url,\n title: urlInput.title,\n },\n urlInput.extractors ?? input.extractors,\n urlInput.extractorRegistry ?? input.extractorRegistry,\n );\n\n return loaded.map((document) => ({\n ...document,\n metadata: mergeMetadata(\n document.metadata,\n { sourceUrl: urlInput.url },\n input.baseMetadata,\n ),\n }));\n }),\n );\n\n return {\n defaultChunking: input.defaultChunking,\n chunkingRegistry: input.chunkingRegistry,\n documents: reconcileLoadedEmailThreads(documents.flat()),\n };\n};\nexport const loadRAGDocumentUpload = async (\n input: RAGDocumentUploadInput & {\n extractors?: RAGFileExtractor[];\n extractorRegistry?: RAGFileExtractorRegistryLike;\n },\n) => {\n const documents = await extractRAGFileDocuments(\n {\n chunking: input.chunking,\n contentType: input.contentType,\n data: decodeUploadContent(input),\n extractorRegistry: input.extractorRegistry,\n format: input.format,\n metadata: input.metadata,\n name: input.name,\n source: input.source ?? input.name,\n title: input.title,\n },\n input.extractors,\n input.extractorRegistry,\n );\n\n return getFirstExtractedDocument(documents, \"for upload input\");\n};\nexport const prepareRAGDocumentFile = async (\n input: RAGDocumentFileInput,\n defaultChunking?: RAGChunkingOptions,\n chunkingRegistry?: RAGChunkingRegistryLike,\n) =>\n prepareRAGDocument(\n await loadRAGDocumentFile(input),\n defaultChunking,\n chunkingRegistry,\n );\n\nconst DEFAULT_DIRECTORY_EXTENSIONS = [\n \".txt\",\n \".md\",\n \".mdx\",\n \".html\",\n \".htm\",\n \".json\",\n \".csv\",\n \".xml\",\n \".yaml\",\n \".yml\",\n \".pdf\",\n \".eml\",\n \".emlx\",\n \".mbox\",\n \".mbx\",\n];\n\nconst collectDirectoryFiles = async (\n directory: string,\n recursive: boolean,\n includeExtensions: Set<string> | null,\n) => {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n const collectNestedDirectoryFiles = (fullPath: string) =>\n collectDirectoryFiles(fullPath, recursive, includeExtensions);\n const shouldIncludeDirectoryFile = (\n entryName: string,\n sourcePath?: string,\n ) => {\n if (includeExtensions === null) {\n return true;\n }\n\n const extension = extname(entryName).toLowerCase();\n if (parseMaildirMetadata(sourcePath ?? entryName)) {\n return true;\n }\n\n return includeExtensions.has(extension);\n };\n const appendNestedDirectoryFiles = async (fullPath: string) => {\n if (!recursive) {\n return;\n }\n\n files.push(...(await collectNestedDirectoryFiles(fullPath)));\n };\n const processDirectoryEntry = async (\n entry: (typeof entries)[number],\n fullPath: string,\n ) => {\n if (entry.isDirectory()) {\n await appendNestedDirectoryFiles(fullPath);\n\n return true;\n }\n\n if (!entry.isFile()) {\n return true;\n }\n\n if (!shouldIncludeDirectoryFile(entry.name, fullPath)) {\n return true;\n }\n\n files.push(fullPath);\n\n return true;\n };\n\n await Promise.all(\n entries.map(async (entry) => {\n const fullPath = join(directory, entry.name);\n await processDirectoryEntry(entry, fullPath);\n }),\n );\n\n return files.sort();\n};\n\nexport const buildRAGUpsertInputFromDirectory = async (\n input: RAGDirectoryIngestInput,\n) =>\n buildRAGUpsertInputFromDocuments(await loadRAGDocumentsFromDirectory(input));\nexport const buildRAGUpsertInputFromDocuments = (\n input: RAGDocumentIngestInput,\n) => ({\n chunks: prepareRAGDocuments(input).flatMap((document) => document.chunks),\n});\n\nexport const buildRAGUpsertInputFromUploads = async (\n input: RAGDocumentUploadIngestInput,\n) => ({\n chunks: prepareRAGDocuments(await loadRAGDocumentsFromUploads(input)).flatMap(\n (document) => document.chunks,\n ),\n});\n\nexport const loadRAGDocumentsFromDirectory = async (\n input: RAGDirectoryIngestInput,\n) => {\n const root = resolve(input.directory);\n const includeExtensions =\n input.includeExtensions === undefined &&\n (input.extractors?.length || input.extractorRegistry)\n ? null\n : new Set(\n (input.includeExtensions ?? DEFAULT_DIRECTORY_EXTENSIONS).map(\n (entry) =>\n entry.startsWith(\".\")\n ? entry.toLowerCase()\n : `.${entry.toLowerCase()}`,\n ),\n );\n const files = await collectDirectoryFiles(\n root,\n input.recursive !== false,\n includeExtensions,\n );\n\n const documents = await Promise.all(\n files.map(async (path) => {\n const source = relative(root, path).replace(/\\\\/g, \"/\");\n const data = await readFile(path);\n const loaded = await loadExtractedDocuments(\n {\n chunking: input.defaultChunking,\n data,\n extractorRegistry: input.extractorRegistry,\n metadata: {\n fileName: basename(path),\n relativePath: source,\n },\n path,\n source,\n },\n input.extractors,\n input.extractorRegistry,\n );\n\n return loaded.map((document) => ({\n ...document,\n metadata: mergeMetadata(\n document.metadata,\n undefined,\n input.baseMetadata,\n ),\n }));\n }),\n );\n\n return {\n defaultChunking: input.defaultChunking,\n chunkingRegistry: input.chunkingRegistry,\n documents: reconcileLoadedEmailThreads(documents.flat()),\n };\n};\nexport const prepareRAGDirectoryDocuments = async (\n input: RAGDirectoryIngestInput,\n) => prepareRAGDocuments(await loadRAGDocumentsFromDirectory(input));\n",
6
+ "export const HTTP_STATUS_OK = 200;\nexport const HTTP_STATUS_BAD_REQUEST = 400;\nexport const HTTP_STATUS_NOT_FOUND = 404;\nexport const EXCLUDE_LAST_OFFSET = -1;\nexport const RAG_CHUNK_ID_PAD_LENGTH = 3;\nexport const RAG_DOCUMENT_ID_PREVIEW_LENGTH = 32;\nexport const RAG_DOCUMENT_SLUG_MAX_LENGTH = 48;\nexport const RAG_MIN_CHUNK_LENGTH_FLOOR = 120;\nexport const RAG_SEARCH_SCORE_DECIMAL_PLACES = 3;\n",
7
+ "import { lookup } from \"node:dns/promises\";\nimport { isIP } from \"node:net\";\nimport { request as httpRequest } from \"node:http\";\nimport { request as httpsRequest } from \"node:https\";\nimport { brotliDecompressSync, gunzipSync, inflateSync } from \"node:zlib\";\n\nexport class WebReadError extends Error {\n constructor(\n public code: string,\n message: string,\n ) {\n super(message);\n this.name = \"WebReadError\";\n }\n}\nexport const isPublicWebAddress = (address: string) => {\n if (isIP(address) === 4) {\n const [a = 0, b = 0, c = 0] = address.split(\".\").map(Number);\n return !(\n a === 0 ||\n a === 10 ||\n a === 127 ||\n a >= 224 ||\n (a === 100 && b >= 64 && b <= 127) ||\n (a === 169 && b === 254) ||\n (a === 172 && b >= 16 && b <= 31) ||\n (a === 192 && (b === 168 || b === 0 || (b === 88 && c === 99))) ||\n (a === 198 && (b === 18 || b === 19 || (b === 51 && c === 100))) ||\n (a === 203 && b === 0 && c === 113)\n );\n }\n const value = address.toLowerCase();\n return (\n isIP(value) === 6 &&\n /^[23]/u.test(value) &&\n !/^2001:(?:db8|0):/u.test(value) &&\n !value.startsWith(\"2002:\")\n );\n};\nexport type WebFetchResult = {\n url: string;\n status: number;\n headers: Record<string, string>;\n body: Uint8Array;\n};\nexport type WebFetchOptions = {\n signal?: AbortSignal;\n redirect?: \"follow\" | \"manual\";\n maxBytes?: number;\n method?: string;\n body?: string;\n headers?: Record<string, string>;\n};\nexport const validatePublicWebUrl = (raw: string) => {\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n throw new WebReadError(\n \"invalid_url\",\n \"Provide a valid public HTTP or HTTPS URL.\",\n );\n }\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password ||\n (url.port && ![\"80\", \"443\"].includes(url.port))\n )\n throw new WebReadError(\n \"blocked_url\",\n \"Only public HTTP/HTTPS URLs on standard ports are supported.\",\n );\n const host = url.hostname.replace(/^\\[|\\]$/gu, \"\").toLowerCase();\n if (\n host === \"localhost\" ||\n /\\.(?:localhost|local|internal)$/u.test(host) ||\n (isIP(host) && !isPublicWebAddress(host))\n )\n throw new WebReadError(\n \"blocked_url\",\n \"Private and local network destinations are not allowed.\",\n );\n return url;\n};\n/** Pin the validated DNS answer into the connection, including every redirect. */\nexport const fetchPublicWebResource = async (\n raw: string,\n options: WebFetchOptions = {},\n): Promise<WebFetchResult> => {\n const signal = options.signal ?? AbortSignal.timeout(15000);\n const maxBytes = options.maxBytes ?? 5_000_000;\n let url = validatePublicWebUrl(raw);\n let method = options.method ?? \"GET\";\n let body = options.body;\n for (let hop = 0; hop <= 5; hop++) {\n signal.throwIfAborted();\n const host = url.hostname.replace(/^\\[|\\]$/gu, \"\");\n const addresses = await lookup(host, { all: true });\n if (\n !addresses.length ||\n addresses.some(({ address }) => !isPublicWebAddress(address))\n )\n throw new WebReadError(\n \"blocked_url\",\n \"The destination resolved to a private or reserved network.\",\n );\n signal.throwIfAborted();\n const selected =\n addresses.find(({ family }) => family === 4) ?? addresses[0]!;\n const response = await new Promise<WebFetchResult>((resolve, reject) => {\n const request = url.protocol === \"https:\" ? httpsRequest : httpRequest;\n const req = request(\n {\n protocol: url.protocol,\n hostname: selected.address,\n family: selected.family,\n servername: isIP(host) ? undefined : host,\n port: url.port || undefined,\n path: url.pathname + url.search,\n method,\n signal,\n agent: false,\n headers: {\n \"user-agent\": \"onSparkReader/1.0 (+https://onspark.com)\",\n accept: \"*/*\",\n \"accept-encoding\": \"identity\",\n ...options.headers,\n host: url.host,\n },\n },\n (res) => {\n const chunks: Buffer[] = [];\n let bytes = 0;\n res.on(\"error\", reject);\n res.on(\"data\", (chunk: Buffer) => {\n bytes += chunk.length;\n if (bytes > maxBytes) {\n const error = new WebReadError(\n \"too_large\",\n \"The response exceeded the website read limit.\",\n );\n res.destroy(error);\n reject(error);\n } else chunks.push(chunk);\n });\n res.on(\"end\", () => {\n try {\n let data: Uint8Array = Buffer.concat(chunks);\n const encoding = res.headers[\"content-encoding\"];\n const limits = { maxOutputLength: maxBytes };\n if (encoding === \"gzip\") data = gunzipSync(data, limits);\n else if (encoding === \"br\")\n data = brotliDecompressSync(data, limits);\n else if (encoding === \"deflate\") data = inflateSync(data, limits);\n const headers = Object.fromEntries(\n Object.entries(res.headers)\n .filter(\n ([key]) =>\n ![\n \"content-encoding\",\n \"content-length\",\n \"transfer-encoding\",\n \"set-cookie\",\n ].includes(key),\n )\n .map(([key, value]) => [\n key,\n Array.isArray(value) ? value.join(\", \") : (value ?? \"\"),\n ]),\n );\n resolve({\n url: url.href,\n status: res.statusCode ?? 502,\n headers,\n body: data,\n });\n } catch (error) {\n reject(error);\n }\n });\n },\n );\n req.on(\"error\", reject);\n if (body) req.write(body);\n req.end();\n });\n if (options.redirect === \"manual\") return response;\n if (\n [301, 302, 303, 307, 308].includes(response.status) &&\n response.headers.location\n ) {\n url = validatePublicWebUrl(new URL(response.headers.location, url).href);\n if (\n response.status === 303 ||\n ([301, 302].includes(response.status) && method === \"POST\")\n ) {\n method = \"GET\";\n body = undefined;\n }\n continue;\n }\n return response;\n }\n throw new WebReadError(\n \"redirect_limit\",\n \"The site exceeded the redirect limit.\",\n );\n};\n",
8
+ "import {\n loadRAGDocumentUpload,\n prepareRAGDocument,\n} from \"../ingestion/ingestion\";\nimport {\n fetchPublicWebResource,\n validatePublicWebUrl,\n WebReadError,\n type WebFetchResult,\n} from \"./transport\";\nexport {\n fetchPublicWebResource,\n validatePublicWebUrl,\n isPublicWebAddress,\n WebReadError,\n} from \"./transport\";\nexport type { WebFetchResult, WebFetchOptions } from \"./transport\";\nexport type WebReadAttempt = {\n method: \"http\" | \"browser\";\n status: string;\n httpStatus?: number;\n extractedChars?: number;\n};\nexport type WebReadResult = {\n status: \"ok\" | \"partial\" | \"error\";\n url: string;\n finalUrl: string;\n title: string | null;\n text: string;\n method: \"http\" | \"browser\";\n truncated: boolean;\n attempts: WebReadAttempt[];\n error?: { code: string; message: string };\n fetchedAt: string;\n};\nexport type WebRenderer = (\n url: string,\n options: { signal: AbortSignal },\n) => Promise<{ html: string; text?: string; url: string; status: number }>;\nexport type ReadWebpageOptions = {\n url: string;\n render?: WebRenderer;\n signal?: AbortSignal;\n maxChars?: number;\n mode?: \"auto\" | \"browser\";\n fetchResource?: typeof fetchPublicWebResource;\n};\nconst messageFor = (error: unknown) =>\n error instanceof Error ? error.message : \"Website retrieval failed.\";\nconst codeFor = (error: unknown) =>\n error instanceof WebReadError\n ? error.code\n : error instanceof Error &&\n /^(?:AbortError|TimeoutError)$/u.test(error.name)\n ? \"timeout\"\n : \"fetch_failed\";\nconst cleanHtml = (html: string) =>\n prepareRAGDocument({ text: html, format: \"html\" }).normalizedText;\nconst titleOf = (html: string) => {\n const title = /<title\\b[^>]*>([\\s\\S]*?)<\\/title>/iu.exec(html)?.[1];\n return title\n ? prepareRAGDocument({ text: title, format: \"html\" }).normalizedText\n : null;\n};\nconst isShell = (html: string, text: string) =>\n text.length < 300 ||\n /(?:enable|requires?|turn on)\\s+javascript|javascript\\s+(?:is\\s+)?(?:disabled|required)/iu.test(\n text,\n ) ||\n /<(?:div|main|section)[^>]*(?:id=[\"'](?:root|app|__next)[\"']|class=[\"']todoapp[\"'])[^>]*>\\s*<\\//iu.test(\n html,\n );\nconst isChallenge = (text: string) =>\n /verify (?:that )?you are human|checking your browser|just a moment|enable javascript and cookies to continue|access denied/iu.test(\n text.slice(0, 1000),\n );\n/** Read prepared evidence, escalating thin HTML shells to a host-supplied browser. */\nexport const readRAGWebpage = async (\n options: ReadWebpageOptions,\n): Promise<WebReadResult> => {\n const attempts: WebReadAttempt[] = [];\n const signal = options.signal ?? AbortSignal.timeout(45000);\n const maxChars = Math.max(1000, Math.min(options.maxChars ?? 24000, 100000));\n let finalUrl = options.url,\n text = \"\",\n title: string | null = null,\n method: \"http\" | \"browser\" = \"http\";\n const result = (\n status: WebReadResult[\"status\"],\n error?: WebReadResult[\"error\"],\n ): WebReadResult => ({\n status,\n url: options.url,\n finalUrl,\n title,\n text: text.slice(0, maxChars),\n method,\n truncated: text.length > maxChars,\n attempts,\n fetchedAt: new Date().toISOString(),\n ...(error ? { error } : {}),\n });\n try {\n validatePublicWebUrl(options.url);\n let response: WebFetchResult | undefined;\n try {\n response = await (options.fetchResource ?? fetchPublicWebResource)(\n options.url,\n { signal, maxBytes: 5_000_000 },\n );\n } catch (error) {\n attempts.push({ method: \"http\", status: codeFor(error) });\n if (error instanceof WebReadError && error.code === \"blocked_url\")\n throw error;\n if (!options.render) throw error;\n }\n let needsBrowser = options.mode === \"browser\" || !response;\n if (response) {\n finalUrl = response.url;\n const mime = response.headers[\"content-type\"] ?? \"\";\n const raw = new TextDecoder().decode(response.body);\n const html =\n /html/iu.test(mime) || /^\\s*(?:<!doctype html|<html)/iu.test(raw);\n if (response.status >= 200 && response.status < 300) {\n if (html) {\n text = cleanHtml(raw);\n title = titleOf(raw);\n needsBrowser ||= isShell(raw, text) || isChallenge(text);\n } else {\n const doc = await loadRAGDocumentUpload({\n content: Buffer.from(response.body).toString(\"base64\"),\n encoding: \"base64\",\n contentType: mime,\n name: new URL(finalUrl).pathname,\n source: finalUrl,\n });\n text = prepareRAGDocument(doc).normalizedText;\n title = doc.title ?? null;\n }\n attempts.push({\n method: \"http\",\n status: text ? \"extracted\" : \"empty\",\n httpStatus: response.status,\n extractedChars: text.length,\n });\n } else {\n attempts.push({\n method: \"http\",\n status: \"http_error\",\n httpStatus: response.status,\n });\n if (![401, 403, 429, 503].includes(response.status))\n return result(\"error\", {\n code: \"http_error\",\n message: `Website returned HTTP ${response.status}.`,\n });\n needsBrowser = true;\n }\n }\n if (needsBrowser) {\n if (!options.render)\n return result(text ? \"partial\" : \"error\", {\n code: \"rendering_required\",\n message:\n \"Static HTML was incomplete. Browser rendering is required; this is not evidence that the site has no information.\",\n });\n try {\n const rendered = await options.render(finalUrl, { signal });\n method = \"browser\";\n finalUrl = rendered.url;\n validatePublicWebUrl(finalUrl);\n text = rendered.text?.trim() ?? cleanHtml(rendered.html);\n title = titleOf(rendered.html) ?? title;\n attempts.push({\n method: \"browser\",\n status: text ? \"extracted\" : \"empty\",\n httpStatus: rendered.status,\n extractedChars: text.length,\n });\n if (rendered.status === 401)\n return result(\"error\", {\n code: \"authentication_required\",\n message: \"This page requires sign-in.\",\n });\n if ([403, 429].includes(rendered.status) || isChallenge(text))\n return result(\"error\", {\n code: \"access_blocked\",\n message:\n \"The website blocked automated access or presented a verification challenge.\",\n });\n if (rendered.status >= 400)\n return result(\"error\", {\n code: \"http_error\",\n message: `Website returned HTTP ${rendered.status}.`,\n });\n if (!text || /(?:enable|requires?)\\s+javascript/iu.test(text))\n return result(\"error\", {\n code: \"rendering_incomplete\",\n message:\n \"The page still provided no usable text after browser rendering.\",\n });\n } catch (error) {\n attempts.push({ method: \"browser\", status: codeFor(error) });\n return result(text ? \"partial\" : \"error\", {\n code: codeFor(error),\n message: messageFor(error),\n });\n }\n }\n return text\n ? result(\"ok\")\n : result(\"error\", {\n code: \"no_readable_content\",\n message: \"The page returned no readable text.\",\n });\n } catch (error) {\n return result(\"error\", {\n code: codeFor(error),\n message: messageFor(error),\n });\n }\n};\n"
9
+ ],
10
+ "mappings": "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",
11
+ "debugId": "AD7DDD739C0B1A5264756E2164756E21",
12
+ "names": []
13
+ }