{"version":3,"file":"report-markdown.mjs","sources":["../../src/report-markdown.ts"],"sourcesContent":["import { basename } from 'node:path';\nimport { extractInsightParam, paramStr, typeStr } from '@/agent/ui-utils';\nimport { ScreenshotItem } from '@/screenshot-item';\nimport type {\n  ExecutionDump,\n  ExecutionRecorderItem,\n  ExecutionTask,\n  IExecutionDump,\n  IReportActionDump,\n  ReportActionDump,\n} from '@/types';\nimport type { ScreenshotRef } from './dump/screenshot-store';\nimport { normalizeScreenshotRef } from './dump/screenshot-store';\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 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 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 (!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 screenshotAttachment(\n  screenshot: unknown,\n  screenshotBaseDir: string,\n  executionIndex: number,\n  taskIndex: number,\n): { markdown: string; attachment: MarkdownAttachment } {\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![task-${taskIndex + 1}](${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 = ref.mimeType === 'image/jpeg' ? 'jpeg' : 'png';\n    const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${ref.id}.${ext}`;\n    return {\n      markdown: `\\n![task-${taskIndex + 1}](${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 base64 = tryExtractBase64(screenshot);\n  if (base64) {\n    const ext = base64.startsWith('data:image/jpeg') ? 'jpeg' : 'png';\n    const id = `restored-${executionIndex + 1}-${taskIndex + 1}`;\n    const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${id}.${ext}`;\n    return {\n      markdown: `\\n![task-${taskIndex + 1}](${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 recorderMarkdownSection(\n  recorder: ExecutionRecorderItem[] | undefined,\n  screenshotBaseDir: string,\n  executionIndex: number,\n  taskIndex: number,\n): { lines: string[]; attachments: MarkdownAttachment[] } {\n  if (!recorder?.length) {\n    return { lines: [], attachments: [] };\n  }\n\n  const lines: string[] = ['', '### Recorder'];\n  const attachments: MarkdownAttachment[] = [];\n\n  recorder.forEach((item, recorderIndex) => {\n    const descriptionText = item.description\n      ? `, description=${item.description}`\n      : '';\n    lines.push(\n      `- #${recorderIndex + 1} type=${item.type}, ts=${formatTime(item.ts)}, timing=${item.timing || 'N/A'}${descriptionText}`,\n    );\n\n    if (!item.screenshot) {\n      return;\n    }\n\n    const imageResult = screenshotAttachment(\n      item.screenshot,\n      screenshotBaseDir,\n      executionIndex,\n      taskIndex,\n    );\n\n    lines.push(imageResult.markdown);\n    attachments.push(imageResult.attachment);\n  });\n\n  return { 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\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(`- 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    if (task.uiContext?.screenshot) {\n      const imageResult = screenshotAttachment(\n        task.uiContext.screenshot,\n        screenshotBaseDir,\n        executionIndex,\n        taskIndex,\n      );\n\n      lines.push(imageResult.markdown);\n      attachments.push(imageResult.attachment);\n    }\n\n    const recorderSection = recorderMarkdownSection(\n      task.recorder,\n      screenshotBaseDir,\n      executionIndex,\n      taskIndex,\n    );\n    if (recorderSection.lines.length) {\n      lines.push(...recorderSection.lines);\n      attachments.push(...recorderSection.attachments);\n    }\n  });\n\n  return {\n    markdown: lines.join('\\n'),\n    attachments,\n  };\n}\n\nfunction reportFileName(\n  execution: IExecutionDump,\n  executionIndex: number,\n): string {\n  const safeName =\n    execution.name\n      .trim()\n      .replace(/\\s+/g, '-')\n      .replace(/[^a-zA-Z0-9-_]/g, '') || `execution-${executionIndex + 1}`;\n  return `${executionIndex + 1}-${basename(safeName)}.md`;\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): ReportMarkdownResult {\n  const reportDump = toReportDump(report);\n\n  const executionResults = reportDump.executions.map((execution, index) => {\n    const rendered = renderExecution(execution, index);\n    return {\n      executionIndex: index,\n      executionName: execution.name,\n      markdown: rendered.markdown,\n      attachments: rendered.attachments,\n      suggestedFileName: reportFileName(execution, index),\n    };\n  });\n\n  const attachments = executionResults.flatMap((item) => item.attachments);\n\n  const header = [\n    `# ${reportDump.groupName}`,\n    reportDump.groupDescription ? `\\n${reportDump.groupDescription}` : '',\n    `\\n- SDK Version: ${reportDump.sdkVersion}`,\n    `- Execution count: ${reportDump.executions.length}`,\n    '\\n## Suggested execution markdown files',\n    ...executionResults.map(\n      (item) => `- ${item.suggestedFileName} (${item.executionName})`,\n    ),\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":["toExecutionDump","execution","Error","Array","toReportDump","report","formatTime","ts","Number","Date","resolveTaskTiming","task","timing","start","end","cost","undefined","safeTaskParam","readable","paramStr","extractInsightParam","formatSize","size","extractLocateCenter","outputCenter","paramLocateCenter","paramCenter","tryExtractBase64","screenshot","s","screenshotAttachment","screenshotBaseDir","executionIndex","taskIndex","ScreenshotItem","ext","suggestedFileName","ref","normalizeScreenshotRef","base64","id","recorderMarkdownSection","recorder","lines","attachments","item","recorderIndex","descriptionText","imageResult","renderExecution","executionRaw","options","title","typeStr","detail","time","locateCenter","recorderSection","reportFileName","safeName","basename","executionToMarkdown","reportToMarkdown","reportDump","executionResults","index","rendered","header","Boolean"],"mappings":"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"}