@midscene/core 1.15.3 → 1.15.4-beta-20261013090705.0
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.
- package/dist/es/agent/index.mjs +2 -2
- package/dist/es/agent/test-runner-nodes.mjs +14 -5
- package/dist/es/agent/test-runner-nodes.mjs.map +1 -1
- package/dist/es/agent/utils.mjs +1 -1
- package/dist/es/dump/report-action-dump.mjs +3 -3
- package/dist/es/dump/report-action-dump.mjs.map +1 -1
- package/dist/es/report-html-template.mjs +1 -1
- package/dist/es/report-markdown.mjs +1 -1
- package/dist/es/report-markdown.mjs.map +1 -1
- package/dist/es/screenshot-item.mjs +6 -0
- package/dist/es/screenshot-item.mjs.map +1 -1
- package/dist/es/test-run-report.mjs.map +1 -1
- package/dist/es/test-runner/reporting/test-run-report.mjs +41 -1
- package/dist/es/test-runner/reporting/test-run-report.mjs.map +1 -1
- package/dist/es/utils.mjs +1 -1
- package/dist/lib/agent/index.js +3 -0
- package/dist/lib/agent/test-runner-nodes.js +31 -19
- package/dist/lib/agent/test-runner-nodes.js.map +1 -1
- package/dist/lib/agent/utils.js +1 -1
- package/dist/lib/dump/report-action-dump.js +3 -3
- package/dist/lib/dump/report-action-dump.js.map +1 -1
- package/dist/lib/report-html-template.js +1 -1
- package/dist/lib/report-markdown.js +1 -1
- package/dist/lib/report-markdown.js.map +1 -1
- package/dist/lib/screenshot-item.js +6 -0
- package/dist/lib/screenshot-item.js.map +1 -1
- package/dist/lib/test-run-report.js.map +1 -1
- package/dist/lib/test-runner/reporting/test-run-report.js +41 -1
- package/dist/lib/test-runner/reporting/test-run-report.js.map +1 -1
- package/dist/lib/utils.js +1 -1
- package/dist/types/agent/index.d.ts +2 -2
- package/dist/types/agent/index.d.ts.map +1 -1
- package/dist/types/agent/test-runner-nodes.d.ts +8 -0
- package/dist/types/agent/test-runner-nodes.d.ts.map +1 -1
- package/dist/types/screenshot-item.d.ts +5 -0
- package/dist/types/screenshot-item.d.ts.map +1 -1
- package/dist/types/test-run-report.d.ts +19 -0
- package/dist/types/test-run-report.d.ts.map +1 -1
- package/dist/types/test-runner/engine/types.d.ts +1 -1
- package/dist/types/test-runner/engine/types.d.ts.map +1 -1
- package/dist/types/test-runner/parser/types.d.ts +4 -0
- package/dist/types/test-runner/parser/types.d.ts.map +1 -1
- package/dist/types/test-runner/reporting/test-run-report.d.ts.map +1 -1
- package/dist/types/test-runner/reporting/types.d.ts +6 -1
- package/dist/types/test-runner/reporting/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dump/report-action-dump.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/dump/report-action-dump.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 {\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":["__webpack_require__","definition","key","Object","obj","prop","Symbol","isReferenceImageDescriptor","value","record","getPageOrBrowserObjectName","constructorName","isCustomSerializableObject","isPlainRecord","prototype","replacerForDumpSerialization","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","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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"}
|
|
1
|
+
{"version":3,"file":"dump/report-action-dump.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/dump/report-action-dump.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 {\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 (ScreenshotItem.isScreenshotItem(task.uiContext?.screenshot)) {\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 (ScreenshotItem.isScreenshotItem(record.screenshot)) {\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 (ScreenshotItem.isScreenshotItem(obj)) {\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":["__webpack_require__","definition","key","Object","obj","prop","Symbol","isReferenceImageDescriptor","value","record","getPageOrBrowserObjectName","constructorName","isCustomSerializableObject","isPlainRecord","prototype","replacerForDumpSerialization","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","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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"}
|