@midscene/core 1.17.5 → 1.17.7
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/es/agent/agent-report-manager.mjs +1 -1
- package/dist/es/agent/agent-report-manager.mjs.map +1 -1
- package/dist/es/agent/utils.mjs +1 -1
- package/dist/es/ai-model/model-adapter/locate-prompt-order.mjs +80 -0
- package/dist/es/ai-model/model-adapter/locate-prompt-order.mjs.map +1 -0
- package/dist/es/ai-model/model-adapter/locate.mjs +2 -1
- package/dist/es/ai-model/model-adapter/locate.mjs.map +1 -1
- package/dist/es/ai-model/models/jev/locate.mjs +2 -12
- package/dist/es/ai-model/models/jev/locate.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/call-ai.mjs +4 -1
- package/dist/es/ai-model/service-caller/call-ai.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/openai/siwc/authorization.mjs +4 -3
- package/dist/es/ai-model/service-caller/openai/siwc/authorization.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/openai/siwc/network.mjs +36 -0
- package/dist/es/ai-model/service-caller/openai/siwc/network.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/openai/siwc/refresh.mjs +5 -3
- package/dist/es/ai-model/service-caller/openai/siwc/refresh.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/openai/siwc/token-manager.mjs +7 -4
- package/dist/es/ai-model/service-caller/openai/siwc/token-manager.mjs.map +1 -1
- package/dist/es/ai-model/shared/json.mjs +6 -2
- package/dist/es/ai-model/shared/json.mjs.map +1 -1
- package/dist/es/ai-model/workflows/grounding/locate.mjs +1 -1
- package/dist/es/ai-model/workflows/grounding/locate.mjs.map +1 -1
- package/dist/es/ai-model/workflows/grounding/section-locate.mjs +1 -1
- package/dist/es/ai-model/workflows/grounding/section-locate.mjs.map +1 -1
- package/dist/es/ai-model/workflows/grounding/utils.mjs +8 -26
- package/dist/es/ai-model/workflows/grounding/utils.mjs.map +1 -1
- package/dist/es/dump/report-image-export.mjs +58 -0
- package/dist/es/dump/report-image-export.mjs.map +1 -0
- package/dist/es/dump/screenshot-store.mjs +5 -0
- package/dist/es/dump/screenshot-store.mjs.map +1 -1
- package/dist/es/report-cli.mjs +13 -29
- package/dist/es/report-cli.mjs.map +1 -1
- package/dist/es/report-generator.mjs +22 -8
- package/dist/es/report-generator.mjs.map +1 -1
- package/dist/es/report-html-template.mjs +1 -1
- package/dist/es/report-markdown.mjs +50 -53
- package/dist/es/report-markdown.mjs.map +1 -1
- package/dist/es/report.mjs +8 -24
- package/dist/es/report.mjs.map +1 -1
- package/dist/es/siwc.mjs +4 -0
- package/dist/es/task-runner.mjs +7 -2
- package/dist/es/task-runner.mjs.map +1 -1
- package/dist/es/utils.mjs +1 -1
- package/dist/lib/agent/agent-report-manager.js +1 -1
- package/dist/lib/agent/agent-report-manager.js.map +1 -1
- package/dist/lib/agent/utils.js +1 -1
- package/dist/lib/ai-model/model-adapter/locate-prompt-order.js +117 -0
- package/dist/lib/ai-model/model-adapter/locate-prompt-order.js.map +1 -0
- package/dist/lib/ai-model/model-adapter/locate.js +2 -1
- package/dist/lib/ai-model/model-adapter/locate.js.map +1 -1
- package/dist/lib/ai-model/models/jev/locate.js +2 -12
- package/dist/lib/ai-model/models/jev/locate.js.map +1 -1
- package/dist/lib/ai-model/service-caller/call-ai.js +4 -1
- package/dist/lib/ai-model/service-caller/call-ai.js.map +1 -1
- package/dist/lib/ai-model/service-caller/openai/siwc/authorization.js +3 -2
- package/dist/lib/ai-model/service-caller/openai/siwc/authorization.js.map +1 -1
- package/dist/lib/ai-model/service-caller/openai/siwc/network.js +73 -0
- package/dist/lib/ai-model/service-caller/openai/siwc/network.js.map +1 -0
- package/dist/lib/ai-model/service-caller/openai/siwc/refresh.js +4 -2
- package/dist/lib/ai-model/service-caller/openai/siwc/refresh.js.map +1 -1
- package/dist/lib/ai-model/service-caller/openai/siwc/token-manager.js +7 -4
- package/dist/lib/ai-model/service-caller/openai/siwc/token-manager.js.map +1 -1
- package/dist/lib/ai-model/shared/json.js +6 -2
- package/dist/lib/ai-model/shared/json.js.map +1 -1
- package/dist/lib/ai-model/workflows/grounding/locate.js +1 -1
- package/dist/lib/ai-model/workflows/grounding/locate.js.map +1 -1
- package/dist/lib/ai-model/workflows/grounding/section-locate.js +1 -1
- package/dist/lib/ai-model/workflows/grounding/section-locate.js.map +1 -1
- package/dist/lib/ai-model/workflows/grounding/utils.js +8 -26
- package/dist/lib/ai-model/workflows/grounding/utils.js.map +1 -1
- package/dist/lib/dump/report-image-export.js +92 -0
- package/dist/lib/dump/report-image-export.js.map +1 -0
- package/dist/lib/dump/screenshot-store.js +5 -0
- package/dist/lib/dump/screenshot-store.js.map +1 -1
- package/dist/lib/report-cli.js +12 -28
- package/dist/lib/report-cli.js.map +1 -1
- package/dist/lib/report-generator.js +22 -8
- package/dist/lib/report-generator.js.map +1 -1
- package/dist/lib/report-html-template.js +1 -1
- package/dist/lib/report-markdown.js +50 -53
- package/dist/lib/report-markdown.js.map +1 -1
- package/dist/lib/report.js +6 -22
- package/dist/lib/report.js.map +1 -1
- package/dist/lib/siwc.js +52 -0
- package/dist/lib/siwc.js.map +1 -0
- package/dist/lib/task-runner.js +7 -2
- package/dist/lib/task-runner.js.map +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/types/ai-model/model-adapter/locate-prompt-order.d.ts +24 -0
- package/dist/types/ai-model/model-adapter/locate-prompt-order.d.ts.map +1 -0
- package/dist/types/ai-model/model-adapter/locate.d.ts.map +1 -1
- package/dist/types/ai-model/model-adapter/types.d.ts +9 -3
- package/dist/types/ai-model/model-adapter/types.d.ts.map +1 -1
- package/dist/types/ai-model/models/jev/locate.d.ts.map +1 -1
- package/dist/types/ai-model/service-caller/openai/siwc/authorization.d.ts.map +1 -1
- package/dist/types/ai-model/service-caller/openai/siwc/network.d.ts +8 -0
- package/dist/types/ai-model/service-caller/openai/siwc/network.d.ts.map +1 -0
- package/dist/types/ai-model/service-caller/openai/siwc/refresh.d.ts +1 -1
- package/dist/types/ai-model/service-caller/openai/siwc/refresh.d.ts.map +1 -1
- package/dist/types/ai-model/service-caller/openai/siwc/token-manager.d.ts +2 -1
- package/dist/types/ai-model/service-caller/openai/siwc/token-manager.d.ts.map +1 -1
- package/dist/types/ai-model/shared/json.d.ts +4 -15
- package/dist/types/ai-model/shared/json.d.ts.map +1 -1
- package/dist/types/ai-model/workflows/grounding/utils.d.ts +4 -9
- package/dist/types/ai-model/workflows/grounding/utils.d.ts.map +1 -1
- package/dist/types/dump/report-image-export.d.ts +12 -0
- package/dist/types/dump/report-image-export.d.ts.map +1 -0
- package/dist/types/dump/screenshot-store.d.ts +2 -0
- package/dist/types/dump/screenshot-store.d.ts.map +1 -1
- package/dist/types/report-cli.d.ts.map +1 -1
- package/dist/types/report-generator.d.ts +4 -2
- package/dist/types/report-generator.d.ts.map +1 -1
- package/dist/types/report-markdown.d.ts +4 -2
- package/dist/types/report-markdown.d.ts.map +1 -1
- package/dist/types/report.d.ts.map +1 -1
- package/dist/types/siwc.d.ts +5 -0
- package/dist/types/siwc.d.ts.map +1 -0
- package/dist/types/task-runner.d.ts.map +1 -1
- package/package.json +10 -2
|
@@ -240,54 +240,52 @@ function restoredSourceRef(screenshot) {
|
|
|
240
240
|
}
|
|
241
241
|
function screenshotAttachment(screenshot, screenshotBaseDir, executionIndex, taskIndex, options) {
|
|
242
242
|
const markdownLabel = options?.label || `task-${taskIndex + 1}`;
|
|
243
|
+
const result = (attachment)=>{
|
|
244
|
+
attachment.suggestedFileName = options?.resolveScreenshotFileName?.(attachment) ?? attachment.suggestedFileName;
|
|
245
|
+
return {
|
|
246
|
+
markdown: `\n`,
|
|
247
|
+
attachment
|
|
248
|
+
};
|
|
249
|
+
};
|
|
243
250
|
if (external_screenshot_item_js_namespaceObject.ScreenshotItem.isScreenshotItem(screenshot)) {
|
|
244
251
|
const ext = screenshot.extension;
|
|
245
252
|
const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${screenshot.id}.${ext}`;
|
|
246
|
-
return {
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
base64Data: tryExtractBase64(screenshot)
|
|
255
|
-
}
|
|
256
|
-
};
|
|
253
|
+
return result({
|
|
254
|
+
id: screenshot.id,
|
|
255
|
+
suggestedFileName,
|
|
256
|
+
mimeType: `image/${'jpeg' === ext ? 'jpeg' : 'png'}`,
|
|
257
|
+
executionIndex,
|
|
258
|
+
taskIndex,
|
|
259
|
+
base64Data: tryExtractBase64(screenshot)
|
|
260
|
+
});
|
|
257
261
|
}
|
|
258
262
|
const ref = (0, screenshot_store_js_namespaceObject.normalizeScreenshotRef)(screenshot);
|
|
259
263
|
if (ref) {
|
|
260
264
|
const ext = (0, screenshot_store_js_namespaceObject.imageRefFileExtension)(ref);
|
|
261
265
|
const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${ref.id}.${ext}`;
|
|
262
|
-
return {
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
base64Data: tryExtractBase64(screenshot)
|
|
272
|
-
}
|
|
273
|
-
};
|
|
266
|
+
return result({
|
|
267
|
+
id: ref.id,
|
|
268
|
+
suggestedFileName,
|
|
269
|
+
sourceRef: ref,
|
|
270
|
+
mimeType: ref.mimeType,
|
|
271
|
+
executionIndex,
|
|
272
|
+
taskIndex,
|
|
273
|
+
base64Data: tryExtractBase64(screenshot)
|
|
274
|
+
});
|
|
274
275
|
}
|
|
275
276
|
const sourceRef = restoredSourceRef(screenshot);
|
|
276
277
|
if (sourceRef) {
|
|
277
278
|
const ext = (0, screenshot_store_js_namespaceObject.imageRefFileExtension)(sourceRef);
|
|
278
279
|
const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${sourceRef.id}.${ext}`;
|
|
279
|
-
return {
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
base64Data: tryExtractBase64(screenshot)
|
|
289
|
-
}
|
|
290
|
-
};
|
|
280
|
+
return result({
|
|
281
|
+
id: sourceRef.id,
|
|
282
|
+
suggestedFileName,
|
|
283
|
+
sourceRef,
|
|
284
|
+
mimeType: sourceRef.mimeType,
|
|
285
|
+
executionIndex,
|
|
286
|
+
taskIndex,
|
|
287
|
+
base64Data: tryExtractBase64(screenshot)
|
|
288
|
+
});
|
|
291
289
|
}
|
|
292
290
|
const base64 = tryExtractBase64(screenshot);
|
|
293
291
|
if (base64) {
|
|
@@ -295,24 +293,21 @@ function screenshotAttachment(screenshot, screenshotBaseDir, executionIndex, tas
|
|
|
295
293
|
const idSuffix = options?.fallbackIdSuffix ? `-${options.fallbackIdSuffix}` : '';
|
|
296
294
|
const id = `restored-${executionIndex + 1}-${taskIndex + 1}${idSuffix}`;
|
|
297
295
|
const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${id}.${ext}`;
|
|
298
|
-
return {
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
base64Data: base64
|
|
307
|
-
}
|
|
308
|
-
};
|
|
296
|
+
return result({
|
|
297
|
+
id,
|
|
298
|
+
suggestedFileName,
|
|
299
|
+
mimeType: `image/${ext}`,
|
|
300
|
+
executionIndex,
|
|
301
|
+
taskIndex,
|
|
302
|
+
base64Data: base64
|
|
303
|
+
});
|
|
309
304
|
}
|
|
310
305
|
throw new Error(`executionToMarkdown: missing screenshot for execution #${executionIndex + 1} task #${taskIndex + 1}`);
|
|
311
306
|
}
|
|
312
307
|
function imageLabelSuffix(value) {
|
|
313
308
|
return value.toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '') || 'screenshot';
|
|
314
309
|
}
|
|
315
|
-
function screenshotsMarkdownSection(task, screenshotBaseDir, executionIndex, taskIndex) {
|
|
310
|
+
function screenshotsMarkdownSection(task, screenshotBaseDir, executionIndex, taskIndex, resolveScreenshotFileName) {
|
|
316
311
|
const lines = [
|
|
317
312
|
'',
|
|
318
313
|
'### Screenshots'
|
|
@@ -322,11 +317,12 @@ function screenshotsMarkdownSection(task, screenshotBaseDir, executionIndex, tas
|
|
|
322
317
|
if (task.uiContext?.screenshot) {
|
|
323
318
|
const imageResult = screenshotAttachment(task.uiContext.screenshot, screenshotBaseDir, executionIndex, taskIndex, {
|
|
324
319
|
fallbackIdSuffix: 'ui-context',
|
|
325
|
-
label: `task-${taskIndex + 1}-ui-context
|
|
320
|
+
label: `task-${taskIndex + 1}-ui-context`,
|
|
321
|
+
resolveScreenshotFileName
|
|
326
322
|
});
|
|
327
323
|
const time = resolveTaskTiming(task);
|
|
328
324
|
screenshotIndex += 1;
|
|
329
|
-
lines.push(`- #${screenshotIndex} type=ui-context, ts=${formatTime(time.start)}, timing=ui-context`);
|
|
325
|
+
lines.push(`- #${screenshotIndex} type=ui-context, ts=${formatTime(time.start)}, timing=ui-context, id=${imageResult.attachment.id}`);
|
|
330
326
|
lines.push(imageResult.markdown);
|
|
331
327
|
attachments.push(imageResult.attachment);
|
|
332
328
|
}
|
|
@@ -335,11 +331,12 @@ function screenshotsMarkdownSection(task, screenshotBaseDir, executionIndex, tas
|
|
|
335
331
|
const descriptionText = item.description ? `, description=${item.description}` : '';
|
|
336
332
|
const timing = item.timing || 'N/A';
|
|
337
333
|
screenshotIndex += 1;
|
|
338
|
-
lines.push(`- #${screenshotIndex} type=${item.type}, ts=${formatTime(item.ts)}, timing=${timing}${descriptionText}`);
|
|
339
334
|
const imageResult = screenshotAttachment(item.screenshot, screenshotBaseDir, executionIndex, taskIndex, {
|
|
340
335
|
fallbackIdSuffix: `recorder-${recorderIndex + 1}`,
|
|
341
|
-
label: `task-${taskIndex + 1}-${imageLabelSuffix(timing)}
|
|
336
|
+
label: `task-${taskIndex + 1}-${imageLabelSuffix(timing)}`,
|
|
337
|
+
resolveScreenshotFileName
|
|
342
338
|
});
|
|
339
|
+
lines.push(`- #${screenshotIndex} type=${item.type}, ts=${formatTime(item.ts)}, timing=${timing}${descriptionText}, id=${imageResult.attachment.id}`);
|
|
343
340
|
lines.push(imageResult.markdown);
|
|
344
341
|
attachments.push(imageResult.attachment);
|
|
345
342
|
});
|
|
@@ -400,7 +397,7 @@ function renderExecution(executionRaw, executionIndex, options) {
|
|
|
400
397
|
appendJsonSection(lines, 'Log', task.log);
|
|
401
398
|
appendTextSection(lines, 'Thought', task.thought);
|
|
402
399
|
appendTextSection(lines, 'Reasoning Content', task.reasoning_content);
|
|
403
|
-
const screenshotsSection = screenshotsMarkdownSection(task, screenshotBaseDir, executionIndex, taskIndex);
|
|
400
|
+
const screenshotsSection = screenshotsMarkdownSection(task, screenshotBaseDir, executionIndex, taskIndex, options?.resolveScreenshotFileName);
|
|
404
401
|
if (screenshotsSection.lines.length) {
|
|
405
402
|
lines.push(...screenshotsSection.lines);
|
|
406
403
|
attachments.push(...screenshotsSection.attachments);
|
|
@@ -417,7 +414,7 @@ function executionToMarkdown(execution, options) {
|
|
|
417
414
|
function reportToMarkdown(report, options) {
|
|
418
415
|
const reportDump = toReportDump(report);
|
|
419
416
|
const executionResults = reportDump.executions.map((execution, index)=>{
|
|
420
|
-
const rendered = renderExecution(execution, index);
|
|
417
|
+
const rendered = renderExecution(execution, index, options);
|
|
421
418
|
return {
|
|
422
419
|
markdown: rendered.markdown,
|
|
423
420
|
attachments: rendered.attachments
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-markdown.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/report-markdown.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { extractInsightParam, paramStr, typeStr } from '@/agent/ui-utils';\nimport { ScreenshotItem } from '@/screenshot-item';\nimport type {\n AIUsageInfo,\n ExecutionDump,\n ExecutionTask,\n IExecutionDump,\n IReportActionDump,\n ModelBrief,\n ReportActionDump,\n} from '@/types';\nimport type { ScreenshotRef } from './dump/screenshot-store';\nimport {\n imageRefFileExtension,\n normalizeScreenshotRef,\n} from './dump/screenshot-store';\nimport { collectReportSummary } from './report-stats';\n\nconst screenshotDataUrlPattern =\n /^data:image\\/(png|jpeg|jpg);base64,([\\s\\S]*)$/i;\nconst rawBase64BodyPattern = /^[a-zA-Z0-9+/=\\s]+$/;\nconst jsonContextMaxStringLength = 12_000;\n\ntype ExecutionTaskWithExtraUsage = ExecutionTask & {\n searchAreaUsage?: AIUsageInfo;\n reasoning_content?: string;\n};\n\nexport interface MarkdownAttachment {\n id: string;\n /**\n * Stable, prefixed file name for the exported copy. The markdown image link\n * always points at `${screenshotBaseDir}/${suggestedFileName}`, so consumers\n * write the screenshot under this name to keep links in sync. See #2392.\n */\n suggestedFileName: string;\n mimeType?: string;\n /**\n * Reference to the screenshot in the source report, used to locate the\n * original bytes when copying them to the exported name. Absent for in-memory\n * screenshots, which carry their data in `base64Data` instead.\n */\n sourceRef?: ScreenshotRef;\n executionIndex: number;\n taskIndex: number;\n /** Populated when screenshot data is available in memory (e.g. browser context). */\n base64Data?: string;\n}\n\nexport interface ExecutionMarkdownOptions {\n screenshotBaseDir?: string;\n}\n\nexport interface ReportMarkdownOptions {\n /** Used only when the report has no recorded task timestamps. */\n wallTimeFallbackMs?: number;\n}\n\nexport interface ExecutionMarkdownResult {\n markdown: string;\n attachments: MarkdownAttachment[];\n}\n\nexport interface ReportMarkdownResult {\n markdown: string;\n attachments: MarkdownAttachment[];\n}\n\nfunction toExecutionDump(\n execution: ExecutionDump | IExecutionDump,\n): IExecutionDump {\n if (!execution || typeof execution !== 'object') {\n throw new Error('executionToMarkdown: execution is required');\n }\n\n if (!Array.isArray(execution.tasks)) {\n throw new Error('executionToMarkdown: execution.tasks must be an array');\n }\n\n if (!execution.name) {\n throw new Error('executionToMarkdown: execution.name is required');\n }\n\n return execution;\n}\n\nfunction toReportDump(\n report: ReportActionDump | IReportActionDump,\n): IReportActionDump {\n if (!report || typeof report !== 'object') {\n throw new Error('reportToMarkdown: report is required');\n }\n\n if (!Array.isArray(report.executions)) {\n throw new Error('reportToMarkdown: report.executions must be an array');\n }\n\n return report;\n}\n\nfunction formatTime(ts?: number): string {\n if (typeof ts !== 'number' || Number.isNaN(ts)) {\n return 'N/A';\n }\n return new Date(ts).toISOString();\n}\n\nfunction formatValue(value: unknown): string {\n if (value === undefined || value === null || value === '') {\n return 'N/A';\n }\n if (typeof value === 'number') {\n return Number.isFinite(value) ? String(value) : 'N/A';\n }\n return String(value);\n}\n\nfunction escapeTableCell(value: unknown): string {\n return formatValue(value).replace(/\\|/g, '\\\\|').replace(/\\n/g, '<br>');\n}\n\nfunction markdownTable(headers: string[], rows: unknown[][]): string[] {\n return [\n `| ${headers.map(escapeTableCell).join(' | ')} |`,\n `| ${headers.map(() => '---').join(' | ')} |`,\n ...rows.map((row) => `| ${row.map(escapeTableCell).join(' | ')} |`),\n ];\n}\n\nfunction modelBriefRows(modelBriefs: ModelBrief[]): unknown[][] {\n return modelBriefs.map((brief) => [\n brief.intent || 'default',\n brief.name || 'N/A',\n brief.modelDescription || 'N/A',\n ]);\n}\n\nfunction modelRowsFromUsage(report: IReportActionDump): unknown[][] {\n const rows = new Map<string, unknown[]>();\n const addUsage = (source: string, usage?: AIUsageInfo) => {\n if (!hasUsage(usage)) return;\n const intent = usage.intent || source;\n const model = usage.model_name || usage.response_model_name;\n const description = usage.model_description;\n const key = `${intent}\\0${model || ''}\\0${description || ''}`;\n if (rows.has(key)) {\n return;\n }\n rows.set(key, [intent, model || 'N/A', description || 'N/A']);\n };\n\n for (const execution of report.executions) {\n for (const task of execution.tasks) {\n const taskWithUsage = task as ExecutionTaskWithExtraUsage;\n addUsage('main', taskWithUsage.usage);\n addUsage('searchArea', taskWithUsage.searchAreaUsage);\n }\n }\n\n return Array.from(rows.values());\n}\n\nfunction usageValue(usage: AIUsageInfo | undefined, key: string): number {\n const value = usage?.[key];\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction hasUsage(usage: AIUsageInfo | undefined): usage is AIUsageInfo {\n if (!usage) return false;\n return [\n 'intent',\n 'model_name',\n 'model_description',\n 'prompt_tokens',\n 'cached_input',\n 'completion_tokens',\n 'total_tokens',\n 'time_cost',\n 'request_id',\n ].some((key) => usage[key] !== undefined && usage[key] !== null);\n}\n\nfunction usageTotalTokens(usage: AIUsageInfo): number {\n const explicitTotal = usageValue(usage, 'total_tokens');\n if (explicitTotal > 0) {\n return explicitTotal;\n }\n return (\n usageValue(usage, 'prompt_tokens') + usageValue(usage, 'completion_tokens')\n );\n}\n\nfunction usageRowsForTask(task: ExecutionTask): unknown[][] {\n const taskWithUsage = task as ExecutionTaskWithExtraUsage;\n const rows: unknown[][] = [];\n const appendUsage = (source: string, usage?: AIUsageInfo) => {\n if (!hasUsage(usage)) return;\n rows.push([\n source,\n usage.intent,\n usage.model_name || usage.response_model_name,\n usage.model_description,\n usageValue(usage, 'prompt_tokens'),\n usageValue(usage, 'cached_input'),\n usageValue(usage, 'completion_tokens'),\n usageTotalTokens(usage),\n usageValue(usage, 'time_cost'),\n usage.request_id,\n ]);\n };\n\n appendUsage('main', taskWithUsage.usage);\n appendUsage('searchArea', taskWithUsage.searchAreaUsage);\n return rows;\n}\n\nfunction sanitizeJsonForMarkdown(\n value: unknown,\n seen = new WeakSet<object>(),\n): unknown {\n if (typeof value === 'string') {\n if (\n screenshotDataUrlPattern.test(value) ||\n value.length > 1_000_000 ||\n /^[a-zA-Z0-9+/=\\s]{100000,}$/.test(value)\n ) {\n return `[omitted image/base64 string, length=${value.length}]`;\n }\n if (value.length > jsonContextMaxStringLength) {\n return `${value.slice(0, jsonContextMaxStringLength)}\\n[truncated, original length=${value.length}]`;\n }\n return value;\n }\n\n if (\n value === null ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n\n if (typeof value === 'function') {\n return '[omitted function]';\n }\n\n if (typeof value !== 'object' || value === undefined) {\n return undefined;\n }\n\n if (seen.has(value)) {\n return '[omitted circular reference]';\n }\n seen.add(value);\n\n if (Array.isArray(value)) {\n return value.map((item) => sanitizeJsonForMarkdown(item, seen));\n }\n\n const input = value as Record<string, unknown>;\n const output: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(input)) {\n if (entry === undefined || typeof entry === 'function') {\n continue;\n }\n if (\n typeof entry === 'string' &&\n /(^|_|-)(base64|screenshotBase64|imageBase64)$/i.test(key)\n ) {\n output[key] = `[omitted base64 string, length=${entry.length}]`;\n continue;\n }\n output[key] = sanitizeJsonForMarkdown(entry, seen);\n }\n seen.delete(value);\n return output;\n}\n\nfunction appendJsonSection(\n lines: string[],\n title: string,\n value: unknown,\n): void {\n if (value === undefined || value === null || value === '') {\n return;\n }\n const sanitized = sanitizeJsonForMarkdown(value);\n if (sanitized === undefined) {\n return;\n }\n\n lines.push('', `### ${title}`, '', '```json');\n lines.push(JSON.stringify(sanitized, null, 2));\n lines.push('```');\n}\n\nfunction appendTextSection(\n lines: string[],\n title: string,\n value: unknown,\n): void {\n if (typeof value !== 'string' || !value.trim()) {\n return;\n }\n lines.push('', `### ${title}`, '', '```text');\n lines.push(value.replace(/```/g, '` ` `'));\n lines.push('```');\n}\n\nfunction resolveTaskTiming(task: ExecutionTask): {\n start?: number;\n end?: number;\n cost?: number;\n} {\n const timing = task.timing;\n if (!timing) {\n return {};\n }\n\n const start = timing.start ?? timing.callAiStart ?? timing.callActionStart;\n const end =\n timing.end ??\n timing.callAiEnd ??\n timing.callActionEnd ??\n timing.captureAfterCallingSnapshotEnd;\n const cost =\n timing.cost ??\n (typeof start === 'number' && typeof end === 'number'\n ? end - start\n : undefined);\n\n return { start, end, cost };\n}\n\nfunction safeTaskParam(task: ExecutionTask): string {\n const readable = paramStr(task);\n if (readable) {\n return readable;\n }\n\n if (task.type === 'Insight') {\n return extractInsightParam((task as any).param).content;\n }\n\n return '';\n}\n\nfunction formatSize(\n size?: { width?: number; height?: number } | null,\n): string | undefined {\n if (\n !size ||\n typeof size.width !== 'number' ||\n typeof size.height !== 'number' ||\n Number.isNaN(size.width) ||\n Number.isNaN(size.height)\n ) {\n return undefined;\n }\n\n return `${size.width} x ${size.height}`;\n}\n\nfunction extractLocateCenter(\n task: ExecutionTask,\n): [number, number] | undefined {\n const outputCenter = (task.output as { element?: { center?: unknown } })\n ?.element?.center;\n if (\n Array.isArray(outputCenter) &&\n outputCenter.length >= 2 &&\n typeof outputCenter[0] === 'number' &&\n typeof outputCenter[1] === 'number'\n ) {\n return [outputCenter[0], outputCenter[1]];\n }\n\n const paramLocateCenter = (task.param as { locate?: { center?: unknown } })\n ?.locate?.center;\n if (\n Array.isArray(paramLocateCenter) &&\n paramLocateCenter.length >= 2 &&\n typeof paramLocateCenter[0] === 'number' &&\n typeof paramLocateCenter[1] === 'number'\n ) {\n return [paramLocateCenter[0], paramLocateCenter[1]];\n }\n\n const paramCenter = (task.param as { center?: unknown })?.center;\n if (\n Array.isArray(paramCenter) &&\n paramCenter.length >= 2 &&\n typeof paramCenter[0] === 'number' &&\n typeof paramCenter[1] === 'number'\n ) {\n return [paramCenter[0], paramCenter[1]];\n }\n\n return undefined;\n}\n\nfunction tryExtractBase64(screenshot: unknown): string | undefined {\n if (typeof screenshot === 'string') {\n const trimmedScreenshot = screenshot.trim();\n const dataUrlMatch = trimmedScreenshot.match(screenshotDataUrlPattern);\n if (dataUrlMatch) {\n const format = dataUrlMatch[1].toLowerCase() === 'jpg' ? 'jpeg' : 'png';\n const base64Body = dataUrlMatch[2].replace(/\\s/g, '');\n if (!base64Body) {\n return undefined;\n }\n return `data:image/${format};base64,${base64Body}`;\n }\n\n if (\n trimmedScreenshot.startsWith('data:') ||\n !rawBase64BodyPattern.test(trimmedScreenshot)\n ) {\n return undefined;\n }\n\n const base64Body = trimmedScreenshot.replace(/\\s/g, '');\n return base64Body ? `data:image/png;base64,${base64Body}` : undefined;\n }\n\n if (!screenshot || typeof screenshot !== 'object') return undefined;\n const s = screenshot as Record<string, unknown>;\n if (typeof s.base64 === 'string' && s.base64.length > 0) {\n return s.base64;\n }\n return undefined;\n}\n\nfunction restoredSourceRef(screenshot: unknown): ScreenshotRef | undefined {\n if (!screenshot || typeof screenshot !== 'object') {\n return undefined;\n }\n\n const sourceRef = (screenshot as Record<string, unknown>).sourceRef;\n return normalizeScreenshotRef(sourceRef) ?? undefined;\n}\n\nfunction screenshotAttachment(\n screenshot: unknown,\n screenshotBaseDir: string,\n executionIndex: number,\n taskIndex: number,\n options?: {\n fallbackIdSuffix?: string;\n label?: string;\n },\n): { markdown: string; attachment: MarkdownAttachment } {\n const markdownLabel = options?.label || `task-${taskIndex + 1}`;\n\n if (ScreenshotItem.isScreenshotItem(screenshot)) {\n const ext = screenshot.extension;\n const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${screenshot.id}.${ext}`;\n return {\n markdown: `\\n`,\n attachment: {\n id: screenshot.id,\n suggestedFileName,\n mimeType: `image/${ext === 'jpeg' ? 'jpeg' : 'png'}`,\n executionIndex,\n taskIndex,\n base64Data: tryExtractBase64(screenshot),\n },\n };\n }\n\n const ref = normalizeScreenshotRef(screenshot);\n if (ref) {\n const ext = imageRefFileExtension(ref);\n const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${ref.id}.${ext}`;\n return {\n markdown: `\\n`,\n attachment: {\n id: ref.id,\n suggestedFileName,\n sourceRef: ref,\n mimeType: ref.mimeType,\n executionIndex,\n taskIndex,\n base64Data: tryExtractBase64(screenshot),\n },\n };\n }\n\n const sourceRef = restoredSourceRef(screenshot);\n if (sourceRef) {\n const ext = imageRefFileExtension(sourceRef);\n const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${sourceRef.id}.${ext}`;\n return {\n markdown: `\\n`,\n attachment: {\n id: sourceRef.id,\n suggestedFileName,\n sourceRef,\n mimeType: sourceRef.mimeType,\n executionIndex,\n taskIndex,\n base64Data: tryExtractBase64(screenshot),\n },\n };\n }\n\n const base64 = tryExtractBase64(screenshot);\n if (base64) {\n const ext = base64.startsWith('data:image/jpeg') ? 'jpeg' : 'png';\n const idSuffix = options?.fallbackIdSuffix\n ? `-${options.fallbackIdSuffix}`\n : '';\n const id = `restored-${executionIndex + 1}-${taskIndex + 1}${idSuffix}`;\n const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${id}.${ext}`;\n return {\n markdown: `\\n`,\n attachment: {\n id,\n suggestedFileName,\n mimeType: `image/${ext}`,\n executionIndex,\n taskIndex,\n base64Data: base64,\n },\n };\n }\n\n throw new Error(\n `executionToMarkdown: missing screenshot for execution #${executionIndex + 1} task #${taskIndex + 1}`,\n );\n}\n\nfunction imageLabelSuffix(value: string): string {\n return (\n value\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '') || 'screenshot'\n );\n}\n\nfunction screenshotsMarkdownSection(\n task: ExecutionTask,\n screenshotBaseDir: string,\n executionIndex: number,\n taskIndex: number,\n): { lines: string[]; attachments: MarkdownAttachment[] } {\n const lines: string[] = ['', '### Screenshots'];\n const attachments: MarkdownAttachment[] = [];\n let screenshotIndex = 0;\n\n if (task.uiContext?.screenshot) {\n const imageResult = screenshotAttachment(\n task.uiContext.screenshot,\n screenshotBaseDir,\n executionIndex,\n taskIndex,\n {\n fallbackIdSuffix: 'ui-context',\n label: `task-${taskIndex + 1}-ui-context`,\n },\n );\n const time = resolveTaskTiming(task);\n screenshotIndex += 1;\n lines.push(\n `- #${screenshotIndex} type=ui-context, ts=${formatTime(time.start)}, timing=ui-context`,\n );\n lines.push(imageResult.markdown);\n attachments.push(imageResult.attachment);\n }\n\n task.recorder?.forEach((item, recorderIndex) => {\n if (!item.screenshot) {\n return;\n }\n\n const descriptionText = item.description\n ? `, description=${item.description}`\n : '';\n const timing = item.timing || 'N/A';\n screenshotIndex += 1;\n lines.push(\n `- #${screenshotIndex} type=${item.type}, ts=${formatTime(item.ts)}, timing=${timing}${descriptionText}`,\n );\n\n const imageResult = screenshotAttachment(\n item.screenshot,\n screenshotBaseDir,\n executionIndex,\n taskIndex,\n {\n fallbackIdSuffix: `recorder-${recorderIndex + 1}`,\n label: `task-${taskIndex + 1}-${imageLabelSuffix(timing)}`,\n },\n );\n\n lines.push(imageResult.markdown);\n attachments.push(imageResult.attachment);\n });\n\n return screenshotIndex > 0\n ? { lines, attachments }\n : { lines: [], attachments };\n}\n\nfunction renderExecution(\n executionRaw: ExecutionDump | IExecutionDump,\n executionIndex: number,\n options?: ExecutionMarkdownOptions,\n): ExecutionMarkdownResult {\n const execution = toExecutionDump(executionRaw);\n const screenshotBaseDir = options?.screenshotBaseDir ?? './screenshots';\n\n const lines: string[] = [];\n const attachments: MarkdownAttachment[] = [];\n\n lines.push(`# ${execution.name}`);\n if (execution.description) {\n lines.push('', execution.description);\n }\n\n lines.push('', `- Execution start: ${formatTime(execution.logTime)}`);\n lines.push(`- Task count: ${execution.tasks.length}`);\n if (execution.aiActContext) {\n appendTextSection(lines, 'AI Action Context', execution.aiActContext);\n }\n\n execution.tasks.forEach((task, taskIndex) => {\n const title = typeStr(task);\n const detail = safeTaskParam(task);\n const time = resolveTaskTiming(task);\n\n lines.push(\n '',\n `## ${taskIndex + 1}. ${title}${detail ? ` - ${detail}` : ''}`,\n );\n lines.push(`- Task ID: ${task.taskId || 'N/A'}`);\n lines.push(`- Type: ${task.type || 'N/A'}`);\n lines.push(`- SubType: ${task.subType || 'N/A'}`);\n lines.push(`- Status: ${task.status || 'unknown'}`);\n lines.push(`- Start: ${formatTime(time.start)}`);\n lines.push(`- End: ${formatTime(time.end)}`);\n lines.push(\n `- Cost(ms): ${typeof time.cost === 'number' ? time.cost : 'N/A'}`,\n );\n lines.push(\n `- Screen size: ${formatSize(task.uiContext?.shotSize) || 'N/A'}`,\n );\n\n if (task.subType === 'Locate') {\n const locateCenter = extractLocateCenter(task);\n if (locateCenter) {\n lines.push(`- Locate center: (${locateCenter[0]}, ${locateCenter[1]})`);\n }\n }\n\n if (task.errorMessage) {\n lines.push(`- Error: ${task.errorMessage}`);\n }\n\n const usageRows = usageRowsForTask(task);\n if (usageRows.length) {\n lines.push('', '### Model Usage');\n lines.push(\n ...markdownTable(\n [\n 'Source',\n 'Intent',\n 'Model',\n 'Description',\n 'Prompt Tokens',\n 'Cached Input',\n 'Completion Tokens',\n 'Total Tokens',\n 'Model Call Time(ms)',\n 'Request ID',\n ],\n usageRows,\n ),\n );\n }\n\n appendJsonSection(lines, 'Param', task.param);\n appendJsonSection(lines, 'Output', task.output);\n appendJsonSection(lines, 'Log', task.log);\n appendTextSection(lines, 'Thought', task.thought);\n appendTextSection(\n lines,\n 'Reasoning Content',\n (task as ExecutionTaskWithExtraUsage).reasoning_content,\n );\n\n const screenshotsSection = screenshotsMarkdownSection(\n task,\n screenshotBaseDir,\n executionIndex,\n taskIndex,\n );\n if (screenshotsSection.lines.length) {\n lines.push(...screenshotsSection.lines);\n attachments.push(...screenshotsSection.attachments);\n }\n });\n\n return {\n markdown: lines.join('\\n'),\n attachments,\n };\n}\n\nexport function executionToMarkdown(\n execution: ExecutionDump | IExecutionDump,\n options?: ExecutionMarkdownOptions,\n): ExecutionMarkdownResult {\n return renderExecution(execution, 0, options);\n}\n\nexport function reportToMarkdown(\n report: ReportActionDump | IReportActionDump,\n options?: ReportMarkdownOptions,\n): ReportMarkdownResult {\n const reportDump = toReportDump(report);\n\n const executionResults = reportDump.executions.map((execution, index) => {\n const rendered = renderExecution(execution, index);\n return {\n markdown: rendered.markdown,\n attachments: rendered.attachments,\n };\n });\n\n const attachments = executionResults.flatMap((item) => item.attachments);\n const reportSummary = collectReportSummary(reportDump, options);\n const modelRows = reportDump.modelBriefs?.length\n ? modelBriefRows(reportDump.modelBriefs)\n : modelRowsFromUsage(reportDump);\n\n const modelInfoLines = [\n '\\n## Model Info',\n ...(modelRows.length\n ? markdownTable(['Intent', 'Model', 'Description'], modelRows)\n : ['- No model metadata recorded.']),\n ];\n\n const elapsedTimeDescription =\n reportSummary.timing.wallTimeSource === 'task-timestamps'\n ? 'Total span from the first recorded task start to the last recorded task end, including model calls, actions, waits, and gaps.'\n : reportSummary.timing.wallTimeSource === 'fallback'\n ? 'Total elapsed duration reported by the enclosing test runner because task timestamps were unavailable.'\n : 'The total elapsed span is unavailable because the report has no recorded task timestamps.';\n const timingSummaryLines = [\n '\\n## Timing Summary',\n ...markdownTable(\n ['Metric', 'Duration(ms)', 'Definition'],\n [\n [\n 'Elapsed Time',\n reportSummary.timing.wallTimeMs ?? 'N/A',\n elapsedTimeDescription,\n ],\n [\n 'Model Call Time',\n reportSummary.timing.modelCallTimeMs,\n 'Total duration of all recorded model calls.',\n ],\n ],\n ),\n ];\n\n const tokenSummaryLines = [\n '\\n## Token Usage Summary',\n ...(reportSummary.models.length\n ? markdownTable(\n [\n 'Model',\n 'Calls',\n 'Prompt Tokens',\n 'Cached Input',\n 'Completion Tokens',\n 'Total Tokens',\n 'Model Call Time(ms)',\n ],\n reportSummary.models.map((model) => [\n model.modelName,\n model.callCount,\n model.promptTokens,\n model.cachedInputTokens,\n model.completionTokens,\n model.totalTokens,\n model.modelCallTimeMs,\n ]),\n )\n : ['- No token usage recorded.']),\n ];\n\n const header = [\n `# ${reportDump.groupName}`,\n reportDump.groupDescription ? `\\n${reportDump.groupDescription}` : '',\n `\\n- SDK Version: ${reportDump.sdkVersion}`,\n reportDump.deviceType ? `- Device Type: ${reportDump.deviceType}` : '',\n `- Execution count: ${reportDump.executions.length}`,\n ...modelInfoLines,\n ...timingSummaryLines,\n ...tokenSummaryLines,\n ]\n .filter(Boolean)\n .join('\\n');\n\n return {\n markdown: `${header}\\n\\n${executionResults.map((item) => item.markdown).join('\\n\\n---\\n\\n')}`,\n attachments,\n };\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","screenshotDataUrlPattern","rawBase64BodyPattern","jsonContextMaxStringLength","toExecutionDump","execution","Error","Array","toReportDump","report","formatTime","ts","Number","Date","formatValue","value","String","escapeTableCell","markdownTable","headers","rows","row","modelBriefRows","modelBriefs","brief","modelRowsFromUsage","Map","addUsage","source","usage","hasUsage","intent","model","description","task","taskWithUsage","usageValue","undefined","usageTotalTokens","explicitTotal","usageRowsForTask","appendUsage","sanitizeJsonForMarkdown","seen","WeakSet","item","input","output","entry","appendJsonSection","lines","title","sanitized","JSON","appendTextSection","resolveTaskTiming","timing","start","end","cost","safeTaskParam","readable","paramStr","extractInsightParam","formatSize","size","extractLocateCenter","outputCenter","paramLocateCenter","paramCenter","tryExtractBase64","screenshot","trimmedScreenshot","dataUrlMatch","format","base64Body","s","restoredSourceRef","sourceRef","normalizeScreenshotRef","screenshotAttachment","screenshotBaseDir","executionIndex","taskIndex","options","markdownLabel","ScreenshotItem","ext","suggestedFileName","ref","imageRefFileExtension","base64","idSuffix","id","imageLabelSuffix","screenshotsMarkdownSection","attachments","screenshotIndex","imageResult","time","recorderIndex","descriptionText","renderExecution","executionRaw","typeStr","detail","locateCenter","usageRows","screenshotsSection","executionToMarkdown","reportToMarkdown","reportDump","executionResults","index","rendered","reportSummary","collectReportSummary","modelRows","modelInfoLines","elapsedTimeDescription","timingSummaryLines","tokenSummaryLines","header","Boolean"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"report-markdown.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/report-markdown.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { extractInsightParam, paramStr, typeStr } from '@/agent/ui-utils';\nimport { ScreenshotItem } from '@/screenshot-item';\nimport type {\n AIUsageInfo,\n ExecutionDump,\n ExecutionTask,\n IExecutionDump,\n IReportActionDump,\n ModelBrief,\n ReportActionDump,\n} from '@/types';\nimport type { ScreenshotRef } from './dump/screenshot-store';\nimport {\n imageRefFileExtension,\n normalizeScreenshotRef,\n} from './dump/screenshot-store';\nimport { collectReportSummary } from './report-stats';\n\nconst screenshotDataUrlPattern =\n /^data:image\\/(png|jpeg|jpg);base64,([\\s\\S]*)$/i;\nconst rawBase64BodyPattern = /^[a-zA-Z0-9+/=\\s]+$/;\nconst jsonContextMaxStringLength = 12_000;\n\ntype ExecutionTaskWithExtraUsage = ExecutionTask & {\n searchAreaUsage?: AIUsageInfo;\n reasoning_content?: string;\n};\n\nexport interface MarkdownAttachment {\n id: string;\n /**\n * File name for the exported copy. The markdown image link\n * always points at `${screenshotBaseDir}/${suggestedFileName}`, so consumers\n * write the screenshot under this name to keep links in sync. See #2392.\n */\n suggestedFileName: string;\n mimeType?: string;\n /**\n * Reference to the screenshot in the source report, used to locate the\n * original bytes when copying them to the exported name. Absent for in-memory\n * screenshots, which carry their data in `base64Data` instead.\n */\n sourceRef?: ScreenshotRef;\n executionIndex: number;\n taskIndex: number;\n /** Populated when screenshot data is available in memory (e.g. browser context). */\n base64Data?: string;\n}\n\nexport interface ExecutionMarkdownOptions {\n screenshotBaseDir?: string;\n /** Resolve the exported asset name without changing observation labels. */\n resolveScreenshotFileName?: (attachment: MarkdownAttachment) => string;\n}\n\nexport interface ReportMarkdownOptions\n extends Pick<ExecutionMarkdownOptions, 'resolveScreenshotFileName'> {\n /** Used only when the report has no recorded task timestamps. */\n wallTimeFallbackMs?: number;\n}\n\nexport interface ExecutionMarkdownResult {\n markdown: string;\n attachments: MarkdownAttachment[];\n}\n\nexport interface ReportMarkdownResult {\n markdown: string;\n attachments: MarkdownAttachment[];\n}\n\nfunction toExecutionDump(\n execution: ExecutionDump | IExecutionDump,\n): IExecutionDump {\n if (!execution || typeof execution !== 'object') {\n throw new Error('executionToMarkdown: execution is required');\n }\n\n if (!Array.isArray(execution.tasks)) {\n throw new Error('executionToMarkdown: execution.tasks must be an array');\n }\n\n if (!execution.name) {\n throw new Error('executionToMarkdown: execution.name is required');\n }\n\n return execution;\n}\n\nfunction toReportDump(\n report: ReportActionDump | IReportActionDump,\n): IReportActionDump {\n if (!report || typeof report !== 'object') {\n throw new Error('reportToMarkdown: report is required');\n }\n\n if (!Array.isArray(report.executions)) {\n throw new Error('reportToMarkdown: report.executions must be an array');\n }\n\n return report;\n}\n\nfunction formatTime(ts?: number): string {\n if (typeof ts !== 'number' || Number.isNaN(ts)) {\n return 'N/A';\n }\n return new Date(ts).toISOString();\n}\n\nfunction formatValue(value: unknown): string {\n if (value === undefined || value === null || value === '') {\n return 'N/A';\n }\n if (typeof value === 'number') {\n return Number.isFinite(value) ? String(value) : 'N/A';\n }\n return String(value);\n}\n\nfunction escapeTableCell(value: unknown): string {\n return formatValue(value).replace(/\\|/g, '\\\\|').replace(/\\n/g, '<br>');\n}\n\nfunction markdownTable(headers: string[], rows: unknown[][]): string[] {\n return [\n `| ${headers.map(escapeTableCell).join(' | ')} |`,\n `| ${headers.map(() => '---').join(' | ')} |`,\n ...rows.map((row) => `| ${row.map(escapeTableCell).join(' | ')} |`),\n ];\n}\n\nfunction modelBriefRows(modelBriefs: ModelBrief[]): unknown[][] {\n return modelBriefs.map((brief) => [\n brief.intent || 'default',\n brief.name || 'N/A',\n brief.modelDescription || 'N/A',\n ]);\n}\n\nfunction modelRowsFromUsage(report: IReportActionDump): unknown[][] {\n const rows = new Map<string, unknown[]>();\n const addUsage = (source: string, usage?: AIUsageInfo) => {\n if (!hasUsage(usage)) return;\n const intent = usage.intent || source;\n const model = usage.model_name || usage.response_model_name;\n const description = usage.model_description;\n const key = `${intent}\\0${model || ''}\\0${description || ''}`;\n if (rows.has(key)) {\n return;\n }\n rows.set(key, [intent, model || 'N/A', description || 'N/A']);\n };\n\n for (const execution of report.executions) {\n for (const task of execution.tasks) {\n const taskWithUsage = task as ExecutionTaskWithExtraUsage;\n addUsage('main', taskWithUsage.usage);\n addUsage('searchArea', taskWithUsage.searchAreaUsage);\n }\n }\n\n return Array.from(rows.values());\n}\n\nfunction usageValue(usage: AIUsageInfo | undefined, key: string): number {\n const value = usage?.[key];\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction hasUsage(usage: AIUsageInfo | undefined): usage is AIUsageInfo {\n if (!usage) return false;\n return [\n 'intent',\n 'model_name',\n 'model_description',\n 'prompt_tokens',\n 'cached_input',\n 'completion_tokens',\n 'total_tokens',\n 'time_cost',\n 'request_id',\n ].some((key) => usage[key] !== undefined && usage[key] !== null);\n}\n\nfunction usageTotalTokens(usage: AIUsageInfo): number {\n const explicitTotal = usageValue(usage, 'total_tokens');\n if (explicitTotal > 0) {\n return explicitTotal;\n }\n return (\n usageValue(usage, 'prompt_tokens') + usageValue(usage, 'completion_tokens')\n );\n}\n\nfunction usageRowsForTask(task: ExecutionTask): unknown[][] {\n const taskWithUsage = task as ExecutionTaskWithExtraUsage;\n const rows: unknown[][] = [];\n const appendUsage = (source: string, usage?: AIUsageInfo) => {\n if (!hasUsage(usage)) return;\n rows.push([\n source,\n usage.intent,\n usage.model_name || usage.response_model_name,\n usage.model_description,\n usageValue(usage, 'prompt_tokens'),\n usageValue(usage, 'cached_input'),\n usageValue(usage, 'completion_tokens'),\n usageTotalTokens(usage),\n usageValue(usage, 'time_cost'),\n usage.request_id,\n ]);\n };\n\n appendUsage('main', taskWithUsage.usage);\n appendUsage('searchArea', taskWithUsage.searchAreaUsage);\n return rows;\n}\n\nfunction sanitizeJsonForMarkdown(\n value: unknown,\n seen = new WeakSet<object>(),\n): unknown {\n if (typeof value === 'string') {\n if (\n screenshotDataUrlPattern.test(value) ||\n value.length > 1_000_000 ||\n /^[a-zA-Z0-9+/=\\s]{100000,}$/.test(value)\n ) {\n return `[omitted image/base64 string, length=${value.length}]`;\n }\n if (value.length > jsonContextMaxStringLength) {\n return `${value.slice(0, jsonContextMaxStringLength)}\\n[truncated, original length=${value.length}]`;\n }\n return value;\n }\n\n if (\n value === null ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n\n if (typeof value === 'function') {\n return '[omitted function]';\n }\n\n if (typeof value !== 'object' || value === undefined) {\n return undefined;\n }\n\n if (seen.has(value)) {\n return '[omitted circular reference]';\n }\n seen.add(value);\n\n if (Array.isArray(value)) {\n return value.map((item) => sanitizeJsonForMarkdown(item, seen));\n }\n\n const input = value as Record<string, unknown>;\n const output: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(input)) {\n if (entry === undefined || typeof entry === 'function') {\n continue;\n }\n if (\n typeof entry === 'string' &&\n /(^|_|-)(base64|screenshotBase64|imageBase64)$/i.test(key)\n ) {\n output[key] = `[omitted base64 string, length=${entry.length}]`;\n continue;\n }\n output[key] = sanitizeJsonForMarkdown(entry, seen);\n }\n seen.delete(value);\n return output;\n}\n\nfunction appendJsonSection(\n lines: string[],\n title: string,\n value: unknown,\n): void {\n if (value === undefined || value === null || value === '') {\n return;\n }\n const sanitized = sanitizeJsonForMarkdown(value);\n if (sanitized === undefined) {\n return;\n }\n\n lines.push('', `### ${title}`, '', '```json');\n lines.push(JSON.stringify(sanitized, null, 2));\n lines.push('```');\n}\n\nfunction appendTextSection(\n lines: string[],\n title: string,\n value: unknown,\n): void {\n if (typeof value !== 'string' || !value.trim()) {\n return;\n }\n lines.push('', `### ${title}`, '', '```text');\n lines.push(value.replace(/```/g, '` ` `'));\n lines.push('```');\n}\n\nfunction resolveTaskTiming(task: ExecutionTask): {\n start?: number;\n end?: number;\n cost?: number;\n} {\n const timing = task.timing;\n if (!timing) {\n return {};\n }\n\n const start = timing.start ?? timing.callAiStart ?? timing.callActionStart;\n const end =\n timing.end ??\n timing.callAiEnd ??\n timing.callActionEnd ??\n timing.captureAfterCallingSnapshotEnd;\n const cost =\n timing.cost ??\n (typeof start === 'number' && typeof end === 'number'\n ? end - start\n : undefined);\n\n return { start, end, cost };\n}\n\nfunction safeTaskParam(task: ExecutionTask): string {\n const readable = paramStr(task);\n if (readable) {\n return readable;\n }\n\n if (task.type === 'Insight') {\n return extractInsightParam((task as any).param).content;\n }\n\n return '';\n}\n\nfunction formatSize(\n size?: { width?: number; height?: number } | null,\n): string | undefined {\n if (\n !size ||\n typeof size.width !== 'number' ||\n typeof size.height !== 'number' ||\n Number.isNaN(size.width) ||\n Number.isNaN(size.height)\n ) {\n return undefined;\n }\n\n return `${size.width} x ${size.height}`;\n}\n\nfunction extractLocateCenter(\n task: ExecutionTask,\n): [number, number] | undefined {\n const outputCenter = (task.output as { element?: { center?: unknown } })\n ?.element?.center;\n if (\n Array.isArray(outputCenter) &&\n outputCenter.length >= 2 &&\n typeof outputCenter[0] === 'number' &&\n typeof outputCenter[1] === 'number'\n ) {\n return [outputCenter[0], outputCenter[1]];\n }\n\n const paramLocateCenter = (task.param as { locate?: { center?: unknown } })\n ?.locate?.center;\n if (\n Array.isArray(paramLocateCenter) &&\n paramLocateCenter.length >= 2 &&\n typeof paramLocateCenter[0] === 'number' &&\n typeof paramLocateCenter[1] === 'number'\n ) {\n return [paramLocateCenter[0], paramLocateCenter[1]];\n }\n\n const paramCenter = (task.param as { center?: unknown })?.center;\n if (\n Array.isArray(paramCenter) &&\n paramCenter.length >= 2 &&\n typeof paramCenter[0] === 'number' &&\n typeof paramCenter[1] === 'number'\n ) {\n return [paramCenter[0], paramCenter[1]];\n }\n\n return undefined;\n}\n\nfunction tryExtractBase64(screenshot: unknown): string | undefined {\n if (typeof screenshot === 'string') {\n const trimmedScreenshot = screenshot.trim();\n const dataUrlMatch = trimmedScreenshot.match(screenshotDataUrlPattern);\n if (dataUrlMatch) {\n const format = dataUrlMatch[1].toLowerCase() === 'jpg' ? 'jpeg' : 'png';\n const base64Body = dataUrlMatch[2].replace(/\\s/g, '');\n if (!base64Body) {\n return undefined;\n }\n return `data:image/${format};base64,${base64Body}`;\n }\n\n if (\n trimmedScreenshot.startsWith('data:') ||\n !rawBase64BodyPattern.test(trimmedScreenshot)\n ) {\n return undefined;\n }\n\n const base64Body = trimmedScreenshot.replace(/\\s/g, '');\n return base64Body ? `data:image/png;base64,${base64Body}` : undefined;\n }\n\n if (!screenshot || typeof screenshot !== 'object') return undefined;\n const s = screenshot as Record<string, unknown>;\n if (typeof s.base64 === 'string' && s.base64.length > 0) {\n return s.base64;\n }\n return undefined;\n}\n\nfunction restoredSourceRef(screenshot: unknown): ScreenshotRef | undefined {\n if (!screenshot || typeof screenshot !== 'object') {\n return undefined;\n }\n\n const sourceRef = (screenshot as Record<string, unknown>).sourceRef;\n return normalizeScreenshotRef(sourceRef) ?? undefined;\n}\n\nfunction screenshotAttachment(\n screenshot: unknown,\n screenshotBaseDir: string,\n executionIndex: number,\n taskIndex: number,\n options?: {\n fallbackIdSuffix?: string;\n label?: string;\n resolveScreenshotFileName?: ExecutionMarkdownOptions['resolveScreenshotFileName'];\n },\n): { markdown: string; attachment: MarkdownAttachment } {\n const markdownLabel = options?.label || `task-${taskIndex + 1}`;\n const result = (attachment: MarkdownAttachment) => {\n attachment.suggestedFileName =\n options?.resolveScreenshotFileName?.(attachment) ??\n attachment.suggestedFileName;\n return {\n markdown: `\\n`,\n attachment,\n };\n };\n\n if (ScreenshotItem.isScreenshotItem(screenshot)) {\n const ext = screenshot.extension;\n const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${screenshot.id}.${ext}`;\n return result({\n id: screenshot.id,\n suggestedFileName,\n mimeType: `image/${ext === 'jpeg' ? 'jpeg' : 'png'}`,\n executionIndex,\n taskIndex,\n base64Data: tryExtractBase64(screenshot),\n });\n }\n\n const ref = normalizeScreenshotRef(screenshot);\n if (ref) {\n const ext = imageRefFileExtension(ref);\n const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${ref.id}.${ext}`;\n return result({\n id: ref.id,\n suggestedFileName,\n sourceRef: ref,\n mimeType: ref.mimeType,\n executionIndex,\n taskIndex,\n base64Data: tryExtractBase64(screenshot),\n });\n }\n\n const sourceRef = restoredSourceRef(screenshot);\n if (sourceRef) {\n const ext = imageRefFileExtension(sourceRef);\n const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${sourceRef.id}.${ext}`;\n return result({\n id: sourceRef.id,\n suggestedFileName,\n sourceRef,\n mimeType: sourceRef.mimeType,\n executionIndex,\n taskIndex,\n base64Data: tryExtractBase64(screenshot),\n });\n }\n\n const base64 = tryExtractBase64(screenshot);\n if (base64) {\n const ext = base64.startsWith('data:image/jpeg') ? 'jpeg' : 'png';\n const idSuffix = options?.fallbackIdSuffix\n ? `-${options.fallbackIdSuffix}`\n : '';\n const id = `restored-${executionIndex + 1}-${taskIndex + 1}${idSuffix}`;\n const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${id}.${ext}`;\n return result({\n id,\n suggestedFileName,\n mimeType: `image/${ext}`,\n executionIndex,\n taskIndex,\n base64Data: base64,\n });\n }\n\n throw new Error(\n `executionToMarkdown: missing screenshot for execution #${executionIndex + 1} task #${taskIndex + 1}`,\n );\n}\n\nfunction imageLabelSuffix(value: string): string {\n return (\n value\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '') || 'screenshot'\n );\n}\n\nfunction screenshotsMarkdownSection(\n task: ExecutionTask,\n screenshotBaseDir: string,\n executionIndex: number,\n taskIndex: number,\n resolveScreenshotFileName?: ExecutionMarkdownOptions['resolveScreenshotFileName'],\n): { lines: string[]; attachments: MarkdownAttachment[] } {\n const lines: string[] = ['', '### Screenshots'];\n const attachments: MarkdownAttachment[] = [];\n let screenshotIndex = 0;\n\n if (task.uiContext?.screenshot) {\n const imageResult = screenshotAttachment(\n task.uiContext.screenshot,\n screenshotBaseDir,\n executionIndex,\n taskIndex,\n {\n fallbackIdSuffix: 'ui-context',\n label: `task-${taskIndex + 1}-ui-context`,\n resolveScreenshotFileName,\n },\n );\n const time = resolveTaskTiming(task);\n screenshotIndex += 1;\n lines.push(\n `- #${screenshotIndex} type=ui-context, ts=${formatTime(time.start)}, timing=ui-context, id=${imageResult.attachment.id}`,\n );\n lines.push(imageResult.markdown);\n attachments.push(imageResult.attachment);\n }\n\n task.recorder?.forEach((item, recorderIndex) => {\n if (!item.screenshot) {\n return;\n }\n\n const descriptionText = item.description\n ? `, description=${item.description}`\n : '';\n const timing = item.timing || 'N/A';\n screenshotIndex += 1;\n const imageResult = screenshotAttachment(\n item.screenshot,\n screenshotBaseDir,\n executionIndex,\n taskIndex,\n {\n fallbackIdSuffix: `recorder-${recorderIndex + 1}`,\n label: `task-${taskIndex + 1}-${imageLabelSuffix(timing)}`,\n resolveScreenshotFileName,\n },\n );\n\n lines.push(\n `- #${screenshotIndex} type=${item.type}, ts=${formatTime(item.ts)}, timing=${timing}${descriptionText}, id=${imageResult.attachment.id}`,\n );\n lines.push(imageResult.markdown);\n attachments.push(imageResult.attachment);\n });\n\n return screenshotIndex > 0\n ? { lines, attachments }\n : { lines: [], attachments };\n}\n\nfunction renderExecution(\n executionRaw: ExecutionDump | IExecutionDump,\n executionIndex: number,\n options?: ExecutionMarkdownOptions,\n): ExecutionMarkdownResult {\n const execution = toExecutionDump(executionRaw);\n const screenshotBaseDir = options?.screenshotBaseDir ?? './screenshots';\n\n const lines: string[] = [];\n const attachments: MarkdownAttachment[] = [];\n\n lines.push(`# ${execution.name}`);\n if (execution.description) {\n lines.push('', execution.description);\n }\n\n lines.push('', `- Execution start: ${formatTime(execution.logTime)}`);\n lines.push(`- Task count: ${execution.tasks.length}`);\n if (execution.aiActContext) {\n appendTextSection(lines, 'AI Action Context', execution.aiActContext);\n }\n\n execution.tasks.forEach((task, taskIndex) => {\n const title = typeStr(task);\n const detail = safeTaskParam(task);\n const time = resolveTaskTiming(task);\n\n lines.push(\n '',\n `## ${taskIndex + 1}. ${title}${detail ? ` - ${detail}` : ''}`,\n );\n lines.push(`- Task ID: ${task.taskId || 'N/A'}`);\n lines.push(`- Type: ${task.type || 'N/A'}`);\n lines.push(`- SubType: ${task.subType || 'N/A'}`);\n lines.push(`- Status: ${task.status || 'unknown'}`);\n lines.push(`- Start: ${formatTime(time.start)}`);\n lines.push(`- End: ${formatTime(time.end)}`);\n lines.push(\n `- Cost(ms): ${typeof time.cost === 'number' ? time.cost : 'N/A'}`,\n );\n lines.push(\n `- Screen size: ${formatSize(task.uiContext?.shotSize) || 'N/A'}`,\n );\n\n if (task.subType === 'Locate') {\n const locateCenter = extractLocateCenter(task);\n if (locateCenter) {\n lines.push(`- Locate center: (${locateCenter[0]}, ${locateCenter[1]})`);\n }\n }\n\n if (task.errorMessage) {\n lines.push(`- Error: ${task.errorMessage}`);\n }\n\n const usageRows = usageRowsForTask(task);\n if (usageRows.length) {\n lines.push('', '### Model Usage');\n lines.push(\n ...markdownTable(\n [\n 'Source',\n 'Intent',\n 'Model',\n 'Description',\n 'Prompt Tokens',\n 'Cached Input',\n 'Completion Tokens',\n 'Total Tokens',\n 'Model Call Time(ms)',\n 'Request ID',\n ],\n usageRows,\n ),\n );\n }\n\n appendJsonSection(lines, 'Param', task.param);\n appendJsonSection(lines, 'Output', task.output);\n appendJsonSection(lines, 'Log', task.log);\n appendTextSection(lines, 'Thought', task.thought);\n appendTextSection(\n lines,\n 'Reasoning Content',\n (task as ExecutionTaskWithExtraUsage).reasoning_content,\n );\n\n const screenshotsSection = screenshotsMarkdownSection(\n task,\n screenshotBaseDir,\n executionIndex,\n taskIndex,\n options?.resolveScreenshotFileName,\n );\n if (screenshotsSection.lines.length) {\n lines.push(...screenshotsSection.lines);\n attachments.push(...screenshotsSection.attachments);\n }\n });\n\n return {\n markdown: lines.join('\\n'),\n attachments,\n };\n}\n\nexport function executionToMarkdown(\n execution: ExecutionDump | IExecutionDump,\n options?: ExecutionMarkdownOptions,\n): ExecutionMarkdownResult {\n return renderExecution(execution, 0, options);\n}\n\nexport function reportToMarkdown(\n report: ReportActionDump | IReportActionDump,\n options?: ReportMarkdownOptions,\n): ReportMarkdownResult {\n const reportDump = toReportDump(report);\n\n const executionResults = reportDump.executions.map((execution, index) => {\n const rendered = renderExecution(execution, index, options);\n return {\n markdown: rendered.markdown,\n attachments: rendered.attachments,\n };\n });\n\n const attachments = executionResults.flatMap((item) => item.attachments);\n const reportSummary = collectReportSummary(reportDump, options);\n const modelRows = reportDump.modelBriefs?.length\n ? modelBriefRows(reportDump.modelBriefs)\n : modelRowsFromUsage(reportDump);\n\n const modelInfoLines = [\n '\\n## Model Info',\n ...(modelRows.length\n ? markdownTable(['Intent', 'Model', 'Description'], modelRows)\n : ['- No model metadata recorded.']),\n ];\n\n const elapsedTimeDescription =\n reportSummary.timing.wallTimeSource === 'task-timestamps'\n ? 'Total span from the first recorded task start to the last recorded task end, including model calls, actions, waits, and gaps.'\n : reportSummary.timing.wallTimeSource === 'fallback'\n ? 'Total elapsed duration reported by the enclosing test runner because task timestamps were unavailable.'\n : 'The total elapsed span is unavailable because the report has no recorded task timestamps.';\n const timingSummaryLines = [\n '\\n## Timing Summary',\n ...markdownTable(\n ['Metric', 'Duration(ms)', 'Definition'],\n [\n [\n 'Elapsed Time',\n reportSummary.timing.wallTimeMs ?? 'N/A',\n elapsedTimeDescription,\n ],\n [\n 'Model Call Time',\n reportSummary.timing.modelCallTimeMs,\n 'Total duration of all recorded model calls.',\n ],\n ],\n ),\n ];\n\n const tokenSummaryLines = [\n '\\n## Token Usage Summary',\n ...(reportSummary.models.length\n ? markdownTable(\n [\n 'Model',\n 'Calls',\n 'Prompt Tokens',\n 'Cached Input',\n 'Completion Tokens',\n 'Total Tokens',\n 'Model Call Time(ms)',\n ],\n reportSummary.models.map((model) => [\n model.modelName,\n model.callCount,\n model.promptTokens,\n model.cachedInputTokens,\n model.completionTokens,\n model.totalTokens,\n model.modelCallTimeMs,\n ]),\n )\n : ['- No token usage recorded.']),\n ];\n\n const header = [\n `# ${reportDump.groupName}`,\n reportDump.groupDescription ? `\\n${reportDump.groupDescription}` : '',\n `\\n- SDK Version: ${reportDump.sdkVersion}`,\n reportDump.deviceType ? `- Device Type: ${reportDump.deviceType}` : '',\n `- Execution count: ${reportDump.executions.length}`,\n ...modelInfoLines,\n ...timingSummaryLines,\n ...tokenSummaryLines,\n ]\n .filter(Boolean)\n .join('\\n');\n\n return {\n markdown: `${header}\\n\\n${executionResults.map((item) => item.markdown).join('\\n\\n---\\n\\n')}`,\n attachments,\n };\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","screenshotDataUrlPattern","rawBase64BodyPattern","jsonContextMaxStringLength","toExecutionDump","execution","Error","Array","toReportDump","report","formatTime","ts","Number","Date","formatValue","value","String","escapeTableCell","markdownTable","headers","rows","row","modelBriefRows","modelBriefs","brief","modelRowsFromUsage","Map","addUsage","source","usage","hasUsage","intent","model","description","task","taskWithUsage","usageValue","undefined","usageTotalTokens","explicitTotal","usageRowsForTask","appendUsage","sanitizeJsonForMarkdown","seen","WeakSet","item","input","output","entry","appendJsonSection","lines","title","sanitized","JSON","appendTextSection","resolveTaskTiming","timing","start","end","cost","safeTaskParam","readable","paramStr","extractInsightParam","formatSize","size","extractLocateCenter","outputCenter","paramLocateCenter","paramCenter","tryExtractBase64","screenshot","trimmedScreenshot","dataUrlMatch","format","base64Body","s","restoredSourceRef","sourceRef","normalizeScreenshotRef","screenshotAttachment","screenshotBaseDir","executionIndex","taskIndex","options","markdownLabel","result","attachment","ScreenshotItem","ext","suggestedFileName","ref","imageRefFileExtension","base64","idSuffix","id","imageLabelSuffix","screenshotsMarkdownSection","resolveScreenshotFileName","attachments","screenshotIndex","imageResult","time","recorderIndex","descriptionText","renderExecution","executionRaw","typeStr","detail","locateCenter","usageRows","screenshotsSection","executionToMarkdown","reportToMarkdown","reportDump","executionResults","index","rendered","reportSummary","collectReportSummary","modelRows","modelInfoLines","elapsedTimeDescription","timingSummaryLines","tokenSummaryLines","header","Boolean"],"mappings":"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"}
|
package/dist/lib/report.js
CHANGED
|
@@ -53,7 +53,7 @@ const report_file_name_js_namespaceObject = require("./agent/report-file-name.js
|
|
|
53
53
|
const html_utils_js_namespaceObject = require("./dump/html-utils.js");
|
|
54
54
|
const image_reference_js_namespaceObject = require("./dump/image-reference.js");
|
|
55
55
|
const report_artifact_reader_js_namespaceObject = require("./dump/report-artifact-reader.js");
|
|
56
|
-
const
|
|
56
|
+
const report_image_export_js_namespaceObject = require("./dump/report-image-export.js");
|
|
57
57
|
const execution_recorder_js_namespaceObject = require("./dump/execution-recorder.js");
|
|
58
58
|
const report_artifact_store_js_namespaceObject = require("./dump/report-artifact-store.js");
|
|
59
59
|
const report_session_js_namespaceObject = require("./dump/report-session.js");
|
|
@@ -686,7 +686,7 @@ function collectDedupedExecutions(htmlPath) {
|
|
|
686
686
|
executions
|
|
687
687
|
};
|
|
688
688
|
}
|
|
689
|
-
function externalizeImagesInExecution(execution,
|
|
689
|
+
function externalizeImagesInExecution(execution, images) {
|
|
690
690
|
const visit = (node)=>{
|
|
691
691
|
if (Array.isArray(node)) {
|
|
692
692
|
for (const item of node)visit(item);
|
|
@@ -695,20 +695,8 @@ function externalizeImagesInExecution(execution, opts) {
|
|
|
695
695
|
if ('object' != typeof node || null === node) return;
|
|
696
696
|
const ref = (0, image_reference_js_namespaceObject.normalizeStoredImageRef)(node);
|
|
697
697
|
if (ref) {
|
|
698
|
-
const
|
|
699
|
-
const fileName = `${ref.id}.${ext}`;
|
|
698
|
+
const fileName = images.write(ref);
|
|
700
699
|
const relativePath = `./screenshots/${fileName}`;
|
|
701
|
-
const absolutePath = external_node_path_namespaceObject.join(opts.screenshotsDir, fileName);
|
|
702
|
-
if (!opts.writtenFiles.has(fileName)) {
|
|
703
|
-
const resolved = (0, screenshot_store_js_namespaceObject.resolveImageSource)(ref, {
|
|
704
|
-
reportPath: opts.htmlPath
|
|
705
|
-
});
|
|
706
|
-
if ('data-uri' === resolved.type) {
|
|
707
|
-
const { rawBase64 } = (0, screenshot_store_js_namespaceObject.parseBase64ImageDataUrl)(resolved.dataUri);
|
|
708
|
-
(0, external_node_fs_namespaceObject.writeFileSync)(absolutePath, Buffer.from(rawBase64, 'base64'));
|
|
709
|
-
} else (0, external_node_fs_namespaceObject.copyFileSync)(resolved.filePath, absolutePath);
|
|
710
|
-
opts.writtenFiles.add(fileName);
|
|
711
|
-
}
|
|
712
700
|
ref.storage = 'file';
|
|
713
701
|
ref.path = relativePath;
|
|
714
702
|
return;
|
|
@@ -727,16 +715,12 @@ function splitReportHtmlByExecution(options) {
|
|
|
727
715
|
recursive: true
|
|
728
716
|
});
|
|
729
717
|
const executionJsonFiles = [];
|
|
730
|
-
const
|
|
718
|
+
const images = new report_image_export_js_namespaceObject.ReportImageExporter(htmlPath, screenshotsDir);
|
|
731
719
|
const { baseDump, executions } = collectDedupedExecutions(htmlPath);
|
|
732
720
|
let fileIndex = 0;
|
|
733
721
|
for (const execution of executions){
|
|
734
722
|
fileIndex += 1;
|
|
735
|
-
externalizeImagesInExecution(execution,
|
|
736
|
-
htmlPath,
|
|
737
|
-
screenshotsDir,
|
|
738
|
-
writtenFiles: writtenScreenshotFiles
|
|
739
|
-
});
|
|
723
|
+
externalizeImagesInExecution(execution, images);
|
|
740
724
|
const singleExecutionDump = new external_types_js_namespaceObject.ReportActionDump({
|
|
741
725
|
sdkVersion: baseDump.sdkVersion,
|
|
742
726
|
groupName: baseDump.groupName,
|
|
@@ -753,7 +737,7 @@ function splitReportHtmlByExecution(options) {
|
|
|
753
737
|
}
|
|
754
738
|
return {
|
|
755
739
|
executionJsonFiles,
|
|
756
|
-
screenshotFiles:
|
|
740
|
+
screenshotFiles: images.files
|
|
757
741
|
};
|
|
758
742
|
}
|
|
759
743
|
exports.ExecutionRecorder = __webpack_exports__.ExecutionRecorder;
|