@evalops/maestro 0.10.41 → 0.10.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +8 -1
- package/dist/node_modules/@evalops/contracts/package.json +1 -1
- package/dist/node_modules/@evalops/tui/package.json +1 -1
- package/dist/utils/document-extractor.d.ts.map +1 -1
- package/dist/utils/document-extractor.js +8 -1
- package/dist/utils/document-extractor.js.map +1 -1
- package/dist/version.json +2 -2
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -37456,7 +37456,6 @@ import { extname as extname7, join as join78 } from "node:path";
|
|
|
37456
37456
|
import ExcelJS from "exceljs";
|
|
37457
37457
|
import JSZip from "jszip";
|
|
37458
37458
|
import mammoth from "mammoth";
|
|
37459
|
-
import { PDFParse } from "pdf-parse";
|
|
37460
37459
|
import { Type as Type19 } from "@sinclair/typebox";
|
|
37461
37460
|
import { spawnSync as spawnSync9 } from "node:child_process";
|
|
37462
37461
|
import {
|
|
@@ -158137,6 +158136,12 @@ Tip: double-check whitespace/newlines via /diff ${path3}`;
|
|
|
158137
158136
|
}
|
|
158138
158137
|
});
|
|
158139
158138
|
});
|
|
158139
|
+
async function loadPDFParse() {
|
|
158140
|
+
if (!cachedPDFParse) {
|
|
158141
|
+
({ PDFParse: cachedPDFParse } = await import("pdf-parse"));
|
|
158142
|
+
}
|
|
158143
|
+
return cachedPDFParse;
|
|
158144
|
+
}
|
|
158140
158145
|
function clampText(text2, maxChars) {
|
|
158141
158146
|
if (text2.length <= maxChars)
|
|
158142
158147
|
return { text: text2, truncated: false };
|
|
@@ -158477,6 +158482,7 @@ async function extractDocumentText(input) {
|
|
|
158477
158482
|
if (!extractedText) {
|
|
158478
158483
|
switch (format) {
|
|
158479
158484
|
case "pdf": {
|
|
158485
|
+
const PDFParse = await loadPDFParse();
|
|
158480
158486
|
const parser2 = new PDFParse({ data: buffer });
|
|
158481
158487
|
try {
|
|
158482
158488
|
const result2 = await parser2.getText();
|
|
@@ -158552,6 +158558,7 @@ var MARKITDOWN_TIMEOUT_KILL_GRACE_MS = 500;
|
|
|
158552
158558
|
var MARKITDOWN_TIMEOUT_CLOSE_GRACE_MS = 1e3;
|
|
158553
158559
|
var NODE_TIMER_MAX_MS = 2147483647;
|
|
158554
158560
|
var XLSX_MIME = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
|
|
158561
|
+
var cachedPDFParse;
|
|
158555
158562
|
var init_document_extractor = __esm2(() => {
|
|
158556
158563
|
MAX_INPUT_BYTES = 50 * 1024 * 1024;
|
|
158557
158564
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-extractor.d.ts","sourceRoot":"","sources":["../../src/utils/document-extractor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"document-extractor.d.ts","sourceRoot":"","sources":["../../src/utils/document-extractor.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,uBAAuB,GAChC,KAAK,GACL,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,SAAS,CAAC;AAEb,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,uBAAuB,CAAC;IAChC,SAAS,EAAE,QAAQ,GAAG,YAAY,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CAClB;AAoaD,wBAAsB,mBAAmB,CACxC,KAAK,EAAE,oBAAoB,GACzB,OAAO,CAAC,qBAAqB,CAAC,CAuGhC"}
|
|
@@ -5,7 +5,6 @@ import { extname, join } from "node:path";
|
|
|
5
5
|
import ExcelJS from "exceljs";
|
|
6
6
|
import JSZip from "jszip";
|
|
7
7
|
import mammoth from "mammoth";
|
|
8
|
-
import { PDFParse } from "pdf-parse";
|
|
9
8
|
const DEFAULT_MAX_CHARS = 200_000;
|
|
10
9
|
const MAX_INPUT_BYTES = 50 * 1024 * 1024;
|
|
11
10
|
const MARKITDOWN_TIMEOUT_MS = 20_000;
|
|
@@ -13,6 +12,13 @@ const MARKITDOWN_TIMEOUT_KILL_GRACE_MS = 500;
|
|
|
13
12
|
const MARKITDOWN_TIMEOUT_CLOSE_GRACE_MS = 1_000;
|
|
14
13
|
const NODE_TIMER_MAX_MS = 2_147_483_647;
|
|
15
14
|
const XLSX_MIME = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
|
|
15
|
+
let cachedPDFParse;
|
|
16
|
+
async function loadPDFParse() {
|
|
17
|
+
if (!cachedPDFParse) {
|
|
18
|
+
({ PDFParse: cachedPDFParse } = await import("pdf-parse"));
|
|
19
|
+
}
|
|
20
|
+
return cachedPDFParse;
|
|
21
|
+
}
|
|
16
22
|
function clampText(text, maxChars) {
|
|
17
23
|
if (text.length <= maxChars)
|
|
18
24
|
return { text, truncated: false };
|
|
@@ -373,6 +379,7 @@ export async function extractDocumentText(input) {
|
|
|
373
379
|
if (!extractedText) {
|
|
374
380
|
switch (format) {
|
|
375
381
|
case "pdf": {
|
|
382
|
+
const PDFParse = await loadPDFParse();
|
|
376
383
|
const parser = new PDFParse({ data: buffer });
|
|
377
384
|
try {
|
|
378
385
|
const result = await parser.getText();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-extractor.js","sourceRoot":"","sources":["../../src/utils/document-extractor.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { extname, join } from \"node:path\";\nimport ExcelJS from \"exceljs\";\nimport JSZip from \"jszip\";\nimport mammoth from \"mammoth\";\nimport { PDFParse } from \"pdf-parse\";\n\nexport type ExtractedDocumentFormat =\n\t| \"pdf\"\n\t| \"docx\"\n\t| \"xlsx\"\n\t| \"pptx\"\n\t| \"text\"\n\t| \"unknown\";\n\nexport interface ExtractDocumentInput {\n\tbuffer: Buffer;\n\tfileName: string;\n\tmimeType?: string;\n\tmaxChars?: number;\n}\n\nexport interface ExtractDocumentOutput {\n\textractedText: string;\n\tformat: ExtractedDocumentFormat;\n\textractor: \"native\" | \"markitdown\";\n\ttruncated: boolean;\n\tsizeBytes: number;\n}\n\ntype ExcelWorkbookLoadInput = Parameters<ExcelJS.Workbook[\"xlsx\"][\"load\"]>[0];\n\nconst DEFAULT_MAX_CHARS = 200_000;\nconst MAX_INPUT_BYTES = 50 * 1024 * 1024;\nconst MARKITDOWN_TIMEOUT_MS = 20_000;\nconst MARKITDOWN_TIMEOUT_KILL_GRACE_MS = 500;\nconst MARKITDOWN_TIMEOUT_CLOSE_GRACE_MS = 1_000;\nconst NODE_TIMER_MAX_MS = 2_147_483_647;\nconst XLSX_MIME =\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\";\n\nfunction clampText(\n\ttext: string,\n\tmaxChars: number,\n): { text: string; truncated: boolean } {\n\tif (text.length <= maxChars) return { text, truncated: false };\n\treturn { text: text.slice(0, maxChars), truncated: true };\n}\n\nfunction detectFormat(\n\tfileName: string,\n\tmimeType?: string,\n): ExtractedDocumentFormat {\n\tconst lowerName = fileName.toLowerCase();\n\tconst type = (mimeType || \"\").toLowerCase();\n\n\tif (type === \"application/pdf\" || lowerName.endsWith(\".pdf\")) return \"pdf\";\n\tif (\n\t\ttype ===\n\t\t\t\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" ||\n\t\tlowerName.endsWith(\".docx\")\n\t)\n\t\treturn \"docx\";\n\tif (type === XLSX_MIME || lowerName.endsWith(\".xlsx\")) return \"xlsx\";\n\tif (\n\t\ttype ===\n\t\t\t\"application/vnd.openxmlformats-officedocument.presentationml.presentation\" ||\n\t\tlowerName.endsWith(\".pptx\")\n\t)\n\t\treturn \"pptx\";\n\tif (type.startsWith(\"text/\")) return \"text\";\n\n\tconst textExtensions = [\n\t\t\".txt\",\n\t\t\".md\",\n\t\t\".markdown\",\n\t\t\".json\",\n\t\t\".yaml\",\n\t\t\".yml\",\n\t\t\".csv\",\n\t\t\".ts\",\n\t\t\".tsx\",\n\t\t\".js\",\n\t\t\".jsx\",\n\t\t\".html\",\n\t\t\".css\",\n\t\t\".xml\",\n\t];\n\tif (textExtensions.some((ext) => lowerName.endsWith(ext))) return \"text\";\n\n\treturn \"unknown\";\n}\n\nfunction splitCommandArgs(value: string | undefined): string[] {\n\tconst input = value?.trim() ?? \"\";\n\tif (!input) return [];\n\n\tconst args: string[] = [];\n\tlet current = \"\";\n\tlet quote: \"'\" | '\"' | null = null;\n\tlet tokenStarted = false;\n\n\tfor (let index = 0; index < input.length; index += 1) {\n\t\tconst char = input.charAt(index);\n\n\t\tif (quote === \"'\") {\n\t\t\tif (char === \"'\") {\n\t\t\t\tquote = null;\n\t\t\t} else {\n\t\t\t\tcurrent += char;\n\t\t\t}\n\t\t\ttokenStarted = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (quote === '\"') {\n\t\t\tif (char === '\"') {\n\t\t\t\tquote = null;\n\t\t\t\ttokenStarted = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === \"\\\\\") {\n\t\t\t\tconst next = input[index + 1];\n\t\t\t\tif (next && ['\"', \"\\\\\", \"$\", \"`\", \"\\n\"].includes(next)) {\n\t\t\t\t\tcurrent += next;\n\t\t\t\t\tindex += 1;\n\t\t\t\t} else {\n\t\t\t\t\tcurrent += char;\n\t\t\t\t}\n\t\t\t\ttokenStarted = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcurrent += char;\n\t\t\ttokenStarted = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"\\\\\") {\n\t\t\tconst next = input[index + 1];\n\t\t\tif (next && (/\\s/u.test(next) || [\"'\", '\"', \"\\\\\"].includes(next))) {\n\t\t\t\tcurrent += next;\n\t\t\t\tindex += 1;\n\t\t\t} else {\n\t\t\t\tcurrent += char;\n\t\t\t}\n\t\t\ttokenStarted = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"'\" || char === '\"') {\n\t\t\tquote = char;\n\t\t\ttokenStarted = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (/\\s/u.test(char)) {\n\t\t\tif (tokenStarted) {\n\t\t\t\targs.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t\ttokenStarted = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcurrent += char;\n\t\ttokenStarted = true;\n\t}\n\n\tif (quote) {\n\t\tthrow new Error(\"Unterminated quote in MAESTRO_MARKITDOWN_ARGS\");\n\t}\n\tif (tokenStarted) {\n\t\targs.push(current);\n\t}\n\treturn args;\n}\n\nfunction isMarkitdownDisabled(): boolean {\n\treturn /^(0|false|off|no)$/i.test(process.env.MAESTRO_MARKITDOWN ?? \"\");\n}\n\nfunction markitdownCandidates(): Array<{\n\tcommand: string;\n\targsPrefix: string[];\n}> {\n\tconst configured = process.env.MAESTRO_MARKITDOWN_CMD?.trim();\n\tif (configured) {\n\t\treturn [\n\t\t\t{\n\t\t\t\tcommand: configured,\n\t\t\t\targsPrefix: splitCommandArgs(process.env.MAESTRO_MARKITDOWN_ARGS),\n\t\t\t},\n\t\t];\n\t}\n\treturn [\n\t\t{ command: \"markitdown\", argsPrefix: [] },\n\t\t{ command: \"uvx\", argsPrefix: [\"markitdown\"] },\n\t];\n}\n\nfunction shouldTryMarkitdown(\n\tformat: ExtractedDocumentFormat,\n\tfileName: string,\n\tmimeType?: string,\n): boolean {\n\tif (isMarkitdownDisabled()) return false;\n\tif (/^(1|true|on|yes)$/i.test(process.env.MAESTRO_MARKITDOWN_PREFER ?? \"\")) {\n\t\treturn true;\n\t}\n\tconst lowerName = fileName.toLowerCase();\n\tconst type = (mimeType ?? \"\").toLowerCase();\n\tif (format === \"unknown\") return true;\n\tif (lowerName.endsWith(\".html\") || lowerName.endsWith(\".htm\")) return true;\n\tif (type.includes(\"text/html\")) return true;\n\treturn false;\n}\n\nfunction readPositiveIntegerEnv(name: string, fallback: number): number {\n\tconst value = process.env[name]?.trim();\n\tif (!value) return fallback;\n\tconst parsed = Number(value);\n\tif (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0) {\n\t\treturn fallback;\n\t}\n\treturn Math.min(parsed, NODE_TIMER_MAX_MS);\n}\n\nfunction signalMarkitdownProcessTree(\n\tchild: ReturnType<typeof spawn>,\n\tsignal: NodeJS.Signals,\n): void {\n\tif (process.platform !== \"win32\" && child.pid) {\n\t\ttry {\n\t\t\tprocess.kill(-child.pid, signal);\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ESRCH\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\ttry {\n\t\tchild.kill(signal);\n\t} catch {\n\t\t// The process may have exited between timeout handling and signal delivery.\n\t}\n}\n\nfunction runMarkitdownCandidate(\n\tcandidate: { command: string; argsPrefix: string[] },\n\targs: string[],\n): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst child = spawn(candidate.command, [...candidate.argsPrefix, ...args], {\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tlet timedOut = false;\n\t\tlet settled = false;\n\t\tlet killTimer: NodeJS.Timeout | undefined;\n\t\tlet closeGraceTimer: NodeJS.Timeout | undefined;\n\t\tconst timer = setTimeout(\n\t\t\t() => {\n\t\t\t\ttimedOut = true;\n\t\t\t\tsignalMarkitdownProcessTree(child, \"SIGTERM\");\n\t\t\t\tkillTimer = setTimeout(\n\t\t\t\t\t() => {\n\t\t\t\t\t\tsignalMarkitdownProcessTree(child, \"SIGKILL\");\n\t\t\t\t\t\tcloseGraceTimer = setTimeout(\n\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\tchild.stdout.destroy();\n\t\t\t\t\t\t\t\tchild.stderr.destroy();\n\t\t\t\t\t\t\t\tchild.unref();\n\t\t\t\t\t\t\t\tfinish(new Error(\"MarkItDown conversion timed out\"));\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\treadPositiveIntegerEnv(\n\t\t\t\t\t\t\t\t\"MAESTRO_MARKITDOWN_CLOSE_GRACE_MS\",\n\t\t\t\t\t\t\t\tMARKITDOWN_TIMEOUT_CLOSE_GRACE_MS,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\treadPositiveIntegerEnv(\n\t\t\t\t\t\t\"MAESTRO_MARKITDOWN_KILL_GRACE_MS\",\n\t\t\t\t\t\tMARKITDOWN_TIMEOUT_KILL_GRACE_MS,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t},\n\t\t\treadPositiveIntegerEnv(\n\t\t\t\t\"MAESTRO_MARKITDOWN_TIMEOUT_MS\",\n\t\t\t\tMARKITDOWN_TIMEOUT_MS,\n\t\t\t),\n\t\t);\n\n\t\tfunction finish(error: Error | null, output?: string) {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tclearTimeout(timer);\n\t\t\tif (killTimer) clearTimeout(killTimer);\n\t\t\tif (closeGraceTimer) clearTimeout(closeGraceTimer);\n\t\t\tif (error) {\n\t\t\t\treject(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresolve(output ?? \"\");\n\t\t}\n\n\t\tchild.stdout.setEncoding(\"utf8\");\n\t\tchild.stderr.setEncoding(\"utf8\");\n\t\tchild.stdout.on(\"data\", (chunk) => {\n\t\t\tstdout += chunk;\n\t\t});\n\t\tchild.stderr.on(\"data\", (chunk) => {\n\t\t\tstderr += chunk;\n\t\t});\n\t\tchild.on(\"error\", (error) => {\n\t\t\tif (timedOut) {\n\t\t\t\tfinish(new Error(\"MarkItDown conversion timed out\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfinish(error);\n\t\t});\n\t\tchild.on(\"close\", (code) => {\n\t\t\tif (timedOut) {\n\t\t\t\tfinish(new Error(\"MarkItDown conversion timed out\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (code === 0) {\n\t\t\t\tfinish(null, stdout);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfinish(\n\t\t\t\tnew Error(\n\t\t\t\t\t`MarkItDown exited with ${code}${stderr ? `: ${stderr.slice(0, 500)}` : \"\"}`,\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\t});\n}\n\nasync function extractWithMarkitdown(input: {\n\tbuffer: Buffer;\n\tfileName: string;\n\tmimeType?: string;\n}): Promise<string | null> {\n\tconst tempDir = await mkdtemp(join(tmpdir(), \"maestro-markitdown-\"));\n\tconst extension = extname(input.fileName) || \".bin\";\n\tconst tempPath = join(tempDir, `input${extension}`);\n\ttry {\n\t\tawait writeFile(tempPath, input.buffer);\n\t\tconst args = [tempPath];\n\t\tif (input.mimeType) {\n\t\t\targs.push(\"--mime-type\", input.mimeType);\n\t\t}\n\n\t\tlet lastError: unknown;\n\t\tfor (const candidate of markitdownCandidates()) {\n\t\t\ttry {\n\t\t\t\tconst output = await runMarkitdownCandidate(candidate, args);\n\t\t\t\tconst text = output.trim();\n\t\t\t\tif (text) return text;\n\t\t\t} catch (error) {\n\t\t\t\tlastError = error;\n\t\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n\t\t\t}\n\t\t}\n\n\t\tif (process.env.MAESTRO_MARKITDOWN_CMD) {\n\t\t\tconst message =\n\t\t\t\tlastError instanceof Error ? lastError.message : String(lastError);\n\t\t\tthrow new Error(`MarkItDown extraction failed: ${message}`);\n\t\t}\n\t\treturn null;\n\t} finally {\n\t\tawait rm(tempDir, { force: true, recursive: true });\n\t}\n}\n\nfunction worksheetToRows(worksheet: ExcelJS.Worksheet): string[][] {\n\tconst rows: string[][] = [];\n\tworksheet.eachRow({ includeEmpty: false }, (row) => {\n\t\tconst cells: string[] = [];\n\t\tfor (let column = 1; column <= row.cellCount; column++) {\n\t\t\tcells.push((row.getCell(column).text || \"\").trim());\n\t\t}\n\t\twhile (cells.length > 0 && cells[cells.length - 1] === \"\") {\n\t\t\tcells.pop();\n\t\t}\n\t\tif (cells.some((value) => value !== \"\")) {\n\t\t\trows.push(cells);\n\t\t}\n\t});\n\treturn rows;\n}\n\nasync function extractPptxText(buffer: Buffer): Promise<string> {\n\tconst zip = await JSZip.loadAsync(buffer);\n\n\tconst slidePaths = Object.keys(zip.files)\n\t\t.filter((p) => /^ppt\\/slides\\/slide\\d+\\.xml$/i.test(p))\n\t\t.sort((a, b) => {\n\t\t\tconst an = Number.parseInt(a.match(/slide(\\d+)\\.xml/i)?.[1] || \"0\", 10);\n\t\t\tconst bn = Number.parseInt(b.match(/slide(\\d+)\\.xml/i)?.[1] || \"0\", 10);\n\t\t\treturn an - bn;\n\t\t});\n\n\tif (slidePaths.length === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst parts: string[] = [];\n\tfor (const slidePath of slidePaths) {\n\t\tconst slideNumber = slidePath.match(/slide(\\d+)\\.xml/i)?.[1] || \"?\";\n\t\tconst xml = await zip.file(slidePath)?.async(\"string\");\n\t\tif (!xml) continue;\n\n\t\tconst texts = Array.from(xml.matchAll(/<a:t>(.*?)<\\/a:t>/g))\n\t\t\t.map((m) => m[1] || \"\")\n\t\t\t.map((s) =>\n\t\t\t\ts\n\t\t\t\t\t.replaceAll(\"<\", \"<\")\n\t\t\t\t\t.replaceAll(\">\", \">\")\n\t\t\t\t\t.replaceAll(\"&\", \"&\")\n\t\t\t\t\t.replaceAll(\""\", '\"')\n\t\t\t\t\t.replaceAll(\"'\", \"'\"),\n\t\t\t)\n\t\t\t.map((s) => s.trim())\n\t\t\t.filter(Boolean);\n\n\t\tif (texts.length === 0) continue;\n\t\tparts.push(`# Slide ${slideNumber}\\n${texts.join(\" \")}`);\n\t}\n\n\treturn parts.join(\"\\n\\n\");\n}\n\nexport async function extractDocumentText(\n\tinput: ExtractDocumentInput,\n): Promise<ExtractDocumentOutput> {\n\tconst { buffer, fileName } = input;\n\tconst maxChars = Math.max(1, input.maxChars ?? DEFAULT_MAX_CHARS);\n\n\tif (buffer.byteLength > MAX_INPUT_BYTES) {\n\t\tthrow new Error(\n\t\t\t`Document is too large (${(buffer.byteLength / 1024 / 1024).toFixed(1)}MB). Maximum supported size is 50MB.`,\n\t\t);\n\t}\n\n\tconst format = detectFormat(fileName, input.mimeType);\n\tconst markitdownFirst =\n\t\t/^(1|true|on|yes)$/i.test(process.env.MAESTRO_MARKITDOWN_PREFER ?? \"\") &&\n\t\t!isMarkitdownDisabled();\n\n\tlet extractedText = \"\";\n\tlet extractor: ExtractDocumentOutput[\"extractor\"] = \"native\";\n\tif (markitdownFirst) {\n\t\tconst markitdownText = await extractWithMarkitdown({\n\t\t\tbuffer,\n\t\t\tfileName,\n\t\t\tmimeType: input.mimeType,\n\t\t});\n\t\tif (markitdownText) {\n\t\t\textractedText = markitdownText;\n\t\t\textractor = \"markitdown\";\n\t\t}\n\t}\n\n\tif (!extractedText) {\n\t\tswitch (format) {\n\t\t\tcase \"pdf\": {\n\t\t\t\tconst parser = new PDFParse({ data: buffer });\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await parser.getText();\n\t\t\t\t\textractedText = result.text || \"\";\n\t\t\t\t} finally {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait parser.destroy();\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// ignore\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"docx\": {\n\t\t\t\tconst result = await mammoth.extractRawText({ buffer });\n\t\t\t\textractedText = result.value || \"\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"xlsx\": {\n\t\t\t\tconst workbook = new ExcelJS.Workbook();\n\t\t\t\tawait workbook.xlsx.load(buffer as unknown as ExcelWorkbookLoadInput);\n\t\t\t\tconst parts: string[] = [];\n\t\t\t\tfor (const worksheet of workbook.worksheets) {\n\t\t\t\t\tconst rows = worksheetToRows(worksheet);\n\t\t\t\t\tif (rows.length === 0) continue;\n\t\t\t\t\tparts.push(\n\t\t\t\t\t\t`# Sheet: ${worksheet.name}\\n${rows.map((row) => row.join(\"\\t\")).join(\"\\n\")}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\textractedText = parts.join(\"\\n\\n\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"pptx\": {\n\t\t\t\textractedText = await extractPptxText(buffer);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"text\": {\n\t\t\t\textractedText = buffer.toString(\"utf8\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\textractedText = \"\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (\n\t\textractor !== \"markitdown\" &&\n\t\tshouldTryMarkitdown(format, fileName, input.mimeType)\n\t) {\n\t\tconst markitdownText = await extractWithMarkitdown({\n\t\t\tbuffer,\n\t\t\tfileName,\n\t\t\tmimeType: input.mimeType,\n\t\t});\n\t\tif (markitdownText) {\n\t\t\textractedText = markitdownText;\n\t\t\textractor = \"markitdown\";\n\t\t}\n\t}\n\n\tconst { text, truncated } = clampText(extractedText, maxChars);\n\treturn {\n\t\textractedText: text,\n\t\tformat,\n\t\textractor,\n\t\ttruncated,\n\t\tsizeBytes: buffer.byteLength,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"document-extractor.js","sourceRoot":"","sources":["../../src/utils/document-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAAO,MAAM,SAAS,CAAC;AA4B9B,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAClC,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACzC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AACrC,MAAM,gCAAgC,GAAG,GAAG,CAAC;AAC7C,MAAM,iCAAiC,GAAG,KAAK,CAAC;AAChD,MAAM,iBAAiB,GAAG,aAAa,CAAC;AACxC,MAAM,SAAS,GACd,mEAAmE,CAAC;AAErE,IAAI,cAA+C,CAAC;AAEpD,KAAK,UAAU,YAAY;IAC1B,IAAI,CAAC,cAAc,EAAE,CAAC;QACrB,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,cAAc,CAAC;AACvB,CAAC;AAED,SAAS,SAAS,CACjB,IAAY,EACZ,QAAgB;IAEhB,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC/D,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,YAAY,CACpB,QAAgB,EAChB,QAAiB;IAEjB,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAE5C,IAAI,IAAI,KAAK,iBAAiB,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3E,IACC,IAAI;QACH,yEAAyE;QAC1E,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;QAE3B,OAAO,MAAM,CAAC;IACf,IAAI,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC;IACrE,IACC,IAAI;QACH,2EAA2E;QAC5E,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;QAE3B,OAAO,MAAM,CAAC;IACf,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC;IAE5C,MAAM,cAAc,GAAG;QACtB,MAAM;QACN,KAAK;QACL,WAAW;QACX,OAAO;QACP,OAAO;QACP,MAAM;QACN,MAAM;QACN,KAAK;QACL,MAAM;QACN,KAAK;QACL,MAAM;QACN,OAAO;QACP,MAAM;QACN,MAAM;KACN,CAAC;IACF,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAEzE,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyB;IAClD,MAAM,KAAK,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,KAAK,GAAqB,IAAI,CAAC;IACnC,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEjC,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACnB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBAClB,KAAK,GAAG,IAAI,CAAC;YACd,CAAC;iBAAM,CAAC;gBACP,OAAO,IAAI,IAAI,CAAC;YACjB,CAAC;YACD,YAAY,GAAG,IAAI,CAAC;YACpB,SAAS;QACV,CAAC;QAED,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACnB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBAClB,KAAK,GAAG,IAAI,CAAC;gBACb,YAAY,GAAG,IAAI,CAAC;gBACpB,SAAS;YACV,CAAC;YACD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACnB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAC9B,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxD,OAAO,IAAI,IAAI,CAAC;oBAChB,KAAK,IAAI,CAAC,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACP,OAAO,IAAI,IAAI,CAAC;gBACjB,CAAC;gBACD,YAAY,GAAG,IAAI,CAAC;gBACpB,SAAS;YACV,CAAC;YACD,OAAO,IAAI,IAAI,CAAC;YAChB,YAAY,GAAG,IAAI,CAAC;YACpB,SAAS;QACV,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9B,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACnE,OAAO,IAAI,IAAI,CAAC;gBAChB,KAAK,IAAI,CAAC,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACP,OAAO,IAAI,IAAI,CAAC;YACjB,CAAC;YACD,YAAY,GAAG,IAAI,CAAC;YACpB,SAAS;QACV,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAClC,KAAK,GAAG,IAAI,CAAC;YACb,YAAY,GAAG,IAAI,CAAC;YACpB,SAAS;QACV,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,IAAI,YAAY,EAAE,CAAC;gBAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACnB,OAAO,GAAG,EAAE,CAAC;gBACb,YAAY,GAAG,KAAK,CAAC;YACtB,CAAC;YACD,SAAS;QACV,CAAC;QAED,OAAO,IAAI,IAAI,CAAC;QAChB,YAAY,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,YAAY,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,oBAAoB;IAC5B,OAAO,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,oBAAoB;IAI5B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,CAAC;IAC9D,IAAI,UAAU,EAAE,CAAC;QAChB,OAAO;YACN;gBACC,OAAO,EAAE,UAAU;gBACnB,UAAU,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;aACjE;SACD,CAAC;IACH,CAAC;IACD,OAAO;QACN,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE;QACzC,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,YAAY,CAAC,EAAE;KAC9C,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC3B,MAA+B,EAC/B,QAAgB,EAChB,QAAiB;IAEjB,IAAI,oBAAoB,EAAE;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5E,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3E,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY,EAAE,QAAgB;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC1E,OAAO,QAAQ,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,2BAA2B,CACnC,KAA+B,EAC/B,MAAsB;IAEtB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QAC/C,IAAI,CAAC;YACJ,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACjC,OAAO;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAK,KAA+B,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACvD,OAAO;YACR,CAAC;QACF,CAAC;IACF,CAAC;IAED,IAAI,CAAC;QACJ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACR,4EAA4E;IAC7E,CAAC;AACF,CAAC;AAED,SAAS,sBAAsB,CAC9B,SAAoD,EACpD,IAAc;IAEd,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,SAAS,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,EAAE;YAC1E,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;YACtC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SACjC,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,SAAqC,CAAC;QAC1C,IAAI,eAA2C,CAAC;QAChD,MAAM,KAAK,GAAG,UAAU,CACvB,GAAG,EAAE;YACJ,QAAQ,GAAG,IAAI,CAAC;YAChB,2BAA2B,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC9C,SAAS,GAAG,UAAU,CACrB,GAAG,EAAE;gBACJ,2BAA2B,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;gBAC9C,eAAe,GAAG,UAAU,CAC3B,GAAG,EAAE;oBACJ,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACvB,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACvB,KAAK,CAAC,KAAK,EAAE,CAAC;oBACd,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACtD,CAAC,EACD,sBAAsB,CACrB,mCAAmC,EACnC,iCAAiC,CACjC,CACD,CAAC;YACH,CAAC,EACD,sBAAsB,CACrB,kCAAkC,EAClC,gCAAgC,CAChC,CACD,CAAC;QACH,CAAC,EACD,sBAAsB,CACrB,+BAA+B,EAC/B,qBAAqB,CACrB,CACD,CAAC;QAEF,SAAS,MAAM,CAAC,KAAmB,EAAE,MAAe;YACnD,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACvC,IAAI,eAAe;gBAAE,YAAY,CAAC,eAAe,CAAC,CAAC;YACnD,IAAI,KAAK,EAAE,CAAC;gBACX,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACR,CAAC;YACD,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACvB,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,IAAI,QAAQ,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACrD,OAAO;YACR,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,IAAI,QAAQ,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACrD,OAAO;YACR,CAAC;YACD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACrB,OAAO;YACR,CAAC;YACD,MAAM,CACL,IAAI,KAAK,CACR,0BAA0B,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5E,CACD,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,KAIpC;IACA,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,SAAS,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC;QACJ,MAAM,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,SAAkB,CAAC;QACvB,KAAK,MAAM,SAAS,IAAI,oBAAoB,EAAE,EAAE,CAAC;YAChD,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC3B,IAAI,IAAI;oBAAE,OAAO,IAAI,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,SAAS,GAAG,KAAK,CAAC;gBAClB,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;oBAAE,SAAS;YAClE,CAAC;QACF,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC;YACxC,MAAM,OAAO,GACZ,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;YAAS,CAAC;QACV,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;AACF,CAAC;AAED,SAAS,eAAe,CAAC,SAA4B;IACpD,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,SAAS,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;QAClD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YAC3D,KAAK,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACF,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACb,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAE1C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;SACvC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,+BAA+B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACtD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACd,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QACxE,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QACxE,OAAO,EAAE,GAAG,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEJ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QACpE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,GAAG;YAAE,SAAS;QAEnB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;aAC1D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACtB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACV,CAAC;aACC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;aACvB,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;aACvB,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC;aACxB,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC;aACzB,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAC3B;aACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CAAC;QAElB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACjC,KAAK,CAAC,IAAI,CAAC,WAAW,WAAW,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,KAA2B;IAE3B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,IAAI,iBAAiB,CAAC,CAAC;IAElE,IAAI,MAAM,CAAC,UAAU,GAAG,eAAe,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CACd,0BAA0B,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,sCAAsC,CAC5G,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,eAAe,GACpB,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,CAAC;QACtE,CAAC,oBAAoB,EAAE,CAAC;IAEzB,IAAI,aAAa,GAAG,EAAE,CAAC;IACvB,IAAI,SAAS,GAAuC,QAAQ,CAAC;IAC7D,IAAI,eAAe,EAAE,CAAC;QACrB,MAAM,cAAc,GAAG,MAAM,qBAAqB,CAAC;YAClD,MAAM;YACN,QAAQ;YACR,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACxB,CAAC,CAAC;QACH,IAAI,cAAc,EAAE,CAAC;YACpB,aAAa,GAAG,cAAc,CAAC;YAC/B,SAAS,GAAG,YAAY,CAAC;QAC1B,CAAC;IACF,CAAC;IAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACpB,QAAQ,MAAM,EAAE,CAAC;YAChB,KAAK,KAAK,CAAC,CAAC,CAAC;gBACZ,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC9C,IAAI,CAAC;oBACJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;oBACtC,aAAa,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACnC,CAAC;wBAAS,CAAC;oBACV,IAAI,CAAC;wBACJ,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;oBACxB,CAAC;oBAAC,MAAM,CAAC;wBACR,SAAS;oBACV,CAAC;gBACF,CAAC;gBACD,MAAM;YACP,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACb,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;gBACxD,aAAa,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;gBACnC,MAAM;YACP,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACb,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACxC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAA2C,CAAC,CAAC;gBACtE,MAAM,KAAK,GAAa,EAAE,CAAC;gBAC3B,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;oBAC7C,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;oBACxC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;wBAAE,SAAS;oBAChC,KAAK,CAAC,IAAI,CACT,YAAY,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7E,CAAC;gBACH,CAAC;gBACD,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnC,MAAM;YACP,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACb,aAAa,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;gBAC9C,MAAM;YACP,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACb,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACxC,MAAM;YACP,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACT,aAAa,GAAG,EAAE,CAAC;gBACnB,MAAM;YACP,CAAC;QACF,CAAC;IACF,CAAC;IAED,IACC,SAAS,KAAK,YAAY;QAC1B,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,EACpD,CAAC;QACF,MAAM,cAAc,GAAG,MAAM,qBAAqB,CAAC;YAClD,MAAM;YACN,QAAQ;YACR,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACxB,CAAC,CAAC;QACH,IAAI,cAAc,EAAE,CAAC;YACpB,aAAa,GAAG,cAAc,CAAC;YAC/B,SAAS,GAAG,YAAY,CAAC;QAC1B,CAAC;IACF,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC/D,OAAO;QACN,aAAa,EAAE,IAAI;QACnB,MAAM;QACN,SAAS;QACT,SAAS;QACT,SAAS,EAAE,MAAM,CAAC,UAAU;KAC5B,CAAC;AACH,CAAC","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { extname, join } from \"node:path\";\nimport ExcelJS from \"exceljs\";\nimport JSZip from \"jszip\";\nimport mammoth from \"mammoth\";\n\nexport type ExtractedDocumentFormat =\n\t| \"pdf\"\n\t| \"docx\"\n\t| \"xlsx\"\n\t| \"pptx\"\n\t| \"text\"\n\t| \"unknown\";\n\nexport interface ExtractDocumentInput {\n\tbuffer: Buffer;\n\tfileName: string;\n\tmimeType?: string;\n\tmaxChars?: number;\n}\n\nexport interface ExtractDocumentOutput {\n\textractedText: string;\n\tformat: ExtractedDocumentFormat;\n\textractor: \"native\" | \"markitdown\";\n\ttruncated: boolean;\n\tsizeBytes: number;\n}\n\ntype ExcelWorkbookLoadInput = Parameters<ExcelJS.Workbook[\"xlsx\"][\"load\"]>[0];\ntype PDFParseConstructor = typeof import(\"pdf-parse\").PDFParse;\n\nconst DEFAULT_MAX_CHARS = 200_000;\nconst MAX_INPUT_BYTES = 50 * 1024 * 1024;\nconst MARKITDOWN_TIMEOUT_MS = 20_000;\nconst MARKITDOWN_TIMEOUT_KILL_GRACE_MS = 500;\nconst MARKITDOWN_TIMEOUT_CLOSE_GRACE_MS = 1_000;\nconst NODE_TIMER_MAX_MS = 2_147_483_647;\nconst XLSX_MIME =\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\";\n\nlet cachedPDFParse: PDFParseConstructor | undefined;\n\nasync function loadPDFParse(): Promise<PDFParseConstructor> {\n\tif (!cachedPDFParse) {\n\t\t({ PDFParse: cachedPDFParse } = await import(\"pdf-parse\"));\n\t}\n\treturn cachedPDFParse;\n}\n\nfunction clampText(\n\ttext: string,\n\tmaxChars: number,\n): { text: string; truncated: boolean } {\n\tif (text.length <= maxChars) return { text, truncated: false };\n\treturn { text: text.slice(0, maxChars), truncated: true };\n}\n\nfunction detectFormat(\n\tfileName: string,\n\tmimeType?: string,\n): ExtractedDocumentFormat {\n\tconst lowerName = fileName.toLowerCase();\n\tconst type = (mimeType || \"\").toLowerCase();\n\n\tif (type === \"application/pdf\" || lowerName.endsWith(\".pdf\")) return \"pdf\";\n\tif (\n\t\ttype ===\n\t\t\t\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" ||\n\t\tlowerName.endsWith(\".docx\")\n\t)\n\t\treturn \"docx\";\n\tif (type === XLSX_MIME || lowerName.endsWith(\".xlsx\")) return \"xlsx\";\n\tif (\n\t\ttype ===\n\t\t\t\"application/vnd.openxmlformats-officedocument.presentationml.presentation\" ||\n\t\tlowerName.endsWith(\".pptx\")\n\t)\n\t\treturn \"pptx\";\n\tif (type.startsWith(\"text/\")) return \"text\";\n\n\tconst textExtensions = [\n\t\t\".txt\",\n\t\t\".md\",\n\t\t\".markdown\",\n\t\t\".json\",\n\t\t\".yaml\",\n\t\t\".yml\",\n\t\t\".csv\",\n\t\t\".ts\",\n\t\t\".tsx\",\n\t\t\".js\",\n\t\t\".jsx\",\n\t\t\".html\",\n\t\t\".css\",\n\t\t\".xml\",\n\t];\n\tif (textExtensions.some((ext) => lowerName.endsWith(ext))) return \"text\";\n\n\treturn \"unknown\";\n}\n\nfunction splitCommandArgs(value: string | undefined): string[] {\n\tconst input = value?.trim() ?? \"\";\n\tif (!input) return [];\n\n\tconst args: string[] = [];\n\tlet current = \"\";\n\tlet quote: \"'\" | '\"' | null = null;\n\tlet tokenStarted = false;\n\n\tfor (let index = 0; index < input.length; index += 1) {\n\t\tconst char = input.charAt(index);\n\n\t\tif (quote === \"'\") {\n\t\t\tif (char === \"'\") {\n\t\t\t\tquote = null;\n\t\t\t} else {\n\t\t\t\tcurrent += char;\n\t\t\t}\n\t\t\ttokenStarted = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (quote === '\"') {\n\t\t\tif (char === '\"') {\n\t\t\t\tquote = null;\n\t\t\t\ttokenStarted = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === \"\\\\\") {\n\t\t\t\tconst next = input[index + 1];\n\t\t\t\tif (next && ['\"', \"\\\\\", \"$\", \"`\", \"\\n\"].includes(next)) {\n\t\t\t\t\tcurrent += next;\n\t\t\t\t\tindex += 1;\n\t\t\t\t} else {\n\t\t\t\t\tcurrent += char;\n\t\t\t\t}\n\t\t\t\ttokenStarted = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcurrent += char;\n\t\t\ttokenStarted = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"\\\\\") {\n\t\t\tconst next = input[index + 1];\n\t\t\tif (next && (/\\s/u.test(next) || [\"'\", '\"', \"\\\\\"].includes(next))) {\n\t\t\t\tcurrent += next;\n\t\t\t\tindex += 1;\n\t\t\t} else {\n\t\t\t\tcurrent += char;\n\t\t\t}\n\t\t\ttokenStarted = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"'\" || char === '\"') {\n\t\t\tquote = char;\n\t\t\ttokenStarted = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (/\\s/u.test(char)) {\n\t\t\tif (tokenStarted) {\n\t\t\t\targs.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t\ttokenStarted = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcurrent += char;\n\t\ttokenStarted = true;\n\t}\n\n\tif (quote) {\n\t\tthrow new Error(\"Unterminated quote in MAESTRO_MARKITDOWN_ARGS\");\n\t}\n\tif (tokenStarted) {\n\t\targs.push(current);\n\t}\n\treturn args;\n}\n\nfunction isMarkitdownDisabled(): boolean {\n\treturn /^(0|false|off|no)$/i.test(process.env.MAESTRO_MARKITDOWN ?? \"\");\n}\n\nfunction markitdownCandidates(): Array<{\n\tcommand: string;\n\targsPrefix: string[];\n}> {\n\tconst configured = process.env.MAESTRO_MARKITDOWN_CMD?.trim();\n\tif (configured) {\n\t\treturn [\n\t\t\t{\n\t\t\t\tcommand: configured,\n\t\t\t\targsPrefix: splitCommandArgs(process.env.MAESTRO_MARKITDOWN_ARGS),\n\t\t\t},\n\t\t];\n\t}\n\treturn [\n\t\t{ command: \"markitdown\", argsPrefix: [] },\n\t\t{ command: \"uvx\", argsPrefix: [\"markitdown\"] },\n\t];\n}\n\nfunction shouldTryMarkitdown(\n\tformat: ExtractedDocumentFormat,\n\tfileName: string,\n\tmimeType?: string,\n): boolean {\n\tif (isMarkitdownDisabled()) return false;\n\tif (/^(1|true|on|yes)$/i.test(process.env.MAESTRO_MARKITDOWN_PREFER ?? \"\")) {\n\t\treturn true;\n\t}\n\tconst lowerName = fileName.toLowerCase();\n\tconst type = (mimeType ?? \"\").toLowerCase();\n\tif (format === \"unknown\") return true;\n\tif (lowerName.endsWith(\".html\") || lowerName.endsWith(\".htm\")) return true;\n\tif (type.includes(\"text/html\")) return true;\n\treturn false;\n}\n\nfunction readPositiveIntegerEnv(name: string, fallback: number): number {\n\tconst value = process.env[name]?.trim();\n\tif (!value) return fallback;\n\tconst parsed = Number(value);\n\tif (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0) {\n\t\treturn fallback;\n\t}\n\treturn Math.min(parsed, NODE_TIMER_MAX_MS);\n}\n\nfunction signalMarkitdownProcessTree(\n\tchild: ReturnType<typeof spawn>,\n\tsignal: NodeJS.Signals,\n): void {\n\tif (process.platform !== \"win32\" && child.pid) {\n\t\ttry {\n\t\t\tprocess.kill(-child.pid, signal);\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ESRCH\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\ttry {\n\t\tchild.kill(signal);\n\t} catch {\n\t\t// The process may have exited between timeout handling and signal delivery.\n\t}\n}\n\nfunction runMarkitdownCandidate(\n\tcandidate: { command: string; argsPrefix: string[] },\n\targs: string[],\n): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst child = spawn(candidate.command, [...candidate.argsPrefix, ...args], {\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tlet timedOut = false;\n\t\tlet settled = false;\n\t\tlet killTimer: NodeJS.Timeout | undefined;\n\t\tlet closeGraceTimer: NodeJS.Timeout | undefined;\n\t\tconst timer = setTimeout(\n\t\t\t() => {\n\t\t\t\ttimedOut = true;\n\t\t\t\tsignalMarkitdownProcessTree(child, \"SIGTERM\");\n\t\t\t\tkillTimer = setTimeout(\n\t\t\t\t\t() => {\n\t\t\t\t\t\tsignalMarkitdownProcessTree(child, \"SIGKILL\");\n\t\t\t\t\t\tcloseGraceTimer = setTimeout(\n\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\tchild.stdout.destroy();\n\t\t\t\t\t\t\t\tchild.stderr.destroy();\n\t\t\t\t\t\t\t\tchild.unref();\n\t\t\t\t\t\t\t\tfinish(new Error(\"MarkItDown conversion timed out\"));\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\treadPositiveIntegerEnv(\n\t\t\t\t\t\t\t\t\"MAESTRO_MARKITDOWN_CLOSE_GRACE_MS\",\n\t\t\t\t\t\t\t\tMARKITDOWN_TIMEOUT_CLOSE_GRACE_MS,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\treadPositiveIntegerEnv(\n\t\t\t\t\t\t\"MAESTRO_MARKITDOWN_KILL_GRACE_MS\",\n\t\t\t\t\t\tMARKITDOWN_TIMEOUT_KILL_GRACE_MS,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t},\n\t\t\treadPositiveIntegerEnv(\n\t\t\t\t\"MAESTRO_MARKITDOWN_TIMEOUT_MS\",\n\t\t\t\tMARKITDOWN_TIMEOUT_MS,\n\t\t\t),\n\t\t);\n\n\t\tfunction finish(error: Error | null, output?: string) {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tclearTimeout(timer);\n\t\t\tif (killTimer) clearTimeout(killTimer);\n\t\t\tif (closeGraceTimer) clearTimeout(closeGraceTimer);\n\t\t\tif (error) {\n\t\t\t\treject(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresolve(output ?? \"\");\n\t\t}\n\n\t\tchild.stdout.setEncoding(\"utf8\");\n\t\tchild.stderr.setEncoding(\"utf8\");\n\t\tchild.stdout.on(\"data\", (chunk) => {\n\t\t\tstdout += chunk;\n\t\t});\n\t\tchild.stderr.on(\"data\", (chunk) => {\n\t\t\tstderr += chunk;\n\t\t});\n\t\tchild.on(\"error\", (error) => {\n\t\t\tif (timedOut) {\n\t\t\t\tfinish(new Error(\"MarkItDown conversion timed out\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfinish(error);\n\t\t});\n\t\tchild.on(\"close\", (code) => {\n\t\t\tif (timedOut) {\n\t\t\t\tfinish(new Error(\"MarkItDown conversion timed out\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (code === 0) {\n\t\t\t\tfinish(null, stdout);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfinish(\n\t\t\t\tnew Error(\n\t\t\t\t\t`MarkItDown exited with ${code}${stderr ? `: ${stderr.slice(0, 500)}` : \"\"}`,\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\t});\n}\n\nasync function extractWithMarkitdown(input: {\n\tbuffer: Buffer;\n\tfileName: string;\n\tmimeType?: string;\n}): Promise<string | null> {\n\tconst tempDir = await mkdtemp(join(tmpdir(), \"maestro-markitdown-\"));\n\tconst extension = extname(input.fileName) || \".bin\";\n\tconst tempPath = join(tempDir, `input${extension}`);\n\ttry {\n\t\tawait writeFile(tempPath, input.buffer);\n\t\tconst args = [tempPath];\n\t\tif (input.mimeType) {\n\t\t\targs.push(\"--mime-type\", input.mimeType);\n\t\t}\n\n\t\tlet lastError: unknown;\n\t\tfor (const candidate of markitdownCandidates()) {\n\t\t\ttry {\n\t\t\t\tconst output = await runMarkitdownCandidate(candidate, args);\n\t\t\t\tconst text = output.trim();\n\t\t\t\tif (text) return text;\n\t\t\t} catch (error) {\n\t\t\t\tlastError = error;\n\t\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n\t\t\t}\n\t\t}\n\n\t\tif (process.env.MAESTRO_MARKITDOWN_CMD) {\n\t\t\tconst message =\n\t\t\t\tlastError instanceof Error ? lastError.message : String(lastError);\n\t\t\tthrow new Error(`MarkItDown extraction failed: ${message}`);\n\t\t}\n\t\treturn null;\n\t} finally {\n\t\tawait rm(tempDir, { force: true, recursive: true });\n\t}\n}\n\nfunction worksheetToRows(worksheet: ExcelJS.Worksheet): string[][] {\n\tconst rows: string[][] = [];\n\tworksheet.eachRow({ includeEmpty: false }, (row) => {\n\t\tconst cells: string[] = [];\n\t\tfor (let column = 1; column <= row.cellCount; column++) {\n\t\t\tcells.push((row.getCell(column).text || \"\").trim());\n\t\t}\n\t\twhile (cells.length > 0 && cells[cells.length - 1] === \"\") {\n\t\t\tcells.pop();\n\t\t}\n\t\tif (cells.some((value) => value !== \"\")) {\n\t\t\trows.push(cells);\n\t\t}\n\t});\n\treturn rows;\n}\n\nasync function extractPptxText(buffer: Buffer): Promise<string> {\n\tconst zip = await JSZip.loadAsync(buffer);\n\n\tconst slidePaths = Object.keys(zip.files)\n\t\t.filter((p) => /^ppt\\/slides\\/slide\\d+\\.xml$/i.test(p))\n\t\t.sort((a, b) => {\n\t\t\tconst an = Number.parseInt(a.match(/slide(\\d+)\\.xml/i)?.[1] || \"0\", 10);\n\t\t\tconst bn = Number.parseInt(b.match(/slide(\\d+)\\.xml/i)?.[1] || \"0\", 10);\n\t\t\treturn an - bn;\n\t\t});\n\n\tif (slidePaths.length === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst parts: string[] = [];\n\tfor (const slidePath of slidePaths) {\n\t\tconst slideNumber = slidePath.match(/slide(\\d+)\\.xml/i)?.[1] || \"?\";\n\t\tconst xml = await zip.file(slidePath)?.async(\"string\");\n\t\tif (!xml) continue;\n\n\t\tconst texts = Array.from(xml.matchAll(/<a:t>(.*?)<\\/a:t>/g))\n\t\t\t.map((m) => m[1] || \"\")\n\t\t\t.map((s) =>\n\t\t\t\ts\n\t\t\t\t\t.replaceAll(\"<\", \"<\")\n\t\t\t\t\t.replaceAll(\">\", \">\")\n\t\t\t\t\t.replaceAll(\"&\", \"&\")\n\t\t\t\t\t.replaceAll(\""\", '\"')\n\t\t\t\t\t.replaceAll(\"'\", \"'\"),\n\t\t\t)\n\t\t\t.map((s) => s.trim())\n\t\t\t.filter(Boolean);\n\n\t\tif (texts.length === 0) continue;\n\t\tparts.push(`# Slide ${slideNumber}\\n${texts.join(\" \")}`);\n\t}\n\n\treturn parts.join(\"\\n\\n\");\n}\n\nexport async function extractDocumentText(\n\tinput: ExtractDocumentInput,\n): Promise<ExtractDocumentOutput> {\n\tconst { buffer, fileName } = input;\n\tconst maxChars = Math.max(1, input.maxChars ?? DEFAULT_MAX_CHARS);\n\n\tif (buffer.byteLength > MAX_INPUT_BYTES) {\n\t\tthrow new Error(\n\t\t\t`Document is too large (${(buffer.byteLength / 1024 / 1024).toFixed(1)}MB). Maximum supported size is 50MB.`,\n\t\t);\n\t}\n\n\tconst format = detectFormat(fileName, input.mimeType);\n\tconst markitdownFirst =\n\t\t/^(1|true|on|yes)$/i.test(process.env.MAESTRO_MARKITDOWN_PREFER ?? \"\") &&\n\t\t!isMarkitdownDisabled();\n\n\tlet extractedText = \"\";\n\tlet extractor: ExtractDocumentOutput[\"extractor\"] = \"native\";\n\tif (markitdownFirst) {\n\t\tconst markitdownText = await extractWithMarkitdown({\n\t\t\tbuffer,\n\t\t\tfileName,\n\t\t\tmimeType: input.mimeType,\n\t\t});\n\t\tif (markitdownText) {\n\t\t\textractedText = markitdownText;\n\t\t\textractor = \"markitdown\";\n\t\t}\n\t}\n\n\tif (!extractedText) {\n\t\tswitch (format) {\n\t\t\tcase \"pdf\": {\n\t\t\t\tconst PDFParse = await loadPDFParse();\n\t\t\t\tconst parser = new PDFParse({ data: buffer });\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await parser.getText();\n\t\t\t\t\textractedText = result.text || \"\";\n\t\t\t\t} finally {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait parser.destroy();\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// ignore\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"docx\": {\n\t\t\t\tconst result = await mammoth.extractRawText({ buffer });\n\t\t\t\textractedText = result.value || \"\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"xlsx\": {\n\t\t\t\tconst workbook = new ExcelJS.Workbook();\n\t\t\t\tawait workbook.xlsx.load(buffer as unknown as ExcelWorkbookLoadInput);\n\t\t\t\tconst parts: string[] = [];\n\t\t\t\tfor (const worksheet of workbook.worksheets) {\n\t\t\t\t\tconst rows = worksheetToRows(worksheet);\n\t\t\t\t\tif (rows.length === 0) continue;\n\t\t\t\t\tparts.push(\n\t\t\t\t\t\t`# Sheet: ${worksheet.name}\\n${rows.map((row) => row.join(\"\\t\")).join(\"\\n\")}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\textractedText = parts.join(\"\\n\\n\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"pptx\": {\n\t\t\t\textractedText = await extractPptxText(buffer);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"text\": {\n\t\t\t\textractedText = buffer.toString(\"utf8\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\textractedText = \"\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (\n\t\textractor !== \"markitdown\" &&\n\t\tshouldTryMarkitdown(format, fileName, input.mimeType)\n\t) {\n\t\tconst markitdownText = await extractWithMarkitdown({\n\t\t\tbuffer,\n\t\t\tfileName,\n\t\t\tmimeType: input.mimeType,\n\t\t});\n\t\tif (markitdownText) {\n\t\t\textractedText = markitdownText;\n\t\t\textractor = \"markitdown\";\n\t\t}\n\t}\n\n\tconst { text, truncated } = clampText(extractedText, maxChars);\n\treturn {\n\t\textractedText: text,\n\t\tformat,\n\t\textractor,\n\t\ttruncated,\n\t\tsizeBytes: buffer.byteLength,\n\t};\n}\n"]}
|
package/dist/version.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.10.
|
|
3
|
-
"notes": "Maestro by EvalOps - Deterministic coding agent with TUI/CLI and Web UI for AI-assisted development v0.10.
|
|
2
|
+
"version": "0.10.42",
|
|
3
|
+
"notes": "Maestro by EvalOps - Deterministic coding agent with TUI/CLI and Web UI for AI-assisted development v0.10.42 is now available."
|
|
4
4
|
}
|
package/package.json
CHANGED