@midscene/core 1.17.6 → 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.
Files changed (72) hide show
  1. package/dist/es/agent/agent-report-manager.mjs +1 -1
  2. package/dist/es/agent/agent-report-manager.mjs.map +1 -1
  3. package/dist/es/agent/utils.mjs +1 -1
  4. package/dist/es/ai-model/model-adapter/locate-prompt-order.mjs +80 -0
  5. package/dist/es/ai-model/model-adapter/locate-prompt-order.mjs.map +1 -0
  6. package/dist/es/ai-model/model-adapter/locate.mjs +2 -1
  7. package/dist/es/ai-model/model-adapter/locate.mjs.map +1 -1
  8. package/dist/es/ai-model/workflows/grounding/locate.mjs +1 -1
  9. package/dist/es/ai-model/workflows/grounding/locate.mjs.map +1 -1
  10. package/dist/es/ai-model/workflows/grounding/section-locate.mjs +1 -1
  11. package/dist/es/ai-model/workflows/grounding/section-locate.mjs.map +1 -1
  12. package/dist/es/ai-model/workflows/grounding/utils.mjs +8 -26
  13. package/dist/es/ai-model/workflows/grounding/utils.mjs.map +1 -1
  14. package/dist/es/dump/report-image-export.mjs +58 -0
  15. package/dist/es/dump/report-image-export.mjs.map +1 -0
  16. package/dist/es/dump/screenshot-store.mjs +5 -0
  17. package/dist/es/dump/screenshot-store.mjs.map +1 -1
  18. package/dist/es/report-cli.mjs +13 -29
  19. package/dist/es/report-cli.mjs.map +1 -1
  20. package/dist/es/report-generator.mjs +22 -8
  21. package/dist/es/report-generator.mjs.map +1 -1
  22. package/dist/es/report-html-template.mjs +1 -1
  23. package/dist/es/report-markdown.mjs +50 -53
  24. package/dist/es/report-markdown.mjs.map +1 -1
  25. package/dist/es/report.mjs +8 -24
  26. package/dist/es/report.mjs.map +1 -1
  27. package/dist/es/utils.mjs +1 -1
  28. package/dist/lib/agent/agent-report-manager.js +1 -1
  29. package/dist/lib/agent/agent-report-manager.js.map +1 -1
  30. package/dist/lib/agent/utils.js +1 -1
  31. package/dist/lib/ai-model/model-adapter/locate-prompt-order.js +117 -0
  32. package/dist/lib/ai-model/model-adapter/locate-prompt-order.js.map +1 -0
  33. package/dist/lib/ai-model/model-adapter/locate.js +2 -1
  34. package/dist/lib/ai-model/model-adapter/locate.js.map +1 -1
  35. package/dist/lib/ai-model/workflows/grounding/locate.js +1 -1
  36. package/dist/lib/ai-model/workflows/grounding/locate.js.map +1 -1
  37. package/dist/lib/ai-model/workflows/grounding/section-locate.js +1 -1
  38. package/dist/lib/ai-model/workflows/grounding/section-locate.js.map +1 -1
  39. package/dist/lib/ai-model/workflows/grounding/utils.js +8 -26
  40. package/dist/lib/ai-model/workflows/grounding/utils.js.map +1 -1
  41. package/dist/lib/dump/report-image-export.js +92 -0
  42. package/dist/lib/dump/report-image-export.js.map +1 -0
  43. package/dist/lib/dump/screenshot-store.js +5 -0
  44. package/dist/lib/dump/screenshot-store.js.map +1 -1
  45. package/dist/lib/report-cli.js +12 -28
  46. package/dist/lib/report-cli.js.map +1 -1
  47. package/dist/lib/report-generator.js +22 -8
  48. package/dist/lib/report-generator.js.map +1 -1
  49. package/dist/lib/report-html-template.js +1 -1
  50. package/dist/lib/report-markdown.js +50 -53
  51. package/dist/lib/report-markdown.js.map +1 -1
  52. package/dist/lib/report.js +6 -22
  53. package/dist/lib/report.js.map +1 -1
  54. package/dist/lib/utils.js +1 -1
  55. package/dist/types/ai-model/model-adapter/locate-prompt-order.d.ts +24 -0
  56. package/dist/types/ai-model/model-adapter/locate-prompt-order.d.ts.map +1 -0
  57. package/dist/types/ai-model/model-adapter/locate.d.ts.map +1 -1
  58. package/dist/types/ai-model/model-adapter/types.d.ts +9 -3
  59. package/dist/types/ai-model/model-adapter/types.d.ts.map +1 -1
  60. package/dist/types/ai-model/workflows/grounding/utils.d.ts +4 -9
  61. package/dist/types/ai-model/workflows/grounding/utils.d.ts.map +1 -1
  62. package/dist/types/dump/report-image-export.d.ts +12 -0
  63. package/dist/types/dump/report-image-export.d.ts.map +1 -0
  64. package/dist/types/dump/screenshot-store.d.ts +2 -0
  65. package/dist/types/dump/screenshot-store.d.ts.map +1 -1
  66. package/dist/types/report-cli.d.ts.map +1 -1
  67. package/dist/types/report-generator.d.ts +4 -2
  68. package/dist/types/report-generator.d.ts.map +1 -1
  69. package/dist/types/report-markdown.d.ts +4 -2
  70. package/dist/types/report-markdown.d.ts.map +1 -1
  71. package/dist/types/report.d.ts.map +1 -1
  72. package/package.json +2 -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![${markdownLabel}](${screenshotBaseDir}/${attachment.suggestedFileName})`,
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
- markdown: `\n![${markdownLabel}](${screenshotBaseDir}/${suggestedFileName})`,
248
- attachment: {
249
- id: screenshot.id,
250
- suggestedFileName,
251
- mimeType: `image/${'jpeg' === ext ? 'jpeg' : 'png'}`,
252
- executionIndex,
253
- taskIndex,
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
- markdown: `\n![${markdownLabel}](${screenshotBaseDir}/${suggestedFileName})`,
264
- attachment: {
265
- id: ref.id,
266
- suggestedFileName,
267
- sourceRef: ref,
268
- mimeType: ref.mimeType,
269
- executionIndex,
270
- taskIndex,
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
- markdown: `\n![${markdownLabel}](${screenshotBaseDir}/${suggestedFileName})`,
281
- attachment: {
282
- id: sourceRef.id,
283
- suggestedFileName,
284
- sourceRef,
285
- mimeType: sourceRef.mimeType,
286
- executionIndex,
287
- taskIndex,
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
- markdown: `\n![${markdownLabel}](${screenshotBaseDir}/${suggestedFileName})`,
300
- attachment: {
301
- id,
302
- suggestedFileName,
303
- mimeType: `image/${ext}`,
304
- executionIndex,
305
- taskIndex,
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![${markdownLabel}](${screenshotBaseDir}/${suggestedFileName})`,\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![${markdownLabel}](${screenshotBaseDir}/${suggestedFileName})`,\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![${markdownLabel}](${screenshotBaseDir}/${suggestedFileName})`,\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![${markdownLabel}](${screenshotBaseDir}/${suggestedFileName})`,\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![${markdownLabel}](${screenshotBaseDir}/${attachment.suggestedFileName})`,\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":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;ACYA,MAAMI,2BACJ;AACF,MAAMC,uBAAuB;AAC7B,MAAMC,6BAA6B;AAkDnC,SAASC,gBACPC,SAAyC;IAEzC,IAAI,CAACA,aAAa,AAAqB,YAArB,OAAOA,WACvB,MAAM,IAAIC,MAAM;IAGlB,IAAI,CAACC,MAAM,OAAO,CAACF,UAAU,KAAK,GAChC,MAAM,IAAIC,MAAM;IAGlB,IAAI,CAACD,UAAU,IAAI,EACjB,MAAM,IAAIC,MAAM;IAGlB,OAAOD;AACT;AAEA,SAASG,aACPC,MAA4C;IAE5C,IAAI,CAACA,UAAU,AAAkB,YAAlB,OAAOA,QACpB,MAAM,IAAIH,MAAM;IAGlB,IAAI,CAACC,MAAM,OAAO,CAACE,OAAO,UAAU,GAClC,MAAM,IAAIH,MAAM;IAGlB,OAAOG;AACT;AAEA,SAASC,WAAWC,EAAW;IAC7B,IAAI,AAAc,YAAd,OAAOA,MAAmBC,OAAO,KAAK,CAACD,KACzC,OAAO;IAET,OAAO,IAAIE,KAAKF,IAAI,WAAW;AACjC;AAEA,SAASG,YAAYC,KAAc;IACjC,IAAIA,QAAAA,SAAyCA,AAAU,OAAVA,OAC3C,OAAO;IAET,IAAI,AAAiB,YAAjB,OAAOA,OACT,OAAOH,OAAO,QAAQ,CAACG,SAASC,OAAOD,SAAS;IAElD,OAAOC,OAAOD;AAChB;AAEA,SAASE,gBAAgBF,KAAc;IACrC,OAAOD,YAAYC,OAAO,OAAO,CAAC,OAAO,OAAO,OAAO,CAAC,OAAO;AACjE;AAEA,SAASG,cAAcC,OAAiB,EAAEC,IAAiB;IACzD,OAAO;QACL,CAAC,EAAE,EAAED,QAAQ,GAAG,CAACF,iBAAiB,IAAI,CAAC,OAAO,EAAE,CAAC;QACjD,CAAC,EAAE,EAAEE,QAAQ,GAAG,CAAC,IAAM,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;WAC1CC,KAAK,GAAG,CAAC,CAACC,MAAQ,CAAC,EAAE,EAAEA,IAAI,GAAG,CAACJ,iBAAiB,IAAI,CAAC,OAAO,EAAE,CAAC;KACnE;AACH;AAEA,SAASK,eAAeC,WAAyB;IAC/C,OAAOA,YAAY,GAAG,CAAC,CAACC,QAAU;YAChCA,MAAM,MAAM,IAAI;YAChBA,MAAM,IAAI,IAAI;YACdA,MAAM,gBAAgB,IAAI;SAC3B;AACH;AAEA,SAASC,mBAAmBhB,MAAyB;IACnD,MAAMW,OAAO,IAAIM;IACjB,MAAMC,WAAW,CAACC,QAAgBC;QAChC,IAAI,CAACC,SAASD,QAAQ;QACtB,MAAME,SAASF,MAAM,MAAM,IAAID;QAC/B,MAAMI,QAAQH,MAAM,UAAU,IAAIA,MAAM,mBAAmB;QAC3D,MAAMI,cAAcJ,MAAM,iBAAiB;QAC3C,MAAMjC,MAAM,GAAGmC,OAAO,EAAE,EAAEC,SAAS,GAAG,EAAE,EAAEC,eAAe,IAAI;QAC7D,IAAIb,KAAK,GAAG,CAACxB,MACX;QAEFwB,KAAK,GAAG,CAACxB,KAAK;YAACmC;YAAQC,SAAS;YAAOC,eAAe;SAAM;IAC9D;IAEA,KAAK,MAAM5B,aAAaI,OAAO,UAAU,CACvC,KAAK,MAAMyB,QAAQ7B,UAAU,KAAK,CAAE;QAClC,MAAM8B,gBAAgBD;QACtBP,SAAS,QAAQQ,cAAc,KAAK;QACpCR,SAAS,cAAcQ,cAAc,eAAe;IACtD;IAGF,OAAO5B,MAAM,IAAI,CAACa,KAAK,MAAM;AAC/B;AAEA,SAASgB,WAAWP,KAA8B,EAAEjC,GAAW;IAC7D,MAAMmB,QAAQc,OAAO,CAACjC,IAAI;IAC1B,OAAO,AAAiB,YAAjB,OAAOmB,SAAsBH,OAAO,QAAQ,CAACG,SAASA,QAAQ;AACvE;AAEA,SAASe,SAASD,KAA8B;IAC9C,IAAI,CAACA,OAAO,OAAO;IACnB,OAAO;QACL;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;KACD,CAAC,IAAI,CAAC,CAACjC,MAAQiC,AAAeQ,WAAfR,KAAK,CAACjC,IAAI,IAAkBiC,AAAe,SAAfA,KAAK,CAACjC,IAAI;AACxD;AAEA,SAAS0C,iBAAiBT,KAAkB;IAC1C,MAAMU,gBAAgBH,WAAWP,OAAO;IACxC,IAAIU,gBAAgB,GAClB,OAAOA;IAET,OACEH,WAAWP,OAAO,mBAAmBO,WAAWP,OAAO;AAE3D;AAEA,SAASW,iBAAiBN,IAAmB;IAC3C,MAAMC,gBAAgBD;IACtB,MAAMd,OAAoB,EAAE;IAC5B,MAAMqB,cAAc,CAACb,QAAgBC;QACnC,IAAI,CAACC,SAASD,QAAQ;QACtBT,KAAK,IAAI,CAAC;YACRQ;YACAC,MAAM,MAAM;YACZA,MAAM,UAAU,IAAIA,MAAM,mBAAmB;YAC7CA,MAAM,iBAAiB;YACvBO,WAAWP,OAAO;YAClBO,WAAWP,OAAO;YAClBO,WAAWP,OAAO;YAClBS,iBAAiBT;YACjBO,WAAWP,OAAO;YAClBA,MAAM,UAAU;SACjB;IACH;IAEAY,YAAY,QAAQN,cAAc,KAAK;IACvCM,YAAY,cAAcN,cAAc,eAAe;IACvD,OAAOf;AACT;AAEA,SAASsB,wBACP3B,KAAc,EACd4B,OAAO,IAAIC,SAAiB;IAE5B,IAAI,AAAiB,YAAjB,OAAO7B,OAAoB;QAC7B,IACEd,yBAAyB,IAAI,CAACc,UAC9BA,MAAM,MAAM,GAAG,WACf,8BAA8B,IAAI,CAACA,QAEnC,OAAO,CAAC,qCAAqC,EAAEA,MAAM,MAAM,CAAC,CAAC,CAAC;QAEhE,IAAIA,MAAM,MAAM,GAAGZ,4BACjB,OAAO,GAAGY,MAAM,KAAK,CAAC,GAAGZ,4BAA4B,8BAA8B,EAAEY,MAAM,MAAM,CAAC,CAAC,CAAC;QAEtG,OAAOA;IACT;IAEA,IACEA,AAAU,SAAVA,SACA,AAAiB,YAAjB,OAAOA,SACP,AAAiB,aAAjB,OAAOA,OAEP,OAAOA;IAGT,IAAI,AAAiB,cAAjB,OAAOA,OACT,OAAO;IAGT,IAAI,AAAiB,YAAjB,OAAOA,SAAsBA,AAAUsB,WAAVtB,OAC/B;IAGF,IAAI4B,KAAK,GAAG,CAAC5B,QACX,OAAO;IAET4B,KAAK,GAAG,CAAC5B;IAET,IAAIR,MAAM,OAAO,CAACQ,QAChB,OAAOA,MAAM,GAAG,CAAC,CAAC8B,OAASH,wBAAwBG,MAAMF;IAG3D,MAAMG,QAAQ/B;IACd,MAAMgC,SAAkC,CAAC;IACzC,KAAK,MAAM,CAACnD,KAAKoD,MAAM,IAAInD,OAAO,OAAO,CAACiD,OACxC,IAAIE,AAAUX,WAAVW,SAAuB,AAAiB,cAAjB,OAAOA;QAGlC,IACE,AAAiB,YAAjB,OAAOA,SACP,iDAAiD,IAAI,CAACpD,MACtD;YACAmD,MAAM,CAACnD,IAAI,GAAG,CAAC,+BAA+B,EAAEoD,MAAM,MAAM,CAAC,CAAC,CAAC;YAC/D;QACF;QACAD,MAAM,CAACnD,IAAI,GAAG8C,wBAAwBM,OAAOL;;IAE/CA,KAAK,MAAM,CAAC5B;IACZ,OAAOgC;AACT;AAEA,SAASE,kBACPC,KAAe,EACfC,KAAa,EACbpC,KAAc;IAEd,IAAIA,QAAAA,SAAyCA,AAAU,OAAVA,OAC3C;IAEF,MAAMqC,YAAYV,wBAAwB3B;IAC1C,IAAIqC,AAAcf,WAAde,WACF;IAGFF,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAEC,OAAO,EAAE,IAAI;IACnCD,MAAM,IAAI,CAACG,KAAK,SAAS,CAACD,WAAW,MAAM;IAC3CF,MAAM,IAAI,CAAC;AACb;AAEA,SAASI,kBACPJ,KAAe,EACfC,KAAa,EACbpC,KAAc;IAEd,IAAI,AAAiB,YAAjB,OAAOA,SAAsB,CAACA,MAAM,IAAI,IAC1C;IAEFmC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAEC,OAAO,EAAE,IAAI;IACnCD,MAAM,IAAI,CAACnC,MAAM,OAAO,CAAC,QAAQ;IACjCmC,MAAM,IAAI,CAAC;AACb;AAEA,SAASK,kBAAkBrB,IAAmB;IAK5C,MAAMsB,SAAStB,KAAK,MAAM;IAC1B,IAAI,CAACsB,QACH,OAAO,CAAC;IAGV,MAAMC,QAAQD,OAAO,KAAK,IAAIA,OAAO,WAAW,IAAIA,OAAO,eAAe;IAC1E,MAAME,MACJF,OAAO,GAAG,IACVA,OAAO,SAAS,IAChBA,OAAO,aAAa,IACpBA,OAAO,8BAA8B;IACvC,MAAMG,OACJH,OAAO,IAAI,IACV,CAAiB,YAAjB,OAAOC,SAAsB,AAAe,YAAf,OAAOC,MACjCA,MAAMD,QACNpB,MAAQ;IAEd,OAAO;QAAEoB;QAAOC;QAAKC;IAAK;AAC5B;AAEA,SAASC,cAAc1B,IAAmB;IACxC,MAAM2B,WAAWC,AAAAA,IAAAA,4BAAAA,QAAAA,AAAAA,EAAS5B;IAC1B,IAAI2B,UACF,OAAOA;IAGT,IAAI3B,AAAc,cAAdA,KAAK,IAAI,EACX,OAAO6B,AAAAA,IAAAA,4BAAAA,mBAAAA,AAAAA,EAAqB7B,KAAa,KAAK,EAAE,OAAO;IAGzD,OAAO;AACT;AAEA,SAAS8B,WACPC,IAAiD;IAEjD,IACE,CAACA,QACD,AAAsB,YAAtB,OAAOA,KAAK,KAAK,IACjB,AAAuB,YAAvB,OAAOA,KAAK,MAAM,IAClBrD,OAAO,KAAK,CAACqD,KAAK,KAAK,KACvBrD,OAAO,KAAK,CAACqD,KAAK,MAAM,GAExB;IAGF,OAAO,GAAGA,KAAK,KAAK,CAAC,GAAG,EAAEA,KAAK,MAAM,EAAE;AACzC;AAEA,SAASC,oBACPhC,IAAmB;IAEnB,MAAMiC,eAAgBjC,KAAK,MAAM,EAC7B,SAAS;IACb,IACE3B,MAAM,OAAO,CAAC4D,iBACdA,aAAa,MAAM,IAAI,KACvB,AAA2B,YAA3B,OAAOA,YAAY,CAAC,EAAE,IACtB,AAA2B,YAA3B,OAAOA,YAAY,CAAC,EAAE,EAEtB,OAAO;QAACA,YAAY,CAAC,EAAE;QAAEA,YAAY,CAAC,EAAE;KAAC;IAG3C,MAAMC,oBAAqBlC,KAAK,KAAK,EACjC,QAAQ;IACZ,IACE3B,MAAM,OAAO,CAAC6D,sBACdA,kBAAkB,MAAM,IAAI,KAC5B,AAAgC,YAAhC,OAAOA,iBAAiB,CAAC,EAAE,IAC3B,AAAgC,YAAhC,OAAOA,iBAAiB,CAAC,EAAE,EAE3B,OAAO;QAACA,iBAAiB,CAAC,EAAE;QAAEA,iBAAiB,CAAC,EAAE;KAAC;IAGrD,MAAMC,cAAenC,KAAK,KAAK,EAA2B;IAC1D,IACE3B,MAAM,OAAO,CAAC8D,gBACdA,YAAY,MAAM,IAAI,KACtB,AAA0B,YAA1B,OAAOA,WAAW,CAAC,EAAE,IACrB,AAA0B,YAA1B,OAAOA,WAAW,CAAC,EAAE,EAErB,OAAO;QAACA,WAAW,CAAC,EAAE;QAAEA,WAAW,CAAC,EAAE;KAAC;AAI3C;AAEA,SAASC,iBAAiBC,UAAmB;IAC3C,IAAI,AAAsB,YAAtB,OAAOA,YAAyB;QAClC,MAAMC,oBAAoBD,WAAW,IAAI;QACzC,MAAME,eAAeD,kBAAkB,KAAK,CAACvE;QAC7C,IAAIwE,cAAc;YAChB,MAAMC,SAASD,AAAkC,UAAlCA,YAAY,CAAC,EAAE,CAAC,WAAW,KAAe,SAAS;YAClE,MAAME,aAAaF,YAAY,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO;YAClD,IAAI,CAACE,YACH;YAEF,OAAO,CAAC,WAAW,EAAED,OAAO,QAAQ,EAAEC,YAAY;QACpD;QAEA,IACEH,kBAAkB,UAAU,CAAC,YAC7B,CAACtE,qBAAqB,IAAI,CAACsE,oBAE3B;QAGF,MAAMG,aAAaH,kBAAkB,OAAO,CAAC,OAAO;QACpD,OAAOG,aAAa,CAAC,sBAAsB,EAAEA,YAAY,GAAGtC;IAC9D;IAEA,IAAI,CAACkC,cAAc,AAAsB,YAAtB,OAAOA,YAAyB;IACnD,MAAMK,IAAIL;IACV,IAAI,AAAoB,YAApB,OAAOK,EAAE,MAAM,IAAiBA,EAAE,MAAM,CAAC,MAAM,GAAG,GACpD,OAAOA,EAAE,MAAM;AAGnB;AAEA,SAASC,kBAAkBN,UAAmB;IAC5C,IAAI,CAACA,cAAc,AAAsB,YAAtB,OAAOA,YACxB;IAGF,MAAMO,YAAaP,WAAuC,SAAS;IACnE,OAAOQ,AAAAA,IAAAA,oCAAAA,sBAAAA,AAAAA,EAAuBD,cAAczC;AAC9C;AAEA,SAAS2C,qBACPT,UAAmB,EACnBU,iBAAyB,EACzBC,cAAsB,EACtBC,SAAiB,EACjBC,OAIC;IAED,MAAMC,gBAAgBD,SAAS,SAAS,CAAC,KAAK,EAAED,YAAY,GAAG;IAC/D,MAAMG,SAAS,CAACC;QACdA,WAAW,iBAAiB,GAC1BH,SAAS,4BAA4BG,eACrCA,WAAW,iBAAiB;QAC9B,OAAO;YACL,UAAU,CAAC,IAAI,EAAEF,cAAc,EAAE,EAAEJ,kBAAkB,CAAC,EAAEM,WAAW,iBAAiB,CAAC,CAAC,CAAC;YACvFA;QACF;IACF;IAEA,IAAIC,4CAAAA,cAAAA,CAAAA,gBAA+B,CAACjB,aAAa;QAC/C,MAAMkB,MAAMlB,WAAW,SAAS;QAChC,MAAMmB,oBAAoB,CAAC,UAAU,EAAER,iBAAiB,EAAE,MAAM,EAAEC,YAAY,EAAE,CAAC,EAAEZ,WAAW,EAAE,CAAC,CAAC,EAAEkB,KAAK;QACzG,OAAOH,OAAO;YACZ,IAAIf,WAAW,EAAE;YACjBmB;YACA,UAAU,CAAC,MAAM,EAAED,AAAQ,WAARA,MAAiB,SAAS,OAAO;YACpDP;YACAC;YACA,YAAYb,iBAAiBC;QAC/B;IACF;IAEA,MAAMoB,MAAMZ,AAAAA,IAAAA,oCAAAA,sBAAAA,AAAAA,EAAuBR;IACnC,IAAIoB,KAAK;QACP,MAAMF,MAAMG,AAAAA,IAAAA,oCAAAA,qBAAAA,AAAAA,EAAsBD;QAClC,MAAMD,oBAAoB,CAAC,UAAU,EAAER,iBAAiB,EAAE,MAAM,EAAEC,YAAY,EAAE,CAAC,EAAEQ,IAAI,EAAE,CAAC,CAAC,EAAEF,KAAK;QAClG,OAAOH,OAAO;YACZ,IAAIK,IAAI,EAAE;YACVD;YACA,WAAWC;YACX,UAAUA,IAAI,QAAQ;YACtBT;YACAC;YACA,YAAYb,iBAAiBC;QAC/B;IACF;IAEA,MAAMO,YAAYD,kBAAkBN;IACpC,IAAIO,WAAW;QACb,MAAMW,MAAMG,AAAAA,IAAAA,oCAAAA,qBAAAA,AAAAA,EAAsBd;QAClC,MAAMY,oBAAoB,CAAC,UAAU,EAAER,iBAAiB,EAAE,MAAM,EAAEC,YAAY,EAAE,CAAC,EAAEL,UAAU,EAAE,CAAC,CAAC,EAAEW,KAAK;QACxG,OAAOH,OAAO;YACZ,IAAIR,UAAU,EAAE;YAChBY;YACAZ;YACA,UAAUA,UAAU,QAAQ;YAC5BI;YACAC;YACA,YAAYb,iBAAiBC;QAC/B;IACF;IAEA,MAAMsB,SAASvB,iBAAiBC;IAChC,IAAIsB,QAAQ;QACV,MAAMJ,MAAMI,OAAO,UAAU,CAAC,qBAAqB,SAAS;QAC5D,MAAMC,WAAWV,SAAS,mBACtB,CAAC,CAAC,EAAEA,QAAQ,gBAAgB,EAAE,GAC9B;QACJ,MAAMW,KAAK,CAAC,SAAS,EAAEb,iBAAiB,EAAE,CAAC,EAAEC,YAAY,IAAIW,UAAU;QACvE,MAAMJ,oBAAoB,CAAC,UAAU,EAAER,iBAAiB,EAAE,MAAM,EAAEC,YAAY,EAAE,CAAC,EAAEY,GAAG,CAAC,EAAEN,KAAK;QAC9F,OAAOH,OAAO;YACZS;YACAL;YACA,UAAU,CAAC,MAAM,EAAED,KAAK;YACxBP;YACAC;YACA,YAAYU;QACd;IACF;IAEA,MAAM,IAAIvF,MACR,CAAC,uDAAuD,EAAE4E,iBAAiB,EAAE,OAAO,EAAEC,YAAY,GAAG;AAEzG;AAEA,SAASa,iBAAiBjF,KAAa;IACrC,OACEA,MACG,WAAW,GACX,OAAO,CAAC,kBAAkB,KAC1B,OAAO,CAAC,OAAO,KACf,OAAO,CAAC,UAAU,OAAO;AAEhC;AAEA,SAASkF,2BACP/D,IAAmB,EACnB+C,iBAAyB,EACzBC,cAAsB,EACtBC,SAAiB,EACjBe,yBAAiF;IAEjF,MAAMhD,QAAkB;QAAC;QAAI;KAAkB;IAC/C,MAAMiD,cAAoC,EAAE;IAC5C,IAAIC,kBAAkB;IAEtB,IAAIlE,KAAK,SAAS,EAAE,YAAY;QAC9B,MAAMmE,cAAcrB,qBAClB9C,KAAK,SAAS,CAAC,UAAU,EACzB+C,mBACAC,gBACAC,WACA;YACE,kBAAkB;YAClB,OAAO,CAAC,KAAK,EAAEA,YAAY,EAAE,WAAW,CAAC;YACzCe;QACF;QAEF,MAAMI,OAAO/C,kBAAkBrB;QAC/BkE,mBAAmB;QACnBlD,MAAM,IAAI,CACR,CAAC,GAAG,EAAEkD,gBAAgB,qBAAqB,EAAE1F,WAAW4F,KAAK,KAAK,EAAE,wBAAwB,EAAED,YAAY,UAAU,CAAC,EAAE,EAAE;QAE3HnD,MAAM,IAAI,CAACmD,YAAY,QAAQ;QAC/BF,YAAY,IAAI,CAACE,YAAY,UAAU;IACzC;IAEAnE,KAAK,QAAQ,EAAE,QAAQ,CAACW,MAAM0D;QAC5B,IAAI,CAAC1D,KAAK,UAAU,EAClB;QAGF,MAAM2D,kBAAkB3D,KAAK,WAAW,GACpC,CAAC,cAAc,EAAEA,KAAK,WAAW,EAAE,GACnC;QACJ,MAAMW,SAASX,KAAK,MAAM,IAAI;QAC9BuD,mBAAmB;QACnB,MAAMC,cAAcrB,qBAClBnC,KAAK,UAAU,EACfoC,mBACAC,gBACAC,WACA;YACE,kBAAkB,CAAC,SAAS,EAAEoB,gBAAgB,GAAG;YACjD,OAAO,CAAC,KAAK,EAAEpB,YAAY,EAAE,CAAC,EAAEa,iBAAiBxC,SAAS;YAC1D0C;QACF;QAGFhD,MAAM,IAAI,CACR,CAAC,GAAG,EAAEkD,gBAAgB,MAAM,EAAEvD,KAAK,IAAI,CAAC,KAAK,EAAEnC,WAAWmC,KAAK,EAAE,EAAE,SAAS,EAAEW,SAASgD,gBAAgB,KAAK,EAAEH,YAAY,UAAU,CAAC,EAAE,EAAE;QAE3InD,MAAM,IAAI,CAACmD,YAAY,QAAQ;QAC/BF,YAAY,IAAI,CAACE,YAAY,UAAU;IACzC;IAEA,OAAOD,kBAAkB,IACrB;QAAElD;QAAOiD;IAAY,IACrB;QAAE,OAAO,EAAE;QAAEA;IAAY;AAC/B;AAEA,SAASM,gBACPC,YAA4C,EAC5CxB,cAAsB,EACtBE,OAAkC;IAElC,MAAM/E,YAAYD,gBAAgBsG;IAClC,MAAMzB,oBAAoBG,SAAS,qBAAqB;IAExD,MAAMlC,QAAkB,EAAE;IAC1B,MAAMiD,cAAoC,EAAE;IAE5CjD,MAAM,IAAI,CAAC,CAAC,EAAE,EAAE7C,UAAU,IAAI,EAAE;IAChC,IAAIA,UAAU,WAAW,EACvB6C,MAAM,IAAI,CAAC,IAAI7C,UAAU,WAAW;IAGtC6C,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAExC,WAAWL,UAAU,OAAO,GAAG;IACpE6C,MAAM,IAAI,CAAC,CAAC,cAAc,EAAE7C,UAAU,KAAK,CAAC,MAAM,EAAE;IACpD,IAAIA,UAAU,YAAY,EACxBiD,kBAAkBJ,OAAO,qBAAqB7C,UAAU,YAAY;IAGtEA,UAAU,KAAK,CAAC,OAAO,CAAC,CAAC6B,MAAMiD;QAC7B,MAAMhC,QAAQwD,AAAAA,IAAAA,4BAAAA,OAAAA,AAAAA,EAAQzE;QACtB,MAAM0E,SAAShD,cAAc1B;QAC7B,MAAMoE,OAAO/C,kBAAkBrB;QAE/BgB,MAAM,IAAI,CACR,IACA,CAAC,GAAG,EAAEiC,YAAY,EAAE,EAAE,EAAEhC,QAAQyD,SAAS,CAAC,GAAG,EAAEA,QAAQ,GAAG,IAAI;QAEhE1D,MAAM,IAAI,CAAC,CAAC,WAAW,EAAEhB,KAAK,MAAM,IAAI,OAAO;QAC/CgB,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAEhB,KAAK,IAAI,IAAI,OAAO;QAC1CgB,MAAM,IAAI,CAAC,CAAC,WAAW,EAAEhB,KAAK,OAAO,IAAI,OAAO;QAChDgB,MAAM,IAAI,CAAC,CAAC,UAAU,EAAEhB,KAAK,MAAM,IAAI,WAAW;QAClDgB,MAAM,IAAI,CAAC,CAAC,SAAS,EAAExC,WAAW4F,KAAK,KAAK,GAAG;QAC/CpD,MAAM,IAAI,CAAC,CAAC,OAAO,EAAExC,WAAW4F,KAAK,GAAG,GAAG;QAC3CpD,MAAM,IAAI,CACR,CAAC,YAAY,EAAE,AAAqB,YAArB,OAAOoD,KAAK,IAAI,GAAgBA,KAAK,IAAI,GAAG,OAAO;QAEpEpD,MAAM,IAAI,CACR,CAAC,eAAe,EAAEc,WAAW9B,KAAK,SAAS,EAAE,aAAa,OAAO;QAGnE,IAAIA,AAAiB,aAAjBA,KAAK,OAAO,EAAe;YAC7B,MAAM2E,eAAe3C,oBAAoBhC;YACzC,IAAI2E,cACF3D,MAAM,IAAI,CAAC,CAAC,kBAAkB,EAAE2D,YAAY,CAAC,EAAE,CAAC,EAAE,EAAEA,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;QAE1E;QAEA,IAAI3E,KAAK,YAAY,EACnBgB,MAAM,IAAI,CAAC,CAAC,SAAS,EAAEhB,KAAK,YAAY,EAAE;QAG5C,MAAM4E,YAAYtE,iBAAiBN;QACnC,IAAI4E,UAAU,MAAM,EAAE;YACpB5D,MAAM,IAAI,CAAC,IAAI;YACfA,MAAM,IAAI,IACLhC,cACD;gBACE;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;aACD,EACD4F;QAGN;QAEA7D,kBAAkBC,OAAO,SAAShB,KAAK,KAAK;QAC5Ce,kBAAkBC,OAAO,UAAUhB,KAAK,MAAM;QAC9Ce,kBAAkBC,OAAO,OAAOhB,KAAK,GAAG;QACxCoB,kBAAkBJ,OAAO,WAAWhB,KAAK,OAAO;QAChDoB,kBACEJ,OACA,qBACChB,KAAqC,iBAAiB;QAGzD,MAAM6E,qBAAqBd,2BACzB/D,MACA+C,mBACAC,gBACAC,WACAC,SAAS;QAEX,IAAI2B,mBAAmB,KAAK,CAAC,MAAM,EAAE;YACnC7D,MAAM,IAAI,IAAI6D,mBAAmB,KAAK;YACtCZ,YAAY,IAAI,IAAIY,mBAAmB,WAAW;QACpD;IACF;IAEA,OAAO;QACL,UAAU7D,MAAM,IAAI,CAAC;QACrBiD;IACF;AACF;AAEO,SAASa,oBACd3G,SAAyC,EACzC+E,OAAkC;IAElC,OAAOqB,gBAAgBpG,WAAW,GAAG+E;AACvC;AAEO,SAAS6B,iBACdxG,MAA4C,EAC5C2E,OAA+B;IAE/B,MAAM8B,aAAa1G,aAAaC;IAEhC,MAAM0G,mBAAmBD,WAAW,UAAU,CAAC,GAAG,CAAC,CAAC7G,WAAW+G;QAC7D,MAAMC,WAAWZ,gBAAgBpG,WAAW+G,OAAOhC;QACnD,OAAO;YACL,UAAUiC,SAAS,QAAQ;YAC3B,aAAaA,SAAS,WAAW;QACnC;IACF;IAEA,MAAMlB,cAAcgB,iBAAiB,OAAO,CAAC,CAACtE,OAASA,KAAK,WAAW;IACvE,MAAMyE,gBAAgBC,AAAAA,IAAAA,yCAAAA,oBAAAA,AAAAA,EAAqBL,YAAY9B;IACvD,MAAMoC,YAAYN,WAAW,WAAW,EAAE,SACtC5F,eAAe4F,WAAW,WAAW,IACrCzF,mBAAmByF;IAEvB,MAAMO,iBAAiB;QACrB;WACID,UAAU,MAAM,GAChBtG,cAAc;YAAC;YAAU;YAAS;SAAc,EAAEsG,aAClD;YAAC;SAAgC;KACtC;IAED,MAAME,yBACJJ,AAAwC,sBAAxCA,cAAc,MAAM,CAAC,cAAc,GAC/B,kIACAA,AAAwC,eAAxCA,cAAc,MAAM,CAAC,cAAc,GACjC,2GACA;IACR,MAAMK,qBAAqB;QACzB;WACGzG,cACD;YAAC;YAAU;YAAgB;SAAa,EACxC;YACE;gBACE;gBACAoG,cAAc,MAAM,CAAC,UAAU,IAAI;gBACnCI;aACD;YACD;gBACE;gBACAJ,cAAc,MAAM,CAAC,eAAe;gBACpC;aACD;SACF;KAEJ;IAED,MAAMM,oBAAoB;QACxB;WACIN,cAAc,MAAM,CAAC,MAAM,GAC3BpG,cACE;YACE;YACA;YACA;YACA;YACA;YACA;YACA;SACD,EACDoG,cAAc,MAAM,CAAC,GAAG,CAAC,CAACtF,QAAU;gBAClCA,MAAM,SAAS;gBACfA,MAAM,SAAS;gBACfA,MAAM,YAAY;gBAClBA,MAAM,iBAAiB;gBACvBA,MAAM,gBAAgB;gBACtBA,MAAM,WAAW;gBACjBA,MAAM,eAAe;aACtB,KAEH;YAAC;SAA6B;KACnC;IAED,MAAM6F,SAAS;QACb,CAAC,EAAE,EAAEX,WAAW,SAAS,EAAE;QAC3BA,WAAW,gBAAgB,GAAG,CAAC,EAAE,EAAEA,WAAW,gBAAgB,EAAE,GAAG;QACnE,CAAC,iBAAiB,EAAEA,WAAW,UAAU,EAAE;QAC3CA,WAAW,UAAU,GAAG,CAAC,eAAe,EAAEA,WAAW,UAAU,EAAE,GAAG;QACpE,CAAC,mBAAmB,EAAEA,WAAW,UAAU,CAAC,MAAM,EAAE;WACjDO;WACAE;WACAC;KACJ,CACE,MAAM,CAACE,SACP,IAAI,CAAC;IAER,OAAO;QACL,UAAU,GAAGD,OAAO,IAAI,EAAEV,iBAAiB,GAAG,CAAC,CAACtE,OAASA,KAAK,QAAQ,EAAE,IAAI,CAAC,gBAAgB;QAC7FsD;IACF;AACF"}
@@ -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 screenshot_store_js_namespaceObject = require("./dump/screenshot-store.js");
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, opts) {
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 ext = (0, image_reference_js_namespaceObject.imageRefFileExtension)(ref);
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 writtenScreenshotFiles = new Set();
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: Array.from(writtenScreenshotFiles).sort().map((fileName)=>external_node_path_namespaceObject.join(screenshotsDir, fileName))
740
+ screenshotFiles: images.files
757
741
  };
758
742
  }
759
743
  exports.ExecutionRecorder = __webpack_exports__.ExecutionRecorder;