{"version":3,"file":"dump/report-action-dump.mjs","sources":["../../../src/dump/report-action-dump.ts"],"sourcesContent":["import {\n  existsSync,\n  mkdirSync,\n  readFileSync,\n  rmSync,\n  writeFileSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport { ScreenshotItem } from '../screenshot-item';\nimport type {\n  ExecutionTask,\n  IExecutionDump,\n  IReportActionDump,\n} from '../types';\nimport { restoreImageReferences } from './screenshot-restoration';\nimport {\n  type ImageUrlRef,\n  ReportImageStore,\n  isBase64ImageDataUrl,\n} from './screenshot-store';\n\n/** A multimodal prompt image descriptor retained by an execution dump. */\ninterface ReportReferenceImageDescriptor {\n  name: string;\n  url: string;\n}\n\nfunction isReferenceImageDescriptor(\n  value: unknown,\n): value is ReportReferenceImageDescriptor {\n  if (typeof value !== 'object' || value === null) return false;\n  const record = value as Record<string, unknown>;\n  return typeof record.name === 'string' && typeof record.url === 'string';\n}\n\nfunction getPageOrBrowserObjectName(value: unknown): 'Page' | 'Browser' | null {\n  if (typeof value !== 'object' || value === null) return null;\n  const constructorName = value.constructor?.name;\n  return constructorName === 'Page' || constructorName === 'Browser'\n    ? constructorName\n    : null;\n}\n\nfunction isCustomSerializableObject(\n  value: unknown,\n): value is { toSerializable(): unknown } {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    typeof (value as { toSerializable?: unknown }).toSerializable === 'function'\n  );\n}\n\nfunction isPlainRecord(value: object): value is Record<string, unknown> {\n  const prototype = Object.getPrototypeOf(value);\n  return prototype === Object.prototype || prototype === null;\n}\n\n/**\n * Replacer function for JSON serialization that handles Page, Browser objects and ScreenshotItem\n */\nfunction replacerForDumpSerialization(key: string, value: any): any {\n  // screenshotSequence is a transient model input (multi-frame capture). Its\n  // frames are not persisted by collectScreenshots, so serializing them would\n  // emit dangling screenshot refs. The representative `screenshot` is kept.\n  if (key === 'screenshotSequence') {\n    return undefined;\n  }\n  const opaqueObjectName = getPageOrBrowserObjectName(value);\n  if (opaqueObjectName) {\n    return `[${opaqueObjectName} object]`;\n  }\n  if (isCustomSerializableObject(value)) {\n    return value.toSerializable();\n  }\n  return value;\n}\n\nfunction stringifyDump(data: unknown, indents?: number): string {\n  return JSON.stringify(data, replacerForDumpSerialization, indents);\n}\n\n/**\n * Clone serializable plain data while replacing image descriptors only when\n * they occur inside an `images` array. Cloning per occurrence deliberately\n * avoids object-identity coupling when callers reuse the same descriptor in\n * another, unrelated field.\n */\nfunction replaceReferenceImageUrls(\n  value: unknown,\n  referenceImageRefsByUrl: ReadonlyMap<string, ImageUrlRef>,\n  ancestors: WeakSet<object> = new WeakSet(),\n): unknown {\n  if (typeof value !== 'object' || value === null) return value;\n  if (\n    getPageOrBrowserObjectName(value) ||\n    isCustomSerializableObject(value) ||\n    (!Array.isArray(value) && !isPlainRecord(value))\n  ) {\n    return value;\n  }\n  if (ancestors.has(value)) return value;\n\n  ancestors.add(value);\n  try {\n    if (Array.isArray(value)) {\n      return value.map((item) =>\n        replaceReferenceImageUrls(item, referenceImageRefsByUrl, ancestors),\n      );\n    }\n\n    const result: Record<string, unknown> = {};\n    for (const [key, nestedValue] of Object.entries(value)) {\n      if (key === 'images' && Array.isArray(nestedValue)) {\n        result[key] = nestedValue.map((image) => {\n          const transformedImage = replaceReferenceImageUrls(\n            image,\n            referenceImageRefsByUrl,\n            ancestors,\n          );\n          if (!isReferenceImageDescriptor(image)) return transformedImage;\n\n          const referenceImageRef = referenceImageRefsByUrl.get(image.url);\n          if (\n            !referenceImageRef ||\n            typeof transformedImage !== 'object' ||\n            transformedImage === null ||\n            !isPlainRecord(transformedImage)\n          ) {\n            return transformedImage;\n          }\n          return { ...transformedImage, url: referenceImageRef };\n        });\n        continue;\n      }\n      result[key] = replaceReferenceImageUrls(\n        nestedValue,\n        referenceImageRefsByUrl,\n        ancestors,\n      );\n    }\n    return result;\n  } finally {\n    ancestors.delete(value);\n  }\n}\n\n/**\n * Reviver function for JSON deserialization that keeps screenshot references\n * as plain objects. Resolution is handled lazily by restoreImageReferences.\n *\n * @param key - JSON key being processed\n * @param value - JSON value being processed\n * @returns Restored value\n */\nfunction reviverForDumpDeserialization(key: string, value: any): any {\n  // Only process screenshot fields\n  if (key !== 'screenshot' || typeof value !== 'object' || value === null) {\n    return value;\n  }\n\n  if (ScreenshotItem.isSerialized(value)) {\n    return value;\n  }\n\n  return value;\n}\n\n/**\n * ExecutionDump class for serializing and deserializing execution dumps\n */\nexport class ExecutionDump implements IExecutionDump {\n  id?: string;\n  logTime: number;\n  name: string;\n  description?: string;\n  tasks: ExecutionTask[];\n  aiActContext?: string;\n  private readonly referenceImageUrls: readonly string[];\n\n  constructor(\n    data: IExecutionDump,\n    options?: { referenceImageUrls?: readonly string[] },\n  ) {\n    this.id = data.id;\n    this.logTime = data.logTime;\n    this.name = data.name;\n    this.description = data.description;\n    this.tasks = data.tasks;\n    this.aiActContext = data.aiActContext;\n    this.referenceImageUrls = Array.from(\n      new Set((options?.referenceImageUrls ?? []).filter(isBase64ImageDataUrl)),\n    );\n  }\n\n  /**\n   * Serialize the ExecutionDump to a JSON string\n   */\n  serialize(indents?: number): string {\n    return stringifyDump(this.toJSON(), indents);\n  }\n\n  /**\n   * Convert to a plain object for JSON serialization\n   */\n  toJSON(): IExecutionDump {\n    return {\n      id: this.id,\n      logTime: this.logTime,\n      name: this.name,\n      description: this.description,\n      tasks: this.tasks.map((task) => ({\n        ...task,\n        recorder: task.recorder || [],\n      })),\n      aiActContext: this.aiActContext,\n    };\n  }\n\n  /**\n   * Create an ExecutionDump instance from a serialized JSON string\n   */\n  static fromSerializedString(serialized: string): ExecutionDump {\n    const parsed = JSON.parse(\n      serialized,\n      reviverForDumpDeserialization,\n    ) as IExecutionDump;\n    return new ExecutionDump(parsed);\n  }\n\n  /**\n   * Create an ExecutionDump instance from a plain object\n   */\n  static fromJSON(data: IExecutionDump): ExecutionDump {\n    return new ExecutionDump(data);\n  }\n\n  /**\n   * Collect all ScreenshotItem instances from tasks.\n   * Scans through uiContext and recorder items to find screenshots.\n   *\n   * @returns Array of ScreenshotItem instances\n   */\n  collectScreenshots(): ScreenshotItem[] {\n    const screenshots: ScreenshotItem[] = [];\n\n    for (const task of this.tasks) {\n      // Collect uiContext.screenshot if present\n      if (task.uiContext?.screenshot instanceof ScreenshotItem) {\n        screenshots.push(task.uiContext.screenshot);\n      }\n\n      // Collect recorder screenshots\n      if (task.recorder) {\n        for (const record of task.recorder) {\n          if (record.screenshot instanceof ScreenshotItem) {\n            screenshots.push(record.screenshot);\n          }\n        }\n      }\n    }\n\n    return screenshots;\n  }\n\n  /**\n   * Return persistable base64 reference-image URLs explicitly registered while\n   * building this execution. This sidecar is excluded from serialized dumps.\n   */\n  getReferenceImageUrls(): readonly string[] {\n    return [...this.referenceImageUrls];\n  }\n}\n\n/**\n * ReportActionDump class for serializing and deserializing report action dumps\n */\nexport class ReportActionDump implements IReportActionDump {\n  sdkVersion: string;\n  groupName: string;\n  groupDescription?: string;\n  modelBriefs: IReportActionDump['modelBriefs'];\n  executions: ExecutionDump[];\n  deviceType?: string;\n\n  constructor(data: IReportActionDump) {\n    this.sdkVersion = data.sdkVersion;\n    this.groupName = data.groupName;\n    this.groupDescription = data.groupDescription;\n    this.modelBriefs = data.modelBriefs;\n    this.executions = data.executions.map((exec) =>\n      exec instanceof ExecutionDump ? exec : ExecutionDump.fromJSON(exec),\n    );\n    this.deviceType = data.deviceType;\n  }\n\n  /**\n   * Serialize the ReportActionDump to a JSON string\n   * Uses typed report references for persisted screenshots.\n   */\n  serialize(indents?: number): string {\n    return stringifyDump(this.toJSON(), indents);\n  }\n\n  /**\n   * Serialize a report dump while replacing persisted multimodal prompt image\n   * URLs with their compact report asset references.\n   *\n   * @param referenceImageRefsByUrl Maps registered prompt image URLs to assets.\n   * @param indents Optional JSON indentation.\n   * @returns The serialized report dump.\n   */\n  serializeWithReferenceImages(\n    referenceImageRefsByUrl: ReadonlyMap<string, ImageUrlRef>,\n    indents?: number,\n  ): string {\n    return stringifyDump(\n      replaceReferenceImageUrls(this.toJSON(), referenceImageRefsByUrl),\n      indents,\n    );\n  }\n\n  /**\n   * Serialize the ReportActionDump with inline screenshots to a JSON string.\n   * Each ScreenshotItem is replaced with { base64: \"...\", capturedAt }.\n   */\n  serializeWithInlineScreenshots(indents?: number): string {\n    const processValue = (obj: unknown): unknown => {\n      if (obj instanceof ScreenshotItem) {\n        return { base64: obj.base64, capturedAt: obj.capturedAt };\n      }\n      if (Array.isArray(obj)) {\n        return obj.map(processValue);\n      }\n      if (obj && typeof obj === 'object') {\n        const entries = Object.entries(obj)\n          // screenshotSequence is a transient multi-frame model input whose\n          // frames are not persisted; skip it to avoid inlining large base64.\n          .filter(([key]) => key !== 'screenshotSequence')\n          .map(([key, value]) => [key, processValue(value)]);\n        return Object.fromEntries(entries);\n      }\n      return obj;\n    };\n\n    const data = processValue(this.toJSON());\n    return JSON.stringify(data, null, indents);\n  }\n\n  /**\n   * Convert to a plain object for JSON serialization\n   */\n  toJSON(): IReportActionDump {\n    return {\n      sdkVersion: this.sdkVersion,\n      groupName: this.groupName,\n      groupDescription: this.groupDescription,\n      modelBriefs: this.modelBriefs,\n      executions: this.executions.map((exec) => exec.toJSON()),\n      deviceType: this.deviceType,\n    };\n  }\n\n  /**\n   * Create a ReportActionDump instance from a serialized JSON string\n   */\n  static fromSerializedString(serialized: string): ReportActionDump {\n    const parsed = JSON.parse(\n      serialized,\n      reviverForDumpDeserialization,\n    ) as IReportActionDump;\n    return new ReportActionDump(parsed);\n  }\n\n  /**\n   * Create a ReportActionDump instance from a plain object\n   */\n  static fromJSON(data: IReportActionDump): ReportActionDump {\n    return new ReportActionDump(data);\n  }\n\n  /**\n   * Collect all ScreenshotItem instances from all executions.\n   *\n   * @returns Array of all ScreenshotItem instances across all executions\n   */\n  collectAllScreenshots(): ScreenshotItem[] {\n    const screenshots: ScreenshotItem[] = [];\n    for (const execution of this.executions) {\n      screenshots.push(...execution.collectScreenshots());\n    }\n    return screenshots;\n  }\n\n  /**\n   * Serialize the dump to files with screenshots as separate PNG files.\n   * Creates:\n   * - {basePath} - dump JSON with { $screenshot: id } references\n   * - {basePath}.screenshots/ - PNG files\n   *\n   * @param basePath - Base path for the dump file\n   */\n  serializeToFiles(basePath: string): void {\n    const screenshotsDir = `${basePath}.screenshots`;\n    if (!existsSync(screenshotsDir)) {\n      mkdirSync(screenshotsDir, { recursive: true });\n    }\n\n    const screenshots = this.collectAllScreenshots();\n\n    for (const screenshot of screenshots) {\n      const imagePath = join(\n        screenshotsDir,\n        `${screenshot.id}.${screenshot.extension}`,\n      );\n      if (existsSync(imagePath)) {\n        continue;\n      }\n\n      const rawBase64 = screenshot.rawBase64;\n      writeFileSync(imagePath, Buffer.from(rawBase64, 'base64'));\n    }\n\n    // Write dump JSON with references\n    writeFileSync(basePath, this.serialize(), 'utf-8');\n  }\n\n  /**\n   * Read dump from files and return JSON string with inline screenshots.\n   * Reads the dump JSON and screenshot files, then inlines the base64 data.\n   *\n   * @param basePath - Base path for the dump file\n   * @returns JSON string with inline screenshots ({ base64: \"...\" } format)\n   */\n  static fromFilesAsInlineJson(basePath: string): string {\n    const dumpString = readFileSync(basePath, 'utf-8');\n    const screenshotsDir = `${basePath}.screenshots`;\n\n    // Restore image references\n    const dumpData = JSON.parse(dumpString);\n    const imageStore = new ReportImageStore({\n      mode: 'directory',\n      reportPath: basePath,\n      screenshotsDir,\n    });\n    const resolveImage = (ref: Parameters<typeof imageStore.loadDataUri>[0]) =>\n      imageStore.loadDataUri(ref);\n    const processedData = restoreImageReferences(dumpData, resolveImage);\n    return JSON.stringify(processedData);\n  }\n\n  /**\n   * Clean up all files associated with a serialized dump.\n   *\n   * @param basePath - Base path for the dump file\n   */\n  static cleanupFiles(basePath: string): void {\n    const filesToClean = [basePath, `${basePath}.screenshots`];\n\n    for (const filePath of filesToClean) {\n      try {\n        rmSync(filePath, { force: true, recursive: true });\n      } catch {\n        // Ignore errors - file may already be deleted\n      }\n    }\n  }\n\n  /**\n   * Get all file paths associated with a serialized dump.\n   *\n   * @param basePath - Base path for the dump file\n   * @returns Array of all associated file paths\n   */\n  static getFilePaths(basePath: string): string[] {\n    return [basePath, `${basePath}.screenshots`];\n  }\n}\n\n// Backward-compatible aliases for existing external consumers.\nexport type GroupedActionDump = ReportActionDump;\nexport const GroupedActionDump = ReportActionDump;\n"],"names":["isReferenceImageDescriptor","value","record","getPageOrBrowserObjectName","constructorName","isCustomSerializableObject","isPlainRecord","prototype","Object","replacerForDumpSerialization","key","opaqueObjectName","stringifyDump","data","indents","JSON","replaceReferenceImageUrls","referenceImageRefsByUrl","ancestors","WeakSet","Array","item","result","nestedValue","image","transformedImage","referenceImageRef","reviverForDumpDeserialization","ScreenshotItem","ExecutionDump","task","serialized","parsed","screenshots","options","Set","isBase64ImageDataUrl","ReportActionDump","processValue","obj","entries","exec","execution","basePath","screenshotsDir","existsSync","mkdirSync","screenshot","imagePath","join","rawBase64","writeFileSync","Buffer","dumpString","readFileSync","dumpData","imageStore","ReportImageStore","resolveImage","ref","processedData","restoreImageReferences","filesToClean","filePath","rmSync","GroupedActionDump"],"mappings":"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"}