{"version":3,"file":"report-markdown.mjs","sources":["../../src/report-markdown.ts"],"sourcesContent":["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 (screenshot instanceof ScreenshotItem) {\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":["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","key","task","taskWithUsage","usageValue","undefined","usageTotalTokens","explicitTotal","usageRowsForTask","appendUsage","sanitizeJsonForMarkdown","seen","WeakSet","item","input","output","entry","Object","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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"}