@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/agent/transport/reusable-tool-results.d.ts +3 -1
- package/dist/agent/transport/reusable-tool-results.d.ts.map +1 -1
- package/dist/agent/transport/reusable-tool-results.js +32 -4
- package/dist/agent/transport/reusable-tool-results.js.map +1 -1
- package/dist/agent/transport/tool-execution.d.ts.map +1 -1
- package/dist/agent/transport/tool-execution.js +38 -14
- package/dist/agent/transport/tool-execution.js.map +1 -1
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +6 -26
- package/dist/agent/transport.js.map +1 -1
- package/dist/cli.js +70 -46
- 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 {
|
|
@@ -73409,16 +73408,37 @@ function cloneToolResultForCache(message) {
|
|
|
73409
73408
|
content: message.content.map((item) => ({ ...item }))
|
|
73410
73409
|
};
|
|
73411
73410
|
}
|
|
73412
|
-
function
|
|
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
|
-
...
|
|
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
|
|
82802
|
-
|
|
82803
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
...
|
|
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
|
-
|
|
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
|
-
...
|
|
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 +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":"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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(\"<\", \"<\")\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