@evalops/maestro 0.10.40 → 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 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 {
@@ -73409,16 +73408,37 @@ function cloneToolResultForCache(message) {
73409
73408
  content: message.content.map((item) => ({ ...item }))
73410
73409
  };
73411
73410
  }
73412
- function cloneToolOutcomeForCall(outcome, toolCall, timestamp3) {
73411
+ function localToolExecutionIdForCall(toolCall) {
73412
+ return `local-tool-exec-${toolCall.id}`;
73413
+ }
73414
+ function attachToolExecutionMetadata(message, metadata, options = {}) {
73415
+ const details = message.details && typeof message.details === "object" ? { ...message.details } : {};
73416
+ if (metadata.toolExecutionId) {
73417
+ details.toolExecutionId = metadata.toolExecutionId;
73418
+ }
73419
+ if (metadata.approvalRequestId) {
73420
+ details.approvalRequestId = metadata.approvalRequestId;
73421
+ } else if (options.replaceApprovalRequestId) {
73422
+ delete details.approvalRequestId;
73423
+ }
73413
73424
  return {
73414
- message: {
73425
+ ...message,
73426
+ details
73427
+ };
73428
+ }
73429
+ function cloneToolOutcomeForCall(outcome, toolCall, timestamp3, metadata = {}) {
73430
+ const toolExecutionId = localToolExecutionIdForCall(toolCall);
73431
+ return {
73432
+ message: attachToolExecutionMetadata({
73415
73433
  ...outcome.message,
73416
73434
  toolCallId: toolCall.id,
73417
73435
  toolName: toolCall.name,
73418
73436
  content: outcome.message.content.map((item) => ({ ...item })),
73419
73437
  timestamp: timestamp3
73420
- },
73421
- isError: outcome.isError
73438
+ }, { toolExecutionId, approvalRequestId: metadata.approvalRequestId }, { replaceApprovalRequestId: true }),
73439
+ isError: outcome.isError,
73440
+ toolExecutionId,
73441
+ ...metadata.approvalRequestId ? { approvalRequestId: metadata.approvalRequestId } : {}
73422
73442
  };
73423
73443
  }
73424
73444
  function resolvePlatformToolExecutionBridge(option) {
@@ -73439,9 +73459,11 @@ async function recordReusableToolExecutionBridgeOutput({
73439
73459
  }
73440
73460
  const observed = plan.kind === "observe" ? await bridge.recordObservation(plan, outcome.message, signal) : void 0;
73441
73461
  const governedOutput = plan.kind === "governed" ? await bridge.recordGovernedOutput(plan, outcome.message, durationMs, signal) : void 0;
73462
+ const metadata = buildObservedResultMetadata(plan, observed ?? governedOutput);
73442
73463
  return {
73443
73464
  ...outcome,
73444
- ...buildObservedResultMetadata(plan, observed ?? governedOutput)
73465
+ ...metadata,
73466
+ message: attachToolExecutionMetadata(outcome.message, metadata)
73445
73467
  };
73446
73468
  }
73447
73469
  function hasReusableToolResultState(cacheKey, cache4, pending, policyCheckedKeys, pendingSafetyChecks) {
@@ -82771,6 +82793,7 @@ function createToolExecutionPromise(ctx) {
82771
82793
  const autoMaxAttempts = isClientTool ? 1 : toolHasRetryConfig ? (tool.maxRetries ?? resolvedRetryConfig.maxAutoRetries) + 1 : allowAutoRetries ? resolvedRetryConfig.maxAutoRetries + 1 : 1;
82772
82794
  const retryDelay = toolHasRetryConfig ? tool.retryDelayMs ?? resolvedRetryConfig.initialDelayMs : resolvedRetryConfig.initialDelayMs;
82773
82795
  const shouldRetryFn = tool.shouldRetry ?? isRetryableToolError;
82796
+ const fallbackToolExecutionId = `local-tool-exec-${toolCall.id}`;
82774
82797
  const context2 = cfg.sandbox ? { sandbox: cfg.sandbox } : void 0;
82775
82798
  const onUpdate = (partialResult) => {
82776
82799
  toolUpdateQueue.push({
@@ -82798,20 +82821,25 @@ function createToolExecutionPromise(ctx) {
82798
82821
  }
82799
82822
  return runWithMcpClientToolService(clientToolService2, () => tool.execute(toolCall.id, validatedArgs, signal, context2, onUpdate));
82800
82823
  };
82801
- const attachApprovalRequestId = (message) => {
82802
- if (!approvalRequestId) {
82803
- return;
82804
- }
82805
- const details = message.details && typeof message.details === "object" ? { ...message.details } : {};
82806
- if (typeof details.approvalRequestId !== "string") {
82807
- details.approvalRequestId = approvalRequestId;
82808
- }
82809
- message.details = details;
82824
+ const toolExecutionIdFromMessage = (message) => {
82825
+ const details = message.details && typeof message.details === "object" ? message.details : {};
82826
+ return typeof details.toolExecutionId === "string" && details.toolExecutionId.length > 0 ? details.toolExecutionId : void 0;
82810
82827
  };
82811
- const withLocalApprovalMetadata = (metadata) => ({
82828
+ const withLocalExecutionMetadata = (metadata, message) => ({
82812
82829
  ...metadata,
82830
+ toolExecutionId: metadata.toolExecutionId ?? (message ? toolExecutionIdFromMessage(message) : void 0) ?? fallbackToolExecutionId,
82813
82831
  ...approvalRequestId && !metadata.approvalRequestId ? { approvalRequestId } : {}
82814
82832
  });
82833
+ const attachToolResultLinkage = (message, metadata) => {
82834
+ const resolvedMetadata = withLocalExecutionMetadata(metadata, message);
82835
+ const details = message.details && typeof message.details === "object" ? { ...message.details } : {};
82836
+ details.toolExecutionId = resolvedMetadata.toolExecutionId;
82837
+ if (resolvedMetadata.approvalRequestId && typeof details.approvalRequestId !== "string") {
82838
+ details.approvalRequestId = resolvedMetadata.approvalRequestId;
82839
+ }
82840
+ message.details = details;
82841
+ return resolvedMetadata;
82842
+ };
82815
82843
  const executeWithRetry = async () => {
82816
82844
  let totalAttempts = 0;
82817
82845
  let userRetryRounds = 0;
@@ -82905,7 +82933,10 @@ function createToolExecutionPromise(ctx) {
82905
82933
  isError: result2.isError || false,
82906
82934
  timestamp: clock.now()
82907
82935
  };
82908
- attachApprovalRequestId(toolResultMsg);
82936
+ attachToolResultLinkage(toolResultMsg, {
82937
+ toolExecutionId: result2.toolExecutionId ?? toolExecutionBridgePlan?.metadata.toolExecutionId,
82938
+ approvalRequestId: result2.approvalRequestId ?? toolExecutionBridgePlan?.metadata.approvalRequestId
82939
+ });
82909
82940
  if (hookService && !result2.isError) {
82910
82941
  const postHookResult = await hookService.runPostToolUseHooks(effectiveToolCall, toolResultMsg, signal);
82911
82942
  if (postHookResult.additionalContext) {
@@ -82978,10 +83009,11 @@ function createToolExecutionPromise(ctx) {
82978
83009
  }
82979
83010
  const observed = toolExecutionBridge && toolExecutionBridgePlan?.kind === "observe" ? await toolExecutionBridge.recordObservation(toolExecutionBridgePlan, toolResultMsg, signal) : void 0;
82980
83011
  const governedOutput = toolExecutionBridge && toolExecutionBridgePlan?.kind === "governed" ? await toolExecutionBridge.recordGovernedOutput(toolExecutionBridgePlan, toolResultMsg, clock.now() - startTime, signal) : void 0;
83012
+ const linkageMetadata = attachToolResultLinkage(toolResultMsg, buildObservedResultMetadata(toolExecutionBridgePlan, observed ?? governedOutput));
82981
83013
  return {
82982
83014
  message: toolResultMsg,
82983
83015
  isError: toolResultMsg.isError,
82984
- ...withLocalApprovalMetadata(buildObservedResultMetadata(toolExecutionBridgePlan, observed ?? governedOutput))
83016
+ ...linkageMetadata
82985
83017
  };
82986
83018
  } catch (error) {
82987
83019
  if (error instanceof Error && error.name === "AbortError") {
@@ -83006,7 +83038,10 @@ function createToolExecutionPromise(ctx) {
83006
83038
  isError: true,
83007
83039
  timestamp: clock.now()
83008
83040
  };
83009
- attachApprovalRequestId(toolResultMsg);
83041
+ attachToolResultLinkage(toolResultMsg, {
83042
+ toolExecutionId: toolExecutionBridgePlan?.metadata.toolExecutionId,
83043
+ approvalRequestId: toolExecutionBridgePlan?.metadata.approvalRequestId
83044
+ });
83010
83045
  if (hookService) {
83011
83046
  const failureHookResult = await hookService.runPostToolUseFailureHooks(effectiveToolCall, baseErrorMessage, signal);
83012
83047
  if (failureHookResult.additionalContext) {
@@ -83022,10 +83057,11 @@ function createToolExecutionPromise(ctx) {
83022
83057
  }
83023
83058
  const observed = toolExecutionBridge && toolExecutionBridgePlan?.kind === "observe" ? await toolExecutionBridge.recordObservation(toolExecutionBridgePlan, toolResultMsg, signal) : void 0;
83024
83059
  const governedOutput = toolExecutionBridge && toolExecutionBridgePlan?.kind === "governed" ? await toolExecutionBridge.recordGovernedOutput(toolExecutionBridgePlan, toolResultMsg, clock.now() - startTime, signal) : void 0;
83060
+ const linkageMetadata = attachToolResultLinkage(toolResultMsg, buildObservedResultMetadata(toolExecutionBridgePlan, observed ?? governedOutput));
83025
83061
  return {
83026
83062
  message: toolResultMsg,
83027
83063
  isError: true,
83028
- ...withLocalApprovalMetadata(buildObservedResultMetadata(toolExecutionBridgePlan, observed ?? governedOutput))
83064
+ ...linkageMetadata
83029
83065
  };
83030
83066
  }
83031
83067
  })();
@@ -84240,18 +84276,7 @@ var ProviderTransport = class _ProviderTransport {
84240
84276
  const cachedOutcome = await recordReusableToolExecutionBridgeOutput({
84241
84277
  bridge: platformToolExecutionBridge,
84242
84278
  plan: safetyVerdict.toolExecutionBridgePlan,
84243
- outcome: {
84244
- message: {
84245
- ...cachedEntry.message,
84246
- toolCallId: toolCall.id,
84247
- toolName: toolCall.name,
84248
- content: cachedEntry.message.content.map((item) => ({
84249
- ...item
84250
- })),
84251
- timestamp: this.clock.now()
84252
- },
84253
- isError: false
84254
- },
84279
+ outcome: cloneToolOutcomeForCall({ message: cachedEntry.message, isError: false }, toolCall, this.clock.now(), { approvalRequestId: safetyVerdict.approvalRequestId }),
84255
84280
  durationMs: this.clock.now() - cacheHitStart,
84256
84281
  signal
84257
84282
  });
@@ -84267,7 +84292,7 @@ var ProviderTransport = class _ProviderTransport {
84267
84292
  const cachedOutcome = await recordReusableToolExecutionBridgeOutput({
84268
84293
  bridge: platformToolExecutionBridge,
84269
84294
  plan: safetyVerdict.toolExecutionBridgePlan,
84270
- outcome: cloneToolOutcomeForCall(await pendingReusable, toolCall, this.clock.now()),
84295
+ outcome: cloneToolOutcomeForCall(await pendingReusable, toolCall, this.clock.now(), { approvalRequestId: safetyVerdict.approvalRequestId }),
84271
84296
  durationMs: this.clock.now() - cacheHitStart,
84272
84297
  signal
84273
84298
  });
@@ -85189,18 +85214,7 @@ var ProviderTransport = class _ProviderTransport {
85189
85214
  const cachedOutcome = await recordReusableToolExecutionBridgeOutput({
85190
85215
  bridge: platformToolExecutionBridge,
85191
85216
  plan: safetyVerdict.toolExecutionBridgePlan,
85192
- outcome: {
85193
- message: {
85194
- ...cachedEntry.message,
85195
- toolCallId: toolCall.id,
85196
- toolName: toolCall.name,
85197
- content: cachedEntry.message.content.map((item) => ({
85198
- ...item
85199
- })),
85200
- timestamp: this.clock.now()
85201
- },
85202
- isError: false
85203
- },
85217
+ outcome: cloneToolOutcomeForCall({ message: cachedEntry.message, isError: false }, toolCall, this.clock.now(), { approvalRequestId: safetyVerdict.approvalRequestId }),
85204
85218
  durationMs: this.clock.now() - cacheHitStart,
85205
85219
  signal
85206
85220
  });
@@ -85254,7 +85268,9 @@ var ProviderTransport = class _ProviderTransport {
85254
85268
  return recordReusableToolExecutionBridgeOutput({
85255
85269
  bridge: platformToolExecutionBridge,
85256
85270
  plan: safetyVerdict.toolExecutionBridgePlan,
85257
- outcome: cloneToolOutcomeForCall(await pendingReusable, toolCall, this.clock.now()),
85271
+ outcome: cloneToolOutcomeForCall(await pendingReusable, toolCall, this.clock.now(), {
85272
+ approvalRequestId: safetyVerdict.approvalRequestId
85273
+ }),
85258
85274
  durationMs: this.clock.now() - cacheHitStart,
85259
85275
  signal
85260
85276
  });
@@ -158120,6 +158136,12 @@ Tip: double-check whitespace/newlines via /diff ${path3}`;
158120
158136
  }
158121
158137
  });
158122
158138
  });
158139
+ async function loadPDFParse() {
158140
+ if (!cachedPDFParse) {
158141
+ ({ PDFParse: cachedPDFParse } = await import("pdf-parse"));
158142
+ }
158143
+ return cachedPDFParse;
158144
+ }
158123
158145
  function clampText(text2, maxChars) {
158124
158146
  if (text2.length <= maxChars)
158125
158147
  return { text: text2, truncated: false };
@@ -158460,6 +158482,7 @@ async function extractDocumentText(input) {
158460
158482
  if (!extractedText) {
158461
158483
  switch (format) {
158462
158484
  case "pdf": {
158485
+ const PDFParse = await loadPDFParse();
158463
158486
  const parser2 = new PDFParse({ data: buffer });
158464
158487
  try {
158465
158488
  const result2 = await parser2.getText();
@@ -158535,6 +158558,7 @@ var MARKITDOWN_TIMEOUT_KILL_GRACE_MS = 500;
158535
158558
  var MARKITDOWN_TIMEOUT_CLOSE_GRACE_MS = 1e3;
158536
158559
  var NODE_TIMER_MAX_MS = 2147483647;
158537
158560
  var XLSX_MIME = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
158561
+ var cachedPDFParse;
158538
158562
  var init_document_extractor = __esm2(() => {
158539
158563
  MAX_INPUT_BYTES = 50 * 1024 * 1024;
158540
158564
  });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evalops/contracts",
3
- "version": "0.10.40",
3
+ "version": "0.10.42",
4
4
  "description": "Shared Maestro contracts for frontend/backend integration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evalops/tui",
3
- "version": "0.10.40",
3
+ "version": "0.10.42",
4
4
  "description": "Terminal UI library with differential rendering for Maestro",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1 +1 @@
1
- {"version":3,"file":"document-extractor.d.ts","sourceRoot":"","sources":["../../src/utils/document-extractor.ts"],"names":[],"mappings":"AASA,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;AA0ZD,wBAAsB,mBAAmB,CACxC,KAAK,EAAE,oBAAoB,GACzB,OAAO,CAAC,qBAAqB,CAAC,CAsGhC"}
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(\"&lt;\", \"<\")\n\t\t\t\t\t.replaceAll(\"&gt;\", \">\")\n\t\t\t\t\t.replaceAll(\"&amp;\", \"&\")\n\t\t\t\t\t.replaceAll(\"&quot;\", '\"')\n\t\t\t\t\t.replaceAll(\"&apos;\", \"'\"),\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":"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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\";\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(\"&lt;\", \"<\")\n\t\t\t\t\t.replaceAll(\"&gt;\", \">\")\n\t\t\t\t\t.replaceAll(\"&amp;\", \"&\")\n\t\t\t\t\t.replaceAll(\"&quot;\", '\"')\n\t\t\t\t\t.replaceAll(\"&apos;\", \"'\"),\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.40",
3
- "notes": "Maestro by EvalOps - Deterministic coding agent with TUI/CLI and Web UI for AI-assisted development v0.10.40 is now available."
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@evalops/maestro",
3
3
  "description": "Maestro by EvalOps - Deterministic coding agent with TUI/CLI and Web UI for AI-assisted development",
4
- "version": "0.10.40",
4
+ "version": "0.10.42",
5
5
  "private": false,
6
6
  "type": "module",
7
7
  "workspaces": [