{"version":3,"file":"dump/image-reference.mjs","sources":["../../../src/dump/image-reference.ts"],"sourcesContent":["/** Serialized reference to a captured screenshot stored by a report. */\nexport interface ScreenshotRef {\n  type: 'midscene_screenshot_ref';\n  id: string;\n  capturedAt: number;\n  mimeType: 'image/png' | 'image/jpeg';\n  storage: 'inline' | 'file';\n  path?: string;\n}\n\n/** Serialized reference to a multimodal prompt image URL stored by a report. */\nexport interface ImageUrlRef {\n  type: 'midscene_image_url_ref';\n  id: string;\n  mimeType: `image/${string}`;\n  storage: 'inline' | 'file';\n  path?: string;\n}\n\n/** Any image asset reference supported by report serialization. */\nexport type StoredImageRef = ScreenshotRef | ImageUrlRef;\n\nconst knownImageExtensions: Readonly<Record<string, string>> = {\n  'image/jpeg': 'jpeg',\n  'image/jpg': 'jpeg',\n  'image/png': 'png',\n  'image/webp': 'webp',\n  'image/gif': 'gif',\n  'image/svg+xml': 'svg',\n  'image/avif': 'avif',\n  'image/bmp': 'bmp',\n};\n\nconst knownImageMimeTypesByExtension: Readonly<\n  Record<string, `image/${string}`>\n> = {\n  jpeg: 'image/jpeg',\n  jpg: 'image/jpeg',\n  png: 'image/png',\n  webp: 'image/webp',\n  gif: 'image/gif',\n  svg: 'image/svg+xml',\n  avif: 'image/avif',\n  bmp: 'image/bmp',\n};\n\nfunction hasValidStorage(record: Record<string, unknown>): boolean {\n  if (record.storage !== 'inline' && record.storage !== 'file') return false;\n  return record.storage !== 'file' || typeof record.path === 'string';\n}\n\nfunction hasValidImageId(record: Record<string, unknown>): boolean {\n  return (\n    typeof record.id === 'string' && /^[a-z0-9_-]{1,128}$/i.test(record.id)\n  );\n}\n\n/** Validate and normalize a serialized screenshot reference. */\nexport function normalizeScreenshotRef(value: unknown): ScreenshotRef | null {\n  if (typeof value !== 'object' || value === null) return null;\n  const record = value as Record<string, unknown>;\n\n  if (\n    record.type === 'midscene_screenshot_ref' &&\n    hasValidImageId(record) &&\n    typeof record.capturedAt === 'number' &&\n    (record.mimeType === 'image/png' || record.mimeType === 'image/jpeg') &&\n    hasValidStorage(record)\n  ) {\n    return record as unknown as ScreenshotRef;\n  }\n\n  return null;\n}\n\n/** Validate and normalize a serialized multimodal prompt image reference. */\nexport function normalizeImageUrlRef(value: unknown): ImageUrlRef | null {\n  if (typeof value !== 'object' || value === null) return null;\n  const record = value as Record<string, unknown>;\n\n  if (\n    record.type === 'midscene_image_url_ref' &&\n    hasValidImageId(record) &&\n    typeof record.mimeType === 'string' &&\n    record.mimeType.startsWith('image/') &&\n    hasValidStorage(record)\n  ) {\n    return record as unknown as ImageUrlRef;\n  }\n\n  return null;\n}\n\n/** Validate any serialized report image reference. */\nexport function normalizeStoredImageRef(value: unknown): StoredImageRef | null {\n  return normalizeScreenshotRef(value) ?? normalizeImageUrlRef(value);\n}\n\n/** Resolve the report asset extension for an image MIME type. */\nexport function imageFileExtensionForMimeType(mimeType: string): string {\n  const knownExtension = knownImageExtensions[mimeType.toLowerCase()];\n  if (knownExtension) return knownExtension;\n\n  const subtype = mimeType.slice('image/'.length).split('+', 1)[0];\n  const sanitized = subtype\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, '-')\n    .replace(/^-+|-+$/g, '')\n    .slice(0, 32);\n  if (!sanitized) {\n    throw new Error(\n      `Cannot derive a report image file extension for MIME type \"${mimeType}\"`,\n    );\n  }\n  return sanitized;\n}\n\n/** Resolve a supported report image MIME type from its file extension. */\nexport function imageMimeTypeForFileExtension(\n  extension: string,\n): `image/${string}` | null {\n  return knownImageMimeTypesByExtension[extension.toLowerCase()] ?? null;\n}\n\n/** Resolve the file extension used by a serialized report image reference. */\nexport function imageRefFileExtension(ref: StoredImageRef): string {\n  return imageFileExtensionForMimeType(ref.mimeType);\n}\n\n/**\n * Resolve the report-relative asset path for an image reference.\n * Explicit serialized paths win; inline refs use the standard screenshots dir.\n */\nexport function reportImageAssetPath(ref: StoredImageRef): string {\n  if (ref.storage === 'file' && ref.path) return ref.path;\n  return `./screenshots/${encodeURIComponent(ref.id)}.${imageRefFileExtension(ref)}`;\n}\n"],"names":["knownImageExtensions","knownImageMimeTypesByExtension","hasValidStorage","record","hasValidImageId","normalizeScreenshotRef","value","normalizeImageUrlRef","normalizeStoredImageRef","imageFileExtensionForMimeType","mimeType","knownExtension","subtype","sanitized","Error","imageMimeTypeForFileExtension","extension","imageRefFileExtension","ref","reportImageAssetPath","encodeURIComponent"],"mappings":"AAsBA,MAAMA,uBAAyD;IAC7D,cAAc;IACd,aAAa;IACb,aAAa;IACb,cAAc;IACd,aAAa;IACb,iBAAiB;IACjB,cAAc;IACd,aAAa;AACf;AAEA,MAAMC,iCAEF;IACF,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;AACP;AAEA,SAASC,gBAAgBC,MAA+B;IACtD,IAAIA,AAAmB,aAAnBA,OAAO,OAAO,IAAiBA,AAAmB,WAAnBA,OAAO,OAAO,EAAa,OAAO;IACrE,OAAOA,AAAmB,WAAnBA,OAAO,OAAO,IAAe,AAAuB,YAAvB,OAAOA,OAAO,IAAI;AACxD;AAEA,SAASC,gBAAgBD,MAA+B;IACtD,OACE,AAAqB,YAArB,OAAOA,OAAO,EAAE,IAAiB,uBAAuB,IAAI,CAACA,OAAO,EAAE;AAE1E;AAGO,SAASE,uBAAuBC,KAAc;IACnD,IAAI,AAAiB,YAAjB,OAAOA,SAAsBA,AAAU,SAAVA,OAAgB,OAAO;IACxD,MAAMH,SAASG;IAEf,IACEH,AAAgB,8BAAhBA,OAAO,IAAI,IACXC,gBAAgBD,WAChB,AAA6B,YAA7B,OAAOA,OAAO,UAAU,IACvBA,CAAAA,AAAoB,gBAApBA,OAAO,QAAQ,IAAoBA,AAAoB,iBAApBA,OAAO,QAAQ,AAAgB,KACnED,gBAAgBC,SAEhB,OAAOA;IAGT,OAAO;AACT;AAGO,SAASI,qBAAqBD,KAAc;IACjD,IAAI,AAAiB,YAAjB,OAAOA,SAAsBA,AAAU,SAAVA,OAAgB,OAAO;IACxD,MAAMH,SAASG;IAEf,IACEH,AAAgB,6BAAhBA,OAAO,IAAI,IACXC,gBAAgBD,WAChB,AAA2B,YAA3B,OAAOA,OAAO,QAAQ,IACtBA,OAAO,QAAQ,CAAC,UAAU,CAAC,aAC3BD,gBAAgBC,SAEhB,OAAOA;IAGT,OAAO;AACT;AAGO,SAASK,wBAAwBF,KAAc;IACpD,OAAOD,uBAAuBC,UAAUC,qBAAqBD;AAC/D;AAGO,SAASG,8BAA8BC,QAAgB;IAC5D,MAAMC,iBAAiBX,oBAAoB,CAACU,SAAS,WAAW,GAAG;IACnE,IAAIC,gBAAgB,OAAOA;IAE3B,MAAMC,UAAUF,SAAS,KAAK,CAAC,GAAiB,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE;IAChE,MAAMG,YAAYD,QACf,WAAW,GACX,OAAO,CAAC,eAAe,KACvB,OAAO,CAAC,YAAY,IACpB,KAAK,CAAC,GAAG;IACZ,IAAI,CAACC,WACH,MAAM,IAAIC,MACR,CAAC,2DAA2D,EAAEJ,SAAS,CAAC,CAAC;IAG7E,OAAOG;AACT;AAGO,SAASE,8BACdC,SAAiB;IAEjB,OAAOf,8BAA8B,CAACe,UAAU,WAAW,GAAG,IAAI;AACpE;AAGO,SAASC,sBAAsBC,GAAmB;IACvD,OAAOT,8BAA8BS,IAAI,QAAQ;AACnD;AAMO,SAASC,qBAAqBD,GAAmB;IACtD,IAAIA,AAAgB,WAAhBA,IAAI,OAAO,IAAeA,IAAI,IAAI,EAAE,OAAOA,IAAI,IAAI;IACvD,OAAO,CAAC,cAAc,EAAEE,mBAAmBF,IAAI,EAAE,EAAE,CAAC,EAAED,sBAAsBC,MAAM;AACpF"}