@midscene/playground 1.5.8 → 1.6.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/js/index.af96c1bb.js","sources":["webpack/runtime/create_fake_namespace_object","webpack/runtime/load_script","webpack/runtime/on_chunk_loaded","webpack/runtime/jsonp_chunk_loading","../../../../../packages/core/dist/es/ai-model/service-caller|lazy|referencedExports: ProxyAgent|groupOptions: {}|namespace object","../../../../../packages/core/dist/es/ai-model/service-caller|lazy|referencedExports: createInterface|groupOptions: {}|namespace object","../../../../../packages/core/dist/es/ai-model/service-caller|lazy|referencedExports: observeOpenAI|groupOptions: {}|namespace object","../../../../../packages/core/dist/es/ai-model/service-caller|lazy|referencedExports: socksDispatcher|groupOptions: {}|namespace object","../../../../../packages/core/dist/es/ai-model/service-caller|lazy|referencedExports: spawn|groupOptions: {}|namespace object","../../../../../packages/core/dist/es/ai-model/service-caller|lazy|referencedExports: wrapOpenAI|groupOptions: {}|namespace object","../../../../../packages/core/src/dump/html-utils.ts","../../../../../packages/shared/dist/es/env/init-debug.mjs","../../../../../packages/shared/dist/es/env/global-config-manager.mjs","../../../../../packages/shared/dist/es/env/constants.mjs","../../../../../packages/shared/dist/es/env/helper.mjs","../../../../../packages/shared/dist/es/env/parse-model-config.mjs","../../../../../packages/shared/dist/es/env/model-config-manager.mjs","../../../../../packages/shared/dist/es/env/utils.mjs","../../../../../packages/core/src/ai-model/auto-glm/util.ts","../../../../../packages/core/src/ai-model/service-caller/codex-app-server.ts","../../../../../packages/core/src/ai-model/service-caller/index.ts","../../../../../packages/core/src/ai-model/service-caller/image-detail.ts","../../../../../packages/shared/dist/es/extractor/dom-util.mjs","../../../../../packages/shared/dist/es/img/get-photon.mjs","../../../../../packages/shared/dist/es/img/get-sharp.mjs","../../../../../packages/shared/dist/es/img/transform.mjs","../../../../../packages/core/src/common.ts","../../../../../packages/core/src/ai-model/auto-glm/parser.ts","../../../../../packages/core/src/ai-model/auto-glm/prompt.ts","../../../../../packages/core/src/ai-model/prompt/util.ts","../../../../../packages/core/src/ai-model/prompt/common.ts","../../../../../packages/core/src/ai-model/inspect.ts","../../../../../packages/core/src/ai-model/prompt/llm-locator.ts","../../../../../packages/core/src/ai-model/prompt/llm-section-locator.ts","../../../../../packages/core/src/ai-model/prompt/extraction.ts","../../../../../packages/shared/dist/es/zod-schema-utils.mjs","../../../../../packages/core/src/ai-model/prompt/llm-planning.ts","../../../../../packages/core/src/ai-model/llm-planning.ts","../../../../../packages/core/src/ai-model/auto-glm/actions.ts","../../../../../packages/core/src/ai-model/auto-glm/planning.ts","../../../../../packages/shared/dist/es/us-keyboard-layout.mjs","../../../../../packages/core/src/ai-model/ui-tars-planning.ts","../../../../../packages/core/src/ai-model/prompt/ui-tars-planning.ts","../../../../../packages/core/src/ai-model/conversation-history.ts","../../../../../packages/core/src/yaml/utils.ts","../../../../../packages/core/src/yaml/player.ts","../../../../../packages/playground/src/common.ts","../../../../../packages/core/src/ai-model/prompt/describe.ts","../../../../../packages/core/src/screenshot-item.ts","../../../../../packages/core/src/types.ts","../../../../../packages/core/src/dump/image-restoration.ts","../../../../../packages/shared/dist/es/img/box-select.mjs","../../../../../packages/core/src/service/utils.ts","../../../../../packages/core/src/service/index.ts","../../../../../packages/core/src/task-timing.ts","../../../../../packages/core/src/task-runner.ts","../../../../../packages/core/src/utils.ts","../../../../../packages/core/src/report-generator.ts","../../../../../packages/core/src/device/index.ts","../../../../../packages/shared/dist/es/img/info.mjs","../../../../../packages/core/src/agent/utils.ts","../../../../../packages/core/src/agent/task-cache.ts","../../../../../packages/core/src/agent/execution-session.ts","../../../../../packages/core/src/agent/task-builder.ts","../../../../../packages/shared/dist/es/extractor/tree.mjs","../../../../../packages/core/src/agent/ui-utils.ts","../../../../../packages/core/src/agent/tasks.ts","../../../../../packages/core/src/agent/agent.ts","../../../../../packages/playground/src/adapters/base.ts","../../../../../packages/playground/src/adapters/local-execution.ts","../../../../../packages/playground/src/runtime-metadata.ts","../../../../../packages/playground/src/platform.ts","../../../../../packages/playground/src/adapters/remote-execution.ts","../../../../../packages/playground/src/sdk/index.ts","../../../../../packages/visualizer/dist/es/utils/color.mjs","../../../../../packages/visualizer/dist/es/component/logo/index.mjs","../../../../../packages/visualizer/dist/es/hooks/useTheme.mjs","../../../../../packages/visualizer/dist/es/store/store.mjs","../../../../../packages/visualizer/dist/es/component/env-config/index.mjs","../../../../../packages/visualizer/dist/es/component/nav-actions/index.mjs","../../../../../packages/visualizer/dist/es/utils/constants.mjs","../../../../../packages/visualizer/dist/es/utils/index.mjs","../../../../../packages/visualizer/dist/es/utils/replay-scripts.mjs","../../../../../packages/visualizer/dist/es/hooks/usePlaygroundExecution.mjs","../../../../../packages/shared/dist/es/baseDB.mjs","../../../../../packages/visualizer/dist/es/component/universal-playground/providers/indexeddb-storage-provider.mjs","../../../../../packages/visualizer/dist/es/component/universal-playground/providers/storage-provider.mjs","../../../../../packages/visualizer/dist/es/hooks/usePlaygroundState.mjs","../../../../../packages/visualizer/dist/es/component/blackboard/index.mjs","../../../../../packages/visualizer/dist/es/component/blackboard/highlights.mjs","../../../../../packages/visualizer/dist/es/component/shiny-text/index.mjs","../../../../../packages/visualizer/dist/es/component/misc/index.mjs","../../../../../packages/visualizer/dist/es/component/context-preview/index.mjs","../../../../../packages/visualizer/dist/es/component/env-config-reminder/index.mjs","../../../../../packages/visualizer/dist/es/icons/global-perspective.mjs","../../../../../packages/visualizer/dist/es/icons/player-setting.mjs","../../../../../packages/visualizer/dist/es/component/player/scenes/derive-frame-state.mjs","../../../../../packages/visualizer/dist/es/component/player/scenes/playback-layout.mjs","../../../../../packages/visualizer/dist/es/component/player/scenes/StepScene.mjs","../../../../../packages/visualizer/dist/es/component/player/scenes/export-branded-video.mjs","../../../../../packages/visualizer/dist/es/component/player/index.mjs","../../../../../packages/visualizer/dist/es/component/player/scenes/frame-calculator.mjs","../../../../../packages/visualizer/dist/es/component/player/use-frame-player.mjs","../../../../../packages/visualizer/dist/es/component/player/scenes/playback-frame.mjs","../../../../../packages/visualizer/dist/es/component/playground-result/index.mjs","../../../../../packages/visualizer/dist/es/icons/avatar.mjs","../../../../../packages/visualizer/dist/es/store/history.mjs","../../../../../packages/visualizer/dist/es/types.mjs","../../../../../packages/visualizer/dist/es/utils/device-capabilities.mjs","../../../../../packages/visualizer/dist/es/utils/playground-utils.mjs","../../../../../packages/visualizer/dist/es/icons/setting.mjs","../../../../../packages/visualizer/dist/es/component/config-selector/index.mjs","../../../../../packages/visualizer/dist/es/component/form-field/index.mjs","../../../../../packages/visualizer/dist/es/icons/close.mjs","../../../../../packages/visualizer/dist/es/icons/history.mjs","../../../../../packages/visualizer/dist/es/icons/magnifying-glass.mjs","../../../../../packages/visualizer/dist/es/component/history-selector/index.mjs","../../../../../packages/visualizer/dist/es/component/prompt-input/index.mjs","../../../../../packages/visualizer/dist/es/component/universal-playground/index.mjs","../../../../../packages/visualizer/dist/es/component/screenshot-viewer/index.mjs","../../../../../packages/playground-app/dist/es/ScrcpyPanel.mjs","../../../../../packages/playground-app/dist/es/runtime-info.mjs","../../../../../packages/playground-app/dist/es/PreviewRenderer.mjs","../../../../../packages/playground-app/dist/es/icons/server-offline-background.mjs","../../../../../packages/playground-app/dist/es/icons/server-offline-foreground.mjs","../../../../../packages/playground-app/dist/es/useServerStatus.mjs","../../../../../packages/playground-app/dist/es/PlaygroundApp.mjs","../../../src/index.tsx","../../../src/App.tsx","../../../../../packages/shared/dist/es/common.mjs","../../../../../packages/shared/dist/es/env/basic.mjs","../../../../../packages/shared/dist/es/env/types.mjs","../../../../../packages/shared/dist/es/logger.mjs","../../../../../packages/shared/dist/es/utils.mjs","webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/ensure_chunk","webpack/runtime/get javascript chunk filename","webpack/runtime/get mini-css chunk filename","webpack/runtime/global","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","webpack/runtime/public_path"],"sourcesContent":["var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n __webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; (typeof current == 'object' || typeof current == 'function') && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => { def[key] = () => (value[key]) });\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\n\nvar uniqueName = \"playground:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function (url, done, key, chunkId) {\n\tif (inProgress[url]) {\n\t\tinProgress[url].push(done);\n\t\treturn;\n\t}\n\tvar script, needAttach;\n\tif (key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor (var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif (s.getAttribute(\"src\") == url || s.getAttribute(\"data-rspack\") == uniqueName + key) {\n\t\t\t\tscript = s;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\nscript.timeout = 120;\nif (__webpack_require__.nc) {\n script.setAttribute(\"nonce\", __webpack_require__.nc);\n}\n\nscript.setAttribute(\"data-rspack\", uniqueName + key);\n\n\n\nscript.src = url;\n\n\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function (prev, event) {\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns &&\n\t\t\tdoneFns.forEach(function (fn) {\n\t\t\t\treturn fn(event);\n\t\t\t});\n\t\tif (prev) return prev(event);\n\t};\n\tvar timeout = setTimeout(\n\t\tonScriptComplete.bind(null, undefined, {\n\t\t\ttype: 'timeout',\n\t\t\ttarget: script\n\t\t}),\n\t\t120000\n\t);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};\n","var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif (chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor (var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--)\n\t\t\tdeferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif (\n\t\t\t\t(priority & (1 === 0) || notFulfilled >= priority) &&\n\t\t\t\tObject.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))\n\t\t\t) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif (priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif (fulfilled) {\n\t\t\tdeferred.splice(i--, 1);\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};\n","__webpack_require__.b = document.baseURI || self.location.href;\n\n // object to store loaded and loading chunks\n // undefined = chunk not loaded, null = chunk preloaded/prefetched\n // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\n var installedChunks = {\"410\": 0,};\n \n __webpack_require__.f.j = function (chunkId, promises) {\n // JSONP chunk loading for javascript\nvar installedChunkData = __webpack_require__.o(installedChunks, chunkId)\n\t? installedChunks[chunkId]\n\t: undefined;\nif (installedChunkData !== 0) {\n\t// 0 means \"already installed\".\n\n\t// a Promise means \"currently loading\".\n\tif (installedChunkData) {\n\t\tpromises.push(installedChunkData[2]);\n\t} else {\n\t\tif (true) {\n\t\t\t// setup Promise in chunk cache\n\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\tpromises.push((installedChunkData[2] = promise));\n\n\t\t\t// start chunk loading\n\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\tvar error = new Error();\n\t\t\tvar loadingEnded = function (event) {\n\t\t\t\tif (__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\tif (installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\tif (installedChunkData) {\n\t\t\t\t\t\tvar errorType =\n\t\t\t\t\t\t\tevent && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\terror.message =\n\t\t\t\t\t\t\t'Loading chunk ' +\n\t\t\t\t\t\t\tchunkId +\n\t\t\t\t\t\t\t' failed.\\n(' +\n\t\t\t\t\t\t\terrorType +\n\t\t\t\t\t\t\t': ' +\n\t\t\t\t\t\t\trealSrc +\n\t\t\t\t\t\t\t')';\n\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t} \n\t}\n}\n\n }\n __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n// install a JSONP callback for chunk loading\nvar __rspack_jsonp = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif (chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor (moduleId in moreModules) {\n\t\t\tif (__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif (runtime) var result = runtime(__webpack_require__);\n\t}\n\tif (parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor (; i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif (\n\t\t\t__webpack_require__.o(installedChunks, chunkId) &&\n\t\t\tinstalledChunks[chunkId]\n\t\t) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\t\n\treturn __webpack_require__.O(result);\n\t\n};\n\nvar chunkLoadingGlobal = self[\"webpackChunkplayground\"] = self[\"webpackChunkplayground\"] || [];\nchunkLoadingGlobal.forEach(__rspack_jsonp.bind(null, 0));\nchunkLoadingGlobal.push = __rspack_jsonp.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));\n","function webpackEmptyAsyncContext(req) {\n // Here Promise.resolve().then() is used instead of new Promise() to prevent\n // uncaught exception popping up in devtools\n return Promise.resolve().then(function() {\n var e = new Error(\"Cannot find module '\" + req + \"'\");\n e.code = 'MODULE_NOT_FOUND';\n throw e;\n });\n}\nwebpackEmptyAsyncContext.keys = () => ([]);\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 5737;\nmodule.exports = webpackEmptyAsyncContext;\n","function webpackEmptyAsyncContext(req) {\n // Here Promise.resolve().then() is used instead of new Promise() to prevent\n // uncaught exception popping up in devtools\n return Promise.resolve().then(function() {\n var e = new Error(\"Cannot find module '\" + req + \"'\");\n e.code = 'MODULE_NOT_FOUND';\n throw e;\n });\n}\nwebpackEmptyAsyncContext.keys = () => ([]);\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 8541;\nmodule.exports = webpackEmptyAsyncContext;\n","function webpackEmptyAsyncContext(req) {\n // Here Promise.resolve().then() is used instead of new Promise() to prevent\n // uncaught exception popping up in devtools\n return Promise.resolve().then(function() {\n var e = new Error(\"Cannot find module '\" + req + \"'\");\n e.code = 'MODULE_NOT_FOUND';\n throw e;\n });\n}\nwebpackEmptyAsyncContext.keys = () => ([]);\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 9998;\nmodule.exports = webpackEmptyAsyncContext;\n","function webpackEmptyAsyncContext(req) {\n // Here Promise.resolve().then() is used instead of new Promise() to prevent\n // uncaught exception popping up in devtools\n return Promise.resolve().then(function() {\n var e = new Error(\"Cannot find module '\" + req + \"'\");\n e.code = 'MODULE_NOT_FOUND';\n throw e;\n });\n}\nwebpackEmptyAsyncContext.keys = () => ([]);\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 3348;\nmodule.exports = webpackEmptyAsyncContext;\n","function webpackEmptyAsyncContext(req) {\n // Here Promise.resolve().then() is used instead of new Promise() to prevent\n // uncaught exception popping up in devtools\n return Promise.resolve().then(function() {\n var e = new Error(\"Cannot find module '\" + req + \"'\");\n e.code = 'MODULE_NOT_FOUND';\n throw e;\n });\n}\nwebpackEmptyAsyncContext.keys = () => ([]);\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 8817;\nmodule.exports = webpackEmptyAsyncContext;\n","function webpackEmptyAsyncContext(req) {\n // Here Promise.resolve().then() is used instead of new Promise() to prevent\n // uncaught exception popping up in devtools\n return Promise.resolve().then(function() {\n var e = new Error(\"Cannot find module '\" + req + \"'\");\n e.code = 'MODULE_NOT_FOUND';\n throw e;\n });\n}\nwebpackEmptyAsyncContext.keys = () => ([]);\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = 1560;\nmodule.exports = webpackEmptyAsyncContext;\n","import { closeSync, openSync, readSync, statSync } from 'node:fs';\nimport { antiEscapeScriptTag, escapeScriptTag } from '@midscene/shared/utils';\n\nexport const escapeContent = escapeScriptTag;\nexport const unescapeContent = antiEscapeScriptTag;\n\n/** Chunk size for streaming file operations (64KB) */\nexport const STREAMING_CHUNK_SIZE = 64 * 1024;\n\n/**\n * Callback for processing matched tags during streaming.\n * @param content - The content between open and close tags\n * @returns true to stop scanning, false to continue\n */\ntype TagMatchCallback = (content: string) => boolean;\n\n/**\n * Stream through a file and find tags matching the pattern.\n * Memory usage: O(chunk_size + tag_size), not O(file_size).\n *\n * @param filePath - Absolute path to the file\n * @param openTag - Opening tag to search for\n * @param closeTag - Closing tag\n * @param onMatch - Callback for each matched tag content\n */\nexport function streamScanTags(\n filePath: string,\n openTag: string,\n closeTag: string,\n onMatch: TagMatchCallback,\n): void {\n const fd = openSync(filePath, 'r');\n const fileSize = statSync(filePath).size;\n const buffer = Buffer.alloc(STREAMING_CHUNK_SIZE);\n\n let position = 0;\n let leftover = '';\n let capturing = false;\n let currentContent = '';\n\n try {\n while (position < fileSize) {\n const bytesRead = readSync(fd, buffer, 0, STREAMING_CHUNK_SIZE, position);\n const chunk = leftover + buffer.toString('utf-8', 0, bytesRead);\n position += bytesRead;\n\n let searchStart = 0;\n\n while (searchStart < chunk.length) {\n if (!capturing) {\n const startIdx = chunk.indexOf(openTag, searchStart);\n if (startIdx !== -1) {\n capturing = true;\n currentContent = chunk.slice(startIdx + openTag.length);\n const endIdx = currentContent.indexOf(closeTag);\n if (endIdx !== -1) {\n const shouldStop = onMatch(currentContent.slice(0, endIdx));\n if (shouldStop) return;\n capturing = false;\n currentContent = '';\n searchStart =\n startIdx + openTag.length + endIdx + closeTag.length;\n } else {\n leftover = currentContent.slice(-closeTag.length);\n currentContent = currentContent.slice(0, -closeTag.length);\n break;\n }\n } else {\n leftover = chunk.slice(-openTag.length);\n break;\n }\n } else {\n const endIdx = chunk.indexOf(closeTag, searchStart);\n if (endIdx !== -1) {\n currentContent += chunk.slice(searchStart, endIdx);\n const shouldStop = onMatch(currentContent);\n if (shouldStop) return;\n capturing = false;\n currentContent = '';\n searchStart = endIdx + closeTag.length;\n } else {\n currentContent += chunk.slice(searchStart, -closeTag.length);\n leftover = chunk.slice(-closeTag.length);\n break;\n }\n }\n }\n }\n } finally {\n closeSync(fd);\n }\n}\n\n/**\n * Synchronously extract a specific image's base64 data from an HTML file by its id.\n * Uses streaming to avoid loading the entire file into memory.\n *\n * @param htmlPath - Absolute path to the HTML file\n * @param imageId - The id of the image to extract\n * @returns The base64 data string, or null if not found\n */\nexport function extractImageByIdSync(\n htmlPath: string,\n imageId: string,\n): string | null {\n const targetTag = `<script type=\"midscene-image\" data-id=\"${imageId}\">`;\n const closeTag = '</script>';\n\n let result: string | null = null;\n\n streamScanTags(htmlPath, targetTag, closeTag, (content) => {\n result = unescapeContent(content);\n return true; // Stop after first match\n });\n\n return result;\n}\n\n/**\n * Stream image script tags from source file directly to output file.\n * Memory usage: O(single_image_size), not O(all_images_size).\n *\n * @param srcFilePath - Source HTML file path\n * @param destFilePath - Destination file path to append to\n */\nexport function streamImageScriptsToFile(\n srcFilePath: string,\n destFilePath: string,\n): void {\n const { appendFileSync } = require('node:fs');\n const openTag = '<script type=\"midscene-image\"';\n const closeTag = '</script>';\n\n streamScanTags(srcFilePath, openTag, closeTag, (content) => {\n // Write complete tag immediately to destination, don't accumulate\n appendFileSync(destFilePath, `${openTag}${content}${closeTag}\\n`);\n return false; // Continue scanning for more tags\n });\n}\n\n/**\n * Extract the LAST dump script content from HTML file using streaming.\n * Memory usage: O(dump_size), not O(file_size).\n *\n * @param filePath - Absolute path to the HTML file\n * @returns The dump script content (trimmed), or empty string if not found\n */\nexport function extractLastDumpScriptSync(filePath: string): string {\n const openTagPrefix = '<script type=\"midscene_web_dump\"';\n const closeTag = '</script>';\n\n let lastContent = '';\n\n // Custom streaming to handle the special case where open tag has variable attributes\n const fd = openSync(filePath, 'r');\n const fileSize = statSync(filePath).size;\n const buffer = Buffer.alloc(STREAMING_CHUNK_SIZE);\n\n let position = 0;\n let leftover = '';\n let capturing = false;\n let currentContent = '';\n\n try {\n while (position < fileSize) {\n const bytesRead = readSync(fd, buffer, 0, STREAMING_CHUNK_SIZE, position);\n const chunk = leftover + buffer.toString('utf-8', 0, bytesRead);\n position += bytesRead;\n\n let searchStart = 0;\n\n while (searchStart < chunk.length) {\n if (!capturing) {\n const startIdx = chunk.indexOf(openTagPrefix, searchStart);\n if (startIdx !== -1) {\n // Find the end of the opening tag (the '>' character)\n const tagEndIdx = chunk.indexOf('>', startIdx);\n if (tagEndIdx !== -1) {\n capturing = true;\n currentContent = chunk.slice(tagEndIdx + 1);\n const endIdx = currentContent.indexOf(closeTag);\n if (endIdx !== -1) {\n lastContent = currentContent.slice(0, endIdx).trim();\n capturing = false;\n currentContent = '';\n searchStart = tagEndIdx + 1 + endIdx + closeTag.length;\n } else {\n leftover = currentContent.slice(-closeTag.length);\n currentContent = currentContent.slice(0, -closeTag.length);\n break;\n }\n } else {\n leftover = chunk.slice(startIdx);\n break;\n }\n } else {\n leftover = chunk.slice(-openTagPrefix.length);\n break;\n }\n } else {\n const endIdx = chunk.indexOf(closeTag, searchStart);\n if (endIdx !== -1) {\n currentContent += chunk.slice(searchStart, endIdx);\n lastContent = currentContent.trim();\n capturing = false;\n currentContent = '';\n searchStart = endIdx + closeTag.length;\n } else {\n currentContent += chunk.slice(searchStart, -closeTag.length);\n leftover = chunk.slice(-closeTag.length);\n break;\n }\n }\n }\n }\n } finally {\n closeSync(fd);\n }\n\n return lastContent;\n}\n\n/**\n * Extract ALL dump script contents from an HTML file using streaming.\n * Each entry includes the full opening tag (for attribute extraction) and the content.\n *\n * @param filePath - Absolute path to the HTML file\n * @returns Array of { openTag, content } for each dump script found\n */\nexport function extractAllDumpScriptsSync(\n filePath: string,\n): { openTag: string; content: string }[] {\n const openTagPrefix = '<script type=\"midscene_web_dump\"';\n const closeTag = '</script>';\n\n const results: { openTag: string; content: string }[] = [];\n\n const fd = openSync(filePath, 'r');\n const fileSize = statSync(filePath).size;\n const buffer = Buffer.alloc(STREAMING_CHUNK_SIZE);\n\n let position = 0;\n let leftover = '';\n let capturing = false;\n let currentContent = '';\n let currentOpenTag = '';\n\n try {\n while (position < fileSize) {\n const bytesRead = readSync(fd, buffer, 0, STREAMING_CHUNK_SIZE, position);\n const chunk = leftover + buffer.toString('utf-8', 0, bytesRead);\n position += bytesRead;\n\n let searchStart = 0;\n\n while (searchStart < chunk.length) {\n if (!capturing) {\n const startIdx = chunk.indexOf(openTagPrefix, searchStart);\n if (startIdx !== -1) {\n const tagEndIdx = chunk.indexOf('>', startIdx);\n if (tagEndIdx !== -1) {\n capturing = true;\n currentOpenTag = chunk.slice(startIdx, tagEndIdx + 1);\n currentContent = chunk.slice(tagEndIdx + 1);\n const endIdx = currentContent.indexOf(closeTag);\n if (endIdx !== -1) {\n results.push({\n openTag: currentOpenTag,\n content: currentContent.slice(0, endIdx).trim(),\n });\n capturing = false;\n currentContent = '';\n currentOpenTag = '';\n searchStart = tagEndIdx + 1 + endIdx + closeTag.length;\n } else {\n leftover = currentContent.slice(-closeTag.length);\n currentContent = currentContent.slice(0, -closeTag.length);\n break;\n }\n } else {\n leftover = chunk.slice(startIdx);\n break;\n }\n } else {\n leftover = chunk.slice(-openTagPrefix.length);\n break;\n }\n } else {\n const endIdx = chunk.indexOf(closeTag, searchStart);\n if (endIdx !== -1) {\n currentContent += chunk.slice(searchStart, endIdx);\n results.push({\n openTag: currentOpenTag,\n content: currentContent.trim(),\n });\n capturing = false;\n currentContent = '';\n currentOpenTag = '';\n searchStart = endIdx + closeTag.length;\n } else {\n currentContent += chunk.slice(searchStart, -closeTag.length);\n leftover = chunk.slice(-closeTag.length);\n break;\n }\n }\n }\n }\n } finally {\n closeSync(fd);\n }\n\n return results;\n}\n\nexport function parseImageScripts(html: string): Record<string, string> {\n const imageMap: Record<string, string> = {};\n const regex =\n /<script type=\"midscene-image\" data-id=\"([^\"]+)\">([\\s\\S]*?)<\\/script>/g;\n\n for (const match of html.matchAll(regex)) {\n const [, id, content] = match;\n imageMap[id] = unescapeContent(content);\n }\n\n return imageMap;\n}\n\nexport function parseDumpScript(html: string): string {\n // Use string search instead of regex to avoid ReDoS vulnerability\n // Find the LAST dump script tag (template may contain similar patterns in bundled JS)\n const scriptOpenTag = '<script type=\"midscene_web_dump\"';\n const scriptCloseTag = '</script>';\n\n // Find the last occurrence of the opening tag\n const lastOpenIndex = html.lastIndexOf(scriptOpenTag);\n if (lastOpenIndex === -1) {\n throw new Error('No dump script found in HTML');\n }\n\n // Find the end of the opening tag (the '>' character)\n const tagEndIndex = html.indexOf('>', lastOpenIndex);\n if (tagEndIndex === -1) {\n throw new Error('No dump script found in HTML');\n }\n\n // Find the closing tag after the opening tag\n const closeIndex = html.indexOf(scriptCloseTag, tagEndIndex);\n if (closeIndex === -1) {\n throw new Error('No dump script found in HTML');\n }\n\n // Extract content between opening and closing tags\n const content = html.substring(tagEndIndex + 1, closeIndex);\n return unescapeContent(content);\n}\n\nexport function parseDumpScriptAttributes(\n html: string,\n): Record<string, string> {\n const regex = /<script type=\"midscene_web_dump\"([^>]*)>/;\n const match = regex.exec(html);\n\n if (!match) {\n return {};\n }\n\n const attrString = match[1];\n const attributes: Record<string, string> = {};\n const attrRegex = /(\\w+)=\"([^\"]*)\"/g;\n\n for (const attrMatch of attrString.matchAll(attrRegex)) {\n const [, key, value] = attrMatch;\n if (key !== 'type') {\n attributes[key] = decodeURIComponent(value);\n }\n }\n\n return attributes;\n}\n\nexport function generateImageScriptTag(id: string, data: string): string {\n // Do not use template string here, will cause bundle error with <script\n return (\n // biome-ignore lint/style/useTemplate: <explanation>\n '<script type=\"midscene-image\" data-id=\"' +\n id +\n '\">' +\n escapeContent(data) +\n '</script>'\n );\n}\n\n/**\n * Inline script that fixes relative URL resolution for directory-mode reports.\n *\n * Problem: when a static server (e.g. `npx serve`) serves `name/index.html`\n * at URL `/name` (without trailing slash), relative paths like\n * `./screenshots/xxx.png` resolve to `/screenshots/xxx.png` instead of\n * `/name/screenshots/xxx.png`.\n *\n * Fix: dynamically insert a <base> tag so relative URLs resolve correctly.\n */\n// Do not use template string here, will cause bundle error with <script\n//\n// The closing </script> tag is built at runtime via scriptClose() so that no\n// bundler (rslib, webpack, rsbuild) can ever see or inline a literal\n// '</script>' into JS source. A literal '</script>' inside a <script> block\n// causes the HTML parser to prematurely close the block — which breaks the\n// report viewer when this module is bundled into the report HTML template.\n//\n// Do NOT replace this with a string constant, hex escape (\\x3c), or simple\n// concatenation — bundlers will optimise / inline them and re-introduce the\n// literal '</script>'.\nlet _baseUrlFixScript: string;\nexport function getBaseUrlFixScript(): string {\n if (!_baseUrlFixScript) {\n // Closing </script> MUST be split so that no bundler (rslib / webpack /\n // terser) can ever produce a literal '</script>' in bundle output.\n // A literal '</script>' inside a <script> block causes the HTML parser\n // to prematurely close the block, which breaks the report viewer when\n // this module is bundled into the report template.\n const close = '</' + 'script>';\n _baseUrlFixScript =\n // biome-ignore lint/style/useTemplate: see above\n '\\n<script>(function(){' +\n 'var p=window.location.pathname;' +\n 'if(p.endsWith(\"/\")||/\\\\.\\\\w+$/.test(p))return;' +\n 'var b=document.createElement(\"base\");' +\n 'b.href=p+\"/\";' +\n 'document.head.insertBefore(b,document.head.firstChild)' +\n '})()' +\n close +\n '\\n';\n }\n return _baseUrlFixScript;\n}\n\nexport function generateDumpScriptTag(\n json: string,\n attributes?: Record<string, string>,\n): string {\n let attrString = '';\n if (attributes && Object.keys(attributes).length > 0) {\n // Do not use template string here, will cause bundle error with <script\n attrString =\n // biome-ignore lint/style/useTemplate: <explanation>\n ' ' +\n Object.entries(attributes)\n // biome-ignore lint/style/useTemplate: <explanation>\n .map(([k, v]) => k + '=\"' + encodeURIComponent(v) + '\"')\n .join(' ');\n }\n\n // Do not use template string here, will cause bundle error with <script\n return (\n // biome-ignore lint/style/useTemplate: <explanation>\n '<script type=\"midscene_web_dump\"' +\n attrString +\n '>' +\n escapeContent(json) +\n '</script>'\n );\n}\n","import { enableDebug } from \"../logger.mjs\";\nimport { getBasicEnvValue } from \"./basic.mjs\";\nimport { MIDSCENE_DEBUG_MODEL_PROFILE, MIDSCENE_DEBUG_MODEL_RESPONSE } from \"./types.mjs\";\nconst initDebugConfig = ()=>{\n const shouldPrintTiming = getBasicEnvValue(MIDSCENE_DEBUG_MODEL_PROFILE);\n let debugConfig = '';\n if (shouldPrintTiming) {\n console.warn('MIDSCENE_DEBUG_MODEL_PROFILE is deprecated, use DEBUG=midscene:ai:profile instead');\n debugConfig = 'ai:profile';\n }\n const shouldPrintModelResponse = getBasicEnvValue(MIDSCENE_DEBUG_MODEL_RESPONSE);\n if (shouldPrintModelResponse) {\n console.warn('MIDSCENE_DEBUG_MODEL_RESPONSE is deprecated, use DEBUG=midscene:ai:response instead');\n debugConfig = debugConfig ? 'ai:*' : 'ai:call';\n }\n if (debugConfig) enableDebug(debugConfig);\n};\nexport { initDebugConfig };\n","import { initDebugConfig } from \"./init-debug.mjs\";\nimport { ALL_ENV_KEYS, BOOLEAN_ENV_KEYS, GLOBAL_ENV_KEYS, MATCH_BY_POSITION, MODEL_ENV_KEYS, NUMBER_ENV_KEYS, STRING_ENV_KEYS } from \"./types.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nclass GlobalConfigManager {\n getAllEnvConfig() {\n const envConfig = ALL_ENV_KEYS.reduce((p, name)=>{\n p[name] = process.env[name];\n return p;\n }, Object.create(null));\n if (!this.override) return envConfig;\n {\n const { newConfig, extendMode } = this.override;\n if (extendMode) return {\n ...envConfig,\n ...newConfig\n };\n return {\n ...newConfig\n };\n }\n }\n getEnvConfigValue(key) {\n const allConfig = this.getAllEnvConfig();\n if (key === MATCH_BY_POSITION) throw new Error('MATCH_BY_POSITION is discarded, use MIDSCENE_MODEL_FAMILY instead');\n if (!STRING_ENV_KEYS.includes(key)) throw new Error(`getEnvConfigValue with key ${key} is not supported.`);\n const value = allConfig[key];\n this.keysHaveBeenRead[key] = true;\n if ('string' == typeof value) return value.trim();\n return value;\n }\n getEnvConfigInBoolean(key) {\n const allConfig = this.getAllEnvConfig();\n if (!BOOLEAN_ENV_KEYS.includes(key)) throw new Error(`getEnvConfigInBoolean with key ${key} is not supported`);\n const value = allConfig[key];\n this.keysHaveBeenRead[key] = true;\n if (!value) return false;\n if (/^(true|1)$/i.test(value)) return true;\n if (/^(false|0)$/i.test(value)) return false;\n return !!value.trim();\n }\n getEnvConfigValueAsNumber(key) {\n if (!STRING_ENV_KEYS.includes(key) && !NUMBER_ENV_KEYS.includes(key)) throw new Error(`getEnvConfigValueAsNumber with key ${key} is not supported.`);\n const allConfig = this.getAllEnvConfig();\n const value = allConfig[key];\n this.keysHaveBeenRead[key] = true;\n if ('string' != typeof value) return;\n const trimmed = value.trim();\n if (!trimmed) return;\n const numValue = Number(trimmed);\n return Number.isNaN(numValue) ? void 0 : numValue;\n }\n registerModelConfigManager(globalModelConfigManager) {\n this.globalModelConfigManager = globalModelConfigManager;\n }\n overrideAIConfig(newConfig, extendMode = false) {\n for(const key in newConfig){\n if (![\n ...GLOBAL_ENV_KEYS,\n ...MODEL_ENV_KEYS\n ].includes(key)) throw new Error(`Failed to override AI config, invalid key: ${key}`);\n const value = newConfig[key];\n if ('string' != typeof value) throw new Error(`Failed to override AI config, value for key ${key} must be a string, but got with type ${typeof value}`);\n if (this.keysHaveBeenRead[key]) console.warn(`Warning: try to override AI config with key ${key} ,but it has been read.`);\n }\n const savedNewConfig = extendMode ? {\n ...this.override?.newConfig,\n ...newConfig\n } : newConfig;\n this.override = {\n newConfig: {\n ...savedNewConfig\n },\n extendMode\n };\n if (!this.globalModelConfigManager) throw new Error('globalModelConfigManager is not registered, which should not happen');\n this.globalModelConfigManager.clearModelConfigMap();\n }\n constructor(){\n _define_property(this, \"override\", void 0);\n _define_property(this, \"keysHaveBeenRead\", {});\n _define_property(this, \"globalModelConfigManager\", void 0);\n initDebugConfig();\n }\n}\nexport { GlobalConfigManager };\n","import { MIDSCENE_INSIGHT_MODEL_API_KEY, MIDSCENE_INSIGHT_MODEL_BASE_URL, MIDSCENE_INSIGHT_MODEL_EXTRA_BODY_JSON, MIDSCENE_INSIGHT_MODEL_FAMILY, MIDSCENE_INSIGHT_MODEL_HTTP_PROXY, MIDSCENE_INSIGHT_MODEL_INIT_CONFIG_JSON, MIDSCENE_INSIGHT_MODEL_NAME, MIDSCENE_INSIGHT_MODEL_REASONING_BUDGET, MIDSCENE_INSIGHT_MODEL_REASONING_EFFORT, MIDSCENE_INSIGHT_MODEL_REASONING_ENABLED, MIDSCENE_INSIGHT_MODEL_RETRY_COUNT, MIDSCENE_INSIGHT_MODEL_RETRY_INTERVAL, MIDSCENE_INSIGHT_MODEL_SOCKS_PROXY, MIDSCENE_INSIGHT_MODEL_TEMPERATURE, MIDSCENE_INSIGHT_MODEL_TIMEOUT, MIDSCENE_MODEL_API_KEY, MIDSCENE_MODEL_BASE_URL, MIDSCENE_MODEL_EXTRA_BODY_JSON, MIDSCENE_MODEL_FAMILY, MIDSCENE_MODEL_HTTP_PROXY, MIDSCENE_MODEL_INIT_CONFIG_JSON, MIDSCENE_MODEL_NAME, MIDSCENE_MODEL_REASONING_BUDGET, MIDSCENE_MODEL_REASONING_EFFORT, MIDSCENE_MODEL_REASONING_ENABLED, MIDSCENE_MODEL_RETRY_COUNT, MIDSCENE_MODEL_RETRY_INTERVAL, MIDSCENE_MODEL_SOCKS_PROXY, MIDSCENE_MODEL_TEMPERATURE, MIDSCENE_MODEL_TIMEOUT, MIDSCENE_OPENAI_HTTP_PROXY, MIDSCENE_OPENAI_INIT_CONFIG_JSON, MIDSCENE_OPENAI_SOCKS_PROXY, MIDSCENE_PLANNING_MODEL_API_KEY, MIDSCENE_PLANNING_MODEL_BASE_URL, MIDSCENE_PLANNING_MODEL_EXTRA_BODY_JSON, MIDSCENE_PLANNING_MODEL_FAMILY, MIDSCENE_PLANNING_MODEL_HTTP_PROXY, MIDSCENE_PLANNING_MODEL_INIT_CONFIG_JSON, MIDSCENE_PLANNING_MODEL_NAME, MIDSCENE_PLANNING_MODEL_REASONING_BUDGET, MIDSCENE_PLANNING_MODEL_REASONING_EFFORT, MIDSCENE_PLANNING_MODEL_REASONING_ENABLED, MIDSCENE_PLANNING_MODEL_RETRY_COUNT, MIDSCENE_PLANNING_MODEL_RETRY_INTERVAL, MIDSCENE_PLANNING_MODEL_SOCKS_PROXY, MIDSCENE_PLANNING_MODEL_TEMPERATURE, MIDSCENE_PLANNING_MODEL_TIMEOUT, OPENAI_API_KEY, OPENAI_BASE_URL } from \"./types.mjs\";\nconst INSIGHT_MODEL_CONFIG_KEYS = {\n modelName: MIDSCENE_INSIGHT_MODEL_NAME,\n socksProxy: MIDSCENE_INSIGHT_MODEL_SOCKS_PROXY,\n httpProxy: MIDSCENE_INSIGHT_MODEL_HTTP_PROXY,\n openaiBaseURL: MIDSCENE_INSIGHT_MODEL_BASE_URL,\n openaiApiKey: MIDSCENE_INSIGHT_MODEL_API_KEY,\n openaiExtraConfig: MIDSCENE_INSIGHT_MODEL_INIT_CONFIG_JSON,\n extraBody: MIDSCENE_INSIGHT_MODEL_EXTRA_BODY_JSON,\n modelFamily: MIDSCENE_INSIGHT_MODEL_FAMILY,\n timeout: MIDSCENE_INSIGHT_MODEL_TIMEOUT,\n temperature: MIDSCENE_INSIGHT_MODEL_TEMPERATURE,\n retryCount: MIDSCENE_INSIGHT_MODEL_RETRY_COUNT,\n retryInterval: MIDSCENE_INSIGHT_MODEL_RETRY_INTERVAL,\n reasoningEffort: MIDSCENE_INSIGHT_MODEL_REASONING_EFFORT,\n reasoningEnabled: MIDSCENE_INSIGHT_MODEL_REASONING_ENABLED,\n reasoningBudget: MIDSCENE_INSIGHT_MODEL_REASONING_BUDGET\n};\nconst PLANNING_MODEL_CONFIG_KEYS = {\n modelName: MIDSCENE_PLANNING_MODEL_NAME,\n socksProxy: MIDSCENE_PLANNING_MODEL_SOCKS_PROXY,\n httpProxy: MIDSCENE_PLANNING_MODEL_HTTP_PROXY,\n openaiBaseURL: MIDSCENE_PLANNING_MODEL_BASE_URL,\n openaiApiKey: MIDSCENE_PLANNING_MODEL_API_KEY,\n openaiExtraConfig: MIDSCENE_PLANNING_MODEL_INIT_CONFIG_JSON,\n extraBody: MIDSCENE_PLANNING_MODEL_EXTRA_BODY_JSON,\n modelFamily: MIDSCENE_PLANNING_MODEL_FAMILY,\n timeout: MIDSCENE_PLANNING_MODEL_TIMEOUT,\n temperature: MIDSCENE_PLANNING_MODEL_TEMPERATURE,\n retryCount: MIDSCENE_PLANNING_MODEL_RETRY_COUNT,\n retryInterval: MIDSCENE_PLANNING_MODEL_RETRY_INTERVAL,\n reasoningEffort: MIDSCENE_PLANNING_MODEL_REASONING_EFFORT,\n reasoningEnabled: MIDSCENE_PLANNING_MODEL_REASONING_ENABLED,\n reasoningBudget: MIDSCENE_PLANNING_MODEL_REASONING_BUDGET\n};\nconst DEFAULT_MODEL_CONFIG_KEYS = {\n modelName: MIDSCENE_MODEL_NAME,\n socksProxy: MIDSCENE_MODEL_SOCKS_PROXY,\n httpProxy: MIDSCENE_MODEL_HTTP_PROXY,\n openaiBaseURL: MIDSCENE_MODEL_BASE_URL,\n openaiApiKey: MIDSCENE_MODEL_API_KEY,\n openaiExtraConfig: MIDSCENE_MODEL_INIT_CONFIG_JSON,\n extraBody: MIDSCENE_MODEL_EXTRA_BODY_JSON,\n modelFamily: MIDSCENE_MODEL_FAMILY,\n timeout: MIDSCENE_MODEL_TIMEOUT,\n temperature: MIDSCENE_MODEL_TEMPERATURE,\n retryCount: MIDSCENE_MODEL_RETRY_COUNT,\n retryInterval: MIDSCENE_MODEL_RETRY_INTERVAL,\n reasoningEffort: MIDSCENE_MODEL_REASONING_EFFORT,\n reasoningEnabled: MIDSCENE_MODEL_REASONING_ENABLED,\n reasoningBudget: MIDSCENE_MODEL_REASONING_BUDGET\n};\nconst DEFAULT_MODEL_CONFIG_KEYS_LEGACY = {\n modelName: MIDSCENE_MODEL_NAME,\n socksProxy: MIDSCENE_OPENAI_SOCKS_PROXY,\n httpProxy: MIDSCENE_OPENAI_HTTP_PROXY,\n openaiBaseURL: OPENAI_BASE_URL,\n openaiApiKey: OPENAI_API_KEY,\n openaiExtraConfig: MIDSCENE_OPENAI_INIT_CONFIG_JSON,\n extraBody: MIDSCENE_MODEL_EXTRA_BODY_JSON,\n modelFamily: 'DEFAULT_MODEL_CONFIG_KEYS has no modelFamily key',\n timeout: MIDSCENE_MODEL_TIMEOUT,\n temperature: MIDSCENE_MODEL_TEMPERATURE,\n retryCount: MIDSCENE_MODEL_RETRY_COUNT,\n retryInterval: MIDSCENE_MODEL_RETRY_INTERVAL,\n reasoningEffort: MIDSCENE_MODEL_REASONING_EFFORT,\n reasoningEnabled: MIDSCENE_MODEL_REASONING_ENABLED,\n reasoningBudget: MIDSCENE_MODEL_REASONING_BUDGET\n};\nexport { DEFAULT_MODEL_CONFIG_KEYS, DEFAULT_MODEL_CONFIG_KEYS_LEGACY, INSIGHT_MODEL_CONFIG_KEYS, PLANNING_MODEL_CONFIG_KEYS };\n","const maskKey = (key, maskChar = '*')=>{\n if ('string' != typeof key || 0 === key.length) return key;\n const prefixLen = 3;\n const suffixLen = 3;\n const keepLength = prefixLen + suffixLen;\n if (key.length <= keepLength) return key;\n const prefix = key.substring(0, prefixLen);\n const suffix = key.substring(key.length - suffixLen);\n const maskLength = key.length - keepLength;\n const mask = maskChar.repeat(maskLength);\n return `${prefix}${mask}${suffix}`;\n};\nconst maskConfig = (config)=>Object.fromEntries(Object.entries(config).map(([key, value])=>{\n if (!value) return [\n key,\n value\n ];\n if ('string' == typeof value && /key/i.test(key)) return [\n key,\n maskKey(value)\n ];\n if ('object' == typeof value) {\n const valueStr = JSON.stringify(value);\n if (/key/i.test(valueStr)) return [\n key,\n maskKey(valueStr)\n ];\n }\n return [\n key,\n value\n ];\n }));\nconst parseJson = (key, value)=>{\n if (value) try {\n return JSON.parse(value);\n } catch (e) {\n throw new Error(`Failed to parse ${key} as a JSON. ${e.message}`, {\n cause: e\n });\n }\n};\nexport { maskConfig, parseJson };\n","import { DEFAULT_MODEL_CONFIG_KEYS, INSIGHT_MODEL_CONFIG_KEYS, PLANNING_MODEL_CONFIG_KEYS } from \"./constants.mjs\";\nimport { MIDSCENE_OPENAI_HTTP_PROXY, MIDSCENE_OPENAI_INIT_CONFIG_JSON, MIDSCENE_OPENAI_SOCKS_PROXY, MIDSCENE_USE_DOUBAO_VISION, MIDSCENE_USE_GEMINI, MIDSCENE_USE_QWEN3_VL, MIDSCENE_USE_QWEN_VL, MIDSCENE_USE_VLM_UI_TARS, MODEL_FAMILY_VALUES, OPENAI_API_KEY, OPENAI_BASE_URL, UITarsModelVersion } from \"./types.mjs\";\nimport { getDebug } from \"../logger.mjs\";\nimport { assert } from \"../utils.mjs\";\nimport { maskConfig, parseJson } from \"./helper.mjs\";\nimport { initDebugConfig } from \"./init-debug.mjs\";\nconst KEYS_MAP = {\n insight: INSIGHT_MODEL_CONFIG_KEYS,\n planning: PLANNING_MODEL_CONFIG_KEYS,\n default: DEFAULT_MODEL_CONFIG_KEYS\n};\nconst getUITarsModelVersion = (modelFamily)=>{\n if ('vlm-ui-tars' === modelFamily) return UITarsModelVersion.V1_0;\n if ('vlm-ui-tars-doubao' === modelFamily || 'vlm-ui-tars-doubao-1.5' === modelFamily) return UITarsModelVersion.DOUBAO_1_5_20B;\n};\nconst validateModelFamily = (modelFamily)=>{\n if (modelFamily && !MODEL_FAMILY_VALUES.includes(modelFamily)) throw new Error(`Invalid MIDSCENE_MODEL_FAMILY value: ${modelFamily}`);\n};\nconst legacyConfigToModelFamily = (provider)=>{\n const isDoubao = provider[MIDSCENE_USE_DOUBAO_VISION];\n const isQwen = provider[MIDSCENE_USE_QWEN_VL];\n const isQwen3 = provider[MIDSCENE_USE_QWEN3_VL];\n const isUiTars = provider[MIDSCENE_USE_VLM_UI_TARS];\n const isGemini = provider[MIDSCENE_USE_GEMINI];\n const enabledModes = [\n isDoubao && MIDSCENE_USE_DOUBAO_VISION,\n isQwen && MIDSCENE_USE_QWEN_VL,\n isQwen3 && MIDSCENE_USE_QWEN3_VL,\n isUiTars && MIDSCENE_USE_VLM_UI_TARS,\n isGemini && MIDSCENE_USE_GEMINI\n ].filter(Boolean);\n if (enabledModes.length > 1) throw new Error(`Only one vision mode can be enabled at a time. Currently enabled modes: ${enabledModes.join(', ')}. Please disable all but one mode.`);\n if (isQwen3) return 'qwen3-vl';\n if (isQwen) return 'qwen2.5-vl';\n if (isDoubao) return 'doubao-vision';\n if (isGemini) return 'gemini';\n if (isUiTars) if ('1' === isUiTars) return 'vlm-ui-tars';\n else if ('DOUBAO' === isUiTars || 'DOUBAO-1.5' === isUiTars) return 'vlm-ui-tars-doubao-1.5';\n else return 'vlm-ui-tars-doubao';\n};\nconst getModelDescription = (modelFamily, uiTarsModelVersion)=>{\n if (uiTarsModelVersion) return `UI-TARS=${uiTarsModelVersion}`;\n if (modelFamily) return `${modelFamily} mode`;\n return '';\n};\nconst parseOpenaiSdkConfig = ({ keys, provider, useLegacyLogic = false })=>{\n initDebugConfig();\n const debugLog = getDebug('ai:config');\n debugLog('enter parseOpenaiSdkConfig with keys:', keys);\n const legacyAPIKey = useLegacyLogic ? provider[OPENAI_API_KEY] : void 0;\n const legacyBaseURL = useLegacyLogic ? provider[OPENAI_BASE_URL] : void 0;\n const legacySocksProxy = useLegacyLogic ? provider[MIDSCENE_OPENAI_SOCKS_PROXY] : void 0;\n const legacyHttpProxy = useLegacyLogic ? provider[MIDSCENE_OPENAI_HTTP_PROXY] : void 0;\n const legacyOpenaiExtraConfig = useLegacyLogic ? provider[MIDSCENE_OPENAI_INIT_CONFIG_JSON] : void 0;\n const legacyModelFamily = useLegacyLogic ? legacyConfigToModelFamily(provider) : void 0;\n const modelFamilyRaw = provider[keys.modelFamily] || legacyModelFamily;\n const openaiApiKey = provider[keys.openaiApiKey] || legacyAPIKey;\n const openaiBaseURL = provider[keys.openaiBaseURL] || legacyBaseURL;\n const socksProxy = provider[keys.socksProxy] || legacySocksProxy;\n const httpProxy = provider[keys.httpProxy] || legacyHttpProxy;\n const modelName = provider[keys.modelName];\n const openaiExtraConfigStr = provider[keys.openaiExtraConfig];\n const openaiExtraConfig = parseJson(keys.openaiExtraConfig, openaiExtraConfigStr || legacyOpenaiExtraConfig);\n const extraBodyStr = provider[keys.extraBody];\n const extraBody = parseJson(keys.extraBody, extraBodyStr);\n const temperature = provider[keys.temperature] ? Number(provider[keys.temperature]) : 0;\n const modelFamily = modelFamilyRaw;\n validateModelFamily(modelFamily);\n const uiTarsModelVersion = getUITarsModelVersion(modelFamily);\n const modelDescription = getModelDescription(modelFamily, uiTarsModelVersion);\n return {\n socksProxy,\n httpProxy,\n openaiBaseURL,\n openaiApiKey,\n openaiExtraConfig,\n extraBody,\n modelFamily,\n uiTarsModelVersion,\n modelName: modelName,\n modelDescription,\n intent: '-',\n timeout: provider[keys.timeout] ? Number(provider[keys.timeout]) : void 0,\n temperature,\n retryCount: (()=>{\n if (!provider[keys.retryCount]) return 1;\n const val = Number(provider[keys.retryCount]);\n if (!Number.isFinite(val)) return 1;\n if (val < 0) throw new Error(`${keys.retryCount} must be non-negative, got ${val}`);\n return val;\n })(),\n retryInterval: (()=>{\n if (!provider[keys.retryInterval]) return 2000;\n const val = Number(provider[keys.retryInterval]);\n if (!Number.isFinite(val)) return 2000;\n if (val < 0) throw new Error(`${keys.retryInterval} must be non-negative, got ${val}`);\n return val;\n })(),\n reasoningEffort: provider[keys.reasoningEffort]?.trim() || void 0,\n reasoningEnabled: (()=>{\n const val = provider[keys.reasoningEnabled]?.trim()?.toLowerCase();\n if ('true' === val || '1' === val) return true;\n if ('false' === val || '0' === val) return false;\n })(),\n reasoningBudget: (()=>{\n const val = provider[keys.reasoningBudget]?.trim();\n if (!val) return;\n const num = Number(val);\n return Number.isFinite(num) ? num : void 0;\n })()\n };\n};\nconst decideModelConfigFromIntentConfig = (intent, configMap)=>{\n const debugLog = getDebug('ai:config');\n debugLog('will decideModelConfig base on agent.modelConfig()', intent, maskConfig(configMap));\n const keysForFn = KEYS_MAP[intent];\n const modelName = configMap[keysForFn.modelName];\n if (!modelName) return void debugLog('no modelName found for intent', intent);\n const finalResult = parseOpenaiSdkConfig({\n keys: keysForFn,\n provider: configMap,\n useLegacyLogic: 'default' === intent\n });\n finalResult.intent = intent;\n debugLog('decideModelConfig result by agent.modelConfig() with intent', intent, maskConfig({\n ...finalResult\n }));\n assert(finalResult.openaiBaseURL, `failed to get base URL of model (intent=${intent}). See https://midscenejs.com/model-strategy`);\n if (!finalResult.modelName) console.warn(`modelName is not set for intent ${intent}, this may cause unexpected behavior. See https://midscenejs.com/model-strategy`);\n return finalResult;\n};\nexport { decideModelConfigFromIntentConfig, getUITarsModelVersion, legacyConfigToModelFamily, parseOpenaiSdkConfig, validateModelFamily };\n","import { decideModelConfigFromIntentConfig } from \"./parse-model-config.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nclass ModelConfigManager {\n initialize() {\n if (this.isInitialized) return;\n let configMap;\n if (this.modelConfig) {\n this.isolatedMode = true;\n configMap = this.normalizeModelConfig(this.modelConfig);\n } else configMap = this.globalConfigManager?.getAllEnvConfig() || {};\n const defaultConfig = decideModelConfigFromIntentConfig('default', configMap);\n if (!defaultConfig) throw new Error('Model configuration is incomplete: model name (MIDSCENE_MODEL_NAME) is required. See https://midscenejs.com/model-strategy.html');\n const insightConfig = decideModelConfigFromIntentConfig('insight', configMap);\n const planningConfig = decideModelConfigFromIntentConfig('planning', configMap);\n this.modelConfigMap = {\n default: {\n ...defaultConfig,\n createOpenAIClient: this.createOpenAIClientFn\n },\n insight: {\n ...insightConfig || defaultConfig,\n createOpenAIClient: this.createOpenAIClientFn\n },\n planning: {\n ...planningConfig || defaultConfig,\n createOpenAIClient: this.createOpenAIClientFn\n }\n };\n this.isInitialized = true;\n }\n normalizeModelConfig(config) {\n return Object.entries(config).reduce((acc, [key, value])=>{\n if (null == value) return acc;\n acc[key] = String(value);\n return acc;\n }, Object.create(null));\n }\n clearModelConfigMap() {\n if (this.isolatedMode) throw new Error('ModelConfigManager work in isolated mode, so clearModelConfigMap should not be called');\n this.isInitialized = false;\n }\n getModelConfig(intent) {\n if (!this.isInitialized) this.initialize();\n if (!this.modelConfigMap) throw new Error('modelConfigMap is not initialized, which should not happen');\n return this.modelConfigMap[intent];\n }\n getUploadTestServerUrl() {\n const { openaiExtraConfig } = this.getModelConfig('default');\n const serverUrl = openaiExtraConfig?.REPORT_SERVER_URL;\n return serverUrl;\n }\n registerGlobalConfigManager(globalConfigManager) {\n this.globalConfigManager = globalConfigManager;\n }\n throwErrorIfNonVLModel() {\n const modelConfig = this.getModelConfig('default');\n if (!modelConfig.modelFamily) throw new Error('MIDSCENE_MODEL_FAMILY is not set to a visual language model (VL model), the element localization can not be achieved. Check your model configuration. See https://midscenejs.com/model-strategy.html');\n }\n constructor(modelConfig, createOpenAIClientFn){\n _define_property(this, \"modelConfigMap\", void 0);\n _define_property(this, \"isInitialized\", false);\n _define_property(this, \"isolatedMode\", false);\n _define_property(this, \"globalConfigManager\", void 0);\n _define_property(this, \"modelConfig\", void 0);\n _define_property(this, \"createOpenAIClientFn\", void 0);\n this.modelConfig = modelConfig;\n this.createOpenAIClientFn = createOpenAIClientFn;\n }\n}\nexport { ModelConfigManager };\n","import { GlobalConfigManager } from \"./global-config-manager.mjs\";\nimport { ModelConfigManager } from \"./model-config-manager.mjs\";\nimport { MIDSCENE_PREFERRED_LANGUAGE } from \"./types.mjs\";\nconst globalModelConfigManager = new ModelConfigManager();\nconst globalConfigManager = new GlobalConfigManager();\nglobalConfigManager.registerModelConfigManager(globalModelConfigManager);\nglobalModelConfigManager.registerGlobalConfigManager(globalConfigManager);\nasync function getCurrentTime(device, useDeviceTimestamp) {\n if (useDeviceTimestamp && device?.getTimestamp) try {\n return await device.getTimestamp();\n } catch (error) {\n console.warn(`Failed to get device time, falling back to system time: ${error}`);\n }\n return Date.now();\n}\nconst getPreferredLanguage = ()=>{\n const prefer = globalConfigManager.getEnvConfigValue(MIDSCENE_PREFERRED_LANGUAGE);\n if (prefer) return prefer;\n const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const isChina = 'Asia/Shanghai' === timeZone;\n return isChina ? 'Chinese' : 'English';\n};\nconst overrideAIConfig = (newConfig, extendMode = false)=>{\n globalConfigManager.overrideAIConfig(newConfig, extendMode);\n};\nexport { getCurrentTime, getPreferredLanguage, globalConfigManager, globalModelConfigManager, overrideAIConfig };\n","import type { TModelFamily } from '@midscene/shared/env';\n\n/**\n * Check if the modelFamily is auto-glm or auto-glm-multilingual\n * @param modelFamily The model family to check\n * @returns true if modelFamily is auto-glm or auto-glm-multilingual\n */\nexport function isAutoGLM(modelFamily: TModelFamily | undefined): boolean {\n return modelFamily === 'auto-glm' || modelFamily === 'auto-glm-multilingual';\n}\n\n/**\n * Check if the modelFamily is a UI-TARS variant\n * @param modelFamily The model family to check\n * @returns true if modelFamily is any UI-TARS variant\n */\nexport function isUITars(modelFamily: TModelFamily | undefined): boolean {\n return (\n modelFamily === 'vlm-ui-tars' ||\n modelFamily === 'vlm-ui-tars-doubao' ||\n modelFamily === 'vlm-ui-tars-doubao-1.5'\n );\n}\n","import type {\n AIUsageInfo,\n CodeGenerationChunk,\n DeepThinkOption,\n StreamingCallback,\n} from '@/types';\nimport type { IModelConfig } from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { ifInBrowser } from '@midscene/shared/utils';\nimport type { ChatCompletionMessageParam } from 'openai/resources/index';\n\nconst CODEX_PROVIDER_SCHEME = 'codex://';\nconst CODEX_DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;\nconst CODEX_DEFAULT_PROCESS_START_TIMEOUT_MS = 15 * 1000;\nconst CODEX_DEFAULT_CLEANUP_TIMEOUT_MS = 8 * 1000;\nconst CODEX_TEXT_INPUT_MAX_LENGTH = 256 * 1024;\n\nconst debugCodex = getDebug('ai:call:codex');\nconst warnCodex = getDebug('ai:call:codex', { console: true });\n\ntype CodexReasoningEffort = 'low' | 'medium' | 'high' | 'xhigh';\n\ntype JsonRpcRequest = {\n id: string | number;\n method: string;\n params?: unknown;\n};\n\ntype JsonRpcResponse = {\n id: string | number;\n result?: unknown;\n error?: {\n code?: number;\n message?: string;\n data?: unknown;\n };\n};\n\ntype JsonRpcNotification = {\n method: string;\n params?: Record<string, any>;\n};\n\ntype JsonRpcMessage = JsonRpcRequest | JsonRpcResponse | JsonRpcNotification;\n\ntype CodexTextInput = {\n type: 'text';\n text: string;\n text_elements: any[];\n};\n\ntype CodexImageInput = {\n type: 'image';\n url: string;\n};\n\ntype CodexLocalImageInput = {\n type: 'localImage';\n path: string;\n};\n\ntype CodexTurnInput = CodexTextInput | CodexImageInput | CodexLocalImageInput;\n\ntype CodexTurnResult = {\n content: string;\n reasoning_content?: string;\n usage?: AIUsageInfo;\n isStreamed: boolean;\n};\n\ntype CodexTurnStartResponse = {\n turn?: {\n id?: string;\n };\n};\n\ntype CodexThreadStartResponse = {\n thread?: {\n id?: string;\n };\n};\n\ntype CodexUsageNotification = {\n threadId?: string;\n turnId?: string;\n tokenUsage?: {\n total?: {\n totalTokens?: number;\n inputTokens?: number;\n cachedInputTokens?: number;\n outputTokens?: number;\n reasoningOutputTokens?: number;\n };\n last?: {\n totalTokens?: number;\n inputTokens?: number;\n cachedInputTokens?: number;\n outputTokens?: number;\n reasoningOutputTokens?: number;\n };\n };\n};\n\nclass SerializedRunner {\n private tail: Promise<void> = Promise.resolve();\n\n async run<T>(work: () => Promise<T>): Promise<T> {\n const previous = this.tail;\n let release!: () => void;\n this.tail = new Promise<void>((resolve) => {\n release = resolve;\n });\n\n await previous;\n try {\n return await work();\n } finally {\n release();\n }\n }\n}\n\nexport const isCodexAppServerProvider = (baseURL?: string): boolean => {\n if (!baseURL) return false;\n return baseURL.trim().toLowerCase().startsWith(CODEX_PROVIDER_SCHEME);\n};\n\nconst isAbortError = (error: unknown): boolean => {\n if (!error) return false;\n if (error instanceof Error && error.name === 'AbortError') return true;\n const message =\n error instanceof Error ? error.message : String(error ?? 'unknown error');\n return /aborted|abort/i.test(message);\n};\n\nconst toNonEmptyString = (value: unknown): string | undefined => {\n if (typeof value !== 'string') return undefined;\n const trimmed = value.trim();\n return trimmed || undefined;\n};\n\nexport const normalizeCodexLocalImagePath = (\n imageUrl: string,\n platform: NodeJS.Platform = process.platform,\n): string => {\n if (!imageUrl.startsWith('file://')) {\n return imageUrl;\n }\n\n try {\n const parsed = new URL(imageUrl);\n const pathname = decodeURIComponent(parsed.pathname);\n const host = parsed.hostname.toLowerCase();\n\n if (platform === 'win32') {\n const windowsPath = pathname\n .replace(/\\//g, '\\\\')\n .replace(/^\\\\([A-Za-z]:)/, '$1');\n\n if (host && host !== 'localhost') {\n return `\\\\\\\\${parsed.hostname}${windowsPath}`;\n }\n\n return windowsPath;\n }\n\n if (host && host !== 'localhost') {\n return `//${parsed.hostname}${pathname}`;\n }\n\n return pathname;\n } catch {\n return decodeURIComponent(imageUrl.slice('file://'.length));\n }\n};\n\nconst extractTextFromMessage = (\n message: ChatCompletionMessageParam,\n): string => {\n const content = (message as any).content;\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n return content\n .map((part) => {\n if (!part || typeof part !== 'object') return '';\n\n if (part.type === 'text' && typeof part.text === 'string') {\n return part.text;\n }\n\n if (part.type === 'input_text' && typeof part.text === 'string') {\n return part.text;\n }\n\n return '';\n })\n .filter(Boolean)\n .join('\\n');\n }\n\n return '';\n};\n\nconst extractImageInputs = (\n message: ChatCompletionMessageParam,\n): Array<CodexImageInput | CodexLocalImageInput> => {\n const content = (message as any).content;\n if (!Array.isArray(content)) return [];\n\n const inputs: Array<CodexImageInput | CodexLocalImageInput> = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') continue;\n\n const partType = String(part.type || '');\n const imageUrl =\n partType === 'image_url'\n ? toNonEmptyString(part.image_url?.url)\n : partType === 'input_image'\n ? toNonEmptyString(part.image_url || part.url)\n : undefined;\n\n if (!imageUrl) continue;\n\n if (\n imageUrl.startsWith('/') ||\n imageUrl.startsWith('./') ||\n imageUrl.startsWith('../') ||\n imageUrl.startsWith('file://')\n ) {\n const path = imageUrl.startsWith('file://')\n ? normalizeCodexLocalImagePath(imageUrl)\n : imageUrl;\n\n inputs.push({\n type: 'localImage',\n path,\n });\n continue;\n }\n\n inputs.push({\n type: 'image',\n url: imageUrl,\n });\n }\n\n return inputs;\n};\n\nexport const resolveCodexReasoningEffort = ({\n deepThink,\n modelConfig,\n}: {\n deepThink?: DeepThinkOption;\n modelConfig: IModelConfig;\n}): CodexReasoningEffort | undefined => {\n if (deepThink === true) return 'high';\n if (deepThink === false) return 'low';\n\n const normalized = modelConfig.reasoningEffort?.trim().toLowerCase();\n if (\n normalized === 'low' ||\n normalized === 'medium' ||\n normalized === 'high' ||\n normalized === 'xhigh'\n ) {\n return normalized;\n }\n\n if (modelConfig.reasoningEnabled === true) return 'high';\n if (modelConfig.reasoningEnabled === false) return 'low';\n\n return undefined;\n};\n\nexport const buildCodexTurnPayloadFromMessages = (\n messages: ChatCompletionMessageParam[],\n): {\n developerInstructions?: string;\n input: CodexTurnInput[];\n} => {\n const developerInstructionParts: string[] = [];\n const transcriptParts: string[] = [];\n const imageInputs: Array<CodexImageInput | CodexLocalImageInput> = [];\n\n for (const message of messages) {\n const role = String((message as any).role || 'user');\n const text = extractTextFromMessage(message);\n\n if (role === 'system') {\n if (text.trim()) developerInstructionParts.push(text.trim());\n continue;\n }\n\n const roleTag = role.toUpperCase();\n if (text.trim()) {\n transcriptParts.push(`[${roleTag}]\\n${text.trim()}`);\n } else {\n transcriptParts.push(`[${roleTag}]\\n(no text content)`);\n }\n\n if (role === 'user') {\n imageInputs.push(...extractImageInputs(message));\n }\n }\n\n const fullTranscript = transcriptParts.join('\\n\\n');\n const transcriptText =\n (fullTranscript.length > CODEX_TEXT_INPUT_MAX_LENGTH\n ? fullTranscript.slice(-CODEX_TEXT_INPUT_MAX_LENGTH)\n : fullTranscript) || 'Please answer the latest user request.';\n\n const input: CodexTurnInput[] = [\n {\n type: 'text',\n text: transcriptText,\n text_elements: [],\n },\n ...imageInputs,\n ];\n\n const developerInstructions = developerInstructionParts.length\n ? developerInstructionParts.join('\\n\\n')\n : undefined;\n\n return {\n developerInstructions,\n input,\n };\n};\n\nclass CodexAppServerConnection {\n private child: any;\n private lineReader: any;\n private pendingMessages: JsonRpcMessage[] = [];\n private lineBuffer: string[] = [];\n private nextRequestId = 1;\n private closed = false;\n private lastExitCode: number | null = null;\n private processErrorMessage: string | null = null;\n private stderrBuffer = '';\n\n private constructor(child: any, lineReader: any) {\n this.child = child;\n this.lineReader = lineReader;\n }\n\n static async create(): Promise<CodexAppServerConnection> {\n if (ifInBrowser) {\n throw new Error(\n 'codex app-server provider is not supported in browser runtime',\n );\n }\n\n const childProcessModuleName = 'node:child_process';\n const readlineModuleName = 'node:readline';\n const { spawn } = await import(childProcessModuleName);\n const readline = await import(readlineModuleName);\n\n const child = spawn('codex', ['app-server'], {\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n if (!child.stdin || !child.stdout || !child.stderr) {\n throw new Error('failed to start codex app-server: stdio unavailable');\n }\n\n const lineReader = readline.createInterface({\n input: child.stdout,\n crlfDelay: Number.POSITIVE_INFINITY,\n });\n const connection = new CodexAppServerConnection(child, lineReader);\n connection.detachFromEventLoop();\n connection.attachProcessListeners();\n await connection.initializeHandshake();\n\n return connection;\n }\n\n isClosed(): boolean {\n return this.closed;\n }\n\n async runTurn({\n messages,\n modelConfig,\n stream,\n onChunk,\n deepThink,\n abortSignal,\n }: {\n messages: ChatCompletionMessageParam[];\n modelConfig: IModelConfig;\n stream?: boolean;\n onChunk?: StreamingCallback;\n deepThink?: DeepThinkOption;\n abortSignal?: AbortSignal;\n }): Promise<CodexTurnResult> {\n const startTime = Date.now();\n const timeoutMs = modelConfig.timeout || CODEX_DEFAULT_TIMEOUT_MS;\n const deadlineAt = Date.now() + timeoutMs;\n const isStreaming = !!(stream && onChunk);\n\n const { developerInstructions, input } =\n buildCodexTurnPayloadFromMessages(messages);\n const effort = resolveCodexReasoningEffort({ deepThink, modelConfig });\n\n let threadId: string | undefined;\n let turnId: string | undefined;\n let latestErrorMessage: string | undefined;\n let accumulatedText = '';\n let accumulatedReasoning = '';\n let latestUsage: AIUsageInfo | undefined;\n\n const emitChunk = ({\n content,\n reasoning,\n isComplete,\n usage,\n }: {\n content: string;\n reasoning: string;\n isComplete: boolean;\n usage?: AIUsageInfo;\n }) => {\n if (!isStreaming || !onChunk) return;\n const chunk: CodeGenerationChunk = {\n content,\n reasoning_content: reasoning,\n accumulated: accumulatedText,\n isComplete,\n usage,\n };\n onChunk(chunk);\n };\n\n try {\n const threadStartResponse = await this.request<CodexThreadStartResponse>({\n method: 'thread/start',\n params: {\n model: modelConfig.modelName,\n cwd: process.cwd(),\n approvalPolicy: 'never',\n sandbox: 'read-only',\n ephemeral: true,\n experimentalRawEvents: false,\n persistExtendedHistory: false,\n developerInstructions: developerInstructions || null,\n },\n deadlineAt,\n abortSignal,\n });\n\n threadId = threadStartResponse?.thread?.id;\n if (!threadId) {\n throw new Error('thread/start did not return a thread id');\n }\n\n const turnStartResponse = await this.request<CodexTurnStartResponse>({\n method: 'turn/start',\n params: {\n threadId,\n input,\n effort,\n },\n deadlineAt,\n abortSignal,\n });\n\n turnId = turnStartResponse?.turn?.id;\n if (!turnId) {\n throw new Error('turn/start did not return a turn id');\n }\n\n let turnStatus: string | undefined;\n while (!turnStatus) {\n const message = await this.nextMessage({ deadlineAt, abortSignal });\n\n if (this.isResponseMessage(message)) {\n // No concurrent requests in adapter runtime.\n continue;\n }\n\n if (this.isRequestMessage(message)) {\n await this.respondToServerRequest(message);\n continue;\n }\n\n const notification = message as JsonRpcNotification;\n const method = notification.method;\n const params = notification.params || {};\n\n if (method === 'error') {\n const messageText =\n params.error?.message ||\n params.message ||\n 'codex app-server reported turn error';\n latestErrorMessage = String(messageText);\n continue;\n }\n\n if (\n method === 'item/agentMessage/delta' &&\n params.threadId === threadId &&\n params.turnId === turnId\n ) {\n const delta = String(params.delta || '');\n if (delta) {\n accumulatedText += delta;\n emitChunk({\n content: delta,\n reasoning: '',\n isComplete: false,\n });\n }\n continue;\n }\n\n if (\n (method === 'item/reasoning/summaryTextDelta' ||\n method === 'item/reasoning/textDelta') &&\n params.threadId === threadId &&\n params.turnId === turnId\n ) {\n const delta = String(params.delta || '');\n if (delta) {\n accumulatedReasoning += delta;\n emitChunk({\n content: '',\n reasoning: delta,\n isComplete: false,\n });\n }\n continue;\n }\n\n if (\n method === 'item/completed' &&\n params.threadId === threadId &&\n params.turnId === turnId &&\n params.item?.type === 'agentMessage' &&\n typeof params.item?.text === 'string' &&\n !accumulatedText\n ) {\n accumulatedText = params.item.text;\n continue;\n }\n\n if (\n method === 'thread/tokenUsage/updated' &&\n params.threadId === threadId &&\n params.turnId === turnId\n ) {\n latestUsage = this.mapUsage({\n usage: params as CodexUsageNotification,\n modelConfig,\n turnId,\n startTime,\n });\n continue;\n }\n\n if (\n method === 'turn/completed' &&\n params.threadId === threadId &&\n params.turn?.id === turnId\n ) {\n turnStatus = String(params.turn.status || '');\n latestErrorMessage =\n params.turn?.error?.message || latestErrorMessage || undefined;\n break;\n }\n }\n\n if (turnStatus !== 'completed') {\n throw new Error(\n latestErrorMessage ||\n `codex turn finished with status \"${turnStatus || 'unknown'}\"`,\n );\n }\n\n if (isStreaming) {\n emitChunk({\n content: '',\n reasoning: '',\n isComplete: true,\n usage: latestUsage,\n });\n }\n\n return {\n content: accumulatedText,\n reasoning_content: accumulatedReasoning || undefined,\n usage: latestUsage,\n isStreamed: isStreaming,\n };\n } catch (error) {\n if (isAbortError(error) && threadId && turnId) {\n await this.request({\n method: 'turn/interrupt',\n params: {\n threadId,\n turnId,\n },\n deadlineAt: Date.now() + 5_000,\n }).catch(() => {});\n }\n throw error;\n } finally {\n if (threadId) {\n await this.request({\n method: 'thread/unsubscribe',\n params: { threadId },\n deadlineAt: Date.now() + CODEX_DEFAULT_CLEANUP_TIMEOUT_MS,\n }).catch((error) => {\n warnCodex(\n `failed to unsubscribe codex thread ${threadId}: ${String(error)}`,\n );\n });\n }\n }\n }\n\n async dispose(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n\n try {\n this.lineReader?.close?.();\n } catch {}\n\n try {\n this.child?.stdin?.end?.();\n } catch {}\n\n try {\n this.child?.kill?.();\n } catch {}\n }\n\n private attachProcessListeners() {\n this.lineReader.on('line', (line: string) => {\n this.lineBuffer.push(line);\n });\n\n this.child.stderr.on('data', (chunk: Buffer | string) => {\n const text = Buffer.isBuffer(chunk)\n ? chunk.toString('utf8')\n : String(chunk);\n this.stderrBuffer += text;\n if (this.stderrBuffer.length > 8192) {\n this.stderrBuffer = this.stderrBuffer.slice(-8192);\n }\n });\n\n this.child.on('exit', (code: number | null) => {\n this.closed = true;\n this.lastExitCode = code;\n });\n\n this.child.on('error', (error: Error) => {\n this.closed = true;\n this.processErrorMessage = error.message;\n });\n }\n\n /**\n * Keep codex process reusable but let short-lived callers exit naturally.\n * Without unref, one-shot scripts/tests that call AI once can hang.\n */\n private detachFromEventLoop() {\n this.child.unref?.();\n this.child.stdin?.unref?.();\n this.child.stdout?.unref?.();\n this.child.stderr?.unref?.();\n }\n\n private async initializeHandshake() {\n const deadlineAt = Date.now() + CODEX_DEFAULT_PROCESS_START_TIMEOUT_MS;\n await this.request({\n method: 'initialize',\n params: {\n clientInfo: {\n name: 'midscene_codex_provider',\n title: 'Midscene Codex Provider',\n version: '1.0.0',\n },\n capabilities: {\n experimentalApi: false,\n },\n },\n deadlineAt,\n });\n await this.sendMessage({\n method: 'initialized',\n });\n }\n\n private mapUsage({\n usage,\n modelConfig,\n turnId,\n startTime,\n }: {\n usage: CodexUsageNotification;\n modelConfig: IModelConfig;\n turnId: string;\n startTime: number;\n }): AIUsageInfo | undefined {\n const tokenUsage = usage.tokenUsage;\n const picked = tokenUsage?.last || tokenUsage?.total;\n if (!picked) return undefined;\n\n return {\n prompt_tokens: picked.inputTokens ?? 0,\n completion_tokens: picked.outputTokens ?? 0,\n total_tokens: picked.totalTokens ?? 0,\n cached_input: picked.cachedInputTokens ?? 0,\n time_cost: Date.now() - startTime,\n model_name: modelConfig.modelName,\n model_description: modelConfig.modelDescription,\n intent: modelConfig.intent,\n request_id: turnId,\n } satisfies AIUsageInfo;\n }\n\n private isRequestMessage(message: JsonRpcMessage): message is JsonRpcRequest {\n return (\n typeof (message as any)?.method === 'string' &&\n (message as any)?.id !== undefined\n );\n }\n\n private isResponseMessage(\n message: JsonRpcMessage,\n ): message is JsonRpcResponse {\n return (\n (message as any)?.id !== undefined &&\n ((message as any)?.result !== undefined ||\n (message as any)?.error !== undefined) &&\n typeof (message as any)?.method !== 'string'\n );\n }\n\n private async request<T = unknown>({\n method,\n params,\n deadlineAt,\n abortSignal,\n }: {\n method: string;\n params: unknown;\n deadlineAt?: number;\n abortSignal?: AbortSignal;\n }): Promise<T> {\n const requestId = this.nextRequestId++;\n\n await this.sendMessage({\n id: requestId,\n method,\n params,\n });\n\n while (true) {\n const message = await this.nextMessage({\n deadlineAt,\n abortSignal,\n includePending: false,\n });\n\n if (this.isResponseMessage(message) && message.id === requestId) {\n if (message.error) {\n throw new Error(\n `codex app-server ${method} failed: ${\n message.error.message || 'unknown error'\n }`,\n );\n }\n return (message.result || {}) as T;\n }\n\n if (this.isRequestMessage(message)) {\n await this.respondToServerRequest(message);\n continue;\n }\n\n // Keep unmatched notifications/other responses for later stream handling.\n this.pendingMessages.push(message);\n }\n }\n\n private async respondToServerRequest(request: JsonRpcRequest): Promise<void> {\n const requestId = request.id;\n const method = request.method;\n\n let result: unknown = {};\n if (method === 'item/commandExecution/requestApproval') {\n result = { decision: 'decline' };\n } else if (method === 'item/fileChange/requestApproval') {\n result = { decision: 'decline' };\n } else if (method === 'mcpServer/elicitation/request') {\n result = { action: 'cancel', content: null };\n } else if (method === 'item/tool/requestUserInput') {\n result = { answers: [] };\n } else {\n await this.sendMessage({\n id: requestId,\n error: {\n code: -32601,\n message: `unsupported server request: ${method}`,\n },\n });\n return;\n }\n\n await this.sendMessage({\n id: requestId,\n result,\n });\n }\n\n private async nextMessage({\n deadlineAt,\n abortSignal,\n includePending = true,\n }: {\n deadlineAt?: number;\n abortSignal?: AbortSignal;\n includePending?: boolean;\n }): Promise<JsonRpcMessage> {\n if (includePending && this.pendingMessages.length) {\n return this.pendingMessages.shift() as JsonRpcMessage;\n }\n\n while (true) {\n if (abortSignal?.aborted) {\n throw new Error('codex app-server request aborted');\n }\n\n if (deadlineAt && Date.now() > deadlineAt) {\n throw new Error('codex app-server request timed out');\n }\n\n if (this.lineBuffer.length) {\n const line = this.lineBuffer.shift()!;\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n let parsed: JsonRpcMessage;\n try {\n parsed = JSON.parse(trimmed);\n } catch (error) {\n warnCodex(\n `ignored non-JSON message from codex app-server: ${trimmed}`,\n );\n continue;\n }\n\n return parsed;\n }\n\n if (this.closed) {\n throw this.createClosedConnectionError();\n }\n\n await new Promise((resolve) => setTimeout(resolve, 20));\n }\n }\n\n private async sendMessage(payload: Record<string, unknown>): Promise<void> {\n if (this.closed) {\n throw this.createClosedConnectionError();\n }\n\n const line = JSON.stringify(payload);\n await new Promise<void>((resolve, reject) => {\n this.child.stdin.write(`${line}\\n`, (error: Error | null | undefined) => {\n if (error) {\n reject(\n new Error(\n `failed writing to codex app-server stdin: ${error.message}`,\n ),\n );\n return;\n }\n resolve();\n });\n });\n }\n\n private createClosedConnectionError(): Error {\n const stderr = this.stderrBuffer.trim();\n if (this.processErrorMessage) {\n return new Error(\n stderr\n ? `codex app-server process error: ${this.processErrorMessage}. stderr=${stderr}`\n : `codex app-server process error: ${this.processErrorMessage}`,\n );\n }\n\n return new Error(\n stderr\n ? `codex app-server connection closed (exitCode=${this.lastExitCode}). stderr=${stderr}`\n : `codex app-server connection closed (exitCode=${this.lastExitCode})`,\n );\n }\n}\n\nclass CodexAppServerConnectionManager {\n private connection: CodexAppServerConnection | null = null;\n private runner = new SerializedRunner();\n\n async runTurn({\n messages,\n modelConfig,\n stream,\n onChunk,\n deepThink,\n abortSignal,\n }: {\n messages: ChatCompletionMessageParam[];\n modelConfig: IModelConfig;\n stream?: boolean;\n onChunk?: StreamingCallback;\n deepThink?: DeepThinkOption;\n abortSignal?: AbortSignal;\n }): Promise<CodexTurnResult> {\n return this.runner.run(async () => {\n const connection = await this.getConnection();\n try {\n return await connection.runTurn({\n messages,\n modelConfig,\n stream,\n onChunk,\n deepThink,\n abortSignal,\n });\n } catch (error) {\n if (connection.isClosed() || !isAbortError(error)) {\n await this.resetConnection();\n }\n throw error;\n }\n });\n }\n\n async shutdownForTests(): Promise<void> {\n await this.resetConnection();\n }\n\n private async getConnection(): Promise<CodexAppServerConnection> {\n if (!this.connection || this.connection.isClosed()) {\n this.connection = await CodexAppServerConnection.create();\n debugCodex('started long-lived codex app-server connection');\n }\n return this.connection;\n }\n\n private async resetConnection(): Promise<void> {\n if (!this.connection) return;\n const staleConnection = this.connection;\n this.connection = null;\n await staleConnection.dispose();\n debugCodex('reset codex app-server connection');\n }\n}\n\nconst codexConnectionManager = new CodexAppServerConnectionManager();\n\nexport async function callAIWithCodexAppServer(\n messages: ChatCompletionMessageParam[],\n modelConfig: IModelConfig,\n options?: {\n stream?: boolean;\n onChunk?: StreamingCallback;\n deepThink?: DeepThinkOption;\n abortSignal?: AbortSignal;\n },\n): Promise<CodexTurnResult> {\n if (ifInBrowser) {\n throw new Error(\n 'codex app-server provider is not supported in browser runtime',\n );\n }\n\n return codexConnectionManager.runTurn({\n messages,\n modelConfig,\n stream: options?.stream,\n onChunk: options?.onChunk,\n deepThink: options?.deepThink,\n abortSignal: options?.abortSignal,\n });\n}\n\nexport async function __shutdownCodexAppServerForTests() {\n await codexConnectionManager.shutdownForTests();\n}\n","import type { AIUsageInfo, DeepThinkOption } from '@/types';\nimport type { CodeGenerationChunk, StreamingCallback } from '@/types';\n\n// Error class that preserves usage and rawResponse when AI call parsing fails\nexport class AIResponseParseError extends Error {\n usage?: AIUsageInfo;\n rawResponse: string;\n\n constructor(message: string, rawResponse: string, usage?: AIUsageInfo) {\n super(message);\n this.name = 'AIResponseParseError';\n this.rawResponse = rawResponse;\n this.usage = usage;\n }\n}\nimport {\n type IModelConfig,\n MIDSCENE_LANGFUSE_DEBUG,\n MIDSCENE_LANGSMITH_DEBUG,\n MIDSCENE_MODEL_MAX_TOKENS,\n OPENAI_MAX_TOKENS,\n type TModelFamily,\n type UITarsModelVersion,\n globalConfigManager,\n} from '@midscene/shared/env';\n\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert, ifInBrowser } from '@midscene/shared/utils';\nimport { jsonrepair } from 'jsonrepair';\nimport OpenAI from 'openai';\nimport type { ChatCompletionMessageParam } from 'openai/resources/index';\nimport type { Stream } from 'openai/streaming';\nimport type { AIArgs } from '../../common';\nimport { isAutoGLM, isUITars } from '../auto-glm/util';\nimport {\n callAIWithCodexAppServer,\n isCodexAppServerProvider,\n} from './codex-app-server';\nimport { shouldForceOriginalImageDetail } from './image-detail';\n\nasync function createChatClient({\n modelConfig,\n}: {\n modelConfig: IModelConfig;\n}): Promise<{\n completion: OpenAI.Chat.Completions;\n modelName: string;\n modelDescription: string;\n uiTarsModelVersion?: UITarsModelVersion;\n modelFamily: TModelFamily | undefined;\n}> {\n const {\n socksProxy,\n httpProxy,\n modelName,\n openaiBaseURL,\n openaiApiKey,\n openaiExtraConfig,\n modelDescription,\n uiTarsModelVersion,\n modelFamily,\n createOpenAIClient,\n timeout,\n } = modelConfig;\n\n let proxyAgent: any = undefined;\n const warnClient = getDebug('ai:call', { console: true });\n const debugProxy = getDebug('ai:call:proxy');\n const warnProxy = getDebug('ai:call:proxy', { console: true });\n\n // Helper function to sanitize proxy URL for logging (remove credentials)\n // Uses URL API instead of regex to avoid ReDoS vulnerabilities\n const sanitizeProxyUrl = (url: string): string => {\n try {\n const parsed = new URL(url);\n if (parsed.username) {\n // Keep username for debugging, hide password for security\n parsed.password = '****';\n return parsed.href;\n }\n return url;\n } catch {\n // If URL parsing fails, return original URL (will be caught later)\n return url;\n }\n };\n\n if (httpProxy) {\n debugProxy('using http proxy', sanitizeProxyUrl(httpProxy));\n if (ifInBrowser) {\n warnProxy(\n 'HTTP proxy is configured but not supported in browser environment',\n );\n } else {\n // Dynamic import with variable to avoid bundler static analysis\n const moduleName = 'undici';\n const { ProxyAgent } = await import(moduleName);\n proxyAgent = new ProxyAgent({\n uri: httpProxy,\n // Note: authentication is handled via the URI (e.g., http://user:pass@proxy.com:8080)\n });\n }\n } else if (socksProxy) {\n debugProxy('using socks proxy', sanitizeProxyUrl(socksProxy));\n if (ifInBrowser) {\n warnProxy(\n 'SOCKS proxy is configured but not supported in browser environment',\n );\n } else {\n try {\n // Dynamic import with variable to avoid bundler static analysis\n const moduleName = 'fetch-socks';\n const { socksDispatcher } = await import(moduleName);\n // Parse SOCKS proxy URL (e.g., socks5://127.0.0.1:1080)\n const proxyUrl = new URL(socksProxy);\n\n // Validate hostname\n if (!proxyUrl.hostname) {\n throw new Error('SOCKS proxy URL must include a valid hostname');\n }\n\n // Validate and parse port\n const port = Number.parseInt(proxyUrl.port, 10);\n if (!proxyUrl.port || Number.isNaN(port)) {\n throw new Error('SOCKS proxy URL must include a valid port');\n }\n\n // Parse SOCKS version from protocol\n const protocol = proxyUrl.protocol.replace(':', '');\n const socksType =\n protocol === 'socks4' ? 4 : protocol === 'socks5' ? 5 : 5;\n\n proxyAgent = socksDispatcher({\n type: socksType,\n host: proxyUrl.hostname,\n port,\n ...(proxyUrl.username\n ? {\n userId: decodeURIComponent(proxyUrl.username),\n password: decodeURIComponent(proxyUrl.password || ''),\n }\n : {}),\n });\n debugProxy('socks proxy configured successfully', {\n type: socksType,\n host: proxyUrl.hostname,\n port: port,\n });\n } catch (error) {\n warnProxy('Failed to configure SOCKS proxy:', error);\n throw new Error(\n `Invalid SOCKS proxy URL: ${socksProxy}. Expected format: socks4://host:port, socks5://host:port, or with authentication: socks5://user:pass@host:port`,\n );\n }\n }\n }\n\n const openAIOptions = {\n baseURL: openaiBaseURL,\n apiKey: openaiApiKey,\n // Use fetchOptions.dispatcher for fetch-based SDK instead of httpAgent\n // Note: Type assertion needed due to undici version mismatch between dependencies\n ...(proxyAgent ? { fetchOptions: { dispatcher: proxyAgent as any } } : {}),\n ...openaiExtraConfig,\n ...(typeof timeout === 'number' ? { timeout } : {}),\n dangerouslyAllowBrowser: true,\n };\n\n const baseOpenAI = new OpenAI(openAIOptions);\n\n let openai: OpenAI = baseOpenAI;\n\n // LangSmith wrapper\n if (\n openai &&\n globalConfigManager.getEnvConfigInBoolean(MIDSCENE_LANGSMITH_DEBUG)\n ) {\n if (ifInBrowser) {\n throw new Error('langsmith is not supported in browser');\n }\n warnClient('DEBUGGING MODE: langsmith wrapper enabled');\n // Use variable to prevent static analysis by bundlers\n const langsmithModule = 'langsmith/wrappers';\n const { wrapOpenAI } = await import(langsmithModule);\n openai = wrapOpenAI(openai);\n }\n\n // Langfuse wrapper\n if (\n openai &&\n globalConfigManager.getEnvConfigInBoolean(MIDSCENE_LANGFUSE_DEBUG)\n ) {\n if (ifInBrowser) {\n throw new Error('langfuse is not supported in browser');\n }\n warnClient('DEBUGGING MODE: langfuse wrapper enabled');\n // Use variable to prevent static analysis by bundlers\n const langfuseModule = '@langfuse/openai';\n const { observeOpenAI } = await import(langfuseModule);\n openai = observeOpenAI(openai);\n }\n\n if (createOpenAIClient) {\n const wrappedClient = await createOpenAIClient(baseOpenAI, openAIOptions);\n\n if (wrappedClient) {\n openai = wrappedClient as OpenAI;\n }\n }\n\n return {\n completion: openai.chat.completions,\n modelName,\n modelDescription,\n uiTarsModelVersion,\n modelFamily,\n };\n}\n\nexport async function callAI(\n messages: ChatCompletionMessageParam[],\n modelConfig: IModelConfig,\n options?: {\n stream?: boolean;\n onChunk?: StreamingCallback;\n deepThink?: DeepThinkOption;\n abortSignal?: AbortSignal;\n },\n): Promise<{\n content: string;\n reasoning_content?: string;\n usage?: AIUsageInfo;\n isStreamed: boolean;\n}> {\n if (isCodexAppServerProvider(modelConfig.openaiBaseURL)) {\n return callAIWithCodexAppServer(messages, modelConfig, options);\n }\n\n const {\n completion,\n modelName,\n modelDescription,\n uiTarsModelVersion,\n modelFamily,\n } = await createChatClient({\n modelConfig,\n });\n\n const extraBody = modelConfig.extraBody;\n\n const maxTokens =\n globalConfigManager.getEnvConfigValueAsNumber(MIDSCENE_MODEL_MAX_TOKENS) ??\n globalConfigManager.getEnvConfigValueAsNumber(OPENAI_MAX_TOKENS);\n const debugCall = getDebug('ai:call');\n const warnCall = getDebug('ai:call', { console: true });\n const debugProfileStats = getDebug('ai:profile:stats');\n const debugProfileDetail = getDebug('ai:profile:detail');\n\n const startTime = Date.now();\n\n const temperature = (() => {\n if (modelFamily === 'gpt-5') {\n debugCall('temperature is ignored for gpt-5');\n return undefined;\n }\n return modelConfig.temperature ?? 0;\n })();\n\n const isStreaming = options?.stream && options?.onChunk;\n let content: string | undefined;\n let accumulated = '';\n let accumulatedReasoning = '';\n let usage: OpenAI.CompletionUsage | undefined;\n let timeCost: number | undefined;\n let requestId: string | null | undefined;\n\n const buildUsageInfo = (\n usageData?: OpenAI.CompletionUsage,\n requestId?: string | null,\n ) => {\n if (!usageData) return undefined;\n\n const cachedInputTokens = (\n usageData as { prompt_tokens_details?: { cached_tokens?: number } }\n )?.prompt_tokens_details?.cached_tokens;\n\n return {\n prompt_tokens: usageData.prompt_tokens ?? 0,\n completion_tokens: usageData.completion_tokens ?? 0,\n total_tokens: usageData.total_tokens ?? 0,\n cached_input: cachedInputTokens ?? 0,\n time_cost: timeCost ?? 0,\n model_name: modelName,\n model_description: modelDescription,\n intent: modelConfig.intent,\n request_id: requestId ?? undefined,\n } satisfies AIUsageInfo;\n };\n\n const commonConfig = {\n temperature,\n stream: !!isStreaming,\n max_tokens: maxTokens,\n ...(modelFamily === 'qwen2.5-vl' // qwen vl v2 specific config\n ? {\n vl_high_resolution_images: true,\n }\n : {}),\n };\n\n if (isAutoGLM(modelFamily)) {\n (commonConfig as unknown as Record<string, number>).top_p = 0.85;\n (commonConfig as unknown as Record<string, number>).frequency_penalty = 0.2;\n }\n\n // Merge deepThink (per-request boolean) with reasoning config (model-level)\n // deepThink takes priority as a per-request override for reasoningEnabled\n const mergedEnableReasoning = (() => {\n const normalizedDeepThink =\n options?.deepThink === 'unset' ? undefined : options?.deepThink;\n if (normalizedDeepThink === true) return true;\n if (normalizedDeepThink === false) return false;\n return modelConfig.reasoningEnabled;\n })();\n\n const {\n config: reasoningEffortConfig,\n debugMessage: reasoningEffortDebugMessage,\n warningMessage,\n } = resolveReasoningConfig({\n reasoningEnabled: mergedEnableReasoning,\n reasoningEffort: modelConfig.reasoningEffort,\n reasoningBudget: modelConfig.reasoningBudget,\n modelFamily,\n });\n if (reasoningEffortDebugMessage) {\n debugCall(reasoningEffortDebugMessage);\n }\n if (warningMessage) {\n warnCall(warningMessage);\n }\n\n const shouldUseOriginalImageDetail =\n shouldForceOriginalImageDetail(modelConfig);\n\n // For default-intent GPT-5 calls, request original image detail to preserve\n // screenshot resolution for localization-sensitive tasks.\n const messagesWithImageDetail: ChatCompletionMessageParam[] = (() => {\n if (!shouldUseOriginalImageDetail) {\n return messages;\n }\n\n return messages.map((msg) => {\n if (!Array.isArray(msg.content)) {\n return msg;\n }\n\n const content = msg.content.map((part) => {\n if (part && part.type === 'image_url' && part.image_url?.url) {\n return {\n ...part,\n image_url: {\n ...part.image_url,\n detail: 'original',\n },\n };\n }\n return part;\n });\n\n return {\n ...msg,\n content,\n } as ChatCompletionMessageParam;\n });\n })();\n\n try {\n debugCall(\n `sending ${isStreaming ? 'streaming ' : ''}request to ${modelName}`,\n );\n\n if (isStreaming) {\n const stream = (await completion.create(\n {\n model: modelName,\n messages: messagesWithImageDetail,\n ...commonConfig,\n ...reasoningEffortConfig,\n ...extraBody,\n },\n {\n stream: true,\n ...(options?.abortSignal ? { signal: options.abortSignal } : {}),\n },\n )) as Stream<OpenAI.Chat.Completions.ChatCompletionChunk> & {\n _request_id?: string | null;\n };\n\n requestId = stream._request_id;\n\n for await (const chunk of stream) {\n const content = chunk.choices?.[0]?.delta?.content || '';\n const reasoning_content =\n (chunk.choices?.[0]?.delta as any)?.reasoning_content || '';\n\n // Check for usage info in any chunk (OpenAI provides usage in separate chunks)\n if (chunk.usage) {\n usage = chunk.usage;\n }\n\n if (content || reasoning_content) {\n accumulated += content;\n accumulatedReasoning += reasoning_content;\n const chunkData: CodeGenerationChunk = {\n content,\n reasoning_content,\n accumulated,\n isComplete: false,\n usage: undefined,\n };\n options.onChunk!(chunkData);\n }\n\n // Check if stream is complete\n if (chunk.choices?.[0]?.finish_reason) {\n timeCost = Date.now() - startTime;\n\n // If usage is not available from the stream, provide a basic usage info\n if (!usage) {\n // Estimate token counts based on content length (rough approximation)\n const estimatedTokens = Math.max(\n 1,\n Math.floor(accumulated.length / 4),\n );\n usage = {\n prompt_tokens: estimatedTokens,\n completion_tokens: estimatedTokens,\n total_tokens: estimatedTokens * 2,\n };\n }\n\n // Send final chunk\n const finalChunk: CodeGenerationChunk = {\n content: '',\n accumulated,\n reasoning_content: '',\n isComplete: true,\n usage: buildUsageInfo(usage, requestId),\n };\n options.onChunk!(finalChunk);\n break;\n }\n }\n content = accumulated;\n debugProfileStats(\n `streaming model, ${modelName}, mode, ${modelFamily || 'default'}, cost-ms, ${timeCost}, temperature, ${temperature ?? ''}`,\n );\n } else {\n // Non-streaming with retry logic\n const retryCount = modelConfig.retryCount ?? 1;\n const retryInterval = modelConfig.retryInterval ?? 2000;\n const maxAttempts = retryCount + 1; // retryCount=1 means 2 total attempts (1 initial + 1 retry)\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const result = await completion.create(\n {\n model: modelName,\n messages: messagesWithImageDetail,\n ...commonConfig,\n ...reasoningEffortConfig,\n ...extraBody,\n } as any,\n options?.abortSignal ? { signal: options.abortSignal } : undefined,\n );\n\n timeCost = Date.now() - startTime;\n\n debugProfileStats(\n `model, ${modelName}, mode, ${modelFamily || 'default'}, ui-tars-version, ${uiTarsModelVersion}, prompt-tokens, ${result.usage?.prompt_tokens || ''}, completion-tokens, ${result.usage?.completion_tokens || ''}, total-tokens, ${result.usage?.total_tokens || ''}, cost-ms, ${timeCost}, requestId, ${result._request_id || ''}, temperature, ${temperature ?? ''}`,\n );\n\n debugProfileDetail(\n `model usage detail: ${JSON.stringify(result.usage)}`,\n );\n\n if (!result.choices) {\n throw new Error(\n `invalid response from LLM service: ${JSON.stringify(result)}`,\n );\n }\n\n content = result.choices[0].message.content!;\n accumulatedReasoning =\n (result.choices[0].message as any)?.reasoning_content || '';\n usage = result.usage;\n requestId = result._request_id;\n\n if (\n !content &&\n accumulatedReasoning &&\n (modelFamily === 'doubao-vision' || modelFamily === 'doubao-seed')\n ) {\n warnCall('empty content from AI model, using reasoning content');\n content = accumulatedReasoning;\n }\n\n if (!content) {\n throw new Error('empty content from AI model');\n }\n\n break; // Success, exit retry loop\n } catch (error) {\n lastError = error as Error;\n // Do not retry if the request was aborted by the caller\n if (options?.abortSignal?.aborted) {\n break;\n }\n if (attempt < maxAttempts) {\n warnCall(\n `AI call failed (attempt ${attempt}/${maxAttempts}), retrying in ${retryInterval}ms... Error: ${lastError.message}`,\n );\n await new Promise((resolve) => setTimeout(resolve, retryInterval));\n }\n }\n }\n\n if (!content) {\n throw lastError;\n }\n }\n\n debugCall(`response reasoning content: ${accumulatedReasoning}`);\n debugCall(`response content: ${content}`);\n\n // Ensure we always have usage info for streaming responses\n if (isStreaming && !usage) {\n // Estimate token counts based on content length (rough approximation)\n const estimatedTokens = Math.max(\n 1,\n Math.floor((content || '').length / 4),\n );\n usage = {\n prompt_tokens: estimatedTokens,\n completion_tokens: estimatedTokens,\n total_tokens: estimatedTokens * 2,\n } as OpenAI.CompletionUsage;\n }\n\n return {\n content: content || '',\n reasoning_content: accumulatedReasoning || undefined,\n usage: buildUsageInfo(usage, requestId),\n isStreamed: !!isStreaming,\n };\n } catch (e: any) {\n warnCall('call AI error', e);\n const newError = new Error(\n `failed to call ${isStreaming ? 'streaming ' : ''}AI model service (${modelName}): ${e.message}\\nTrouble shooting: https://midscenejs.com/model-provider.html`,\n {\n cause: e,\n },\n );\n throw newError;\n }\n}\n\nexport async function callAIWithObjectResponse<T>(\n messages: ChatCompletionMessageParam[],\n modelConfig: IModelConfig,\n options?: {\n deepThink?: DeepThinkOption;\n abortSignal?: AbortSignal;\n },\n): Promise<{\n content: T;\n contentString: string;\n usage?: AIUsageInfo;\n reasoning_content?: string;\n}> {\n const response = await callAI(messages, modelConfig, {\n deepThink: options?.deepThink,\n abortSignal: options?.abortSignal,\n });\n assert(response, 'empty response');\n const modelFamily = modelConfig.modelFamily;\n const jsonContent = safeParseJson(response.content, modelFamily);\n if (typeof jsonContent !== 'object') {\n throw new AIResponseParseError(\n `failed to parse json response from model (${modelConfig.modelName}): ${response.content}`,\n response.content,\n response.usage,\n );\n }\n return {\n content: jsonContent,\n contentString: response.content,\n usage: response.usage,\n reasoning_content: response.reasoning_content,\n };\n}\n\nexport async function callAIWithStringResponse(\n msgs: AIArgs,\n modelConfig: IModelConfig,\n options?: {\n abortSignal?: AbortSignal;\n },\n): Promise<{ content: string; usage?: AIUsageInfo }> {\n const { content, usage } = await callAI(msgs, modelConfig, {\n abortSignal: options?.abortSignal,\n });\n return { content, usage };\n}\n\nexport function extractJSONFromCodeBlock(response: string) {\n try {\n // First, try to match a JSON object directly in the response\n const jsonMatch = response.match(/^\\s*(\\{[\\s\\S]*\\})\\s*$/);\n if (jsonMatch) {\n return jsonMatch[1];\n }\n\n // If no direct JSON object is found, try to extract JSON from a code block\n const codeBlockMatch = response.match(\n /```(?:json)?\\s*(\\{[\\s\\S]*?\\})\\s*```/,\n );\n if (codeBlockMatch) {\n return codeBlockMatch[1];\n }\n\n // If no code block is found, try to find a JSON-like structure in the text\n const jsonLikeMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (jsonLikeMatch) {\n return jsonLikeMatch[0];\n }\n } catch {}\n // If no JSON-like structure is found, return the original response\n return response;\n}\n\nexport function preprocessDoubaoBboxJson(input: string) {\n if (input.includes('bbox')) {\n // when its values like 940 445 969 490, replace all /\\d+\\s+\\d+/g with /$1,$2/g\n while (/\\d+\\s+\\d+/.test(input)) {\n input = input.replace(/(\\d+)\\s+(\\d+)/g, '$1,$2');\n }\n }\n return input;\n}\n\nexport function resolveReasoningConfig({\n reasoningEnabled,\n reasoningEffort,\n reasoningBudget,\n modelFamily,\n}: {\n reasoningEnabled?: boolean;\n reasoningEffort?: string;\n reasoningBudget?: number;\n modelFamily?: TModelFamily;\n}): {\n config: Record<string, unknown>;\n debugMessage?: string;\n warningMessage?: string;\n} {\n // No reasoning params set at all\n if (\n reasoningEnabled === undefined &&\n !reasoningEffort &&\n reasoningBudget === undefined\n ) {\n return { config: {} };\n }\n\n const debugMessages: string[] = [];\n const config: Record<string, unknown> = {};\n\n if (modelFamily === 'qwen3-vl' || modelFamily === 'qwen3.5') {\n // reasoningEnabled → enable_thinking\n if (reasoningEnabled !== undefined) {\n config.enable_thinking = reasoningEnabled;\n debugMessages.push(`enable_thinking=${reasoningEnabled}`);\n }\n // reasoningBudget → thinking_budget\n if (reasoningBudget !== undefined) {\n config.thinking_budget = reasoningBudget;\n debugMessages.push(`thinking_budget=${reasoningBudget}`);\n }\n // reasoningEffort is ignored for qwen\n } else if (modelFamily === 'doubao-vision' || modelFamily === 'doubao-seed') {\n // reasoningEnabled → thinking.type\n if (reasoningEnabled !== undefined) {\n config.thinking = {\n type: reasoningEnabled ? 'enabled' : 'disabled',\n };\n debugMessages.push(\n `thinking.type=${reasoningEnabled ? 'enabled' : 'disabled'}`,\n );\n }\n // reasoningEffort → reasoning_effort\n if (reasoningEffort) {\n config.reasoning_effort = reasoningEffort;\n debugMessages.push(`reasoning_effort=\"${reasoningEffort}\"`);\n }\n // reasoningBudget is ignored for doubao\n } else if (modelFamily === 'glm-v') {\n // reasoningEnabled → thinking.type\n if (reasoningEnabled !== undefined) {\n config.thinking = {\n type: reasoningEnabled ? 'enabled' : 'disabled',\n };\n debugMessages.push(\n `thinking.type=${reasoningEnabled ? 'enabled' : 'disabled'}`,\n );\n }\n // reasoningEffort and reasoningBudget are ignored for glm-v\n } else if (modelFamily === 'gpt-5') {\n // reasoningEffort → reasoning.effort\n config.reasoning = undefined;\n debugMessages.push('reasoning config is ignored for gpt-5');\n // if (reasoningEffort) {\n // config.reasoning = { effort: reasoningEffort };\n // debugMessages.push(`reasoning.effort=\"${reasoningEffort}\"`);\n // } else if (reasoningEnabled === true) {\n // config.reasoning = { effort: 'high' };\n // debugMessages.push('reasoning.effort=\"high\" (from reasoningEnabled)');\n // } else if (reasoningEnabled === false) {\n // config.reasoning = { effort: 'low' };\n // debugMessages.push('reasoning.effort=\"low\" (from reasoningEnabled)');\n // }\n // reasoningBudget is ignored for gpt-5\n } else if (!modelFamily) {\n return {\n config: {},\n debugMessage: 'reasoning config ignored: no model_family configured',\n warningMessage:\n 'Reasoning config is set but no model_family is configured. Set MIDSCENE_MODEL_FAMILY to enable reasoning config pass-through.',\n };\n } else {\n // For unknown model families, pass reasoning_effort directly as a best-effort default\n if (reasoningEffort) {\n config.reasoning_effort = reasoningEffort;\n debugMessages.push(`reasoning_effort=\"${reasoningEffort}\"`);\n }\n }\n\n return {\n config,\n debugMessage: debugMessages.length\n ? `reasoning config for ${modelFamily}: ${debugMessages.join(', ')}`\n : undefined,\n };\n}\n\n/**\n * Normalize a parsed JSON object by trimming whitespace from:\n * 1. All object keys (e.g., \" prompt \" -> \"prompt\")\n * 2. All string values (e.g., \" Tap \" -> \"Tap\")\n * This handles LLM output that may include leading/trailing spaces.\n */\nfunction normalizeJsonObject(obj: any): any {\n // Handle null and undefined\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n // Handle arrays - recursively normalize each element\n if (Array.isArray(obj)) {\n return obj.map((item) => normalizeJsonObject(item));\n }\n\n // Handle objects\n if (typeof obj === 'object') {\n const normalized: any = {};\n\n for (const [key, value] of Object.entries(obj)) {\n // Trim the key to remove leading/trailing spaces\n const trimmedKey = key.trim();\n\n // Recursively normalize the value\n let normalizedValue = normalizeJsonObject(value);\n\n // Trim all string values\n if (typeof normalizedValue === 'string') {\n normalizedValue = normalizedValue.trim();\n }\n\n normalized[trimmedKey] = normalizedValue;\n }\n\n return normalized;\n }\n\n // Handle primitive strings\n if (typeof obj === 'string') {\n return obj.trim();\n }\n\n // Return other primitives as-is\n return obj;\n}\n\nexport function safeParseJson(\n input: string,\n modelFamily: TModelFamily | undefined,\n) {\n const cleanJsonString = extractJSONFromCodeBlock(input);\n // match the point\n if (cleanJsonString?.match(/\\((\\d+),(\\d+)\\)/)) {\n return cleanJsonString\n .match(/\\((\\d+),(\\d+)\\)/)\n ?.slice(1)\n .map(Number);\n }\n\n let parsed: any;\n let lastError: unknown;\n try {\n parsed = JSON.parse(cleanJsonString);\n return normalizeJsonObject(parsed);\n } catch (error) {\n lastError = error;\n }\n try {\n parsed = JSON.parse(jsonrepair(cleanJsonString));\n return normalizeJsonObject(parsed);\n } catch (error) {\n lastError = error;\n }\n\n if (\n modelFamily === 'doubao-vision' ||\n modelFamily === 'doubao-seed' ||\n isUITars(modelFamily)\n ) {\n const jsonString = preprocessDoubaoBboxJson(cleanJsonString);\n try {\n parsed = JSON.parse(jsonrepair(jsonString));\n return normalizeJsonObject(parsed);\n } catch (error) {\n lastError = error;\n }\n }\n throw Error(\n `failed to parse LLM response into JSON. Error - ${String(\n lastError ?? 'unknown error',\n )}. Response - \\n ${input}`,\n );\n}\n","import type { IModelConfig } from '@midscene/shared/env';\n\nexport function shouldForceOriginalImageDetail(\n modelConfig: Pick<IModelConfig, 'intent' | 'modelFamily'>,\n): boolean {\n return (\n modelConfig.modelFamily === 'gpt-5' && modelConfig.intent === 'default'\n );\n}\n","function isFormElement(node) {\n return node instanceof HTMLElement && ('input' === node.tagName.toLowerCase() || 'textarea' === node.tagName.toLowerCase() || 'select' === node.tagName.toLowerCase() || 'option' === node.tagName.toLowerCase());\n}\nfunction isButtonElement(node) {\n return node instanceof HTMLElement && 'button' === node.tagName.toLowerCase();\n}\nfunction isAElement(node) {\n return node instanceof HTMLElement && 'a' === node.tagName.toLowerCase();\n}\nfunction isSvgElement(node) {\n return node instanceof SVGElement;\n}\nfunction isImgElement(node) {\n if (!includeBaseElement(node) && node instanceof Element) {\n const computedStyle = window.getComputedStyle(node);\n const backgroundImage = computedStyle.getPropertyValue('background-image');\n if ('none' !== backgroundImage) return true;\n }\n if (isIconfont(node)) return true;\n return node instanceof HTMLElement && 'img' === node.tagName.toLowerCase() || node instanceof SVGElement && 'svg' === node.tagName.toLowerCase();\n}\nfunction isIconfont(node) {\n if (node instanceof Element) {\n const computedStyle = window.getComputedStyle(node);\n const fontFamilyValue = computedStyle.fontFamily || '';\n return fontFamilyValue.toLowerCase().indexOf('iconfont') >= 0;\n }\n return false;\n}\nfunction isNotContainerElement(node) {\n return isTextElement(node) || isIconfont(node) || isImgElement(node) || isButtonElement(node) || isAElement(node) || isFormElement(node);\n}\nfunction isTextElement(node) {\n if (node instanceof Element) {\n if (node?.childNodes?.length === 1 && node?.childNodes[0] instanceof Text) return true;\n }\n return node.nodeName?.toLowerCase?.() === '#text' && !isIconfont(node);\n}\nfunction isContainerElement(node) {\n if (!(node instanceof HTMLElement)) return false;\n if (includeBaseElement(node)) return false;\n const computedStyle = window.getComputedStyle(node);\n const backgroundColor = computedStyle.getPropertyValue('background-color');\n if (backgroundColor) return true;\n return false;\n}\nfunction includeBaseElement(node) {\n if (!(node instanceof HTMLElement)) return false;\n if (node.innerText) return true;\n const includeList = [\n 'svg',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'option',\n 'img',\n 'a'\n ];\n for (const tagName of includeList){\n const element = node.querySelectorAll(tagName);\n if (element.length > 0) return true;\n }\n return false;\n}\nfunction generateElementByPoint(center, description, edgeSize = 8) {\n const [centerX, centerY] = center;\n const offset = Math.ceil(edgeSize / 2) - 1;\n const expandedRect = {\n left: Math.max(centerX - offset, 0),\n top: Math.max(centerY - offset, 0),\n width: edgeSize,\n height: edgeSize\n };\n return {\n rect: expandedRect,\n center: [\n centerX,\n centerY\n ],\n description: description || ''\n };\n}\nfunction generateElementByRect(sourceRect, description, edgeSize = 8) {\n const centerX = sourceRect.left + Math.floor((sourceRect.width - 1) / 2);\n const centerY = sourceRect.top + Math.floor((sourceRect.height - 1) / 2);\n return generateElementByPoint([\n centerX,\n centerY\n ], description, edgeSize);\n}\nexport { generateElementByPoint, generateElementByRect, isAElement, isButtonElement, isContainerElement, isFormElement, isImgElement, isNotContainerElement, isSvgElement, isTextElement };\n","import { getDebug } from \"../logger.mjs\";\nimport { ifInBrowser, ifInNode, ifInWorker } from \"../utils.mjs\";\nconst debug = getDebug('img');\nlet photonModule = null;\nlet isInitialized = false;\nlet usingCanvasFallback = false;\nasync function getPhoton() {\n if (photonModule && isInitialized) return photonModule;\n const env = ifInBrowser ? 'browser' : ifInWorker ? 'worker' : ifInNode ? 'node' : 'unknown';\n debug(`Loading photon module in ${env} environment`);\n try {\n if (ifInBrowser || ifInWorker) {\n const photon = await import(\"@silvia-odwyer/photon\");\n if ('function' == typeof photon.default) await photon.default();\n debug('Photon loaded: @silvia-odwyer/photon (browser/worker)');\n photonModule = photon;\n } else if (ifInNode) {\n photonModule = await import(\"@silvia-odwyer/photon-node\");\n debug('Photon loaded: @silvia-odwyer/photon-node (node)');\n }\n if (!photonModule?.PhotonImage) throw new Error('PhotonImage is not available');\n if (!photonModule.PhotonImage.new_from_byteslice && !photonModule.PhotonImage.new_from_base64) throw new Error('PhotonImage.new_from_byteslice or new_from_base64 is not available');\n isInitialized = true;\n return photonModule;\n } catch (error) {\n debug(`Photon load failed: ${error instanceof Error ? error.message : String(error)}`);\n if (ifInBrowser) {\n console.warn(`[midscene:img] Photon WASM failed to load, falling back to Canvas API. Error: ${error instanceof Error ? error.message : String(error)}`);\n try {\n const { createCanvasFallbackModule } = await import(\"./canvas-fallback.mjs\");\n photonModule = createCanvasFallbackModule();\n usingCanvasFallback = true;\n isInitialized = true;\n return photonModule;\n } catch (fallbackError) {\n debug(`Canvas fallback also failed: ${fallbackError instanceof Error ? fallbackError.message : String(fallbackError)}`);\n }\n }\n throw new Error(`Failed to load photon module: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\nfunction isUsingCanvasFallback() {\n return usingCanvasFallback;\n}\nexport { getPhoton as default, isUsingCanvasFallback };\n","import { ifInNode } from \"../utils.mjs\";\nasync function getSharp() {\n if (!ifInNode) throw new Error('Sharp is only available in Node.js environment');\n try {\n const sharp = await import(\"sharp\");\n return sharp.default;\n } catch (error) {\n throw new Error(`Failed to load sharp module: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\nexport { getSharp as default };\n","import node_assert from \"node:assert\";\nimport { Buffer } from \"node:buffer\";\nimport { readFileSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport node_path from \"node:path\";\nimport { getDebug } from \"../logger.mjs\";\nimport { ifInNode } from \"../utils.mjs\";\nimport get_photon from \"./get-photon.mjs\";\nimport get_sharp from \"./get-sharp.mjs\";\nconst imgDebug = getDebug('img');\nasync function saveBase64Image(options) {\n const { base64Data, outputPath } = options;\n const { body } = parseBase64(base64Data);\n const imageBuffer = Buffer.from(body, 'base64');\n await writeFile(outputPath, imageBuffer);\n}\nasync function resizeAndConvertImgBuffer(inputFormat, inputData, newSize) {\n if ('string' == typeof inputData) throw Error('inputData is base64, use resizeImgBase64 instead');\n node_assert(newSize && newSize.width > 0 && newSize.height > 0, 'newSize must be positive');\n const resizeStartTime = Date.now();\n imgDebug(`resizeImg start, target size: ${newSize.width}x${newSize.height}`);\n if (ifInNode) try {\n const Sharp = await get_sharp();\n const metadata = await Sharp(inputData).metadata();\n const { width: originalWidth, height: originalHeight } = metadata;\n if (!originalWidth || !originalHeight) throw Error('Undefined width or height from the input image.');\n if (newSize.width === originalWidth && newSize.height === originalHeight) return {\n buffer: inputData,\n format: inputFormat\n };\n const resizedBuffer = await Sharp(inputData).resize(newSize.width, newSize.height).jpeg({\n quality: 90\n }).toBuffer();\n const resizeEndTime = Date.now();\n imgDebug(`resizeImg done (Sharp), target size: ${newSize.width}x${newSize.height}, cost: ${resizeEndTime - resizeStartTime}ms`);\n return {\n buffer: resizedBuffer,\n format: 'jpeg'\n };\n } catch (error) {\n imgDebug('Sharp failed, falling back to Photon:', error);\n }\n const { PhotonImage, SamplingFilter, resize } = await get_photon();\n const inputBytes = new Uint8Array(inputData);\n const bytesliceResult = PhotonImage.new_from_byteslice(inputBytes);\n const inputImage = bytesliceResult instanceof Promise ? await bytesliceResult : bytesliceResult;\n const originalWidth = inputImage.get_width();\n const originalHeight = inputImage.get_height();\n if (!originalWidth || !originalHeight) {\n inputImage.free();\n throw Error('Undefined width or height from the input image.');\n }\n if (newSize.width === originalWidth && newSize.height === originalHeight) {\n inputImage.free();\n return {\n buffer: inputData,\n format: inputFormat\n };\n }\n const outputImage = resize(inputImage, newSize.width, newSize.height, SamplingFilter.CatmullRom);\n const outputBytes = outputImage.get_bytes_jpeg(90);\n const resizedBuffer = Buffer.from(outputBytes);\n inputImage.free();\n outputImage.free();\n const resizeEndTime = Date.now();\n imgDebug(`resizeImg done (Photon), target size: ${newSize.width}x${newSize.height}, cost: ${resizeEndTime - resizeStartTime}ms`);\n return {\n buffer: resizedBuffer,\n format: 'jpeg'\n };\n}\nconst createImgBase64ByFormat = (format, body)=>`data:image/${format};base64,${body}`;\nasync function resizeImgBase64(inputBase64, newSize) {\n const { body, mimeType } = parseBase64(inputBase64);\n const imageBuffer = Buffer.from(body, 'base64');\n const { buffer, format } = await resizeAndConvertImgBuffer(mimeType.split('/')[1], imageBuffer, newSize);\n return createImgBase64ByFormat(format, buffer.toString('base64'));\n}\nfunction zoomForGPT4o(originalWidth, originalHeight) {\n const maxWidth = 2048;\n const maxHeight = 768;\n let newWidth = originalWidth;\n let newHeight = originalHeight;\n const aspectRatio = originalWidth / originalHeight;\n if (originalWidth > maxWidth) {\n newWidth = maxWidth;\n newHeight = newWidth / aspectRatio;\n }\n if (newHeight > maxHeight) {\n newHeight = maxHeight;\n newWidth = newHeight * aspectRatio;\n }\n return {\n width: Math.round(newWidth),\n height: Math.round(newHeight)\n };\n}\nasync function photonFromBase64(base64) {\n const { PhotonImage } = await get_photon();\n const { body } = parseBase64(base64);\n const result = PhotonImage.new_from_base64(body);\n return result instanceof Promise ? await result : result;\n}\nasync function paddingToMatchBlock(image, blockSize = 28) {\n const width = image.get_width();\n const height = image.get_height();\n const targetWidth = Math.ceil(width / blockSize) * blockSize;\n const targetHeight = Math.ceil(height / blockSize) * blockSize;\n if (targetWidth === width && targetHeight === height) return {\n width,\n height,\n image\n };\n const { padding_right, padding_bottom, Rgba } = await get_photon();\n const rightPadding = targetWidth - width;\n const bottomPadding = targetHeight - height;\n let result = image;\n if (rightPadding > 0) {\n const white = new Rgba(255, 255, 255, 255);\n result = padding_right(result, rightPadding, white);\n }\n if (bottomPadding > 0) {\n const white = new Rgba(255, 255, 255, 255);\n const previousResult = result;\n result = padding_bottom(previousResult, bottomPadding, white);\n if (previousResult !== image) previousResult.free();\n }\n return {\n width: targetWidth,\n height: targetHeight,\n image: result\n };\n}\nasync function paddingToMatchBlockByBase64(imageBase64, blockSize = 28) {\n const photonImage = await photonFromBase64(imageBase64);\n try {\n const paddedResult = await paddingToMatchBlock(photonImage, blockSize);\n const result = {\n width: paddedResult.width,\n height: paddedResult.height,\n imageBase64: await photonToBase64(paddedResult.image)\n };\n if (paddedResult.image !== photonImage) paddedResult.image.free();\n return result;\n } finally{\n photonImage.free();\n }\n}\nasync function cropByRect(imageBase64, rect, paddingImage) {\n const { crop } = await get_photon();\n const photonImage = await photonFromBase64(imageBase64);\n const { left, top, width, height } = rect;\n const cropped = crop(photonImage, left, top, left + width, top + height);\n photonImage.free();\n try {\n if (paddingImage) {\n const paddedResult = await paddingToMatchBlock(cropped);\n const result = {\n width: paddedResult.width,\n height: paddedResult.height,\n imageBase64: await photonToBase64(paddedResult.image)\n };\n if (paddedResult.image !== cropped) paddedResult.image.free();\n return result;\n }\n return {\n width: cropped.get_width(),\n height: cropped.get_height(),\n imageBase64: await photonToBase64(cropped)\n };\n } finally{\n cropped.free();\n }\n}\nasync function photonToBase64(image, quality = 90) {\n const bytes = image.get_bytes_jpeg(quality);\n const base64Body = Buffer.from(bytes).toString('base64');\n return `data:image/jpeg;base64,${base64Body}`;\n}\nconst httpImg2Base64 = async (url)=>{\n const response = await fetch(url);\n if (!response.ok) throw new Error(`Failed to fetch image: ${url}`);\n const contentType = response.headers.get('content-type');\n if (!contentType) throw new Error(`Failed to fetch image: ${url}`);\n node_assert(contentType.startsWith('image/'), `The url ${url} is not a image, because of content-type in header is ${contentType}.`);\n const buffer = Buffer.from(await response.arrayBuffer());\n return `data:${contentType};base64,${buffer.toString('base64')}`;\n};\nconst localImg2Base64 = (imgPath, withoutHeader = false)=>{\n const body = readFileSync(imgPath).toString('base64');\n if (withoutHeader) return body;\n const type = node_path.extname(imgPath).slice(1);\n const finalType = 'svg' === type ? 'svg+xml' : type || 'jpg';\n return `data:image/${finalType};base64,${body}`;\n};\nconst preProcessImageUrl = async (url, convertHttpImage2Base64)=>{\n if ('string' != typeof url) throw new Error(`url must be a string, but got ${url} with type ${typeof url}`);\n if (url.startsWith('data:')) return url;\n if (!(url.startsWith('http://') || url.startsWith('https://'))) return await localImg2Base64(url);\n if (!convertHttpImage2Base64) return url;\n return await httpImg2Base64(url);\n};\nconst parseBase64 = (fullBase64String)=>{\n try {\n const separator = ';base64,';\n const index = fullBase64String.indexOf(separator);\n if (-1 === index) throw new Error('Invalid base64 string');\n return {\n mimeType: fullBase64String.slice(5, index),\n body: fullBase64String.slice(index + separator.length)\n };\n } catch (e) {\n throw new Error(`parseBase64 fail because intput is not a valid base64 string: ${fullBase64String}`, {\n cause: e\n });\n }\n};\nasync function scaleImage(imageBase64, scale) {\n if (scale <= 0) throw new Error('Scale factor must be positive');\n const { body } = parseBase64(imageBase64);\n const buffer = Buffer.from(body, 'base64');\n const scaleStartTime = Date.now();\n imgDebug(`scaleImage start, scale factor: ${scale}`);\n if (ifInNode) try {\n const Sharp = await get_sharp();\n const metadata = await Sharp(buffer).metadata();\n const originalWidth = metadata.width || 0;\n const originalHeight = metadata.height || 0;\n if (0 === originalWidth || 0 === originalHeight) throw new Error('Failed to get image dimensions');\n const newWidth = Math.round(originalWidth * scale);\n const newHeight = Math.round(originalHeight * scale);\n const resizedBuffer = await Sharp(buffer).resize(newWidth, newHeight, {\n kernel: 'lanczos3',\n fit: 'fill'\n }).jpeg({\n quality: 90\n }).toBuffer();\n const scaleEndTime = Date.now();\n imgDebug(`scaleImage done (Sharp): ${originalWidth}x${originalHeight} -> ${newWidth}x${newHeight} (scale=${scale}), cost: ${scaleEndTime - scaleStartTime}ms`);\n const base64 = `data:image/jpeg;base64,${resizedBuffer.toString('base64')}`;\n return {\n width: newWidth,\n height: newHeight,\n imageBase64: base64\n };\n } catch (error) {\n imgDebug('Sharp failed, falling back to Photon:', error);\n }\n const { PhotonImage, SamplingFilter, resize } = await get_photon();\n const inputBytes = new Uint8Array(buffer);\n const bytesliceResult = PhotonImage.new_from_byteslice(inputBytes);\n const inputImage = bytesliceResult instanceof Promise ? await bytesliceResult : bytesliceResult;\n const originalWidth = inputImage.get_width();\n const originalHeight = inputImage.get_height();\n if (!originalWidth || !originalHeight) {\n inputImage.free();\n throw new Error('Failed to get image dimensions');\n }\n const newWidth = Math.round(originalWidth * scale);\n const newHeight = Math.round(originalHeight * scale);\n const outputImage = resize(inputImage, newWidth, newHeight, SamplingFilter.CatmullRom);\n const outputBytes = outputImage.get_bytes_jpeg(90);\n const resizedBuffer = Buffer.from(outputBytes);\n inputImage.free();\n outputImage.free();\n const scaleEndTime = Date.now();\n imgDebug(`scaleImage done (Photon): ${originalWidth}x${originalHeight} -> ${newWidth}x${newHeight} (scale=${scale}), cost: ${scaleEndTime - scaleStartTime}ms`);\n const base64 = `data:image/jpeg;base64,${resizedBuffer.toString('base64')}`;\n return {\n width: newWidth,\n height: newHeight,\n imageBase64: base64\n };\n}\nexport { createImgBase64ByFormat, cropByRect, httpImg2Base64, localImg2Base64, paddingToMatchBlock, paddingToMatchBlockByBase64, parseBase64, photonFromBase64, photonToBase64, preProcessImageUrl, resizeAndConvertImgBuffer, resizeImgBase64, saveBase64Image, scaleImage, zoomForGPT4o };\n","import type {\n BaseElement,\n DeviceAction,\n ElementTreeNode,\n MidsceneYamlFlowItem,\n PlanningAction,\n Rect,\n Size,\n} from '@/types';\nimport { assert, isPlainObject } from '@midscene/shared/utils';\n\nimport type { ChatCompletionMessageParam } from 'openai/resources/index';\n\nimport { isUITars } from '@/ai-model/auto-glm/util';\nimport type { PlanningLocateParam } from '@/types';\nimport { NodeType } from '@midscene/shared/constants';\nimport type { TModelFamily } from '@midscene/shared/env';\nimport { treeToList } from '@midscene/shared/extractor';\nimport { compositeElementInfoImg } from '@midscene/shared/img';\nimport { getDebug } from '@midscene/shared/logger';\nimport { z } from 'zod';\n\nexport type AIArgs = ChatCompletionMessageParam[];\n\nconst defaultBboxSize = 20; // must be even number\nconst debugInspectUtils = getDebug('ai:common');\ntype AdaptBboxInput = number[] | string[] | string | (number[] | string[])[];\n\n/**\n * Convert a point coordinate [0, 1000] to a small bbox [0, 1000]\n * Creates a small bbox around the center point in the same coordinate space\n *\n * @param x - X coordinate in [0, 1000] range\n * @param y - Y coordinate in [0, 1000] range\n * @param bboxSize - Size of the bbox to create (default: 20)\n * @returns [x1, y1, x2, y2] bbox in [0, 1000] coordinate space\n */\nexport function pointToBbox(\n x: number,\n y: number,\n bboxSize = defaultBboxSize,\n): [number, number, number, number] {\n const halfSize = bboxSize / 2;\n const x1 = Math.max(x - halfSize, 0);\n const y1 = Math.max(y - halfSize, 0);\n const x2 = Math.min(x + halfSize, 1000);\n const y2 = Math.min(y + halfSize, 1000);\n\n return [x1, y1, x2, y2];\n}\n\n// transform the param of locate from qwen mode\nexport function fillBboxParam(\n locate: PlanningLocateParam,\n width: number,\n height: number,\n modelFamily: TModelFamily | undefined,\n) {\n // The Qwen model might have hallucinations of naming bbox as bbox_2d.\n if ((locate as any).bbox_2d && !locate?.bbox) {\n locate.bbox = (locate as any).bbox_2d;\n // biome-ignore lint/performance/noDelete: <explanation>\n delete (locate as any).bbox_2d;\n }\n\n if (locate?.bbox) {\n locate.bbox = adaptBbox(locate.bbox, width, height, modelFamily);\n }\n\n return locate;\n}\n\nexport function adaptQwen2_5Bbox(\n bbox: number[],\n): [number, number, number, number] {\n if (bbox.length < 2) {\n const msg = `invalid bbox data for qwen-vl mode: ${JSON.stringify(bbox)} `;\n throw new Error(msg);\n }\n\n const result: [number, number, number, number] = [\n Math.round(bbox[0]),\n Math.round(bbox[1]),\n typeof bbox[2] === 'number'\n ? Math.round(bbox[2])\n : Math.round(bbox[0] + defaultBboxSize),\n typeof bbox[3] === 'number'\n ? Math.round(bbox[3])\n : Math.round(bbox[1] + defaultBboxSize),\n ];\n return result;\n}\n\nexport function adaptGpt5Bbox(\n bbox: number[] | string[] | string,\n): [number, number, number, number] {\n if (\n !Array.isArray(bbox) ||\n bbox.length !== 4 ||\n !bbox.every((value) => typeof value === 'number' && Number.isFinite(value))\n ) {\n const msg = `invalid bbox data for gpt-5 mode: ${JSON.stringify(bbox)} `;\n throw new Error(msg);\n }\n\n const numericBbox = bbox as number[];\n return [numericBbox[0], numericBbox[1], numericBbox[2], numericBbox[3]];\n}\n\nexport function adaptDoubaoBbox(\n bbox: string[] | number[] | string,\n width: number,\n height: number,\n): [number, number, number, number] {\n assert(\n width > 0 && height > 0,\n 'width and height must be greater than 0 in doubao mode',\n );\n\n if (typeof bbox === 'string') {\n assert(\n /^(\\d+)\\s(\\d+)\\s(\\d+)\\s(\\d+)$/.test(bbox.trim()),\n `invalid bbox data string for doubao-vision mode: ${bbox}`,\n );\n const splitted = bbox.split(' ');\n if (splitted.length === 4) {\n return [\n Math.round((Number(splitted[0]) * width) / 1000),\n Math.round((Number(splitted[1]) * height) / 1000),\n Math.round((Number(splitted[2]) * width) / 1000),\n Math.round((Number(splitted[3]) * height) / 1000),\n ];\n }\n throw new Error(`invalid bbox data string for doubao-vision mode: ${bbox}`);\n }\n\n let bboxList: number[] = [];\n if (Array.isArray(bbox) && typeof bbox[0] === 'string') {\n bbox.forEach((item) => {\n if (typeof item === 'string' && item.includes(',')) {\n const [x, y] = item.split(',');\n bboxList.push(Number(x.trim()), Number(y.trim()));\n } else if (typeof item === 'string' && item.includes(' ')) {\n const [x, y] = item.split(' ');\n bboxList.push(Number(x.trim()), Number(y.trim()));\n } else {\n bboxList.push(Number(item));\n }\n });\n } else {\n bboxList = bbox as any;\n }\n\n if (bboxList.length === 4 || bboxList.length === 5) {\n return [\n Math.round((bboxList[0] * width) / 1000),\n Math.round((bboxList[1] * height) / 1000),\n Math.round((bboxList[2] * width) / 1000),\n Math.round((bboxList[3] * height) / 1000),\n ];\n }\n\n // treat the bbox as a center point\n if (\n bboxList.length === 6 ||\n bboxList.length === 2 ||\n bboxList.length === 3 ||\n bboxList.length === 7\n ) {\n return [\n Math.max(\n 0,\n Math.round((bboxList[0] * width) / 1000) - defaultBboxSize / 2,\n ),\n Math.max(\n 0,\n Math.round((bboxList[1] * height) / 1000) - defaultBboxSize / 2,\n ),\n Math.min(\n width,\n Math.round((bboxList[0] * width) / 1000) + defaultBboxSize / 2,\n ),\n Math.min(\n height,\n Math.round((bboxList[1] * height) / 1000) + defaultBboxSize / 2,\n ),\n ];\n }\n\n if (bbox.length === 8) {\n return [\n Math.round((bboxList[0] * width) / 1000),\n Math.round((bboxList[1] * height) / 1000),\n Math.round((bboxList[4] * width) / 1000),\n Math.round((bboxList[5] * height) / 1000),\n ];\n }\n\n const msg = `invalid bbox data for doubao-vision mode: ${JSON.stringify(bbox)} `;\n throw new Error(msg);\n}\n\nfunction normalizeBboxInput(\n bbox: AdaptBboxInput,\n): number[] | string[] | string {\n if (Array.isArray(bbox)) {\n if (Array.isArray(bbox[0])) {\n return bbox[0] as number[] | string[];\n }\n return bbox as number[] | string[];\n }\n return bbox as string;\n}\n\nexport function adaptBbox(\n bbox: AdaptBboxInput,\n width: number,\n height: number,\n modelFamily: TModelFamily | undefined,\n): [number, number, number, number] {\n const normalizedBbox = normalizeBboxInput(bbox);\n\n let result: [number, number, number, number] = [0, 0, 0, 0];\n if (\n modelFamily === 'doubao-vision' ||\n modelFamily === 'doubao-seed' ||\n isUITars(modelFamily)\n ) {\n result = adaptDoubaoBbox(normalizedBbox, width, height);\n } else if (modelFamily === 'gemini') {\n result = adaptGeminiBbox(normalizedBbox as number[], width, height);\n } else if (modelFamily === 'qwen2.5-vl') {\n result = adaptQwen2_5Bbox(normalizedBbox as number[]);\n } else if (modelFamily === 'gpt-5') {\n result = adaptGpt5Bbox(normalizedBbox);\n } else {\n // Default: normalized 0-1000 coordinate system\n // Includes: qwen3-vl, qwen3.5, glm-v, auto-glm, auto-glm-multilingual, and future models\n result = normalized01000(normalizedBbox as number[], width, height);\n }\n\n return result;\n}\n\n// x1, y1, x2, y2 -> 0-1000\nexport function normalized01000(\n bbox: number[],\n width: number,\n height: number,\n): [number, number, number, number] {\n return [\n Math.round((bbox[0] * width) / 1000),\n Math.round((bbox[1] * height) / 1000),\n Math.round((bbox[2] * width) / 1000),\n Math.round((bbox[3] * height) / 1000),\n ];\n}\n\n// y1, x1, y2, x2 -> 0-1000\nexport function adaptGeminiBbox(\n bbox: number[],\n width: number,\n height: number,\n): [number, number, number, number] {\n const left = Math.round((bbox[1] * width) / 1000);\n const top = Math.round((bbox[0] * height) / 1000);\n const right = Math.round((bbox[3] * width) / 1000);\n const bottom = Math.round((bbox[2] * height) / 1000);\n return [left, top, right, bottom];\n}\n\nexport function adaptBboxToRect(\n bbox: number[],\n width: number,\n height: number,\n offsetX = 0,\n offsetY = 0,\n rightLimit = width,\n bottomLimit = height,\n modelFamily?: TModelFamily | undefined,\n scale = 1,\n): Rect {\n debugInspectUtils(\n 'adaptBboxToRect',\n bbox,\n width,\n height,\n 'offset',\n offsetX,\n offsetY,\n 'limit',\n rightLimit,\n bottomLimit,\n 'modelFamily',\n modelFamily,\n 'scale',\n scale,\n );\n\n const [left, top, right, bottom] = adaptBbox(\n bbox,\n width,\n height,\n modelFamily,\n );\n\n // Calculate initial rect dimensions and apply boundary constraints\n // For left and top: take max with 0 to ensure they're not negative\n const rectLeft = Math.max(0, left);\n const rectTop = Math.max(0, top);\n\n // For width and height: calculate from bounded coordinates and constrain to limits\n const boundedRight = Math.min(right, rightLimit);\n const boundedBottom = Math.min(bottom, bottomLimit);\n\n const rectWidth = boundedRight - rectLeft + 1;\n const rectHeight = boundedBottom - rectTop + 1;\n\n // Apply scale after calculating dimensions - scale back to original size\n const finalLeft = scale !== 1 ? Math.round(rectLeft / scale) : rectLeft;\n const finalTop = scale !== 1 ? Math.round(rectTop / scale) : rectTop;\n const finalWidth = scale !== 1 ? Math.round(rectWidth / scale) : rectWidth;\n const finalHeight = scale !== 1 ? Math.round(rectHeight / scale) : rectHeight;\n\n const rect = {\n left: finalLeft + offsetX,\n top: finalTop + offsetY,\n width: finalWidth,\n height: finalHeight,\n };\n debugInspectUtils('adaptBboxToRect, result=', rect);\n\n return rect;\n}\n\nexport function mergeRects(rects: Rect[]) {\n const minLeft = Math.min(...rects.map((r) => r.left));\n const minTop = Math.min(...rects.map((r) => r.top));\n const maxRight = Math.max(...rects.map((r) => r.left + r.width));\n const maxBottom = Math.max(...rects.map((r) => r.top + r.height));\n return {\n left: minLeft,\n top: minTop,\n width: maxRight - minLeft,\n height: maxBottom - minTop,\n };\n}\n\n/**\n * Expand the search area to at least 400 x 400 pixels\n *\n * Step 1: Extend 100px on each side (top, right, bottom, left)\n * - If the element is near a boundary, expansion on that side will be limited\n * - No compensation is made for boundary limitations (this is intentional)\n *\n * Step 2: Ensure the area is at least 400x400 pixels\n * - Scale up proportionally from the center if needed\n * - Final result is clamped to screen boundaries\n */\nexport function expandSearchArea(rect: Rect, screenSize: Size): Rect {\n const minArea = 400 * 400;\n const expandSize = 100;\n\n // Step 1: Extend each side by expandSize (100px), clamped to screen boundaries\n // Note: If element is near boundary, actual expansion may be less than 100px on that side\n const expandedLeft = Math.max(rect.left - expandSize, 0);\n const expandedTop = Math.max(rect.top - expandSize, 0);\n\n const expandRect = {\n left: expandedLeft,\n top: expandedTop,\n width: Math.min(\n rect.left - expandedLeft + rect.width + expandSize,\n screenSize.width - expandedLeft,\n ),\n height: Math.min(\n rect.top - expandedTop + rect.height + expandSize,\n screenSize.height - expandedTop,\n ),\n };\n\n // Step 2: Check if area is already >= 400x400\n const currentArea = expandRect.width * expandRect.height;\n\n if (currentArea >= minArea) {\n return expandRect;\n }\n\n // Step 2: Scale up from center to reach minimum 400x400 area\n const centerX = expandRect.left + expandRect.width / 2;\n const centerY = expandRect.top + expandRect.height / 2;\n\n // Calculate scale factor needed to reach minimum area\n const scaleFactor = Math.sqrt(minArea / currentArea);\n const newWidth = Math.round(expandRect.width * scaleFactor);\n const newHeight = Math.round(expandRect.height * scaleFactor);\n\n // Calculate new position based on center point\n const newLeft = Math.round(centerX - newWidth / 2);\n const newTop = Math.round(centerY - newHeight / 2);\n\n // Clamp to screen boundaries\n const left = Math.max(newLeft, 0);\n const top = Math.max(newTop, 0);\n\n return {\n left,\n top,\n width: Math.min(newWidth, screenSize.width - left),\n height: Math.min(newHeight, screenSize.height - top),\n };\n}\n\nexport async function markupImageForLLM(\n screenshotBase64: string,\n tree: ElementTreeNode<BaseElement>,\n size: Size,\n) {\n const elementsInfo = treeToList(tree);\n const elementsPositionInfoWithoutText = elementsInfo!.filter(\n (elementInfo) => {\n if (elementInfo.attributes.nodeType === NodeType.TEXT) {\n return false;\n }\n return true;\n },\n );\n\n const imagePayload = await compositeElementInfoImg({\n inputImgBase64: screenshotBase64,\n elementsPositionInfo: elementsPositionInfoWithoutText,\n size,\n });\n return imagePayload;\n}\n\nexport function buildYamlFlowFromPlans(\n plans: PlanningAction[],\n actionSpace: DeviceAction<any>[],\n): MidsceneYamlFlowItem[] {\n const flow: MidsceneYamlFlowItem[] = [];\n\n for (const plan of plans) {\n const verb = plan.type;\n\n const action = actionSpace.find((action) => action.name === verb);\n if (!action) {\n console.warn(\n `Cannot convert action ${verb} to yaml flow. Will ignore it.`,\n );\n continue;\n }\n\n const flowKey = action.interfaceAlias || verb;\n const flowParam = action.paramSchema\n ? dumpActionParam(plan.param || {}, action.paramSchema)\n : {};\n\n const flowItem: MidsceneYamlFlowItem = {\n [flowKey]: '',\n ...flowParam,\n };\n\n flow.push(flowItem);\n }\n\n return flow;\n}\n\n// Zod schemas for shared types\nexport const PointSchema = z.object({\n left: z.number(),\n top: z.number(),\n});\n\nexport const SizeSchema = z.object({\n width: z.number(),\n height: z.number(),\n});\n\nexport const RectSchema = PointSchema.and(SizeSchema).and(\n z.object({\n zoom: z.number().optional(),\n }),\n);\n\n// Zod schema for TMultimodalPrompt\nexport const TMultimodalPromptSchema = z.object({\n images: z\n .array(\n z.object({\n name: z.string(),\n url: z.string(),\n }),\n )\n .optional(),\n convertHttpImage2Base64: z.boolean().optional(),\n});\n\n// Zod schema for TUserPrompt\nexport const TUserPromptSchema = z.union([\n z.string(),\n z\n .object({\n prompt: z.string(),\n })\n .and(TMultimodalPromptSchema.partial()),\n]);\n\n// Generate TypeScript types from Zod schemas\nexport type TMultimodalPrompt = z.infer<typeof TMultimodalPromptSchema>;\nexport type TUserPrompt = z.infer<typeof TUserPromptSchema>;\n\nconst locateFieldFlagName = 'midscene_location_field_flag';\n\n// Schema for locator field input (when users provide locate parameters)\nconst MidsceneLocationInput = z\n .object({\n prompt: TUserPromptSchema,\n deepLocate: z.boolean().optional(),\n deepThink: z\n .boolean()\n .optional()\n .describe('@deprecated Use `deepLocate` instead.'),\n cacheable: z.boolean().optional(),\n xpath: z.union([z.string(), z.boolean()]).optional(),\n })\n .passthrough();\n\n/**\n * Returns the schema for locator fields.\n * This now returns the input schema which is more permissive and suitable for validation.\n */\nexport const getMidsceneLocationSchema = () => {\n return MidsceneLocationInput;\n};\n\nexport const ifMidsceneLocatorField = (field: any): boolean => {\n // Handle optional fields by getting the inner type\n let actualField = field;\n if (actualField._def?.typeName === 'ZodOptional') {\n actualField = actualField._def.innerType;\n }\n\n // Check if this is a ZodObject\n if (actualField._def?.typeName === 'ZodObject') {\n const shape = actualField._def.shape();\n\n // Method 1: Check for the location field flag (for result schema)\n if (locateFieldFlagName in shape) {\n return true;\n }\n\n // Method 2: Check if it's the input schema by checking for 'prompt' field\n // Input schema has 'prompt' as a required field\n if ('prompt' in shape && shape.prompt) {\n return true;\n }\n }\n\n return false;\n};\n\nexport const dumpMidsceneLocatorField = (field: any): string => {\n assert(\n ifMidsceneLocatorField(field),\n 'field is not a midscene locator field',\n );\n\n // If field is a string, return it directly\n if (typeof field === 'string') {\n return field;\n }\n\n // If field is an object with prompt property\n if (field && typeof field === 'object' && field.prompt) {\n // If prompt is a string, return it directly\n if (typeof field.prompt === 'string') {\n return field.prompt;\n }\n // If prompt is a TUserPrompt object, extract the prompt string\n if (typeof field.prompt === 'object' && field.prompt.prompt) {\n return field.prompt.prompt; // TODO: dump images if necessary\n }\n }\n\n // Fallback: try to convert to string\n return String(field);\n};\n\nexport const findAllMidsceneLocatorField = (\n zodType?: z.ZodType<any>,\n requiredOnly?: boolean,\n): string[] => {\n if (!zodType) {\n return [];\n }\n\n // Check if this is a ZodObject by checking if it has a shape property\n const zodObject = zodType as any;\n if (zodObject._def?.typeName === 'ZodObject' && zodObject.shape) {\n const keys = Object.keys(zodObject.shape);\n return keys.filter((key) => {\n const field = zodObject.shape[key];\n if (!ifMidsceneLocatorField(field)) {\n return false;\n }\n\n // If requiredOnly is true, filter out optional fields\n if (requiredOnly) {\n return field._def?.typeName !== 'ZodOptional';\n }\n\n return true;\n });\n }\n\n // For other ZodType instances, we can't extract field names\n return [];\n};\n\nexport const dumpActionParam = (\n jsonObject: Record<string, any>,\n zodSchema: z.ZodType<any>,\n): Record<string, any> => {\n // Prevent spreading strings into {0: 'c', 1: 'o', ...}\n if (!isPlainObject(jsonObject)) {\n return {};\n }\n\n const locatorFields = findAllMidsceneLocatorField(zodSchema);\n const result = { ...jsonObject };\n\n for (const fieldName of locatorFields) {\n const fieldValue = result[fieldName];\n if (fieldValue) {\n // If it's already a string, keep it as is\n if (typeof fieldValue === 'string') {\n result[fieldName] = fieldValue;\n } else if (typeof fieldValue === 'object') {\n // Check if this field is actually a MidsceneLocationType object\n if (fieldValue.prompt) {\n // If prompt is a string, use it directly\n if (typeof fieldValue.prompt === 'string') {\n result[fieldName] = fieldValue.prompt;\n } else if (\n typeof fieldValue.prompt === 'object' &&\n fieldValue.prompt.prompt\n ) {\n // If prompt is a TUserPrompt object, extract the prompt string\n result[fieldName] = fieldValue.prompt.prompt;\n }\n }\n }\n }\n }\n\n return result;\n};\n\n/**\n * Parse and validate action parameters using Zod schema.\n * All fields are validated through Zod, EXCEPT locator fields which are skipped.\n * Default values defined in the schema are automatically applied.\n *\n * Locator fields are special business logic fields with complex validation requirements,\n * so they are intentionally excluded from Zod parsing and use existing validation logic.\n *\n * When shrunkShotToLogicalRatio is provided and !== 1, coordinates in locate fields\n * are transformed from screenshot space to logical space.\n */\nexport const parseActionParam = (\n rawParam: Record<string, any> | undefined,\n zodSchema?: z.ZodType<any>,\n options?: { shrunkShotToLogicalRatio?: number },\n): Record<string, any> | undefined => {\n // If no schema is provided, return undefined (action takes no parameters)\n if (!zodSchema) {\n return undefined;\n }\n\n // Handle undefined or null rawParam by providing an empty object\n const param = rawParam ?? {};\n\n // Find all locate fields in the schema\n const locateFields = findAllMidsceneLocatorField(zodSchema);\n\n // If there are no locate fields, just do normal validation\n if (locateFields.length === 0) {\n return zodSchema.parse(param);\n }\n\n // Extract locate field values to restore later\n const locateFieldValues: Record<string, any> = {};\n for (const fieldName of locateFields) {\n if (fieldName in param) {\n locateFieldValues[fieldName] = param[fieldName];\n }\n }\n\n // Build params for validation - skip locate fields and use dummy values\n const paramsForValidation: Record<string, any> = {};\n for (const key in param) {\n if (locateFields.includes(key)) {\n // Use dummy value to satisfy schema validation\n paramsForValidation[key] = { prompt: '_dummy_' };\n } else {\n paramsForValidation[key] = param[key];\n }\n }\n\n // Validate with dummy locate values\n const validated = zodSchema.parse(paramsForValidation);\n\n // Restore the actual locate field values (unvalidated, as per business requirement),\n // and transform coordinates from screenshot space to logical space if needed\n const ratio = options?.shrunkShotToLogicalRatio;\n for (const fieldName in locateFieldValues) {\n let value = locateFieldValues[fieldName];\n if (\n ratio !== undefined &&\n ratio !== 1 &&\n value &&\n typeof value === 'object' &&\n value.center &&\n value.rect\n ) {\n value = {\n ...value,\n center: [\n Math.round(value.center[0] / ratio),\n Math.round(value.center[1] / ratio),\n ],\n rect: {\n ...value.rect,\n left: Math.round(value.rect.left / ratio),\n top: Math.round(value.rect.top / ratio),\n width: Math.round(value.rect.width / ratio),\n height: Math.round(value.rect.height / ratio),\n },\n };\n }\n validated[fieldName] = value;\n }\n\n return validated;\n};\n\nexport const finalizeActionName = 'Finalize';\n\n/**\n * Get a readable time string for a given timestamp or the current time\n * @param format - Optional format string. Supports: YYYY, MM, DD, HH, mm, ss. Default: 'YYYY-MM-DD HH:mm:ss'\n * @param timestamp - Optional timestamp in milliseconds. If not provided, uses current system time.\n * @returns A formatted time string with format label\n */\nexport const getReadableTimeString = (\n format = 'YYYY-MM-DD HH:mm:ss',\n timestamp?: number,\n): string => {\n const now = timestamp !== undefined ? new Date(timestamp) : new Date();\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n const hours = String(now.getHours()).padStart(2, '0');\n const minutes = String(now.getMinutes()).padStart(2, '0');\n const seconds = String(now.getSeconds()).padStart(2, '0');\n\n const timeString = format\n .replace('YYYY', String(year))\n .replace('MM', month)\n .replace('DD', day)\n .replace('HH', hours)\n .replace('mm', minutes)\n .replace('ss', seconds);\n\n return `${timeString} (${format})`;\n};\n","import { getDebug } from '@midscene/shared/logger';\nimport type { ParsedAction } from './actions';\n\nconst debug = getDebug('auto-glm-parser');\n\n// Do not rely on regex extraction here; regex can fail on malformed input.\n// Bad Case: finish(message=\"Finished! Now There is a contact whose name is \\\"Tom\\\" in the list.\")\nexport const extractValueAfter = (src: string, key: string): string => {\n const idx = src.indexOf(key);\n if (idx === -1) {\n throw new Error(`Missing key ${key} in action payload ${src}`);\n }\n let rest = src.slice(idx + key.length).trim();\n if (rest.endsWith('\")')) {\n rest = rest.slice(0, -2);\n }\n return rest;\n};\n\nexport function parseAction(response: {\n think: string;\n content: string;\n}): ParsedAction {\n debug('Parsing action:', response);\n let trimmedResponse = '';\n try {\n trimmedResponse = response.content.trim();\n\n if (\n trimmedResponse.startsWith('do(action=\"Type\"') ||\n trimmedResponse.startsWith('do(action=\"Type_Name\"')\n ) {\n const text = extractValueAfter(trimmedResponse, 'text=\"');\n return {\n _metadata: 'do',\n action: 'Type',\n text,\n think: response.think,\n } as ParsedAction;\n }\n\n if (trimmedResponse.startsWith('finish(message=')) {\n let message = extractValueAfter(trimmedResponse, 'finish(message=\"');\n if (message.endsWith(')')) message = message.slice(0, -1);\n return {\n _metadata: 'finish',\n message,\n think: response.think,\n } as ParsedAction;\n }\n\n if (trimmedResponse.startsWith('do(')) {\n const actionMatch = trimmedResponse.match(/do\\(action=\"([^\"]+)\"/);\n if (!actionMatch)\n throw new Error(\n `Failed to extract action type from do() call; raw=\"${trimmedResponse}\"`,\n );\n const actionType = actionMatch[1];\n\n const baseAction = { _metadata: 'do' as const, think: response.think };\n switch (actionType) {\n case 'Tap': {\n const elementMatch = trimmedResponse.match(/element=\\[(\\d+),(\\d+)\\]/);\n if (!elementMatch)\n throw new Error(\n `Failed to extract element coordinates for Tap; raw=\"${trimmedResponse}\"`,\n );\n return {\n ...baseAction,\n action: 'Tap',\n element: [Number(elementMatch[1]), Number(elementMatch[2])],\n } as ParsedAction;\n }\n case 'Double Tap': {\n const elementMatch = trimmedResponse.match(/element=\\[(\\d+),(\\d+)\\]/);\n if (!elementMatch)\n throw new Error(\n `Failed to extract element coordinates for Double Tap; raw=\"${trimmedResponse}\"`,\n );\n return {\n ...baseAction,\n action: 'Double Tap',\n element: [Number(elementMatch[1]), Number(elementMatch[2])],\n } as ParsedAction;\n }\n case 'Swipe': {\n const startMatch = trimmedResponse.match(/start=\\[(\\d+),(\\d+)\\]/);\n const endMatch = trimmedResponse.match(/end=\\[(\\d+),(\\d+)\\]/);\n if (!startMatch || !endMatch)\n throw new Error(\n `Failed to extract start/end coordinates for Swipe; raw=\"${trimmedResponse}\"`,\n );\n return {\n ...baseAction,\n action: 'Swipe',\n start: [Number(startMatch[1]), Number(startMatch[2])],\n end: [Number(endMatch[1]), Number(endMatch[2])],\n } as ParsedAction;\n }\n case 'Long Press': {\n const elementMatch = trimmedResponse.match(/element=\\[(\\d+),(\\d+)\\]/);\n if (!elementMatch)\n throw new Error(\n `Failed to extract element coordinates for Long Press; raw=\"${trimmedResponse}\"`,\n );\n return {\n ...baseAction,\n action: 'Long Press',\n element: [Number(elementMatch[1]), Number(elementMatch[2])],\n } as ParsedAction;\n }\n case 'Launch': {\n const app = extractValueAfter(trimmedResponse, 'app=\"');\n return { ...baseAction, action: 'Launch', app } as ParsedAction;\n }\n case 'Back': {\n return { ...baseAction, action: 'Back' } as ParsedAction;\n }\n case 'Home': {\n return { ...baseAction, action: 'Home' } as ParsedAction;\n }\n case 'Wait': {\n const durationMatch = trimmedResponse.match(\n /duration=(?:[\"\\[])?(\\d+)/,\n );\n if (!durationMatch) {\n throw new Error(\n `Failed to extract duration for Wait; raw=\"${trimmedResponse}\"`,\n );\n }\n const seconds = Number.parseInt(durationMatch[1], 10);\n const durationMs = seconds * 1000;\n return {\n ...baseAction,\n action: 'Wait',\n durationMs,\n } as ParsedAction;\n }\n case 'Interact': {\n return { ...baseAction, action: 'Interact' } as ParsedAction;\n }\n case 'Call_API': {\n const instruction = extractValueAfter(\n trimmedResponse,\n 'instruction=\"',\n );\n return {\n ...baseAction,\n action: 'Call_API',\n instruction,\n } as ParsedAction;\n }\n case 'Take_over': {\n const message = extractValueAfter(trimmedResponse, 'message=\"');\n return {\n ...baseAction,\n action: 'Take_over',\n message,\n } as ParsedAction;\n }\n case 'Note': {\n const message = extractValueAfter(trimmedResponse, 'message=\"');\n return {\n ...baseAction,\n action: 'Note',\n message,\n } as ParsedAction;\n }\n default:\n throw new Error(\n `Unknown action type: ${actionType}; raw=\"${trimmedResponse}\"`,\n );\n }\n }\n throw new Error(`Failed to parse action: ${trimmedResponse}`);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Failed to parse action: ${errorMessage}; raw=\"${trimmedResponse}\"`,\n );\n }\n}\n\nexport function parseAutoGLMResponse(content: string): {\n think: string;\n content: string;\n} {\n if (content.includes('finish(message=')) {\n const parts = content.split('finish(message=');\n const think = parts[0].trim();\n const actionContent = `finish(message=${parts[1]}`;\n return { think, content: actionContent };\n }\n if (content.includes('do(action=')) {\n const parts = content.split('do(action=');\n const think = parts[0].trim();\n const actionContent = `do(action=${parts[1]}`;\n return { think, content: actionContent };\n }\n if (content.includes('<answer>')) {\n const parts = content.split('<answer>');\n const think = parts[0]\n .replace(/<think>/g, '')\n .replace(/<\\/think>/g, '')\n .trim();\n const actionContent = parts[1].replace(/<\\/answer>/g, '').trim();\n return { think, content: actionContent };\n }\n return { think: '', content };\n}\n\nexport function parseAutoGLMLocateResponse(rawResponse: string): {\n think: string;\n coordinates: { x: number; y: number } | null;\n error?: string;\n} {\n const { think, content: actionContent } = parseAutoGLMResponse(rawResponse);\n if (!actionContent.startsWith('do(action=\"Tap\"')) {\n return {\n think,\n coordinates: null,\n error: `Unexpected action type in auto-glm locate response: ${actionContent}`,\n };\n }\n try {\n const elementMatch = actionContent.match(/element=\\[(\\d+),(\\d+)\\]/);\n if (!elementMatch) {\n return {\n think,\n coordinates: null,\n error: `Failed to extract element coordinates from auto-glm response: ${actionContent}`,\n };\n }\n const x = Number(elementMatch[1]);\n const y = Number(elementMatch[2]);\n return { think, coordinates: { x, y } };\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : String(e);\n return {\n think,\n coordinates: null,\n error: `Failed to parse coordinates \"${actionContent}\" with errorMessage: ${errorMessage}`,\n };\n }\n}\n","/**\n * Auto-GLM Prompt Templates\n *\n * Portions of this file are derived from Open-AutoGLM\n * Copyright (c) 2024 zai-org\n * Licensed under the Apache License, Version 2.0\n *\n * Source: https://github.com/zai-org/Open-AutoGLM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Modifications:\n * - Adapted prompts for Midscene.js integration\n */\n\nimport type { TModelFamily } from '@midscene/shared/env';\n\n/**\n * Get formatted date string for system prompts\n * @returns Formatted date string like \"2026-01-12, Sunday\"\n */\nfunction getMultilingualFormattedDate(): string {\n const today = new Date();\n const year = today.getFullYear();\n const month = String(today.getMonth() + 1).padStart(2, '0');\n const date = String(today.getDate()).padStart(2, '0');\n const dayOfWeek = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ][today.getDay()];\n\n return `${year}-${month}-${date}, ${dayOfWeek}`;\n}\n\n/**\n * Get formatted Chinese date (e.g., \"2026年01月13日 星期一\")\n */\nfunction getChineseFormattedDate(): string {\n const today = new Date();\n const year = today.getFullYear();\n const month = String(today.getMonth() + 1).padStart(2, '0');\n const date = String(today.getDate()).padStart(2, '0');\n const weekdayNames = [\n '星期日',\n '星期一',\n '星期二',\n '星期三',\n '星期四',\n '星期五',\n '星期六',\n ];\n const weekday = weekdayNames[today.getDay()];\n\n return `${year}年${month}月${date}日 ${weekday}`;\n}\n\nconst getAutoGLMMultilingualPlanPrompt = (): string => {\n return `\nThe current date: ${getMultilingualFormattedDate()}\n\n# Setup\nYou are a professional Android operation agent assistant that can fulfill the user's high-level instructions. Given a screenshot of the Android interface at each step, you first analyze the situation, then plan the best course of action using Python-style pseudo-code.\n\n# More details about the code\nYour response format must be structured as follows:\n\nThink first: Use <think>...</think> to analyze the current screen, identify key elements, and determine the most efficient action.\nProvide the action: Use <answer>...</answer> to return a single line of pseudo-code representing the operation.\n\nYour output should STRICTLY follow the format:\n<think>\n[Your thought]\n</think>\n<answer>\n[Your operation code]\n</answer>\n\n- **Tap**\n Perform a tap action on a specified screen area. The element is a list of 2 integers, representing the coordinates of the tap point.\n **Example**:\n <answer>\n do(action=\"Tap\", element=[x,y])\n </answer>\n- **Type**\n Enter text into the currently focused input field.\n **Example**:\n <answer>\n do(action=\"Type\", text=\"Hello World\")\n </answer>\n- **Swipe**\n Perform a swipe action with start point and end point.\n **Examples**:\n <answer>\n do(action=\"Swipe\", start=[x1,y1], end=[x2,y2])\n </answer>\n- **Long Press**\n Perform a long press action on a specified screen area.\n You can add the element to the action to specify the long press area. The element is a list of 2 integers, representing the coordinates of the long press point.\n **Example**:\n <answer>\n do(action=\"Long Press\", element=[x,y])\n </answer>\n- **Launch**\n Launch an app. Try to use launch action when you need to launch an app. Check the instruction to choose the right app before you use this action.\n **Example**:\n <answer>\n do(action=\"Launch\", app=\"Settings\")\n </answer>\n- **Back**\n Press the Back button to navigate to the previous screen.\n **Example**:\n <answer>\n do(action=\"Back\")\n </answer>\n- **Finish**\n Terminate the program and optionally print a message.\n **Example**:\n <answer>\n finish(message=\"Task completed.\")\n </answer>\n\n\nREMEMBER:\n- Think before you act: Always analyze the current UI and the best course of action before executing any step, and output in <think> part.\n- Only ONE LINE of action in <answer> part per response: Each step must contain exactly one line of executable code.\n- Generate execution code strictly according to format requirements.\n `;\n};\n\nconst getAutoGLMChinesePlanPrompt = (): string => {\n return `\n今天的日期是: ${getChineseFormattedDate()}\n\n你是一个智能体分析专家,可以根据操作历史和当前状态图执行一系列操作来完成任务。\n你必须严格按照要求输出以下格式:\n<think>{think}</think>\n<answer>{action}</answer>\n\n其中:\n- {think} 是对你为什么选择这个操作的简短推理说明。\n- {action} 是本次执行的具体操作指令,必须严格遵循下方定义的指令格式。\n\n操作指令及其作用如下:\n- do(action=\"Launch\", app=\"xxx\") \n Launch是启动目标app的操作,这比通过主屏幕导航更快。此操作完成后,您将自动收到结果状态的截图。\n- do(action=\"Tap\", element=[x,y]) \n Tap是点击操作,点击屏幕上的特定点。可用此操作点击按钮、选择项目、从主屏幕打开应用程序,或与任何可点击的用户界面元素进行交互。坐标系统从左上角 (0,0) 开始到右下角(999,999)结束。此操作完成后,您将自动收到结果状态的截图。\n- do(action=\"Tap\", element=[x,y], message=\"重要操作\") \n 基本功能同Tap,点击涉及财产、支付、隐私等敏感按钮时触发。\n- do(action=\"Type\", text=\"xxx\") \n Type是输入操作,在当前聚焦的输入框中输入文本。使用此操作前,请确保输入框已被聚焦(先点击它)。输入的文本将像使用键盘输入一样输入。重要提示:手机可能正在使用 ADB 键盘,该键盘不会像普通键盘那样占用屏幕空间。要确认键盘已激活,请查看屏幕底部是否显示 'ADB Keyboard {ON}' 类似的文本,或者检查输入框是否处于激活/高亮状态。不要仅仅依赖视觉上的键盘显示。自动清除文本:当你使用输入操作时,输入框中现有的任何文本(包括占位符文本和实际输入)都会在输入新文本前自动清除。你无需在输入前手动清除文本——直接使用输入操作输入所需文本即可。操作完成后,你将自动收到结果状态的截图。\n- do(action=\"Type_Name\", text=\"xxx\") \n Type_Name是输入人名的操作,基本功能同Type。\n- do(action=\"Swipe\", start=[x1,y1], end=[x2,y2]) \n Swipe是滑动操作,通过从起始坐标拖动到结束坐标来执行滑动手势。可用于滚动内容、在屏幕之间导航、下拉通知栏以及项目栏或进行基于手势的导航。坐标系统从左上角 (0,0) 开始到右下角(999,999)结束。滑动持续时间会自动调整以实现自然的移动。此操作完成后,您将自动收到结果状态的截图。\n- do(action=\"Long Press\", element=[x,y]) \n Long Pres是长按操作,在屏幕上的特定点长按指定时间。可用于触发上下文菜单、选择文本或激活长按交互。坐标系统从左上角 (0,0) 开始到右下角(999,999)结束。此操作完成后,您将自动收到结果状态的屏幕截图。\n- do(action=\"Double Tap\", element=[x,y]) \n Double Tap在屏幕上的特定点快速连续点按两次。使用此操作可以激活双击交互,如缩放、选择文本或打开项目。坐标系统从左上角 (0,0) 开始到右下角(999,999)结束。此操作完成后,您将自动收到结果状态的截图。\n- do(action=\"Back\") \n 导航返回到上一个屏幕或关闭当前对话框。相当于按下 Android 的返回按钮。使用此操作可以从更深的屏幕返回、关闭弹出窗口或退出当前上下文。此操作完成后,您将自动收到结果状态的截图。\n- do(action=\"Home\") \n Home是回到系统桌面的操作,相当于按下 Android 主屏幕按钮。使用此操作可退出当前应用并返回启动器,或从已知状态启动新任务。此操作完成后,您将自动收到结果状态的截图。\n- do(action=\"Wait\", duration=\"x seconds\") \n 等待页面加载,x为需要等待多少秒。\n- finish(message=\"xxx\") \n finish是结束任务的操作,表示准确完整完成任务,message是终止信息。 \n\n必须遵循的规则:\n0. 严禁调用 Interact、Take_over、Note、Call_API 这四个操作,这些操作暂不支持。\n1. 在执行任何操作前,先检查当前app是否是目标app,如果不是,先执行 Launch。\n2. 如果进入到了无关页面,先执行 Back。如果执行Back后页面没有变化,请点击页面左上角的返回键进行返回,或者右上角的X号关闭。\n3. 如果页面未加载出内容,最多连续 Wait 三次,否则执行 Back重新进入。\n4. 如果页面显示网络问题,需要重新加载,请点击重新加载。\n5. 如果当前页面找不到目标联系人、商品、店铺等信息,可以尝试 Swipe 滑动查找。\n6. 遇到价格区间、时间区间等筛选条件,如果没有完全符合的,可以放宽要求。\n7. 在做小红书总结类任务时一定要筛选图文笔记。\n8. 购物车全选后再点击全选可以把状态设为全不选,在做购物车任务时,如果购物车里已经有商品被选中时,你需要点击全选后再点击取消全选,再去找需要购买或者删除的商品。\n9. 在做外卖任务时,如果相应店铺购物车里已经有其他商品你需要先把购物车清空再去购买用户指定的外卖。\n10. 在做点外卖任务时,如果用户需要点多个外卖,请尽量在同一店铺进行购买,如果无法找到可以下单,并说明某个商品未找到。\n11. 请严格遵循用户意图执行任务,用户的特殊要求可以执行多次搜索,滑动查找。比如(i)用户要求点一杯咖啡,要咸的,你可以直接搜索咸咖啡,或者搜索咖啡后滑动查找咸的咖啡,比如海盐咖啡。(ii)用户要找到XX群,发一条消息,你可以先搜索XX群,找不到结果后,将\"群\"字去掉,搜索XX重试。(iii)用户要找到宠物友好的餐厅,你可以搜索餐厅,找到筛选,找到设施,选择可带宠物,或者直接搜索可带宠物,必要时可以使用AI搜索。\n12. 在选择日期时,如果原滑动方向与预期日期越来越远,请向反方向滑动查找。\n13. 执行任务过程中如果有多个可选择的项目栏,请逐个查找每个项目栏,直到完成任务,一定不要在同一项目栏多次查找,从而陷入死循环。\n14. 在执行下一步操作前请一定要检查上一步的操作是否生效,如果点击没生效,可能因为app反应较慢,请先稍微等待一下,如果还是不生效请调整一下点击位置重试,如果仍然不生效请跳过这一步继续任务,并在finish message说明点击不生效。\n15. 在执行任务中如果遇到滑动不生效的情况,请调整一下起始点位置,增大滑动距离重试,如果还是不生效,有可能是已经滑到底了,请继续向反方向滑动,直到顶部或底部,如果仍然没有符合要求的结果,请跳过这一步继续任务,并在finish message说明但没找到要求的项目。\n16. 在做游戏任务时如果在战斗页面如果有自动战斗一定要开启自动战斗,如果多轮历史状态相似要检查自动战斗是否开启。\n17. 如果没有合适的搜索结果,可能是因为搜索页面不对,请返回到搜索页面的上一级尝试重新搜索,如果尝试三次返回上一级搜索后仍然没有符合要求的结果,执行 finish(message=\"原因\")。\n18. 在结束任务前请一定要仔细检查任务是否完整准确的完成,如果出现错选、漏选、多选的情况,请返回之前的步骤进行纠正。\n`;\n};\n\nexport const getAutoGLMPlanPrompt = (\n modelFamily: TModelFamily | undefined,\n): string => {\n if (modelFamily === 'auto-glm-multilingual') {\n return getAutoGLMMultilingualPlanPrompt();\n } else if (modelFamily === 'auto-glm') {\n return getAutoGLMChinesePlanPrompt();\n }\n throw new Error(\n `Unsupported modelFamily for Auto-GLM plan prompt: ${modelFamily}`,\n );\n};\n\nexport const getAutoGLMLocatePrompt = (\n modelFamily: TModelFamily | undefined,\n): string => {\n if (modelFamily === 'auto-glm-multilingual') {\n return `\nThe current date: ${getMultilingualFormattedDate()}\n\n# Setup\nYou are a professional Android operation agent assistant that can fulfill the user's high-level instructions. Given a screenshot of the Android interface at each step, you first analyze the situation, then plan the best course of action using Python-style pseudo-code.\n\n# More details about the code\nYour response format must be structured as follows:\n\nThink first: Use <think>...</think> to analyze the current screen, identify key elements, and determine the most efficient action.\nProvide the action: Use <answer>...</answer> to return a single line of pseudo-code representing the operation.\n\nYour output should STRICTLY follow the format:\n<think>\n[Your thought]\n</think>\n<answer>\n[Your operation code]\n</answer>\n\n- **Tap**\n Perform a tap action on a specified screen area. The element is a list of 2 integers, representing the coordinates of the tap point.\n **Example**:\n <answer>\n do(action=\"Tap\", element=[x,y])\n </answer>\n\nREMEMBER:\n- Your goal is to locate and tap the UI element specified by the user (e.g., button, icon, link, etc.). Do not attempt any other actions.\n `;\n } else if (modelFamily === 'auto-glm') {\n return `\n今天的日期是: ${getChineseFormattedDate()}\n\n你是一个智能体分析专家,可以根据操作历史和当前状态图执行一系列操作来完成任务。\n你必须严格按照要求输出以下格式:\n<think>{think}</think>\n<answer>{action}</answer>\n\n其中:\n- {think} 是对你为什么选择这个操作的简短推理说明。\n- {action} 是本次执行的具体操作指令,必须严格遵循下方定义的指令格式。\n\n操作指令及其作用如下:\n- do(action=\"Tap\", element=[x,y]) \n Tap是点击操作,点击屏幕上的特定点。可用此操作点击按钮、选择项目、从主屏幕打开应用程序,或与任何可点击的用户界面元素进行交互。坐标系统从左上角 (0,0) 开始到右下角(999,999)结束。此操作完成后,您将自动收到结果状态的截图。\n\n必须遵循的规则:\n- 你的目标是定位并点击用户指定的UI元素(例如按钮、图标、链接等),请不要尝试任何其他的操作。\n `;\n }\n throw new Error(\n `Unsupported modelFamily for Auto-GLM locate prompt: ${modelFamily}`,\n );\n};\n","import type { SubGoal, SubGoalStatus } from '@/types';\n\n/**\n * Extract content from an XML tag in a string, searching from the end.\n * This approach handles cases where models prepend thinking content (like <think>...</think>)\n * before the actual response tags, or when there are incomplete/nested tags.\n *\n * Strategy: Find the LAST closing tag, then search backwards for the nearest opening tag.\n * This ensures we get the last complete tag pair, even if there are incomplete tags before it.\n *\n * @param xmlString - The XML string to parse\n * @param tagName - The name of the tag to extract (case-insensitive)\n * @returns The trimmed content of the tag, or undefined if not found\n */\nexport function extractXMLTag(\n xmlString: string,\n tagName: string,\n): string | undefined {\n const lowerXmlString = xmlString.toLowerCase();\n const lowerTagName = tagName.toLowerCase();\n const closeTag = `</${lowerTagName}>`;\n const openTag = `<${lowerTagName}>`;\n\n // Find the last closing tag\n const lastCloseIndex = lowerXmlString.lastIndexOf(closeTag);\n if (lastCloseIndex === -1) {\n // Fallback: handle half-open tags like `<action-type>Input` without\n // matching close tag. Extract until the next XML tag boundary.\n const lastOpenIndex = lowerXmlString.lastIndexOf(openTag);\n if (lastOpenIndex === -1) {\n return undefined;\n }\n\n const contentStart = lastOpenIndex + openTag.length;\n const remaining = xmlString.substring(contentStart);\n const nextTagIndex = remaining.indexOf('<');\n const content =\n nextTagIndex === -1 ? remaining : remaining.substring(0, nextTagIndex);\n\n return content.trim();\n }\n\n // Search backwards from the closing tag to find the nearest opening tag\n const searchArea = lowerXmlString.substring(0, lastCloseIndex);\n const lastOpenIndex = searchArea.lastIndexOf(openTag);\n if (lastOpenIndex === -1) {\n return undefined;\n }\n\n // Extract content between the tags (use original string to preserve case)\n const contentStart = lastOpenIndex + openTag.length;\n const contentEnd = lastCloseIndex;\n const content = xmlString.substring(contentStart, contentEnd);\n\n return content.trim();\n}\n\n/**\n * Parse sub-goals from XML content\n * Handles both formats:\n * - <sub-goal index=\"1\" status=\"pending\">description</sub-goal>\n * - <sub-goal index=\"1\" status=\"finished\" />\n */\nexport function parseSubGoalsFromXML(xmlContent: string): SubGoal[] {\n const subGoals: SubGoal[] = [];\n\n // Match both self-closing and regular sub-goal tags\n const regex =\n /<sub-goal\\s+index=\"(\\d+)\"\\s+status=\"(pending|finished)\"(?:\\s*\\/>|>([\\s\\S]*?)<\\/sub-goal>)/gi;\n\n let match: RegExpExecArray | null;\n match = regex.exec(xmlContent);\n while (match !== null) {\n const index = Number.parseInt(match[1], 10);\n const status = match[2] as SubGoalStatus;\n const description = match[3]?.trim() || '';\n\n subGoals.push({ index, status, description });\n match = regex.exec(xmlContent);\n }\n\n return subGoals;\n}\n\n/**\n * Extract indexes of sub-goals marked as finished from <mark-sub-goal-done> content\n */\nexport function parseMarkFinishedIndexes(xmlContent: string): number[] {\n const indexes: number[] = [];\n\n // Match self-closing sub-goal tags with status=\"finished\"\n const regex = /<sub-goal\\s+index=\"(\\d+)\"\\s+status=\"finished\"\\s*\\/>/gi;\n\n let match: RegExpExecArray | null;\n match = regex.exec(xmlContent);\n while (match !== null) {\n indexes.push(Number.parseInt(match[1], 10));\n match = regex.exec(xmlContent);\n }\n\n return indexes;\n}\n\nexport const distanceThreshold = 16;\n\nexport function distance(\n point1: { x: number; y: number },\n point2: { x: number; y: number },\n) {\n return Math.sqrt((point1.x - point2.x) ** 2 + (point1.y - point2.y) ** 2);\n}\n","import type { TModelFamily } from '@midscene/shared/env';\nexport function bboxDescription(modelFamily: TModelFamily | undefined) {\n if (modelFamily === 'gemini') {\n return 'box_2d bounding box for the target element, should be [ymin, xmin, ymax, xmax] normalized to 0-1000.';\n }\n return '2d bounding box as [xmin, ymin, xmax, ymax]';\n}\n","import type {\n AIDataExtractionResponse,\n AIElementResponse,\n AISectionLocatorResponse,\n AIUsageInfo,\n Rect,\n ServiceExtractOption,\n UIContext,\n} from '@/types';\nimport type { IModelConfig } from '@midscene/shared/env';\nimport {\n generateElementByPoint,\n generateElementByRect,\n} from '@midscene/shared/extractor/dom-util';\nimport {\n cropByRect,\n paddingToMatchBlockByBase64,\n preProcessImageUrl,\n scaleImage,\n} from '@midscene/shared/img';\nimport { getDebug } from '@midscene/shared/logger';\nimport type { LocateResultElement } from '@midscene/shared/types';\nimport { assert } from '@midscene/shared/utils';\nimport type {\n ChatCompletionSystemMessageParam,\n ChatCompletionUserMessageParam,\n} from 'openai/resources/index';\nimport type { TMultimodalPrompt, TUserPrompt } from '../common';\nimport { adaptBboxToRect, expandSearchArea, mergeRects } from '../common';\nimport { parseAutoGLMLocateResponse } from './auto-glm/parser';\nimport { getAutoGLMLocatePrompt } from './auto-glm/prompt';\nimport { isAutoGLM } from './auto-glm/util';\nimport {\n extractDataQueryPrompt,\n parseXMLExtractionResponse,\n systemPromptToExtract,\n} from './prompt/extraction';\nimport {\n findElementPrompt,\n systemPromptToLocateElement,\n} from './prompt/llm-locator';\nimport {\n sectionLocatorInstruction,\n systemPromptToLocateSection,\n} from './prompt/llm-section-locator';\nimport {\n orderSensitiveJudgePrompt,\n systemPromptToJudgeOrderSensitive,\n} from './prompt/order-sensitive-judge';\nimport {\n AIResponseParseError,\n callAI,\n callAIWithObjectResponse,\n callAIWithStringResponse,\n} from './service-caller/index';\n\nexport type AIArgs = [\n ChatCompletionSystemMessageParam,\n ...ChatCompletionUserMessageParam[],\n];\n\nconst debugInspect = getDebug('ai:inspect');\nconst debugSection = getDebug('ai:section');\n\nexport async function buildSearchAreaConfig(options: {\n context: UIContext;\n baseRect: Rect;\n modelFamily: IModelConfig['modelFamily'];\n}): Promise<{ rect: Rect; imageBase64: string; scale: number }> {\n const { context, baseRect, modelFamily } = options;\n const scaleRatio = 2;\n const sectionRect = expandSearchArea(baseRect, context.shotSize);\n\n const croppedResult = await cropByRect(\n context.screenshot.base64,\n sectionRect,\n modelFamily === 'qwen2.5-vl',\n );\n\n const scaledResult = await scaleImage(croppedResult.imageBase64, scaleRatio);\n sectionRect.width = scaledResult.width;\n sectionRect.height = scaledResult.height;\n return {\n rect: sectionRect,\n imageBase64: scaledResult.imageBase64,\n scale: scaleRatio,\n };\n}\n\nconst extraTextFromUserPrompt = (prompt: TUserPrompt): string => {\n if (typeof prompt === 'string') {\n return prompt;\n } else {\n return prompt.prompt;\n }\n};\n\nconst promptsToChatParam = async (\n multimodalPrompt: TMultimodalPrompt,\n): Promise<ChatCompletionUserMessageParam[]> => {\n const msgs: ChatCompletionUserMessageParam[] = [];\n if (multimodalPrompt?.images?.length) {\n msgs.push({\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'Next, I will provide all the reference images.',\n },\n ],\n });\n\n for (const item of multimodalPrompt.images) {\n const base64 = await preProcessImageUrl(\n item.url,\n !!multimodalPrompt.convertHttpImage2Base64,\n );\n\n msgs.push({\n role: 'user',\n content: [\n {\n type: 'text',\n text: `this is the reference image named '${item.name}':`,\n },\n ],\n });\n\n msgs.push({\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: base64,\n detail: 'high',\n },\n },\n ],\n });\n }\n }\n return msgs;\n};\n\nexport async function AiLocateElement(options: {\n context: UIContext;\n targetElementDescription: TUserPrompt;\n searchConfig?: Awaited<ReturnType<typeof AiLocateSection>>;\n modelConfig: IModelConfig;\n abortSignal?: AbortSignal;\n}): Promise<{\n parseResult: {\n elements: LocateResultElement[];\n errors?: string[];\n };\n rect?: Rect;\n rawResponse: string;\n usage?: AIUsageInfo;\n reasoning_content?: string;\n}> {\n const { context, targetElementDescription, modelConfig } = options;\n const { modelFamily } = modelConfig;\n const screenshotBase64 = context.screenshot.base64;\n\n assert(\n targetElementDescription,\n 'cannot find the target element description',\n );\n const targetElementDescriptionText = extraTextFromUserPrompt(\n targetElementDescription,\n );\n const userInstructionPrompt = findElementPrompt(targetElementDescriptionText);\n const systemPrompt = isAutoGLM(modelFamily)\n ? getAutoGLMLocatePrompt(modelFamily)\n : systemPromptToLocateElement(modelFamily);\n\n let imagePayload = screenshotBase64;\n let imageWidth = context.shotSize.width;\n let imageHeight = context.shotSize.height;\n let originalImageWidth = imageWidth;\n let originalImageHeight = imageHeight;\n\n if (options.searchConfig) {\n assert(\n options.searchConfig.rect,\n 'searchArea is provided but its rect cannot be found. Failed to locate element',\n );\n assert(\n options.searchConfig.imageBase64,\n 'searchArea is provided but its imageBase64 cannot be found. Failed to locate element',\n );\n\n imagePayload = options.searchConfig.imageBase64;\n imageWidth = options.searchConfig.rect?.width;\n imageHeight = options.searchConfig.rect?.height;\n originalImageWidth = imageWidth;\n originalImageHeight = imageHeight;\n } else if (modelFamily === 'qwen2.5-vl') {\n const paddedResult = await paddingToMatchBlockByBase64(imagePayload);\n imageWidth = paddedResult.width;\n imageHeight = paddedResult.height;\n imagePayload = paddedResult.imageBase64;\n }\n\n const msgs: AIArgs = [\n { role: 'system', content: systemPrompt },\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imagePayload,\n detail: 'high',\n },\n },\n {\n type: 'text',\n text: isAutoGLM(modelFamily)\n ? `Tap: ${userInstructionPrompt}`\n : userInstructionPrompt,\n },\n ],\n },\n ];\n\n if (typeof targetElementDescription !== 'string') {\n const addOns = await promptsToChatParam({\n images: targetElementDescription.images,\n convertHttpImage2Base64: targetElementDescription.convertHttpImage2Base64,\n });\n msgs.push(...addOns);\n }\n\n if (isAutoGLM(modelFamily)) {\n const { content: rawResponseContent, usage } =\n await callAIWithStringResponse(msgs, modelConfig, {\n abortSignal: options.abortSignal,\n });\n\n debugInspect('auto-glm rawResponse:', rawResponseContent);\n\n const parsed = parseAutoGLMLocateResponse(rawResponseContent);\n\n debugInspect('auto-glm thinking:', parsed.think);\n debugInspect('auto-glm coordinates:', parsed.coordinates);\n\n let resRect: Rect | undefined;\n let matchedElements: LocateResultElement[] = [];\n let errors: string[] = [];\n\n if (parsed.error || !parsed.coordinates) {\n errors = [parsed.error || 'Failed to parse auto-glm response'];\n debugInspect('auto-glm parse error:', errors[0]);\n } else {\n const { x, y } = parsed.coordinates;\n\n debugInspect('auto-glm coordinates [0-999]:', { x, y });\n\n // Convert auto-glm coordinates [0,999] to pixel bbox\n // Map from [0,999] to pixel coordinates\n const pixelX = Math.round((x * imageWidth) / 1000);\n const pixelY = Math.round((y * imageHeight) / 1000);\n\n debugInspect('auto-glm pixel coordinates:', { pixelX, pixelY });\n\n // Apply offset if searching in a cropped area\n let finalX = pixelX;\n let finalY = pixelY;\n if (options.searchConfig?.rect) {\n finalX += options.searchConfig.rect.left;\n finalY += options.searchConfig.rect.top;\n }\n\n const element: LocateResultElement = generateElementByPoint(\n [finalX, finalY],\n targetElementDescriptionText as string,\n );\n\n resRect = element.rect;\n debugInspect('auto-glm resRect:', resRect);\n\n if (element) {\n matchedElements = [element];\n }\n }\n\n return {\n rect: resRect,\n parseResult: {\n elements: matchedElements,\n errors,\n },\n rawResponse: rawResponseContent,\n usage,\n reasoning_content: parsed.think,\n };\n }\n\n let res: Awaited<\n ReturnType<\n typeof callAIWithObjectResponse<AIElementResponse | [number, number]>\n >\n >;\n try {\n res = await callAIWithObjectResponse<AIElementResponse | [number, number]>(\n msgs,\n modelConfig,\n { abortSignal: options.abortSignal },\n );\n } catch (callError) {\n // Return error with usage and rawResponse if available\n const errorMessage =\n callError instanceof Error ? callError.message : String(callError);\n const rawResponse =\n callError instanceof AIResponseParseError\n ? callError.rawResponse\n : errorMessage;\n const usage =\n callError instanceof AIResponseParseError ? callError.usage : undefined;\n return {\n rect: undefined,\n parseResult: {\n elements: [],\n errors: [`AI call error: ${errorMessage}`],\n },\n rawResponse,\n usage,\n reasoning_content: undefined,\n };\n }\n\n const rawResponse = JSON.stringify(res.content);\n\n let resRect: Rect | undefined;\n let matchedElements: LocateResultElement[] = [];\n let errors: string[] | undefined =\n 'errors' in res.content ? res.content.errors : [];\n try {\n if (\n 'bbox' in res.content &&\n Array.isArray(res.content.bbox) &&\n res.content.bbox.length >= 1\n ) {\n resRect = adaptBboxToRect(\n res.content.bbox,\n imageWidth,\n imageHeight,\n options.searchConfig?.rect?.left,\n options.searchConfig?.rect?.top,\n originalImageWidth,\n originalImageHeight,\n modelFamily,\n options.searchConfig?.scale,\n );\n\n debugInspect('resRect', resRect);\n\n const element: LocateResultElement = generateElementByRect(\n resRect,\n targetElementDescriptionText as string,\n );\n errors = [];\n\n if (element) {\n matchedElements = [element];\n }\n }\n } catch (e) {\n const msg =\n e instanceof Error\n ? `Failed to parse bbox: ${e.message}`\n : 'unknown error in locate';\n if (!errors || errors?.length === 0) {\n errors = [msg];\n } else {\n errors.push(`(${msg})`);\n }\n }\n\n return {\n rect: resRect,\n parseResult: {\n elements: matchedElements as LocateResultElement[],\n errors: errors as string[],\n },\n rawResponse,\n usage: res.usage,\n reasoning_content: res.reasoning_content,\n };\n}\n\nexport async function AiLocateSection(options: {\n context: UIContext;\n sectionDescription: TUserPrompt;\n modelConfig: IModelConfig;\n abortSignal?: AbortSignal;\n}): Promise<{\n rect?: Rect;\n imageBase64?: string;\n scale?: number;\n error?: string;\n rawResponse: string;\n usage?: AIUsageInfo;\n}> {\n const { context, sectionDescription, modelConfig } = options;\n const { modelFamily } = modelConfig;\n const screenshotBase64 = context.screenshot.base64;\n\n const systemPrompt = systemPromptToLocateSection(modelFamily);\n const sectionLocatorInstructionText = sectionLocatorInstruction(\n extraTextFromUserPrompt(sectionDescription),\n );\n const msgs: AIArgs = [\n { role: 'system', content: systemPrompt },\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: screenshotBase64,\n detail: 'high',\n },\n },\n {\n type: 'text',\n text: sectionLocatorInstructionText,\n },\n ],\n },\n ];\n\n if (typeof sectionDescription !== 'string') {\n const addOns = await promptsToChatParam({\n images: sectionDescription.images,\n convertHttpImage2Base64: sectionDescription.convertHttpImage2Base64,\n });\n msgs.push(...addOns);\n }\n\n let result: Awaited<\n ReturnType<typeof callAIWithObjectResponse<AISectionLocatorResponse>>\n >;\n try {\n result = await callAIWithObjectResponse<AISectionLocatorResponse>(\n msgs,\n modelConfig,\n { abortSignal: options.abortSignal },\n );\n } catch (callError) {\n // Return error with usage and rawResponse if available\n const errorMessage =\n callError instanceof Error ? callError.message : String(callError);\n const rawResponse =\n callError instanceof AIResponseParseError\n ? callError.rawResponse\n : errorMessage;\n const usage =\n callError instanceof AIResponseParseError ? callError.usage : undefined;\n return {\n rect: undefined,\n imageBase64: undefined,\n error: `AI call error: ${errorMessage}`,\n rawResponse,\n usage,\n };\n }\n\n let searchAreaConfig:\n | Awaited<ReturnType<typeof buildSearchAreaConfig>>\n | undefined;\n const sectionBbox = result.content.bbox;\n if (sectionBbox) {\n const targetRect = adaptBboxToRect(\n sectionBbox,\n context.shotSize.width,\n context.shotSize.height,\n 0,\n 0,\n context.shotSize.width,\n context.shotSize.height,\n modelFamily,\n );\n debugSection('original targetRect %j', targetRect);\n\n const referenceBboxList = result.content.references_bbox || [];\n debugSection('referenceBboxList %j', referenceBboxList);\n\n const referenceRects = referenceBboxList\n .filter((bbox) => Array.isArray(bbox))\n .map((bbox) => {\n return adaptBboxToRect(\n bbox,\n context.shotSize.width,\n context.shotSize.height,\n 0,\n 0,\n context.shotSize.width,\n context.shotSize.height,\n modelFamily,\n );\n });\n debugSection('referenceRects %j', referenceRects);\n\n // merge the sectionRect and referenceRects\n const mergedRect = mergeRects([targetRect, ...referenceRects]);\n debugSection('mergedRect %j', mergedRect);\n\n const expandedRect = expandSearchArea(mergedRect, context.shotSize);\n const originalWidth = expandedRect.width;\n const originalHeight = expandedRect.height;\n debugSection('expanded sectionRect %j', expandedRect);\n\n searchAreaConfig = await buildSearchAreaConfig({\n context,\n baseRect: mergedRect,\n modelFamily,\n });\n\n debugSection(\n 'scaled sectionRect from %dx%d to %dx%d (scale=%d)',\n originalWidth,\n originalHeight,\n searchAreaConfig.rect.width,\n searchAreaConfig.rect.height,\n searchAreaConfig.scale,\n );\n }\n\n return {\n rect: searchAreaConfig?.rect,\n imageBase64: searchAreaConfig?.imageBase64,\n scale: searchAreaConfig?.scale,\n error: result.content.error,\n rawResponse: JSON.stringify(result.content),\n usage: result.usage,\n };\n}\n\nexport async function AiExtractElementInfo<T>(options: {\n dataQuery: string | Record<string, string>;\n multimodalPrompt?: TMultimodalPrompt;\n context: UIContext;\n pageDescription?: string;\n extractOption?: ServiceExtractOption;\n modelConfig: IModelConfig;\n}) {\n const { dataQuery, context, extractOption, multimodalPrompt, modelConfig } =\n options;\n const systemPrompt = systemPromptToExtract();\n const screenshotBase64 = context.screenshot.base64;\n\n const extractDataPromptText = extractDataQueryPrompt(\n options.pageDescription || '',\n dataQuery,\n );\n\n const userContent: ChatCompletionUserMessageParam['content'] = [];\n\n if (extractOption?.screenshotIncluded !== false) {\n userContent.push({\n type: 'image_url',\n image_url: {\n url: screenshotBase64,\n detail: 'high',\n },\n });\n }\n\n userContent.push({\n type: 'text',\n text: extractDataPromptText,\n });\n\n const msgs: AIArgs = [\n { role: 'system', content: systemPrompt },\n {\n role: 'user',\n content: userContent,\n },\n ];\n\n if (multimodalPrompt) {\n const addOns = await promptsToChatParam({\n images: multimodalPrompt.images,\n convertHttpImage2Base64: multimodalPrompt.convertHttpImage2Base64,\n });\n msgs.push(...addOns);\n }\n\n const {\n content: rawResponse,\n usage,\n reasoning_content,\n } = await callAI(msgs, modelConfig);\n\n // Parse XML response to JSON object\n let parseResult: AIDataExtractionResponse<T>;\n try {\n parseResult = parseXMLExtractionResponse<T>(rawResponse);\n } catch (parseError) {\n // Throw AIResponseParseError with usage and rawResponse preserved\n const errorMessage =\n parseError instanceof Error ? parseError.message : String(parseError);\n throw new AIResponseParseError(\n `XML parse error: ${errorMessage}`,\n rawResponse,\n usage,\n );\n }\n\n return {\n parseResult,\n rawResponse,\n usage,\n reasoning_content,\n };\n}\n\nexport async function AiJudgeOrderSensitive(\n description: string,\n callAIFn: typeof callAIWithObjectResponse<{ isOrderSensitive: boolean }>,\n modelConfig: IModelConfig,\n): Promise<{\n isOrderSensitive: boolean;\n usage?: AIUsageInfo;\n}> {\n const systemPrompt = systemPromptToJudgeOrderSensitive();\n const userPrompt = orderSensitiveJudgePrompt(description);\n\n const msgs: AIArgs = [\n { role: 'system', content: systemPrompt },\n {\n role: 'user',\n content: userPrompt,\n },\n ];\n\n const result = await callAIFn(msgs, modelConfig);\n\n return {\n isOrderSensitive: result.content.isOrderSensitive ?? false,\n usage: result.usage,\n };\n}\n","import type { TModelFamily } from '@midscene/shared/env';\nimport { getPreferredLanguage } from '@midscene/shared/env';\nimport { bboxDescription } from './common';\nexport function systemPromptToLocateElement(\n modelFamily: TModelFamily | undefined,\n) {\n const preferredLanguage = getPreferredLanguage();\n const bboxComment = bboxDescription(modelFamily);\n return `\n## Role:\nYou are an AI assistant that helps identify UI elements.\n\n## Objective:\n- Identify elements in screenshots that match the user's description.\n- Provide the coordinates of the element that matches the user's description.\n\n## Important Notes for Locating Elements:\n- When the user describes an element that contains text (such as buttons, input fields, dropdown options, radio buttons, etc.), you should locate ONLY the text region of that element, not the entire element boundary.\n- For example: If an input field is large (both wide and tall) with a placeholder text \"Please enter your comment\", you should locate only the area where the placeholder text appears, not the entire input field.\n- This principle applies to all text-containing elements: focus on the visible text region rather than the full element container.\n\n## Output Format:\n\\`\\`\\`json\n{\n \"bbox\": [number, number, number, number], // ${bboxComment}\n \"errors\"?: string[]\n}\n\\`\\`\\`\n\nFields:\n* \\`bbox\\` is the bounding box of the element that matches the user's description\n* \\`errors\\` is an optional array of error messages (if any)\n\nFor example, when an element is found:\n\\`\\`\\`json\n{\n \"bbox\": [100, 100, 200, 200],\n \"errors\": []\n}\n\\`\\`\\`\n\nWhen no element is found:\n\\`\\`\\`json\n{\n \"bbox\": [],\n \"errors\": [\"I can see ..., but {some element} is not found. Use ${preferredLanguage}.\"]\n}\n\\`\\`\\`\n`;\n}\n\nexport const findElementPrompt = (targetElementDescription: string) =>\n `Find: ${targetElementDescription}`;\n","import type { TModelFamily } from '@midscene/shared/env';\nimport { getPreferredLanguage } from '@midscene/shared/env';\nimport { bboxDescription } from './common';\n\nexport function systemPromptToLocateSection(\n modelFamily: TModelFamily | undefined,\n) {\n const preferredLanguage = getPreferredLanguage();\n const bboxFormat = bboxDescription(modelFamily);\n return `\n## Role:\nYou are an AI assistant that helps identify UI elements.\n\n## Objective:\n- Find a section containing the target element\n- If the description mentions reference elements, also locate sections containing those references\n\n## Output Format:\n\\`\\`\\`json\n{\n \"bbox\": [number, number, number, number], // ${bboxFormat}\n \"references_bbox\"?: [\n [number, number, number, number],\n ...\n ],\n \"error\"?: string\n}\n\\`\\`\\`\n\nFields:\n* \\`bbox\\` - Bounding box of the section containing the target element\n* \\`references_bbox\\` - Optional array of bounding boxes for reference elements\n* \\`error\\` - Optional error message if the section cannot be found. Use ${preferredLanguage}.\n\nExample:\nIf the description is \"delete button on the second row with title 'Peter'\", return:\n\\`\\`\\`json\n{\n \"bbox\": [100, 100, 200, 200],\n \"references_bbox\": [[100, 100, 200, 200]]\n}\n\\`\\`\\`\n`;\n}\n\nexport const sectionLocatorInstruction = (sectionDescription: string) =>\n `Find section containing: ${sectionDescription}`;\n","import type { AIDataExtractionResponse } from '@/types';\nimport { getPreferredLanguage } from '@midscene/shared/env';\nimport type { ResponseFormatJSONSchema } from 'openai/resources/index';\nimport { safeParseJson } from '../service-caller/index';\nimport { extractXMLTag } from './util';\n\n/**\n * Parse XML response from LLM and convert to AIDataExtractionResponse\n */\nexport function parseXMLExtractionResponse<T>(\n xmlString: string,\n): AIDataExtractionResponse<T> {\n const thought = extractXMLTag(xmlString, 'thought');\n const dataJsonStr = extractXMLTag(xmlString, 'data-json');\n const errorsStr = extractXMLTag(xmlString, 'errors');\n\n // Parse data-json (required)\n if (!dataJsonStr) {\n throw new Error('Missing required field: data-json');\n }\n\n let data: T;\n try {\n data = safeParseJson(dataJsonStr, undefined) as T;\n } catch (e) {\n throw new Error(`Failed to parse data-json: ${e}`);\n }\n\n // Parse errors (optional)\n let errors: string[] | undefined;\n if (errorsStr) {\n try {\n const parsedErrors = safeParseJson(errorsStr, undefined);\n if (Array.isArray(parsedErrors)) {\n errors = parsedErrors;\n }\n } catch (e) {\n // If errors parsing fails, just ignore it\n }\n }\n\n return {\n ...(thought ? { thought } : {}),\n data,\n ...(errors && errors.length > 0 ? { errors } : {}),\n };\n}\n\nexport function systemPromptToExtract() {\n const preferredLanguage = getPreferredLanguage();\n\n return `\nYou are a versatile professional in software UI design and testing. Your outstanding contributions will impact the user experience of billions of users.\n\nThe user will give you a screenshot, the contents of it (optional), and some data requirements in <DATA_DEMAND>. You need to understand the user's requirements and extract the data satisfying the <DATA_DEMAND>.\n\nIf a key specifies a JSON data type (such as Number, String, Boolean, Object, Array), ensure the returned value strictly matches that data type.\n\nIf the user provides multiple reference images, please carefully review the reference images with the screenshot and provide the correct answer for <DATA_DEMAND>.\n\n\nReturn in the following XML format:\n<thought>the thinking process of the extraction, less than 300 words. Use ${preferredLanguage} in this field.</thought>\n<data-json>the extracted data as JSON. Make sure both the value and scheme meet the DATA_DEMAND. If you want to write some description in this field, use the same language as the DATA_DEMAND.</data-json>\n<errors>optional error messages as JSON array, e.g., [\"error1\", \"error2\"]</errors>\n\n# Example 1\nFor example, if the DATA_DEMAND is:\n\n<DATA_DEMAND>\n{\n \"name\": \"name shows on the left panel, string\",\n \"age\": \"age shows on the right panel, number\",\n \"isAdmin\": \"if the user is admin, boolean\"\n}\n</DATA_DEMAND>\n\nBy viewing the screenshot and page contents, you can extract the following data:\n\n<thought>According to the screenshot, i can see ...</thought>\n<data-json>\n{\n \"name\": \"John\",\n \"age\": 30,\n \"isAdmin\": true\n}\n</data-json>\n\n# Example 2\nIf the DATA_DEMAND is:\n\n<DATA_DEMAND>\nthe todo items list, string[]\n</DATA_DEMAND>\n\nBy viewing the screenshot and page contents, you can extract the following data:\n\n<thought>According to the screenshot, i can see ...</thought>\n<data-json>\n[\"todo 1\", \"todo 2\", \"todo 3\"]\n</data-json>\n\n# Example 3\nIf the DATA_DEMAND is:\n\n<DATA_DEMAND>\nthe page title, string\n</DATA_DEMAND>\n\nBy viewing the screenshot and page contents, you can extract the following data:\n\n<thought>According to the screenshot, i can see ...</thought>\n<data-json>\n\"todo list\"\n</data-json>\n\n# Example 4\nIf the DATA_DEMAND is:\n\n<DATA_DEMAND>\n{\n \"result\": \"Boolean, is it currently the SMS page?\"\n}\n</DATA_DEMAND>\n\nBy viewing the screenshot and page contents, you can extract the following data:\n\n<thought>According to the screenshot, i can see ...</thought>\n<data-json>\n{ \"result\": true }\n</data-json>\n`;\n}\n\nexport const extractDataQueryPrompt = (\n pageDescription: string,\n dataQuery: string | Record<string, string>,\n) => {\n let dataQueryText = '';\n if (typeof dataQuery === 'string') {\n dataQueryText = dataQuery;\n } else {\n dataQueryText = JSON.stringify(dataQuery, null, 2);\n }\n\n return `\n<PageDescription>\n${pageDescription}\n</PageDescription>\n\n<DATA_DEMAND>\n${dataQueryText}\n</DATA_DEMAND>\n `;\n};\n","function unwrapZodField(field) {\n const f = field;\n if (!f._def) return f;\n const typeName = f._def.typeName;\n if ('ZodOptional' === typeName || 'ZodNullable' === typeName || 'ZodDefault' === typeName) return unwrapZodField(f._def.innerType);\n if ('ZodEffects' === typeName) {\n if (f._def.schema) return unwrapZodField(f._def.schema);\n }\n return f;\n}\nfunction isMidsceneLocatorField(field) {\n const actualField = unwrapZodField(field);\n if (actualField._def?.typeName === 'ZodObject') {\n const shape = actualField._def.shape?.();\n if (shape) {\n if ('midscene_location_field_flag' in shape) return true;\n if ('prompt' in shape && shape.prompt) return true;\n }\n }\n return false;\n}\nfunction getZodTypeName(field, locatorTypeDescription) {\n const actualField = unwrapZodField(field);\n const fieldTypeName = actualField._def?.typeName;\n if ('ZodString' === fieldTypeName) return 'string';\n if ('ZodNumber' === fieldTypeName) return 'number';\n if ('ZodBoolean' === fieldTypeName) return 'boolean';\n if ('ZodArray' === fieldTypeName) return 'array';\n if ('ZodObject' === fieldTypeName) {\n if (isMidsceneLocatorField(actualField)) return locatorTypeDescription || 'object';\n return 'object';\n }\n if ('ZodEnum' === fieldTypeName) {\n const values = actualField._def?.values?.map((option)=>String(`'${option}'`)).join(', ') ?? 'enum';\n return `enum(${values})`;\n }\n if ('ZodUnion' === fieldTypeName) {\n const options = actualField._def?.options;\n if (options && options.length > 0) {\n const types = options.map((opt)=>getZodTypeName(opt, locatorTypeDescription));\n return types.join(' | ');\n }\n return 'union';\n }\n return 'unknown';\n}\nfunction getZodDescription(field) {\n if (\"description\" in field) return field.description || null;\n const actualField = unwrapZodField(field);\n if (\"description\" in actualField) return actualField.description || null;\n if (isMidsceneLocatorField(actualField)) return 'Location information for the target element';\n return null;\n}\nexport { getZodDescription, getZodTypeName, isMidsceneLocatorField, unwrapZodField };\n","import { findAllMidsceneLocatorField } from '@/common';\nimport type { DeviceAction } from '@/types';\nimport type { TModelFamily } from '@midscene/shared/env';\nimport { getPreferredLanguage } from '@midscene/shared/env';\nimport {\n getZodDescription,\n getZodTypeName,\n} from '@midscene/shared/zod-schema-utils';\nimport type { z } from 'zod';\nimport { bboxDescription } from './common';\n\nconst vlLocateParam = (modelFamily: TModelFamily | undefined) => {\n if (modelFamily) {\n return `{bbox: [number, number, number, number], prompt: string } // ${bboxDescription(modelFamily)}`;\n }\n return '{ prompt: string /* description of the target element */ }';\n};\n\n/**\n * Find ZodDefault in the wrapper chain and return its default value\n */\nconst findDefaultValue = (field: unknown): any | undefined => {\n let current = field;\n const visited = new Set<unknown>();\n\n while (current && !visited.has(current)) {\n visited.add(current);\n const currentWithDef = current as {\n _def?: {\n typeName?: string;\n defaultValue?: () => any;\n innerType?: unknown;\n };\n };\n\n if (!currentWithDef._def?.typeName) break;\n\n if (currentWithDef._def.typeName === 'ZodDefault') {\n return currentWithDef._def.defaultValue?.();\n }\n\n // Continue unwrapping if it's a wrapper type\n if (\n currentWithDef._def.typeName === 'ZodOptional' ||\n currentWithDef._def.typeName === 'ZodNullable'\n ) {\n current = currentWithDef._def.innerType;\n } else {\n break;\n }\n }\n\n return undefined;\n};\n\n/**\n * Inject bbox into locate fields of a sample object.\n * Walks the sample and for any locate field (identified by paramSchema),\n * adds a fake bbox array when includeBbox is true.\n */\nconst SAMPLE_BBOXES: [number, number, number, number][] = [\n [50, 100, 200, 200],\n [300, 400, 500, 500],\n [600, 100, 800, 250],\n [50, 600, 250, 750],\n];\n\nconst injectBboxIntoSample = (\n sample: Record<string, any>,\n locateFields: string[],\n includeBbox: boolean,\n): Record<string, any> => {\n if (!includeBbox) return sample;\n const result = { ...sample };\n let bboxIndex = 0;\n for (const field of locateFields) {\n if (\n result[field] &&\n typeof result[field] === 'object' &&\n result[field].prompt\n ) {\n result[field] = {\n ...result[field],\n bbox: SAMPLE_BBOXES[bboxIndex % SAMPLE_BBOXES.length],\n };\n bboxIndex++;\n }\n }\n return result;\n};\n\nexport const descriptionForAction = (\n action: DeviceAction<any>,\n locatorSchemaTypeDescription: string,\n includeBbox = false,\n) => {\n const tab = ' ';\n const fields: string[] = [];\n\n // Add the action type field\n fields.push(`- type: \"${action.name}\"`);\n\n // Handle paramSchema if it exists\n if (action.paramSchema) {\n const paramLines: string[] = [];\n\n // Check if paramSchema is a ZodObject with shape\n const schema = action.paramSchema as {\n _def?: { typeName?: string };\n shape?: Record<string, unknown>;\n };\n const isZodObject = schema._def?.typeName === 'ZodObject';\n\n if (isZodObject && schema.shape) {\n // Original logic for ZodObject schemas\n const shape = schema.shape;\n\n for (const [key, field] of Object.entries(shape)) {\n if (field && typeof field === 'object') {\n // Check if field is optional\n const isOptional =\n typeof (field as { isOptional?: () => boolean }).isOptional ===\n 'function' &&\n (field as { isOptional: () => boolean }).isOptional();\n const keyWithOptional = isOptional ? `${key}?` : key;\n\n // Get the type name using extracted helper\n const typeName = getZodTypeName(field, locatorSchemaTypeDescription);\n\n // Get description using extracted helper\n const description = getZodDescription(field as z.ZodTypeAny);\n\n // Check if field has a default value by searching the wrapper chain\n const defaultValue = findDefaultValue(field);\n const hasDefault = defaultValue !== undefined;\n\n // Build param line for this field\n let paramLine = `${keyWithOptional}: ${typeName}`;\n const comments: string[] = [];\n if (description) {\n comments.push(description);\n }\n if (hasDefault) {\n const defaultStr =\n typeof defaultValue === 'string'\n ? `\"${defaultValue}\"`\n : JSON.stringify(defaultValue);\n comments.push(`default: ${defaultStr}`);\n }\n if (comments.length > 0) {\n paramLine += ` // ${comments.join(', ')}`;\n }\n\n paramLines.push(paramLine);\n }\n }\n\n // Add the param section to fields if there are paramLines\n if (paramLines.length > 0) {\n fields.push('- param:');\n paramLines.forEach((line) => {\n fields.push(` - ${line}`);\n });\n }\n } else {\n // Handle non-object schemas (string, number, etc.)\n const typeName = getZodTypeName(schema);\n const description = getZodDescription(schema as z.ZodTypeAny);\n\n // For simple types, indicate that param should be the direct value, not an object\n let paramDescription = `- param: ${typeName}`;\n if (description) {\n paramDescription += ` // ${description}`;\n }\n paramDescription += ' (pass the value directly, not as an object)';\n\n fields.push(paramDescription);\n }\n }\n\n // Render sample if provided, using the same XML tag format as the real output\n if (action.sample && typeof action.sample === 'object') {\n const locateFields = findAllMidsceneLocatorField(action.paramSchema);\n const sampleWithBbox = injectBboxIntoSample(\n action.sample,\n locateFields,\n includeBbox,\n );\n const sampleStr = `- sample:\\n${tab}${tab}<action-type>${action.name}</action-type>\\n${tab}${tab}<action-param-json>\\n${tab}${tab}${JSON.stringify(sampleWithBbox, null, 2).replace(/\\n/g, `\\n${tab}${tab}`)}\\n${tab}${tab}</action-param-json>`;\n fields.push(sampleStr);\n }\n\n return `- ${action.name}, ${action.description || 'No description provided'}\n${tab}${fields.join(`\\n${tab}`)}\n`.trim();\n};\n\nexport async function systemPromptToTaskPlanning({\n actionSpace,\n modelFamily,\n includeBbox,\n includeThought,\n includeSubGoals,\n}: {\n actionSpace: DeviceAction<any>[];\n modelFamily: TModelFamily | undefined;\n includeBbox: boolean;\n includeThought?: boolean;\n includeSubGoals?: boolean;\n}) {\n const preferredLanguage = getPreferredLanguage();\n\n // Validate parameters: if includeBbox is true, modelFamily must be defined\n if (includeBbox && !modelFamily) {\n throw new Error(\n 'modelFamily cannot be undefined when includeBbox is true. A valid modelFamily is required for bbox-based location.',\n );\n }\n\n const actionDescriptionList = actionSpace.map((action) => {\n return descriptionForAction(\n action,\n vlLocateParam(includeBbox ? modelFamily : undefined),\n includeBbox,\n );\n });\n const actionList = actionDescriptionList.join('\\n');\n\n const shouldIncludeThought = includeThought ?? true;\n const shouldIncludeSubGoals = includeSubGoals ?? false;\n\n // Generate locate object examples based on includeBbox\n const locateExample1 = includeBbox\n ? `{\n \"prompt\": \"Add to cart button for Sauce Labs Backpack\",\n \"bbox\": [345, 442, 458, 483]\n }`\n : `{\n \"prompt\": \"Add to cart button for Sauce Labs Backpack\"\n }`;\n\n // Locate examples for multi-turn conversation\n const locateNameField = includeBbox\n ? `{\n \"prompt\": \"Name input field in the registration form\",\n \"bbox\": [120, 180, 380, 210]\n }`\n : `{\n \"prompt\": \"Name input field in the registration form\"\n }`;\n\n const locateEmailField = includeBbox\n ? `{\n \"prompt\": \"Email input field in the registration form\",\n \"bbox\": [120, 240, 380, 270]\n }`\n : `{\n \"prompt\": \"Email input field in the registration form\"\n }`;\n\n const thoughtTag = (content: string) =>\n shouldIncludeThought ? `<thought>${content}</thought>\\n` : '';\n\n // Sub-goals related content - only included when shouldIncludeSubGoals is true\n const step1Title = shouldIncludeSubGoals\n ? '## Step 1: Observe and Plan (related tags: <thought>, <update-plan-content>, <mark-sub-goal-done>)'\n : '## Step 1: Observe (related tags: <thought>)';\n\n const step1Description = shouldIncludeSubGoals\n ? \"First, observe the current screenshot and previous logs, then break down the user's instruction into multiple high-level sub-goals. Update the status of sub-goals based on what you see in the current screenshot.\"\n : 'First, observe the current screenshot and previous logs to understand the current state.';\n\n const explicitInstructionRule = `CRITICAL - Following Explicit Instructions: When the user gives you specific operation steps (not high-level goals), you MUST execute ONLY those exact steps - nothing more, nothing less. Do NOT add extra actions even if they seem logical. For example: \"fill out the form\" means only fill fields, do NOT submit; \"click the button\" means only click, do NOT wait for page load or verify results; \"type 'hello'\" means only type, do NOT press Enter.`;\n\n const thoughtTagDescription = shouldIncludeSubGoals\n ? `REQUIRED: You MUST always output the <thought> tag. Never skip it.\n\nInclude your thought process in the <thought> tag. It should answer: What is the user's requirement? What is the current state based on the screenshot? Are all sub-goals completed? If not, what should be the next action? Write your thoughts naturally without numbering or section headers.\n\n${explicitInstructionRule}`\n : `REQUIRED: You MUST always output the <thought> tag. Never skip it.\n\nInclude your thought process in the <thought> tag. It should answer: What is the current state based on the screenshot? What should be the next action? Write your thoughts naturally without numbering or section headers.\n\n${explicitInstructionRule}`;\n\n const subGoalTags = shouldIncludeSubGoals\n ? `\n\n* <update-plan-content> tag\n\nUse this structure to give or update your plan:\n\n<update-plan-content>\n <sub-goal index=\"1\" status=\"finished|pending\">sub goal description</sub-goal>\n <sub-goal index=\"2\" status=\"finished|pending\">sub goal description</sub-goal>\n ...\n</update-plan-content>\n\n* <mark-sub-goal-done> tag\n\nUse this structure to mark a sub-goal as done:\n\n<mark-sub-goal-done>\n <sub-goal index=\"1\" status=\"finished\" />\n</mark-sub-goal-done>\n\nIMPORTANT: You MUST only mark a sub-goal as \"finished\" AFTER you have confirmed the task is actually completed by observing the result in the screenshot. Do NOT mark a sub-goal as done just because you expect the next action will complete it. Wait until you see visual confirmation in the screenshot that the sub-goal has been achieved.\n\n* Note\n\nDuring execution, you can call <update-plan-content> at any time to update the plan based on the latest screenshot and completed sub-goals.\n\n### Example\n\nIf the user wants to \"log in to a system using username and password, complete all to-do items, and submit a registration form\", you can break it down into the following sub-goals:\n\n<thought>...</thought>\n<update-plan-content>\n <sub-goal index=\"1\" status=\"pending\">Log in to the system</sub-goal>\n <sub-goal index=\"2\" status=\"pending\">Complete all to-do items</sub-goal>\n <sub-goal index=\"3\" status=\"pending\">Submit the registration form</sub-goal>\n</update-plan-content>\n\nAfter logging in and seeing the to-do items, you can mark the sub-goal as done:\n\n<mark-sub-goal-done>\n <sub-goal index=\"1\" status=\"finished\" />\n</mark-sub-goal-done>\n\nAt this point, the status of all sub-goals is:\n\n<update-plan-content>\n <sub-goal index=\"1\" status=\"finished\" />\n <sub-goal index=\"2\" status=\"pending\" />\n <sub-goal index=\"3\" status=\"pending\" />\n</update-plan-content>\n\nAfter some time, when the last sub-goal is also completed, you can mark it as done as well:\n\n<mark-sub-goal-done>\n <sub-goal index=\"3\" status=\"finished\" />\n</mark-sub-goal-done>`\n : '';\n\n // Step numbering adjusts based on whether sub-goals are included\n // When includeSubGoals=false, memory step is skipped\n const memoryStepNumber = 2; // Only used when shouldIncludeSubGoals is true\n const checkGoalStepNumber = shouldIncludeSubGoals ? 3 : 2;\n const actionStepNumber = shouldIncludeSubGoals ? 4 : 3;\n\n return `\nTarget: You are an expert to manipulate the UI to accomplish the user's instruction. User will give you an instruction, some screenshots, background knowledge and previous logs indicating what have been done. Your task is to accomplish the instruction by thinking through the path to complete the task and give the next action to execute.\n\n${step1Title}\n\n${step1Description}\n\n* <thought> tag (REQUIRED)\n\n${thoughtTagDescription}\n${subGoalTags}\n${\n shouldIncludeSubGoals\n ? `\n## Step ${memoryStepNumber}: Memory Data from Current Screenshot (related tags: <memory>)\n\nWhile observing the current screenshot, if you notice any information that might be needed in follow-up actions, record it here. The current screenshot will NOT be available in subsequent steps, so this memory is your only way to preserve essential information. Examples: extracted data, element states, content that needs to be referenced.\n\nDon't use this tag if no information needs to be preserved.\n`\n : ''\n}\n## Step ${checkGoalStepNumber}: ${shouldIncludeSubGoals ? 'Check if Goal is Accomplished' : 'Check if the Instruction is Fulfilled'} (related tags: <complete>)\n\n${shouldIncludeSubGoals ? 'Based on the current screenshot and the status of all sub-goals, determine' : 'Determine'} if the entire task is completed.\n\n### CRITICAL: The User's Instruction is the Supreme Authority\n\nThe user's instruction defines the EXACT scope of what you must accomplish. You MUST follow it precisely - nothing more, nothing less. Violating this rule may cause severe consequences such as data loss, unintended operations, or system failures.\n\n**Explicit instructions vs. High-level goals:**\n- If the user gives you **explicit operation steps** (e.g., \"click X\", \"type Y\", \"fill out the form\"), treat them as exact commands. Execute ONLY those steps, nothing more.\n- If the user gives you a **high-level goal** (e.g., \"log in to the system\", \"complete the purchase\"), you may determine the necessary steps to achieve it.\n\n**What \"${shouldIncludeSubGoals ? 'goal accomplished' : 'instruction fulfilled'}\" means:**\n- The ${shouldIncludeSubGoals ? 'goal is accomplished' : 'instruction is fulfilled'} when you have done EXACTLY what the user asked - no extra steps, no assumptions.\n- Do NOT perform any action beyond the explicit instruction, even if it seems logical or helpful.\n\n**Examples - Explicit instructions (execute exactly, no extra steps):**\n- \"fill out the form\" → ${shouldIncludeSubGoals ? 'Goal accomplished' : 'Instruction fulfilled'} when all fields are filled. Do NOT submit the form.\n- \"click the login button\" → ${shouldIncludeSubGoals ? 'Goal accomplished' : 'Instruction fulfilled'} once clicked. Do NOT wait for page load or verify login success.\n- \"type 'hello' in the search box\" → ${shouldIncludeSubGoals ? 'Goal accomplished' : 'Instruction fulfilled'} when 'hello' is typed. Do NOT press Enter or trigger search.\n- \"select the first item\" → ${shouldIncludeSubGoals ? 'Goal accomplished' : 'Instruction fulfilled'} when selected. Do NOT proceed to checkout.\n\n**Special case - Assertion instructions:**\n- If the user's instruction includes an assertion (e.g., \"verify that...\", \"check that...\", \"assert...\"), and you observe from the screenshot that the assertion condition is NOT satisfied and cannot be satisfied, mark ${shouldIncludeSubGoals ? 'the goal' : 'it'} as failed (success=\"false\").\n- If the page is still loading (e.g., you see a loading spinner, skeleton screen, or progress bar), do NOT assert yet. Wait for the page to finish loading before evaluating the assertion.\n${\n !shouldIncludeSubGoals\n ? `\n**Page navigation restriction:**\n- Unless the user's instruction explicitly asks you to click a link, jump to another page, or navigate to a URL, you MUST complete the task on the current page only.\n- Do NOT navigate away from the current page on your own initiative (e.g., do not click links that lead to other pages, do not use browser back/forward, do not open new URLs).\n- If the task cannot be accomplished on the current page and the user has not instructed you to navigate, report it as a failure (success=\"false\") instead of attempting to navigate to other pages.\n`\n : ''\n}\n### Output Rules\n\n- If the task is NOT complete, skip this section and continue to Step ${actionStepNumber}.\n- Use the <complete success=\"true|false\">message</complete> tag to output the result if the goal is accomplished or failed.\n - the 'success' attribute is required. ${shouldIncludeSubGoals ? 'It means whether the expected goal is accomplished based on what you observe in the current screenshot. ' : ''}No matter what actions were executed or what errors occurred during execution, if the ${shouldIncludeSubGoals ? 'expected goal is accomplished' : 'instruction is fulfilled'}, set success=\"true\". If the ${shouldIncludeSubGoals ? 'expected goal is not accomplished and cannot be accomplished' : 'instruction is not fulfilled and cannot be fulfilled'}, set success=\"false\".\n - the 'message' is the information that will be provided to the user. If the user asks for a specific format, strictly follow that.\n- If you output <complete>, do NOT output <action-type> or <action-param-json>. The task ends here.\n\n## Step ${actionStepNumber}: Determine Next Action (related tags: <log>, <action-type>, <action-param-json>, <error>)\n\nONLY if the task is not complete: Think what the next action is according to the current screenshot${shouldIncludeSubGoals ? ' and the plan' : ''}.\n\n- Don't give extra actions or plans beyond the instruction or the plan. For example, don't try to submit the form if the instruction is only to fill something.\n- Consider the current screenshot and give the action that is most likely to accomplish the instruction. For example, if the next step is to click a button but it's not visible in the screenshot, you should try to find it first instead of give a click action.\n- Make sure the previous actions are completed successfully. Otherwise, retry or do something else to recover.\n- Give just the next ONE action you should do (if any)\n- If there are some error messages reported by the previous actions, don't give up, try parse a new action to recover. If the error persists for more than 3 times, you should think this is an error and set the \"error\" field to the error message.\n\n### Supporting actions list\n\n${actionList}\n\n### Log to give user feedback (preamble message)\n\nThe <log> tag is a brief preamble message to the user explaining what you're about to do. It should follow these principles and examples:\n\n- **Use ${preferredLanguage}**\n- **Keep it concise**: be no more than 1-2 sentences, focused on immediate, tangible next steps. (8–12 words or Chinese characters for quick updates).\n- **Build on prior context**: if this is not the first action to be done, use the preamble message to connect the dots with what's been done so far and create a sense of momentum and clarity for the user to understand your next actions.\n- **Keep your tone light, friendly and curious**: add small touches of personality in preambles feel collaborative and engaging.\n\n**Examples:**\n- <log>Click the login button</log>\n- <log>Scroll to find the 'Yes' button in popup</log>\n- <log>Previous actions failed to find the 'Yes' button, i will try again</log>\n- <log>Go back to find the login button</log>\n\n### If there is some action to do ...\n\n- Use the <action-type> and <action-param-json> tags to output the action to be executed.\n- The <action-type> MUST be one of the supporting actions. 'complete' is NOT a valid action-type.\n- Parameter names are strict. Use EXACTLY the field names listed for the selected action. Do NOT invent alias fields. If an action has a \"sample\" in its description, follow that structure.\nFor example:\n<action-type>Tap</action-type>\n<action-param-json>\n{\n \"locate\": ${locateExample1}\n}\n</action-param-json>\n\n### If you think there is an error ...\n\n- Use the <error> tag to output the error message.\n\nFor example:\n<error>Unable to find the required element on the page</error>\n\n### If there is no action to do ...\n\n- Don't output <action-type> or <action-param-json> if there is no action to do.\n\n## Return Format\n\nReturn in XML format following this decision flow:\n\n**Always include (REQUIRED):**\n<!-- Step 1: Observe${shouldIncludeSubGoals ? ' and Plan' : ''} -->\n<thought>Your thought process here. NEVER skip this tag.</thought>\n${\n shouldIncludeSubGoals\n ? `\n<!-- required when no update-plan-content is provided in the previous response -->\n<update-plan-content>...</update-plan-content>\n\n<!-- required when any sub-goal is completed -->\n<mark-sub-goal-done>\n <sub-goal index=\"1\" status=\"finished\" />\n</mark-sub-goal-done>\n`\n : ''\n}${\n shouldIncludeSubGoals\n ? `\n<!-- Step ${memoryStepNumber}: Memory data from current screenshot if needed -->\n<memory>...</memory>\n`\n : ''\n}\n**Then choose ONE of the following paths:**\n\n**Path A: If the ${shouldIncludeSubGoals ? 'goal is accomplished' : 'instruction is fulfilled'} or failed (Step ${checkGoalStepNumber})**\n<complete success=\"true|false\">...</complete>\n\n**Path B: If the ${shouldIncludeSubGoals ? 'goal is NOT complete' : 'instruction is NOT fulfilled'} yet (Step ${actionStepNumber})**\n<!-- Determine next action -->\n<log>...</log>\n<action-type>...</action-type>\n<action-param-json>...</action-param-json>\n\n<!-- OR if there's an error -->\n<error>...</error>\n${\n shouldIncludeSubGoals\n ? `\n## Multi-turn Conversation Example\n\nBelow is an example of a multi-turn conversation for \"fill out the registration form with name 'John' and email 'john@example.com', then return the filled email address\":\n\n### Turn 1 - Initial instruction\n\n**User message:**\n<user_instruction>fill out the registration form with name 'John' and email 'john@example.com', then return the filled email address</user_instruction>\n\n**Screenshot:** [Shows a registration form with empty Name and Email fields]\n\n**Your response:**\n<thought>The user wants me to fill out the registration form with specific values and return the email address. I can see the form has two fields: Name and Email. Both are currently empty. I'll break this down into sub-goals and start with the Name field. Note: The instruction is to fill the form only (not submit), and return the email at the end.</thought>\n<update-plan-content>\n <sub-goal index=\"1\" status=\"pending\">Fill in the Name field with 'John'</sub-goal>\n <sub-goal index=\"2\" status=\"pending\">Fill in the Email field with 'john@example.com'</sub-goal>\n <sub-goal index=\"3\" status=\"pending\">Return the filled email address</sub-goal>\n</update-plan-content>\n<log>Click on the Name field to start filling the form</log>\n<action-type>Tap</action-type>\n<action-param-json>\n{\n \"locate\": ${locateNameField}\n}\n</action-param-json>\n\n### Turn 2 - After clicking Name field\n\n**User message:**\nThe previous action has been executed, here is the latest screenshot. Please continue according to the instruction.\n\nSub-goals:\n1. Fill in the Name field with 'John' (running)\n2. Fill in the Email field with 'john@example.com' (pending)\n3. Return the filled email address (pending)\nCurrent sub-goal is: Fill in the Name field with 'John'\nActions performed for current sub-goal:\n- Click on the Name field to start filling the form\n\n**Screenshot:** [Shows the form with Name field now focused/active]\n\n**Your response:**\n<thought>The Name field is now focused. I need to type 'John' into this field. Current sub-goal is running, will be completed after input.</thought>\n<log>Typing 'John' into the Name field</log>\n<action-type>Input</action-type>\n<action-param-json>\n{\n \"value\": \"John\"\n}\n</action-param-json>\n\n### Turn 3 - After entering name\n\n**User message:**\nThe previous action has been executed, here is the latest screenshot. Please continue according to the instruction.\n\nSub-goals:\n1. Fill in the Name field with 'John' (running)\n2. Fill in the Email field with 'john@example.com' (pending)\n3. Return the filled email address (pending)\nCurrent sub-goal is: Fill in the Name field with 'John'\nActions performed for current sub-goal:\n- Click on the Name field to start filling the form\n- Typing 'John' into the Name field\n\n**Screenshot:** [Shows the form with Name field containing 'John']\n\n**Your response:**\n<thought>The Name field now shows 'John'. Sub-goal 1 is complete. Next, I need to fill the Email field for sub-goal 2.</thought>\n<mark-sub-goal-done>\n <sub-goal index=\"1\" status=\"finished\" />\n</mark-sub-goal-done>\n<memory>Name field has been filled with 'John'</memory>\n<log>Moving to the Email field</log>\n<action-type>Tap</action-type>\n<action-param-json>\n{\n \"locate\": ${locateEmailField}\n}\n</action-param-json>\n\n### Turn 4 - After clicking Email field\n\n**User message:**\nThe previous action has been executed, here is the latest screenshot. Please continue according to the instruction.\n\nSub-goals:\n1. Fill in the Name field with 'John' (finished)\n2. Fill in the Email field with 'john@example.com' (running)\n3. Return the filled email address (pending)\nCurrent sub-goal is: Fill in the Email field with 'john@example.com'\nActions performed for current sub-goal:\n- Moving to the Email field\n\n**Screenshot:** [Shows the form with Name='John' and Email field focused]\n\n**Your response:**\n<thought>The Email field is now focused. I'll enter 'john@example.com'. After this, sub-goal 2 will be complete and my task will be done.</thought>\n<log>Typing email address into the Email field</log>\n<action-type>Input</action-type>\n<action-param-json>\n{\n \"value\": \"john@example.com\"\n}\n</action-param-json>\n\n### Turn 5 - After entering email (Goal accomplished)\n\n**User message:**\nThe previous action has been executed, here is the latest screenshot. Please continue according to the instruction.\n\nSub-goals:\n1. Fill in the Name field with 'John' (finished)\n2. Fill in the Email field with 'john@example.com' (running)\n3. Return the filled email address (pending)\nCurrent sub-goal is: Fill in the Email field with 'john@example.com'\nActions performed for current sub-goal:\n- Moving to the Email field\n- Typing email address into the Email field\n\n**Screenshot:** [Shows the form with Name='John' and Email='john@example.com']\n\n**Your response:**\n<thought>Both fields are now filled: Name shows 'John' and Email shows 'john@example.com'. Sub-goal 2 is complete. The user asked me to return the filled email address, so I need to include 'john@example.com' in my response. All sub-goals are now finished.</thought>\n<mark-sub-goal-done>\n <sub-goal index=\"2\" status=\"finished\" />\n <sub-goal index=\"3\" status=\"finished\" />\n</mark-sub-goal-done>\n<complete success=\"true\">john@example.com</complete>\n`\n : `\n## Multi-turn Conversation Example\n\nBelow is an example of a multi-turn conversation for \"fill out the registration form with name 'John' and email 'john@example.com', then return the filled email address\":\n\n### Turn 1 - Initial instruction\n\n**User message:**\n<user_instruction>fill out the registration form with name 'John' and email 'john@example.com', then return the filled email address</user_instruction>\n\n**Screenshot:** [Shows a registration form with empty Name and Email fields]\n\n**Your response:**\n<thought>The user wants me to fill out the registration form with specific values and return the email address. I can see the form has two fields: Name and Email. Both are currently empty. I should start by clicking on the Name field. Note: The instruction is to fill the form only (not submit), and return the email at the end.</thought>\n<log>Click on the Name field to start filling the form</log>\n<action-type>Tap</action-type>\n<action-param-json>\n{\n \"locate\": ${locateNameField}\n}\n</action-param-json>\n\n### Turn 2 - After clicking Name field\n\n**User message:**\nThe previous action has been executed, here is the latest screenshot. Please continue according to the instruction.\n\n**Screenshot:** [Shows the form with Name field now focused/active]\n\n**Your response:**\n<thought>The Name field is now focused. I need to type 'John' into this field. After this, I'll need to fill the Email field as well.</thought>\n<log>Typing 'John' into the Name field</log>\n<action-type>Input</action-type>\n<action-param-json>\n{\n \"value\": \"John\"\n}\n</action-param-json>\n\n### Turn 3 - After entering name\n\n**User message:**\nThe previous action has been executed, here is the latest screenshot. Please continue according to the instruction.\n\n**Screenshot:** [Shows the form with Name field containing 'John']\n\n**Your response:**\n<thought>The Name field now shows 'John'. Next, I need to fill the Email field with 'john@example.com'. I'll click on the Email field first.</thought>\n<log>Moving to the Email field</log>\n<action-type>Tap</action-type>\n<action-param-json>\n{\n \"locate\": ${locateEmailField}\n}\n</action-param-json>\n\n### Turn 4 - After clicking Email field\n\n**User message:**\nThe previous action has been executed, here is the latest screenshot. Please continue according to the instruction.\n\n**Screenshot:** [Shows the form with Name='John' and Email field focused]\n\n**Your response:**\n<thought>The Email field is now focused. I'll enter 'john@example.com'. After this, both required fields will be filled and my task will be complete.</thought>\n<log>Typing email address into the Email field</log>\n<action-type>Input</action-type>\n<action-param-json>\n{\n \"value\": \"john@example.com\"\n}\n</action-param-json>\n\n### Turn 5 - After entering email (Instruction fulfilled)\n\n**User message:**\nThe previous action has been executed, here is the latest screenshot. Please continue according to the instruction.\n\n**Screenshot:** [Shows the form with Name='John' and Email='john@example.com']\n\n**Your response:**\n<thought>Both fields are now filled: Name shows 'John' and Email shows 'john@example.com'. The user asked me to return the filled email address, so I should include 'john@example.com' in my response. The instruction has been fulfilled.</thought>\n<complete success=\"true\">john@example.com</complete>\n`\n}`;\n}\n","import type {\n DeepThinkOption,\n DeviceAction,\n InterfaceType,\n PlanningAIResponse,\n RawResponsePlanningAIResponse,\n UIContext,\n} from '@/types';\nimport type { IModelConfig, TModelFamily } from '@midscene/shared/env';\nimport { paddingToMatchBlockByBase64 } from '@midscene/shared/img';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport type { ChatCompletionMessageParam } from 'openai/resources/index';\nimport {\n buildYamlFlowFromPlans,\n fillBboxParam,\n findAllMidsceneLocatorField,\n} from '../common';\nimport type { ConversationHistory } from './conversation-history';\nimport { systemPromptToTaskPlanning } from './prompt/llm-planning';\nimport {\n extractXMLTag,\n parseMarkFinishedIndexes,\n parseSubGoalsFromXML,\n} from './prompt/util';\nimport {\n AIResponseParseError,\n callAI,\n safeParseJson,\n} from './service-caller/index';\n\nconst debug = getDebug('planning');\nconst warnLog = getDebug('planning', { console: true });\n\n/**\n * Parse XML response from LLM and convert to RawResponsePlanningAIResponse\n */\nexport function parseXMLPlanningResponse(\n xmlString: string,\n modelFamily: TModelFamily | undefined,\n): RawResponsePlanningAIResponse {\n const thought = extractXMLTag(xmlString, 'thought');\n const memory = extractXMLTag(xmlString, 'memory');\n const log = extractXMLTag(xmlString, 'log') || '';\n const error = extractXMLTag(xmlString, 'error');\n const actionType = extractXMLTag(xmlString, 'action-type');\n const actionParamStr = extractXMLTag(xmlString, 'action-param-json');\n\n // Parse <complete> tag with success attribute\n const completeGoalRegex =\n /<complete\\s+success=\"(true|false)\">([\\s\\S]*?)<\\/complete>/i;\n const completeGoalMatch = xmlString.match(completeGoalRegex);\n let finalizeMessage: string | undefined;\n let finalizeSuccess: boolean | undefined;\n\n if (completeGoalMatch) {\n finalizeSuccess = completeGoalMatch[1] === 'true';\n finalizeMessage = completeGoalMatch[2]?.trim() || undefined;\n }\n\n // Parse sub-goal related tags\n const updatePlanContent = extractXMLTag(xmlString, 'update-plan-content');\n const markSubGoalDone = extractXMLTag(xmlString, 'mark-sub-goal-done');\n\n const updateSubGoals = updatePlanContent\n ? parseSubGoalsFromXML(updatePlanContent)\n : undefined;\n const markFinishedIndexes = markSubGoalDone\n ? parseMarkFinishedIndexes(markSubGoalDone)\n : undefined;\n\n // Parse action\n let action: any = null;\n if (actionType && actionType.toLowerCase() !== 'null') {\n // Strip any trailing XML tags that LLM might have leaked into the action type\n // e.g. \"KeyboardPress</action-type>\\n<action-param-json>\" -> \"KeyboardPress\"\n const type = actionType.split('<')[0].trim();\n let param: any = undefined;\n\n if (actionParamStr) {\n try {\n // Parse the JSON string in action-param-json\n param = safeParseJson(actionParamStr, modelFamily);\n } catch (e) {\n throw new Error(`Failed to parse action-param-json: ${e}`);\n }\n }\n\n action = {\n type,\n ...(param !== undefined ? { param } : {}),\n };\n }\n\n return {\n ...(thought ? { thought } : {}),\n ...(memory ? { memory } : {}),\n log,\n ...(error ? { error } : {}),\n action,\n ...(finalizeMessage !== undefined ? { finalizeMessage } : {}),\n ...(finalizeSuccess !== undefined ? { finalizeSuccess } : {}),\n ...(updateSubGoals?.length ? { updateSubGoals } : {}),\n ...(markFinishedIndexes?.length ? { markFinishedIndexes } : {}),\n };\n}\n\nexport async function plan(\n userInstruction: string,\n opts: {\n context: UIContext;\n interfaceType: InterfaceType;\n actionSpace: DeviceAction<any>[];\n actionContext?: string;\n modelConfig: IModelConfig;\n conversationHistory: ConversationHistory;\n includeBbox: boolean;\n imagesIncludeCount?: number;\n deepThink?: DeepThinkOption;\n abortSignal?: AbortSignal;\n },\n): Promise<PlanningAIResponse> {\n const { context, modelConfig, conversationHistory } = opts;\n const { shotSize } = context;\n const screenshotBase64 = context.screenshot.base64;\n\n const { modelFamily } = modelConfig;\n\n // Only enable sub-goals when deepThink is true\n const includeSubGoals = opts.deepThink === true;\n\n const systemPrompt = await systemPromptToTaskPlanning({\n actionSpace: opts.actionSpace,\n modelFamily,\n includeBbox: opts.includeBbox,\n includeThought: true, // always include thought\n includeSubGoals,\n });\n\n let imagePayload = screenshotBase64;\n let imageWidth = shotSize.width;\n let imageHeight = shotSize.height;\n const rightLimit = imageWidth;\n const bottomLimit = imageHeight;\n\n // Process image based on VL mode requirements\n if (modelFamily === 'qwen2.5-vl') {\n const paddedResult = await paddingToMatchBlockByBase64(imagePayload);\n imageWidth = paddedResult.width;\n imageHeight = paddedResult.height;\n imagePayload = paddedResult.imageBase64;\n }\n\n const actionContext = opts.actionContext\n ? `<high_priority_knowledge>${opts.actionContext}</high_priority_knowledge>\\n`\n : '';\n\n const instruction: ChatCompletionMessageParam[] = [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `${actionContext}<user_instruction>${userInstruction}</user_instruction>`,\n },\n ],\n },\n ];\n\n let latestFeedbackMessage: ChatCompletionMessageParam;\n\n // Build sub-goal status text to include in the message\n // In deepThink mode: show full sub-goals with logs\n // In non-deepThink mode: show historical execution logs\n const subGoalsText = includeSubGoals\n ? conversationHistory.subGoalsToText()\n : conversationHistory.historicalLogsToText();\n const subGoalsSection = subGoalsText ? `\\n\\n${subGoalsText}` : '';\n\n // Build memories text to include in the message\n const memoriesText = conversationHistory.memoriesToText();\n const memoriesSection = memoriesText ? `\\n\\n${memoriesText}` : '';\n\n if (conversationHistory.pendingFeedbackMessage) {\n latestFeedbackMessage = {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `${conversationHistory.pendingFeedbackMessage}. The previous action has been executed, here is the latest screenshot. Please continue according to the instruction.${memoriesSection}${subGoalsSection}`,\n },\n {\n type: 'image_url',\n image_url: {\n url: imagePayload,\n detail: 'high',\n },\n },\n ],\n };\n\n conversationHistory.resetPendingFeedbackMessageIfExists();\n } else {\n latestFeedbackMessage = {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `this is the latest screenshot${memoriesSection}${subGoalsSection}`,\n },\n {\n type: 'image_url',\n image_url: {\n url: imagePayload,\n detail: 'high',\n },\n },\n ],\n };\n }\n conversationHistory.append(latestFeedbackMessage);\n\n // Compress history if it exceeds the threshold to avoid context overflow\n conversationHistory.compressHistory(50, 20);\n\n const historyLog = conversationHistory.snapshot(opts.imagesIncludeCount);\n\n const msgs: ChatCompletionMessageParam[] = [\n { role: 'system', content: systemPrompt },\n ...instruction,\n ...historyLog,\n ];\n\n let {\n content: rawResponse,\n usage,\n reasoning_content,\n } = await callAI(msgs, modelConfig, {\n deepThink: opts.deepThink === 'unset' ? undefined : opts.deepThink,\n abortSignal: opts.abortSignal,\n });\n\n // Parse XML response to JSON object, retry once on parse failure\n let planFromAI: RawResponsePlanningAIResponse;\n try {\n try {\n planFromAI = parseXMLPlanningResponse(rawResponse, modelFamily);\n } catch {\n const retry = await callAI(msgs, modelConfig, {\n deepThink: opts.deepThink === 'unset' ? undefined : opts.deepThink,\n abortSignal: opts.abortSignal,\n });\n rawResponse = retry.content;\n usage = retry.usage;\n reasoning_content = retry.reasoning_content;\n planFromAI = parseXMLPlanningResponse(rawResponse, modelFamily);\n }\n\n if (planFromAI.action && planFromAI.finalizeSuccess !== undefined) {\n warnLog(\n 'Planning response included both an action and <complete>; ignoring <complete> output.',\n );\n planFromAI.finalizeMessage = undefined;\n planFromAI.finalizeSuccess = undefined;\n }\n\n const actions = planFromAI.action ? [planFromAI.action] : [];\n let shouldContinuePlanning = true;\n\n // Check if task is completed via <complete> tag\n if (planFromAI.finalizeSuccess !== undefined) {\n debug('task completed via <complete> tag, stop planning');\n shouldContinuePlanning = false;\n // Mark all sub-goals as finished when goal is completed (only when deepThink is enabled)\n if (includeSubGoals) {\n conversationHistory.markAllSubGoalsFinished();\n }\n }\n\n const returnValue: PlanningAIResponse = {\n ...planFromAI,\n actions,\n rawResponse,\n usage,\n reasoning_content,\n yamlFlow: buildYamlFlowFromPlans(actions, opts.actionSpace),\n shouldContinuePlanning,\n };\n\n assert(planFromAI, \"can't get plans from AI\");\n\n actions.forEach((action) => {\n const type = action.type;\n const actionInActionSpace = opts.actionSpace.find(\n (action) => action.name === type,\n );\n\n debug('actionInActionSpace matched', actionInActionSpace);\n const locateFields = actionInActionSpace\n ? findAllMidsceneLocatorField(actionInActionSpace.paramSchema)\n : [];\n\n debug('locateFields', locateFields);\n\n locateFields.forEach((field) => {\n const locateResult = action.param[field];\n if (locateResult && modelFamily !== undefined) {\n // Always use model family to fill bbox parameters\n action.param[field] = fillBboxParam(\n locateResult,\n imageWidth,\n imageHeight,\n modelFamily,\n );\n }\n });\n });\n\n // Update sub-goals in conversation history based on response (only when deepThink is enabled)\n if (includeSubGoals) {\n if (planFromAI.updateSubGoals?.length) {\n conversationHistory.mergeSubGoals(planFromAI.updateSubGoals);\n }\n if (planFromAI.markFinishedIndexes?.length) {\n for (const index of planFromAI.markFinishedIndexes) {\n conversationHistory.markSubGoalFinished(index);\n }\n }\n // Append the planning log to the currently running sub-goal\n if (planFromAI.log) {\n conversationHistory.appendSubGoalLog(planFromAI.log);\n }\n } else {\n // In non-deepThink mode, accumulate logs as historical execution steps\n if (planFromAI.log) {\n conversationHistory.appendHistoricalLog(planFromAI.log);\n }\n }\n\n // Append memory to conversation history if present\n if (planFromAI.memory) {\n conversationHistory.appendMemory(planFromAI.memory);\n }\n\n conversationHistory.append({\n role: 'assistant',\n content: [\n {\n type: 'text',\n text: rawResponse,\n },\n ],\n });\n\n return returnValue;\n } catch (parseError) {\n // Throw AIResponseParseError with usage and rawResponse preserved\n const errorMessage =\n parseError instanceof Error ? parseError.message : String(parseError);\n throw new AIResponseParseError(\n `XML parse error: ${errorMessage}`,\n rawResponse,\n usage,\n );\n }\n}\n","import { adaptBbox, pointToBbox } from '@/common';\nimport type { DeviceAction } from '@/device';\nimport type { PlanningAction } from '@/types';\nimport { getDebug } from '@midscene/shared/logger';\n\nconst debug = getDebug('auto-glm-actions');\n\n/**\n * Auto-GLM coordinate system range: [0, AUTO_GLM_COORDINATE_MAX]\n */\nconst AUTO_GLM_COORDINATE_MAX = 1000;\n\n/**\n * Convert auto-glm coordinate [0,1000] to bbox in pixel coordinates\n */\nfunction autoGLMCoordinateToBbox(\n x: number,\n y: number,\n width: number,\n height: number,\n): [number, number, number, number] {\n const bbox = pointToBbox(x, y, 10);\n return adaptBbox(bbox, width, height, 'auto-glm');\n}\n\nexport interface BaseAction {\n _metadata: string;\n think?: string;\n}\n\nexport interface TapAction extends BaseAction {\n _metadata: 'do';\n action: 'Tap';\n element: [number, number];\n}\n\nexport interface DoubleTapAction extends BaseAction {\n _metadata: 'do';\n action: 'Double Tap';\n element: [number, number];\n}\n\nexport interface TypeAction extends BaseAction {\n _metadata: 'do';\n action: 'Type';\n text: string;\n}\n\nexport interface SwipeAction extends BaseAction {\n _metadata: 'do';\n action: 'Swipe';\n start: [number, number];\n end: [number, number];\n}\n\nexport interface LongPressAction extends BaseAction {\n _metadata: 'do';\n action: 'Long Press';\n element: [number, number];\n}\n\nexport interface LaunchAction extends BaseAction {\n _metadata: 'do';\n action: 'Launch';\n app: string;\n}\n\nexport interface BackAction extends BaseAction {\n _metadata: 'do';\n action: 'Back';\n}\n\nexport interface HomeAction extends BaseAction {\n _metadata: 'do';\n action: 'Home';\n}\n\nexport interface WaitAction extends BaseAction {\n _metadata: 'do';\n action: 'Wait';\n durationMs: number;\n}\n\nexport interface InteractAction extends BaseAction {\n _metadata: 'do';\n action: 'Interact';\n}\n\nexport interface CallAPIAction extends BaseAction {\n _metadata: 'do';\n action: 'Call_API';\n instruction: string;\n}\n\nexport interface TakeoverAction extends BaseAction {\n _metadata: 'do';\n action: 'Take_over';\n message: string;\n}\n\nexport interface NoteAction extends BaseAction {\n _metadata: 'do';\n action: 'Note';\n message: string;\n}\n\nexport interface FinishAction extends BaseAction {\n _metadata: 'finish';\n message: string;\n}\n\nexport type ParsedAction =\n | TapAction\n | DoubleTapAction\n | TypeAction\n | SwipeAction\n | LongPressAction\n | LaunchAction\n | BackAction\n | HomeAction\n | WaitAction\n | InteractAction\n | CallAPIAction\n | TakeoverAction\n | NoteAction\n | FinishAction;\n\nconst BACK_BUTTON_NAMES = ['AndroidBackButton', 'HarmonyBackButton'];\nconst HOME_BUTTON_NAMES = ['AndroidHomeButton', 'HarmonyHomeButton'];\n\n/**\n * Find the action name in actionSpace that matches one of the known names.\n * Falls back to defaultName if no match found or actionSpace is not provided.\n */\nfunction findActionName(\n actionSpace: DeviceAction[] | undefined,\n knownNames: string[],\n defaultName: string,\n): string {\n if (!actionSpace) return defaultName;\n const match = actionSpace.find((a) => knownNames.includes(a.name));\n return match ? match.name : defaultName;\n}\n\nexport function transformAutoGLMAction(\n action: ParsedAction,\n size: { width: number; height: number },\n actionSpace?: DeviceAction[],\n): PlanningAction[] {\n try {\n switch (action._metadata) {\n case 'finish': {\n const finishAction = action as FinishAction;\n debug('Transform finish action:', finishAction);\n return [\n {\n type: 'Finished',\n param: {},\n thought: finishAction.message,\n },\n ];\n }\n case 'do': {\n const doAction = action as\n | TapAction\n | DoubleTapAction\n | TypeAction\n | SwipeAction\n | LongPressAction\n | LaunchAction\n | BackAction\n | HomeAction\n | WaitAction\n | InteractAction\n | CallAPIAction\n | TakeoverAction\n | NoteAction;\n\n switch ((doAction as any).action) {\n case 'Tap': {\n const tapAction = doAction as TapAction;\n debug('Transform Tap action:', tapAction);\n const [x1, y1, x2, y2] = autoGLMCoordinateToBbox(\n tapAction.element[0],\n tapAction.element[1],\n size.width,\n size.height,\n );\n\n const locate: {\n prompt: string;\n bbox: [number, number, number, number];\n } = {\n prompt: '',\n bbox: [x1, y1, x2, y2],\n };\n\n return [\n {\n type: 'Tap',\n param: {\n locate,\n },\n },\n ];\n }\n case 'Double Tap': {\n const doubleTapAction = doAction as DoubleTapAction;\n debug('Transform Double Tap action:', doubleTapAction);\n const [x1, y1, x2, y2] = autoGLMCoordinateToBbox(\n doubleTapAction.element[0],\n doubleTapAction.element[1],\n size.width,\n size.height,\n );\n\n const locate: {\n prompt: string;\n bbox: [number, number, number, number];\n } = {\n prompt: '',\n bbox: [x1, y1, x2, y2],\n };\n\n return [\n {\n type: 'DoubleClick',\n param: {\n locate,\n },\n },\n ];\n }\n case 'Type': {\n const typeAction = doAction as TypeAction;\n debug('Transform Type action:', typeAction);\n\n return [\n {\n type: 'Input',\n param: {\n value: typeAction.text,\n },\n },\n ];\n }\n case 'Swipe': {\n const swipeAction = doAction as SwipeAction;\n debug('Transform Swipe action:', swipeAction);\n\n // Calculate locate using start coordinate\n const [x1, y1, x2, y2] = autoGLMCoordinateToBbox(\n swipeAction.start[0],\n swipeAction.start[1],\n size.width,\n size.height,\n );\n\n const locate: {\n prompt: string;\n bbox: [number, number, number, number];\n } = {\n prompt: '',\n bbox: [x1, y1, x2, y2],\n };\n\n // Calculate horizontal and vertical delta in [0,AUTO_GLM_COORDINATE_MAX] coordinate system\n const deltaX = swipeAction.end[0] - swipeAction.start[0];\n const deltaY = swipeAction.end[1] - swipeAction.start[1];\n\n // Determine direction and distance\n let direction: 'up' | 'down' | 'left' | 'right';\n let distance: number;\n\n const absDeltaX = Math.abs(deltaX);\n const absDeltaY = Math.abs(deltaY);\n\n if (absDeltaY > absDeltaX) {\n // Vertical scroll\n distance = Math.round(\n (absDeltaY * size.height) / AUTO_GLM_COORDINATE_MAX,\n );\n direction = deltaY > 0 ? 'up' : 'down';\n } else {\n // Horizontal scroll\n distance = Math.round(\n (absDeltaX * size.width) / AUTO_GLM_COORDINATE_MAX,\n );\n direction = deltaX > 0 ? 'left' : 'right';\n }\n\n debug(\n `Calculate swipe direction: ${direction}, distance: ${distance}`,\n );\n\n return [\n {\n type: 'Scroll',\n param: {\n locate,\n // The scrolling direction here all refers to which direction of the page's content will appear on the screen.\n distance,\n direction,\n },\n thought: swipeAction.think || '',\n },\n ];\n }\n case 'Long Press': {\n const longPressAction = doAction as LongPressAction;\n debug('Transform Long Press action:', longPressAction);\n const [x1, y1, x2, y2] = autoGLMCoordinateToBbox(\n longPressAction.element[0],\n longPressAction.element[1],\n size.width,\n size.height,\n );\n\n const locate: {\n prompt: string;\n bbox: [number, number, number, number];\n } = {\n prompt: '',\n bbox: [x1, y1, x2, y2],\n };\n\n return [\n {\n type: 'LongPress',\n param: {\n locate,\n },\n thought: longPressAction.think || '',\n },\n ];\n }\n case 'Back': {\n const backAction = doAction as BackAction;\n debug('Transform Back action:', backAction);\n return [\n {\n type: findActionName(\n actionSpace,\n BACK_BUTTON_NAMES,\n 'AndroidBackButton',\n ),\n param: {},\n thought: backAction.think || '',\n },\n ];\n }\n case 'Home': {\n const homeAction = doAction as HomeAction;\n debug('Transform Home action:', homeAction);\n return [\n {\n type: findActionName(\n actionSpace,\n HOME_BUTTON_NAMES,\n 'AndroidHomeButton',\n ),\n param: {},\n thought: homeAction.think || '',\n },\n ];\n }\n case 'Wait': {\n const waitAction = doAction as WaitAction;\n debug('Transform Wait action:', waitAction);\n return [\n {\n type: 'Sleep',\n param: {\n timeMs: waitAction.durationMs,\n },\n thought: waitAction.think || '',\n },\n ];\n }\n case 'Launch': {\n const launchAction = doAction as LaunchAction;\n debug('Transform Launch action:', launchAction);\n return [\n {\n type: 'Launch',\n param: launchAction.app,\n thought: launchAction.think || '',\n },\n ];\n }\n case 'Interact': {\n throw new Error(\n `Action \"Interact\" from auto-glm is not supported in the current implementation.`,\n );\n }\n case 'Call_API': {\n throw new Error(\n `Action \"Call_API\" from auto-glm is not supported in the current implementation.`,\n );\n }\n case 'Take_over': {\n throw new Error(\n `Action \"Take_over\" from auto-glm is not supported in the current implementation.`,\n );\n }\n case 'Note': {\n throw new Error(\n `Action \"Note\" from auto-glm is not supported in the current implementation.`,\n );\n }\n default:\n throw new Error(\n `Unknown do() action type: ${(doAction as any).action}`,\n );\n }\n }\n default:\n throw new Error(\n `Unknown action metadata: ${(action as any)._metadata}`,\n );\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n debug('Transform error:', errorMessage);\n throw new Error(`Failed to transform action: ${errorMessage}`);\n }\n}\n","import type { DeviceAction } from '@/device';\nimport type { PlanningAIResponse, UIContext } from '@/types';\nimport type { IModelConfig } from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport type { ChatCompletionMessageParam } from 'openai/resources/index';\nimport type { ConversationHistory } from '../conversation-history';\nimport {\n AIResponseParseError,\n callAIWithStringResponse,\n} from '../service-caller/index';\nimport { transformAutoGLMAction } from './actions';\nimport { parseAction, parseAutoGLMResponse } from './parser';\nimport { getAutoGLMPlanPrompt } from './prompt';\n\nconst debug = getDebug('auto-glm-planning');\n\nexport async function autoGLMPlanning(\n userInstruction: string,\n options: {\n conversationHistory: ConversationHistory;\n context: UIContext;\n modelConfig: IModelConfig;\n actionContext?: string;\n actionSpace?: DeviceAction[];\n abortSignal?: AbortSignal;\n },\n): Promise<PlanningAIResponse> {\n const { conversationHistory, context, modelConfig, actionContext } = options;\n\n const systemPrompt =\n getAutoGLMPlanPrompt(modelConfig.modelFamily) +\n (actionContext\n ? `<high_priority_knowledge>${actionContext}</high_priority_knowledge>`\n : '');\n\n const imagePayloadBase64 = context.screenshot.base64;\n\n conversationHistory.append({\n role: 'user',\n content: [{ type: 'text', text: userInstruction }],\n });\n conversationHistory.append({\n role: 'user',\n content: [{ type: 'image_url', image_url: { url: imagePayloadBase64 } }],\n });\n\n const msgs: ChatCompletionMessageParam[] = [\n { role: 'system', content: systemPrompt },\n ...conversationHistory.snapshot(1),\n ];\n\n const { content: rawResponse, usage } = await callAIWithStringResponse(\n msgs,\n modelConfig,\n { abortSignal: options.abortSignal },\n );\n\n debug('autoGLMPlanning rawResponse:', rawResponse);\n\n let parsedResponse: ReturnType<typeof parseAutoGLMResponse>;\n let transformedActions: ReturnType<typeof transformAutoGLMAction>;\n\n try {\n parsedResponse = parseAutoGLMResponse(rawResponse);\n debug('thinking in response:', parsedResponse.think);\n debug('action in response:', parsedResponse.content);\n\n const parsedAction = parseAction(parsedResponse);\n debug('Parsed action object:', parsedAction);\n transformedActions = transformAutoGLMAction(\n parsedAction,\n context.shotSize,\n options.actionSpace,\n );\n debug('Transformed actions:', transformedActions);\n } catch (parseError) {\n // Throw AIResponseParseError with usage and rawResponse preserved\n const errorMessage =\n parseError instanceof Error ? parseError.message : String(parseError);\n throw new AIResponseParseError(\n `Parse error: ${errorMessage}`,\n JSON.stringify(rawResponse, undefined, 2),\n usage,\n );\n }\n\n conversationHistory.append({\n role: 'assistant',\n content: `<think>${parsedResponse.think}</think><answer>${parsedResponse.content}</answer>`,\n });\n\n const shouldContinuePlanning = !parsedResponse.content.startsWith('finish(');\n\n return {\n actions: transformedActions,\n log: rawResponse,\n usage,\n shouldContinuePlanning,\n rawResponse: JSON.stringify(rawResponse, undefined, 2),\n };\n}\n","/*! For license information please see us-keyboard-layout.mjs.LICENSE.txt */\n/**\n * @license\n * Copyright 2017 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */ const _keyDefinitions = {\n 0: {\n keyCode: 48,\n key: '0',\n code: 'Digit0'\n },\n 1: {\n keyCode: 49,\n key: '1',\n code: 'Digit1'\n },\n 2: {\n keyCode: 50,\n key: '2',\n code: 'Digit2'\n },\n 3: {\n keyCode: 51,\n key: '3',\n code: 'Digit3'\n },\n 4: {\n keyCode: 52,\n key: '4',\n code: 'Digit4'\n },\n 5: {\n keyCode: 53,\n key: '5',\n code: 'Digit5'\n },\n 6: {\n keyCode: 54,\n key: '6',\n code: 'Digit6'\n },\n 7: {\n keyCode: 55,\n key: '7',\n code: 'Digit7'\n },\n 8: {\n keyCode: 56,\n key: '8',\n code: 'Digit8'\n },\n 9: {\n keyCode: 57,\n key: '9',\n code: 'Digit9'\n },\n Power: {\n key: 'Power',\n code: 'Power'\n },\n Eject: {\n key: 'Eject',\n code: 'Eject'\n },\n Abort: {\n keyCode: 3,\n code: 'Abort',\n key: 'Cancel'\n },\n Help: {\n keyCode: 6,\n code: 'Help',\n key: 'Help'\n },\n Backspace: {\n keyCode: 8,\n code: 'Backspace',\n key: 'Backspace'\n },\n Tab: {\n keyCode: 9,\n code: 'Tab',\n key: 'Tab'\n },\n Numpad5: {\n keyCode: 12,\n shiftKeyCode: 101,\n key: 'Clear',\n code: 'Numpad5',\n shiftKey: '5',\n location: 3\n },\n NumpadEnter: {\n keyCode: 13,\n code: 'NumpadEnter',\n key: 'Enter',\n text: '\\r',\n location: 3\n },\n Enter: {\n keyCode: 13,\n code: 'Enter',\n key: 'Enter',\n text: '\\r'\n },\n '\\r': {\n keyCode: 13,\n code: 'Enter',\n key: 'Enter',\n text: '\\r'\n },\n '\\n': {\n keyCode: 13,\n code: 'Enter',\n key: 'Enter',\n text: '\\r'\n },\n ShiftLeft: {\n keyCode: 16,\n code: 'ShiftLeft',\n key: 'Shift',\n location: 1\n },\n ShiftRight: {\n keyCode: 16,\n code: 'ShiftRight',\n key: 'Shift',\n location: 2\n },\n ControlLeft: {\n keyCode: 17,\n code: 'ControlLeft',\n key: 'Control',\n location: 1\n },\n ControlRight: {\n keyCode: 17,\n code: 'ControlRight',\n key: 'Control',\n location: 2\n },\n AltLeft: {\n keyCode: 18,\n code: 'AltLeft',\n key: 'Alt',\n location: 1\n },\n AltRight: {\n keyCode: 18,\n code: 'AltRight',\n key: 'Alt',\n location: 2\n },\n Pause: {\n keyCode: 19,\n code: 'Pause',\n key: 'Pause'\n },\n CapsLock: {\n keyCode: 20,\n code: 'CapsLock',\n key: 'CapsLock'\n },\n Escape: {\n keyCode: 27,\n code: 'Escape',\n key: 'Escape'\n },\n Convert: {\n keyCode: 28,\n code: 'Convert',\n key: 'Convert'\n },\n NonConvert: {\n keyCode: 29,\n code: 'NonConvert',\n key: 'NonConvert'\n },\n Space: {\n keyCode: 32,\n code: 'Space',\n key: ' '\n },\n Numpad9: {\n keyCode: 33,\n shiftKeyCode: 105,\n key: 'PageUp',\n code: 'Numpad9',\n shiftKey: '9',\n location: 3\n },\n PageUp: {\n keyCode: 33,\n code: 'PageUp',\n key: 'PageUp'\n },\n Numpad3: {\n keyCode: 34,\n shiftKeyCode: 99,\n key: 'PageDown',\n code: 'Numpad3',\n shiftKey: '3',\n location: 3\n },\n PageDown: {\n keyCode: 34,\n code: 'PageDown',\n key: 'PageDown'\n },\n End: {\n keyCode: 35,\n code: 'End',\n key: 'End'\n },\n Numpad1: {\n keyCode: 35,\n shiftKeyCode: 97,\n key: 'End',\n code: 'Numpad1',\n shiftKey: '1',\n location: 3\n },\n Home: {\n keyCode: 36,\n code: 'Home',\n key: 'Home'\n },\n Numpad7: {\n keyCode: 36,\n shiftKeyCode: 103,\n key: 'Home',\n code: 'Numpad7',\n shiftKey: '7',\n location: 3\n },\n ArrowLeft: {\n keyCode: 37,\n code: 'ArrowLeft',\n key: 'ArrowLeft'\n },\n Numpad4: {\n keyCode: 37,\n shiftKeyCode: 100,\n key: 'ArrowLeft',\n code: 'Numpad4',\n shiftKey: '4',\n location: 3\n },\n Numpad8: {\n keyCode: 38,\n shiftKeyCode: 104,\n key: 'ArrowUp',\n code: 'Numpad8',\n shiftKey: '8',\n location: 3\n },\n ArrowUp: {\n keyCode: 38,\n code: 'ArrowUp',\n key: 'ArrowUp'\n },\n ArrowRight: {\n keyCode: 39,\n code: 'ArrowRight',\n key: 'ArrowRight'\n },\n Numpad6: {\n keyCode: 39,\n shiftKeyCode: 102,\n key: 'ArrowRight',\n code: 'Numpad6',\n shiftKey: '6',\n location: 3\n },\n Numpad2: {\n keyCode: 40,\n shiftKeyCode: 98,\n key: 'ArrowDown',\n code: 'Numpad2',\n shiftKey: '2',\n location: 3\n },\n ArrowDown: {\n keyCode: 40,\n code: 'ArrowDown',\n key: 'ArrowDown'\n },\n Select: {\n keyCode: 41,\n code: 'Select',\n key: 'Select'\n },\n Open: {\n keyCode: 43,\n code: 'Open',\n key: 'Execute'\n },\n PrintScreen: {\n keyCode: 44,\n code: 'PrintScreen',\n key: 'PrintScreen'\n },\n Insert: {\n keyCode: 45,\n code: 'Insert',\n key: 'Insert'\n },\n Numpad0: {\n keyCode: 45,\n shiftKeyCode: 96,\n key: 'Insert',\n code: 'Numpad0',\n shiftKey: '0',\n location: 3\n },\n Delete: {\n keyCode: 46,\n code: 'Delete',\n key: 'Delete'\n },\n NumpadDecimal: {\n keyCode: 46,\n shiftKeyCode: 110,\n code: 'NumpadDecimal',\n key: '\\u0000',\n shiftKey: '.',\n location: 3\n },\n Digit0: {\n keyCode: 48,\n code: 'Digit0',\n shiftKey: ')',\n key: '0'\n },\n Digit1: {\n keyCode: 49,\n code: 'Digit1',\n shiftKey: '!',\n key: '1'\n },\n Digit2: {\n keyCode: 50,\n code: 'Digit2',\n shiftKey: '@',\n key: '2'\n },\n Digit3: {\n keyCode: 51,\n code: 'Digit3',\n shiftKey: '#',\n key: '3'\n },\n Digit4: {\n keyCode: 52,\n code: 'Digit4',\n shiftKey: '$',\n key: '4'\n },\n Digit5: {\n keyCode: 53,\n code: 'Digit5',\n shiftKey: '%',\n key: '5'\n },\n Digit6: {\n keyCode: 54,\n code: 'Digit6',\n shiftKey: '^',\n key: '6'\n },\n Digit7: {\n keyCode: 55,\n code: 'Digit7',\n shiftKey: '&',\n key: '7'\n },\n Digit8: {\n keyCode: 56,\n code: 'Digit8',\n shiftKey: '*',\n key: '8'\n },\n Digit9: {\n keyCode: 57,\n code: 'Digit9',\n shiftKey: '(',\n key: '9'\n },\n KeyA: {\n keyCode: 65,\n code: 'KeyA',\n shiftKey: 'A',\n key: 'a'\n },\n KeyB: {\n keyCode: 66,\n code: 'KeyB',\n shiftKey: 'B',\n key: 'b'\n },\n KeyC: {\n keyCode: 67,\n code: 'KeyC',\n shiftKey: 'C',\n key: 'c'\n },\n KeyD: {\n keyCode: 68,\n code: 'KeyD',\n shiftKey: 'D',\n key: 'd'\n },\n KeyE: {\n keyCode: 69,\n code: 'KeyE',\n shiftKey: 'E',\n key: 'e'\n },\n KeyF: {\n keyCode: 70,\n code: 'KeyF',\n shiftKey: 'F',\n key: 'f'\n },\n KeyG: {\n keyCode: 71,\n code: 'KeyG',\n shiftKey: 'G',\n key: 'g'\n },\n KeyH: {\n keyCode: 72,\n code: 'KeyH',\n shiftKey: 'H',\n key: 'h'\n },\n KeyI: {\n keyCode: 73,\n code: 'KeyI',\n shiftKey: 'I',\n key: 'i'\n },\n KeyJ: {\n keyCode: 74,\n code: 'KeyJ',\n shiftKey: 'J',\n key: 'j'\n },\n KeyK: {\n keyCode: 75,\n code: 'KeyK',\n shiftKey: 'K',\n key: 'k'\n },\n KeyL: {\n keyCode: 76,\n code: 'KeyL',\n shiftKey: 'L',\n key: 'l'\n },\n KeyM: {\n keyCode: 77,\n code: 'KeyM',\n shiftKey: 'M',\n key: 'm'\n },\n KeyN: {\n keyCode: 78,\n code: 'KeyN',\n shiftKey: 'N',\n key: 'n'\n },\n KeyO: {\n keyCode: 79,\n code: 'KeyO',\n shiftKey: 'O',\n key: 'o'\n },\n KeyP: {\n keyCode: 80,\n code: 'KeyP',\n shiftKey: 'P',\n key: 'p'\n },\n KeyQ: {\n keyCode: 81,\n code: 'KeyQ',\n shiftKey: 'Q',\n key: 'q'\n },\n KeyR: {\n keyCode: 82,\n code: 'KeyR',\n shiftKey: 'R',\n key: 'r'\n },\n KeyS: {\n keyCode: 83,\n code: 'KeyS',\n shiftKey: 'S',\n key: 's'\n },\n KeyT: {\n keyCode: 84,\n code: 'KeyT',\n shiftKey: 'T',\n key: 't'\n },\n KeyU: {\n keyCode: 85,\n code: 'KeyU',\n shiftKey: 'U',\n key: 'u'\n },\n KeyV: {\n keyCode: 86,\n code: 'KeyV',\n shiftKey: 'V',\n key: 'v'\n },\n KeyW: {\n keyCode: 87,\n code: 'KeyW',\n shiftKey: 'W',\n key: 'w'\n },\n KeyX: {\n keyCode: 88,\n code: 'KeyX',\n shiftKey: 'X',\n key: 'x'\n },\n KeyY: {\n keyCode: 89,\n code: 'KeyY',\n shiftKey: 'Y',\n key: 'y'\n },\n KeyZ: {\n keyCode: 90,\n code: 'KeyZ',\n shiftKey: 'Z',\n key: 'z'\n },\n MetaLeft: {\n keyCode: 91,\n code: 'MetaLeft',\n key: 'Meta',\n location: 1\n },\n MetaRight: {\n keyCode: 92,\n code: 'MetaRight',\n key: 'Meta',\n location: 2\n },\n ContextMenu: {\n keyCode: 93,\n code: 'ContextMenu',\n key: 'ContextMenu'\n },\n NumpadMultiply: {\n keyCode: 106,\n code: 'NumpadMultiply',\n key: '*',\n location: 3\n },\n NumpadAdd: {\n keyCode: 107,\n code: 'NumpadAdd',\n key: '+',\n location: 3\n },\n NumpadSubtract: {\n keyCode: 109,\n code: 'NumpadSubtract',\n key: '-',\n location: 3\n },\n NumpadDivide: {\n keyCode: 111,\n code: 'NumpadDivide',\n key: '/',\n location: 3\n },\n F1: {\n keyCode: 112,\n code: 'F1',\n key: 'F1'\n },\n F2: {\n keyCode: 113,\n code: 'F2',\n key: 'F2'\n },\n F3: {\n keyCode: 114,\n code: 'F3',\n key: 'F3'\n },\n F4: {\n keyCode: 115,\n code: 'F4',\n key: 'F4'\n },\n F5: {\n keyCode: 116,\n code: 'F5',\n key: 'F5'\n },\n F6: {\n keyCode: 117,\n code: 'F6',\n key: 'F6'\n },\n F7: {\n keyCode: 118,\n code: 'F7',\n key: 'F7'\n },\n F8: {\n keyCode: 119,\n code: 'F8',\n key: 'F8'\n },\n F9: {\n keyCode: 120,\n code: 'F9',\n key: 'F9'\n },\n F10: {\n keyCode: 121,\n code: 'F10',\n key: 'F10'\n },\n F11: {\n keyCode: 122,\n code: 'F11',\n key: 'F11'\n },\n F12: {\n keyCode: 123,\n code: 'F12',\n key: 'F12'\n },\n F13: {\n keyCode: 124,\n code: 'F13',\n key: 'F13'\n },\n F14: {\n keyCode: 125,\n code: 'F14',\n key: 'F14'\n },\n F15: {\n keyCode: 126,\n code: 'F15',\n key: 'F15'\n },\n F16: {\n keyCode: 127,\n code: 'F16',\n key: 'F16'\n },\n F17: {\n keyCode: 128,\n code: 'F17',\n key: 'F17'\n },\n F18: {\n keyCode: 129,\n code: 'F18',\n key: 'F18'\n },\n F19: {\n keyCode: 130,\n code: 'F19',\n key: 'F19'\n },\n F20: {\n keyCode: 131,\n code: 'F20',\n key: 'F20'\n },\n F21: {\n keyCode: 132,\n code: 'F21',\n key: 'F21'\n },\n F22: {\n keyCode: 133,\n code: 'F22',\n key: 'F22'\n },\n F23: {\n keyCode: 134,\n code: 'F23',\n key: 'F23'\n },\n F24: {\n keyCode: 135,\n code: 'F24',\n key: 'F24'\n },\n NumLock: {\n keyCode: 144,\n code: 'NumLock',\n key: 'NumLock'\n },\n ScrollLock: {\n keyCode: 145,\n code: 'ScrollLock',\n key: 'ScrollLock'\n },\n AudioVolumeMute: {\n keyCode: 173,\n code: 'AudioVolumeMute',\n key: 'AudioVolumeMute'\n },\n AudioVolumeDown: {\n keyCode: 174,\n code: 'AudioVolumeDown',\n key: 'AudioVolumeDown'\n },\n AudioVolumeUp: {\n keyCode: 175,\n code: 'AudioVolumeUp',\n key: 'AudioVolumeUp'\n },\n MediaTrackNext: {\n keyCode: 176,\n code: 'MediaTrackNext',\n key: 'MediaTrackNext'\n },\n MediaTrackPrevious: {\n keyCode: 177,\n code: 'MediaTrackPrevious',\n key: 'MediaTrackPrevious'\n },\n MediaStop: {\n keyCode: 178,\n code: 'MediaStop',\n key: 'MediaStop'\n },\n MediaPlayPause: {\n keyCode: 179,\n code: 'MediaPlayPause',\n key: 'MediaPlayPause'\n },\n Semicolon: {\n keyCode: 186,\n code: 'Semicolon',\n shiftKey: ':',\n key: ';'\n },\n Equal: {\n keyCode: 187,\n code: 'Equal',\n shiftKey: '+',\n key: '='\n },\n NumpadEqual: {\n keyCode: 187,\n code: 'NumpadEqual',\n key: '=',\n location: 3\n },\n Comma: {\n keyCode: 188,\n code: 'Comma',\n shiftKey: '<',\n key: ','\n },\n Minus: {\n keyCode: 189,\n code: 'Minus',\n shiftKey: '_',\n key: '-'\n },\n Period: {\n keyCode: 190,\n code: 'Period',\n shiftKey: '>',\n key: '.'\n },\n Slash: {\n keyCode: 191,\n code: 'Slash',\n shiftKey: '?',\n key: '/'\n },\n Backquote: {\n keyCode: 192,\n code: 'Backquote',\n shiftKey: '~',\n key: '`'\n },\n BracketLeft: {\n keyCode: 219,\n code: 'BracketLeft',\n shiftKey: '{',\n key: '['\n },\n Backslash: {\n keyCode: 220,\n code: 'Backslash',\n shiftKey: '|',\n key: '\\\\'\n },\n BracketRight: {\n keyCode: 221,\n code: 'BracketRight',\n shiftKey: '}',\n key: ']'\n },\n Quote: {\n keyCode: 222,\n code: 'Quote',\n shiftKey: '\"',\n key: \"'\"\n },\n AltGraph: {\n keyCode: 225,\n code: 'AltGraph',\n key: 'AltGraph'\n },\n Props: {\n keyCode: 247,\n code: 'Props',\n key: 'CrSel'\n },\n Cancel: {\n keyCode: 3,\n key: 'Cancel',\n code: 'Abort'\n },\n Clear: {\n keyCode: 12,\n key: 'Clear',\n code: 'Numpad5',\n location: 3\n },\n Shift: {\n keyCode: 16,\n key: 'Shift',\n code: 'ShiftLeft',\n location: 1\n },\n Control: {\n keyCode: 17,\n key: 'Control',\n code: 'ControlLeft',\n location: 1\n },\n Alt: {\n keyCode: 18,\n key: 'Alt',\n code: 'AltLeft',\n location: 1\n },\n Accept: {\n keyCode: 30,\n key: 'Accept'\n },\n ModeChange: {\n keyCode: 31,\n key: 'ModeChange'\n },\n ' ': {\n keyCode: 32,\n key: ' ',\n code: 'Space'\n },\n Print: {\n keyCode: 42,\n key: 'Print'\n },\n Execute: {\n keyCode: 43,\n key: 'Execute',\n code: 'Open'\n },\n '\\u0000': {\n keyCode: 46,\n key: '\\u0000',\n code: 'NumpadDecimal',\n location: 3\n },\n a: {\n keyCode: 65,\n key: 'a',\n code: 'KeyA'\n },\n b: {\n keyCode: 66,\n key: 'b',\n code: 'KeyB'\n },\n c: {\n keyCode: 67,\n key: 'c',\n code: 'KeyC'\n },\n d: {\n keyCode: 68,\n key: 'd',\n code: 'KeyD'\n },\n e: {\n keyCode: 69,\n key: 'e',\n code: 'KeyE'\n },\n f: {\n keyCode: 70,\n key: 'f',\n code: 'KeyF'\n },\n g: {\n keyCode: 71,\n key: 'g',\n code: 'KeyG'\n },\n h: {\n keyCode: 72,\n key: 'h',\n code: 'KeyH'\n },\n i: {\n keyCode: 73,\n key: 'i',\n code: 'KeyI'\n },\n j: {\n keyCode: 74,\n key: 'j',\n code: 'KeyJ'\n },\n k: {\n keyCode: 75,\n key: 'k',\n code: 'KeyK'\n },\n l: {\n keyCode: 76,\n key: 'l',\n code: 'KeyL'\n },\n m: {\n keyCode: 77,\n key: 'm',\n code: 'KeyM'\n },\n n: {\n keyCode: 78,\n key: 'n',\n code: 'KeyN'\n },\n o: {\n keyCode: 79,\n key: 'o',\n code: 'KeyO'\n },\n p: {\n keyCode: 80,\n key: 'p',\n code: 'KeyP'\n },\n q: {\n keyCode: 81,\n key: 'q',\n code: 'KeyQ'\n },\n r: {\n keyCode: 82,\n key: 'r',\n code: 'KeyR'\n },\n s: {\n keyCode: 83,\n key: 's',\n code: 'KeyS'\n },\n t: {\n keyCode: 84,\n key: 't',\n code: 'KeyT'\n },\n u: {\n keyCode: 85,\n key: 'u',\n code: 'KeyU'\n },\n v: {\n keyCode: 86,\n key: 'v',\n code: 'KeyV'\n },\n w: {\n keyCode: 87,\n key: 'w',\n code: 'KeyW'\n },\n x: {\n keyCode: 88,\n key: 'x',\n code: 'KeyX'\n },\n y: {\n keyCode: 89,\n key: 'y',\n code: 'KeyY'\n },\n z: {\n keyCode: 90,\n key: 'z',\n code: 'KeyZ'\n },\n Meta: {\n keyCode: 91,\n key: 'Meta',\n code: 'MetaLeft',\n location: 1\n },\n '*': {\n keyCode: 106,\n key: '*',\n code: 'NumpadMultiply',\n location: 3\n },\n '+': {\n keyCode: 107,\n key: '+',\n code: 'NumpadAdd',\n location: 3\n },\n '-': {\n keyCode: 109,\n key: '-',\n code: 'NumpadSubtract',\n location: 3\n },\n '/': {\n keyCode: 111,\n key: '/',\n code: 'NumpadDivide',\n location: 3\n },\n ';': {\n keyCode: 186,\n key: ';',\n code: 'Semicolon'\n },\n '=': {\n keyCode: 187,\n key: '=',\n code: 'Equal'\n },\n ',': {\n keyCode: 188,\n key: ',',\n code: 'Comma'\n },\n '.': {\n keyCode: 190,\n key: '.',\n code: 'Period'\n },\n '`': {\n keyCode: 192,\n key: '`',\n code: 'Backquote'\n },\n '[': {\n keyCode: 219,\n key: '[',\n code: 'BracketLeft'\n },\n '\\\\': {\n keyCode: 220,\n key: '\\\\',\n code: 'Backslash'\n },\n ']': {\n keyCode: 221,\n key: ']',\n code: 'BracketRight'\n },\n \"'\": {\n keyCode: 222,\n key: \"'\",\n code: 'Quote'\n },\n Attn: {\n keyCode: 246,\n key: 'Attn'\n },\n CrSel: {\n keyCode: 247,\n key: 'CrSel',\n code: 'Props'\n },\n ExSel: {\n keyCode: 248,\n key: 'ExSel'\n },\n EraseEof: {\n keyCode: 249,\n key: 'EraseEof'\n },\n Play: {\n keyCode: 250,\n key: 'Play'\n },\n ZoomOut: {\n keyCode: 251,\n key: 'ZoomOut'\n },\n ')': {\n keyCode: 48,\n key: ')',\n code: 'Digit0'\n },\n '!': {\n keyCode: 49,\n key: '!',\n code: 'Digit1'\n },\n '@': {\n keyCode: 50,\n key: '@',\n code: 'Digit2'\n },\n '#': {\n keyCode: 51,\n key: '#',\n code: 'Digit3'\n },\n $: {\n keyCode: 52,\n key: '$',\n code: 'Digit4'\n },\n '%': {\n keyCode: 53,\n key: '%',\n code: 'Digit5'\n },\n '^': {\n keyCode: 54,\n key: '^',\n code: 'Digit6'\n },\n '&': {\n keyCode: 55,\n key: '&',\n code: 'Digit7'\n },\n '(': {\n keyCode: 57,\n key: '(',\n code: 'Digit9'\n },\n A: {\n keyCode: 65,\n key: 'A',\n code: 'KeyA'\n },\n B: {\n keyCode: 66,\n key: 'B',\n code: 'KeyB'\n },\n C: {\n keyCode: 67,\n key: 'C',\n code: 'KeyC'\n },\n D: {\n keyCode: 68,\n key: 'D',\n code: 'KeyD'\n },\n E: {\n keyCode: 69,\n key: 'E',\n code: 'KeyE'\n },\n F: {\n keyCode: 70,\n key: 'F',\n code: 'KeyF'\n },\n G: {\n keyCode: 71,\n key: 'G',\n code: 'KeyG'\n },\n H: {\n keyCode: 72,\n key: 'H',\n code: 'KeyH'\n },\n I: {\n keyCode: 73,\n key: 'I',\n code: 'KeyI'\n },\n J: {\n keyCode: 74,\n key: 'J',\n code: 'KeyJ'\n },\n K: {\n keyCode: 75,\n key: 'K',\n code: 'KeyK'\n },\n L: {\n keyCode: 76,\n key: 'L',\n code: 'KeyL'\n },\n M: {\n keyCode: 77,\n key: 'M',\n code: 'KeyM'\n },\n N: {\n keyCode: 78,\n key: 'N',\n code: 'KeyN'\n },\n O: {\n keyCode: 79,\n key: 'O',\n code: 'KeyO'\n },\n P: {\n keyCode: 80,\n key: 'P',\n code: 'KeyP'\n },\n Q: {\n keyCode: 81,\n key: 'Q',\n code: 'KeyQ'\n },\n R: {\n keyCode: 82,\n key: 'R',\n code: 'KeyR'\n },\n S: {\n keyCode: 83,\n key: 'S',\n code: 'KeyS'\n },\n T: {\n keyCode: 84,\n key: 'T',\n code: 'KeyT'\n },\n U: {\n keyCode: 85,\n key: 'U',\n code: 'KeyU'\n },\n V: {\n keyCode: 86,\n key: 'V',\n code: 'KeyV'\n },\n W: {\n keyCode: 87,\n key: 'W',\n code: 'KeyW'\n },\n X: {\n keyCode: 88,\n key: 'X',\n code: 'KeyX'\n },\n Y: {\n keyCode: 89,\n key: 'Y',\n code: 'KeyY'\n },\n Z: {\n keyCode: 90,\n key: 'Z',\n code: 'KeyZ'\n },\n ':': {\n keyCode: 186,\n key: ':',\n code: 'Semicolon'\n },\n '<': {\n keyCode: 188,\n key: '<',\n code: 'Comma'\n },\n _: {\n keyCode: 189,\n key: '_',\n code: 'Minus'\n },\n '>': {\n keyCode: 190,\n key: '>',\n code: 'Period'\n },\n '?': {\n keyCode: 191,\n key: '?',\n code: 'Slash'\n },\n '~': {\n keyCode: 192,\n key: '~',\n code: 'Backquote'\n },\n '{': {\n keyCode: 219,\n key: '{',\n code: 'BracketLeft'\n },\n '|': {\n keyCode: 220,\n key: '|',\n code: 'Backslash'\n },\n '}': {\n keyCode: 221,\n key: '}',\n code: 'BracketRight'\n },\n '\"': {\n keyCode: 222,\n key: '\"',\n code: 'Quote'\n },\n SoftLeft: {\n key: 'SoftLeft',\n code: 'SoftLeft',\n location: 4\n },\n SoftRight: {\n key: 'SoftRight',\n code: 'SoftRight',\n location: 4\n },\n Camera: {\n keyCode: 44,\n key: 'Camera',\n code: 'Camera',\n location: 4\n },\n Call: {\n key: 'Call',\n code: 'Call',\n location: 4\n },\n EndCall: {\n keyCode: 95,\n key: 'EndCall',\n code: 'EndCall',\n location: 4\n },\n VolumeDown: {\n keyCode: 182,\n key: 'VolumeDown',\n code: 'VolumeDown',\n location: 4\n },\n VolumeUp: {\n keyCode: 183,\n key: 'VolumeUp',\n code: 'VolumeUp',\n location: 4\n }\n};\nconst lowerCaseKeyDefinitions = Object.entries(_keyDefinitions).reduce((acc, [key, definition])=>{\n const lowerKey = key.toLowerCase();\n if (lowerKey !== key) acc[lowerKey] = definition;\n return acc;\n}, {});\nconst getKeyDefinition = (key)=>{\n const lowerKey = key.toLowerCase();\n if (lowerCaseKeyDefinitions[lowerKey]) return lowerCaseKeyDefinitions[lowerKey].key;\n return key;\n};\nconst isMac = 'undefined' != typeof window ? /Mac|iPod|iPhone|iPad/.test(window.navigator.platform) : 'darwin' === process.platform;\nconst keyMap = {\n return: _keyDefinitions.Enter.key,\n enter: _keyDefinitions.Enter.key,\n ctrl: isMac ? _keyDefinitions.Meta.key : _keyDefinitions.Control.key,\n shift: _keyDefinitions.Shift.key,\n alt: _keyDefinitions.Alt.key,\n space: _keyDefinitions.Space.key,\n 'page down': _keyDefinitions.PageDown.key,\n pagedown: _keyDefinitions.PageDown.key,\n 'page up': _keyDefinitions.PageUp.key,\n pageup: _keyDefinitions.PageUp.key\n};\nfunction transformHotkeyInput(keyInput) {\n if (keyMap[keyInput.toLowerCase()]) return [\n getKeyDefinition(keyMap[keyInput.toLowerCase()])\n ];\n return keyInput.split(' ').map((key)=>getKeyDefinition(keyMap[key.toLowerCase()] || key));\n}\nexport { _keyDefinitions, getKeyDefinition, isMac, transformHotkeyInput };\n","import type {\n PlanningAIResponse,\n PlanningAction,\n Size,\n UIContext,\n} from '@/types';\nimport { type IModelConfig, UITarsModelVersion } from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { transformHotkeyInput } from '@midscene/shared/us-keyboard-layout';\nimport { assert } from '@midscene/shared/utils';\nimport { actionParser } from '@ui-tars/action-parser';\nimport type { ConversationHistory } from './conversation-history';\nimport { getSummary, getUiTarsPlanningPrompt } from './prompt/ui-tars-planning';\nimport {\n AIResponseParseError,\n callAIWithStringResponse,\n} from './service-caller/index';\n\ntype ActionType =\n | 'click'\n | 'left_double'\n | 'right_single'\n | 'drag'\n | 'type'\n | 'hotkey'\n | 'finished'\n | 'scroll'\n | 'wait';\n\nconst debug = getDebug('ui-tars-planning');\nconst warnLog = getDebug('ui-tars-planning', { console: true });\nconst bboxSize = 10;\nconst pointToBbox = (\n point: { x: number; y: number },\n width: number,\n height: number,\n): [number, number, number, number] => {\n return [\n Math.round(Math.max(point.x - bboxSize / 2, 0)),\n Math.round(Math.max(point.y - bboxSize / 2, 0)),\n Math.round(Math.min(point.x + bboxSize / 2, width)),\n Math.round(Math.min(point.y + bboxSize / 2, height)),\n ];\n};\n\nexport async function uiTarsPlanning(\n userInstruction: string,\n options: {\n conversationHistory: ConversationHistory;\n context: UIContext;\n modelConfig: IModelConfig;\n actionContext?: string;\n abortSignal?: AbortSignal;\n },\n): Promise<PlanningAIResponse> {\n const { conversationHistory, context, modelConfig, actionContext } = options;\n const { uiTarsModelVersion } = modelConfig;\n\n let instruction = userInstruction;\n if (actionContext) {\n instruction = `<high_priority_knowledge>${actionContext}</high_priority_knowledge>\\n<user_instruction>${userInstruction}</user_instruction>`;\n }\n\n const systemPrompt = getUiTarsPlanningPrompt() + instruction;\n\n const screenshotBase64 = context.screenshot.base64;\n\n conversationHistory.append({\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: screenshotBase64,\n },\n },\n ],\n });\n\n const res = await callAIWithStringResponse(\n [\n {\n role: 'user',\n content: systemPrompt,\n },\n ...conversationHistory.snapshot(),\n ],\n modelConfig,\n { abortSignal: options.abortSignal },\n );\n\n let convertedText: string;\n let parsed: ReturnType<typeof actionParser>['parsed'];\n\n try {\n convertedText = convertBboxToCoordinates(res.content);\n\n const { shotSize } = context;\n const parseResult = actionParser({\n prediction: convertedText,\n factor: [1000, 1000],\n screenContext: {\n width: shotSize.width,\n height: shotSize.height,\n },\n modelVer: uiTarsModelVersion,\n });\n parsed = parseResult.parsed;\n } catch (parseError) {\n // Throw AIResponseParseError with usage and rawResponse preserved\n const errorMessage =\n parseError instanceof Error ? parseError.message : String(parseError);\n throw new AIResponseParseError(\n `Parse error: ${errorMessage}`,\n JSON.stringify(res.content, undefined, 2),\n res.usage,\n );\n }\n\n const { shotSize } = context;\n\n debug(\n 'ui-tars modelVer',\n uiTarsModelVersion,\n ', parsed',\n JSON.stringify(parsed),\n );\n\n const transformActions: PlanningAction[] = [];\n const unhandledActions: Array<{ type: string; thought: string }> = [];\n let shouldContinue = true;\n parsed.forEach((action) => {\n const actionType = (action.action_type || '').toLowerCase();\n if (actionType === 'click') {\n assert(action.action_inputs.start_box, 'start_box is required');\n const point = getPoint(action.action_inputs.start_box, shotSize);\n\n const locate = {\n prompt: action.thought || '',\n bbox: pointToBbox(\n { x: point[0], y: point[1] },\n shotSize.width,\n shotSize.height,\n ),\n };\n\n transformActions.push({\n type: 'Tap',\n param: {\n locate: locate,\n },\n });\n } else if (actionType === 'left_double') {\n assert(action.action_inputs.start_box, 'start_box is required');\n const point = getPoint(action.action_inputs.start_box, shotSize);\n\n const locate = {\n prompt: action.thought || '',\n bbox: pointToBbox(\n { x: point[0], y: point[1] },\n shotSize.width,\n shotSize.height,\n ),\n };\n\n transformActions.push({\n type: 'DoubleClick',\n param: {\n locate: locate,\n },\n thought: action.thought || '',\n });\n } else if (actionType === 'right_single') {\n assert(action.action_inputs.start_box, 'start_box is required');\n const point = getPoint(action.action_inputs.start_box, shotSize);\n\n const locate = {\n prompt: action.thought || '',\n bbox: pointToBbox(\n { x: point[0], y: point[1] },\n shotSize.width,\n shotSize.height,\n ),\n };\n\n transformActions.push({\n type: 'RightClick',\n param: {\n locate: locate,\n },\n thought: action.thought || '',\n });\n } else if (actionType === 'drag') {\n assert(action.action_inputs.start_box, 'start_box is required');\n assert(action.action_inputs.end_box, 'end_box is required');\n const startPoint = getPoint(action.action_inputs.start_box, shotSize);\n const endPoint = getPoint(action.action_inputs.end_box, shotSize);\n transformActions.push({\n type: 'DragAndDrop',\n param: {\n from: {\n prompt: action.thought || '',\n bbox: pointToBbox(\n { x: startPoint[0], y: startPoint[1] },\n shotSize.width,\n shotSize.height,\n ),\n },\n to: {\n prompt: action.thought || '',\n bbox: pointToBbox(\n { x: endPoint[0], y: endPoint[1] },\n shotSize.width,\n shotSize.height,\n ),\n },\n },\n thought: action.thought || '',\n });\n } else if (actionType === 'type') {\n transformActions.push({\n type: 'Input',\n param: {\n value: action.action_inputs.content,\n },\n thought: action.thought || '',\n });\n } else if (actionType === 'scroll') {\n transformActions.push({\n type: 'Scroll',\n param: {\n direction: action.action_inputs.direction,\n },\n thought: action.thought || '',\n });\n } else if (actionType === 'finished') {\n shouldContinue = false;\n transformActions.push({\n type: 'Finished',\n param: {},\n thought: action.thought || '',\n });\n } else if (actionType === 'hotkey') {\n if (!action.action_inputs.key) {\n warnLog('No key found in action: hotkey. Will not perform action.');\n } else {\n const keys = transformHotkeyInput(action.action_inputs.key);\n\n transformActions.push({\n type: 'KeyboardPress',\n param: {\n keyName: keys.join('+'),\n },\n thought: action.thought || '',\n });\n }\n } else if (actionType === 'wait') {\n transformActions.push({\n type: 'Sleep',\n param: {\n timeMs: 1000,\n },\n thought: action.thought || '',\n });\n } else if (actionType) {\n // Track unhandled action types\n unhandledActions.push({\n type: actionType,\n thought: action.thought || '',\n });\n debug('Unhandled action type:', actionType, 'thought:', action.thought);\n }\n });\n\n if (transformActions.length === 0) {\n const errorDetails: string[] = [];\n\n // Check if parsing failed\n if (parsed.length === 0) {\n errorDetails.push('Action parser returned no actions');\n\n // Check if response has Thought but no Action\n if (\n res.content.includes('Thought:') &&\n !res.content.includes('Action:')\n ) {\n errorDetails.push(\n 'Response contains \"Thought:\" but missing \"Action:\" line',\n );\n } else {\n errorDetails.push('Response may be malformed or empty');\n }\n }\n\n // Check if we have unhandled action types\n if (unhandledActions.length > 0) {\n const types = unhandledActions.map((a) => a.type).join(', ');\n errorDetails.push(`Unhandled action types: ${types}`);\n }\n\n const errorMessage = [\n 'No actions found in UI-TARS response.',\n ...errorDetails,\n ].join('\\n');\n\n // Throw AIResponseParseError with usage and rawResponse preserved\n throw new AIResponseParseError(\n errorMessage,\n JSON.stringify(res.content, undefined, 2),\n res.usage,\n );\n }\n\n debug('transformActions', JSON.stringify(transformActions, null, 2));\n const log = getSummary(res.content);\n\n conversationHistory.append({\n role: 'assistant',\n content: log,\n });\n\n return {\n actions: transformActions,\n log,\n usage: res.usage,\n rawResponse: JSON.stringify(res.content, undefined, 2),\n shouldContinuePlanning: shouldContinue,\n };\n}\n\n/**\n * Converts bounding box notation to coordinate points\n * @param text - The text containing bbox tags to be converted\n * @returns The text with bbox tags replaced by coordinate points\n */\nfunction convertBboxToCoordinates(text: string): string {\n // Match the four numbers after <bbox>\n const pattern = /<bbox>(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)<\\/bbox>/g;\n\n function replaceMatch(\n match: string,\n x1: string,\n y1: string,\n x2: string,\n y2: string,\n ): string {\n // Convert strings to numbers and calculate center point\n const x1Num = Number.parseInt(x1, 10);\n const y1Num = Number.parseInt(y1, 10);\n const x2Num = Number.parseInt(x2, 10);\n const y2Num = Number.parseInt(y2, 10);\n\n // Use Math.floor to truncate and calculate center point\n const x = Math.floor((x1Num + x2Num) / 2);\n const y = Math.floor((y1Num + y2Num) / 2);\n\n // Return formatted coordinate string\n return `(${x},${y})`;\n }\n\n // Remove [EOS] and replace <bbox> coordinates\n const cleanedText = text.replace(/\\[EOS\\]/g, '');\n return cleanedText.replace(pattern, replaceMatch).trim();\n}\n\nfunction getPoint(startBox: string, size: { width: number; height: number }) {\n const [x, y] = JSON.parse(startBox);\n return [x * size.width, y * size.height];\n}\n\ninterface BaseAction {\n action_type: ActionType;\n action_inputs: Record<string, any>;\n reflection: string | null;\n thought: string | null;\n}\n\ninterface ClickAction extends BaseAction {\n action_type: 'click';\n action_inputs: {\n start_box: string; // JSON string of [x, y] coordinates\n };\n}\n\ninterface DragAction extends BaseAction {\n action_type: 'drag';\n action_inputs: {\n start_box: string; // JSON string of [x, y] coordinates\n end_box: string; // JSON string of [x, y] coordinates\n };\n}\n\ninterface WaitAction extends BaseAction {\n action_type: 'wait';\n action_inputs: {\n time: string; // JSON string of [x, y] coordinates\n };\n}\n\ninterface LeftDoubleAction extends BaseAction {\n action_type: 'left_double';\n action_inputs: {\n start_box: string; // JSON string of [x, y] coordinates\n };\n}\n\ninterface RightSingleAction extends BaseAction {\n action_type: 'right_single';\n action_inputs: {\n start_box: string; // JSON string of [x, y] coordinates\n };\n}\n\ninterface TypeAction extends BaseAction {\n action_type: 'type';\n action_inputs: {\n content: string;\n };\n}\n\ninterface HotkeyAction extends BaseAction {\n action_type: 'hotkey';\n action_inputs: {\n key: string;\n };\n}\n\ninterface ScrollAction extends BaseAction {\n action_type: 'scroll';\n action_inputs: {\n direction: 'up' | 'down';\n };\n}\n\ninterface FinishedAction extends BaseAction {\n action_type: 'finished';\n action_inputs: Record<string, never>;\n}\n\nexport type Action =\n | ClickAction\n | LeftDoubleAction\n | RightSingleAction\n | DragAction\n | TypeAction\n | HotkeyAction\n | ScrollAction\n | FinishedAction\n | WaitAction;\n","import { getPreferredLanguage } from '@midscene/shared/env';\n\nexport function getUiTarsPlanningPrompt(): string {\n const preferredLanguage = getPreferredLanguage();\n\n return `\nYou are a GUI agent. You are given a task and your action history, with screenshots. You need to perform the next action to complete the task. \n\n## Output Format\n\\`\\`\\`\nThought: ...\nAction: ...\n\\`\\`\\`\n\n## Action Space\n\nclick(start_box='[x1, y1, x2, y2]')\nleft_double(start_box='[x1, y1, x2, y2]')\nright_single(start_box='[x1, y1, x2, y2]')\ndrag(start_box='[x1, y1, x2, y2]', end_box='[x3, y3, x4, y4]')\nhotkey(key='')\ntype(content='xxx') # Use escape characters \\\\', \\\\\\\", and \\\\n in content part to ensure we can parse the content in normal python string format. If you want to submit your input, use \\\\n at the end of content. \nscroll(start_box='[x1, y1, x2, y2]', direction='down or up or right or left')\nwait() #Sleep for 5s and take a screenshot to check for any changes.\nfinished(content='xxx') # Use escape characters \\\\', \\\\\", and \\\\n in content part to ensure we can parse the content in normal python string format.\n\n\n## Note\n- Use ${preferredLanguage} in \\`Thought\\` part.\n- Write a small plan and finally summarize your next action (with its target element) in one sentence in \\`Thought\\` part.\n\n## User Instruction\n`;\n}\n\nexport const getSummary = (prediction: string) =>\n prediction\n .replace(/Reflection:[\\s\\S]*?(?=Action_Summary:|Action:|$)/g, '')\n .trim();\n","import type { SubGoal } from '@/types';\nimport type { ChatCompletionMessageParam } from 'openai/resources/index';\n\nexport interface ConversationHistoryOptions {\n initialMessages?: ChatCompletionMessageParam[];\n}\n\nexport class ConversationHistory {\n private readonly messages: ChatCompletionMessageParam[] = [];\n private subGoals: SubGoal[] = [];\n private memories: string[] = [];\n private historicalLogs: string[] = [];\n\n public pendingFeedbackMessage: string;\n\n constructor(options?: ConversationHistoryOptions) {\n if (options?.initialMessages?.length) {\n this.seed(options.initialMessages);\n }\n this.pendingFeedbackMessage = '';\n }\n\n resetPendingFeedbackMessageIfExists() {\n if (this.pendingFeedbackMessage) {\n this.pendingFeedbackMessage = '';\n }\n }\n\n append(message: ChatCompletionMessageParam) {\n this.messages.push(message);\n }\n\n seed(messages: ChatCompletionMessageParam[]) {\n this.reset();\n messages.forEach((message) => {\n this.append(message);\n });\n }\n\n reset() {\n this.messages.length = 0;\n this.memories.length = 0;\n this.subGoals.length = 0;\n this.historicalLogs.length = 0;\n this.pendingFeedbackMessage = '';\n }\n\n /**\n * Snapshot the conversation history, and replace the images with text if the number of images exceeds the limit.\n * @param maxImages - The maximum number of images to include in the snapshot. Undefined means no limit.\n * @returns The snapshot of the conversation history.\n */\n snapshot(maxImages?: number): ChatCompletionMessageParam[] {\n if (maxImages === undefined) {\n return [...this.messages];\n }\n\n const clonedMessages = structuredClone(this.messages);\n let imageCount = 0;\n\n // Traverse from the end to the beginning\n for (let i = clonedMessages.length - 1; i >= 0; i--) {\n const message = clonedMessages[i];\n const content = message.content;\n\n // Only process if content is an array\n if (Array.isArray(content)) {\n for (let j = 0; j < content.length; j++) {\n const item = content[j];\n\n // Check if this is an image\n if (item.type === 'image_url') {\n imageCount++;\n\n // If we've exceeded the limit, replace with text\n if (imageCount > maxImages) {\n content[j] = {\n type: 'text',\n text: '(image ignored due to size optimization)',\n };\n }\n }\n }\n }\n }\n\n return clonedMessages;\n }\n\n get length(): number {\n return this.messages.length;\n }\n\n [Symbol.iterator](): IterableIterator<ChatCompletionMessageParam> {\n return this.messages[Symbol.iterator]();\n }\n\n toJSON(): ChatCompletionMessageParam[] {\n return this.snapshot();\n }\n\n // Sub-goal management methods\n\n /**\n * Set all sub-goals, replacing any existing ones.\n * Automatically marks the first pending goal as running.\n */\n setSubGoals(subGoals: SubGoal[]): void {\n this.subGoals = subGoals.map((goal) => ({ ...goal }));\n this.markFirstPendingAsRunning();\n }\n\n /**\n * Merge sub-goals from update-plan-content.\n * Preserves existing descriptions when incoming description is empty.\n *\n * This handles compact XML updates like:\n * <sub-goal index=\"1\" status=\"finished\" />\n */\n mergeSubGoals(subGoals: SubGoal[]): void {\n if (this.subGoals.length === 0) {\n this.setSubGoals(subGoals);\n return;\n }\n\n const existingByIndex = new Map(\n this.subGoals.map((goal) => [goal.index, goal] as const),\n );\n\n const mergedSubGoals = subGoals.map((goal) => {\n const existingGoal = existingByIndex.get(goal.index);\n const hasNonEmptyDescription = goal.description.trim().length > 0;\n\n if (!existingGoal && !hasNonEmptyDescription) {\n return null;\n }\n\n return {\n ...goal,\n description:\n hasNonEmptyDescription || !existingGoal\n ? goal.description\n : existingGoal.description,\n };\n });\n\n const validSubGoals = mergedSubGoals.filter((goal) => goal !== null);\n if (validSubGoals.length === 0) {\n return;\n }\n\n this.setSubGoals(validSubGoals);\n }\n\n /**\n * Update a single sub-goal by index.\n * Clears logs if status or description actually changes.\n * @returns true if the sub-goal was found and updated, false otherwise\n */\n updateSubGoal(\n index: number,\n updates: Partial<Omit<SubGoal, 'index'>>,\n ): boolean {\n const goal = this.subGoals.find((g) => g.index === index);\n if (!goal) {\n return false;\n }\n\n let changed = false;\n\n if (updates.status !== undefined && updates.status !== goal.status) {\n goal.status = updates.status;\n changed = true;\n }\n if (\n updates.description !== undefined &&\n updates.description !== goal.description\n ) {\n goal.description = updates.description;\n changed = true;\n }\n\n if (changed) {\n goal.logs = [];\n }\n\n return true;\n }\n\n /**\n * Mark the first pending sub-goal as running.\n * Clears logs since status changes.\n */\n markFirstPendingAsRunning(): void {\n const firstPending = this.subGoals.find((g) => g.status === 'pending');\n if (firstPending) {\n firstPending.status = 'running';\n firstPending.logs = [];\n }\n }\n\n /**\n * Mark a sub-goal as finished.\n * Automatically marks the next pending goal as running.\n * @returns true if the sub-goal was found and updated, false otherwise\n */\n markSubGoalFinished(index: number): boolean {\n const result = this.updateSubGoal(index, { status: 'finished' });\n if (result) {\n this.markFirstPendingAsRunning();\n }\n return result;\n }\n\n /**\n * Mark all sub-goals as finished.\n * Clears logs for any goal whose status actually changes.\n */\n markAllSubGoalsFinished(): void {\n for (const goal of this.subGoals) {\n if (goal.status !== 'finished') {\n goal.logs = [];\n }\n goal.status = 'finished';\n }\n }\n\n /**\n * Append a log entry to the currently running sub-goal.\n * The log describes an action performed while working on the sub-goal.\n */\n appendSubGoalLog(log: string): void {\n if (!log) {\n return;\n }\n const runningGoal = this.subGoals.find((g) => g.status === 'running');\n if (runningGoal) {\n if (!runningGoal.logs) {\n runningGoal.logs = [];\n }\n runningGoal.logs.push(log);\n }\n }\n\n /**\n * Convert sub-goals to text representation.\n * Includes actions performed (logs) for the current sub-goal.\n */\n subGoalsToText(): string {\n if (this.subGoals.length === 0) {\n return '';\n }\n\n const lines = this.subGoals.map((goal) => {\n return `${goal.index}. ${goal.description} (${goal.status})`;\n });\n\n // Running goal takes priority, otherwise show first pending\n const currentGoal =\n this.subGoals.find((goal) => goal.status === 'running') ||\n this.subGoals.find((goal) => goal.status === 'pending');\n\n let currentGoalText = '';\n if (currentGoal) {\n currentGoalText = `\\nCurrent sub-goal is: ${currentGoal.description}`;\n if (currentGoal.logs && currentGoal.logs.length > 0) {\n const logLines = currentGoal.logs.map((log) => `- ${log}`).join('\\n');\n currentGoalText += `\\nActions performed for current sub-goal:\\n${logLines}`;\n }\n }\n\n return `Sub-goals:\\n${lines.join('\\n')}${currentGoalText}`;\n }\n\n // Historical log management methods (used in non-deepThink mode)\n\n /**\n * Append a log entry to the historical logs list.\n * Used in non-deepThink mode to track executed steps across planning rounds.\n */\n appendHistoricalLog(log: string): void {\n if (log) {\n this.historicalLogs.push(log);\n }\n }\n\n /**\n * Convert historical logs to text representation.\n * Provides context about previously executed steps to the model.\n */\n historicalLogsToText(): string {\n if (this.historicalLogs.length === 0) {\n return '';\n }\n\n const logLines = this.historicalLogs.map((log) => `- ${log}`).join('\\n');\n return `Here are the steps that have been executed:\\n${logLines}`;\n }\n\n // Memory management methods\n\n /**\n * Append a memory to the memories list\n */\n appendMemory(memory: string): void {\n if (memory) {\n this.memories.push(memory);\n }\n }\n\n /**\n * Get all memories\n */\n getMemories(): string[] {\n return [...this.memories];\n }\n\n /**\n * Convert memories to text representation\n */\n memoriesToText(): string {\n if (this.memories.length === 0) {\n return '';\n }\n\n return `Memories from previous steps:\\n---\\n${this.memories.join('\\n---\\n')}\\n`;\n }\n\n /**\n * Clear all memories\n */\n clearMemories(): void {\n this.memories.length = 0;\n }\n\n /**\n * Compress the conversation history if it exceeds the threshold.\n * Removes the oldest messages and replaces them with a single placeholder message.\n * @param threshold - The number of messages that triggers compression.\n * @param keepCount - The number of recent messages to keep after compression.\n * @returns true if compression was performed, false otherwise.\n */\n compressHistory(threshold: number, keepCount: number): boolean {\n if (this.messages.length <= threshold) {\n return false;\n }\n\n const omittedCount = this.messages.length - keepCount;\n const omittedPlaceholder: ChatCompletionMessageParam = {\n role: 'user',\n content: `(${omittedCount} previous conversation messages have been omitted)`,\n };\n\n // Keep only the last `keepCount` messages\n const recentMessages = this.messages.slice(-keepCount);\n\n // Reset and rebuild with placeholder + recent messages\n this.messages.length = 0;\n this.messages.push(omittedPlaceholder);\n for (const msg of recentMessages) {\n this.messages.push(msg);\n }\n\n return true;\n }\n}\n","import type { TMultimodalPrompt, TUserPrompt } from '@/common';\nimport type {\n DetailedLocateParam,\n LocateOption,\n MidsceneYamlScript,\n} from '@/types';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport yaml from 'js-yaml';\n\nconst debugUtils = getDebug('yaml:utils');\n\nconst multimodalLocateOptionFieldMap: Record<keyof TMultimodalPrompt, true> = {\n images: true,\n convertHttpImage2Base64: true,\n};\n\nconst multimodalLocateOptionKeys = Object.keys(\n multimodalLocateOptionFieldMap,\n) as Array<keyof TMultimodalPrompt>;\n\nfunction extractMultimodalPrompt(\n opt?: LocateOption,\n): Partial<TMultimodalPrompt> | undefined {\n if (typeof opt !== 'object' || opt === null) {\n return undefined;\n }\n\n const entries = multimodalLocateOptionKeys\n .map((key) => [key, opt[key]] as const)\n .filter(([, value]) => value !== undefined);\n\n return entries.length\n ? (Object.fromEntries(entries) as Partial<TMultimodalPrompt>)\n : undefined;\n}\n\nexport function interpolateEnvVars(content: string): string {\n // Process line by line to skip commented lines\n const lines = content.split('\\n');\n const processedLines = lines.map((line) => {\n // Check if the line is a YAML comment (starts with # after optional whitespace)\n const trimmedLine = line.trimStart();\n if (trimmedLine.startsWith('#')) {\n // Skip interpolation for comment lines\n return line;\n }\n\n // Process environment variables for non-comment lines\n return line.replace(/\\$\\{([^}]+)\\}/g, (_, envVar) => {\n const value = process.env[envVar.trim()];\n if (value === undefined) {\n throw new Error(\n `Environment variable \"${envVar.trim()}\" is not defined`,\n );\n }\n return value;\n });\n });\n\n return processedLines.join('\\n');\n}\n\nexport function parseYamlScript(\n content: string,\n filePath?: string,\n): MidsceneYamlScript {\n let processedContent = content;\n if (content.indexOf('android') !== -1 && content.match(/deviceId:\\s*(\\d+)/)) {\n let matchedDeviceId;\n processedContent = content.replace(\n /deviceId:\\s*(\\d+)/g,\n (match, deviceId) => {\n matchedDeviceId = deviceId;\n return `deviceId: '${deviceId}'`;\n },\n );\n console.warn(\n `please use string-style deviceId in yaml script, for example: deviceId: \"${matchedDeviceId}\"`,\n );\n }\n const interpolatedContent = interpolateEnvVars(processedContent);\n const obj = yaml.load(interpolatedContent, {\n schema: yaml.JSON_SCHEMA,\n }) as MidsceneYamlScript;\n\n const pathTip = filePath ? `, failed to load ${filePath}` : '';\n assert(obj.tasks, `property \"tasks\" is required in yaml script ${pathTip}`);\n assert(\n Array.isArray(obj.tasks),\n `property \"tasks\" must be an array in yaml script, but got ${obj.tasks}`,\n );\n return obj;\n}\n\nexport function buildDetailedLocateParam(\n locatePrompt: TUserPrompt,\n opt?: LocateOption,\n): DetailedLocateParam | undefined {\n debugUtils('will call buildDetailedLocateParam', locatePrompt, opt);\n // Normalize object-form TUserPrompt: when the object only contains a\n // `prompt` string (no multimodal fields like `images`), unwrap it to\n // avoid double nesting like { prompt: { prompt: '...' } }.\n let normalizedLocatePrompt: TUserPrompt = locatePrompt;\n if (\n typeof locatePrompt === 'object' &&\n locatePrompt !== null &&\n 'prompt' in locatePrompt\n ) {\n const { prompt: innerPrompt, ...rest } = locatePrompt;\n const hasMultimodalFields = Object.keys(rest).length > 0;\n normalizedLocatePrompt = hasMultimodalFields ? locatePrompt : innerPrompt;\n }\n\n let prompt = normalizedLocatePrompt || opt?.prompt || (opt as any)?.locate; // as a shortcut\n let deepLocate = false;\n let cacheable = true;\n let xpath = undefined;\n\n if (typeof opt === 'object' && opt !== null) {\n // Backward-compatible: accept `deepThink` as a deprecated alias for `deepLocate`.\n // All downstream code works on `deepLocate` only; the compatibility resolution\n // is intentionally kept here at the entry point so it does not bleed through\n // the rest of the call stack.\n deepLocate = opt.deepLocate ?? opt.deepThink ?? false;\n cacheable = opt.cacheable ?? true;\n xpath = opt.xpath;\n if (locatePrompt && opt.prompt && locatePrompt !== opt.prompt) {\n console.warn(\n 'conflict prompt for item',\n locatePrompt,\n opt,\n 'maybe you put the prompt in the wrong place',\n );\n }\n prompt = prompt || opt.prompt;\n }\n\n if (!prompt) {\n debugUtils(\n 'no prompt, will return undefined in buildDetailedLocateParam',\n opt,\n );\n return undefined;\n }\n\n const multimodalPrompt = extractMultimodalPrompt(opt);\n if (multimodalPrompt) {\n prompt =\n typeof prompt === 'string'\n ? {\n prompt,\n ...multimodalPrompt,\n }\n : {\n ...prompt,\n ...multimodalPrompt,\n };\n }\n\n return {\n prompt,\n deepLocate,\n cacheable,\n xpath,\n };\n}\n\nexport function buildDetailedLocateParamAndRestParams(\n locatePrompt: TUserPrompt,\n opt: LocateOption | undefined,\n excludeKeys: string[] = [],\n): {\n locateParam: DetailedLocateParam | undefined;\n restParams: Record<string, any>;\n} {\n const multimodalPrompt = extractMultimodalPrompt(opt);\n const locateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n // Extract all keys from opt except the ones already included in locateParam\n const restParams: Record<string, any> = {};\n\n if (typeof opt === 'object' && opt !== null) {\n // Get all keys from opt\n const allKeys = Object.keys(opt);\n\n // Keys already included in locateParam: prompt, deepLocate, cacheable, xpath\n const locateParamKeys = Object.keys(locateParam || {});\n const multimodalPromptKeys =\n typeof locateParam?.prompt === 'object' && locateParam?.prompt !== null\n ? Object.keys(multimodalPrompt || {})\n : [];\n\n // Extract all other keys\n for (const key of allKeys) {\n if (\n !locateParamKeys.includes(key) &&\n !multimodalPromptKeys.includes(key) &&\n !excludeKeys.includes(key) &&\n key !== 'locate'\n ) {\n restParams[key] = opt[key as keyof LocateOption];\n }\n }\n }\n\n return {\n locateParam,\n restParams,\n };\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, join, resolve } from 'node:path';\nimport { assert, ifInBrowser, ifInWorker } from '@midscene/shared/utils';\nimport { type ZodTypeAny, z } from 'zod';\n\n// previous defined yaml flow, as a helper\ninterface MidsceneYamlFlowItemAIInput extends LocateOption {\n // previous version\n // aiInput: string; // value to input\n // locate: TUserPrompt; // where to input\n aiInput: TUserPrompt | undefined; // where to input\n value: string | number; // value to input\n}\n\ninterface MidsceneYamlFlowItemAIKeyboardPress extends LocateOption {\n // previous version\n // aiKeyboardPress: string;\n // locate?: TUserPrompt; // where to press, optional\n aiKeyboardPress: TUserPrompt | undefined; // where to press\n keyName: string; // key to press\n}\n\ninterface MidsceneYamlFlowItemAIScroll extends LocateOption, ScrollParam {\n // previous version\n // aiScroll: null;\n // locate?: TUserPrompt; // which area to scroll, optional\n aiScroll: TUserPrompt | undefined; // which area to scroll\n}\n\nimport type { Agent } from '@/agent/agent';\nimport type { TUserPrompt } from '@/common';\nimport type {\n DeviceAction,\n FreeFn,\n LocateOption,\n MidsceneYamlFlowItemAIAction,\n MidsceneYamlFlowItemAIAssert,\n MidsceneYamlFlowItemAIWaitFor,\n MidsceneYamlFlowItemEvaluateJavaScript,\n MidsceneYamlFlowItemLogScreenshot,\n MidsceneYamlFlowItemSleep,\n MidsceneYamlScript,\n MidsceneYamlScriptEnv,\n ScriptPlayerStatusValue,\n ScriptPlayerTaskStatus,\n ScrollParam,\n} from '@/types';\nimport { getMidsceneRunSubDir } from '@midscene/shared/common';\nimport { getDebug } from '@midscene/shared/logger';\nimport {\n buildDetailedLocateParam,\n buildDetailedLocateParamAndRestParams,\n} from './utils';\n\nconst debug = getDebug('yaml-player');\nconst aiTaskHandlerMap = {\n aiQuery: 'aiQuery',\n aiNumber: 'aiNumber',\n aiString: 'aiString',\n aiBoolean: 'aiBoolean',\n aiAsk: 'aiAsk',\n aiLocate: 'aiLocate',\n} as const;\n\ntype AISimpleTaskKey = keyof typeof aiTaskHandlerMap;\n\nconst isStringParamSchema = (schema?: ZodTypeAny): boolean => {\n if (!schema) {\n return false;\n }\n\n const schemaDef = (schema as any)?._def;\n if (!schemaDef?.typeName) {\n return false;\n }\n\n switch (schemaDef.typeName) {\n case z.ZodFirstPartyTypeKind.ZodString:\n case z.ZodFirstPartyTypeKind.ZodEnum:\n case z.ZodFirstPartyTypeKind.ZodNativeEnum:\n return true;\n case z.ZodFirstPartyTypeKind.ZodLiteral:\n return typeof schemaDef.value === 'string';\n case z.ZodFirstPartyTypeKind.ZodOptional:\n case z.ZodFirstPartyTypeKind.ZodNullable:\n case z.ZodFirstPartyTypeKind.ZodDefault:\n return isStringParamSchema(schemaDef.innerType);\n case z.ZodFirstPartyTypeKind.ZodEffects:\n return isStringParamSchema(schemaDef.schema);\n case z.ZodFirstPartyTypeKind.ZodPipeline:\n return isStringParamSchema(schemaDef.out);\n case z.ZodFirstPartyTypeKind.ZodUnion: {\n const options = schemaDef.options as ZodTypeAny[] | undefined;\n return Array.isArray(options)\n ? options.every((option) => isStringParamSchema(option))\n : false;\n }\n default:\n return false;\n }\n};\n\nconst buildLaunchOrAdbShellParam = (\n actionName: string,\n interfaceAlias: string | undefined,\n value: string,\n) => {\n if (actionName === 'Launch' || interfaceAlias === 'launch') {\n return { uri: value };\n }\n\n if (actionName === 'RunAdbShell' || interfaceAlias === 'runAdbShell') {\n return { command: value };\n }\n\n return undefined;\n};\nexport class ScriptPlayer<T extends MidsceneYamlScriptEnv> {\n public currentTaskIndex?: number;\n public taskStatusList: ScriptPlayerTaskStatus[] = [];\n public status: ScriptPlayerStatusValue = 'init';\n public reportFile?: string | null;\n public result: Record<string, any>;\n private unnamedResultIndex = 0;\n public output?: string | null;\n public unstableLogContent?: string | null;\n public errorInSetup?: Error;\n private interfaceAgent: Agent | null = null;\n public agentStatusTip?: string;\n public target?: MidsceneYamlScriptEnv;\n private actionSpace: DeviceAction[] = [];\n private scriptPath?: string;\n constructor(\n private script: MidsceneYamlScript,\n private setupAgent: (platform: T) => Promise<{\n agent: Agent;\n freeFn: FreeFn[];\n }>,\n public onTaskStatusChange?: (taskStatus: ScriptPlayerTaskStatus) => void,\n scriptPath?: string,\n ) {\n this.scriptPath = scriptPath;\n this.result = {};\n const resolvedAiActContext =\n script.agent?.aiActContext ?? script.agent?.aiActionContext;\n\n if (resolvedAiActContext !== undefined && script.agent) {\n if (\n script.agent.aiActContext === undefined &&\n script.agent.aiActionContext !== undefined\n ) {\n console.warn(\n 'agent.aiActionContext is deprecated, please use agent.aiActContext instead. The legacy name is still accepted for backward compatibility.',\n );\n }\n\n script.agent.aiActContext = resolvedAiActContext;\n }\n\n this.target =\n script.target ||\n script.web ||\n script.android ||\n script.ios ||\n script.computer ||\n script.config;\n\n if (ifInBrowser || ifInWorker) {\n this.output = undefined;\n debug('output is undefined in browser or worker');\n } else if (this.target?.output) {\n this.output = resolve(process.cwd(), this.target.output);\n debug('setting output by config.output', this.output);\n } else {\n const scriptName = this.scriptPath\n ? basename(this.scriptPath, '.yaml').replace(/\\.(ya?ml)$/i, '')\n : 'script';\n this.output = join(\n getMidsceneRunSubDir('output'),\n `${scriptName}-${Date.now()}.json`,\n );\n debug('setting output by script path', this.output);\n }\n\n if (ifInBrowser || ifInWorker) {\n this.unstableLogContent = undefined;\n } else if (typeof this.target?.unstableLogContent === 'string') {\n this.unstableLogContent = resolve(\n process.cwd(),\n this.target.unstableLogContent,\n );\n } else if (this.target?.unstableLogContent === true) {\n this.unstableLogContent = join(\n getMidsceneRunSubDir('output'),\n 'unstableLogContent.json',\n );\n }\n\n this.taskStatusList = (script.tasks || []).map((task, taskIndex) => ({\n ...task,\n index: taskIndex,\n status: 'init',\n totalSteps: task.flow?.length || 0,\n }));\n }\n\n private setResult(key: string | undefined, value: any) {\n const keyToUse = key || this.unnamedResultIndex++;\n if (this.result[keyToUse]) {\n console.warn(`result key ${keyToUse} already exists, will overwrite`);\n }\n this.result[keyToUse] = value;\n\n return this.flushResult();\n }\n\n private setPlayerStatus(status: ScriptPlayerStatusValue, error?: Error) {\n this.status = status;\n this.errorInSetup = error;\n }\n\n private notifyCurrentTaskStatusChange(taskIndex?: number) {\n const taskIndexToNotify =\n typeof taskIndex === 'number' ? taskIndex : this.currentTaskIndex;\n\n if (typeof taskIndexToNotify !== 'number') {\n return;\n }\n\n const taskStatus = this.taskStatusList[taskIndexToNotify];\n if (this.onTaskStatusChange) {\n this.onTaskStatusChange(taskStatus);\n }\n }\n\n private async setTaskStatus(\n index: number,\n statusValue: ScriptPlayerStatusValue,\n error?: Error,\n ) {\n this.taskStatusList[index].status = statusValue;\n if (error) {\n this.taskStatusList[index].error = error;\n }\n\n this.notifyCurrentTaskStatusChange(index);\n }\n\n private setTaskIndex(taskIndex: number) {\n this.currentTaskIndex = taskIndex;\n }\n\n private flushResult() {\n if (this.output) {\n const output = resolve(process.cwd(), this.output);\n const outputDir = dirname(output);\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n writeFileSync(output, JSON.stringify(this.result || {}, undefined, 2));\n }\n }\n\n private flushUnstableLogContent() {\n if (this.unstableLogContent) {\n const content = this.interfaceAgent?._unstableLogContent();\n const filePath = resolve(process.cwd(), this.unstableLogContent);\n const outputDir = dirname(filePath);\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n writeFileSync(filePath, JSON.stringify(content, null, 2));\n }\n }\n\n async playTask(taskStatus: ScriptPlayerTaskStatus, agent: Agent) {\n const { flow } = taskStatus;\n assert(flow, 'missing flow in task');\n\n for (const flowItemIndex in flow) {\n const currentStep = Number.parseInt(flowItemIndex, 10);\n taskStatus.currentStep = currentStep;\n const flowItem = flow[flowItemIndex];\n\n // Skip Finalize action from cache - it's a planning-only marker\n if ('Finalize' in flowItem) {\n continue;\n }\n\n debug(\n `playing step ${flowItemIndex}, flowItem=${JSON.stringify(flowItem)}`,\n );\n const simpleAIKey = (\n Object.keys(aiTaskHandlerMap) as AISimpleTaskKey[]\n ).find((key) => Object.prototype.hasOwnProperty.call(flowItem, key));\n if (\n 'aiAct' in (flowItem as MidsceneYamlFlowItemAIAction) ||\n 'aiAction' in (flowItem as MidsceneYamlFlowItemAIAction) ||\n 'ai' in (flowItem as MidsceneYamlFlowItemAIAction)\n ) {\n const actionTask = flowItem as MidsceneYamlFlowItemAIAction;\n const { aiAct, aiAction, ai, ...actionOptions } = actionTask;\n const prompt = aiAct || aiAction || ai;\n assert(prompt, 'missing prompt for ai (aiAct)');\n await agent.aiAct(prompt, actionOptions);\n } else if ('aiAssert' in (flowItem as MidsceneYamlFlowItemAIAssert)) {\n const assertTask = flowItem as MidsceneYamlFlowItemAIAssert;\n const {\n aiAssert: prompt,\n errorMessage: msg,\n name,\n ...restOpts\n } = assertTask;\n assert(prompt, 'missing prompt for aiAssert');\n const { pass, thought, message } =\n (await agent.aiAssert(prompt, msg, {\n ...restOpts,\n keepRawResponse: true,\n })) || {};\n\n this.setResult(name, {\n pass,\n thought,\n message,\n });\n\n if (!pass) {\n throw new Error(message);\n }\n } else if (simpleAIKey) {\n const {\n [simpleAIKey]: prompt,\n name,\n ...options\n } = flowItem as Record<string, any>;\n assert(prompt, `missing prompt for ${simpleAIKey}`);\n const agentMethod = (agent as any)[aiTaskHandlerMap[simpleAIKey]];\n assert(\n typeof agentMethod === 'function',\n `missing agent method for ${simpleAIKey}`,\n );\n const aiResult = await agentMethod.call(agent, prompt, options);\n this.setResult(name, aiResult);\n } else if ('aiWaitFor' in (flowItem as MidsceneYamlFlowItemAIWaitFor)) {\n const waitForTask = flowItem as MidsceneYamlFlowItemAIWaitFor;\n const { aiWaitFor, timeout, ...restWaitForOpts } = waitForTask;\n const prompt = aiWaitFor;\n assert(prompt, 'missing prompt for aiWaitFor');\n const waitForOptions = {\n ...restWaitForOpts,\n ...(timeout !== undefined ? { timeout, timeoutMs: timeout } : {}),\n };\n await agent.aiWaitFor(prompt, waitForOptions);\n } else if ('sleep' in (flowItem as MidsceneYamlFlowItemSleep)) {\n const sleepTask = flowItem as MidsceneYamlFlowItemSleep;\n const ms = sleepTask.sleep;\n let msNumber = ms;\n if (typeof ms === 'string') {\n msNumber = Number.parseInt(ms, 10);\n }\n assert(\n msNumber && msNumber > 0,\n `ms for sleep must be greater than 0, but got ${ms}`,\n );\n await new Promise((resolve) => setTimeout(resolve, msNumber));\n } else if (\n 'javascript' in (flowItem as MidsceneYamlFlowItemEvaluateJavaScript)\n ) {\n const evaluateJavaScriptTask =\n flowItem as MidsceneYamlFlowItemEvaluateJavaScript;\n\n const result = await agent.evaluateJavaScript(\n evaluateJavaScriptTask.javascript,\n );\n this.setResult(evaluateJavaScriptTask.name, result);\n } else if (\n 'logScreenshot' in (flowItem as MidsceneYamlFlowItemLogScreenshot) ||\n 'recordToReport' in (flowItem as MidsceneYamlFlowItemLogScreenshot)\n ) {\n const recordTask = flowItem as MidsceneYamlFlowItemLogScreenshot;\n const title =\n recordTask.recordToReport ?? recordTask.logScreenshot ?? 'untitled';\n const content = recordTask.content || '';\n await agent.recordToReport(title, { content });\n } else if ('aiInput' in (flowItem as MidsceneYamlFlowItemAIInput)) {\n // may be input empty string ''\n const {\n aiInput,\n value: rawValue,\n ...inputTask\n } = flowItem as MidsceneYamlFlowItemAIInput;\n\n // Compatibility with previous version:\n // Old format: { aiInput: string (value), locate: TUserPrompt }\n // New format - 1: { aiInput: TUserPrompt, value: string | number }\n // New format - 2: { aiInput: undefined, locate: TUserPrompt, value: string | number }\n let locatePrompt: TUserPrompt | undefined;\n let value: string | number | undefined;\n if ((inputTask as any).locate) {\n // Old format - aiInput is the value, locate is the prompt\n // Keep backward compatibility: empty string is treated as no value\n value = (aiInput as string | number) || rawValue;\n locatePrompt = (inputTask as any).locate;\n } else {\n // New format - aiInput is the prompt, value is the value\n locatePrompt = aiInput || '';\n value = rawValue;\n }\n\n // Convert value to string for Input action\n await agent.callActionInActionSpace('Input', {\n ...inputTask,\n ...(value !== undefined ? { value: String(value) } : {}),\n ...(locatePrompt\n ? { locate: buildDetailedLocateParam(locatePrompt, inputTask) }\n : {}),\n });\n } else if (\n 'aiKeyboardPress' in (flowItem as MidsceneYamlFlowItemAIKeyboardPress)\n ) {\n const { aiKeyboardPress, ...keyboardPressTask } =\n flowItem as MidsceneYamlFlowItemAIKeyboardPress;\n\n // Compatibility with previous version:\n // Old format: { aiKeyboardPress: string (key), locate?: TUserPrompt }\n // New format - 1: { aiKeyboardPress: TUserPrompt, keyName: string }\n // New format - 2: { aiKeyboardPress: , locate?: TUserPrompt, keyName: string }\n let locatePrompt: TUserPrompt | undefined;\n let keyName: string | undefined;\n if ((keyboardPressTask as any).locate) {\n // Old format - aiKeyboardPress is the key, locate is the prompt\n keyName = aiKeyboardPress as string;\n locatePrompt = (keyboardPressTask as any).locate;\n } else if (keyboardPressTask.keyName) {\n // New format - aiKeyboardPress is the prompt, key is the key\n keyName = keyboardPressTask.keyName;\n locatePrompt = aiKeyboardPress;\n } else {\n keyName = aiKeyboardPress as string;\n }\n\n await agent.callActionInActionSpace('KeyboardPress', {\n ...keyboardPressTask,\n ...(keyName ? { keyName } : {}),\n ...(locatePrompt\n ? {\n locate: buildDetailedLocateParam(\n locatePrompt,\n keyboardPressTask,\n ),\n }\n : {}),\n });\n } else if ('aiScroll' in (flowItem as MidsceneYamlFlowItemAIScroll)) {\n const { aiScroll, ...scrollTask } =\n flowItem as MidsceneYamlFlowItemAIScroll;\n\n // Compatibility with previous version:\n // Old format: { aiScroll: null, locate?: TUserPrompt, direction, scrollType, distance? }\n // New format - 1: { aiScroll: TUserPrompt, direction, scrollType, distance? }\n // New format - 2: { aiScroll: undefined, locate: TUserPrompt, direction, scrollType, distance? }\n const { locate, ...scrollOptions } = scrollTask as any;\n const locatePrompt: TUserPrompt | undefined = locate ?? aiScroll;\n\n await agent.aiScroll(locatePrompt, scrollOptions);\n } else if ('aiTap' in flowItem) {\n const { aiTap, prompt, locate, ...tapOptions } = flowItem as any;\n\n let locatePrompt: TUserPrompt;\n let opts = tapOptions;\n // Support both formats:\n // 1. { aiTap: null, locate: { prompt, images, ... } } (locate as sibling key)\n // 2. { aiTap: { locate: { prompt, images, ... } } } (locate nested in aiTap)\n const locateObj =\n locate ??\n (typeof aiTap === 'object' && aiTap !== null\n ? aiTap.locate\n : undefined);\n\n if (typeof aiTap === 'string' && aiTap) {\n // User YAML: aiTap: 'search input box'\n locatePrompt = aiTap;\n } else if (typeof locateObj === 'object' && locateObj?.prompt) {\n // buildYamlFlowFromPlans: { aiTap: '', locate: { prompt, deepLocate, cacheable } }\n const { prompt: lp, ...locateOpts } = locateObj;\n locatePrompt = lp;\n opts = { ...locateOpts, ...tapOptions };\n } else {\n // User YAML: aiTap: { prompt: '...' } or aiTap: null + prompt: '...'\n locatePrompt = aiTap?.prompt || prompt || locateObj;\n }\n\n assert(locatePrompt, 'missing prompt for aiTap');\n await agent.aiTap(locatePrompt, opts);\n } else {\n // generic action, find the action in actionSpace\n\n /* for aiRightClick, the parameters are a flattened data for the 'locate', these are all valid data\n\n - aiRightClick: 'search input box'\n - aiRightClick: 'search input box'\n deepLocate: true\n cacheable: false\n - aiRightClick:\n prompt: 'search input box'\n - aiRightClick:\n prompt: 'search input box'\n deepLocate: true\n cacheable: false\n */\n\n const actionSpace = this.actionSpace;\n let locatePromptShortcut: string | undefined;\n let actionParamForMatchedAction: unknown;\n const matchedAction = actionSpace.find((action) => {\n const actionInterfaceAlias = action.interfaceAlias;\n if (\n actionInterfaceAlias &&\n Object.prototype.hasOwnProperty.call(flowItem, actionInterfaceAlias)\n ) {\n actionParamForMatchedAction =\n flowItem[actionInterfaceAlias as keyof typeof flowItem];\n if (typeof actionParamForMatchedAction === 'string') {\n locatePromptShortcut = actionParamForMatchedAction;\n }\n return true;\n }\n\n const keyOfActionInActionSpace = action.name;\n if (\n Object.prototype.hasOwnProperty.call(\n flowItem,\n keyOfActionInActionSpace,\n )\n ) {\n actionParamForMatchedAction =\n flowItem[keyOfActionInActionSpace as keyof typeof flowItem];\n if (typeof actionParamForMatchedAction === 'string') {\n locatePromptShortcut = actionParamForMatchedAction;\n }\n return true;\n }\n\n return false;\n });\n\n assert(\n matchedAction,\n `unknown flowItem in yaml: ${JSON.stringify(flowItem)}`,\n );\n\n const schemaIsStringParam = isStringParamSchema(\n matchedAction.paramSchema,\n );\n let stringParamToCall: string | undefined;\n const specialActionParamToCall =\n typeof actionParamForMatchedAction === 'string'\n ? buildLaunchOrAdbShellParam(\n matchedAction.name,\n matchedAction.interfaceAlias,\n actionParamForMatchedAction,\n )\n : undefined;\n if (\n typeof actionParamForMatchedAction === 'string' &&\n (matchedAction.name === 'Launch' ||\n matchedAction.interfaceAlias === 'launch') &&\n typeof (agent as any).launch === 'function'\n ) {\n // Call agent.launch directly for Launch action with string param\n debug(`Calling agent.launch with: ${actionParamForMatchedAction}`);\n const result = await (agent as any).launch(\n actionParamForMatchedAction,\n );\n\n const resultName = (flowItem as any).name;\n if (result !== undefined) {\n this.setResult(resultName, result);\n }\n } else if (\n typeof actionParamForMatchedAction === 'string' &&\n (matchedAction.name === 'RunAdbShell' ||\n matchedAction.interfaceAlias === 'runAdbShell') &&\n typeof (agent as any).runAdbShell === 'function'\n ) {\n // Call agent.runAdbShell directly for RunAdbShell action with string param\n debug(\n `Calling agent.runAdbShell with: ${actionParamForMatchedAction}`,\n );\n const result = await (agent as any).runAdbShell(\n actionParamForMatchedAction,\n );\n\n const resultName = (flowItem as any).name;\n if (result !== undefined) {\n this.setResult(resultName, result);\n }\n } else if (specialActionParamToCall) {\n debug(\n `matchedAction: ${matchedAction.name}`,\n `flowParams: ${JSON.stringify(specialActionParamToCall)}`,\n );\n const result = await agent.callActionInActionSpace(\n matchedAction.name,\n specialActionParamToCall,\n );\n\n const resultName = (flowItem as any).name;\n if (result !== undefined) {\n this.setResult(resultName, result);\n }\n } else if (\n typeof actionParamForMatchedAction === 'string' &&\n schemaIsStringParam\n ) {\n if (matchedAction.paramSchema) {\n const parseResult = matchedAction.paramSchema.safeParse(\n actionParamForMatchedAction,\n );\n if (parseResult.success && typeof parseResult.data === 'string') {\n stringParamToCall = parseResult.data;\n } else if (!parseResult.success) {\n debug(\n `parse failed for action ${matchedAction.name} with string param`,\n parseResult.error,\n );\n stringParamToCall = actionParamForMatchedAction;\n }\n } else {\n stringParamToCall = actionParamForMatchedAction;\n }\n\n if (stringParamToCall !== undefined) {\n debug(\n `matchedAction: ${matchedAction.name}`,\n `flowParams: ${JSON.stringify(stringParamToCall)}`,\n );\n const result = await agent.callActionInActionSpace(\n matchedAction.name,\n stringParamToCall,\n );\n\n // Store result if there's a name property in flowItem\n const resultName = (flowItem as any).name;\n if (result !== undefined) {\n this.setResult(resultName, result);\n }\n }\n } else {\n // Determine the source for parameter extraction:\n // - If we have a locatePromptShortcut, use the flowItem (for actions like aiTap with prompt)\n // - Otherwise, use actionParamForMatchedAction (for actions like runWdaRequest with structured params)\n const sourceForParams =\n locatePromptShortcut &&\n typeof actionParamForMatchedAction === 'string'\n ? { ...flowItem, prompt: locatePromptShortcut }\n : typeof actionParamForMatchedAction === 'object' &&\n actionParamForMatchedAction !== null\n ? actionParamForMatchedAction\n : flowItem;\n\n const { locateParam, restParams } =\n buildDetailedLocateParamAndRestParams(\n locatePromptShortcut || '',\n sourceForParams as LocateOption,\n [\n matchedAction.name,\n matchedAction.interfaceAlias || '_never_mind_',\n ],\n );\n\n const flowParams = {\n ...restParams,\n locate: locateParam,\n };\n\n debug(\n `matchedAction: ${matchedAction.name}`,\n `flowParams: ${JSON.stringify(flowParams, null, 2)}`,\n );\n const result = await agent.callActionInActionSpace(\n matchedAction.name,\n flowParams,\n );\n\n // Store result if there's a name property in flowItem\n const resultName = (flowItem as any).name;\n if (result !== undefined) {\n this.setResult(resultName, result);\n }\n }\n }\n }\n this.reportFile = agent.reportFile;\n await this.flushUnstableLogContent();\n }\n\n async run() {\n const { target, web, android, ios, computer, tasks } = this.script;\n const webEnv = web || target;\n const androidEnv = android;\n const iosEnv = ios;\n const computerEnv = computer;\n const platform = webEnv || androidEnv || iosEnv || computerEnv;\n\n this.setPlayerStatus('running');\n\n let agent: Agent | null = null;\n let freeFn: FreeFn[] = [];\n try {\n const { agent: newAgent, freeFn: newFreeFn } = await this.setupAgent(\n platform as T,\n );\n this.actionSpace = await newAgent.getActionSpace();\n agent = newAgent;\n const originalOnTaskStartTip = agent.onTaskStartTip;\n agent.onTaskStartTip = (tip) => {\n if (this.status === 'running') {\n this.agentStatusTip = tip;\n }\n originalOnTaskStartTip?.(tip);\n };\n freeFn = [\n ...(newFreeFn || []),\n {\n name: 'restore-agent-onTaskStartTip',\n fn: () => {\n if (agent) {\n agent.onTaskStartTip = originalOnTaskStartTip;\n }\n },\n },\n ];\n } catch (e) {\n this.setPlayerStatus('error', e as Error);\n return;\n }\n this.interfaceAgent = agent;\n\n let taskIndex = 0;\n this.setPlayerStatus('running');\n let errorFlag = false;\n while (taskIndex < tasks.length) {\n const taskStatus = this.taskStatusList[taskIndex];\n this.setTaskStatus(taskIndex, 'running' as any);\n this.setTaskIndex(taskIndex);\n\n try {\n await this.playTask(taskStatus, this.interfaceAgent);\n this.setTaskStatus(taskIndex, 'done' as any);\n } catch (e) {\n this.setTaskStatus(taskIndex, 'error' as any, e as Error);\n\n if (taskStatus.continueOnError) {\n // nothing more to do\n } else {\n this.reportFile = agent.reportFile;\n errorFlag = true;\n break;\n }\n }\n this.reportFile = agent?.reportFile;\n taskIndex++;\n }\n\n if (errorFlag) {\n this.setPlayerStatus('error');\n } else {\n this.setPlayerStatus('done');\n }\n this.agentStatusTip = '';\n\n // free the resources\n for (const fn of freeFn) {\n try {\n // console.log('freeing', fn.name);\n await fn.fn();\n // console.log('freed', fn.name);\n } catch (e) {\n // console.error('error freeing', fn.name, e);\n }\n }\n }\n}\n","import type { DeviceAction } from '@midscene/core';\nimport { findAllMidsceneLocatorField } from '@midscene/core/ai-model';\nimport { buildDetailedLocateParam } from '@midscene/core/yaml';\nimport type {\n ExecutionOptions,\n FormValue,\n PlaygroundAgent,\n ValidationResult,\n} from './types';\n\n// APIs that should not generate replay scripts\nexport const dataExtractionAPIs = [\n 'aiQuery',\n 'aiBoolean',\n 'aiNumber',\n 'aiString',\n 'aiAsk',\n];\n\nexport const validationAPIs = ['aiAssert', 'aiWaitFor'];\n\nexport const noReplayAPIs = [...dataExtractionAPIs, ...validationAPIs];\n\nexport const formatErrorMessage = (e: any): string => {\n const errorMessage = e?.message || '';\n\n if (errorMessage.includes('of different extension')) {\n return 'Conflicting extension detected. Please disable the suspicious plugins and refresh the page. Guide: https://midscenejs.com/quick-experience.html#faq';\n }\n\n if (errorMessage.includes('NOT_IMPLEMENTED_AS_DESIGNED')) {\n return 'Further actions cannot be performed in the current environment';\n }\n\n return errorMessage || 'Unknown error';\n};\n\n// Parse structured parameters for callActionInActionSpace\nexport async function parseStructuredParams(\n action: DeviceAction<unknown>,\n params: Record<string, unknown>,\n options: ExecutionOptions = {},\n): Promise<unknown[]> {\n if (!action?.paramSchema || !('shape' in action.paramSchema)) {\n return [params.prompt || '', options];\n }\n\n const schema = action.paramSchema;\n const keys =\n schema && 'shape' in schema\n ? Object.keys((schema as { shape: Record<string, unknown> }).shape)\n : [];\n\n // Start with options and merge deviceOptions into the same level\n // Destructure to exclude deviceOptions from the final object\n const { deviceOptions: _, ...optionsWithoutDeviceOptions } = options;\n const paramObj: Record<string, unknown> = {\n ...optionsWithoutDeviceOptions,\n ...(options.deviceOptions || {}),\n };\n\n keys.forEach((key) => {\n if (\n params[key] !== undefined &&\n params[key] !== null &&\n params[key] !== ''\n ) {\n paramObj[key] = params[key];\n }\n });\n\n // Check if there's a locate field that needs detailed locate param processing\n if (schema) {\n const locatorFieldKeys = findAllMidsceneLocatorField(schema);\n locatorFieldKeys.forEach((locateKey: string) => {\n const locatePrompt = params[locateKey];\n if (locatePrompt && typeof locatePrompt === 'string') {\n // Build detailed locate param using the locate prompt and options\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, {\n deepLocate: options.deepLocate,\n cacheable: true, // Default to true for playground\n });\n if (detailedLocateParam) {\n paramObj[locateKey] = detailedLocateParam;\n }\n }\n });\n }\n\n return [paramObj];\n}\n\nexport function validateStructuredParams(\n value: FormValue,\n action: DeviceAction<unknown> | undefined,\n): ValidationResult {\n if (!value.params) {\n return { valid: false, errorMessage: 'Parameters are required' };\n }\n\n if (!action?.paramSchema) {\n return { valid: true };\n }\n\n try {\n const paramsForValidation = { ...value.params };\n\n const schema = action.paramSchema;\n if (schema) {\n const locatorFieldKeys = findAllMidsceneLocatorField(schema);\n locatorFieldKeys.forEach((key: string) => {\n if (typeof paramsForValidation[key] === 'string') {\n paramsForValidation[key] = {\n midscene_location_field_flag: true,\n prompt: paramsForValidation[key],\n center: [0, 0],\n rect: { left: 0, top: 0, width: 0, height: 0 },\n };\n }\n });\n }\n\n action.paramSchema?.parse(paramsForValidation);\n return { valid: true };\n } catch (error: unknown) {\n const zodError = error as {\n errors?: Array<{ path: string[]; message: string }>;\n };\n if (zodError.errors && zodError.errors.length > 0) {\n const errorMessages = zodError.errors\n .filter((err) => {\n const path = err.path.join('.');\n return (\n !path.includes('center') &&\n !path.includes('rect') &&\n !path.includes('midscene_location_field_flag')\n );\n })\n .map((err) => {\n const field = err.path.join('.');\n return `${field}: ${err.message}`;\n });\n\n if (errorMessages.length > 0) {\n return {\n valid: false,\n errorMessage: `Validation error: ${errorMessages.join(', ')}`,\n };\n }\n } else {\n const errorMsg =\n error instanceof Error ? error.message : 'Unknown validation error';\n return {\n valid: false,\n errorMessage: `Parameter validation failed: ${errorMsg}`,\n };\n }\n }\n\n return { valid: true };\n}\n\nexport async function executeAction(\n activeAgent: PlaygroundAgent,\n actionType: string,\n actionSpace: DeviceAction<unknown>[],\n value: FormValue,\n options: ExecutionOptions,\n): Promise<unknown> {\n if (actionType !== 'aiAct' && options.deepThink !== undefined) {\n console.warn(\n '[Playground] Received deepThink in non-aiAct action options. deepThink is expected to be used with aiAct during migration.',\n {\n actionType,\n requestId: options.requestId,\n options,\n },\n );\n }\n\n const action = actionSpace?.find(\n (a: DeviceAction<unknown>) =>\n a.interfaceAlias === actionType || a.name === actionType,\n );\n\n if (action && typeof activeAgent.callActionInActionSpace === 'function') {\n if (value.params) {\n const parsedParams = await parseStructuredParams(\n action,\n value.params,\n options,\n );\n return await activeAgent.callActionInActionSpace(\n action.name,\n parsedParams[0],\n );\n } else {\n // For prompt-based actions, we need to build the detailed locate param\n const detailedLocateParam = value.prompt\n ? buildDetailedLocateParam(value.prompt, {\n deepLocate: options.deepLocate,\n cacheable: true,\n })\n : undefined;\n\n // Flatten deviceOptions into the params\n // Destructure to exclude deviceOptions from the final object\n const { deviceOptions: _, ...optionsWithoutDeviceOptions } = options;\n const actionParams = {\n locate: detailedLocateParam,\n ...optionsWithoutDeviceOptions,\n ...(options.deviceOptions || {}),\n };\n\n return await activeAgent.callActionInActionSpace(\n action.name,\n actionParams,\n );\n }\n } else {\n const prompt = value.prompt;\n\n if (actionType === 'aiAssert') {\n const { pass, thought } =\n (await activeAgent?.aiAssert?.(prompt || '', undefined, {\n keepRawResponse: true,\n ...options,\n })) || {};\n return { pass: pass || false, thought: thought || '' };\n }\n\n // Fallback for methods not found in actionSpace\n if (activeAgent && typeof activeAgent[actionType] === 'function') {\n return await activeAgent[actionType](prompt, options);\n }\n\n throw new Error(`Unknown action type: ${actionType}`);\n }\n}\n","import { getPreferredLanguage } from '@midscene/shared/env';\n\nconst examplesMap: Record<string, string[]> = {\n Chinese: [\n '\"登录表单中的\"登录\"按钮\"',\n '\"搜索输入框,placeholder 为\"请输入关键词\"\"',\n '\"顶部导航栏中文字为\"首页\"的链接\"',\n '\"联系表单中的提交按钮\"',\n '\"aria-label 为\"打开菜单\"的菜单图标\"',\n ],\n English: [\n '\"Login button with text \\'Sign In\\'\"',\n '\"Search input with placeholder \\'Enter keywords\\'\"',\n '\"Navigation link with text \\'Home\\' in header\"',\n '\"Submit button in contact form\"',\n '\"Menu icon with aria-label \\'Open menu\\'\"',\n ],\n};\n\nconst getExamples = (language: string) => {\n const examples = examplesMap[language] || examplesMap.English;\n return examples.map((e) => `- ${e}`).join('\\n');\n};\n\nexport const elementDescriberInstruction = () => {\n const preferredLanguage = getPreferredLanguage();\n\n return `\nDescribe the element in the red rectangle for precise identification.\n\nIMPORTANT: You MUST write the description in ${preferredLanguage}.\n\nCRITICAL REQUIREMENTS:\n1. UNIQUENESS: The description must uniquely identify this element on the current page\n2. UNIVERSALITY: Use generic, reusable selectors that work across different contexts\n3. PRECISION: Be specific enough to distinguish from similar elements\n\nDESCRIPTION STRUCTURE:\n1. Element type (button, input, link, div, etc.)\n2. Primary identifier (in order of preference):\n - Unique text content: \"with text 'Login'\"\n - Unique attribute: \"with aria-label 'Search'\"\n - Unique class/ID: \"with class 'primary-button'\"\n - Unique position: \"in header navigation\"\n3. Secondary identifiers (if needed for uniqueness):\n - Visual features: \"blue background\", \"with icon\"\n - Relative position: \"below search bar\", \"in sidebar\"\n - Parent context: \"in login form\", \"in main menu\"\n\nGUIDELINES:\n- Keep description under 25 words\n- Prioritize semantic identifiers over visual ones\n- Use consistent terminology across similar elements\n- Avoid page-specific or temporary content\n- Don't mention the red rectangle or selection box\n- Focus on stable, reusable characteristics\n- **Write the description in ${preferredLanguage}**\n\nEXAMPLES:\n${getExamples(preferredLanguage)}\n\nReturn JSON:\n{\n \"description\": \"unique element identifier\",\n \"error\"?: \"error message if any\"\n}`;\n};\n","import { readFileSync } from 'node:fs';\nimport { uuid } from '@midscene/shared/utils';\nimport { extractImageByIdSync } from './dump/html-utils';\n\n/**\n * Serialization format for ScreenshotItem\n * - { $screenshot: \"id\" } - inline mode, references imageMap in HTML\n * - { base64: \"path\" } - directory mode, references external file path\n */\nexport type ScreenshotSerializeFormat =\n | { $screenshot: string; capturedAt: number }\n | { base64: string; capturedAt: number };\n\n/**\n * Detect image format from base64 data URI prefix.\n */\nfunction detectFormat(base64: string): 'png' | 'jpeg' {\n if (base64.startsWith('data:image/jpeg')) return 'jpeg';\n if (base64.startsWith('data:image/jpg')) return 'jpeg';\n return 'png';\n}\n\n/**\n * ScreenshotItem encapsulates screenshot data.\n *\n * Supports lazy loading after memory release:\n * - inline mode: reads from HTML file using streaming (extractImageByIdSync)\n * - directory mode: reads from file on disk\n *\n * After persistence, memory is released but the screenshot can be recovered\n * on-demand from disk, making it safe to release memory at any time.\n */\nexport class ScreenshotItem {\n private _id: string;\n private _base64: string | null;\n private _format: 'png' | 'jpeg';\n private _capturedAt: number;\n private _persistedAs: ScreenshotSerializeFormat | null = null;\n private _persistedPath: string | null = null;\n private _persistedHtmlPath: string | null = null;\n\n private constructor(id: string, base64: string, capturedAt: number) {\n this._id = id;\n this._base64 = base64;\n this._format = detectFormat(base64);\n this._capturedAt = capturedAt;\n }\n\n /** Create a new ScreenshotItem from base64 data */\n static create(base64: string, capturedAt: number): ScreenshotItem {\n return new ScreenshotItem(uuid(), base64, capturedAt);\n }\n\n get id(): string {\n return this._id;\n }\n\n /** Get the image format (png or jpeg) */\n get format(): 'png' | 'jpeg' {\n return this._format;\n }\n\n /** Get the file extension for this screenshot */\n get extension(): string {\n return this._format === 'jpeg' ? 'jpeg' : 'png';\n }\n\n /** Get screenshot capture timestamp in milliseconds */\n get capturedAt(): number {\n return this._capturedAt;\n }\n\n get base64(): string {\n // If data is in memory, return it directly\n if (this._base64 !== null) {\n return this._base64;\n }\n\n // Directory mode: recover from file\n if (this._persistedPath !== null) {\n const buffer = readFileSync(this._persistedPath);\n return `data:image/${this._format};base64,${buffer.toString('base64')}`;\n }\n\n // Inline mode: recover from HTML file using streaming\n if (this._persistedHtmlPath !== null) {\n const data = extractImageByIdSync(this._persistedHtmlPath, this._id);\n if (data) {\n return data;\n }\n throw new Error(\n `Screenshot ${this._id}: cannot recover from HTML (id not found in ${this._persistedHtmlPath})`,\n );\n }\n\n throw new Error(\n `Screenshot ${this._id}: base64 data released without recovery path`,\n );\n }\n\n /** Check if base64 data is still available in memory (not yet released) */\n hasBase64(): boolean {\n return this._base64 !== null;\n }\n\n /**\n * Mark as persisted to HTML (inline mode).\n * Releases base64 memory, but keeps HTML path for lazy loading recovery.\n * @param htmlPath - absolute path to the HTML file containing the image\n */\n markPersistedInline(htmlPath: string): void {\n this._persistedAs = {\n $screenshot: this._id,\n capturedAt: this._capturedAt,\n };\n this._persistedHtmlPath = htmlPath;\n this._base64 = null;\n }\n\n /**\n * Mark as persisted to file (directory mode).\n * Releases base64 memory, but keeps file path for lazy loading recovery.\n * @param relativePath - relative path for serialization (e.g., \"./screenshots/id.jpeg\")\n * @param absolutePath - absolute path for lazy loading recovery\n */\n markPersistedToPath(relativePath: string, absolutePath: string): void {\n this._persistedAs = {\n base64: relativePath,\n capturedAt: this._capturedAt,\n };\n this._persistedPath = absolutePath;\n this._base64 = null;\n }\n\n /** Serialize for JSON - format depends on persistence state */\n toSerializable(): ScreenshotSerializeFormat {\n return (\n this._persistedAs ?? {\n $screenshot: this._id,\n capturedAt: this._capturedAt,\n }\n );\n }\n\n /** Check if a value is a serialized ScreenshotItem reference (inline or directory mode) */\n static isSerialized(value: unknown): value is ScreenshotSerializeFormat {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Record<string, unknown>;\n // Check for inline mode: { $screenshot: string }\n if ('$screenshot' in record && typeof record.$screenshot === 'string') {\n if (!('capturedAt' in record) || typeof record.capturedAt !== 'number') {\n return false;\n }\n return true;\n }\n // Check for directory mode: { base64: string } where base64 is a path\n if ('base64' in record && typeof record.base64 === 'string') {\n if (!('capturedAt' in record) || typeof record.capturedAt !== 'number') {\n return false;\n }\n return true;\n }\n return false;\n }\n\n /**\n * Get base64 data without the data URI prefix.\n * Useful for writing raw binary data to files.\n */\n get rawBase64(): string {\n return this.base64.replace(/^data:image\\/(png|jpeg|jpg);base64,/, '');\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport type { NodeType } from '@midscene/shared/constants';\nimport type { CreateOpenAIClientFn, TModelConfig } from '@midscene/shared/env';\nimport type {\n BaseElement,\n LocateResultElement,\n Rect,\n Size,\n} from '@midscene/shared/types';\nimport type { z } from 'zod';\nimport type { TUserPrompt } from './common';\nimport { restoreImageReferences } from './dump/image-restoration';\nimport { ScreenshotItem } from './screenshot-item';\nimport type {\n DetailedLocateParam,\n MidsceneYamlFlowItem,\n ServiceExtractOption,\n} from './yaml';\n\nexport type {\n ElementTreeNode,\n BaseElement,\n Rect,\n Size,\n Point,\n} from '@midscene/shared/types';\nexport * from './yaml';\n\nexport type AIUsageInfo = Record<string, any> & {\n prompt_tokens: number | undefined;\n completion_tokens: number | undefined;\n total_tokens: number | undefined;\n cached_input: number | undefined;\n time_cost: number | undefined;\n model_name: string | undefined;\n model_description: string | undefined;\n intent: string | undefined;\n request_id: string | undefined;\n};\n\nexport type { LocateResultElement };\n\nexport type AISingleElementResponseByPosition = {\n position?: {\n x: number;\n y: number;\n };\n bbox?: [number, number, number, number];\n reason: string;\n text: string;\n};\n\nexport interface AIElementCoordinatesResponse {\n bbox: [number, number, number, number];\n errors?: string[];\n}\n\nexport type AIElementResponse = AIElementCoordinatesResponse;\n\nexport interface AIDataExtractionResponse<DataDemand> {\n data: DataDemand;\n errors?: string[];\n thought?: string;\n}\n\nexport interface AISectionLocatorResponse {\n bbox: [number, number, number, number];\n references_bbox?: [number, number, number, number][];\n error?: string;\n}\n\nexport interface AIAssertionResponse {\n pass: boolean;\n thought: string;\n}\n\nexport interface AIDescribeElementResponse {\n description: string;\n error?: string;\n}\n\nexport interface LocatorValidatorOption {\n centerDistanceThreshold?: number;\n}\n\nexport interface LocateValidatorResult {\n pass: boolean;\n rect: Rect;\n center: [number, number];\n centerDistance?: number;\n}\n\nexport interface AgentDescribeElementAtPointResult {\n prompt: string;\n deepLocate: boolean;\n verifyResult?: LocateValidatorResult;\n}\n\n/**\n * context\n */\n\nexport abstract class UIContext {\n /**\n * screenshot of the current UI state. which size is shotSize(be shrunk by screenshotShrinkFactor),\n */\n abstract screenshot: ScreenshotItem;\n\n /**\n * screenshot size after shrinking\n */\n abstract shotSize: Size;\n\n /**\n * The ratio for converting shrunk screenshot coordinates to logical coordinates.\n *\n * Example:\n * - Physical screen width: 3000px, dpr=6\n * - Logical width: 500px\n * - User-defined screenshotShrinkFactor: 2\n * - Actual shrunk screenshot width: 3000 / 2 = 1500px\n * - shrunkShotToLogicalRatio: dpr / screenshotShrinkFactor = 6 / 2 = 3\n * - To map back to logical coordinates: 1500 / shrunkShotToLogicalRatio = 500px\n */\n abstract shrunkShotToLogicalRatio: number;\n\n abstract _isFrozen?: boolean;\n\n // @deprecated - backward compatibility for aiLocate\n abstract deprecatedDpr?: number;\n}\n\nexport type EnsureObject<T> = { [K in keyof T]: any };\n\nexport type ServiceAction = 'locate' | 'extract' | 'assert' | 'describe';\n\nexport type ServiceExtractParam = string | Record<string, string>;\n\nexport type ElementCacheFeature = Record<string, unknown>;\n\nexport interface LocateResult {\n element: LocateResultElement | null;\n rect?: Rect;\n}\n\nexport type ThinkingLevel = 'off' | 'medium' | 'high';\n\nexport type DeepThinkOption = 'unset' | true | false;\n\nexport interface ServiceTaskInfo {\n durationMs: number;\n formatResponse?: string;\n rawResponse?: string;\n usage?: AIUsageInfo;\n searchArea?: Rect;\n searchAreaRawResponse?: string;\n searchAreaUsage?: AIUsageInfo;\n reasoning_content?: string;\n}\n\nexport interface DumpMeta {\n logTime: number;\n}\n\nexport interface ReportDumpWithAttributes {\n dumpString: string;\n attributes?: Record<string, any>;\n}\n\nexport interface ServiceDump extends DumpMeta {\n type: 'locate' | 'extract' | 'assert';\n logId: string;\n userQuery: {\n element?: TUserPrompt;\n dataDemand?: ServiceExtractParam;\n assertion?: TUserPrompt;\n };\n matchedElement: LocateResultElement[];\n matchedRect?: Rect;\n deepLocate?: boolean;\n data: any;\n assertionPass?: boolean;\n assertionThought?: string;\n taskInfo: ServiceTaskInfo;\n error?: string;\n output?: any;\n}\n\nexport type PartialServiceDumpFromSDK = Omit<\n ServiceDump,\n 'logTime' | 'logId' | 'model_name'\n>;\n\nexport interface ServiceResultBase {\n dump: ServiceDump;\n}\n\nexport type LocateResultWithDump = LocateResult & ServiceResultBase;\n\nexport interface ServiceExtractResult<T> extends ServiceResultBase {\n data: T;\n thought?: string;\n usage?: AIUsageInfo;\n reasoning_content?: string;\n}\n\nexport class ServiceError extends Error {\n dump: ServiceDump;\n\n constructor(message: string, dump: ServiceDump) {\n super(message);\n this.name = 'ServiceError';\n this.dump = dump;\n }\n}\n\n// intermediate variables to optimize the return value by AI\nexport interface LiteUISection {\n name: string;\n description: string;\n sectionCharacteristics: string;\n textIds: string[];\n}\n\nexport type ElementById = (id: string) => BaseElement | null;\n\nexport type ServiceAssertionResponse = AIAssertionResponse & {\n usage?: AIUsageInfo;\n};\n\n/**\n * agent\n */\n\nexport type OnTaskStartTip = (tip: string) => Promise<void> | void;\n\nexport interface AgentWaitForOpt extends ServiceExtractOption {\n checkIntervalMs?: number;\n timeoutMs?: number;\n}\n\nexport interface AgentAssertOpt {\n keepRawResponse?: boolean;\n}\n\n/**\n * planning\n *\n */\n\nexport interface PlanningLocateParam extends DetailedLocateParam {\n bbox?: [number, number, number, number];\n}\n\nexport interface PlanningAction<ParamType = any> {\n thought?: string;\n log?: string; // a brief preamble to the user explaining what you’re about to do\n type: string;\n param: ParamType;\n}\n\nexport type SubGoalStatus = 'pending' | 'running' | 'finished';\n\nexport interface SubGoal {\n index: number;\n status: SubGoalStatus;\n description: string;\n logs?: string[];\n}\n\nexport interface RawResponsePlanningAIResponse {\n action: PlanningAction;\n thought?: string;\n log: string;\n memory?: string;\n error?: string;\n finalizeMessage?: string;\n finalizeSuccess?: boolean;\n updateSubGoals?: SubGoal[];\n markFinishedIndexes?: number[];\n}\n\nexport interface PlanningAIResponse\n extends Omit<RawResponsePlanningAIResponse, 'action'> {\n actions?: PlanningAction[];\n usage?: AIUsageInfo;\n rawResponse?: string;\n yamlFlow?: MidsceneYamlFlowItem[];\n yamlString?: string;\n error?: string;\n reasoning_content?: string;\n shouldContinuePlanning: boolean;\n output?: string; // Output message from <complete> tag (same as finalizeMessage)\n}\n\nexport interface PlanningActionParamSleep {\n timeMs: number;\n}\n\nexport interface PlanningActionParamError {\n thought: string;\n}\n\nexport type PlanningActionParamWaitFor = AgentWaitForOpt & {};\n\nexport interface LongPressParam {\n duration?: number;\n}\n\nexport interface PullParam {\n direction: 'up' | 'down';\n distance?: number;\n duration?: number;\n}\n/**\n * misc\n */\n\nexport interface Color {\n name: string;\n hex: string;\n}\n\nexport interface BaseAgentParserOpt {\n selector?: string;\n}\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface PuppeteerParserOpt extends BaseAgentParserOpt {}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface PlaywrightParserOpt extends BaseAgentParserOpt {}\n\n/*\naction\n*/\nexport interface ExecutionTaskProgressOptions {\n onTaskStart?: (task: ExecutionTask) => Promise<void> | void;\n}\n\nexport interface ExecutionRecorderItem {\n type: 'screenshot';\n ts: number;\n screenshot?: ScreenshotItem;\n timing?: string;\n}\n\nexport type ExecutionTaskType = 'Planning' | 'Insight' | 'Action Space' | 'Log';\n\nexport interface ExecutorContext {\n task: ExecutionTask;\n element?: LocateResultElement | null;\n uiContext?: UIContext;\n}\n\nexport interface ExecutionTaskApply<\n Type extends ExecutionTaskType = any,\n TaskParam = any,\n TaskOutput = any,\n TaskLog = any,\n> {\n type: Type;\n subType?: string;\n param?: TaskParam;\n thought?: string;\n uiContext?: UIContext;\n executor: (\n param: TaskParam,\n context: ExecutorContext,\n ) => // biome-ignore lint/suspicious/noConfusingVoidType: void is intentionally allowed as some executors may not return a value\n | Promise<ExecutionTaskReturn<TaskOutput, TaskLog> | undefined | void>\n | undefined\n | void;\n}\n\nexport interface ExecutionTaskHitBy {\n from: string;\n context: Record<string, any>;\n}\n\nexport interface ExecutionTaskReturn<TaskOutput = unknown, TaskLog = unknown> {\n output?: TaskOutput;\n log?: TaskLog;\n recorder?: ExecutionRecorderItem[];\n hitBy?: ExecutionTaskHitBy;\n}\n\nexport type ExecutionTask<\n E extends ExecutionTaskApply<any, any, any> = ExecutionTaskApply<\n any,\n any,\n any\n >,\n> = E &\n ExecutionTaskReturn<\n E extends ExecutionTaskApply<any, any, infer TaskOutput, any>\n ? TaskOutput\n : unknown,\n E extends ExecutionTaskApply<any, any, any, infer TaskLog>\n ? TaskLog\n : unknown\n > & {\n taskId: string;\n status: 'pending' | 'running' | 'finished' | 'failed' | 'cancelled';\n error?: Error;\n errorMessage?: string;\n errorStack?: string;\n timing?: {\n start: number;\n getUiContextStart?: number;\n getUiContextEnd?: number;\n callAiStart?: number;\n callAiEnd?: number;\n beforeInvokeActionHookStart?: number;\n beforeInvokeActionHookEnd?: number;\n callActionStart?: number;\n callActionEnd?: number;\n afterInvokeActionHookStart?: number;\n afterInvokeActionHookEnd?: number;\n captureAfterCallingSnapshotStart?: number;\n captureAfterCallingSnapshotEnd?: number;\n end?: number;\n cost?: number;\n };\n usage?: AIUsageInfo;\n searchAreaUsage?: AIUsageInfo;\n reasoning_content?: string;\n };\n\nexport interface IExecutionDump extends DumpMeta {\n /** Stable unique identifier for this execution run */\n id?: string;\n name: string;\n description?: string;\n tasks: ExecutionTask[];\n aiActContext?: string;\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 if (value && value.constructor?.name === 'Page') {\n return '[Page object]';\n }\n if (value && value.constructor?.name === 'Browser') {\n return '[Browser object]';\n }\n // Handle ScreenshotItem serialization\n if (value && typeof value.toSerializable === 'function') {\n return value.toSerializable();\n }\n return value;\n}\n\n/**\n * Reviver function for JSON deserialization that handles ScreenshotItem formats.\n *\n * BEHAVIOR:\n * - For { $screenshot: \"id\" } format: Left as-is (plain object)\n * Consumer must use imageMap to restore base64 data\n * - For { base64: \"...\" } format: Creates ScreenshotItem from base64 data\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 // Handle serialized format: { $screenshot: \"id\" }\n // Leave as plain object — consumer uses imageMap to restore\n if (ScreenshotItem.isSerialized(value)) {\n return value;\n }\n\n // Handle inline base64 format: { base64: \"...\" }\n if ('base64' in value && typeof value.base64 === 'string') {\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\n constructor(data: IExecutionDump) {\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 }\n\n /**\n * Serialize the ExecutionDump to a JSON string\n */\n serialize(indents?: number): string {\n return JSON.stringify(this.toJSON(), replacerForDumpSerialization, 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/*\ntask - service-locate\n*/\nexport type ExecutionTaskInsightLocateParam = PlanningLocateParam;\n\nexport interface ExecutionTaskInsightLocateOutput {\n element: LocateResultElement | null;\n}\n\nexport type ExecutionTaskInsightDump = ServiceDump;\n\nexport type ExecutionTaskInsightLocateApply = ExecutionTaskApply<\n 'Insight',\n ExecutionTaskInsightLocateParam,\n ExecutionTaskInsightLocateOutput,\n ExecutionTaskInsightDump\n>;\n\nexport type ExecutionTaskInsightLocate =\n ExecutionTask<ExecutionTaskInsightLocateApply>;\n\n/*\ntask - service-query\n*/\nexport interface ExecutionTaskInsightQueryParam {\n dataDemand: ServiceExtractParam;\n}\n\nexport interface ExecutionTaskInsightQueryOutput {\n data: any;\n}\n\nexport type ExecutionTaskInsightQueryApply = ExecutionTaskApply<\n 'Insight',\n ExecutionTaskInsightQueryParam,\n any,\n ExecutionTaskInsightDump\n>;\n\nexport type ExecutionTaskInsightQuery =\n ExecutionTask<ExecutionTaskInsightQueryApply>;\n\n/*\ntask - assertion\n*/\nexport interface ExecutionTaskInsightAssertionParam {\n assertion: string;\n}\n\nexport type ExecutionTaskInsightAssertionApply = ExecutionTaskApply<\n 'Insight',\n ExecutionTaskInsightAssertionParam,\n ServiceAssertionResponse,\n ExecutionTaskInsightDump\n>;\n\nexport type ExecutionTaskInsightAssertion =\n ExecutionTask<ExecutionTaskInsightAssertionApply>;\n\n/*\ntask - action (i.e. interact) \n*/\nexport type ExecutionTaskActionApply<ActionParam = any> = ExecutionTaskApply<\n 'Action Space',\n ActionParam,\n void,\n void\n>;\n\nexport type ExecutionTaskAction = ExecutionTask<ExecutionTaskActionApply>;\n\n/*\ntask - Log\n*/\n\nexport type ExecutionTaskLogApply<\n LogParam = {\n content: string;\n },\n> = ExecutionTaskApply<'Log', LogParam, void, void>;\n\nexport type ExecutionTaskLog = ExecutionTask<ExecutionTaskLogApply>;\n\n/*\ntask - planning\n*/\n\nexport type ExecutionTaskPlanningApply = ExecutionTaskApply<\n 'Planning',\n {\n userInstruction: string;\n aiActContext?: string;\n },\n PlanningAIResponse\n>;\n\nexport type ExecutionTaskPlanning = ExecutionTask<ExecutionTaskPlanningApply>;\n\n/*\ntask - planning-locate\n*/\nexport type ExecutionTaskPlanningLocateParam = PlanningLocateParam;\n\nexport interface ExecutionTaskPlanningLocateOutput {\n element: LocateResultElement | null;\n}\n\nexport type ExecutionTaskPlanningDump = ServiceDump;\n\nexport type ExecutionTaskPlanningLocateApply = ExecutionTaskApply<\n 'Planning',\n ExecutionTaskPlanningLocateParam,\n ExecutionTaskPlanningLocateOutput,\n ExecutionTaskPlanningDump\n>;\n\nexport type ExecutionTaskPlanningLocate =\n ExecutionTask<ExecutionTaskPlanningLocateApply>;\n\n/*\nGroup metadata - extracted from GroupedActionDump for per-execution writes\n*/\nexport interface GroupMeta {\n groupName: string;\n groupDescription?: string;\n sdkVersion: string;\n modelBriefs: ModelBrief[];\n deviceType?: string;\n}\n\n/*\nGrouped dump\n*/\nexport interface IGroupedActionDump {\n sdkVersion: string;\n groupName: string;\n groupDescription?: string;\n modelBriefs: ModelBrief[];\n executions: IExecutionDump[];\n deviceType?: string;\n}\n\nexport interface ModelBrief {\n /**\n * The intent/category of the model call, for example \"planning\" or \"insight\".\n */\n intent?: string;\n\n /**\n * The model name returned by usage metadata, for example \"gpt-4o\".\n */\n name?: string;\n\n /**\n * Optional human-readable model description, for example \"qwen2.5-vl mode\".\n */\n modelDescription?: string;\n}\n\n/**\n * GroupedActionDump class for serializing and deserializing grouped action dumps\n */\nexport class GroupedActionDump implements IGroupedActionDump {\n sdkVersion: string;\n groupName: string;\n groupDescription?: string;\n modelBriefs: ModelBrief[];\n executions: ExecutionDump[];\n deviceType?: string;\n\n constructor(data: IGroupedActionDump) {\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 GroupedActionDump to a JSON string\n * Uses compact { $screenshot: id } format\n */\n serialize(indents?: number): string {\n return JSON.stringify(this.toJSON(), replacerForDumpSerialization, indents);\n }\n\n /**\n * Serialize the GroupedActionDump 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).map(([key, value]) => [\n key,\n processValue(value),\n ]);\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(): IGroupedActionDump {\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 GroupedActionDump instance from a serialized JSON string\n */\n static fromSerializedString(serialized: string): GroupedActionDump {\n const parsed = JSON.parse(\n serialized,\n reviverForDumpDeserialization,\n ) as IGroupedActionDump;\n return new GroupedActionDump(parsed);\n }\n\n /**\n * Create a GroupedActionDump instance from a plain object\n */\n static fromJSON(data: IGroupedActionDump): GroupedActionDump {\n return new GroupedActionDump(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 * - {basePath}.screenshots.json - ID to path mapping\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 // Write screenshots to separate files\n const screenshotMap: Record<string, string> = {};\n const screenshots = this.collectAllScreenshots();\n\n for (const screenshot of screenshots) {\n if (screenshot.hasBase64()) {\n const imagePath = join(\n screenshotsDir,\n `${screenshot.id}.${screenshot.extension}`,\n );\n const rawBase64 = screenshot.rawBase64;\n writeFileSync(imagePath, Buffer.from(rawBase64, 'base64'));\n screenshotMap[screenshot.id] = imagePath;\n }\n }\n\n // Write screenshot map file\n writeFileSync(\n `${basePath}.screenshots.json`,\n JSON.stringify(screenshotMap),\n 'utf-8',\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 screenshotsMapPath = `${basePath}.screenshots.json`;\n\n if (!existsSync(screenshotsMapPath)) {\n return dumpString;\n }\n\n // Read screenshot map and build imageMap from files\n const screenshotMap: Record<string, string> = JSON.parse(\n readFileSync(screenshotsMapPath, 'utf-8'),\n );\n\n const imageMap: Record<string, string> = {};\n for (const [id, filePath] of Object.entries(screenshotMap)) {\n if (existsSync(filePath)) {\n const data = readFileSync(filePath);\n const mime =\n filePath.endsWith('.jpeg') || filePath.endsWith('.jpg')\n ? 'jpeg'\n : 'png';\n imageMap[id] = `data:image/${mime};base64,${data.toString('base64')}`;\n }\n }\n\n // Restore image references\n const dumpData = JSON.parse(dumpString);\n const processedData = restoreImageReferences(\n dumpData,\n (id) => imageMap[id] ?? '',\n );\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 = [\n basePath,\n `${basePath}.screenshots.json`,\n `${basePath}.screenshots`,\n ];\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 [\n basePath,\n `${basePath}.screenshots.json`,\n `${basePath}.screenshots`,\n ];\n }\n}\n\nexport type InterfaceType =\n | 'puppeteer'\n | 'playwright'\n | 'static'\n | 'chrome-extension-proxy'\n | 'android'\n | string;\n\nexport interface StreamingCodeGenerationOptions {\n /** Whether to enable streaming output */\n stream?: boolean;\n /** Callback function to handle streaming chunks */\n onChunk?: StreamingCallback;\n /** Callback function to handle streaming completion */\n onComplete?: (finalCode: string) => void;\n /** Callback function to handle streaming errors */\n onError?: (error: Error) => void;\n}\n\nexport type StreamingCallback = (chunk: CodeGenerationChunk) => void;\n\nexport interface CodeGenerationChunk {\n /** The incremental content chunk */\n content: string;\n /** The reasoning content */\n reasoning_content: string;\n /** The accumulated content so far */\n accumulated: string;\n /** Whether this is the final chunk */\n isComplete: boolean;\n /** Token usage information if available */\n usage?: AIUsageInfo;\n}\n\nexport interface StreamingAIResponse {\n /** The final accumulated content */\n content: string;\n /** Token usage information */\n usage?: AIUsageInfo;\n /** Whether the response was streamed */\n isStreamed: boolean;\n}\n\nexport interface DeviceAction<TParam = any, TReturn = any> {\n name: string;\n description?: string;\n interfaceAlias?: string;\n paramSchema?: z.ZodType<TParam>;\n call: (param: TParam, context: ExecutorContext) => Promise<TReturn> | TReturn;\n delayAfterRunner?: number;\n /**\n * An example param object for this action.\n * Locate fields with { prompt } will automatically get bbox injected when needed.\n */\n sample?: { [K in keyof TParam]?: any };\n}\n\n/**\n * Type utilities for extracting types from DeviceAction definitions\n */\n\n/**\n * Extract parameter type from a DeviceAction\n */\nexport type ActionParam<Action extends DeviceAction<any, any>> =\n Action extends DeviceAction<infer P, any> ? P : never;\n\n/**\n * Extract return type from a DeviceAction\n */\nexport type ActionReturn<Action extends DeviceAction<any, any>> =\n Action extends DeviceAction<any, infer R> ? R : never;\n\n/**\n * Web-specific types\n */\nexport interface WebElementInfo extends BaseElement {\n id: string;\n attributes: {\n nodeType: NodeType;\n [key: string]: string;\n };\n}\n\n/**\n * Agent\n */\n\nexport type CacheConfig = {\n strategy?: 'read-only' | 'read-write' | 'write-only';\n id: string;\n};\n\nexport type Cache =\n | false // No read, no write\n | true // Will throw error at runtime - deprecated\n | CacheConfig; // Object configuration (requires explicit id)\n\nexport interface AgentOpt {\n testId?: string;\n // @deprecated\n cacheId?: string; // Keep backward compatibility, but marked as deprecated\n groupName?: string;\n groupDescription?: string;\n /* if auto generate report, default true */\n generateReport?: boolean;\n /* if auto print report msg, default true */\n autoPrintReportMsg?: boolean;\n\n /**\n * Use directory-based report format with separate image files.\n *\n * When enabled:\n * - Screenshots are saved as PNG files in a `screenshots/` subdirectory\n * - Report is generated as `index.html` with relative image paths\n * - Reduces memory usage and report file size\n *\n * IMPORTANT: 'html-and-external-assets' reports must be served via HTTP server\n * (e.g., `npx serve ./report-dir`). The file:// protocol will not\n * work due to browser CORS restrictions.\n *\n * @default 'single-html'\n */\n outputFormat?: 'single-html' | 'html-and-external-assets';\n\n onTaskStartTip?: OnTaskStartTip;\n aiActContext?: string;\n aiActionContext?: string;\n /* custom report file name */\n reportFileName?: string;\n modelConfig?: TModelConfig;\n cache?: Cache;\n /**\n * Maximum number of replanning cycles for aiAct.\n * Defaults to 20 (40 for `vlm-ui-tars`) when not provided.\n * If omitted, the agent will also read `MIDSCENE_REPLANNING_CYCLE_LIMIT` for backward compatibility.\n */\n replanningCycleLimit?: number;\n\n /**\n * Wait time in milliseconds after each action execution.\n * This allows the UI to settle and stabilize before the next action.\n * Defaults to 300ms when not provided.\n */\n waitAfterAction?: number;\n\n /**\n * When set to true, Midscene will use the target device's time (Android/iOS)\n * instead of the system time. Useful when the device time differs from the\n * host machine. Default: false\n */\n useDeviceTimestamp?: boolean;\n\n /**\n * Custom screenshot shrink factor to reduce AI token usage.\n * When set, the screenshot will be scaled down by this factor from the physical resolution.\n *\n * Example:\n * - Physical screen width: 3000px, dpr=6\n * - Logical width: 500px\n * - screenshotShrinkFactor: 2\n * - Actual shrunk screenshot width: 3000 / 2 = 1500px\n * - AI analyzes the 1500px screenshot\n * - Coordinates are transformed back to logical (500px) before actions execute\n *\n * Benefits:\n * - Reduces token usage for high-resolution screenshots\n * - Maintains accuracy by scaling coordinates appropriately\n *\n * Must be >= 1 (shrinking only, enlarging is not supported).\n *\n * @default 1 (no shrinking, uses original physical screenshot)\n */\n screenshotShrinkFactor?: number;\n\n /**\n * Custom OpenAI client factory function\n *\n * If provided, this function will be called to create OpenAI client instances\n * for each AI call, allowing you to:\n * - Wrap clients with observability tools (langsmith, langfuse)\n * - Use custom OpenAI-compatible clients\n * - Apply different configurations based on intent\n *\n * @param config - Resolved model configuration\n * @returns OpenAI client instance (original or wrapped)\n *\n * @example\n * ```typescript\n * createOpenAIClient: async (openai, opts) => {\n * // Wrap with langsmith for planning tasks\n * if (opts.baseURL?.includes('planning')) {\n * return wrapOpenAI(openai, { metadata: { task: 'planning' } });\n * }\n *\n * return openai;\n * }\n * ```\n */\n createOpenAIClient?: CreateOpenAIClientFn;\n}\n\nexport type TestStatus =\n | 'passed'\n | 'failed'\n | 'timedOut'\n | 'skipped'\n | 'interrupted';\n\nexport interface ReportFileWithAttributes {\n reportFilePath: string;\n reportAttributes: {\n testDuration: number;\n testStatus: TestStatus;\n testTitle: string;\n testId: string;\n testDescription: string;\n };\n}\n","/**\n * Recursively restore image references in parsed data.\n * Replaces { $screenshot: \"id\" } with lazy { get base64() {...}, capturedAt } objects.\n * The resolver is only called when .base64 is first accessed.\n */\nexport function restoreImageReferences<T>(\n data: T,\n resolveImage: (id: string) => string,\n): T {\n if (typeof data === 'string') {\n return data;\n }\n\n if (Array.isArray(data)) {\n return data.map((item) => restoreImageReferences(item, resolveImage)) as T;\n }\n\n if (typeof data === 'object' && data !== null) {\n if ('$screenshot' in data) {\n const screenshotData = data as {\n $screenshot: unknown;\n capturedAt?: unknown;\n };\n const id = screenshotData.$screenshot;\n const capturedAt =\n typeof screenshotData.capturedAt === 'number'\n ? screenshotData.capturedAt\n : undefined;\n if (typeof id === 'string') {\n // If id looks like a path or base64 data, use it directly (no lazy needed)\n if (\n id.startsWith('data:image/') ||\n id.startsWith('./') ||\n id.startsWith('/')\n ) {\n return { base64: id, capturedAt } as T;\n }\n\n // Create lazy getter — .base64 is only resolved when first accessed\n let resolved: string | null = null;\n const lazy: { base64: string; capturedAt?: number } =\n Object.defineProperties(\n {} as { base64: string; capturedAt?: number },\n {\n base64: {\n get() {\n if (resolved === null) {\n resolved = resolveImage(id);\n }\n return resolved;\n },\n enumerable: true,\n },\n capturedAt: { value: capturedAt, enumerable: true },\n },\n );\n return lazy as T;\n }\n // Invalid $screenshot value, return empty\n console.warn('Invalid $screenshot value type:', typeof id);\n return { base64: '' } as T;\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n result[key] = restoreImageReferences(value, resolveImage);\n }\n return result as T;\n }\n\n return data;\n}\n","import node_assert from \"node:assert\";\nimport { NodeType } from \"../constants/index.mjs\";\nimport get_photon from \"./get-photon.mjs\";\nimport { photonFromBase64, photonToBase64 } from \"./transform.mjs\";\nconst DIGIT_FONT = {\n 0: [\n [\n 0,\n 1,\n 1,\n 1,\n 0\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 1,\n 1,\n 1,\n 0\n ]\n ],\n 1: [\n [\n 0,\n 0,\n 1,\n 0,\n 0\n ],\n [\n 0,\n 1,\n 1,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 1,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 1,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 1,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 1,\n 0,\n 0\n ],\n [\n 0,\n 1,\n 1,\n 1,\n 0\n ]\n ],\n 2: [\n [\n 0,\n 1,\n 1,\n 1,\n 0\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 0,\n 1,\n 1,\n 0\n ],\n [\n 0,\n 1,\n 0,\n 0,\n 0\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 1,\n 1,\n 1,\n 1,\n 1\n ]\n ],\n 3: [\n [\n 0,\n 1,\n 1,\n 1,\n 0\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 0,\n 1,\n 1,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 1,\n 1,\n 1,\n 0\n ]\n ],\n 4: [\n [\n 0,\n 0,\n 0,\n 1,\n 0\n ],\n [\n 0,\n 0,\n 1,\n 1,\n 0\n ],\n [\n 0,\n 1,\n 0,\n 1,\n 0\n ],\n [\n 1,\n 0,\n 0,\n 1,\n 0\n ],\n [\n 1,\n 1,\n 1,\n 1,\n 1\n ],\n [\n 0,\n 0,\n 0,\n 1,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 1,\n 0\n ]\n ],\n 5: [\n [\n 1,\n 1,\n 1,\n 1,\n 1\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 1,\n 1,\n 1,\n 1,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 1,\n 1,\n 1,\n 0\n ]\n ],\n 6: [\n [\n 0,\n 1,\n 1,\n 1,\n 0\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 1,\n 1,\n 1,\n 1,\n 0\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 1,\n 1,\n 1,\n 0\n ]\n ],\n 7: [\n [\n 1,\n 1,\n 1,\n 1,\n 1\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 0,\n 0,\n 1,\n 0\n ],\n [\n 0,\n 0,\n 1,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 1,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 1,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 1,\n 0,\n 0\n ]\n ],\n 8: [\n [\n 0,\n 1,\n 1,\n 1,\n 0\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 1,\n 1,\n 1,\n 0\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 1,\n 1,\n 1,\n 0\n ]\n ],\n 9: [\n [\n 0,\n 1,\n 1,\n 1,\n 0\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 1,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 1,\n 1,\n 1,\n 1\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 1,\n 1,\n 1,\n 0\n ]\n ]\n};\nconst FONT_WIDTH = 5;\nconst FONT_HEIGHT = 7;\nconst FONT_SCALE = 2;\nfunction drawDigit(pixels, width, height, digit, startX, startY, color) {\n const bitmap = DIGIT_FONT[digit];\n if (!bitmap) return;\n for(let row = 0; row < FONT_HEIGHT; row++)for(let col = 0; col < FONT_WIDTH; col++)if (1 === bitmap[row][col]) for(let sy = 0; sy < FONT_SCALE; sy++)for(let sx = 0; sx < FONT_SCALE; sx++){\n const x = startX + col * FONT_SCALE + sx;\n const y = startY + row * FONT_SCALE + sy;\n if (x >= 0 && x < width && y >= 0 && y < height) {\n const idx = (y * width + x) * 4;\n pixels[idx + 0] = color.r;\n pixels[idx + 1] = color.g;\n pixels[idx + 2] = color.b;\n pixels[idx + 3] = color.a;\n }\n }\n}\nfunction drawNumber(pixels, width, height, num, startX, startY, color) {\n const str = num.toString();\n let x = startX;\n for (const digit of str){\n drawDigit(pixels, width, height, digit, x, startY, color);\n x += FONT_WIDTH * FONT_SCALE + 1;\n }\n}\nfunction getNumberWidth(num) {\n return num.toString().length * (FONT_WIDTH * FONT_SCALE + 1) - 1;\n}\nfunction drawRect(pixels, width, height, rect, color, thickness) {\n const x = Math.floor(rect.x);\n const y = Math.floor(rect.y);\n const w = Math.floor(rect.w);\n const h = Math.floor(rect.h);\n for(let py = y; py < y + h && py < height; py++)for(let px = x; px < x + w && px < width; px++){\n if (px < 0 || py < 0) continue;\n const isLeftBorder = px >= x && px < x + thickness;\n const isRightBorder = px <= x + w - 1 && px > x + w - thickness - 1;\n const isTopBorder = py >= y && py < y + thickness;\n const isBottomBorder = py <= y + h - 1 && py > y + h - thickness - 1;\n if (isLeftBorder || isRightBorder || isTopBorder || isBottomBorder) {\n const idx = (py * width + px) * 4;\n pixels[idx + 0] = color.r;\n pixels[idx + 1] = color.g;\n pixels[idx + 2] = color.b;\n pixels[idx + 3] = color.a;\n }\n }\n}\nfunction fillRect(pixels, width, height, rect, color) {\n const x = Math.floor(rect.x);\n const y = Math.floor(rect.y);\n const w = Math.floor(rect.w);\n const h = Math.floor(rect.h);\n for(let py = y; py < y + h && py < height; py++)for(let px = x; px < x + w && px < width; px++){\n if (px < 0 || py < 0) continue;\n const idx = (py * width + px) * 4;\n pixels[idx + 0] = color.r;\n pixels[idx + 1] = color.g;\n pixels[idx + 2] = color.b;\n pixels[idx + 3] = color.a;\n }\n}\nfunction blendPixels(basePixels, overlayPixels, width, height) {\n const result = new Uint8Array(basePixels.length);\n for(let i = 0; i < basePixels.length; i += 4){\n const overlayAlpha = overlayPixels[i + 3] / 255;\n const baseAlpha = basePixels[i + 3] / 255;\n if (0 === overlayAlpha) {\n result[i + 0] = basePixels[i + 0];\n result[i + 1] = basePixels[i + 1];\n result[i + 2] = basePixels[i + 2];\n result[i + 3] = basePixels[i + 3];\n } else {\n const outAlpha = overlayAlpha + baseAlpha * (1 - overlayAlpha);\n if (0 === outAlpha) {\n result[i + 0] = overlayPixels[i + 0];\n result[i + 1] = overlayPixels[i + 1];\n result[i + 2] = overlayPixels[i + 2];\n result[i + 3] = overlayPixels[i + 3];\n } else {\n result[i + 0] = Math.round((overlayPixels[i + 0] * overlayAlpha + basePixels[i + 0] * baseAlpha * (1 - overlayAlpha)) / outAlpha);\n result[i + 1] = Math.round((overlayPixels[i + 1] * overlayAlpha + basePixels[i + 1] * baseAlpha * (1 - overlayAlpha)) / outAlpha);\n result[i + 2] = Math.round((overlayPixels[i + 2] * overlayAlpha + basePixels[i + 2] * baseAlpha * (1 - overlayAlpha)) / outAlpha);\n result[i + 3] = Math.round(255 * outAlpha);\n }\n }\n }\n return result;\n}\nconst createSvgOverlay = async (elements, imageWidth, imageHeight, boxPadding = 5, borderThickness = 2, prompt)=>{\n const overlayPixels = new Uint8Array(imageWidth * imageHeight * 4);\n const colors = [\n {\n rect: {\n r: 0xc6,\n g: 0x23,\n b: 0x00,\n a: 0xff\n },\n text: {\n r: 0xff,\n g: 0xff,\n b: 0xff,\n a: 0xff\n }\n },\n {\n rect: {\n r: 0x00,\n g: 0x00,\n b: 0xff,\n a: 0xff\n },\n text: {\n r: 0xff,\n g: 0xff,\n b: 0xff,\n a: 0xff\n }\n },\n {\n rect: {\n r: 0x8b,\n g: 0x45,\n b: 0x13,\n a: 0xff\n },\n text: {\n r: 0xff,\n g: 0xff,\n b: 0xff,\n a: 0xff\n }\n },\n {\n rect: {\n r: 0x3e,\n g: 0x7b,\n b: 0x27,\n a: 0xff\n },\n text: {\n r: 0xff,\n g: 0xff,\n b: 0xff,\n a: 0xff\n }\n },\n {\n rect: {\n r: 0x50,\n g: 0x00,\n b: 0x73,\n a: 0xff\n },\n text: {\n r: 0xff,\n g: 0xff,\n b: 0xff,\n a: 0xff\n }\n }\n ];\n if (prompt) {\n const promptMargin = 20;\n const promptHeight = 30;\n const promptY = imageHeight - promptHeight - promptMargin;\n fillRect(overlayPixels, imageWidth, imageHeight, {\n x: 0,\n y: promptY,\n w: imageWidth,\n h: promptHeight\n }, {\n r: 0x00,\n g: 0x00,\n b: 0x00,\n a: 0xcc\n });\n }\n for(let index = 0; index < elements.length; index++){\n const element = elements[index];\n const color = colors[index % colors.length];\n const paddedLeft = Math.max(0, element.rect.left - boxPadding);\n const paddedTop = Math.max(0, element.rect.top - boxPadding);\n const paddedWidth = Math.min(imageWidth - paddedLeft, element.rect.width + 2 * boxPadding);\n const paddedHeight = Math.min(imageHeight - paddedTop, element.rect.height + 2 * boxPadding);\n const paddedRect = {\n x: paddedLeft,\n y: paddedTop,\n w: paddedWidth,\n h: paddedHeight\n };\n drawRect(overlayPixels, imageWidth, imageHeight, paddedRect, color.rect, borderThickness);\n const indexId = element.indexId;\n if ('number' != typeof indexId) continue;\n const textWidth = getNumberWidth(indexId);\n const textHeight = FONT_HEIGHT * FONT_SCALE;\n const rectWidth = textWidth + 5;\n const rectHeight = textHeight + 4;\n let rectX = paddedLeft - rectWidth;\n let rectY = paddedTop + Math.floor(paddedHeight / 2) - Math.floor(textHeight / 2) - 2;\n const checkOverlap = (x, y)=>elements.slice(0, index).some((otherElement)=>x < otherElement.rect.left + otherElement.rect.width && x + rectWidth > otherElement.rect.left && y < otherElement.rect.top + otherElement.rect.height && y + rectHeight > otherElement.rect.top);\n const isWithinBounds = (x, y)=>x >= 0 && x + rectWidth <= imageWidth && y >= 0 && y + rectHeight <= imageHeight;\n if (checkOverlap(rectX, rectY) || !isWithinBounds(rectX, rectY)) if (!checkOverlap(paddedLeft, paddedTop - rectHeight - 2) && isWithinBounds(paddedLeft, paddedTop - rectHeight - 2)) {\n rectX = paddedLeft;\n rectY = paddedTop - rectHeight - 2;\n } else if (!checkOverlap(paddedLeft, paddedTop + paddedHeight + 2) && isWithinBounds(paddedLeft, paddedTop + paddedHeight + 2)) {\n rectX = paddedLeft;\n rectY = paddedTop + paddedHeight + 2;\n } else if (!checkOverlap(paddedLeft + paddedWidth + 2, paddedTop) && isWithinBounds(paddedLeft + paddedWidth + 2, paddedTop)) {\n rectX = paddedLeft + paddedWidth + 2;\n rectY = paddedTop;\n } else {\n rectX = paddedLeft;\n rectY = paddedTop + 2;\n }\n fillRect(overlayPixels, imageWidth, imageHeight, {\n x: rectX,\n y: rectY,\n w: rectWidth,\n h: rectHeight\n }, color.rect);\n const textX = rectX + Math.floor((rectWidth - textWidth) / 2);\n const textY = rectY + Math.floor((rectHeight - textHeight) / 2);\n drawNumber(overlayPixels, imageWidth, imageHeight, indexId, textX, textY, color.text);\n }\n return overlayPixels;\n};\nconst compositeElementInfoImg = async (options)=>{\n node_assert(options.inputImgBase64, 'inputImgBase64 is required');\n const { PhotonImage, SamplingFilter, resize } = await get_photon();\n let width = 0;\n let height = 0;\n if (options.size) {\n width = options.size.width;\n height = options.size.height;\n }\n let photonImage = await photonFromBase64(options.inputImgBase64);\n if (width && height) {\n const imageWidth = photonImage.get_width();\n const imageHeight = photonImage.get_height();\n if (imageWidth !== width || imageHeight !== height) {\n const resized = resize(photonImage, width, height, SamplingFilter.Nearest);\n photonImage.free();\n photonImage = resized;\n }\n } else {\n width = photonImage.get_width();\n height = photonImage.get_height();\n }\n if (!width || !height) {\n photonImage.free();\n throw Error('Image processing failed because width or height is undefined');\n }\n const { elementsPositionInfo, prompt } = options;\n try {\n const basePixels = photonImage.get_raw_pixels();\n const overlayPixels = await createSvgOverlay(elementsPositionInfo, width, height, options.annotationPadding, options.borderThickness, prompt);\n const blendedPixels = blendPixels(basePixels, overlayPixels, width, height);\n const resultImage = new PhotonImage(blendedPixels, width, height);\n const base64 = await photonToBase64(resultImage, 90);\n resultImage.free();\n return base64;\n } finally{\n photonImage.free();\n }\n};\nconst processImageElementInfo = async (options)=>{\n const base64Image = options.inputImgBase64.split(';base64,').pop();\n node_assert(base64Image, 'base64Image is undefined');\n const [compositeElementInfoImgBase64, compositeElementInfoImgWithoutTextBase64] = await Promise.all([\n compositeElementInfoImg({\n inputImgBase64: options.inputImgBase64,\n elementsPositionInfo: options.elementsPositionInfo\n }),\n compositeElementInfoImg({\n inputImgBase64: options.inputImgBase64,\n elementsPositionInfo: options.elementsPositionInfoWithoutText\n })\n ]);\n return {\n compositeElementInfoImgBase64,\n compositeElementInfoImgWithoutTextBase64\n };\n};\nasync function annotateRects(imgBase64, rects, prompt) {\n const markedImage = await compositeElementInfoImg({\n inputImgBase64: imgBase64,\n elementsPositionInfo: rects.map((rect, index)=>({\n id: `rect-${index}`,\n rect,\n indexId: index + 1,\n attributes: {\n nodeType: NodeType.CONTAINER\n },\n content: '',\n center: [\n rect.left + rect.width / 2,\n rect.top + rect.height / 2\n ]\n })),\n annotationPadding: 0,\n prompt\n });\n return markedImage;\n}\nexport { annotateRects, compositeElementInfoImg, processImageElementInfo };\n","import type { DumpMeta, PartialServiceDumpFromSDK, ServiceDump } from '@/types';\nimport { uuid } from '@midscene/shared/utils';\n\nexport function createServiceDump(\n data: PartialServiceDumpFromSDK,\n): ServiceDump {\n const baseData: DumpMeta = {\n logTime: Date.now(),\n };\n const finalData: ServiceDump = {\n logId: uuid(),\n ...baseData,\n ...data,\n };\n\n return finalData;\n}\n","import { isAutoGLM, isUITars } from '@/ai-model/auto-glm/util';\nimport {\n AIResponseParseError,\n AiExtractElementInfo,\n AiLocateElement,\n callAIWithObjectResponse,\n} from '@/ai-model/index';\nimport { AiLocateSection, buildSearchAreaConfig } from '@/ai-model/inspect';\nimport { elementDescriberInstruction } from '@/ai-model/prompt/describe';\nimport { type AIArgs, expandSearchArea } from '@/common';\nimport type {\n AIDescribeElementResponse,\n AIUsageInfo,\n DetailedLocateParam,\n LocateResultElement,\n LocateResultWithDump,\n PartialServiceDumpFromSDK,\n PlanningLocateParam,\n Rect,\n ServiceExtractOption,\n ServiceExtractParam,\n ServiceExtractResult,\n ServiceTaskInfo,\n UIContext,\n} from '@/types';\nimport { ServiceError } from '@/types';\nimport type { IModelConfig } from '@midscene/shared/env';\nimport { compositeElementInfoImg, cropByRect } from '@midscene/shared/img';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport type { TMultimodalPrompt } from '../common';\nimport { createServiceDump } from './utils';\n\nexport interface LocateOpts {\n context?: UIContext;\n planLocatedElement?: LocateResultElement;\n}\n\nexport type AnyValue<T> = {\n [K in keyof T]: unknown extends T[K] ? any : T[K];\n};\n\ninterface ServiceOptions {\n taskInfo?: Omit<ServiceTaskInfo, 'durationMs'>;\n}\n\nconst debug = getDebug('ai:service');\nexport default class Service {\n contextRetrieverFn: () => Promise<UIContext> | UIContext;\n\n taskInfo?: Omit<ServiceTaskInfo, 'durationMs'>;\n\n constructor(\n context: UIContext | (() => Promise<UIContext> | UIContext),\n opt?: ServiceOptions,\n ) {\n assert(context, 'context is required for Service');\n if (typeof context === 'function') {\n this.contextRetrieverFn = context;\n } else {\n this.contextRetrieverFn = () => Promise.resolve(context);\n }\n\n if (typeof opt?.taskInfo !== 'undefined') {\n this.taskInfo = opt.taskInfo;\n }\n }\n\n async locate(\n query: PlanningLocateParam,\n opt: LocateOpts,\n modelConfig: IModelConfig,\n abortSignal?: AbortSignal,\n ): Promise<LocateResultWithDump> {\n const queryPrompt = typeof query === 'string' ? query : query.prompt;\n assert(queryPrompt, 'query is required for locate');\n\n assert(typeof query === 'object', 'query should be an object for locate');\n\n const hasPlanLocatedElement = !!opt?.planLocatedElement?.rect;\n\n let searchAreaPrompt;\n if (query.deepLocate && !hasPlanLocatedElement) {\n searchAreaPrompt = query.prompt;\n }\n\n const { modelFamily } = modelConfig;\n\n if (searchAreaPrompt && !modelFamily) {\n console.warn(\n 'The \"deepLocate\" feature is not supported with multimodal LLM. Please config VL model for Midscene. https://midscenejs.com/model-config',\n );\n searchAreaPrompt = undefined;\n }\n\n if (searchAreaPrompt && isAutoGLM(modelFamily)) {\n console.warn('The \"deepLocate\" feature is not supported with AutoGLM.');\n searchAreaPrompt = undefined;\n }\n\n const context = opt?.context || (await this.contextRetrieverFn());\n\n let searchArea: Rect | undefined = undefined;\n let searchAreaRawResponse: string | undefined = undefined;\n let searchAreaUsage: AIUsageInfo | undefined = undefined;\n let searchAreaResponse:\n | Awaited<ReturnType<typeof AiLocateSection>>\n | undefined = undefined;\n if (query.deepLocate && hasPlanLocatedElement) {\n const searchAreaConfig = await buildSearchAreaConfig({\n context,\n baseRect: opt.planLocatedElement!.rect,\n modelFamily,\n });\n searchArea = searchAreaConfig.rect;\n\n searchAreaRawResponse = JSON.stringify({\n source: 'plan-located-element',\n rect: opt.planLocatedElement!.rect,\n });\n searchAreaResponse = {\n rect: searchArea,\n imageBase64: searchAreaConfig.imageBase64,\n scale: searchAreaConfig.scale,\n rawResponse: searchAreaRawResponse,\n };\n } else if (searchAreaPrompt) {\n searchAreaResponse = await AiLocateSection({\n context,\n sectionDescription: searchAreaPrompt,\n modelConfig,\n abortSignal,\n });\n assert(\n searchAreaResponse.rect,\n `cannot find search area for \"${searchAreaPrompt}\"${\n searchAreaResponse.error ? `: ${searchAreaResponse.error}` : ''\n }`,\n );\n searchAreaRawResponse = searchAreaResponse.rawResponse;\n searchAreaUsage = searchAreaResponse.usage;\n searchArea = searchAreaResponse.rect;\n }\n\n const startTime = Date.now();\n const { parseResult, rect, rawResponse, usage, reasoning_content } =\n await AiLocateElement({\n context,\n targetElementDescription: queryPrompt,\n searchConfig: searchAreaResponse,\n modelConfig,\n abortSignal,\n });\n\n const timeCost = Date.now() - startTime;\n const taskInfo: ServiceTaskInfo = {\n ...(this.taskInfo ? this.taskInfo : {}),\n durationMs: timeCost,\n rawResponse: JSON.stringify(rawResponse),\n formatResponse: JSON.stringify(parseResult),\n usage,\n searchArea,\n searchAreaRawResponse,\n searchAreaUsage,\n reasoning_content,\n };\n\n let errorLog: string | undefined;\n if (parseResult.errors?.length) {\n errorLog = `failed to locate element: \\n${parseResult.errors.join('\\n')}`;\n }\n\n const dumpData: PartialServiceDumpFromSDK = {\n type: 'locate',\n userQuery: {\n element: queryPrompt,\n },\n matchedElement: [],\n matchedRect: rect,\n data: null,\n taskInfo,\n deepLocate: !!searchArea,\n error: errorLog,\n };\n\n const elements = parseResult.elements || [];\n\n const dump = createServiceDump({\n ...dumpData,\n matchedElement: elements,\n });\n\n if (errorLog) {\n throw new ServiceError(errorLog, dump);\n }\n\n if (elements.length > 1) {\n throw new ServiceError(\n `locate: multiple elements found, length = ${elements.length}`,\n dump,\n );\n }\n\n if (elements.length === 1) {\n return {\n element: {\n center: elements[0]!.center,\n rect: elements[0]!.rect,\n description: elements[0]!.description,\n },\n rect,\n dump,\n };\n }\n\n return {\n element: null,\n rect,\n dump,\n };\n }\n\n async extract<T>(\n dataDemand: ServiceExtractParam,\n modelConfig: IModelConfig,\n opt?: ServiceExtractOption,\n pageDescription?: string,\n multimodalPrompt?: TMultimodalPrompt,\n context?: UIContext,\n ): Promise<ServiceExtractResult<T>> {\n assert(context, 'context is required for extract');\n assert(\n typeof dataDemand === 'object' || typeof dataDemand === 'string',\n `dataDemand should be object or string, but get ${typeof dataDemand}`,\n );\n\n const startTime = Date.now();\n\n let parseResult: Awaited<\n ReturnType<typeof AiExtractElementInfo<T>>\n >['parseResult'];\n let rawResponse: string;\n let usage: Awaited<ReturnType<typeof AiExtractElementInfo<T>>>['usage'];\n let reasoning_content: string | undefined;\n\n try {\n const result = await AiExtractElementInfo<T>({\n context,\n dataQuery: dataDemand,\n multimodalPrompt,\n extractOption: opt,\n modelConfig,\n pageDescription,\n });\n parseResult = result.parseResult;\n rawResponse = result.rawResponse;\n usage = result.usage;\n reasoning_content = result.reasoning_content;\n } catch (error) {\n if (error instanceof AIResponseParseError) {\n // Create dump with usage and rawResponse from the error\n const timeCost = Date.now() - startTime;\n const taskInfo: ServiceTaskInfo = {\n ...(this.taskInfo ? this.taskInfo : {}),\n durationMs: timeCost,\n rawResponse: error.rawResponse,\n usage: error.usage,\n };\n const dump = createServiceDump({\n type: 'extract',\n userQuery: { dataDemand },\n matchedElement: [],\n data: null,\n taskInfo,\n error: error.message,\n });\n throw new ServiceError(error.message, dump);\n }\n throw error;\n }\n\n const timeCost = Date.now() - startTime;\n const taskInfo: ServiceTaskInfo = {\n ...(this.taskInfo ? this.taskInfo : {}),\n durationMs: timeCost,\n rawResponse,\n formatResponse: JSON.stringify(parseResult),\n usage,\n reasoning_content,\n };\n\n let errorLog: string | undefined;\n if (parseResult.errors?.length) {\n errorLog = `AI response error: \\n${parseResult.errors.join('\\n')}`;\n }\n\n const dumpData: PartialServiceDumpFromSDK = {\n type: 'extract',\n userQuery: {\n dataDemand,\n },\n matchedElement: [],\n data: null,\n taskInfo,\n error: errorLog,\n };\n\n const { data, thought } = parseResult || {};\n\n const dump = createServiceDump({\n ...dumpData,\n data,\n });\n\n if (errorLog && !data) {\n throw new ServiceError(errorLog, dump);\n }\n\n return {\n data,\n thought,\n usage,\n reasoning_content,\n dump,\n };\n }\n\n async describe(\n target: Rect | [number, number],\n modelConfig: IModelConfig,\n opt?: {\n deepLocate?: boolean;\n },\n ): Promise<Pick<AIDescribeElementResponse, 'description'>> {\n assert(target, 'target is required for service.describe');\n const context = await this.contextRetrieverFn();\n const { shotSize } = context;\n const screenshotBase64 = context.screenshot.base64;\n assert(screenshotBase64, 'screenshot is required for service.describe');\n // The result of the \"describe\" function will be used for positioning, so essentially it is a form of grounding.\n const { modelFamily } = modelConfig;\n const systemPrompt = elementDescriberInstruction();\n\n // Convert [x,y] center point to Rect if needed\n const defaultRectSize = 30;\n const targetRect: Rect = Array.isArray(target)\n ? {\n left: Math.floor(target[0] - defaultRectSize / 2),\n top: Math.floor(target[1] - defaultRectSize / 2),\n width: defaultRectSize,\n height: defaultRectSize,\n }\n : target;\n\n let imagePayload = await compositeElementInfoImg({\n inputImgBase64: screenshotBase64,\n size: shotSize,\n elementsPositionInfo: [\n {\n rect: targetRect,\n },\n ],\n borderThickness: 3,\n });\n\n if (opt?.deepLocate) {\n const searchArea = expandSearchArea(targetRect, shotSize);\n // Always crop in describe mode. Unlike locate's deepLocate (where\n // cropping too small loses context for finding elements), describe's\n // deepLocate intentionally zooms in so the model produces a more\n // precise description from a focused view. expandSearchArea already\n // guarantees a minimum 400x400 area with surrounding context.\n debug('describe: cropping to searchArea', searchArea);\n const croppedResult = await cropByRect(\n imagePayload,\n searchArea,\n modelFamily === 'qwen2.5-vl',\n );\n imagePayload = croppedResult.imageBase64;\n }\n\n const msgs: AIArgs = [\n { role: 'system', content: systemPrompt },\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imagePayload,\n detail: 'high',\n },\n },\n ],\n },\n ];\n\n const res = await callAIWithObjectResponse<AIDescribeElementResponse>(\n msgs,\n modelConfig,\n );\n\n const { content } = res;\n assert(!content.error, `describe failed: ${content.error}`);\n assert(content.description, 'failed to describe the element');\n return content;\n }\n}\n","import type { ExecutionTask } from '@/types';\nimport { getDebug } from '@midscene/shared/logger';\n\nconst debugTiming = getDebug('task-timing');\n\ntype ExecutionTaskTiming = NonNullable<ExecutionTask['timing']>;\n\ntype NumericTimingField = {\n [K in keyof ExecutionTaskTiming]-?: ExecutionTaskTiming[K] extends\n | number\n | undefined\n ? K\n : never;\n}[keyof ExecutionTaskTiming];\n\nexport type TimingSettableField = Exclude<\n NumericTimingField,\n 'start' | 'end' | 'cost'\n>;\n\nexport function setTimingFieldOnce(\n timing: ExecutionTaskTiming | undefined,\n field: TimingSettableField,\n): void {\n if (!timing) {\n debugTiming(`[warning] timing object missing, skip set. field=${field}`);\n return;\n }\n\n const value = Date.now();\n const existingValue = timing[field];\n if (existingValue !== undefined) {\n debugTiming(\n `[warning] duplicate timing field set ignored. field=${field}, existing=${existingValue}, incoming=${value}`,\n );\n return;\n }\n\n timing[field] = value;\n}\n","import type { ScreenshotItem } from '@/screenshot-item';\nimport { setTimingFieldOnce } from '@/task-timing';\nimport {\n ExecutionDump,\n type ExecutionRecorderItem,\n type ExecutionTask,\n type ExecutionTaskActionApply,\n type ExecutionTaskApply,\n type ExecutionTaskPlanningLocateOutput,\n type ExecutionTaskProgressOptions,\n type ExecutionTaskReturn,\n type ExecutorContext,\n type PlanningActionParamError,\n type UIContext,\n} from '@/types';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert, uuid } from '@midscene/shared/utils';\n\nconst debug = getDebug('task-runner');\nconst UI_CONTEXT_CACHE_TTL_MS = 300;\n\ntype TaskRunnerInitOptions = ExecutionTaskProgressOptions & {\n tasks?: ExecutionTaskApply[];\n onTaskUpdate?: (\n runner: TaskRunner,\n error?: TaskExecutionError,\n ) => Promise<void> | void;\n};\n\ntype TaskRunnerOperationOptions = {\n allowWhenError?: boolean;\n};\n\nexport class TaskRunner {\n readonly id: string;\n name: string;\n\n tasks: ExecutionTask[];\n\n // status of runner\n status: 'init' | 'pending' | 'running' | 'completed' | 'error';\n\n onTaskStart?: ExecutionTaskProgressOptions['onTaskStart'];\n\n private readonly uiContextBuilder: () => Promise<UIContext>;\n\n private readonly onTaskUpdate?:\n | ((runner: TaskRunner, error?: TaskExecutionError) => Promise<void> | void)\n | undefined;\n\n private readonly executionLogTime: number;\n\n constructor(\n name: string,\n uiContextBuilder: () => Promise<UIContext>,\n options?: TaskRunnerInitOptions,\n ) {\n this.id = uuid();\n this.status =\n options?.tasks && options.tasks.length > 0 ? 'pending' : 'init';\n this.name = name;\n this.tasks = (options?.tasks || []).map((item) =>\n this.markTaskAsPending(item),\n );\n this.onTaskStart = options?.onTaskStart;\n this.uiContextBuilder = uiContextBuilder;\n this.onTaskUpdate = options?.onTaskUpdate;\n this.executionLogTime = Date.now();\n }\n\n private async emitOnTaskUpdate(error?: TaskExecutionError): Promise<void> {\n if (!this.onTaskUpdate) {\n return;\n }\n await this.onTaskUpdate(this, error);\n }\n\n private lastUiContext?: {\n context: UIContext;\n capturedAt: number;\n };\n\n private async getUiContext(options?: { forceRefresh?: boolean }): Promise<\n UIContext | undefined\n > {\n const now = Date.now();\n const shouldReuse =\n !options?.forceRefresh &&\n this.lastUiContext &&\n now - this.lastUiContext.capturedAt <= UI_CONTEXT_CACHE_TTL_MS;\n\n if (shouldReuse && this.lastUiContext?.context) {\n debug(\n `reuse cached uiContext captured ${now - this.lastUiContext.capturedAt}ms ago`,\n );\n return this.lastUiContext?.context;\n }\n\n try {\n const uiContext = await this.uiContextBuilder();\n if (uiContext) {\n this.lastUiContext = {\n context: uiContext,\n capturedAt: Date.now(),\n };\n } else {\n this.lastUiContext = undefined;\n }\n return uiContext;\n } catch (error) {\n this.lastUiContext = undefined;\n throw error;\n }\n }\n\n private async captureScreenshot(): Promise<ScreenshotItem | undefined> {\n try {\n const uiContext = await this.getUiContext({ forceRefresh: true });\n return uiContext?.screenshot;\n } catch (error) {\n console.error('error while capturing screenshot', error);\n }\n return undefined;\n }\n\n private attachRecorderItem(\n task: ExecutionTask,\n screenshot: ScreenshotItem | undefined,\n phase: 'after-calling',\n ): void {\n if (!phase || !screenshot) {\n return;\n }\n\n const recorderItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: Date.now(),\n screenshot,\n timing: phase,\n };\n\n if (!task.recorder) {\n task.recorder = [recorderItem];\n return;\n }\n task.recorder.push(recorderItem);\n }\n\n private markTaskAsPending(task: ExecutionTaskApply): ExecutionTask {\n return {\n taskId: uuid(),\n status: 'pending',\n ...task,\n };\n }\n\n private normalizeStatusFromError(\n options?: TaskRunnerOperationOptions,\n errorMessage?: string,\n ): void {\n if (this.status !== 'error') {\n return;\n }\n assert(\n options?.allowWhenError,\n errorMessage ||\n `task runner is in error state, cannot proceed\\nerror=${this.latestErrorTask()?.error}\\n${this.latestErrorTask()?.errorStack}`,\n );\n // reset runner state so new tasks can run\n this.status = this.tasks.length > 0 ? 'pending' : 'init';\n }\n\n async append(\n task: ExecutionTaskApply[] | ExecutionTaskApply,\n options?: TaskRunnerOperationOptions,\n ): Promise<void> {\n this.normalizeStatusFromError(\n options,\n `task runner is in error state, cannot append task\\nerror=${this.latestErrorTask()?.error}\\n${this.latestErrorTask()?.errorStack}`,\n );\n if (Array.isArray(task)) {\n this.tasks.push(...task.map((item) => this.markTaskAsPending(item)));\n } else {\n this.tasks.push(this.markTaskAsPending(task));\n }\n if (this.status !== 'running') {\n this.status = 'pending';\n }\n await this.emitOnTaskUpdate();\n }\n\n async appendAndFlush(\n task: ExecutionTaskApply[] | ExecutionTaskApply,\n options?: TaskRunnerOperationOptions,\n ): Promise<{ output: any; thought?: string } | undefined> {\n await this.append(task, options);\n return this.flush(options);\n }\n\n async flush(\n options?: TaskRunnerOperationOptions,\n ): Promise<{ output: any; thought?: string } | undefined> {\n if (this.status === 'init' && this.tasks.length > 0) {\n console.warn(\n 'illegal state for task runner, status is init but tasks are not empty',\n );\n }\n\n this.normalizeStatusFromError(options, 'task runner is in error state');\n assert(this.status !== 'running', 'task runner is already running');\n assert(this.status !== 'completed', 'task runner is already completed');\n\n const nextPendingIndex = this.tasks.findIndex(\n (task) => task.status === 'pending',\n );\n if (nextPendingIndex < 0) {\n // all tasks are completed\n return;\n }\n\n this.status = 'running';\n await this.emitOnTaskUpdate();\n let taskIndex = nextPendingIndex;\n let successfullyCompleted = true;\n\n let previousFindOutput: ExecutionTaskPlanningLocateOutput | undefined;\n\n while (taskIndex < this.tasks.length) {\n const task = this.tasks[taskIndex];\n assert(\n task.status === 'pending',\n `task status should be pending, but got: ${task.status}`,\n );\n task.timing = {\n start: Date.now(),\n };\n try {\n task.status = 'running';\n await this.emitOnTaskUpdate();\n try {\n if (this.onTaskStart) {\n await this.onTaskStart(task);\n }\n } catch (e) {\n console.error('error in onTaskStart', e);\n }\n assert(\n ['Insight', 'Action Space', 'Planning'].indexOf(task.type) >= 0,\n `unsupported task type: ${task.type}`,\n );\n\n const { executor, param } = task;\n assert(executor, `executor is required for task type: ${task.type}`);\n\n let returnValue;\n // For Insight tasks (Query/Assert/WaitFor), always get fresh context\n // to ensure we have the latest UI state after any preceding actions\n const forceRefresh = task.type === 'Insight';\n setTimingFieldOnce(task.timing, 'getUiContextStart');\n const uiContext = await this.getUiContext({ forceRefresh });\n setTimingFieldOnce(task.timing, 'getUiContextEnd');\n\n task.uiContext = uiContext;\n const executorContext: ExecutorContext = {\n task,\n element: previousFindOutput?.element,\n uiContext,\n };\n\n if (task.type === 'Insight') {\n assert(\n task.subType === 'Query' ||\n task.subType === 'Assert' ||\n task.subType === 'WaitFor' ||\n task.subType === 'Boolean' ||\n task.subType === 'Number' ||\n task.subType === 'String',\n `unsupported service subType: ${task.subType}`,\n );\n returnValue = await task.executor(param, executorContext);\n } else if (task.type === 'Planning') {\n returnValue = await task.executor(param, executorContext);\n if (task.subType === 'Locate') {\n previousFindOutput = (\n returnValue as ExecutionTaskReturn<ExecutionTaskPlanningLocateOutput>\n )?.output;\n }\n } else if (task.type === 'Action Space') {\n returnValue = await task.executor(param, executorContext);\n } else {\n console.warn(\n `unsupported task type: ${task.type}, will try to execute it directly`,\n );\n returnValue = await task.executor(param, executorContext);\n }\n\n const isLastTask = taskIndex === this.tasks.length - 1;\n\n if (isLastTask) {\n setTimingFieldOnce(task.timing, 'captureAfterCallingSnapshotStart');\n const screenshot = await this.captureScreenshot();\n this.attachRecorderItem(task, screenshot, 'after-calling');\n setTimingFieldOnce(task.timing, 'captureAfterCallingSnapshotEnd');\n }\n\n Object.assign(task, returnValue);\n task.status = 'finished';\n task.timing.end = Date.now();\n task.timing.cost = task.timing.end - task.timing.start;\n await this.emitOnTaskUpdate();\n taskIndex++;\n } catch (e: any) {\n successfullyCompleted = false;\n task.error = e;\n task.errorMessage =\n e?.message || (typeof e === 'string' ? e : 'error-without-message');\n task.errorStack = e.stack;\n\n task.status = 'failed';\n task.timing.end = Date.now();\n task.timing.cost = task.timing.end - task.timing.start;\n await this.emitOnTaskUpdate();\n break;\n }\n }\n\n // set all remaining tasks as cancelled\n for (let i = taskIndex + 1; i < this.tasks.length; i++) {\n this.tasks[i].status = 'cancelled';\n }\n if (taskIndex + 1 < this.tasks.length) {\n await this.emitOnTaskUpdate();\n }\n\n let finalizeError: TaskExecutionError | undefined;\n if (!successfullyCompleted) {\n this.status = 'error';\n const errorTask = this.latestErrorTask();\n const messageBase =\n errorTask?.errorMessage ||\n (errorTask?.error ? String(errorTask.error) : 'Task execution failed');\n const stack = errorTask?.errorStack;\n const message = stack ? `${messageBase}\\n${stack}` : messageBase;\n finalizeError = new TaskExecutionError(message, this, errorTask, {\n cause: errorTask?.error,\n });\n await this.emitOnTaskUpdate(finalizeError);\n } else {\n this.status = 'completed';\n await this.emitOnTaskUpdate();\n }\n\n if (finalizeError) {\n throw finalizeError;\n }\n\n if (this.tasks.length) {\n // return the last output\n const outputIndex = Math.min(taskIndex, this.tasks.length - 1);\n const { thought, output } = this.tasks[outputIndex];\n return {\n thought,\n output,\n };\n }\n }\n\n isInErrorState(): boolean {\n return this.status === 'error';\n }\n\n latestErrorTask(): ExecutionTask | null {\n if (this.status !== 'error') {\n return null;\n }\n // Find the LAST failed task (not the first one)\n // This is important when using allowWhenError to continue after errors\n for (let i = this.tasks.length - 1; i >= 0; i--) {\n if (this.tasks[i].status === 'failed') {\n return this.tasks[i];\n }\n }\n return null;\n }\n\n dump(): ExecutionDump {\n return new ExecutionDump({\n id: this.id,\n logTime: this.executionLogTime,\n name: this.name,\n tasks: this.tasks,\n });\n }\n\n async appendErrorPlan(errorMsg: string): Promise<{\n output: undefined;\n runner: TaskRunner;\n }> {\n const errorTask: ExecutionTaskActionApply<PlanningActionParamError> = {\n type: 'Action Space',\n subType: 'Error',\n param: {\n thought: errorMsg,\n },\n thought: errorMsg,\n executor: async () => {\n throw new Error(errorMsg || 'error without thought');\n },\n };\n await this.appendAndFlush(errorTask);\n\n return {\n output: undefined,\n runner: this,\n };\n }\n}\n\nexport class TaskExecutionError extends Error {\n runner: TaskRunner;\n\n errorTask: ExecutionTask | null;\n\n constructor(\n message: string,\n runner: TaskRunner,\n errorTask: ExecutionTask | null,\n options?: { cause?: unknown },\n ) {\n super(message, options);\n this.runner = runner;\n this.errorTask = errorTask;\n }\n}\n","import { execFile } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport * as path from 'node:path';\nimport { promisify } from 'node:util';\nimport {\n defaultRunDirName,\n getMidsceneRunSubDir,\n} from '@midscene/shared/common';\nimport {\n MIDSCENE_CACHE,\n MIDSCENE_DEBUG_MODE,\n globalConfigManager,\n} from '@midscene/shared/env';\nimport { getRunningPkgInfo } from '@midscene/shared/node';\nimport { assert, logMsg } from '@midscene/shared/utils';\nimport {\n escapeScriptTag,\n ifInBrowser,\n ifInWorker,\n uuid,\n} from '@midscene/shared/utils';\nimport type { Cache, Rect, ReportDumpWithAttributes } from './types';\n\nlet logEnvReady = false;\n\nexport { appendFileSync } from 'node:fs';\n\nexport const groupedActionDumpFileExt = 'web-dump.json';\n\n/**\n * Process cache configuration with environment variable support and backward compatibility.\n *\n * @param cache - The original cache configuration\n * @param cacheId - The cache ID to use as:\n * 1. Fallback ID when cache is true or cache object has no ID\n * 2. Legacy cacheId when cache is undefined (requires MIDSCENE_CACHE env var)\n * @returns Processed cache configuration\n */\nexport function processCacheConfig(\n cache: Cache | undefined,\n cacheId: string,\n): Cache | undefined {\n // 1. New cache object configuration (highest priority)\n if (cache !== undefined) {\n if (cache === false) {\n return undefined; // Completely disable cache\n }\n\n if (cache === true) {\n // Auto-generate ID using cacheId for CLI/YAML scenarios\n // Agent will validate and reject this later if needed\n return { id: cacheId };\n }\n\n // cache is object configuration\n if (typeof cache === 'object' && cache !== null) {\n // Auto-generate ID using cacheId when missing (for CLI/YAML scenarios)\n if (!cache.id) {\n return { ...cache, id: cacheId };\n }\n return cache;\n }\n }\n\n // 2. Backward compatibility: support old cacheId (requires environment variable)\n // When cache is undefined, check if legacy cacheId mode is enabled via env var\n const envEnabled = globalConfigManager.getEnvConfigInBoolean(MIDSCENE_CACHE);\n\n if (envEnabled && cacheId) {\n return { id: cacheId };\n }\n\n // 3. No cache configuration\n return undefined;\n}\n\nconst reportInitializedMap = new Map<string, boolean>();\nconst reportGroupIdMap = new Map<string, string>();\n\ndeclare const __DEV_REPORT_PATH__: string;\n\nexport function getReportTpl() {\n if (typeof __DEV_REPORT_PATH__ === 'string' && __DEV_REPORT_PATH__) {\n return fs.readFileSync(__DEV_REPORT_PATH__, 'utf-8');\n }\n const reportTpl = 'REPLACE_ME_WITH_REPORT_HTML';\n\n return reportTpl;\n}\n\n/**\n * high performance, insert script before </html> in HTML file\n * only truncate and append, no temporary file\n */\nexport function insertScriptBeforeClosingHtml(\n filePath: string,\n scriptContent: string,\n): void {\n const htmlEndTag = '</html>';\n const stat = fs.statSync(filePath);\n\n const readSize = Math.min(stat.size, 4096);\n const start = Math.max(0, stat.size - readSize);\n const buffer = Buffer.alloc(stat.size - start);\n const fd = fs.openSync(filePath, 'r');\n fs.readSync(fd, buffer, 0, buffer.length, start);\n fs.closeSync(fd);\n\n const tailStr = buffer.toString('utf8');\n const htmlEndIdx = tailStr.lastIndexOf(htmlEndTag);\n if (htmlEndIdx === -1) {\n throw new Error(`No </html> found in file:${filePath}`);\n }\n\n // calculate the correct byte position: char position to byte position\n const beforeHtmlInTail = tailStr.slice(0, htmlEndIdx);\n const htmlEndPos = start + Buffer.byteLength(beforeHtmlInTail, 'utf8');\n\n // truncate to </html> before\n fs.truncateSync(filePath, htmlEndPos);\n // append script and </html>\n fs.appendFileSync(filePath, `${scriptContent}\\n${htmlEndTag}\\n`);\n}\n\nexport function reportHTMLContent(\n dumpData: string | ReportDumpWithAttributes,\n reportPath?: string,\n appendReport?: boolean,\n withTpl = true, // whether return with report template, default = true\n): string {\n let tpl = '';\n if (withTpl) {\n tpl = getReportTpl();\n\n if (!tpl) {\n console.warn('reportTpl is not set, will not write report');\n return '';\n }\n }\n // if reportPath is set, it means we are in write to file mode\n const writeToFile = reportPath && !ifInBrowser;\n let dumpContent = '';\n\n const resolveAutoGroupId = (): string => {\n if (!reportPath || !appendReport) {\n return uuid();\n }\n\n const existingGroupId = reportGroupIdMap.get(reportPath);\n if (existingGroupId) {\n return existingGroupId;\n }\n\n const newGroupId = uuid();\n reportGroupIdMap.set(reportPath, newGroupId);\n return newGroupId;\n };\n\n if (typeof dumpData === 'string') {\n const groupId = resolveAutoGroupId();\n // do not use template string here, will cause bundle error\n dumpContent =\n // biome-ignore lint/style/useTemplate: <explanation>\n '<script type=\"midscene_web_dump\" type=\"application/json\" data-group-id=\"' +\n encodeURIComponent(groupId) +\n '\">\\n' +\n escapeScriptTag(dumpData) +\n '\\n</script>';\n } else {\n const { dumpString, attributes } = dumpData;\n const attributesArr = Object.keys(attributes || {}).map((key) => {\n return `${key}=\"${encodeURIComponent(attributes![key])}\"`;\n });\n\n dumpContent =\n // do not use template string here, will cause bundle error\n // biome-ignore lint/style/useTemplate: <explanation>\n '<script type=\"midscene_web_dump\" type=\"application/json\" ' +\n attributesArr.join(' ') +\n '>\\n' +\n escapeScriptTag(dumpString) +\n '\\n</script>';\n }\n\n if (writeToFile) {\n if (!appendReport) {\n writeFileSync(reportPath!, tpl + dumpContent, { flag: 'w' });\n return reportPath!;\n }\n\n if (!reportInitializedMap.get(reportPath!)) {\n writeFileSync(reportPath!, tpl, { flag: 'w' });\n reportInitializedMap.set(reportPath!, true);\n }\n\n insertScriptBeforeClosingHtml(reportPath!, dumpContent);\n return reportPath!;\n }\n\n return tpl + dumpContent;\n}\n\nexport function writeDumpReport(\n fileName: string,\n dumpData: string | ReportDumpWithAttributes,\n appendReport?: boolean,\n): string | null {\n if (ifInBrowser || ifInWorker) {\n console.log('will not write report in browser');\n return null;\n }\n\n const reportPath = path.join(\n getMidsceneRunSubDir('report'),\n `${fileName}.html`,\n );\n\n reportHTMLContent(dumpData, reportPath, appendReport);\n\n if (process.env.MIDSCENE_DEBUG_LOG_JSON) {\n const jsonPath = `${reportPath}.json`;\n let data;\n\n if (typeof dumpData === 'string') {\n data = JSON.parse(dumpData) as ReportDumpWithAttributes;\n } else {\n data = dumpData;\n }\n\n writeFileSync(jsonPath, JSON.stringify(data, null, 2), {\n flag: appendReport ? 'a' : 'w',\n });\n\n logMsg(`Midscene - dump file written: ${jsonPath}`);\n }\n\n return reportPath;\n}\n\nexport function writeLogFile(opts: {\n fileName: string;\n fileExt: string;\n fileContent: string | ReportDumpWithAttributes;\n type: 'dump' | 'cache' | 'report' | 'tmp';\n generateReport?: boolean;\n appendReport?: boolean;\n}) {\n if (ifInBrowser || ifInWorker) {\n return '/mock/report.html';\n }\n const { fileName, fileExt, fileContent, type = 'dump' } = opts;\n const targetDir = getMidsceneRunSubDir(type);\n // Ensure directory exists\n if (!logEnvReady) {\n assert(targetDir, 'logDir should be set before writing dump file');\n\n // gitIgnore in the parent directory\n const gitIgnorePath = path.join(targetDir, '../../.gitignore');\n const gitPath = path.join(targetDir, '../../.git');\n let gitIgnoreContent = '';\n\n if (existsSync(gitPath)) {\n // if the git path exists, we need to add the log folder to the git ignore file\n if (existsSync(gitIgnorePath)) {\n gitIgnoreContent = readFileSync(gitIgnorePath, 'utf-8');\n }\n\n // ignore the log folder\n if (!gitIgnoreContent.includes(`${defaultRunDirName}/`)) {\n writeFileSync(\n gitIgnorePath,\n `${gitIgnoreContent}\\n# Midscene.js dump files\\n${defaultRunDirName}/dump\\n${defaultRunDirName}/report\\n${defaultRunDirName}/tmp\\n${defaultRunDirName}/log\\n`,\n 'utf-8',\n );\n }\n }\n\n logEnvReady = true;\n }\n\n const filePath = path.join(targetDir, `${fileName}.${fileExt}`);\n\n if (type !== 'dump') {\n // do not write dump file any more\n writeFileSync(filePath, JSON.stringify(fileContent));\n }\n\n if (opts?.generateReport) {\n return writeDumpReport(fileName, fileContent, opts.appendReport);\n }\n\n return filePath;\n}\n\nexport function getTmpDir(): string | null {\n try {\n const runningPkgInfo = getRunningPkgInfo();\n if (!runningPkgInfo) {\n return null;\n }\n const { name } = runningPkgInfo;\n const tmpPath = path.join(tmpdir(), name);\n mkdirSync(tmpPath, { recursive: true });\n return tmpPath;\n } catch (e) {\n return null;\n }\n}\n\nexport function getTmpFile(fileExtWithoutDot: string): string | null {\n if (ifInBrowser || ifInWorker) {\n return null;\n }\n const tmpDir = getTmpDir();\n const filename = `${uuid()}.${fileExtWithoutDot}`;\n return path.join(tmpDir!, filename);\n}\n\nexport function overlapped(container: Rect, target: Rect) {\n // container and the target have some part overlapped\n return (\n container.left < target.left + target.width &&\n container.left + container.width > target.left &&\n container.top < target.top + target.height &&\n container.top + container.height > target.top\n );\n}\n\nexport async function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function replacerForPageObject(_key: string, value: any) {\n if (value && value.constructor?.name === 'Page') {\n return '[Page object]';\n }\n if (value && value.constructor?.name === 'Browser') {\n return '[Browser object]';\n }\n // Handle ScreenshotItem serialization\n if (value && typeof value.toSerializable === 'function') {\n return value.toSerializable();\n }\n return value;\n}\n\nexport function stringifyDumpData(data: any, indents?: number) {\n return JSON.stringify(data, replacerForPageObject, indents);\n}\n\ndeclare const __VERSION__: string;\n\nexport function getVersion() {\n return __VERSION__;\n}\n\nfunction debugLog(...message: any[]) {\n // always read from process.env, and cannot be override by modelConfig, overrideAIConfig, etc.\n // also avoid circular dependency\n const debugMode = process.env[MIDSCENE_DEBUG_MODE];\n if (debugMode) {\n console.log('[Midscene]', ...message);\n }\n}\n\nlet gitInfoPromise: Promise<{ repoUrl: string; userEmail: string }> | null =\n null;\n\nfunction getGitInfoAsync(): Promise<{ repoUrl: string; userEmail: string }> {\n if (gitInfoPromise) return gitInfoPromise;\n\n const execFileAsync = promisify(execFile);\n\n gitInfoPromise = Promise.all([\n execFileAsync('git', ['config', '--get', 'remote.origin.url']).then(\n ({ stdout }) => stdout.trim(),\n () => '',\n ),\n execFileAsync('git', ['config', '--get', 'user.email']).then(\n ({ stdout }) => stdout.trim(),\n () => '',\n ),\n ]).then(([repoUrl, userEmail]) => ({ repoUrl, userEmail }));\n\n return gitInfoPromise;\n}\n\nlet lastReportedRepoUrl = '';\nexport async function uploadTestInfoToServer({\n testUrl,\n serverUrl,\n}: { testUrl: string; serverUrl?: string }) {\n if (!serverUrl) return;\n\n const { repoUrl, userEmail } = await getGitInfoAsync();\n\n // Only upload test info if:\n // 1. Server URL is configured AND\n // 2. Either:\n // - We have a repo URL that's different from last reported one (to avoid duplicate reports)\n // - OR we don't have a repo URL but have a test URL (for non-git environments)\n if (repoUrl ? repoUrl !== lastReportedRepoUrl : !!testUrl) {\n debugLog('Uploading test info to server', {\n serverUrl,\n repoUrl,\n testUrl,\n userEmail,\n });\n\n fetch(serverUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repo_url: repoUrl,\n test_url: testUrl,\n user_email: userEmail,\n }),\n })\n .then((response) => response.json())\n .then((data) => {\n debugLog('Successfully uploaded test info to server:', data);\n })\n .catch((error) =>\n debugLog('Failed to upload test info to server:', error),\n );\n lastReportedRepoUrl = repoUrl;\n }\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { getMidsceneRunSubDir } from '@midscene/shared/common';\nimport {\n MIDSCENE_REPORT_QUIET,\n globalConfigManager,\n} from '@midscene/shared/env';\nimport { ifInBrowser, logMsg, uuid } from '@midscene/shared/utils';\nimport {\n generateDumpScriptTag,\n generateImageScriptTag,\n getBaseUrlFixScript,\n} from './dump/html-utils';\nimport { type ExecutionDump, type GroupMeta, GroupedActionDump } from './types';\nimport { appendFileSync, getReportTpl } from './utils';\n\nexport interface IReportGenerator {\n /**\n * Write or update a single execution.\n * Each call appends a new dump script tag. The frontend deduplicates\n * executions with the same id/name, keeping only the last one.\n *\n * @param execution Current execution's full data\n * @param groupMeta Group-level metadata (groupName, sdkVersion, etc.)\n */\n onExecutionUpdate(execution: ExecutionDump, groupMeta: GroupMeta): void;\n\n /**\n * @deprecated Use onExecutionUpdate instead. Kept for backward compatibility.\n */\n onDumpUpdate?(dump: GroupedActionDump): void;\n\n /**\n * Wait for all queued write operations to complete.\n */\n flush(): Promise<void>;\n\n /**\n * Finalize the report. Calls flush() internally.\n */\n finalize(): Promise<string | undefined>;\n\n getReportPath(): string | undefined;\n}\n\nexport const nullReportGenerator: IReportGenerator = {\n onExecutionUpdate: () => {},\n flush: async () => {},\n finalize: async () => undefined,\n getReportPath: () => undefined,\n};\n\nexport class ReportGenerator implements IReportGenerator {\n private reportPath: string;\n private screenshotMode: 'inline' | 'directory';\n private autoPrint: boolean;\n private firstWriteDone = false;\n\n // Unique identifier for this report stream — used as data-group-id\n private readonly reportStreamId: string;\n\n // Tracks screenshots already written to disk (by id) to avoid duplicates\n private writtenScreenshots = new Set<string>();\n private initialized = false;\n\n // Tracks the last execution + groupMeta for re-writing on finalize\n private lastExecution?: ExecutionDump;\n private lastGroupMeta?: GroupMeta;\n\n // write queue for serial execution\n private writeQueue: Promise<void> = Promise.resolve();\n private destroyed = false;\n\n constructor(options: {\n reportPath: string;\n screenshotMode: 'inline' | 'directory';\n autoPrint?: boolean;\n }) {\n this.reportPath = options.reportPath;\n this.screenshotMode = options.screenshotMode;\n this.autoPrint = options.autoPrint ?? true;\n this.reportStreamId = uuid();\n this.printReportPath('will be generated at');\n }\n\n static create(\n reportFileName: string,\n opts: {\n generateReport?: boolean;\n outputFormat?: 'single-html' | 'html-and-external-assets';\n autoPrintReportMsg?: boolean;\n },\n ): IReportGenerator {\n if (opts.generateReport === false) return nullReportGenerator;\n\n // In browser environment, file system is not available\n if (ifInBrowser) return nullReportGenerator;\n\n if (opts.outputFormat === 'html-and-external-assets') {\n const outputDir = join(getMidsceneRunSubDir('report'), reportFileName);\n return new ReportGenerator({\n reportPath: join(outputDir, 'index.html'),\n screenshotMode: 'directory',\n autoPrint: opts.autoPrintReportMsg,\n });\n }\n\n return new ReportGenerator({\n reportPath: join(\n getMidsceneRunSubDir('report'),\n `${reportFileName}.html`,\n ),\n screenshotMode: 'inline',\n autoPrint: opts.autoPrintReportMsg,\n });\n }\n\n onExecutionUpdate(execution: ExecutionDump, groupMeta: GroupMeta): void {\n this.lastExecution = execution;\n this.lastGroupMeta = groupMeta;\n this.writeQueue = this.writeQueue.then(() => {\n if (this.destroyed) return;\n this.doWriteExecution(execution, groupMeta);\n });\n }\n\n async flush(): Promise<void> {\n await this.writeQueue;\n }\n\n async finalize(): Promise<string | undefined> {\n // Re-write the last execution to capture any final state changes\n if (this.lastExecution && this.lastGroupMeta) {\n this.onExecutionUpdate(this.lastExecution, this.lastGroupMeta);\n }\n await this.flush();\n this.destroyed = true;\n\n if (!this.initialized) {\n // No executions were ever written — no file exists\n return undefined;\n }\n\n this.printReportPath('finalized');\n return this.reportPath;\n }\n\n getReportPath(): string | undefined {\n return this.reportPath;\n }\n\n private printReportPath(verb: string): void {\n if (!this.autoPrint || !this.reportPath) return;\n if (globalConfigManager.getEnvConfigInBoolean(MIDSCENE_REPORT_QUIET))\n return;\n\n if (this.screenshotMode === 'directory') {\n logMsg(\n `Midscene - report ${verb}: npx serve ${dirname(this.reportPath)}`,\n );\n } else {\n logMsg(`Midscene - report ${verb}: ${this.reportPath}`);\n }\n }\n\n private doWriteExecution(\n execution: ExecutionDump,\n groupMeta: GroupMeta,\n ): void {\n if (this.screenshotMode === 'inline') {\n this.writeInlineExecution(execution, groupMeta);\n } else {\n this.writeDirectoryExecution(execution, groupMeta);\n }\n if (!this.firstWriteDone) {\n this.firstWriteDone = true;\n this.printReportPath('generated');\n }\n }\n\n /**\n * Wrap an ExecutionDump + GroupMeta into a single-execution GroupedActionDump.\n */\n private wrapAsGroupedDump(\n execution: ExecutionDump,\n groupMeta: GroupMeta,\n ): GroupedActionDump {\n return new GroupedActionDump({\n sdkVersion: groupMeta.sdkVersion,\n groupName: groupMeta.groupName,\n groupDescription: groupMeta.groupDescription,\n modelBriefs: groupMeta.modelBriefs,\n deviceType: groupMeta.deviceType,\n executions: [execution],\n });\n }\n\n /**\n * Append-only inline mode: write new screenshots and a dump tag on every call.\n * The frontend deduplicates executions with the same id/name (keeps last).\n * Duplicate dump JSON is acceptable; only screenshots are deduplicated.\n */\n private writeInlineExecution(\n execution: ExecutionDump,\n groupMeta: GroupMeta,\n ): void {\n const dir = dirname(this.reportPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Initialize: write HTML template once\n if (!this.initialized) {\n writeFileSync(this.reportPath, getReportTpl());\n this.initialized = true;\n }\n\n // Append new screenshots (skip already-written ones)\n const screenshots = execution.collectScreenshots();\n for (const screenshot of screenshots) {\n if (!this.writtenScreenshots.has(screenshot.id)) {\n appendFileSync(\n this.reportPath,\n `\\n${generateImageScriptTag(screenshot.id, screenshot.base64)}`,\n );\n this.writtenScreenshots.add(screenshot.id);\n // Safe to release memory — the image tag is permanent (never truncated)\n screenshot.markPersistedInline(this.reportPath);\n }\n }\n\n // Append dump tag (always — frontend keeps only last per execution id)\n const singleDump = this.wrapAsGroupedDump(execution, groupMeta);\n const serialized = singleDump.serialize();\n const attributes: Record<string, string> = {\n 'data-group-id': this.reportStreamId,\n };\n appendFileSync(\n this.reportPath,\n `\\n${generateDumpScriptTag(serialized, attributes)}`,\n );\n }\n\n private writeDirectoryExecution(\n execution: ExecutionDump,\n groupMeta: GroupMeta,\n ): void {\n const dir = dirname(this.reportPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // create screenshots subdirectory\n const screenshotsDir = join(dir, 'screenshots');\n if (!existsSync(screenshotsDir)) {\n mkdirSync(screenshotsDir, { recursive: true });\n }\n\n // 1. Write new screenshots and release memory immediately\n const screenshots = execution.collectScreenshots();\n for (const screenshot of screenshots) {\n if (!this.writtenScreenshots.has(screenshot.id)) {\n const ext = screenshot.extension;\n const absolutePath = join(screenshotsDir, `${screenshot.id}.${ext}`);\n const buffer = Buffer.from(screenshot.rawBase64, 'base64');\n writeFileSync(absolutePath, buffer);\n this.writtenScreenshots.add(screenshot.id);\n screenshot.markPersistedToPath(\n `./screenshots/${screenshot.id}.${ext}`,\n absolutePath,\n );\n }\n }\n\n // 2. Append dump tag (always — frontend keeps only last per execution id)\n const singleDump = this.wrapAsGroupedDump(execution, groupMeta);\n const serialized = singleDump.serialize();\n const dumpAttributes: Record<string, string> = {\n 'data-group-id': this.reportStreamId,\n };\n\n if (!this.initialized) {\n writeFileSync(\n this.reportPath,\n `${getReportTpl()}${getBaseUrlFixScript()}`,\n );\n this.initialized = true;\n }\n\n appendFileSync(\n this.reportPath,\n `\\n${generateDumpScriptTag(serialized, dumpAttributes)}`,\n );\n }\n}\n","import { getMidsceneLocationSchema } from '@/common';\nimport type {\n ActionScrollParam,\n DeviceAction,\n LocateResultElement,\n} from '@/types';\nimport type { IModelConfig } from '@midscene/shared/env';\nimport type { ElementNode } from '@midscene/shared/extractor';\nimport { getDebug } from '@midscene/shared/logger';\nimport { _keyDefinitions } from '@midscene/shared/us-keyboard-layout';\nimport { z } from 'zod';\nimport type { ElementCacheFeature, Rect, Size, UIContext } from '../types';\n\nexport interface FileChooserHandler {\n accept(files: string[]): Promise<void>;\n}\n\nexport abstract class AbstractInterface {\n abstract interfaceType: string;\n\n abstract screenshotBase64(): Promise<string>;\n abstract size(): Promise<Size>;\n abstract actionSpace(): DeviceAction[];\n\n abstract cacheFeatureForPoint?(\n center: [number, number],\n options?: {\n targetDescription?: string;\n modelConfig?: IModelConfig;\n },\n ): Promise<ElementCacheFeature>;\n abstract rectMatchesCacheFeature?(\n feature: ElementCacheFeature,\n ): Promise<Rect>;\n\n abstract destroy?(): Promise<void>;\n\n abstract describe?(): string;\n abstract beforeInvokeAction?(actionName: string, param: any): Promise<void>;\n abstract afterInvokeAction?(actionName: string, param: any): Promise<void>;\n\n // for web only\n registerFileChooserListener?(\n handler: (chooser: FileChooserHandler) => Promise<void>,\n ): Promise<{ dispose: () => void; getError: () => Error | undefined }>;\n\n // @deprecated do NOT extend this method\n abstract getElementsNodeTree?: () => Promise<ElementNode>;\n\n // @deprecated do NOT extend this method\n abstract url?: () => string | Promise<string>;\n\n // @deprecated do NOT extend this method\n abstract evaluateJavaScript?<T = any>(script: string): Promise<T>;\n\n /**\n * Get the current time from the device.\n * Returns the device's current timestamp in milliseconds.\n * This is useful when the system time and device time are not synchronized.\n */\n getTimestamp?(): Promise<number>;\n\n /** URL of native MJPEG stream for real-time screen preview (e.g. WDA MJPEG server) */\n mjpegStreamUrl?: string;\n}\n\n// Generic function to define actions with proper type inference\n// TRuntime allows specifying a different type for the runtime parameter (after location resolution)\n// TReturn allows specifying the return type of the action\nexport const defineAction = <\n TSchema extends z.ZodType | undefined = undefined,\n TRuntime = TSchema extends z.ZodType ? z.infer<TSchema> : undefined,\n TReturn = any,\n>(\n config: {\n name: string;\n description: string;\n interfaceAlias?: string;\n paramSchema?: TSchema;\n call: (param: TRuntime) => Promise<TReturn> | TReturn;\n } & Partial<\n Omit<\n DeviceAction<TRuntime, TReturn>,\n 'name' | 'description' | 'interfaceAlias' | 'paramSchema' | 'call'\n >\n >,\n): DeviceAction<TRuntime, TReturn> => {\n return config as any; // Type assertion needed because schema validation type differs from runtime type\n};\n\n// Tap\nexport const actionTapParamSchema = z.object({\n locate: getMidsceneLocationSchema().describe('The element to be tapped'),\n});\nexport type ActionTapParam = {\n locate: LocateResultElement;\n};\n\nexport const defineActionTap = (\n call: (param: ActionTapParam) => Promise<void>,\n): DeviceAction<ActionTapParam> => {\n return defineAction<typeof actionTapParamSchema, ActionTapParam>({\n name: 'Tap',\n description: 'Tap the element',\n interfaceAlias: 'aiTap',\n paramSchema: actionTapParamSchema,\n sample: {\n locate: { prompt: 'the \"Submit\" button' },\n },\n call,\n });\n};\n\n// RightClick\nexport const actionRightClickParamSchema = z.object({\n locate: getMidsceneLocationSchema().describe(\n 'The element to be right clicked',\n ),\n});\nexport type ActionRightClickParam = {\n locate: LocateResultElement;\n};\n\nexport const defineActionRightClick = (\n call: (param: ActionRightClickParam) => Promise<void>,\n): DeviceAction<ActionRightClickParam> => {\n return defineAction<\n typeof actionRightClickParamSchema,\n ActionRightClickParam\n >({\n name: 'RightClick',\n description: 'Right click the element',\n interfaceAlias: 'aiRightClick',\n paramSchema: actionRightClickParamSchema,\n sample: {\n locate: { prompt: 'the file icon on the desktop' },\n },\n call,\n });\n};\n\n// DoubleClick\nexport const actionDoubleClickParamSchema = z.object({\n locate: getMidsceneLocationSchema().describe(\n 'The element to be double clicked',\n ),\n});\nexport type ActionDoubleClickParam = {\n locate: LocateResultElement;\n};\n\nexport const defineActionDoubleClick = (\n call: (param: ActionDoubleClickParam) => Promise<void>,\n): DeviceAction<ActionDoubleClickParam> => {\n return defineAction<\n typeof actionDoubleClickParamSchema,\n ActionDoubleClickParam\n >({\n name: 'DoubleClick',\n description: 'Double click the element',\n interfaceAlias: 'aiDoubleClick',\n paramSchema: actionDoubleClickParamSchema,\n sample: {\n locate: { prompt: 'the folder icon' },\n },\n call,\n });\n};\n\n// Hover\nexport const actionHoverParamSchema = z.object({\n locate: getMidsceneLocationSchema().describe('The element to be hovered'),\n});\nexport type ActionHoverParam = {\n locate: LocateResultElement;\n};\n\nexport const defineActionHover = (\n call: (param: ActionHoverParam) => Promise<void>,\n): DeviceAction<ActionHoverParam> => {\n return defineAction<typeof actionHoverParamSchema, ActionHoverParam>({\n name: 'Hover',\n description: 'Move the mouse to the element',\n interfaceAlias: 'aiHover',\n paramSchema: actionHoverParamSchema,\n sample: {\n locate: { prompt: 'the navigation menu item \"Products\"' },\n },\n call,\n });\n};\n\n// Input\nconst inputLocateDescription =\n 'the position of the placeholder or text content in the target input field. If there is no content, locate the center of the input field.';\nexport const actionInputParamSchema = z.object({\n value: z\n .union([z.string(), z.number()])\n .transform((val) => String(val))\n .describe(\n 'The text to input. Provide the final content for replace/append modes, or an empty string when using clear mode to remove existing text.',\n ),\n locate: getMidsceneLocationSchema()\n .describe(inputLocateDescription)\n .optional(),\n mode: z\n .enum(['replace', 'clear', 'typeOnly'])\n .default('replace')\n .describe(\n 'Input mode: \"replace\" (default) - clear the field and input the value; \"typeOnly\" - type the value directly without clearing the field first; \"clear\" - clear the field without inputting new text.',\n ),\n});\nexport type ActionInputParam = {\n value: string;\n locate?: LocateResultElement;\n mode?: 'replace' | 'clear' | 'typeOnly' | 'append';\n};\n\nexport const defineActionInput = (\n call: (param: ActionInputParam) => Promise<void>,\n): DeviceAction<ActionInputParam> => {\n return defineAction<typeof actionInputParamSchema, ActionInputParam>({\n name: 'Input',\n description: 'Input the value into the element',\n interfaceAlias: 'aiInput',\n paramSchema: actionInputParamSchema,\n sample: {\n value: 'test@example.com',\n locate: { prompt: 'the email input field' },\n },\n call: (param) => {\n // backward compat: convert deprecated 'append' to 'typeOnly'\n if ((param.mode as string) === 'append') {\n param.mode = 'typeOnly';\n }\n return call(param);\n },\n });\n};\n\n// KeyboardPress\nexport const actionKeyboardPressParamSchema = z.object({\n locate: getMidsceneLocationSchema()\n .describe('The element to be clicked before pressing the key')\n .optional(),\n keyName: z\n .string()\n .describe(\n \"The key to be pressed. Use '+' for key combinations, e.g., 'Control+A', 'Shift+Enter'\",\n ),\n});\nexport type ActionKeyboardPressParam = {\n locate?: LocateResultElement;\n keyName: string;\n};\n\nexport const defineActionKeyboardPress = (\n call: (param: ActionKeyboardPressParam) => Promise<void>,\n): DeviceAction<ActionKeyboardPressParam> => {\n return defineAction<\n typeof actionKeyboardPressParamSchema,\n ActionKeyboardPressParam\n >({\n name: 'KeyboardPress',\n description:\n 'Press a key or key combination, like \"Enter\", \"Tab\", \"Escape\", or \"Control+A\", \"Shift+Enter\". Do not use this to type text.',\n interfaceAlias: 'aiKeyboardPress',\n paramSchema: actionKeyboardPressParamSchema,\n sample: {\n keyName: 'Enter',\n },\n call,\n });\n};\n\n// Scroll\nexport const actionScrollParamSchema = z.object({\n scrollType: z\n .enum([\n 'singleAction',\n 'scrollToBottom',\n 'scrollToTop',\n 'scrollToRight',\n 'scrollToLeft',\n ])\n .default('singleAction')\n .describe(\n 'The scroll behavior: \"singleAction\" for a single scroll action, \"scrollToBottom\" for scrolling all the way to the bottom by rapidly scrolling 5-10 times (skipping intermediate content until reaching the bottom), \"scrollToTop\" for scrolling all the way to the top by rapidly scrolling 5-10 times (skipping intermediate content until reaching the top), \"scrollToRight\" for scrolling all the way to the right by rapidly scrolling multiple times, \"scrollToLeft\" for scrolling all the way to the left by rapidly scrolling multiple times',\n ),\n direction: z\n .enum(['down', 'up', 'right', 'left'])\n .default('down')\n .describe(\n 'The direction to scroll. Only effective when scrollType is \"singleAction\".',\n ),\n distance: z\n .number()\n .nullable()\n .optional()\n .describe('The distance in pixels to scroll'),\n locate: getMidsceneLocationSchema()\n .optional()\n .describe(\n 'Describe the target element to be scrolled on, like \"the table\" or \"the list\" or \"the content area\" or \"the scrollable area\". Do NOT provide a general intent like \"scroll to find some element\"',\n ),\n});\n\nexport const defineActionScroll = (\n call: (param: ActionScrollParam) => Promise<void>,\n): DeviceAction<ActionScrollParam> => {\n return defineAction<typeof actionScrollParamSchema, ActionScrollParam>({\n name: 'Scroll',\n description:\n 'Scroll the page or a scrollable element to browse content. This is the preferred way to scroll on all platforms, including mobile. Supports scrollToBottom/scrollToTop for boundary navigation. Default: direction `down`, scrollType `singleAction`, distance `null`.',\n interfaceAlias: 'aiScroll',\n paramSchema: actionScrollParamSchema,\n sample: {\n direction: 'down',\n scrollType: 'singleAction',\n locate: { prompt: 'the center of the product list area' },\n },\n call,\n });\n};\n\n// DragAndDrop\nexport const actionDragAndDropParamSchema = z.object({\n from: getMidsceneLocationSchema().describe('The position to be dragged'),\n to: getMidsceneLocationSchema().describe('The position to be dropped'),\n});\nexport type ActionDragAndDropParam = {\n from: LocateResultElement;\n to: LocateResultElement;\n};\n\nexport const defineActionDragAndDrop = (\n call: (param: ActionDragAndDropParam) => Promise<void>,\n): DeviceAction<ActionDragAndDropParam> => {\n return defineAction<\n typeof actionDragAndDropParamSchema,\n ActionDragAndDropParam\n >({\n name: 'DragAndDrop',\n description:\n 'Pick up a specific UI element and move it to a new position (e.g., reorder a card, move a file into a folder, sort list items). The element itself moves with your finger/mouse.',\n interfaceAlias: 'aiDragAndDrop',\n paramSchema: actionDragAndDropParamSchema,\n sample: {\n from: { prompt: 'the \"report.pdf\" file icon' },\n to: { prompt: 'the upload drop zone' },\n },\n call,\n });\n};\n\nexport const ActionLongPressParamSchema = z.object({\n locate: getMidsceneLocationSchema().describe(\n 'The element to be long pressed',\n ),\n duration: z\n .number()\n .default(500)\n .optional()\n .describe('Long press duration in milliseconds'),\n});\n\nexport type ActionLongPressParam = {\n locate: LocateResultElement;\n duration?: number;\n};\nexport const defineActionLongPress = (\n call: (param: ActionLongPressParam) => Promise<void>,\n): DeviceAction<ActionLongPressParam> => {\n return defineAction<typeof ActionLongPressParamSchema, ActionLongPressParam>({\n name: 'LongPress',\n description: 'Long press the element',\n paramSchema: ActionLongPressParamSchema,\n sample: {\n locate: { prompt: 'the message bubble' },\n },\n call,\n });\n};\n\nexport const ActionSwipeParamSchema = z.object({\n start: getMidsceneLocationSchema()\n .optional()\n .describe(\n 'Starting point of the swipe gesture, if not specified, the center of the page will be used',\n ),\n direction: z\n .enum(['up', 'down', 'left', 'right'])\n .optional()\n .describe(\n 'The direction to swipe (required when using distance). The direction means the direction of the finger swipe.',\n ),\n distance: z\n .number()\n .optional()\n .describe('The distance in pixels to swipe (mutually exclusive with end)'),\n end: getMidsceneLocationSchema()\n .optional()\n .describe(\n 'Ending point of the swipe gesture (mutually exclusive with distance)',\n ),\n duration: z\n .number()\n .default(300)\n .describe('Duration of the swipe gesture in milliseconds'),\n repeat: z\n .number()\n .optional()\n .describe(\n 'The number of times to repeat the swipe gesture. 1 for default, 0 for infinite (e.g. endless swipe until the end of the page)',\n ),\n});\n\nexport type ActionSwipeParam = {\n start?: LocateResultElement;\n direction?: 'up' | 'down' | 'left' | 'right';\n distance?: number;\n end?: LocateResultElement;\n duration?: number;\n repeat?: number;\n};\n\nexport function normalizeMobileSwipeParam(\n param: ActionSwipeParam,\n screenSize: { width: number; height: number },\n): {\n startPoint: { x: number; y: number };\n endPoint: { x: number; y: number };\n duration: number;\n repeatCount: number;\n} {\n const { width, height } = screenSize;\n const { start, end } = param;\n\n const startPoint = start\n ? { x: start.center[0], y: start.center[1] }\n : { x: width / 2, y: height / 2 };\n\n let endPoint: { x: number; y: number };\n\n if (end) {\n endPoint = { x: end.center[0], y: end.center[1] };\n } else if (param.distance) {\n const direction = param.direction;\n if (!direction) {\n throw new Error('direction is required for swipe gesture');\n }\n endPoint = {\n x:\n startPoint.x +\n (direction === 'right'\n ? param.distance\n : direction === 'left'\n ? -param.distance\n : 0),\n y:\n startPoint.y +\n (direction === 'down'\n ? param.distance\n : direction === 'up'\n ? -param.distance\n : 0),\n };\n } else {\n throw new Error(\n 'Either end or distance must be specified for swipe gesture',\n );\n }\n\n endPoint.x = Math.max(0, Math.min(endPoint.x, width));\n endPoint.y = Math.max(0, Math.min(endPoint.y, height));\n\n const duration = param.duration ?? 300;\n\n let repeatCount = typeof param.repeat === 'number' ? param.repeat : 1;\n if (repeatCount === 0) {\n repeatCount = 10;\n }\n\n return { startPoint, endPoint, duration, repeatCount };\n}\n\nexport const defineActionSwipe = (\n call: (param: ActionSwipeParam) => Promise<void>,\n): DeviceAction<ActionSwipeParam> => {\n return defineAction<typeof ActionSwipeParamSchema, ActionSwipeParam>({\n name: 'Swipe',\n description:\n 'Perform a touch gesture for interactions beyond regular scrolling (e.g., flip pages in a carousel, dismiss a notification, swipe-to-delete a list item). For regular content scrolling, use Scroll instead. Use \"distance\" + \"direction\" for relative movement, or \"end\" for precise endpoint.',\n paramSchema: ActionSwipeParamSchema,\n sample: {\n start: { prompt: 'center of the notification' },\n end: { prompt: 'upper edge of the screen' },\n },\n call,\n });\n};\n\n// ClearInput\nexport const actionClearInputParamSchema = z.object({\n locate: getMidsceneLocationSchema()\n .describe('The input field to be cleared')\n .optional(),\n});\nexport type ActionClearInputParam = {\n locate?: LocateResultElement;\n};\n\nexport const defineActionClearInput = (\n call: (param: ActionClearInputParam) => Promise<void>,\n): DeviceAction<ActionClearInputParam> => {\n return defineAction<\n typeof actionClearInputParamSchema,\n ActionClearInputParam\n >({\n name: 'ClearInput',\n description: inputLocateDescription,\n interfaceAlias: 'aiClearInput',\n paramSchema: actionClearInputParamSchema,\n sample: {\n locate: { prompt: 'the search input field' },\n },\n call,\n });\n};\n\n// CursorMove\nexport const actionCursorMoveParamSchema = z.object({\n direction: z\n .enum(['left', 'right'])\n .describe('The direction to move the cursor'),\n times: z\n .number()\n .int()\n .min(1)\n .default(1)\n .describe(\n 'The number of times to move the cursor in the specified direction',\n ),\n});\nexport type ActionCursorMoveParam = {\n direction: 'left' | 'right';\n times?: number;\n};\n\nexport const defineActionCursorMove = (\n call: (param: ActionCursorMoveParam) => Promise<void>,\n): DeviceAction<ActionCursorMoveParam> => {\n return defineAction<\n typeof actionCursorMoveParamSchema,\n ActionCursorMoveParam\n >({\n name: 'CursorMove',\n description:\n 'Move the text cursor (caret) left or right within an input field or text area. Use this to reposition the cursor without selecting text.',\n paramSchema: actionCursorMoveParamSchema,\n sample: {\n direction: 'left',\n times: 3,\n },\n call,\n });\n};\n\n// Pinch\nexport const ActionPinchParamSchema = z.object({\n locate: getMidsceneLocationSchema()\n .optional()\n .describe(\n 'The element to pinch on. If not specified, the center of the screen will be used',\n ),\n direction: z\n .enum(['in', 'out'])\n .describe(\n 'Pinch direction. \"in\" = pinch fingers together (zoom out / shrink), \"out\" = spread fingers apart (zoom in / enlarge).',\n ),\n distance: z\n .number()\n .positive()\n .optional()\n .describe(\n 'How far each finger moves in pixels. Defaults to a quarter of the shorter screen dimension.',\n ),\n duration: z\n .number()\n .default(500)\n .optional()\n .describe('Duration of the pinch gesture in milliseconds'),\n});\n\nexport type ActionPinchParam = {\n locate?: LocateResultElement;\n direction: 'in' | 'out';\n distance?: number;\n duration?: number;\n};\n\nexport const defineActionPinch = (\n call: (param: ActionPinchParam) => Promise<void>,\n): DeviceAction<ActionPinchParam> => {\n return defineAction<typeof ActionPinchParamSchema, ActionPinchParam>({\n name: 'Pinch',\n description:\n 'Perform a two-finger pinch gesture. Use direction \"in\" to pinch fingers together (zoom out), or \"out\" to spread fingers apart (zoom in). Optionally specify distance for how far each finger moves.',\n interfaceAlias: 'aiPinch',\n paramSchema: ActionPinchParamSchema,\n sample: {\n locate: { prompt: 'the map area' },\n direction: 'out',\n distance: 200,\n },\n call,\n });\n};\n\nexport function normalizePinchParam(\n param: ActionPinchParam,\n screenSize: { width: number; height: number },\n): {\n centerX: number;\n centerY: number;\n startDistance: number;\n endDistance: number;\n duration: number;\n} {\n const { width, height } = screenSize;\n const element = param.locate;\n const centerX = element\n ? Math.round(element.center[0])\n : Math.round(width / 2);\n const centerY = element\n ? Math.round(element.center[1])\n : Math.round(height / 2);\n const duration = param.duration ?? 500;\n\n const baseDistance = Math.round(Math.min(width, height) / 4);\n const fingerDistance = param.distance ?? baseDistance;\n\n const startDistance = baseDistance;\n const endDistance =\n param.direction === 'out'\n ? baseDistance + fingerDistance\n : Math.max(10, baseDistance - fingerDistance);\n\n return { centerX, centerY, startDistance, endDistance, duration };\n}\n\n// Sleep\nexport const ActionSleepParamSchema = z.object({\n timeMs: z\n .number()\n .default(1000)\n .optional()\n .describe('Sleep duration in milliseconds, defaults to 1000ms (1 second)'),\n});\n\nexport type ActionSleepParam = {\n timeMs?: number;\n};\n\nexport const defineActionSleep = (): DeviceAction<ActionSleepParam> => {\n return defineAction<typeof ActionSleepParamSchema, ActionSleepParam>({\n name: 'Sleep',\n description:\n 'Wait for a specified duration before continuing. Defaults to 1 second (1000ms) if not specified.',\n paramSchema: ActionSleepParamSchema,\n sample: {\n timeMs: 2000,\n },\n call: async (param) => {\n const duration = param?.timeMs ?? 1000;\n getDebug('device:common-action')(`Sleeping for ${duration}ms`);\n await new Promise((resolve) => setTimeout(resolve, duration));\n },\n });\n};\n\nexport type { DeviceAction } from '../types';\nexport type {\n AndroidDeviceOpt,\n AndroidDeviceInputOpt,\n IOSDeviceOpt,\n IOSDeviceInputOpt,\n HarmonyDeviceOpt,\n HarmonyDeviceInputOpt,\n} from './device-options';\n","import node_assert from \"node:assert\";\nimport get_photon from \"./get-photon.mjs\";\nasync function imageInfoOfBase64(imageBase64) {\n const { PhotonImage } = await get_photon();\n const base64Data = imageBase64.replace(/^data:image\\/\\w+;base64,/, '');\n const result = PhotonImage.new_from_base64(base64Data);\n const image = result instanceof Promise ? await result : result;\n const width = image.get_width();\n const height = image.get_height();\n image.free();\n node_assert(width && height, 'Invalid image: cannot get width or height');\n return {\n width,\n height\n };\n}\nfunction isValidPNGImageBuffer(buffer) {\n if (!buffer || buffer.length < 8) return false;\n const isPNG = 0x89 === buffer[0] && 0x50 === buffer[1] && 0x4e === buffer[2] && 0x47 === buffer[3] && 0x0d === buffer[4] && 0x0a === buffer[5] && 0x1a === buffer[6] && 0x0a === buffer[7];\n return isPNG;\n}\nfunction isValidJPEGImageBuffer(buffer) {\n if (!buffer || buffer.length < 3) return false;\n return 0xff === buffer[0] && 0xd8 === buffer[1] && 0xff === buffer[2];\n}\nfunction isValidImageBuffer(buffer) {\n return isValidPNGImageBuffer(buffer) || isValidJPEGImageBuffer(buffer);\n}\nexport { imageInfoOfBase64, isValidImageBuffer, isValidJPEGImageBuffer, isValidPNGImageBuffer };\n","import type { TMultimodalPrompt, TUserPrompt } from '@/common';\nimport type { AbstractInterface } from '@/device';\nimport { ScreenshotItem } from '@/screenshot-item';\nimport type {\n ElementCacheFeature,\n LocateResultElement,\n PlanningLocateParam,\n Rect,\n UIContext,\n} from '@/types';\nimport { uploadTestInfoToServer } from '@/utils';\nimport type { TModelFamily } from '@midscene/shared/env';\nimport {\n MIDSCENE_REPORT_QUIET,\n MIDSCENE_REPORT_TAG_NAME,\n globalConfigManager,\n} from '@midscene/shared/env';\nimport { generateElementByRect } from '@midscene/shared/extractor';\nimport { imageInfoOfBase64, resizeImgBase64 } from '@midscene/shared/img';\nimport { getDebug } from '@midscene/shared/logger';\nimport { _keyDefinitions } from '@midscene/shared/us-keyboard-layout';\nimport { assert, logMsg, uuid } from '@midscene/shared/utils';\nimport dayjs from 'dayjs';\nimport type { TaskCache } from './task-cache';\nimport { debug as cacheDebug } from './task-cache';\n\nexport async function commonContextParser(\n interfaceInstance: AbstractInterface,\n _opt: {\n uploadServerUrl?: string;\n screenshotShrinkFactor?: number;\n modelFamily?: TModelFamily;\n },\n): Promise<UIContext> {\n const debug = getDebug('commonContextParser');\n\n assert(interfaceInstance, 'interfaceInstance is required');\n\n debug('Getting interface description');\n const description = interfaceInstance.describe?.() || '';\n debug('Interface description end');\n\n debug('Uploading test info to server');\n uploadTestInfoToServer({\n testUrl: description,\n serverUrl: _opt.uploadServerUrl,\n });\n debug('UploadTestInfoToServer end');\n\n debug('will get size');\n const interfaceSize = await interfaceInstance.size();\n const { width: logicalWidth, height: logicalHeight } = interfaceSize;\n\n if ((interfaceSize as unknown as { dpr: number }).dpr) {\n console.warn(\n 'Warning: return value of interface.size() include a dpr property, which is not expected and ignored. ',\n );\n }\n\n if (!Number.isFinite(logicalWidth) || !Number.isFinite(logicalHeight)) {\n throw new Error(\n `Invalid interface size: width and height must be finite numbers. Received width: ${logicalWidth}, height: ${logicalHeight}`,\n );\n }\n\n if (logicalWidth <= 0 || logicalHeight <= 0) {\n throw new Error(\n `Invalid interface size: width and height must be positive numbers. Received width: ${logicalWidth}, height: ${logicalHeight}`,\n );\n }\n\n debug(`size: ${logicalWidth}x${logicalHeight}`);\n\n const screenshotBase64 = await interfaceInstance.screenshotBase64();\n const screenshotCapturedAt = Date.now();\n assert(screenshotBase64!, 'screenshotBase64 is required');\n\n // Get physical screenshot dimensions\n debug('will get screenshot dimensions');\n const { width: imgWidth, height: imgHeight } =\n await imageInfoOfBase64(screenshotBase64);\n\n if (!Number.isFinite(imgWidth) || !Number.isFinite(imgHeight)) {\n throw new Error(\n `Invalid screenshot dimensions: width and height must be finite numbers. Received width: ${imgWidth}, height: ${imgHeight}`,\n );\n }\n if (imgWidth <= 0 || imgHeight <= 0) {\n throw new Error(\n `Invalid screenshot dimensions: width and height must be positive numbers. Received width: ${imgWidth}, height: ${imgHeight}`,\n );\n }\n debug('screenshot dimensions', imgWidth, 'x', imgHeight);\n\n // Detect orientation mismatch between logical size and screenshot.\n // Some devices (e.g. OPPO) report wrong orientation via ADB, causing\n // size() to return portrait dimensions even when the device is landscape.\n // We detect this by comparing aspect ratios and swap if they disagree.\n const logicalIsPortrait = logicalWidth < logicalHeight;\n const screenshotIsPortrait = imgWidth < imgHeight;\n let finalLogicalWidth = logicalWidth;\n let finalLogicalHeight = logicalHeight;\n if (logicalIsPortrait !== screenshotIsPortrait) {\n debug(\n `Orientation mismatch detected: logical size ${logicalWidth}x${logicalHeight} (${logicalIsPortrait ? 'portrait' : 'landscape'}) vs screenshot ${imgWidth}x${imgHeight} (${screenshotIsPortrait ? 'portrait' : 'landscape'}). Swapping logical dimensions.`,\n );\n finalLogicalWidth = logicalHeight;\n finalLogicalHeight = logicalWidth;\n }\n\n const userShrinkFactor = _opt.screenshotShrinkFactor ?? 1;\n\n if (!Number.isFinite(userShrinkFactor) || userShrinkFactor < 1) {\n throw new Error(\n `Invalid screenshotShrinkFactor: must be a finite number >= 1. Received: ${userShrinkFactor}`,\n );\n }\n\n const dpr = imgWidth / finalLogicalWidth;\n\n debug('calculated dpr:', dpr);\n\n const shrunkShotToLogicalRatio = dpr / userShrinkFactor;\n\n debug('shrunkShotToLogicalRatio', shrunkShotToLogicalRatio);\n\n if (userShrinkFactor !== 1) {\n const targetWidth = Math.round(imgWidth / userShrinkFactor);\n const targetHeight = Math.round(imgHeight / userShrinkFactor);\n\n debug(\n `Applying screenshot shrink factor: ${userShrinkFactor} (physical: ${imgWidth}x${imgHeight} -> target: ${targetWidth}x${targetHeight})`,\n );\n\n const resizedBase64 = await resizeImgBase64(screenshotBase64, {\n width: targetWidth,\n height: targetHeight,\n });\n return {\n shotSize: {\n width: targetWidth,\n height: targetHeight,\n },\n deprecatedDpr: dpr,\n screenshot: ScreenshotItem.create(resizedBase64, screenshotCapturedAt),\n shrunkShotToLogicalRatio,\n };\n }\n\n return {\n shotSize: {\n width: imgWidth,\n height: imgHeight,\n },\n deprecatedDpr: dpr,\n screenshot: ScreenshotItem.create(screenshotBase64, screenshotCapturedAt),\n shrunkShotToLogicalRatio,\n };\n}\n\nexport function getReportFileName(tag = 'web') {\n const reportTagName = globalConfigManager.getEnvConfigValue(\n MIDSCENE_REPORT_TAG_NAME,\n );\n const dateTimeInFileName = dayjs().format('YYYY-MM-DD_HH-mm-ss');\n // ensure uniqueness at the same time\n const uniqueId = uuid().substring(0, 8);\n return `${reportTagName || tag}-${dateTimeInFileName}-${uniqueId}`;\n}\n\nexport function printReportMsg(filepath: string) {\n if (globalConfigManager.getEnvConfigInBoolean(MIDSCENE_REPORT_QUIET)) {\n return;\n }\n logMsg(`Midscene - report file updated: ${filepath}`);\n}\n\n/**\n * Get the current execution file name\n * @returns The name of the current execution file\n */\nexport function getCurrentExecutionFile(trace?: string): string | false {\n const error = new Error();\n const stackTrace = trace || error.stack;\n const pkgDir = process.cwd() || '';\n if (stackTrace) {\n const stackLines = stackTrace.split('\\n');\n for (const line of stackLines) {\n if (\n line.includes('.spec.') ||\n line.includes('.test.') ||\n line.includes('.ts') ||\n line.includes('.js')\n ) {\n const match = line.match(/(?:at\\s+)?(.*?\\.(?:spec|test)\\.[jt]s)/);\n if (match?.[1]) {\n const targetFileName = match[1]\n .replace(pkgDir, '')\n .trim()\n .replace('at ', '');\n return targetFileName;\n }\n }\n }\n }\n return false;\n}\n\nconst testFileIndex = new Map<string, number>();\n\nexport function generateCacheId(fileName?: string): string {\n let taskFile = fileName || getCurrentExecutionFile();\n if (!taskFile) {\n taskFile = uuid();\n console.warn(\n 'Midscene - using random UUID for cache id. Cache may be invalid.',\n );\n }\n\n if (testFileIndex.has(taskFile)) {\n const currentIndex = testFileIndex.get(taskFile);\n if (currentIndex !== undefined) {\n testFileIndex.set(taskFile, currentIndex + 1);\n }\n } else {\n testFileIndex.set(taskFile, 1);\n }\n return `${taskFile}-${testFileIndex.get(taskFile)}`;\n}\n\nexport function ifPlanLocateParamIsBbox(\n planLocateParam: PlanningLocateParam,\n): boolean {\n return !!(\n planLocateParam.bbox &&\n Array.isArray(planLocateParam.bbox) &&\n planLocateParam.bbox.length === 4\n );\n}\n\nexport function matchElementFromPlan(\n planLocateParam: PlanningLocateParam,\n): LocateResultElement | undefined {\n if (!planLocateParam) {\n return undefined;\n }\n\n if (planLocateParam.bbox) {\n // Convert bbox [x1, y1, x2, y2] to rect {left, top, width, height}\n const rect = {\n left: planLocateParam.bbox[0],\n top: planLocateParam.bbox[1],\n width: planLocateParam.bbox[2] - planLocateParam.bbox[0] + 1,\n height: planLocateParam.bbox[3] - planLocateParam.bbox[1] + 1,\n };\n\n const element = generateElementByRect(\n rect,\n typeof planLocateParam.prompt === 'string'\n ? planLocateParam.prompt\n : planLocateParam.prompt?.prompt || '',\n );\n return element;\n }\n\n return undefined;\n}\n\nexport async function matchElementFromCache(\n context: {\n taskCache?: TaskCache;\n interfaceInstance: AbstractInterface;\n },\n cacheEntry: ElementCacheFeature | undefined,\n cachePrompt: TUserPrompt,\n cacheable: boolean | undefined,\n): Promise<LocateResultElement | undefined> {\n if (!cacheEntry) {\n return undefined;\n }\n\n if (cacheable === false) {\n cacheDebug('cache disabled for prompt: %s', cachePrompt);\n return undefined;\n }\n\n if (!context.taskCache?.isCacheResultUsed) {\n return undefined;\n }\n\n if (!context.interfaceInstance.rectMatchesCacheFeature) {\n cacheDebug(\n 'interface does not implement rectMatchesCacheFeature, skip cache',\n );\n return undefined;\n }\n\n try {\n const rect =\n await context.interfaceInstance.rectMatchesCacheFeature(cacheEntry);\n const element: LocateResultElement = {\n center: [\n Math.round(rect.left + rect.width / 2),\n Math.round(rect.top + rect.height / 2),\n ],\n rect,\n description:\n typeof cachePrompt === 'string'\n ? cachePrompt\n : cachePrompt.prompt || '',\n };\n\n cacheDebug('cache hit, prompt: %s', cachePrompt);\n return element;\n } catch (error) {\n cacheDebug('rectMatchesCacheFeature error: %s', error);\n return undefined;\n }\n}\n\ndeclare const __VERSION__: string | undefined;\n\nexport const getMidsceneVersion = (): string => {\n if (typeof __VERSION__ !== 'undefined') {\n return __VERSION__;\n } else if (\n process.env.__VERSION__ &&\n process.env.__VERSION__ !== 'undefined'\n ) {\n return process.env.__VERSION__;\n }\n throw new Error('__VERSION__ inject failed during build');\n};\n\nexport const parsePrompt = (\n prompt: TUserPrompt,\n): {\n textPrompt: string;\n multimodalPrompt?: TMultimodalPrompt;\n} => {\n if (typeof prompt === 'string') {\n return {\n textPrompt: prompt,\n multimodalPrompt: undefined,\n };\n }\n return {\n textPrompt: prompt.prompt,\n multimodalPrompt: prompt.images\n ? {\n images: prompt.images,\n convertHttpImage2Base64: !!prompt.convertHttpImage2Base64,\n }\n : undefined,\n };\n};\n\nexport const transformLogicalElementToScreenshot = (\n element: LocateResultElement,\n shrunkShotToLogicalRatio: number,\n): LocateResultElement => {\n if (shrunkShotToLogicalRatio === 1) {\n return element;\n }\n\n return {\n ...element,\n center: [\n Math.round(element.center[0] * shrunkShotToLogicalRatio),\n Math.round(element.center[1] * shrunkShotToLogicalRatio),\n ],\n rect: {\n ...element.rect,\n left: Math.round(element.rect.left * shrunkShotToLogicalRatio),\n top: Math.round(element.rect.top * shrunkShotToLogicalRatio),\n width: Math.round(element.rect.width * shrunkShotToLogicalRatio),\n height: Math.round(element.rect.height * shrunkShotToLogicalRatio),\n },\n };\n};\n\nexport const transformLogicalRectToScreenshotRect = (\n rect: Rect,\n shrunkShotToLogicalRatio: number,\n): Rect => {\n if (shrunkShotToLogicalRatio === 1) {\n return rect;\n }\n\n return {\n ...rect,\n left: Math.round(rect.left * shrunkShotToLogicalRatio),\n top: Math.round(rect.top * shrunkShotToLogicalRatio),\n width: Math.round(rect.width * shrunkShotToLogicalRatio),\n height: Math.round(rect.height * shrunkShotToLogicalRatio),\n };\n};\n","import assert from 'node:assert';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { isDeepStrictEqual } from 'node:util';\nimport type { TUserPrompt } from '@/ai-model';\nimport type { ElementCacheFeature } from '@/types';\nimport { getMidsceneRunSubDir } from '@midscene/shared/common';\nimport {\n MIDSCENE_CACHE_MAX_FILENAME_LENGTH,\n globalConfigManager,\n} from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { ifInBrowser, ifInWorker } from '@midscene/shared/utils';\nimport { generateHashId } from '@midscene/shared/utils';\nimport { replaceIllegalPathCharsAndSpace } from '@midscene/shared/utils';\nimport yaml from 'js-yaml';\nimport semver from 'semver';\nimport { getMidsceneVersion } from './utils';\n\nconst DEFAULT_CACHE_MAX_FILENAME_LENGTH = 200;\n\nexport const debug = getDebug('cache');\n\nexport interface PlanningCache {\n type: 'plan';\n prompt: string;\n yamlWorkflow: string;\n}\n\nexport interface LocateCache {\n type: 'locate';\n prompt: TUserPrompt;\n cache?: ElementCacheFeature;\n /** @deprecated kept for backward compatibility */\n xpaths?: string[];\n}\n\nexport interface MatchCacheResult<T extends PlanningCache | LocateCache> {\n cacheContent: T;\n cacheUsable: boolean;\n updateFn: (cb: (cache: T) => void) => void;\n}\n\nexport type CacheFileContent = {\n midsceneVersion: string;\n cacheId: string;\n caches: Array<PlanningCache | LocateCache>;\n};\n\nconst lowestSupportedMidsceneVersion = '0.16.10';\nexport const cacheFileExt = '.cache.yaml';\n\nexport class TaskCache {\n cacheId: string;\n\n cacheFilePath?: string;\n\n cache: CacheFileContent;\n\n isCacheResultUsed: boolean; // a flag to indicate if the cache result should be used\n cacheOriginalLength: number;\n\n readOnlyMode: boolean; // a flag to indicate if the cache is in read-only mode\n\n writeOnlyMode: boolean; // a flag to indicate if the cache is in write-only mode\n\n private matchedCacheIndices: Set<string> = new Set(); // Track matched records\n\n constructor(\n cacheId: string,\n isCacheResultUsed: boolean,\n cacheFilePath?: string,\n options: { readOnly?: boolean; writeOnly?: boolean } = {},\n ) {\n assert(cacheId, 'cacheId is required');\n let safeCacheId = replaceIllegalPathCharsAndSpace(cacheId);\n const cacheMaxFilenameLength =\n globalConfigManager.getEnvConfigValueAsNumber(\n MIDSCENE_CACHE_MAX_FILENAME_LENGTH,\n ) ?? DEFAULT_CACHE_MAX_FILENAME_LENGTH;\n if (Buffer.byteLength(safeCacheId, 'utf8') > cacheMaxFilenameLength) {\n const prefix = safeCacheId.slice(0, 32);\n const hash = generateHashId(undefined, safeCacheId);\n safeCacheId = `${prefix}-${hash}`;\n }\n this.cacheId = safeCacheId;\n\n this.cacheFilePath =\n ifInBrowser || ifInWorker\n ? undefined\n : cacheFilePath ||\n join(getMidsceneRunSubDir('cache'), `${this.cacheId}${cacheFileExt}`);\n const readOnlyMode = Boolean(options?.readOnly);\n const writeOnlyMode = Boolean(options?.writeOnly);\n\n if (readOnlyMode && writeOnlyMode) {\n throw new Error('TaskCache cannot be both read-only and write-only');\n }\n\n this.isCacheResultUsed = writeOnlyMode ? false : isCacheResultUsed;\n this.readOnlyMode = readOnlyMode;\n this.writeOnlyMode = writeOnlyMode;\n\n let cacheContent;\n if (this.cacheFilePath && !this.writeOnlyMode) {\n cacheContent = this.loadCacheFromFile();\n }\n if (!cacheContent) {\n cacheContent = {\n midsceneVersion: getMidsceneVersion(),\n cacheId: this.cacheId,\n caches: [],\n };\n }\n this.cache = cacheContent;\n this.cacheOriginalLength = this.isCacheResultUsed\n ? this.cache.caches.length\n : 0;\n }\n\n matchCache(\n prompt: TUserPrompt,\n type: 'plan' | 'locate',\n ): MatchCacheResult<PlanningCache | LocateCache> | undefined {\n if (!this.isCacheResultUsed) {\n return undefined;\n }\n // Find the first unused matching cache\n const promptStr =\n typeof prompt === 'string' ? prompt : JSON.stringify(prompt);\n for (let i = 0; i < this.cacheOriginalLength; i++) {\n const item = this.cache.caches[i];\n const key = `${type}:${promptStr}:${i}`;\n if (\n item.type === type &&\n isDeepStrictEqual(item.prompt, prompt) &&\n !this.matchedCacheIndices.has(key)\n ) {\n if (item.type === 'locate') {\n const locateItem = item as LocateCache;\n if (!locateItem.cache && Array.isArray(locateItem.xpaths)) {\n locateItem.cache = { xpaths: locateItem.xpaths };\n }\n if ('xpaths' in locateItem) {\n locateItem.xpaths = undefined;\n }\n }\n this.matchedCacheIndices.add(key);\n debug(\n 'cache found and marked as used, type: %s, prompt: %s, index: %d',\n type,\n prompt,\n i,\n );\n return {\n cacheContent: item,\n cacheUsable: true,\n updateFn: (cb: (cache: PlanningCache | LocateCache) => void) => {\n debug(\n 'will call updateFn to update cache, type: %s, prompt: %s, index: %d',\n type,\n prompt,\n i,\n );\n cb(item);\n\n if (this.readOnlyMode) {\n debug(\n 'read-only mode, cache updated in memory but not flushed to file',\n );\n return;\n }\n\n debug(\n 'cache updated, will flush to file, type: %s, prompt: %s, index: %d',\n type,\n prompt,\n i,\n );\n this.flushCacheToFile();\n },\n };\n }\n }\n debug('no unused cache found, type: %s, prompt: %s', type, prompt);\n return undefined;\n }\n\n matchPlanCache(prompt: string): MatchCacheResult<PlanningCache> | undefined {\n const result = this.matchCache(prompt, 'plan') as\n | MatchCacheResult<PlanningCache>\n | undefined;\n if (!result) return undefined;\n // Guard against stale cache files written before the write-side fix\n const yamlWorkflow = result.cacheContent.yamlWorkflow;\n if (!yamlWorkflow?.trim()) {\n debug(\n 'plan cache matched but yamlWorkflow is empty, treat as cache miss',\n );\n return {\n ...result,\n cacheUsable: false,\n };\n }\n try {\n const parsed = yaml.load(yamlWorkflow) as any;\n const hasNonEmptyFlow = parsed?.tasks?.some(\n (task: any) => Array.isArray(task.flow) && task.flow.length > 0,\n );\n if (!hasNonEmptyFlow) {\n debug('plan cache matched but flow is empty, treat as cache miss');\n return {\n ...result,\n cacheUsable: false,\n };\n }\n } catch {\n debug(\n 'plan cache matched but yamlWorkflow is invalid, treat as cache miss',\n );\n return {\n ...result,\n cacheUsable: false,\n };\n }\n return result;\n }\n\n matchLocateCache(\n prompt: TUserPrompt,\n ): MatchCacheResult<LocateCache> | undefined {\n return this.matchCache(prompt, 'locate') as\n | MatchCacheResult<LocateCache>\n | undefined;\n }\n\n appendCache(cache: PlanningCache | LocateCache) {\n debug('will append cache', cache);\n this.cache.caches.push(cache);\n\n if (this.readOnlyMode) {\n debug('read-only mode, cache appended to memory but not flushed to file');\n return;\n }\n\n this.flushCacheToFile();\n }\n\n loadCacheFromFile() {\n const cacheFile = this.cacheFilePath;\n assert(cacheFile, 'cache file path is required');\n\n if (!existsSync(cacheFile)) {\n debug('no cache file found, path: %s', cacheFile);\n return undefined;\n }\n\n // detect old cache file\n const jsonTypeCacheFile = cacheFile.replace(cacheFileExt, '.json');\n if (existsSync(jsonTypeCacheFile) && this.isCacheResultUsed) {\n console.warn(\n `An outdated cache file from an earlier version of Midscene has been detected. Since version 0.17, we have implemented an improved caching strategy. Please delete the old file located at: ${jsonTypeCacheFile}.`,\n );\n return undefined;\n }\n\n try {\n const data = readFileSync(cacheFile, 'utf8');\n const jsonData = yaml.load(data) as CacheFileContent;\n\n const version = getMidsceneVersion();\n if (!version) {\n debug('no midscene version info, will not read cache from file');\n return undefined;\n }\n\n if (\n semver.lt(jsonData.midsceneVersion, lowestSupportedMidsceneVersion) &&\n !jsonData.midsceneVersion.includes('beta') // for internal test\n ) {\n console.warn(\n `You are using an old version of Midscene cache file, and we cannot match any info from it. Starting from Midscene v0.17, we changed our strategy to use xpath for cache info, providing better performance.\\nPlease delete the existing cache and rebuild it. Sorry for the inconvenience.\\ncache file: ${cacheFile}`,\n );\n return undefined;\n }\n\n debug(\n 'cache loaded from file, path: %s, cache version: %s, record length: %s',\n cacheFile,\n jsonData.midsceneVersion,\n jsonData.caches.length,\n );\n jsonData.midsceneVersion = getMidsceneVersion(); // update the version\n return jsonData;\n } catch (err) {\n debug(\n 'cache file exists but load failed, path: %s, error: %s',\n cacheFile,\n err,\n );\n return undefined;\n }\n }\n\n flushCacheToFile(options?: { cleanUnused?: boolean }) {\n const version = getMidsceneVersion();\n if (!version) {\n debug('no midscene version info, will not write cache to file');\n return;\n }\n\n if (!this.cacheFilePath) {\n debug('no cache file path, will not write cache to file');\n return;\n }\n\n // Clean unused caches if requested\n if (options?.cleanUnused) {\n // Skip cleaning in write-only mode or when cache is not used\n if (this.isCacheResultUsed) {\n const originalLength = this.cache.caches.length;\n\n // Collect indices of used caches\n const usedIndices = new Set<number>();\n for (const key of this.matchedCacheIndices) {\n // key format: \"type:prompt:index\"\n const parts = key.split(':');\n const index = Number.parseInt(parts[parts.length - 1], 10);\n if (!Number.isNaN(index)) {\n usedIndices.add(index);\n }\n }\n\n // Filter: keep used caches and newly added caches\n this.cache.caches = this.cache.caches.filter((_, index) => {\n const isUsed = usedIndices.has(index);\n const isNew = index >= this.cacheOriginalLength;\n return isUsed || isNew;\n });\n\n const removedCount = originalLength - this.cache.caches.length;\n if (removedCount > 0) {\n debug('cleaned %d unused cache record(s)', removedCount);\n } else {\n debug('no unused cache to clean');\n }\n } else {\n debug('skip cleaning: cache is not used for reading');\n }\n }\n\n try {\n const dir = dirname(this.cacheFilePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n debug('created cache directory: %s', dir);\n }\n\n // Sort caches to ensure plan entries come before locate entries for better readability\n // Create a sorted copy for writing to disk while keeping in-memory order unchanged\n const sortedCaches = [...this.cache.caches].sort((a, b) => {\n if (a.type === 'plan' && b.type === 'locate') return -1;\n if (a.type === 'locate' && b.type === 'plan') return 1;\n return 0;\n });\n\n const cacheToWrite = {\n ...this.cache,\n caches: sortedCaches,\n };\n\n const yamlData = yaml.dump(cacheToWrite, { lineWidth: -1 });\n writeFileSync(this.cacheFilePath, yamlData);\n debug('cache flushed to file: %s', this.cacheFilePath);\n } catch (err) {\n debug(\n 'write cache to file failed, path: %s, error: %s',\n this.cacheFilePath,\n err,\n );\n }\n }\n\n updateOrAppendCacheRecord(\n newRecord: PlanningCache | LocateCache,\n cachedRecord?: MatchCacheResult<PlanningCache | LocateCache>,\n ) {\n if (cachedRecord) {\n // update existing record\n if (newRecord.type === 'plan') {\n cachedRecord.updateFn((cache) => {\n (cache as PlanningCache).yamlWorkflow = newRecord.yamlWorkflow;\n });\n } else {\n cachedRecord.updateFn((cache) => {\n const locateCache = cache as LocateCache;\n locateCache.cache = newRecord.cache;\n if ('xpaths' in locateCache) {\n locateCache.xpaths = undefined;\n }\n });\n }\n } else {\n this.appendCache(newRecord);\n }\n }\n}\n","import { type TaskExecutionError, TaskRunner } from '@/task-runner';\nimport type {\n ExecutionTaskApply,\n ExecutionTaskProgressOptions,\n UIContext,\n} from '@/types';\n\ntype ExecutionSessionOptions = ExecutionTaskProgressOptions & {\n tasks?: ExecutionTaskApply[];\n onTaskUpdate?: (\n runner: TaskRunner,\n error?: TaskExecutionError,\n ) => Promise<void> | void;\n};\n\n/**\n * Thin wrapper around {@link TaskRunner} that represents a single linear execution run.\n */\nexport class ExecutionSession {\n private readonly runner: TaskRunner;\n\n constructor(\n name: string,\n contextProvider: () => Promise<UIContext>,\n options?: ExecutionSessionOptions,\n ) {\n this.runner = new TaskRunner(name, contextProvider, options);\n }\n\n async append(\n tasks: ExecutionTaskApply[] | ExecutionTaskApply,\n options?: { allowWhenError?: boolean },\n ) {\n await this.runner.append(tasks, options);\n }\n\n async appendAndRun(\n tasks: ExecutionTaskApply[] | ExecutionTaskApply,\n options?: { allowWhenError?: boolean },\n ) {\n return this.runner.appendAndFlush(tasks, options);\n }\n\n async run(options?: { allowWhenError?: boolean }) {\n return this.runner.flush(options);\n }\n\n isInErrorState() {\n return this.runner.isInErrorState();\n }\n\n latestErrorTask() {\n return this.runner.latestErrorTask();\n }\n\n appendErrorPlan(errorMsg: string) {\n return this.runner.appendErrorPlan(errorMsg);\n }\n\n getRunner() {\n return this.runner;\n }\n}\n","import { findAllMidsceneLocatorField, parseActionParam } from '@/ai-model';\nimport type { AbstractInterface } from '@/device';\nimport type Service from '@/service';\nimport { setTimingFieldOnce } from '@/task-timing';\nimport type {\n DetailedLocateParam,\n DeviceAction,\n ElementCacheFeature,\n ExecutionTaskActionApply,\n ExecutionTaskApply,\n ExecutionTaskHitBy,\n ExecutionTaskPlanningLocateApply,\n LocateResultElement,\n LocateResultWithDump,\n PlanningAction,\n PlanningLocateParam,\n Rect,\n ServiceDump,\n} from '@/types';\nimport { ServiceError } from '@/types';\nimport { sleep } from '@/utils';\nimport type { IModelConfig } from '@midscene/shared/env';\nimport { generateElementByRect } from '@midscene/shared/extractor';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport type { TaskCache } from './task-cache';\nimport {\n ifPlanLocateParamIsBbox,\n matchElementFromCache,\n matchElementFromPlan,\n transformLogicalElementToScreenshot,\n transformLogicalRectToScreenshotRect,\n} from './utils';\n\nconst debug = getDebug('agent:task-builder');\n\n/**\n * Check if a cache object is non-empty\n */\nfunction hasNonEmptyCache(cache: unknown): boolean {\n return (\n cache !== null &&\n cache !== undefined &&\n typeof cache === 'object' &&\n Object.keys(cache).length > 0\n );\n}\n\nexport function locatePlanForLocate(param: string | DetailedLocateParam) {\n const locate = typeof param === 'string' ? { prompt: param } : param;\n const locatePlan: PlanningAction<PlanningLocateParam> = {\n type: 'Locate',\n param: locate,\n thought: '',\n };\n return locatePlan;\n}\n\ninterface TaskBuilderDeps {\n interfaceInstance: AbstractInterface;\n service: Service;\n taskCache?: TaskCache;\n actionSpace: DeviceAction[];\n waitAfterAction?: number;\n}\n\ninterface BuildOptions {\n cacheable?: boolean;\n deepLocate?: boolean;\n abortSignal?: AbortSignal;\n}\n\ninterface PlanBuildContext {\n tasks: ExecutionTaskApply[];\n modelConfigForPlanning: IModelConfig;\n modelConfigForDefaultIntent: IModelConfig;\n cacheable?: boolean;\n deepLocate?: boolean;\n abortSignal?: AbortSignal;\n}\n\nexport class TaskBuilder {\n private readonly interface: AbstractInterface;\n\n private readonly service: Service;\n\n private readonly taskCache?: TaskCache;\n\n private readonly actionSpace: DeviceAction[];\n\n private readonly waitAfterAction?: number;\n\n constructor({\n interfaceInstance,\n service,\n taskCache,\n actionSpace,\n waitAfterAction,\n }: TaskBuilderDeps) {\n this.interface = interfaceInstance;\n this.service = service;\n this.taskCache = taskCache;\n this.actionSpace = actionSpace;\n this.waitAfterAction = waitAfterAction;\n }\n\n public async build(\n plans: PlanningAction[],\n modelConfigForPlanning: IModelConfig,\n modelConfigForDefaultIntent: IModelConfig,\n options?: BuildOptions,\n ): Promise<{ tasks: ExecutionTaskApply[] }> {\n const tasks: ExecutionTaskApply[] = [];\n const cacheable = options?.cacheable;\n\n const context: PlanBuildContext = {\n tasks,\n modelConfigForPlanning,\n modelConfigForDefaultIntent,\n cacheable,\n deepLocate: options?.deepLocate,\n abortSignal: options?.abortSignal,\n };\n\n type PlanHandler = (plan: PlanningAction) => Promise<void> | void;\n\n const planHandlers = new Map<string, PlanHandler>([\n [\n 'Locate',\n (plan) =>\n this.handleLocatePlan(\n plan as PlanningAction<PlanningLocateParam>,\n context,\n ),\n ],\n ['Finished', (plan) => this.handleFinishedPlan(plan, context)],\n ]);\n\n const defaultHandler: PlanHandler = (plan) =>\n this.handleActionPlan(plan, context);\n\n for (const plan of plans) {\n const handler = planHandlers.get(plan.type) ?? defaultHandler;\n await handler(plan);\n }\n\n return {\n tasks,\n };\n }\n\n private handleFinishedPlan(\n plan: PlanningAction,\n context: PlanBuildContext,\n ): void {\n const taskActionFinished: ExecutionTaskActionApply<null> = {\n type: 'Action Space',\n subType: 'Finished',\n param: null,\n thought: plan.thought,\n executor: async () => {},\n };\n context.tasks.push(taskActionFinished);\n }\n\n private async handleLocatePlan(\n plan: PlanningAction<PlanningLocateParam>,\n context: PlanBuildContext,\n ): Promise<void> {\n const taskLocate = this.createLocateTask(plan, plan.param, context);\n context.tasks.push(taskLocate);\n }\n\n private async handleActionPlan(\n plan: PlanningAction,\n context: PlanBuildContext,\n ): Promise<void> {\n const planType = plan.type;\n const actionSpace = this.actionSpace;\n const action = actionSpace.find((item) => item.name === planType);\n const param = plan.param;\n\n if (!action) {\n throw new Error(`Action type '${planType}' not found`);\n }\n\n const locateFields = action\n ? findAllMidsceneLocatorField(action.paramSchema)\n : [];\n\n const requiredLocateFields = action\n ? findAllMidsceneLocatorField(action.paramSchema, true)\n : [];\n\n locateFields.forEach((field) => {\n if (param[field]) {\n // Always use createLocateTask for all locate params (including bbox)\n // This ensures cache writing happens even when bbox is available\n const locatePlan = locatePlanForLocate(param[field]);\n debug(\n 'will prepend locate param for field',\n `action.type=${planType}`,\n `param=${JSON.stringify(param[field])}`,\n `locatePlan=${JSON.stringify(locatePlan)}`,\n `hasBbox=${ifPlanLocateParamIsBbox(param[field])}`,\n );\n const locateTask = this.createLocateTask(\n locatePlan,\n param[field],\n context,\n (result) => {\n param[field] = result;\n },\n );\n context.tasks.push(locateTask);\n } else {\n assert(\n !requiredLocateFields.includes(field),\n `Required locate field '${field}' is not provided for action ${planType}`,\n );\n debug(`field '${field}' is not provided for action ${planType}`);\n }\n });\n\n const task: ExecutionTaskApply<\n 'Action Space',\n any,\n { success: boolean; action: string; param: any },\n void\n > = {\n type: 'Action Space',\n subType: planType,\n thought: plan.thought,\n param: plan.param,\n executor: async (param, taskContext) => {\n const timing = taskContext.task.timing;\n\n debug(\n 'executing action',\n planType,\n param,\n `taskContext.element.center: ${taskContext.element?.center}`,\n );\n\n const uiContext = taskContext.uiContext;\n assert(uiContext, 'uiContext is required for Action task');\n\n requiredLocateFields.forEach((field) => {\n assert(\n param[field],\n `field '${field}' is required for action ${planType} but not provided. Cannot execute action ${planType}.`,\n );\n });\n\n setTimingFieldOnce(timing, 'beforeInvokeActionHookStart');\n try {\n await Promise.all([\n (async () => {\n if (this.interface.beforeInvokeAction) {\n debug(\n `will call \"beforeInvokeAction\" for interface with action name ${action.name}`,\n );\n await this.interface.beforeInvokeAction(action.name, param);\n debug(\n `called \"beforeInvokeAction\" for interface with action name ${action.name}`,\n );\n }\n })(),\n sleep(200),\n ]);\n } catch (originalError: any) {\n const originalMessage =\n originalError?.message || String(originalError);\n throw new Error(\n `error in running beforeInvokeAction for ${action.name}: ${originalMessage}`,\n { cause: originalError },\n );\n }\n setTimingFieldOnce(timing, 'beforeInvokeActionHookEnd');\n\n const { shrunkShotToLogicalRatio } = uiContext;\n if (shrunkShotToLogicalRatio === undefined) {\n throw new Error(\n 'shrunkShotToLogicalRatio is not defined in Action task',\n );\n }\n\n if (action.paramSchema) {\n try {\n param = parseActionParam(param, action.paramSchema, {\n shrunkShotToLogicalRatio,\n });\n } catch (error: any) {\n throw new Error(\n `Invalid parameters for action ${action.name}: ${error.message}\\nParameters: ${JSON.stringify(param)}`,\n { cause: error },\n );\n }\n }\n\n setTimingFieldOnce(timing, 'callActionStart');\n\n debug('calling action', action.name);\n const actionFn = action.call.bind(this.interface);\n const actionResult = await actionFn(param, taskContext);\n setTimingFieldOnce(timing, 'callActionEnd');\n debug('called action', action.name, 'result:', actionResult);\n\n setTimingFieldOnce(timing, 'afterInvokeActionHookStart');\n\n const delayAfterRunner =\n action.delayAfterRunner ?? this.waitAfterAction ?? 300;\n if (delayAfterRunner > 0) {\n await sleep(delayAfterRunner);\n }\n\n try {\n if (this.interface.afterInvokeAction) {\n debug(\n `will call \"afterInvokeAction\" for interface with action name ${action.name}`,\n );\n await this.interface.afterInvokeAction(action.name, param);\n debug(\n `called \"afterInvokeAction\" for interface with action name ${action.name}`,\n );\n }\n } catch (originalError: any) {\n const originalMessage =\n originalError?.message || String(originalError);\n throw new Error(\n `error in running afterInvokeAction for ${action.name}: ${originalMessage}`,\n { cause: originalError },\n );\n }\n\n setTimingFieldOnce(timing, 'afterInvokeActionHookEnd');\n\n return {\n output: actionResult,\n };\n },\n };\n\n context.tasks.push(task);\n }\n\n private createLocateTask(\n plan: PlanningAction<PlanningLocateParam>,\n detailedLocateParam: DetailedLocateParam | string,\n context: PlanBuildContext,\n onResult?: (result: LocateResultElement) => void,\n ): ExecutionTaskPlanningLocateApply {\n const { cacheable, modelConfigForDefaultIntent, deepLocate, abortSignal } =\n context;\n\n let locateParam = detailedLocateParam;\n\n if (typeof locateParam === 'string') {\n locateParam = {\n prompt: locateParam,\n };\n }\n\n if (cacheable !== undefined) {\n locateParam = {\n ...locateParam,\n cacheable,\n };\n }\n\n if (deepLocate && !locateParam.deepLocate) {\n locateParam = {\n ...locateParam,\n deepLocate: true,\n };\n }\n\n const taskLocator: ExecutionTaskPlanningLocateApply = {\n type: 'Planning',\n subType: 'Locate',\n param: locateParam,\n thought: plan.thought,\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n let { uiContext } = taskContext;\n\n assert(\n param?.prompt || param?.bbox,\n `No prompt or id or position or bbox to locate, param=${JSON.stringify(\n param,\n )}`,\n );\n\n if (!uiContext) {\n uiContext = await this.service.contextRetrieverFn();\n }\n\n assert(uiContext, 'uiContext is required for Service task');\n\n const { shrunkShotToLogicalRatio } = uiContext;\n\n if (shrunkShotToLogicalRatio === undefined) {\n throw new Error(\n 'shrunkShotToLogicalRatio is not defined in locate task',\n );\n }\n\n let locateDump: ServiceDump | undefined;\n let locateResult: LocateResultWithDump | undefined;\n\n const applyDump = (dump?: ServiceDump) => {\n if (!dump) {\n return;\n }\n locateDump = dump;\n task.log = {\n dump,\n rawResponse: dump.taskInfo?.rawResponse,\n };\n task.usage = dump.taskInfo?.usage;\n if (dump.taskInfo?.searchAreaUsage) {\n task.searchAreaUsage = dump.taskInfo.searchAreaUsage;\n }\n if (dump.taskInfo?.reasoning_content) {\n task.reasoning_content = dump.taskInfo.reasoning_content;\n }\n };\n\n const planLocatedElement = ifPlanLocateParamIsBbox(param)\n ? matchElementFromPlan(param)\n : undefined;\n\n // from bbox (plan hit)\n // when deepLocate is enabled, bbox should be used as search area hint,\n // not as a final direct hit\n const elementFromBbox = param.deepLocate\n ? undefined\n : planLocatedElement;\n const isPlanHit = !!elementFromBbox;\n\n // from xpath\n let rectFromXpath: Rect | undefined;\n if (\n !isPlanHit &&\n param.xpath &&\n this.interface.rectMatchesCacheFeature\n ) {\n try {\n rectFromXpath = await this.interface.rectMatchesCacheFeature({\n xpaths: [param.xpath],\n });\n } catch {\n // xpath locate failed, allow fallback to cache or AI locate\n }\n }\n\n const elementFromXpath = rectFromXpath\n ? generateElementByRect(\n // rectFromXpath is in logical coordinates, which should be transformed to screenshot coordinates;\n transformLogicalRectToScreenshotRect(\n rectFromXpath,\n shrunkShotToLogicalRatio,\n ),\n typeof param.prompt === 'string'\n ? param.prompt\n : param.prompt?.prompt || '',\n )\n : undefined;\n\n const isXpathHit = !!elementFromXpath;\n\n const cachePrompt = param.prompt;\n const locateCacheRecord = this.taskCache?.matchLocateCache(cachePrompt);\n const cacheEntry = locateCacheRecord?.cacheContent?.cache;\n\n const elementFromCacheResult =\n isPlanHit || isXpathHit\n ? null\n : await matchElementFromCache(\n {\n taskCache: this.taskCache,\n interfaceInstance: this.interface,\n },\n cacheEntry,\n cachePrompt,\n param.cacheable,\n );\n\n // elementFromCacheResult is in logical coordinates, which should be transformed to screenshot coordinates;\n const elementFromCache = elementFromCacheResult\n ? transformLogicalElementToScreenshot(\n elementFromCacheResult,\n shrunkShotToLogicalRatio,\n )\n : undefined;\n\n const isCacheHit = !!elementFromCache;\n\n let elementFromAiLocate: LocateResultElement | null | undefined;\n const timing = taskContext.task.timing;\n if (!isXpathHit && !isCacheHit && !isPlanHit) {\n try {\n setTimingFieldOnce(timing, 'callAiStart');\n locateResult = await this.service.locate(\n param,\n {\n context: uiContext,\n planLocatedElement,\n },\n modelConfigForDefaultIntent,\n abortSignal,\n );\n applyDump(locateResult.dump);\n elementFromAiLocate = locateResult.element;\n } catch (error) {\n if (error instanceof ServiceError) {\n applyDump(error.dump);\n }\n throw error;\n } finally {\n setTimingFieldOnce(timing, 'callAiEnd');\n }\n }\n\n const element =\n elementFromBbox ||\n elementFromXpath ||\n elementFromCache ||\n elementFromAiLocate;\n\n // Check if locate cache already exists (for planHitFlag case)\n const locateCacheAlreadyExists = hasNonEmptyCache(\n locateCacheRecord?.cacheContent?.cache,\n );\n\n let currentCacheEntry: ElementCacheFeature | undefined;\n // Write cache if:\n // 1. element found\n // 2. taskCache enabled\n // 3. not a cache hit (otherwise we'd be writing what we just read)\n // 4. not already cached for plan hit case (avoid redundant writes), OR allow update if cache validation failed\n // 5. cacheable is not explicitly false\n if (\n element &&\n this.taskCache &&\n !isCacheHit &&\n (!isPlanHit || !locateCacheAlreadyExists) &&\n param?.cacheable !== false\n ) {\n if (this.interface.cacheFeatureForPoint) {\n try {\n // Transform coordinates to logical space for cacheFeatureForPoint\n // cacheFeatureForPoint needs logical coordinates to locate elements in DOM\n let pointForCache: [number, number] = element.center;\n if (shrunkShotToLogicalRatio !== 1) {\n pointForCache = [\n Math.round(element.center[0] / shrunkShotToLogicalRatio),\n Math.round(element.center[1] / shrunkShotToLogicalRatio),\n ];\n debug(\n 'Transformed coordinates for cacheFeatureForPoint: %o -> %o',\n element.center,\n pointForCache,\n );\n }\n\n const feature = await this.interface.cacheFeatureForPoint(\n pointForCache,\n {\n targetDescription:\n typeof param.prompt === 'string'\n ? param.prompt\n : param.prompt?.prompt,\n modelConfig: modelConfigForDefaultIntent,\n },\n );\n if (hasNonEmptyCache(feature)) {\n debug(\n 'update cache, prompt: %s, cache: %o',\n cachePrompt,\n feature,\n );\n currentCacheEntry = feature;\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'locate',\n prompt: cachePrompt,\n cache: feature,\n },\n locateCacheRecord,\n );\n } else {\n debug(\n 'no cache data returned, skip cache update, prompt: %s',\n cachePrompt,\n );\n }\n } catch (error) {\n debug('cacheFeatureForPoint failed: %s', error);\n }\n } else {\n debug('cacheFeatureForPoint is not supported, skip cache update');\n }\n }\n\n if (!element) {\n if (locateDump) {\n throw new ServiceError(\n `Element not found : ${param.prompt}`,\n locateDump,\n );\n }\n throw new Error(`Element not found: ${param.prompt}`);\n }\n\n let hitBy: ExecutionTaskHitBy | undefined;\n\n if (isPlanHit) {\n hitBy = {\n from: 'Plan',\n context: {\n bbox: param.bbox,\n },\n };\n } else if (isXpathHit) {\n hitBy = {\n from: 'User expected path',\n context: {\n xpath: param.xpath,\n },\n };\n } else if (isCacheHit) {\n hitBy = {\n from: 'Cache',\n context: {\n cacheEntry,\n cacheToSave: currentCacheEntry,\n },\n };\n }\n\n onResult?.(element);\n\n return {\n output: {\n element: {\n ...element,\n // backward compatibility for aiLocate, which return value needs a dpr field\n dpr: uiContext.deprecatedDpr,\n },\n },\n hitBy,\n };\n },\n };\n\n return taskLocator;\n }\n}\n","function truncateText(text, maxLength = 150) {\n if (void 0 === text) return '';\n if ('object' == typeof text) text = JSON.stringify(text);\n if ('number' == typeof text) return text.toString();\n if ('string' == typeof text && text.length > maxLength) return `${text.slice(0, maxLength)}...`;\n if ('string' == typeof text) return text.trim();\n return '';\n}\nfunction trimAttributes(attributes, truncateTextLength) {\n const tailorAttributes = Object.keys(attributes).reduce((res, currentKey)=>{\n const attributeVal = attributes[currentKey];\n if ('style' === currentKey || 'htmlTagName' === currentKey || 'nodeType' === currentKey) return res;\n res[currentKey] = truncateText(attributeVal, truncateTextLength);\n return res;\n }, {});\n return tailorAttributes;\n}\nconst nodeSizeThreshold = 4;\nfunction descriptionOfTree(tree, truncateTextLength, filterNonTextContent = false, visibleOnly = true) {\n const attributesString = (kv)=>Object.entries(kv).map(([key, value])=>`${key}=\"${truncateText(value, truncateTextLength)}\"`).join(' ');\n function buildContentTree(node, indent = 0, visibleOnly = true) {\n let before = '';\n let contentWithIndent = '';\n let after = '';\n let emptyNode = true;\n const indentStr = ' '.repeat(indent);\n let children = '';\n for(let i = 0; i < (node.children || []).length; i++){\n const childContent = buildContentTree(node.children[i], indent + 1, visibleOnly);\n if (childContent) children += `\\n${childContent}`;\n }\n if (node.node && node.node.rect.width > nodeSizeThreshold && node.node.rect.height > nodeSizeThreshold && (!filterNonTextContent || filterNonTextContent && node.node.content) && (!visibleOnly || visibleOnly && node.node.isVisible)) {\n emptyNode = false;\n let nodeTypeString;\n nodeTypeString = node.node.attributes?.htmlTagName ? node.node.attributes.htmlTagName.replace(/[<>]/g, '') : node.node.attributes.nodeType.replace(/\\sNode$/, '').toLowerCase();\n const rectAttribute = node.node.rect ? {\n left: node.node.rect.left,\n top: node.node.rect.top,\n width: node.node.rect.width,\n height: node.node.rect.height\n } : {};\n before = `<${nodeTypeString} id=\"${node.node.id}\" ${attributesString(trimAttributes(node.node.attributes || {}, truncateTextLength))} ${attributesString(rectAttribute)}>`;\n const content = truncateText(node.node.content, truncateTextLength);\n contentWithIndent = content ? `\\n${indentStr} ${content}` : '';\n after = `</${nodeTypeString}>`;\n } else if (!filterNonTextContent) {\n if (!children.trim().startsWith('<>')) {\n before = '<>';\n contentWithIndent = '';\n after = '</>';\n }\n }\n if (emptyNode && !children.trim()) return '';\n const result = `${indentStr}${before}${contentWithIndent}${children}\\n${indentStr}${after}`;\n if (result.trim()) return result;\n return '';\n }\n const result = buildContentTree(tree, 0, visibleOnly);\n return result.replace(/^\\s*\\n/gm, '');\n}\nfunction treeToList(tree) {\n const result = [];\n function dfs(node) {\n if (node.node) result.push(node.node);\n for (const child of node.children)dfs(child);\n }\n dfs(tree);\n return result;\n}\nfunction traverseTree(tree, onNode) {\n function dfs(node) {\n if (node.node) node.node = onNode(node.node);\n for (const child of node.children)dfs(child);\n }\n dfs(tree);\n return tree;\n}\nexport { descriptionOfTree, traverseTree, treeToList, trimAttributes, truncateText };\n","import type {\n DetailedLocateParam,\n ExecutionTask,\n ExecutionTaskAction,\n ExecutionTaskInsightAssertion,\n ExecutionTaskInsightQuery,\n ExecutionTaskPlanning,\n ExecutionTaskPlanningLocate,\n PullParam,\n ScrollParam,\n} from '@/types';\n\nexport function typeStr(task: ExecutionTask) {\n // // For Action tasks with subType, show \"Action Space / subType\"\n // if (task.type === 'Action' && task.subType) {\n // return `Action Space / ${task.subType}`;\n // }\n\n // // For all other cases with subType, show \"type / subType\"\n // if (task.subType) {\n // return `${task.type} / ${task.subType}`;\n // }\n\n // No subType, just show type\n return task.subType || task.type;\n}\n\nexport function locateParamStr(locate?: DetailedLocateParam | string): string {\n if (!locate) {\n return '';\n }\n\n if (typeof locate === 'string') {\n return locate;\n }\n\n if (typeof locate === 'object') {\n // Check for nested prompt.prompt (Planning Locate tasks)\n if (\n typeof locate.prompt === 'object' &&\n locate.prompt !== null &&\n locate.prompt.prompt\n ) {\n const prompt = locate.prompt.prompt;\n return prompt;\n }\n\n // Check for direct prompt string\n if (typeof locate.prompt === 'string') {\n return locate.prompt;\n }\n\n // Check for description field (Action Space tasks like Tap, Hover)\n if (typeof (locate as any).description === 'string') {\n return (locate as any).description;\n }\n }\n\n return '';\n}\n\nexport function scrollParamStr(scrollParam?: ScrollParam) {\n if (!scrollParam) {\n return '';\n }\n return `${scrollParam.direction || 'down'}, ${scrollParam.scrollType || 'singleAction'}, ${scrollParam.distance || 'distance-not-set'}`;\n}\n\nexport function pullParamStr(pullParam?: PullParam) {\n if (!pullParam) {\n return '';\n }\n const parts: string[] = [];\n parts.push(`direction: ${pullParam.direction || 'down'}`);\n if (pullParam.distance) {\n parts.push(`distance: ${pullParam.distance}`);\n }\n if (pullParam.duration) {\n parts.push(`duration: ${pullParam.duration}ms`);\n }\n return parts.join(', ');\n}\n\nexport function extractInsightParam(taskParam: any): {\n content: string;\n images?: Array<{ name: string; url: string }>;\n} {\n if (!taskParam) {\n return { content: '' };\n }\n\n // Helper to extract images from multimodalPrompt\n const extractImages = (source: any) => {\n return source?.multimodalPrompt?.images &&\n Array.isArray(source.multimodalPrompt.images)\n ? source.multimodalPrompt.images\n : undefined;\n };\n\n // Helper to stringify if needed\n const toContent = (value: any) =>\n typeof value === 'string' ? value : JSON.stringify(value);\n\n // Extract from demand\n if (taskParam.demand) {\n return {\n content: toContent(taskParam.demand),\n images: extractImages(taskParam),\n };\n }\n\n // Extract from assertion\n if (taskParam.assertion) {\n return {\n content: toContent(taskParam.assertion),\n images: extractImages(taskParam),\n };\n }\n\n // Extract from dataDemand\n if (taskParam.dataDemand) {\n const { dataDemand } = taskParam;\n\n if (typeof dataDemand === 'string') {\n return { content: dataDemand };\n }\n\n if (typeof dataDemand === 'object') {\n return {\n content: toContent(dataDemand.demand || dataDemand),\n images: extractImages(dataDemand),\n };\n }\n }\n\n return { content: '' };\n}\n\nexport function taskTitleStr(\n type:\n | 'Tap'\n | 'Hover'\n | 'Input'\n | 'RightClick'\n | 'KeyboardPress'\n | 'Scroll'\n | 'Act'\n | 'Query'\n | 'Assert'\n | 'WaitFor'\n | 'Locate'\n | 'Boolean'\n | 'Number'\n | 'String',\n prompt: string,\n) {\n if (prompt) {\n return `${type} - ${prompt}`;\n }\n return type;\n}\n\nexport function paramStr(task: ExecutionTask) {\n let value: string | undefined | object;\n if (task.type === 'Planning') {\n if (task.subType === 'Locate') {\n value = locateParamStr((task as ExecutionTaskPlanningLocate)?.param);\n } else {\n // Prefer AI-generated output.log over user input\n const planTask = task as ExecutionTaskPlanning;\n value = planTask.output?.log || planTask.param?.userInstruction;\n }\n }\n\n if (task.type === 'Insight') {\n value = extractInsightParam((task as any)?.param).content;\n }\n\n if (task.type === 'Action Space') {\n const locate = (task as ExecutionTaskAction)?.param?.locate;\n const locateStr = locate ? locateParamStr(locate) : '';\n\n value = task.thought || '';\n if (typeof (task as ExecutionTaskAction)?.param?.timeMs === 'number') {\n value = `${(task as ExecutionTaskAction)?.param?.timeMs}ms`;\n } else if (\n typeof (task as ExecutionTaskAction)?.param?.scrollType === 'string'\n ) {\n value = scrollParamStr((task as ExecutionTaskAction)?.param);\n } else if (\n typeof (task as ExecutionTaskAction)?.param?.direction === 'string' &&\n (task as ExecutionTaskAction)?.subType === 'PullGesture'\n ) {\n value = pullParamStr((task as ExecutionTaskAction)?.param);\n } else if (\n typeof (task as ExecutionTaskAction)?.param?.value !== 'undefined'\n ) {\n value = (task as ExecutionTaskAction)?.param?.value;\n } else if (\n (task as ExecutionTaskAction)?.param &&\n typeof (task as ExecutionTaskAction)?.param === 'object' &&\n Object.keys((task as ExecutionTaskAction)?.param || {}).length > 0\n ) {\n // General parameter handling for actions with custom parameters\n // (e.g., runWdaRequest, runAdbShell)\n value = (task as ExecutionTaskAction)?.param;\n }\n\n if (locateStr) {\n if (value && typeof value !== 'object') {\n value = `${locateStr} - ${value}`;\n } else {\n value = locateStr;\n }\n }\n }\n\n if (typeof value === 'undefined') return '';\n\n if (typeof value === 'string') return value;\n\n if (typeof value === 'object') {\n const locateStr = locateParamStr(value as any);\n if (locateStr) {\n return locateStr;\n }\n return JSON.stringify(value, undefined, 2);\n }\n\n return String(value);\n}\n","import {\n AIResponseParseError,\n ConversationHistory,\n autoGLMPlanning,\n plan,\n uiTarsPlanning,\n} from '@/ai-model';\nimport { isAutoGLM, isUITars } from '@/ai-model/auto-glm/util';\nimport {\n type TMultimodalPrompt,\n type TUserPrompt,\n getReadableTimeString,\n} from '@/common';\nimport type { AbstractInterface, FileChooserHandler } from '@/device';\nimport type Service from '@/service';\nimport type { TaskRunner } from '@/task-runner';\nimport { TaskExecutionError } from '@/task-runner';\nimport type {\n DeepThinkOption,\n DeviceAction,\n ExecutionTaskApply,\n ExecutionTaskInsightQueryApply,\n ExecutionTaskPlanningApply,\n ExecutionTaskProgressOptions,\n InterfaceType,\n MidsceneYamlFlowItem,\n PlanningAIResponse,\n PlanningAction,\n PlanningActionParamWaitFor,\n ServiceDump,\n ServiceExtractOption,\n ServiceExtractParam,\n} from '@/types';\nimport { ServiceError } from '@/types';\nimport { type IModelConfig, getCurrentTime } from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport { ExecutionSession } from './execution-session';\nimport { TaskBuilder } from './task-builder';\nimport type { TaskCache } from './task-cache';\nexport { locatePlanForLocate } from './task-builder';\nimport { setTimingFieldOnce } from '@/task-timing';\nimport { descriptionOfTree } from '@midscene/shared/extractor';\nimport { taskTitleStr } from './ui-utils';\nimport { parsePrompt } from './utils';\n\ninterface ExecutionResult<OutputType = any> {\n output: OutputType;\n thought?: string;\n runner: TaskRunner;\n}\n\ninterface TaskExecutorHooks {\n onTaskUpdate?: (\n runner: TaskRunner,\n error?: TaskExecutionError,\n ) => Promise<void> | void;\n}\n\nconst debug = getDebug('device-task-executor');\nconst maxErrorCountAllowedInOnePlanningLoop = 5;\n\nexport { TaskExecutionError };\n\nexport class TaskExecutor {\n interface: AbstractInterface;\n\n service: Service;\n\n taskCache?: TaskCache;\n\n private readonly providedActionSpace: DeviceAction[];\n\n private readonly taskBuilder: TaskBuilder;\n\n onTaskStartCallback?: ExecutionTaskProgressOptions['onTaskStart'];\n\n private readonly hooks?: TaskExecutorHooks;\n\n replanningCycleLimit?: number;\n\n waitAfterAction?: number;\n\n useDeviceTimestamp?: boolean;\n\n // @deprecated use .interface instead\n get page() {\n return this.interface;\n }\n\n constructor(\n interfaceInstance: AbstractInterface,\n service: Service,\n opts: {\n taskCache?: TaskCache;\n onTaskStart?: ExecutionTaskProgressOptions['onTaskStart'];\n replanningCycleLimit?: number;\n waitAfterAction?: number;\n useDeviceTimestamp?: boolean;\n hooks?: TaskExecutorHooks;\n actionSpace: DeviceAction[];\n },\n ) {\n this.interface = interfaceInstance;\n this.service = service;\n this.taskCache = opts.taskCache;\n this.onTaskStartCallback = opts?.onTaskStart;\n this.replanningCycleLimit = opts.replanningCycleLimit;\n this.waitAfterAction = opts.waitAfterAction;\n this.useDeviceTimestamp = opts.useDeviceTimestamp;\n this.hooks = opts.hooks;\n this.providedActionSpace = opts.actionSpace;\n this.taskBuilder = new TaskBuilder({\n interfaceInstance,\n service,\n taskCache: opts.taskCache,\n actionSpace: this.getActionSpace(),\n waitAfterAction: opts.waitAfterAction,\n });\n }\n\n private createExecutionSession(\n title: string,\n options?: { tasks?: ExecutionTaskApply[] },\n ) {\n return new ExecutionSession(\n title,\n () => Promise.resolve(this.service.contextRetrieverFn()),\n {\n onTaskStart: this.onTaskStartCallback,\n tasks: options?.tasks,\n onTaskUpdate: this.hooks?.onTaskUpdate,\n },\n );\n }\n\n private getActionSpace(): DeviceAction[] {\n return this.providedActionSpace;\n }\n\n /**\n * Get a readable time string using device time when configured.\n * This method respects the useDeviceTimestamp configuration.\n * @param format - Optional format string\n * @returns A formatted time string\n */\n private async getTimeString(format?: string): Promise<string> {\n const timestamp = await getCurrentTime(\n this.interface,\n this.useDeviceTimestamp,\n );\n return getReadableTimeString(format, timestamp);\n }\n\n public async convertPlanToExecutable(\n plans: PlanningAction[],\n modelConfigForPlanning: IModelConfig,\n modelConfigForDefaultIntent: IModelConfig,\n options?: {\n cacheable?: boolean;\n deepLocate?: boolean;\n abortSignal?: AbortSignal;\n },\n ) {\n return this.taskBuilder.build(\n plans,\n modelConfigForPlanning,\n modelConfigForDefaultIntent,\n options,\n );\n }\n\n async loadYamlFlowAsPlanning(userInstruction: string, yamlString: string) {\n const session = this.createExecutionSession(\n taskTitleStr('Act', userInstruction),\n );\n\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'LoadYaml',\n param: {\n userInstruction,\n },\n executor: async (param, executorContext) => {\n const { uiContext } = executorContext;\n assert(uiContext, 'uiContext is required for Planning task');\n return {\n output: {\n actions: [],\n shouldContinuePlanning: false,\n log: '',\n yamlString,\n },\n cache: {\n hit: true,\n },\n hitBy: {\n from: 'Cache',\n context: {\n yamlString,\n },\n },\n };\n },\n };\n const runner = session.getRunner();\n await session.appendAndRun(task);\n\n return {\n runner,\n };\n }\n\n async runPlans(\n title: string,\n plans: PlanningAction[],\n modelConfigForPlanning: IModelConfig,\n modelConfigForDefaultIntent: IModelConfig,\n ): Promise<ExecutionResult> {\n const session = this.createExecutionSession(title);\n const { tasks } = await this.convertPlanToExecutable(\n plans,\n modelConfigForPlanning,\n modelConfigForDefaultIntent,\n );\n const runner = session.getRunner();\n const result = await session.appendAndRun(tasks);\n const { output } = result ?? {};\n return {\n output,\n runner,\n };\n }\n\n async action(\n userPrompt: string,\n modelConfigForPlanning: IModelConfig,\n modelConfigForDefaultIntent: IModelConfig,\n includeBboxInPlanning: boolean,\n aiActContext?: string,\n cacheable?: boolean,\n replanningCycleLimitOverride?: number,\n imagesIncludeCount?: number,\n deepThink?: DeepThinkOption,\n fileChooserAccept?: string[],\n deepLocate?: boolean,\n abortSignal?: AbortSignal,\n ): Promise<\n ExecutionResult<\n | {\n yamlFlow?: MidsceneYamlFlowItem[]; // for cache use\n output?: string;\n }\n | undefined\n >\n > {\n return withFileChooser(this.interface, fileChooserAccept, async () => {\n return this.runAction(\n userPrompt,\n modelConfigForPlanning,\n modelConfigForDefaultIntent,\n includeBboxInPlanning,\n aiActContext,\n cacheable,\n replanningCycleLimitOverride,\n imagesIncludeCount,\n deepThink,\n deepLocate,\n abortSignal,\n );\n });\n }\n\n private async runAction(\n userPrompt: string,\n modelConfigForPlanning: IModelConfig,\n modelConfigForDefaultIntent: IModelConfig,\n includeBboxInPlanning: boolean,\n aiActContext?: string,\n cacheable?: boolean,\n replanningCycleLimitOverride?: number,\n imagesIncludeCount?: number,\n deepThink?: DeepThinkOption,\n deepLocate?: boolean,\n abortSignal?: AbortSignal,\n ): Promise<\n ExecutionResult<\n | {\n yamlFlow?: MidsceneYamlFlowItem[]; // for cache use\n output?: string;\n }\n | undefined\n >\n > {\n const conversationHistory = new ConversationHistory();\n\n const session = this.createExecutionSession(\n taskTitleStr('Act', userPrompt),\n );\n const runner = session.getRunner();\n\n let replanCount = 0;\n const yamlFlow: MidsceneYamlFlowItem[] = [];\n const replanningCycleLimit =\n replanningCycleLimitOverride ?? this.replanningCycleLimit;\n assert(\n replanningCycleLimit !== undefined,\n 'replanningCycleLimit is required for TaskExecutor.action',\n );\n\n let errorCountInOnePlanningLoop = 0; // count the number of errors in one planning loop\n let outputString: string | undefined;\n\n // Main planning loop - unified plan/replan logic\n while (true) {\n // Check abort signal before each planning cycle\n if (abortSignal?.aborted) {\n return session.appendErrorPlan(\n `Task aborted: ${abortSignal.reason || 'abort signal received'}`,\n );\n }\n\n // Get sub-goal status text if available\n const subGoalStatus = conversationHistory.subGoalsToText() || undefined;\n\n // Get memories text if available\n const memoriesStatus = conversationHistory.memoriesToText() || undefined;\n\n const result = await session.appendAndRun(\n {\n type: 'Planning',\n subType: 'Plan',\n param: {\n userInstruction: userPrompt,\n aiActContext,\n imagesIncludeCount,\n deepThink,\n ...(subGoalStatus ? { subGoalStatus } : {}),\n ...(memoriesStatus ? { memoriesStatus } : {}),\n },\n executor: async (param, executorContext) => {\n const { uiContext } = executorContext;\n assert(uiContext, 'uiContext is required for Planning task');\n const { modelFamily } = modelConfigForPlanning;\n const timing = executorContext.task.timing;\n\n const actionSpace = this.getActionSpace();\n debug(\n 'actionSpace for this interface is:',\n actionSpace.map((action) => action.name).join(', '),\n );\n assert(Array.isArray(actionSpace), 'actionSpace must be an array');\n if (actionSpace.length === 0) {\n console.warn(\n `ActionSpace for ${this.interface.interfaceType} is empty. This may lead to unexpected behavior.`,\n );\n }\n\n const planImpl = isUITars(modelFamily)\n ? uiTarsPlanning\n : isAutoGLM(modelFamily)\n ? autoGLMPlanning\n : plan;\n\n let planResult: Awaited<ReturnType<typeof planImpl>>;\n try {\n setTimingFieldOnce(timing, 'callAiStart');\n planResult = await planImpl(param.userInstruction, {\n context: uiContext,\n actionContext: param.aiActContext,\n interfaceType: this.interface.interfaceType as InterfaceType,\n actionSpace,\n modelConfig: modelConfigForPlanning,\n conversationHistory,\n includeBbox: includeBboxInPlanning,\n imagesIncludeCount,\n deepThink,\n abortSignal,\n });\n } catch (planError) {\n if (planError instanceof AIResponseParseError) {\n // Record usage and rawResponse even when parsing fails\n executorContext.task.usage = planError.usage;\n executorContext.task.log = {\n ...(executorContext.task.log || {}),\n rawResponse: planError.rawResponse,\n };\n }\n throw planError;\n } finally {\n setTimingFieldOnce(timing, 'callAiEnd');\n }\n debug('planResult', JSON.stringify(planResult, null, 2));\n\n const {\n actions,\n thought,\n log,\n memory,\n error,\n usage,\n rawResponse,\n reasoning_content,\n finalizeSuccess,\n finalizeMessage,\n updateSubGoals,\n markFinishedIndexes,\n } = planResult;\n outputString = finalizeMessage;\n\n executorContext.task.log = {\n ...(executorContext.task.log || {}),\n rawResponse,\n };\n executorContext.task.usage = usage;\n executorContext.task.reasoning_content = reasoning_content;\n executorContext.task.output = {\n actions: actions || [],\n log,\n thought,\n memory,\n yamlFlow: planResult.yamlFlow,\n output: finalizeMessage,\n shouldContinuePlanning: planResult.shouldContinuePlanning,\n updateSubGoals,\n markFinishedIndexes,\n };\n executorContext.uiContext = uiContext;\n\n assert(!error, `Failed to continue: ${error}\\n${log || ''}`);\n\n // Check if task was finalized with failure\n if (finalizeSuccess === false) {\n assert(\n false,\n `Task failed: ${finalizeMessage || 'No error message provided'}\\n${log || ''}`,\n );\n }\n\n return {\n cache: {\n hit: false,\n },\n } as any;\n },\n },\n {\n allowWhenError: true,\n },\n );\n\n const planResult = result?.output as PlanningAIResponse | undefined;\n\n // Execute planned actions\n const plans = planResult?.actions || [];\n yamlFlow.push(...(planResult?.yamlFlow || []));\n\n let executables: Awaited<ReturnType<typeof this.convertPlanToExecutable>>;\n try {\n executables = await this.convertPlanToExecutable(\n plans,\n modelConfigForPlanning,\n modelConfigForDefaultIntent,\n {\n cacheable,\n deepLocate,\n abortSignal,\n },\n );\n } catch (error) {\n return session.appendErrorPlan(\n `Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(\n plans,\n )}`,\n );\n }\n if (conversationHistory.pendingFeedbackMessage) {\n console.warn(\n 'unconsumed pending feedback message detected, this may lead to unexpected planning result:',\n conversationHistory.pendingFeedbackMessage,\n );\n }\n\n // Set initial time context for the first planning call\n const initialTimeString = await this.getTimeString();\n conversationHistory.pendingFeedbackMessage += `Current time: ${initialTimeString}`;\n\n try {\n await session.appendAndRun(executables.tasks);\n } catch (error: any) {\n // errorFlag = true;\n errorCountInOnePlanningLoop++;\n const timeString = await this.getTimeString();\n conversationHistory.pendingFeedbackMessage = `Time: ${timeString}, Error executing running tasks: ${error?.message || String(error)}`;\n debug(\n 'error when executing running tasks, but continue to run if it is not too many errors:',\n error instanceof Error ? error.message : String(error),\n 'current error count in one planning loop:',\n errorCountInOnePlanningLoop,\n );\n }\n\n if (errorCountInOnePlanningLoop > maxErrorCountAllowedInOnePlanningLoop) {\n return session.appendErrorPlan('Too many errors in one planning loop');\n }\n\n // Check abort signal after executing actions\n if (abortSignal?.aborted) {\n return session.appendErrorPlan(\n `Task aborted: ${abortSignal.reason || 'abort signal received'}`,\n );\n }\n\n // // Check if task is complete\n if (!planResult?.shouldContinuePlanning) {\n break;\n }\n\n // Increment replan count for next iteration\n ++replanCount;\n\n if (replanCount > replanningCycleLimit) {\n const errorMsg = `Replanned ${replanningCycleLimit} times, exceeding the limit. Please configure a larger value for replanningCycleLimit (or use MIDSCENE_REPLANNING_CYCLE_LIMIT) to handle more complex tasks.`;\n return session.appendErrorPlan(errorMsg);\n }\n\n if (!conversationHistory.pendingFeedbackMessage) {\n const timeString = await this.getTimeString();\n conversationHistory.pendingFeedbackMessage = `Time: ${timeString}, I have finished the action previously planned.`;\n }\n }\n\n return {\n output: {\n yamlFlow,\n output: outputString,\n },\n runner,\n };\n }\n\n private createTypeQueryTask(\n type: 'Query' | 'Boolean' | 'Number' | 'String' | 'Assert' | 'WaitFor',\n demand: ServiceExtractParam,\n modelConfig: IModelConfig,\n opt?: ServiceExtractOption,\n multimodalPrompt?: TMultimodalPrompt,\n ) {\n const queryTask: ExecutionTaskInsightQueryApply = {\n type: 'Insight',\n subType: type,\n param: {\n dataDemand: multimodalPrompt\n ? ({\n demand,\n multimodalPrompt,\n } as never)\n : demand, // for user param presentation in report right sidebar\n },\n executor: async (param, taskContext) => {\n const { task } = taskContext;\n let queryDump: ServiceDump | undefined;\n const applyDump = (dump: ServiceDump) => {\n queryDump = dump;\n task.log = {\n dump,\n rawResponse: dump.taskInfo?.rawResponse,\n };\n task.usage = dump.taskInfo?.usage;\n if (dump.taskInfo?.reasoning_content) {\n task.reasoning_content = dump.taskInfo.reasoning_content;\n }\n };\n\n // Get context for query operations\n const uiContext = taskContext.uiContext;\n assert(uiContext, 'uiContext is required for Query task');\n\n const ifTypeRestricted = type !== 'Query';\n let demandInput = demand;\n let keyOfResult = 'result';\n if (ifTypeRestricted && (type === 'Assert' || type === 'WaitFor')) {\n keyOfResult = 'StatementIsTruthy';\n const booleanPrompt =\n type === 'Assert'\n ? `Boolean, whether the following statement is true: ${demand}`\n : `Boolean, the user wants to do some 'wait for' operation, please check whether the following statement is true: ${demand}`;\n demandInput = {\n [keyOfResult]: booleanPrompt,\n };\n } else if (ifTypeRestricted) {\n keyOfResult = type;\n demandInput = {\n [keyOfResult]: `${type}, ${demand}`,\n };\n }\n\n let extractResult;\n\n let extraPageDescription = '';\n if (opt?.domIncluded && this.interface.getElementsNodeTree) {\n debug('appending tree info for page');\n const tree = await this.interface.getElementsNodeTree();\n extraPageDescription = await descriptionOfTree(\n tree,\n 200,\n false,\n opt?.domIncluded === 'visible-only',\n );\n }\n\n try {\n extractResult = await this.service.extract<any>(\n demandInput,\n modelConfig,\n opt,\n extraPageDescription,\n multimodalPrompt,\n uiContext,\n );\n } catch (error) {\n if (error instanceof ServiceError) {\n applyDump(error.dump);\n }\n throw error;\n }\n\n const { data, thought, dump } = extractResult;\n applyDump(dump);\n\n let outputResult = data;\n if (ifTypeRestricted) {\n // If AI returned a plain string instead of structured format, use it directly\n if (typeof data === 'string') {\n outputResult = data;\n } else if (type === 'WaitFor') {\n if (data === null || data === undefined) {\n outputResult = false;\n } else {\n outputResult = (data as any)[keyOfResult];\n }\n } else if (data === null || data === undefined) {\n outputResult = null;\n } else {\n assert(\n data?.[keyOfResult] !== undefined,\n 'No result in query data',\n );\n outputResult = (data as any)[keyOfResult];\n }\n }\n\n if (type === 'Assert' && !outputResult) {\n task.thought = thought;\n throw new Error(`Assertion failed: ${thought}`);\n }\n\n return {\n output: outputResult,\n log: queryDump,\n thought,\n };\n },\n };\n\n return queryTask;\n }\n async createTypeQueryExecution<T>(\n type: 'Query' | 'Boolean' | 'Number' | 'String' | 'Assert',\n demand: ServiceExtractParam,\n modelConfig: IModelConfig,\n opt?: ServiceExtractOption,\n multimodalPrompt?: TMultimodalPrompt,\n ): Promise<ExecutionResult<T>> {\n const session = this.createExecutionSession(\n taskTitleStr(\n type,\n typeof demand === 'string' ? demand : JSON.stringify(demand),\n ),\n );\n\n const queryTask = await this.createTypeQueryTask(\n type,\n demand,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n\n const runner = session.getRunner();\n const result = await session.appendAndRun(queryTask);\n\n if (!result) {\n throw new Error(\n 'result of taskExecutor.flush() is undefined in function createTypeQueryTask',\n );\n }\n\n const { output, thought } = result;\n\n return {\n output,\n thought,\n runner,\n };\n }\n\n async waitFor(\n assertion: TUserPrompt,\n opt: PlanningActionParamWaitFor,\n modelConfig: IModelConfig,\n ): Promise<ExecutionResult<void>> {\n const { textPrompt, multimodalPrompt } = parsePrompt(assertion);\n\n const description = `waitFor: ${textPrompt}`;\n const session = this.createExecutionSession(\n taskTitleStr('WaitFor', description),\n );\n const runner = session.getRunner();\n const {\n timeoutMs,\n checkIntervalMs,\n domIncluded,\n screenshotIncluded,\n ...restOpt\n } = opt;\n const serviceExtractOpt: ServiceExtractOption = {\n domIncluded,\n screenshotIncluded,\n ...restOpt,\n };\n\n assert(assertion, 'No assertion for waitFor');\n assert(timeoutMs, 'No timeoutMs for waitFor');\n assert(checkIntervalMs, 'No checkIntervalMs for waitFor');\n\n assert(\n checkIntervalMs <= timeoutMs,\n `wrong config for waitFor: checkIntervalMs must be less than timeoutMs, config: {checkIntervalMs: ${checkIntervalMs}, timeoutMs: ${timeoutMs}}`,\n );\n\n const overallStartTime = Date.now();\n let lastCheckStart = overallStartTime;\n let errorThought = '';\n // Continue checking as long as the previous iteration began within the timeout window.\n while (lastCheckStart - overallStartTime <= timeoutMs) {\n const currentCheckStart = Date.now();\n lastCheckStart = currentCheckStart;\n const queryTask = await this.createTypeQueryTask(\n 'WaitFor',\n textPrompt,\n modelConfig,\n serviceExtractOpt,\n multimodalPrompt,\n );\n\n const result = (await session.appendAndRun(queryTask)) as\n | {\n output: boolean;\n thought?: string;\n }\n | undefined;\n\n if (result?.output) {\n return {\n output: undefined,\n runner,\n };\n }\n\n errorThought =\n result?.thought ||\n (!result && `No result from assertion: ${textPrompt}`) ||\n `unknown error when waiting for assertion: ${textPrompt}`;\n const now = Date.now();\n if (now - currentCheckStart < checkIntervalMs) {\n const elapsed = now - currentCheckStart;\n const timeRemaining = checkIntervalMs - elapsed;\n const thought = `Check interval is ${checkIntervalMs}ms, ${elapsed}ms elapsed since last check, sleeping for ${timeRemaining}ms`;\n const { tasks: sleepTasks } = await this.convertPlanToExecutable(\n [{ type: 'Sleep', param: { timeMs: timeRemaining }, thought }],\n modelConfig,\n modelConfig,\n );\n if (sleepTasks[0]) {\n await session.appendAndRun(sleepTasks[0]);\n }\n }\n }\n\n return session.appendErrorPlan(`waitFor timeout: ${errorThought}`);\n }\n}\n\nexport async function withFileChooser<T>(\n interfaceInstance: AbstractInterface,\n fileChooserAccept: string[] | undefined,\n action: () => Promise<T>,\n): Promise<T> {\n if (!fileChooserAccept?.length) {\n return action();\n }\n\n if (!interfaceInstance.registerFileChooserListener) {\n throw new Error(\n `File upload is not supported on ${interfaceInstance.interfaceType}`,\n );\n }\n\n const handler = async (chooser: FileChooserHandler) => {\n await chooser.accept(fileChooserAccept);\n };\n\n const { dispose, getError } =\n await interfaceInstance.registerFileChooserListener(handler);\n try {\n const result = await action();\n // Check for errors that occurred during file chooser handling\n const error = getError();\n if (error) {\n throw error;\n }\n return result;\n } finally {\n dispose();\n }\n}\n","import type { TUserPrompt } from '../ai-model/index';\nimport { ScreenshotItem } from '../screenshot-item';\nimport Service from '../service/index';\n// Import types and values directly from their source files to avoid circular dependency\n// DO NOT import from '../index' as it creates a circular dependency:\n// index.ts -> agent/index.ts -> agent/agent.ts -> index.ts\nimport {\n type ActionParam,\n type ActionReturn,\n type AgentAssertOpt,\n type AgentDescribeElementAtPointResult,\n type AgentOpt,\n type AgentWaitForOpt,\n type CacheConfig,\n type DeepThinkOption,\n type DeviceAction,\n ExecutionDump,\n type ExecutionRecorderItem,\n type ExecutionTask,\n type ExecutionTaskLog,\n type GroupMeta,\n GroupedActionDump,\n type LocateOption,\n type LocateResultElement,\n type LocateValidatorResult,\n type LocatorValidatorOption,\n type OnTaskStartTip,\n type PlanningAction,\n type Rect,\n type ScrollParam,\n type ServiceAction,\n type ServiceExtractOption,\n type ServiceExtractParam,\n type UIContext,\n} from '../types';\nimport type { MidsceneYamlScript } from '../yaml';\nexport type TestStatus =\n | 'passed'\n | 'failed'\n | 'timedOut'\n | 'skipped'\n | 'interrupted';\nimport { isAutoGLM, isUITars } from '@/ai-model/auto-glm/util';\nimport yaml from 'js-yaml';\n\nimport type { IReportGenerator } from '@/report-generator';\nimport { ReportGenerator } from '@/report-generator';\nimport { getVersion, processCacheConfig, reportHTMLContent } from '@/utils';\nimport {\n ScriptPlayer,\n buildDetailedLocateParam,\n parseYamlScript,\n} from '../yaml/index';\n\nimport { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { AbstractInterface } from '@/device';\nimport type { TaskRunner } from '@/task-runner';\nimport {\n type IModelConfig,\n MIDSCENE_REPLANNING_CYCLE_LIMIT,\n ModelConfigManager,\n globalConfigManager,\n globalModelConfigManager,\n} from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert, ifInBrowser, uuid } from '@midscene/shared/utils';\nimport { defineActionSleep } from '../device';\nimport { TaskCache } from './task-cache';\nimport {\n TaskExecutionError,\n TaskExecutor,\n locatePlanForLocate,\n withFileChooser,\n} from './tasks';\nimport { locateParamStr, paramStr, taskTitleStr, typeStr } from './ui-utils';\nimport { commonContextParser, getReportFileName, parsePrompt } from './utils';\n\nconst debug = getDebug('agent');\n\nconst distanceOfTwoPoints = (p1: [number, number], p2: [number, number]) => {\n const [x1, y1] = p1;\n const [x2, y2] = p2;\n return Math.round(Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2));\n};\n\nconst includedInRect = (point: [number, number], rect: Rect) => {\n const [x, y] = point;\n const { left, top, width, height } = rect;\n return x >= left && x <= left + width && y >= top && y <= top + height;\n};\n\nconst defaultServiceExtractOption: ServiceExtractOption = {\n domIncluded: false,\n screenshotIncluded: true,\n};\n\ntype CacheStrategy = NonNullable<CacheConfig['strategy']>;\n\nconst CACHE_STRATEGIES: readonly CacheStrategy[] = [\n 'read-only',\n 'read-write',\n 'write-only',\n];\n\nconst isValidCacheStrategy = (strategy: string): strategy is CacheStrategy =>\n CACHE_STRATEGIES.some((value) => value === strategy);\n\nconst CACHE_STRATEGY_VALUES = CACHE_STRATEGIES.map(\n (value) => `\"${value}\"`,\n).join(', ');\n\nconst legacyScrollTypeMap = {\n once: 'singleAction',\n untilBottom: 'scrollToBottom',\n untilTop: 'scrollToTop',\n untilRight: 'scrollToRight',\n untilLeft: 'scrollToLeft',\n} as const;\n\ntype LegacyScrollType = keyof typeof legacyScrollTypeMap;\n\nconst normalizeScrollType = (\n scrollType: ScrollParam['scrollType'] | LegacyScrollType | undefined,\n): ScrollParam['scrollType'] | undefined => {\n if (!scrollType) {\n return scrollType;\n }\n\n if (scrollType in legacyScrollTypeMap) {\n return legacyScrollTypeMap[scrollType as LegacyScrollType];\n }\n\n return scrollType as ScrollParam['scrollType'];\n};\n\nconst defaultReplanningCycleLimit = 20;\nconst defaultVlmUiTarsReplanningCycleLimit = 40;\nconst defaultAutoGlmReplanningCycleLimit = 100;\n\nexport type AiActOptions = {\n cacheable?: boolean;\n fileChooserAccept?: string | string[];\n deepThink?: DeepThinkOption;\n deepLocate?: boolean;\n abortSignal?: AbortSignal;\n};\n\nexport class Agent<\n InterfaceType extends AbstractInterface = AbstractInterface,\n> {\n interface: InterfaceType;\n\n service: Service;\n\n dump: GroupedActionDump;\n\n reportFile?: string | null;\n\n reportFileName?: string;\n\n taskExecutor: TaskExecutor;\n\n opts: AgentOpt;\n\n /**\n * If true, the agent will not perform any actions\n */\n dryMode = false;\n\n onTaskStartTip?: OnTaskStartTip;\n\n taskCache?: TaskCache;\n\n private dumpUpdateListeners: Array<\n (dump: string, executionDump?: ExecutionDump) => void\n > = [];\n\n get onDumpUpdate():\n | ((dump: string, executionDump?: ExecutionDump) => void)\n | undefined {\n return this.dumpUpdateListeners[0];\n }\n\n set onDumpUpdate(callback:\n | ((dump: string, executionDump?: ExecutionDump) => void)\n | undefined) {\n // Clear existing listeners\n this.dumpUpdateListeners = [];\n // Add callback to array if provided\n if (callback) {\n this.dumpUpdateListeners.push(callback);\n }\n }\n\n destroyed = false;\n\n modelConfigManager: ModelConfigManager;\n\n /**\n * Frozen page context for consistent AI operations\n */\n private frozenUIContext?: UIContext;\n\n private get aiActContext(): string | undefined {\n return this.opts.aiActContext ?? this.opts.aiActionContext;\n }\n\n /**\n * Flag to track if VL model warning has been shown\n */\n private hasWarnedNonVLModel = false;\n\n private executionDumpIndexByRunner = new WeakMap<TaskRunner, number>();\n\n private fullActionSpace: DeviceAction[];\n\n private reportGenerator: IReportGenerator;\n\n // @deprecated use .interface instead\n get page() {\n return this.interface;\n }\n\n /**\n * Ensures VL model warning is shown once when needed\n */\n private ensureVLModelWarning() {\n if (\n !this.hasWarnedNonVLModel &&\n this.interface.interfaceType !== 'puppeteer' &&\n this.interface.interfaceType !== 'playwright' &&\n this.interface.interfaceType !== 'static' &&\n this.interface.interfaceType !== 'chrome-extension-proxy' &&\n this.interface.interfaceType !== 'page-over-chrome-extension-bridge'\n ) {\n this.modelConfigManager.throwErrorIfNonVLModel();\n this.hasWarnedNonVLModel = true;\n }\n }\n\n private resolveReplanningCycleLimit(\n modelConfigForPlanning: IModelConfig,\n ): number {\n if (this.opts.replanningCycleLimit !== undefined) {\n return this.opts.replanningCycleLimit;\n }\n\n return isUITars(modelConfigForPlanning.modelFamily)\n ? defaultVlmUiTarsReplanningCycleLimit\n : isAutoGLM(modelConfigForPlanning.modelFamily)\n ? defaultAutoGlmReplanningCycleLimit\n : defaultReplanningCycleLimit;\n }\n\n constructor(interfaceInstance: InterfaceType, opts?: AgentOpt) {\n this.interface = interfaceInstance;\n\n const envReplanningCycleLimit =\n globalConfigManager.getEnvConfigValueAsNumber(\n MIDSCENE_REPLANNING_CYCLE_LIMIT,\n );\n\n this.opts = Object.assign(\n {\n generateReport: true,\n autoPrintReportMsg: true,\n groupName: 'Midscene Report',\n groupDescription: '',\n },\n opts || {},\n opts?.replanningCycleLimit === undefined &&\n envReplanningCycleLimit !== undefined &&\n !Number.isNaN(envReplanningCycleLimit)\n ? { replanningCycleLimit: envReplanningCycleLimit }\n : {},\n );\n\n const resolvedAiActContext =\n this.opts.aiActContext ?? this.opts.aiActionContext;\n if (resolvedAiActContext !== undefined) {\n this.opts.aiActContext = resolvedAiActContext;\n this.opts.aiActionContext ??= resolvedAiActContext;\n }\n\n if (\n opts?.modelConfig &&\n (typeof opts?.modelConfig !== 'object' || Array.isArray(opts.modelConfig))\n ) {\n throw new Error(\n `opts.modelConfig must be a plain object map of env keys to values, but got ${typeof opts?.modelConfig}`,\n );\n }\n // Create ModelConfigManager if modelConfig or createOpenAIClient is provided\n // Otherwise, use the global config manager\n const hasCustomConfig = opts?.modelConfig || opts?.createOpenAIClient;\n this.modelConfigManager = hasCustomConfig\n ? new ModelConfigManager(opts?.modelConfig, opts?.createOpenAIClient)\n : globalModelConfigManager;\n\n this.onTaskStartTip = this.opts.onTaskStartTip;\n\n this.service = new Service(async () => {\n return this.getUIContext();\n });\n\n // Process cache configuration\n const cacheConfigObj = this.processCacheConfig(opts || {});\n if (cacheConfigObj) {\n this.taskCache = new TaskCache(\n cacheConfigObj.id,\n cacheConfigObj.enabled,\n undefined, // cacheFilePath\n {\n readOnly: cacheConfigObj.readOnly,\n writeOnly: cacheConfigObj.writeOnly,\n },\n );\n }\n\n const baseActionSpace = this.interface.actionSpace();\n this.fullActionSpace = [...baseActionSpace, defineActionSleep()];\n\n this.taskExecutor = new TaskExecutor(this.interface, this.service, {\n taskCache: this.taskCache,\n onTaskStart: this.callbackOnTaskStartTip.bind(this),\n replanningCycleLimit: this.opts.replanningCycleLimit,\n waitAfterAction: this.opts.waitAfterAction,\n useDeviceTimestamp: this.opts.useDeviceTimestamp,\n actionSpace: this.fullActionSpace,\n hooks: {\n onTaskUpdate: (runner) => {\n const executionDump = runner.dump();\n this.appendExecutionDump(executionDump, runner);\n\n // Call all registered dump update listeners\n const dumpString = this.dumpDataString();\n for (const listener of this.dumpUpdateListeners) {\n try {\n listener(dumpString, executionDump);\n } catch (error) {\n console.error('Error in onDumpUpdate listener', error);\n }\n }\n\n // Fire and forget - don't block task execution\n this.writeOutActionDumps(executionDump);\n },\n },\n });\n this.dump = this.resetDump();\n this.reportFileName =\n opts?.reportFileName ||\n getReportFileName(opts?.testId || this.interface.interfaceType || 'web');\n\n this.reportGenerator = ReportGenerator.create(this.reportFileName!, {\n generateReport: this.opts.generateReport,\n outputFormat: this.opts.outputFormat,\n autoPrintReportMsg: this.opts.autoPrintReportMsg,\n });\n }\n\n async getActionSpace(): Promise<DeviceAction[]> {\n return this.fullActionSpace;\n }\n\n private static readonly CONTEXT_RETRY_MAX = 3;\n private static readonly CONTEXT_RETRY_DELAY_MS = 1500;\n\n /**\n * Override in subclasses to indicate which errors are transient and should\n * trigger an automatic retry when building the UI context.\n * Returns `false` by default (no retry).\n */\n protected isRetryableContextError(_error: unknown): boolean {\n return false;\n }\n\n async getUIContext(action?: ServiceAction): Promise<UIContext> {\n // Check VL model configuration when UI context is first needed\n this.ensureVLModelWarning();\n\n // If page context is frozen, return the frozen context for all actions\n if (this.frozenUIContext) {\n debug('Using frozen page context for action:', action);\n return this.frozenUIContext;\n }\n\n const { modelFamily } = this.modelConfigManager.getModelConfig('default');\n\n const maxRetries = Agent.CONTEXT_RETRY_MAX;\n for (let attempt = 0; ; attempt++) {\n try {\n return await commonContextParser(this.interface, {\n uploadServerUrl: this.modelConfigManager.getUploadTestServerUrl(),\n screenshotShrinkFactor: this.opts.screenshotShrinkFactor,\n modelFamily,\n });\n } catch (error) {\n if (attempt < maxRetries && this.isRetryableContextError(error)) {\n debug(\n `retryable context error (attempt ${attempt + 1}/${maxRetries}), retrying in ${Agent.CONTEXT_RETRY_DELAY_MS}ms: ${error}`,\n );\n await new Promise((resolve) =>\n setTimeout(resolve, Agent.CONTEXT_RETRY_DELAY_MS),\n );\n continue;\n }\n throw error;\n }\n }\n }\n\n async _snapshotContext(): Promise<UIContext> {\n return await this.getUIContext('locate');\n }\n\n /**\n * @deprecated Use {@link setAIActContext} instead.\n */\n async setAIActionContext(prompt: string) {\n await this.setAIActContext(prompt);\n }\n\n async setAIActContext(prompt: string) {\n if (this.aiActContext) {\n console.warn(\n 'aiActContext is already set, and it is called again, will override the previous setting',\n );\n }\n this.opts.aiActContext = prompt;\n this.opts.aiActionContext = prompt;\n }\n\n resetDump() {\n this.dump = new GroupedActionDump({\n sdkVersion: getVersion(),\n groupName: this.opts.groupName!,\n groupDescription: this.opts.groupDescription,\n executions: [],\n modelBriefs: [],\n deviceType: this.interface.interfaceType,\n });\n this.executionDumpIndexByRunner = new WeakMap<TaskRunner, number>();\n\n return this.dump;\n }\n\n appendExecutionDump(execution: ExecutionDump, runner?: TaskRunner) {\n const currentDump = this.dump;\n if (runner) {\n const existingIndex = this.executionDumpIndexByRunner.get(runner);\n if (existingIndex !== undefined) {\n currentDump.executions[existingIndex] = execution;\n return;\n }\n currentDump.executions.push(execution);\n this.executionDumpIndexByRunner.set(\n runner,\n currentDump.executions.length - 1,\n );\n return;\n }\n currentDump.executions.push(execution);\n }\n\n dumpDataString(opt?: { inlineScreenshots?: boolean }) {\n // update dump info\n this.dump.groupName = this.opts.groupName!;\n this.dump.groupDescription = this.opts.groupDescription;\n // In browser environment, use inline screenshots since file system is not available\n if (ifInBrowser || opt?.inlineScreenshots) {\n return this.dump.serializeWithInlineScreenshots();\n }\n return this.dump.serialize();\n }\n\n reportHTMLString(opt?: { inlineScreenshots?: boolean }) {\n // dumpDataString() handles browser environment with inline screenshots\n return reportHTMLContent(this.dumpDataString(opt));\n }\n\n private lastExecutionDump?: ExecutionDump;\n\n writeOutActionDumps(executionDump?: ExecutionDump) {\n const exec = executionDump || this.lastExecutionDump;\n if (exec) {\n this.lastExecutionDump = exec;\n this.reportGenerator.onExecutionUpdate(exec, this.getGroupMeta());\n }\n this.reportFile = this.reportGenerator.getReportPath();\n }\n\n private getGroupMeta(): GroupMeta {\n return {\n groupName: this.dump.groupName,\n groupDescription: this.dump.groupDescription,\n sdkVersion: this.dump.sdkVersion,\n modelBriefs: this.dump.modelBriefs,\n deviceType: this.dump.deviceType,\n };\n }\n\n private async callbackOnTaskStartTip(task: ExecutionTask) {\n const param = paramStr(task);\n const tip = param ? `${typeStr(task)} - ${param}` : typeStr(task);\n\n if (this.onTaskStartTip) {\n await this.onTaskStartTip(tip);\n }\n }\n\n wrapActionInActionSpace<T extends DeviceAction>(\n name: string,\n ): (param: ActionParam<T>) => Promise<ActionReturn<T>> {\n return async (param: ActionParam<T>) => {\n return await this.callActionInActionSpace<ActionReturn<T>>(name, param);\n };\n }\n\n async callActionInActionSpace<T = any>(\n type: string,\n opt?: T, // and all other action params\n ) {\n debug('callActionInActionSpace', type, ',', opt);\n\n const actionPlan: PlanningAction<T> = {\n type: type as any,\n param: (opt as any) || {},\n thought: '',\n };\n debug('actionPlan', actionPlan); // , ', in which the locateParam is', locateParam);\n\n const plans: PlanningAction[] = [actionPlan].filter(\n Boolean,\n ) as PlanningAction[];\n\n const title = taskTitleStr(\n type as any,\n locateParamStr((opt as any)?.locate || {}),\n );\n\n // assume all operation in action space is related to locating\n const defaultIntentModelConfig =\n this.modelConfigManager.getModelConfig('default');\n const modelConfigForPlanning =\n this.modelConfigManager.getModelConfig('planning');\n\n const { output } = await this.taskExecutor.runPlans(\n title,\n plans,\n modelConfigForPlanning,\n defaultIntentModelConfig,\n );\n return output;\n }\n\n async aiTap(\n locatePrompt: TUserPrompt,\n opt?: LocateOption & { fileChooserAccept?: string | string[] },\n ) {\n assert(locatePrompt, 'missing locate prompt for tap');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n const fileChooserAccept = opt?.fileChooserAccept\n ? this.normalizeFileInput(opt.fileChooserAccept)\n : undefined;\n\n return withFileChooser(this.interface, fileChooserAccept, async () => {\n return this.callActionInActionSpace('Tap', {\n locate: detailedLocateParam,\n });\n });\n }\n\n async aiRightClick(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for right click');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('RightClick', {\n locate: detailedLocateParam,\n });\n }\n\n async aiDoubleClick(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for double click');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('DoubleClick', {\n locate: detailedLocateParam,\n });\n }\n\n async aiHover(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for hover');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Hover', {\n locate: detailedLocateParam,\n });\n }\n\n // New signature, always use locatePrompt as the first param\n async aiInput(\n locatePrompt: TUserPrompt,\n opt: LocateOption & { value: string | number } & {\n autoDismissKeyboard?: boolean;\n } & { mode?: 'replace' | 'clear' | 'typeOnly' | 'append' },\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiInput(locatePrompt, opt) instead where opt contains the value\n */\n async aiInput(\n value: string | number,\n locatePrompt: TUserPrompt,\n opt?: LocateOption & { autoDismissKeyboard?: boolean } & {\n mode?: 'replace' | 'clear' | 'typeOnly' | 'append';\n }, // AndroidDeviceInputOpt &\n ): Promise<any>;\n\n // Implementation\n async aiInput(\n locatePromptOrValue: TUserPrompt | string | number,\n locatePromptOrOpt:\n | TUserPrompt\n | (LocateOption & { value: string | number } & {\n autoDismissKeyboard?: boolean;\n } & { mode?: 'replace' | 'clear' | 'typeOnly' | 'append' }) // AndroidDeviceInputOpt &\n | undefined,\n optOrUndefined?: LocateOption, // AndroidDeviceInputOpt &\n ) {\n let value: string | number;\n let locatePrompt: TUserPrompt;\n let opt:\n | (LocateOption & { value: string | number } & {\n autoDismissKeyboard?: boolean;\n } & { mode?: 'replace' | 'clear' | 'typeOnly' | 'append' }) // AndroidDeviceInputOpt &\n | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has value)\n if (\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null &&\n 'value' in locatePromptOrOpt\n ) {\n // New signature: aiInput(locatePrompt, opt)\n locatePrompt = locatePromptOrValue as TUserPrompt;\n const optWithValue = locatePromptOrOpt as LocateOption & {\n // AndroidDeviceInputOpt &\n value: string | number;\n autoDismissKeyboard?: boolean;\n };\n value = optWithValue.value;\n opt = optWithValue;\n } else {\n // Legacy signature: aiInput(value, locatePrompt, opt)\n value = locatePromptOrValue as string | number;\n locatePrompt = locatePromptOrOpt as TUserPrompt;\n opt = {\n ...optOrUndefined,\n value,\n };\n }\n\n assert(\n typeof value === 'string' || typeof value === 'number',\n 'input value must be a string or number, use empty string if you want to clear the input',\n );\n assert(locatePrompt, 'missing locate prompt for input');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n // Convert value to string to ensure consistency\n const stringValue = typeof value === 'number' ? String(value) : value;\n\n // backward compat: convert deprecated 'append' to 'typeOnly'\n const mode = opt?.mode === 'append' ? 'typeOnly' : opt?.mode;\n\n return this.callActionInActionSpace('Input', {\n ...(opt || {}),\n value: stringValue,\n locate: detailedLocateParam,\n mode,\n });\n }\n\n // New signature\n async aiKeyboardPress(\n locatePrompt: TUserPrompt,\n opt: LocateOption & { keyName: string },\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiKeyboardPress(locatePrompt, opt) instead where opt contains the keyName\n */\n async aiKeyboardPress(\n keyName: string,\n locatePrompt?: TUserPrompt,\n opt?: LocateOption,\n ): Promise<any>;\n\n // Implementation\n async aiKeyboardPress(\n locatePromptOrKeyName: TUserPrompt | string,\n locatePromptOrOpt:\n | TUserPrompt\n | (LocateOption & { keyName: string })\n | undefined,\n optOrUndefined?: LocateOption,\n ) {\n let keyName: string;\n let locatePrompt: TUserPrompt | undefined;\n let opt: (LocateOption & { keyName: string }) | undefined;\n\n // Check if using new signature (first param is locatePrompt, second has keyName)\n if (\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null &&\n 'keyName' in locatePromptOrOpt\n ) {\n // New signature: aiKeyboardPress(locatePrompt, opt)\n locatePrompt = locatePromptOrKeyName as TUserPrompt;\n opt = locatePromptOrOpt as LocateOption & {\n keyName: string;\n };\n } else {\n // Legacy signature: aiKeyboardPress(keyName, locatePrompt, opt)\n keyName = locatePromptOrKeyName as string;\n locatePrompt = locatePromptOrOpt as TUserPrompt | undefined;\n opt = {\n ...(optOrUndefined || {}),\n keyName,\n };\n }\n\n assert(opt?.keyName, 'missing keyName for keyboard press');\n\n const detailedLocateParam = locatePrompt\n ? buildDetailedLocateParam(locatePrompt, opt)\n : undefined;\n\n return this.callActionInActionSpace('KeyboardPress', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n // New signature\n async aiScroll(\n locatePrompt: TUserPrompt | undefined,\n opt: LocateOption & ScrollParam,\n ): Promise<any>;\n\n // Legacy signature - deprecated\n /**\n * @deprecated Use aiScroll(locatePrompt, opt) instead where opt contains the scroll parameters\n */\n async aiScroll(\n scrollParam: ScrollParam,\n locatePrompt?: TUserPrompt,\n opt?: LocateOption,\n ): Promise<any>;\n\n // Implementation\n async aiScroll(\n locatePromptOrScrollParam: TUserPrompt | ScrollParam | undefined,\n locatePromptOrOpt: TUserPrompt | (LocateOption & ScrollParam) | undefined,\n optOrUndefined?: LocateOption,\n ) {\n let scrollParam: ScrollParam;\n let locatePrompt: TUserPrompt | undefined;\n let opt: LocateOption | undefined;\n\n const isLocatePromptLike = (value: unknown): value is TUserPrompt => {\n if (typeof value === 'string' || typeof value === 'undefined') {\n return true;\n }\n\n return typeof value === 'object' && value !== null && 'prompt' in value;\n };\n\n // Check if using new signature (first param is locatePrompt, second is options)\n if (\n isLocatePromptLike(locatePromptOrScrollParam) &&\n typeof locatePromptOrOpt === 'object' &&\n locatePromptOrOpt !== null\n ) {\n // New signature: aiScroll(locatePrompt, opt)\n locatePrompt = locatePromptOrScrollParam as TUserPrompt;\n opt = locatePromptOrOpt as LocateOption & ScrollParam;\n } else {\n // Legacy signature: aiScroll(scrollParam, locatePrompt, opt)\n scrollParam = locatePromptOrScrollParam as ScrollParam;\n locatePrompt = locatePromptOrOpt as TUserPrompt | undefined;\n opt = {\n ...(optOrUndefined || {}),\n ...(scrollParam || {}),\n };\n }\n\n if (opt) {\n const normalizedScrollType = normalizeScrollType(\n (opt as ScrollParam).scrollType as\n | ScrollParam['scrollType']\n | LegacyScrollType\n | undefined,\n );\n\n if (normalizedScrollType !== (opt as ScrollParam).scrollType) {\n (opt as ScrollParam) = {\n ...(opt || {}),\n scrollType: normalizedScrollType as ScrollParam['scrollType'],\n };\n }\n }\n\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt || '',\n opt,\n );\n\n return this.callActionInActionSpace('Scroll', {\n ...(opt || {}),\n locate: detailedLocateParam,\n });\n }\n\n async aiPinch(\n locatePrompt: TUserPrompt | undefined,\n opt: LocateOption & {\n direction: 'in' | 'out';\n distance?: number;\n duration?: number;\n },\n ) {\n const detailedLocateParam = buildDetailedLocateParam(\n locatePrompt || '',\n opt,\n );\n\n return this.callActionInActionSpace('Pinch', {\n ...opt,\n locate: detailedLocateParam,\n });\n }\n\n async aiAct(\n taskPrompt: string,\n opt?: AiActOptions,\n ): Promise<string | undefined> {\n const fileChooserAccept = opt?.fileChooserAccept\n ? this.normalizeFileInput(opt.fileChooserAccept)\n : undefined;\n\n const abortSignal = opt?.abortSignal;\n if (abortSignal?.aborted) {\n throw new Error(\n `aiAct aborted: ${abortSignal.reason || 'signal already aborted'}`,\n );\n }\n\n const runAiAct = async () => {\n const modelConfigForPlanning =\n this.modelConfigManager.getModelConfig('planning');\n const defaultIntentModelConfig =\n this.modelConfigManager.getModelConfig('default');\n const deepThink = opt?.deepThink === 'unset' ? undefined : opt?.deepThink;\n\n const deepLocate = opt?.deepLocate;\n\n const noIndividualLocateModel =\n modelConfigForPlanning.modelName ===\n defaultIntentModelConfig.modelName &&\n modelConfigForPlanning.openaiBaseURL ===\n defaultIntentModelConfig.openaiBaseURL;\n\n const includeBboxInPlanning = !deepThink && noIndividualLocateModel;\n\n debug('setting includeBboxInPlanning to', includeBboxInPlanning, {\n deepThink,\n noIndividualLocateModel,\n });\n\n const cacheable = opt?.cacheable;\n const replanningCycleLimit = this.resolveReplanningCycleLimit(\n modelConfigForPlanning,\n );\n // if vlm-ui-tars or auto-glm, plan cache is not used\n const isVlmUiTars = isUITars(modelConfigForPlanning.modelFamily);\n const isAutoGlm = isAutoGLM(modelConfigForPlanning.modelFamily);\n const matchedCache =\n isVlmUiTars || isAutoGlm || cacheable === false\n ? undefined\n : this.taskCache?.matchPlanCache(taskPrompt);\n if (\n matchedCache?.cacheUsable &&\n this.taskCache?.isCacheResultUsed &&\n matchedCache.cacheContent?.yamlWorkflow?.trim()\n ) {\n // log into report file\n await this.taskExecutor.loadYamlFlowAsPlanning(\n taskPrompt,\n matchedCache.cacheContent.yamlWorkflow,\n );\n\n debug('matched cache, will call .runYaml to run the action');\n const yaml = matchedCache.cacheContent.yamlWorkflow;\n await this.runYaml(yaml);\n return;\n }\n\n // If cache matched but is not executable, fall through to normal execution\n const imagesIncludeCount: number = deepThink ? 2 : 1;\n const { output: actionOutput } = await this.taskExecutor.action(\n taskPrompt,\n modelConfigForPlanning,\n defaultIntentModelConfig,\n includeBboxInPlanning,\n this.aiActContext,\n cacheable,\n replanningCycleLimit,\n imagesIncludeCount,\n deepThink,\n fileChooserAccept,\n deepLocate,\n abortSignal,\n );\n\n // update cache\n if (\n this.taskCache &&\n actionOutput?.yamlFlow?.length &&\n cacheable !== false\n ) {\n const yamlContent: MidsceneYamlScript = {\n tasks: [\n {\n name: taskPrompt,\n flow: actionOutput.yamlFlow,\n },\n ],\n };\n const yamlFlowStr = yaml.dump(yamlContent);\n this.taskCache.updateOrAppendCacheRecord(\n {\n type: 'plan',\n prompt: taskPrompt,\n yamlWorkflow: yamlFlowStr,\n },\n matchedCache,\n );\n }\n\n return actionOutput?.output;\n };\n\n return await runAiAct();\n }\n\n /**\n * @deprecated Use {@link Agent.aiAct} instead.\n */\n async aiAction(taskPrompt: string, opt?: AiActOptions) {\n return this.aiAct(taskPrompt, opt);\n }\n\n async aiQuery<ReturnType = any>(\n demand: ServiceExtractParam,\n opt: ServiceExtractOption = defaultServiceExtractOption,\n ): Promise<ReturnType> {\n const modelConfig = this.modelConfigManager.getModelConfig('insight');\n const { output } = await this.taskExecutor.createTypeQueryExecution(\n 'Query',\n demand,\n modelConfig,\n opt,\n );\n return output as ReturnType;\n }\n\n async aiBoolean(\n prompt: TUserPrompt,\n opt: ServiceExtractOption = defaultServiceExtractOption,\n ): Promise<boolean> {\n const modelConfig = this.modelConfigManager.getModelConfig('insight');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output } = await this.taskExecutor.createTypeQueryExecution(\n 'Boolean',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n return output as boolean;\n }\n\n async aiNumber(\n prompt: TUserPrompt,\n opt: ServiceExtractOption = defaultServiceExtractOption,\n ): Promise<number> {\n const modelConfig = this.modelConfigManager.getModelConfig('insight');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output } = await this.taskExecutor.createTypeQueryExecution(\n 'Number',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n return output as number;\n }\n\n async aiString(\n prompt: TUserPrompt,\n opt: ServiceExtractOption = defaultServiceExtractOption,\n ): Promise<string> {\n const modelConfig = this.modelConfigManager.getModelConfig('insight');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output } = await this.taskExecutor.createTypeQueryExecution(\n 'String',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n return output as string;\n }\n\n async aiAsk(\n prompt: TUserPrompt,\n opt: ServiceExtractOption = defaultServiceExtractOption,\n ): Promise<string> {\n return this.aiString(prompt, opt);\n }\n\n async describeElementAtPoint(\n center: [number, number],\n opt?: {\n verifyPrompt?: boolean;\n retryLimit?: number;\n deepLocate?: boolean;\n } & LocatorValidatorOption,\n ): Promise<AgentDescribeElementAtPointResult> {\n const { verifyPrompt = true, retryLimit = 3 } = opt || {};\n\n let success = false;\n let retryCount = 0;\n let resultPrompt = '';\n let deepLocate = opt?.deepLocate || false;\n let verifyResult: LocateValidatorResult | undefined;\n\n while (!success && retryCount < retryLimit) {\n if (retryCount >= 2) {\n deepLocate = true;\n }\n debug(\n 'aiDescribe',\n center,\n 'verifyPrompt',\n verifyPrompt,\n 'retryCount',\n retryCount,\n 'deepLocate',\n deepLocate,\n );\n // use same intent as aiLocate\n const modelConfig = this.modelConfigManager.getModelConfig('insight');\n\n const text = await this.service.describe(center, modelConfig, {\n deepLocate,\n });\n debug('aiDescribe text', text);\n assert(text.description, `failed to describe element at [${center}]`);\n resultPrompt = text.description;\n\n // Don't pass deepLocate to verification locate — the description was generated\n // from a cropped view (deepLocate describe), but verification should use regular\n // locate on the full screenshot to confirm the description works universally.\n // Passing deepLocate here would trigger AiLocateSection with an element-level\n // description as a section prompt, which is semantically incorrect.\n verifyResult = await this.verifyLocator(\n resultPrompt,\n undefined,\n center,\n opt,\n );\n if (verifyResult.pass) {\n success = true;\n } else {\n retryCount++;\n }\n }\n\n return {\n prompt: resultPrompt,\n deepLocate,\n verifyResult,\n };\n }\n\n async verifyLocator(\n prompt: string,\n locateOpt: LocateOption | undefined,\n expectCenter: [number, number],\n verifyLocateOption?: LocatorValidatorOption,\n ): Promise<LocateValidatorResult> {\n debug('verifyLocator', prompt, locateOpt, expectCenter, verifyLocateOption);\n\n const { center: verifyCenter, rect: verifyRect } = await this.aiLocate(\n prompt,\n locateOpt,\n );\n const distance = distanceOfTwoPoints(expectCenter, verifyCenter);\n const included = includedInRect(expectCenter, verifyRect);\n const pass =\n distance <= (verifyLocateOption?.centerDistanceThreshold || 20) ||\n included;\n const verifyResult = {\n pass,\n rect: verifyRect,\n center: verifyCenter,\n centerDistance: distance,\n };\n debug('aiDescribe verifyResult', verifyResult);\n return verifyResult;\n }\n\n async aiLocate(prompt: TUserPrompt, opt?: LocateOption) {\n const locateParam = buildDetailedLocateParam(prompt, opt);\n assert(locateParam, 'cannot get locate param for aiLocate');\n const locatePlan = locatePlanForLocate(locateParam);\n const plans = [locatePlan];\n const defaultIntentModelConfig =\n this.modelConfigManager.getModelConfig('default');\n const modelConfigForPlanning =\n this.modelConfigManager.getModelConfig('planning');\n\n const { output } = await this.taskExecutor.runPlans(\n taskTitleStr('Locate', locateParamStr(locateParam)),\n plans,\n modelConfigForPlanning,\n defaultIntentModelConfig,\n );\n\n const { element } = output;\n\n return {\n rect: element?.rect,\n center: element?.center,\n dpr: element?.dpr,\n } as Pick<LocateResultElement, 'rect' | 'center'>;\n }\n\n async aiAssert(\n assertion: TUserPrompt,\n msg?: string,\n opt?: AgentAssertOpt & ServiceExtractOption,\n ) {\n const modelConfig = this.modelConfigManager.getModelConfig('insight');\n\n const serviceOpt: ServiceExtractOption = {\n domIncluded: opt?.domIncluded ?? defaultServiceExtractOption.domIncluded,\n screenshotIncluded:\n opt?.screenshotIncluded ??\n defaultServiceExtractOption.screenshotIncluded,\n };\n\n const { textPrompt, multimodalPrompt } = parsePrompt(assertion);\n const assertionText =\n typeof assertion === 'string' ? assertion : assertion.prompt;\n\n try {\n const { output, thought } =\n await this.taskExecutor.createTypeQueryExecution<boolean>(\n 'Assert',\n textPrompt,\n modelConfig,\n serviceOpt,\n multimodalPrompt,\n );\n\n const pass = Boolean(output);\n const message = pass\n ? undefined\n : `Assertion failed: ${msg || assertionText}\\nReason: ${thought || '(no_reason)'}`;\n\n if (opt?.keepRawResponse) {\n return {\n pass,\n thought,\n message,\n };\n }\n\n if (!pass) {\n throw new Error(message);\n }\n } catch (error) {\n if (error instanceof TaskExecutionError) {\n const errorTask = error.errorTask;\n const thought = errorTask?.thought;\n const rawError = errorTask?.error;\n const rawMessage =\n errorTask?.errorMessage ||\n (rawError instanceof Error\n ? rawError.message\n : rawError\n ? String(rawError)\n : undefined);\n const reason = thought || rawMessage || '(no_reason)';\n const message = `Assertion failed: ${msg || assertionText}\\nReason: ${reason}`;\n\n if (opt?.keepRawResponse) {\n return {\n pass: false,\n thought,\n message,\n };\n }\n\n throw new Error(message, {\n cause: rawError ?? error,\n });\n }\n\n throw error;\n }\n }\n\n async aiWaitFor(assertion: TUserPrompt, opt?: AgentWaitForOpt) {\n const modelConfig = this.modelConfigManager.getModelConfig('insight');\n await this.taskExecutor.waitFor(\n assertion,\n {\n ...opt,\n timeoutMs: opt?.timeoutMs || 15 * 1000,\n checkIntervalMs: opt?.checkIntervalMs || 3 * 1000,\n },\n modelConfig,\n );\n }\n\n async ai(...args: Parameters<typeof this.aiAct>) {\n return this.aiAct(...args);\n }\n\n async runYaml(yamlScriptContent: string): Promise<{\n result: Record<string, any>;\n }> {\n const script = parseYamlScript(yamlScriptContent, 'yaml');\n const player = new ScriptPlayer(script, async () => {\n return { agent: this, freeFn: [] };\n });\n await player.run();\n\n if (player.status === 'error') {\n const errors = player.taskStatusList\n .filter((task) => task.status === 'error')\n .map((task) => {\n return `task - ${task.name}: ${task.error?.message}`;\n })\n .join('\\n');\n throw new Error(`Error(s) occurred in running yaml script:\\n${errors}`);\n }\n\n return {\n result: player.result,\n };\n }\n\n async evaluateJavaScript(script: string) {\n assert(\n this.interface.evaluateJavaScript,\n 'evaluateJavaScript is not supported in current agent',\n );\n return this.interface.evaluateJavaScript(script);\n }\n\n /**\n * Add a dump update listener\n * @param listener Listener function\n * @returns A remove function that can be called to remove this listener\n */\n addDumpUpdateListener(\n listener: (dump: string, executionDump?: ExecutionDump) => void,\n ): () => void {\n this.dumpUpdateListeners.push(listener);\n\n // Return remove function\n return () => {\n this.removeDumpUpdateListener(listener);\n };\n }\n\n /**\n * Remove a dump update listener\n * @param listener The listener function to remove\n */\n removeDumpUpdateListener(\n listener: (dump: string, executionDump?: ExecutionDump) => void,\n ): void {\n const index = this.dumpUpdateListeners.indexOf(listener);\n if (index > -1) {\n this.dumpUpdateListeners.splice(index, 1);\n }\n }\n\n /**\n * Clear all dump update listeners\n */\n clearDumpUpdateListeners(): void {\n this.dumpUpdateListeners = [];\n }\n\n async destroy() {\n // Early return if already destroyed\n if (this.destroyed) {\n return;\n }\n\n // Wait for all queued write operations to complete\n await this.reportGenerator.flush();\n\n const finalPath = await this.reportGenerator.finalize();\n this.reportFile = finalPath;\n\n await this.interface.destroy?.();\n this.resetDump(); // reset dump to release memory\n this.destroyed = true;\n }\n\n async recordToReport(\n title?: string,\n opt?: {\n content: string;\n },\n ) {\n // 1. screenshot\n const base64 = await this.interface.screenshotBase64();\n const now = Date.now();\n const screenshot = ScreenshotItem.create(base64, now);\n // 2. build recorder\n const recorder: ExecutionRecorderItem[] = [\n {\n type: 'screenshot',\n ts: now,\n screenshot,\n },\n ];\n // 3. build ExecutionTaskLog\n const task: ExecutionTaskLog = {\n taskId: uuid(),\n type: 'Log',\n subType: 'Screenshot',\n status: 'finished',\n recorder,\n timing: {\n start: now,\n end: now,\n cost: 0,\n },\n param: {\n content: opt?.content || '',\n },\n executor: async () => {},\n };\n // 4. build ExecutionDump\n const executionDump = new ExecutionDump({\n id: uuid(),\n logTime: now,\n name: `Log - ${title || 'untitled'}`,\n description: opt?.content || '',\n tasks: [task],\n });\n // 5. append to execution dump\n this.appendExecutionDump(executionDump);\n\n // Call all registered dump update listeners\n const dumpString = this.dumpDataString();\n for (const listener of this.dumpUpdateListeners) {\n try {\n listener(dumpString);\n } catch (error) {\n console.error('Error in onDumpUpdate listener', error);\n }\n }\n\n this.writeOutActionDumps(executionDump);\n await this.reportGenerator.flush();\n }\n\n /**\n * @deprecated Use {@link Agent.recordToReport} instead.\n */\n async logScreenshot(\n title?: string,\n opt?: {\n content: string;\n },\n ) {\n await this.recordToReport(title, opt);\n }\n\n _unstableLogContent() {\n const { groupName, groupDescription, executions } = this.dump;\n return {\n groupName,\n groupDescription,\n executions: executions || [],\n };\n }\n\n /**\n * Freezes the current page context to be reused in subsequent AI operations\n * This avoids recalculating page context for each operation\n */\n async freezePageContext(): Promise<void> {\n debug('Freezing page context');\n const context = await this._snapshotContext();\n // Mark the context as frozen\n context._isFrozen = true;\n this.frozenUIContext = context;\n debug('Page context frozen successfully');\n }\n\n /**\n * Unfreezes the page context, allowing AI operations to calculate context dynamically\n */\n async unfreezePageContext(): Promise<void> {\n debug('Unfreezing page context');\n this.frozenUIContext = undefined;\n debug('Page context unfrozen successfully');\n }\n\n /**\n * Process cache configuration and return normalized cache settings\n */\n private processCacheConfig(opts: AgentOpt): {\n id: string;\n enabled: boolean;\n readOnly: boolean;\n writeOnly: boolean;\n } | null {\n // Validate original cache config before processing\n // Agent requires explicit IDs - don't allow auto-generation\n if (opts.cache === true) {\n throw new Error(\n 'cache: true requires an explicit cache ID. Please provide:\\n' +\n 'Example: cache: { id: \"my-cache-id\" }',\n );\n }\n\n // Check if cache config object is missing ID\n if (\n opts.cache &&\n typeof opts.cache === 'object' &&\n opts.cache !== null &&\n !opts.cache.id\n ) {\n throw new Error(\n 'cache configuration requires an explicit id.\\n' +\n 'Example: cache: { id: \"my-cache-id\" }',\n );\n }\n\n // Use the unified utils function to process cache configuration\n const cacheConfig = processCacheConfig(\n opts.cache,\n opts.cacheId || opts.testId || 'default',\n );\n\n if (!cacheConfig) {\n return null;\n }\n\n // Handle cache configuration object\n if (typeof cacheConfig === 'object' && cacheConfig !== null) {\n const id = cacheConfig.id;\n const rawStrategy = cacheConfig.strategy as unknown;\n let strategyValue: string;\n\n if (rawStrategy === undefined) {\n strategyValue = 'read-write';\n } else if (typeof rawStrategy === 'string') {\n strategyValue = rawStrategy;\n } else {\n throw new Error(\n `cache.strategy must be a string when provided, but received type ${typeof rawStrategy}`,\n );\n }\n\n if (!isValidCacheStrategy(strategyValue)) {\n throw new Error(\n `cache.strategy must be one of ${CACHE_STRATEGY_VALUES}, but received \"${strategyValue}\"`,\n );\n }\n\n const isReadOnly = strategyValue === 'read-only';\n const isWriteOnly = strategyValue === 'write-only';\n\n return {\n id,\n enabled: !isWriteOnly,\n readOnly: isReadOnly,\n writeOnly: isWriteOnly,\n };\n }\n\n return null;\n }\n\n private normalizeFilePaths(files: string[]): string[] {\n if (ifInBrowser) {\n throw new Error('File chooser is not supported in browser environment');\n }\n\n return files.map((file) => {\n const absolutePath = resolve(file);\n if (!existsSync(absolutePath)) {\n throw new Error(`File not found: ${file}`);\n }\n return absolutePath;\n });\n }\n\n private normalizeFileInput(files: string | string[]): string[] {\n const filesArray = Array.isArray(files) ? files : [files];\n return this.normalizeFilePaths(filesArray);\n }\n\n /**\n * Manually flush cache to file\n * @param options - Optional configuration\n * @param options.cleanUnused - If true, removes unused cache records before flushing\n */\n async flushCache(options?: { cleanUnused?: boolean }): Promise<void> {\n if (!this.taskCache) {\n throw new Error('Cache is not configured');\n }\n\n this.taskCache.flushCacheToFile(options);\n }\n}\n\nexport const createAgent = (\n interfaceInstance: AbstractInterface,\n opts?: AgentOpt,\n) => {\n return new Agent(interfaceInstance, opts);\n};\n","import type { DeviceAction } from '@midscene/core';\nimport { findAllMidsceneLocatorField } from '@midscene/core/ai-model';\nimport type { ExecutionOptions, FormValue, ValidationResult } from '../types';\n\nexport abstract class BasePlaygroundAdapter {\n abstract parseStructuredParams(\n action: DeviceAction<unknown>,\n params: Record<string, unknown>,\n options: ExecutionOptions,\n ): Promise<unknown[]>;\n\n abstract formatErrorMessage(error: any): string;\n\n // Abstract method for execution - must be implemented by concrete adapters\n abstract executeAction(\n actionType: string,\n value: FormValue,\n options: ExecutionOptions,\n ): Promise<unknown>;\n\n // Optional method for getting action space - default implementation returns empty array\n async getActionSpace(_context: any): Promise<DeviceAction<unknown>[]> {\n return [];\n }\n\n // Common validation logic - can be overridden if needed\n validateParams(\n value: FormValue,\n action: DeviceAction<unknown> | undefined,\n ): ValidationResult {\n if (!action?.paramSchema) {\n return { valid: true };\n }\n\n const needsStructuredParams = this.actionNeedsStructuredParams(action);\n\n if (!needsStructuredParams) {\n return { valid: true };\n }\n\n if (!value.params) {\n return { valid: false, errorMessage: 'Parameters are required' };\n }\n\n try {\n const paramsForValidation = this.prepareParamsForValidation(\n value.params,\n action,\n );\n action.paramSchema.parse(paramsForValidation);\n return { valid: true };\n } catch (error: unknown) {\n return this.handleValidationError(error);\n }\n }\n\n // Common display content creation logic - can be overridden if needed\n createDisplayContent(\n value: FormValue,\n needsStructuredParams: boolean,\n action: DeviceAction<unknown> | undefined,\n ): string {\n if (!needsStructuredParams || !value.params || !action?.paramSchema) {\n return value.prompt || '';\n }\n\n const paramsList = this.buildParamsDisplayList(value.params, action);\n return paramsList.join('\\n') || value.prompt || '';\n }\n\n // Helper method for basic error message formatting\n protected formatBasicErrorMessage(error: any): string {\n return error?.message || 'Unknown error';\n }\n\n // Helper method for parsing structured params base logic\n protected getSchemaKeys(action: DeviceAction<unknown>): string[] {\n if (!action?.paramSchema || !('shape' in action.paramSchema)) {\n return [];\n }\n\n const schema = action.paramSchema;\n return schema && 'shape' in schema\n ? Object.keys((schema as { shape: Record<string, unknown> }).shape)\n : [];\n }\n\n // Helper method for filtering valid params\n protected filterValidParams(\n params: Record<string, unknown>,\n excludeKeys: string[] = [],\n ): Record<string, unknown> {\n const filtered: Record<string, unknown> = {};\n\n Object.keys(params).forEach((key) => {\n if (\n !excludeKeys.includes(key) &&\n params[key] !== undefined &&\n params[key] !== null &&\n params[key] !== ''\n ) {\n filtered[key] = params[key];\n }\n });\n\n return filtered;\n }\n\n // Check if action needs structured parameters\n protected actionNeedsStructuredParams(\n action: DeviceAction<unknown>,\n ): boolean {\n if (\n typeof action.paramSchema === 'object' &&\n 'shape' in action.paramSchema\n ) {\n const shape =\n (action.paramSchema as { shape: Record<string, unknown> }).shape || {};\n return Object.keys(shape).length > 0;\n }\n return true; // If paramSchema exists but not in expected format, assume it needs params\n }\n\n // Prepare parameters for validation by converting string locate fields\n protected prepareParamsForValidation(\n params: Record<string, unknown>,\n action: DeviceAction<unknown>,\n ): Record<string, unknown> {\n const paramsForValidation = { ...params };\n\n if (action.paramSchema) {\n const locatorFieldKeys = findAllMidsceneLocatorField(action.paramSchema);\n locatorFieldKeys.forEach((key: string) => {\n if (typeof paramsForValidation[key] === 'string') {\n paramsForValidation[key] = {\n midscene_location_field_flag: true,\n prompt: paramsForValidation[key],\n center: [0, 0], // dummy values for validation\n rect: { left: 0, top: 0, width: 0, height: 0 },\n };\n }\n });\n }\n\n return paramsForValidation;\n }\n\n // Handle validation errors with proper error message extraction\n protected handleValidationError(error: unknown): ValidationResult {\n const zodError = error as {\n errors?: Array<{ path: string[]; message: string }>;\n };\n\n if (zodError.errors && zodError.errors.length > 0) {\n const errorMessages = zodError.errors\n .filter((err) => {\n const path = err.path.join('.');\n return (\n !path.includes('center') &&\n !path.includes('rect') &&\n !path.includes('midscene_location_field_flag')\n );\n })\n .map((err) => {\n const field = err.path.join('.');\n return `${field}: ${err.message}`;\n });\n\n if (errorMessages.length > 0) {\n return {\n valid: false,\n errorMessage: `Validation error: ${errorMessages.join(', ')}`,\n };\n }\n }\n\n const errorMsg =\n error instanceof Error ? error.message : 'Unknown validation error';\n\n return {\n valid: false,\n errorMessage: `Parameter validation failed: ${errorMsg}`,\n };\n }\n\n // Build display list for parameters\n protected buildParamsDisplayList(\n params: Record<string, unknown>,\n action: DeviceAction<unknown>,\n ): string[] {\n const paramsList: string[] = [];\n const schema = action.paramSchema;\n\n if (!(schema && 'shape' in schema)) {\n return paramsList;\n }\n\n const locatorFieldKeys = findAllMidsceneLocatorField(schema);\n const shapeKeys = Object.keys(\n (schema as { shape: Record<string, unknown> }).shape,\n );\n\n shapeKeys.forEach((key) => {\n const paramValue = params[key];\n if (this.isValidParamValue(paramValue)) {\n const displayKey = this.capitalizeFirstLetter(key);\n const formattedValue = this.formatParamValue(\n key,\n paramValue,\n locatorFieldKeys.includes(key),\n );\n paramsList.push(`${displayKey}: ${formattedValue}`);\n }\n });\n\n return paramsList;\n }\n\n // Check if parameter value is valid for display\n protected isValidParamValue(value: unknown): boolean {\n return value !== undefined && value !== null && value !== '';\n }\n\n // Capitalize first letter of a string\n protected capitalizeFirstLetter(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n // Format parameter value for display\n protected formatParamValue(\n key: string,\n value: unknown,\n isLocateField: boolean,\n ): string {\n if (isLocateField || typeof value === 'string') {\n return `\"${value}\"`;\n }\n\n if (typeof value === 'number') {\n // Special handling for distance in scroll\n return key === 'distance' ? `${value}px` : `${value}`;\n }\n\n return `${value}`;\n }\n}\n","import type { DeviceAction, ExecutionDump } from '@midscene/core';\nimport { GroupedActionDump } from '@midscene/core';\nimport { overrideAIConfig } from '@midscene/shared/env';\nimport { uuid } from '@midscene/shared/utils';\nimport { executeAction, parseStructuredParams } from '../common';\nimport {\n type PlaygroundRuntimeInfo,\n buildRuntimeInfo,\n} from '../runtime-metadata';\nimport type {\n AgentFactory,\n ExecutionOptions,\n FormValue,\n PlaygroundAgent,\n} from '../types';\nimport { BasePlaygroundAdapter } from './base';\n\nexport class LocalExecutionAdapter extends BasePlaygroundAdapter {\n private agent: PlaygroundAgent | null;\n private agentFactory?: AgentFactory; // Factory function for recreating agent\n private dumpUpdateCallback?: (\n dump: string,\n executionDump?: ExecutionDump,\n ) => void;\n private progressCallback?: (tip: string) => void;\n private readonly _id: string; // Unique identifier for this local adapter instance\n private currentRequestId?: string; // Track current request to prevent stale callbacks\n\n constructor(agent?: PlaygroundAgent, agentFactory?: AgentFactory) {\n super();\n this.agent = agent ?? null;\n this.agentFactory = agentFactory;\n this._id = uuid(); // Generate unique ID for local adapter\n }\n\n // Get adapter ID\n get id(): string {\n return this._id;\n }\n\n onDumpUpdate(\n callback: (dump: string, executionDump?: ExecutionDump) => void,\n ): void {\n // Clear any existing callback before setting new one\n this.dumpUpdateCallback = undefined;\n // Set the new callback\n this.dumpUpdateCallback = callback;\n }\n\n // Set progress callback for monitoring operation status\n setProgressCallback(callback: (tip: string) => void): void {\n this.progressCallback = undefined;\n this.progressCallback = callback;\n }\n\n async parseStructuredParams(\n action: DeviceAction<unknown>,\n params: Record<string, unknown>,\n options: ExecutionOptions,\n ): Promise<unknown[]> {\n // Use shared implementation from common.ts\n return await parseStructuredParams(action, params, options);\n }\n\n formatErrorMessage(error: any): string {\n const errorMessage = error?.message || '';\n if (errorMessage.includes('of different extension')) {\n return 'Conflicting extension detected. Please disable the suspicious plugins and refresh the page. Guide: https://midscenejs.com/quick-experience.html#faq';\n }\n return this.formatBasicErrorMessage(error);\n }\n\n // Local execution - use base implementation\n // (inherits default executeAction from BasePlaygroundAdapter)\n\n // Local execution gets actionSpace from internal agent (parameter is for backward compatibility)\n async getActionSpace(context?: unknown): Promise<DeviceAction<unknown>[]> {\n // If agent doesn't exist but we have a factory, create one temporarily to get actionSpace\n if (!this.agent && this.agentFactory) {\n try {\n this.agent = await this.agentFactory();\n } catch (error) {\n console.warn('Failed to create agent for actionSpace:', error);\n return [];\n }\n }\n\n // Priority 1: Use agent's getActionSpace method\n if (this.agent?.getActionSpace) {\n return await this.agent.getActionSpace();\n }\n\n // Priority 2: Use agent's interface.actionSpace method\n if (\n this.agent &&\n 'interface' in this.agent &&\n typeof this.agent.interface === 'object'\n ) {\n const page = this.agent.interface as {\n actionSpace?: () => DeviceAction<unknown>[];\n };\n if (page?.actionSpace) {\n return page.actionSpace();\n }\n }\n\n // Priority 3: Fallback to context parameter (for backward compatibility with tests)\n if (context && typeof context === 'object' && 'actionSpace' in context) {\n const contextPage = context as {\n actionSpace: () => DeviceAction<unknown>[];\n };\n return contextPage.actionSpace();\n }\n\n return [];\n }\n\n // Local execution doesn't use a server, so always return true\n async checkStatus(): Promise<boolean> {\n return true;\n }\n\n async overrideConfig(aiConfig: Record<string, unknown>): Promise<void> {\n // For local execution, use the shared env override function\n overrideAIConfig(aiConfig);\n console.log('Config updated. Agent will be recreated on next execution.');\n }\n\n /**\n * Safely detaches the Chrome debugger without destroying the agent.\n * This removes the \"Debugger attached\" banner from the browser window\n * while keeping the agent instance intact for potential reuse.\n * Called on errors to improve user experience by cleaning up the UI.\n */\n private async detachDebuggerSafely() {\n try {\n const page = this.agent?.interface as\n | { detachDebugger?: () => Promise<void> }\n | undefined;\n await page?.detachDebugger?.();\n } catch (error) {\n console.warn('Failed to detach debugger:', error);\n }\n }\n\n async executeAction(\n actionType: string,\n value: FormValue,\n options: ExecutionOptions,\n ): Promise<unknown> {\n // If agentFactory is provided, always recreate agent with latest config before execution\n if (this.agentFactory) {\n if (this.agent) {\n console.log('Destroying old agent before execution...');\n try {\n await this.agent.destroy?.();\n } catch (error) {\n console.warn('Failed to destroy old agent:', error);\n }\n this.agent = null;\n }\n\n // Create new agent with latest config\n await this.recreateAgent();\n }\n\n // Agent must exist (either recreated or provided in constructor)\n if (!this.agent) {\n throw new Error(\n 'No agent available. Please provide either an agent instance or agentFactory.',\n );\n }\n\n const agent = this.agent;\n\n // Get actionSpace using our simplified getActionSpace method\n const actionSpace = await this.getActionSpace();\n let removeListener: (() => void) | undefined;\n\n // Reset dump at the start of execution to ensure clean state\n try {\n agent.resetDump?.();\n } catch (error: unknown) {\n console.warn('Failed to reset dump before execution:', error);\n }\n\n // Setup dump update tracking if requestId is provided\n if (options.requestId) {\n // Track current request ID to prevent stale callbacks\n this.currentRequestId = options.requestId;\n\n // Add listener and save remove function\n removeListener = agent.addDumpUpdateListener(\n (dump: string, executionDump?: ExecutionDump) => {\n // Only process if this is still the current request\n if (this.currentRequestId !== options.requestId) {\n return;\n }\n\n // Forward to external callback\n if (this.dumpUpdateCallback) {\n this.dumpUpdateCallback(dump, executionDump);\n }\n },\n );\n }\n\n try {\n let result = null;\n let executionError = null;\n\n try {\n // Call the base implementation with the original signature\n result = await executeAction(\n agent,\n actionType,\n actionSpace,\n value,\n options,\n );\n } catch (error: unknown) {\n // Capture error but don't throw yet - we need to get dump/reportHTML first\n executionError = error;\n }\n\n // Always construct response with dump and reportHTML, regardless of success/failure\n const response = {\n result,\n dump: null as unknown,\n reportHTML: null as string | null,\n error: executionError\n ? executionError instanceof Error\n ? executionError.message\n : String(executionError)\n : null,\n };\n\n // Get dump data - separate try-catch to ensure dump is retrieved even if reportHTML fails\n try {\n if (agent.dumpDataString) {\n const dumpString = agent.dumpDataString();\n if (dumpString) {\n const groupedDump =\n GroupedActionDump.fromSerializedString(dumpString);\n response.dump = groupedDump.executions?.[0] || null;\n }\n }\n } catch (error: unknown) {\n console.warn('Failed to get dump from agent:', error);\n }\n\n // Try to get reportHTML - may fail in browser environment (fs not available)\n try {\n if (agent.reportHTMLString) {\n response.reportHTML = agent.reportHTMLString() || null;\n }\n } catch (error: unknown) {\n // reportHTMLString may throw in browser environment\n // This is expected in chrome-extension, continue without reportHTML\n }\n\n // Write out action dumps - may also fail in browser environment\n try {\n if (agent.writeOutActionDumps) {\n agent.writeOutActionDumps();\n }\n } catch (error: unknown) {\n // writeOutActionDumps may fail in browser environment\n }\n\n // Don't throw the error - return it in response so caller can access dump/reportHTML\n // The caller (usePlaygroundExecution) will check response.error to determine success\n return response;\n } finally {\n // Remove listener to prevent accumulation\n if (removeListener) {\n removeListener();\n }\n }\n }\n\n /**\n * Recreate agent instance using the factory function.\n * Called automatically when executeAction is called.\n */\n private async recreateAgent(): Promise<void> {\n if (!this.agentFactory) {\n throw new Error(\n 'Cannot recreate agent: factory function not provided. Please provide agentFactory in PlaygroundConfig to enable agent recreation.',\n );\n }\n\n console.log('Creating new agent with latest config...');\n try {\n this.agent = await this.agentFactory();\n console.log('Agent created successfully');\n } catch (error) {\n console.error('Failed to create agent:', error);\n throw error;\n }\n }\n\n // Local execution task cancellation - returns dump and reportHTML before destroying\n async cancelTask(_requestId: string): Promise<{\n error?: string;\n success?: boolean;\n dump?: ExecutionDump | null;\n reportHTML?: string | null;\n }> {\n if (!this.agent) {\n return { error: 'No active agent found for this requestId' };\n }\n\n // Get execution data BEFORE destroying the agent\n let dump: ExecutionDump | null = null;\n let reportHTML: string | null = null;\n\n // Get dump data separately - don't let reportHTML errors affect dump retrieval\n // IMPORTANT: Must extract dump BEFORE agent.destroy(), as dump is stored in agent memory\n try {\n if (typeof this.agent.dumpDataString === 'function') {\n const dumpString = this.agent.dumpDataString();\n if (dumpString) {\n // dumpDataString() returns GroupedActionDump: { executions: ExecutionDump[] }\n // In Playground, each \"Run\" creates one execution, so we take executions[0]\n const groupedDump =\n GroupedActionDump.fromSerializedString(dumpString);\n dump = groupedDump.executions?.[0] ?? null;\n }\n }\n } catch (error) {\n console.warn(\n '[LocalExecutionAdapter] Failed to get dump data before cancel:',\n error,\n );\n }\n\n // Try to get reportHTML separately - this may fail in browser environment\n // where fs.readFileSync is not available\n try {\n if (typeof this.agent.reportHTMLString === 'function') {\n const html = this.agent.reportHTMLString();\n if (\n html &&\n typeof html === 'string' &&\n !html.includes('REPLACE_ME_WITH_REPORT_HTML')\n ) {\n reportHTML = html;\n }\n }\n } catch (error) {\n // reportHTMLString may throw in browser environment (fs not available)\n // This is expected, just continue with dump data only\n console.warn(\n '[LocalExecutionAdapter] reportHTMLString not available in this environment',\n );\n }\n\n try {\n await this.agent.destroy?.();\n this.agent = null; // Clear agent reference\n return { success: true, dump, reportHTML };\n } catch (error: unknown) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n console.error(\n `[LocalExecutionAdapter] Failed to cancel agent: ${errorMessage}`,\n );\n return { error: `Failed to cancel: ${errorMessage}`, dump, reportHTML };\n }\n }\n\n /**\n * Get current execution data without resetting\n * This allows retrieving dump and report when execution is stopped\n */\n async getCurrentExecutionData(): Promise<{\n dump: ExecutionDump | null;\n reportHTML: string | null;\n }> {\n const response = {\n dump: null as ExecutionDump | null,\n reportHTML: null as string | null,\n };\n\n try {\n // Get dump data\n if (this.agent?.dumpDataString) {\n const dumpString = this.agent.dumpDataString();\n if (dumpString) {\n const groupedDump =\n GroupedActionDump.fromSerializedString(dumpString);\n response.dump = groupedDump.executions?.[0] || null;\n }\n }\n\n // Get report HTML\n if (this.agent?.reportHTMLString) {\n response.reportHTML = this.agent.reportHTMLString() || null;\n }\n } catch (error: unknown) {\n console.error('Failed to get current execution data:', error);\n }\n\n return response;\n }\n\n // Get interface information from the agent\n async getInterfaceInfo(): Promise<{\n type: string;\n description?: string;\n } | null> {\n if (!this.agent?.interface) {\n return null;\n }\n\n try {\n const type = this.agent.interface.interfaceType || 'Unknown';\n const description = this.agent.interface.describe?.() || undefined;\n\n return {\n type,\n description,\n };\n } catch (error: unknown) {\n console.error('Failed to get interface info:', error);\n return null;\n }\n }\n\n async getRuntimeInfo(): Promise<PlaygroundRuntimeInfo | null> {\n if (!this.agent?.interface) {\n return null;\n }\n\n try {\n return buildRuntimeInfo({\n interfaceType: this.agent.interface.interfaceType || 'Unknown',\n interfaceDescription: this.agent.interface.describe?.() || undefined,\n supportsScreenshot:\n typeof this.agent.interface.screenshotBase64 === 'function',\n mjpegStreamUrl: this.agent.interface.mjpegStreamUrl,\n });\n } catch (error: unknown) {\n console.error('Failed to get runtime info:', error);\n return null;\n }\n }\n}\n","import {\n type PlaygroundPreviewDescriptor,\n createMjpegPreviewDescriptor,\n createScrcpyPreviewDescriptor,\n createScreenshotPreviewDescriptor,\n} from './platform';\n\nexport interface PlaygroundRuntimeInfo {\n /** Stable platform key, e.g. `android`, `ios`, `web`, `computer`. */\n platformId?: string;\n /** User-facing runtime title, e.g. `Midscene Android Playground`. */\n title?: string;\n /** Human-readable platform summary, e.g. `Android playground platform descriptor`. */\n platformDescription?: string;\n interface: {\n type: string;\n description?: string;\n };\n preview: PlaygroundPreviewDescriptor;\n executionUxHints: string[];\n metadata: Record<string, unknown>;\n}\n\n// Internal builder input: this keeps raw inference hints separate from the\n// public, normalized PlaygroundRuntimeInfo shape.\ninterface BuildRuntimeInfoInput {\n platformId?: string;\n title?: string;\n platformDescription?: string;\n interfaceType?: string;\n interfaceDescription?: string;\n preview?: PlaygroundPreviewDescriptor;\n metadata?: Record<string, unknown>;\n supportsScreenshot?: boolean;\n mjpegStreamUrl?: string;\n scrcpyPort?: number;\n}\n\nexport function normalizeExecutionUxHints(\n metadata?: Record<string, unknown>,\n): string[] {\n if (!metadata) {\n return [];\n }\n\n const fromHints = metadata.executionUxHints;\n if (Array.isArray(fromHints)) {\n return fromHints.filter(\n (value): value is string => typeof value === 'string' && value.length > 0,\n );\n }\n\n const fromSingle = metadata.executionUx;\n if (typeof fromSingle === 'string' && fromSingle.length > 0) {\n return [fromSingle];\n }\n\n return [];\n}\n\nexport function resolvePreviewDescriptor(\n input: Omit<\n BuildRuntimeInfoInput,\n | 'platformId'\n | 'title'\n | 'platformDescription'\n | 'interfaceType'\n | 'interfaceDescription'\n | 'metadata'\n >,\n): PlaygroundPreviewDescriptor {\n if (input.preview) {\n return input.preview;\n }\n\n if (typeof input.scrcpyPort === 'number') {\n return createScrcpyPreviewDescriptor({\n scrcpyPort: input.scrcpyPort,\n });\n }\n\n if (input.mjpegStreamUrl) {\n return createMjpegPreviewDescriptor();\n }\n\n if (input.supportsScreenshot) {\n return createScreenshotPreviewDescriptor();\n }\n\n return {\n kind: 'none',\n capabilities: [],\n };\n}\n\nexport function buildRuntimeInfo(\n input: BuildRuntimeInfoInput,\n): PlaygroundRuntimeInfo {\n const interfaceType = input.interfaceType || 'Unknown';\n\n return {\n platformId: input.platformId,\n title: input.title,\n platformDescription: input.platformDescription,\n interface: {\n type: interfaceType,\n description: input.interfaceDescription,\n },\n preview: resolvePreviewDescriptor(input),\n executionUxHints: normalizeExecutionUxHints(input.metadata),\n metadata: { ...(input.metadata || {}) },\n };\n}\n","import type { Agent } from '@midscene/core/agent';\nimport type { LaunchPlaygroundOptions } from './launcher';\nimport type { AgentFactory } from './types';\n\nexport type PlaygroundPreviewKind =\n | 'none'\n | 'screenshot'\n | 'mjpeg'\n | 'scrcpy'\n | 'custom';\n\nexport interface PlaygroundPreviewCapability {\n kind: PlaygroundPreviewKind;\n label?: string;\n live?: boolean;\n}\n\nexport interface PlaygroundPreviewDescriptor {\n kind: PlaygroundPreviewKind;\n title?: string;\n capabilities?: PlaygroundPreviewCapability[];\n screenshotPath?: string;\n mjpegPath?: string;\n custom?: Record<string, unknown>;\n}\n\nexport interface PreparedPlaygroundPlatform {\n platformId: string;\n title: string;\n description?: string;\n agent?: Agent;\n agentFactory?: AgentFactory;\n launchOptions?: LaunchPlaygroundOptions;\n preview?: PlaygroundPreviewDescriptor;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PlaygroundPlatformDescriptor<TOptions = void> {\n id: string;\n title: string;\n description?: string;\n prepare(options: TOptions): Promise<PreparedPlaygroundPlatform>;\n}\n\nexport function definePlaygroundPlatform<TOptions>(\n descriptor: PlaygroundPlatformDescriptor<TOptions>,\n): PlaygroundPlatformDescriptor<TOptions> {\n return descriptor;\n}\n\nexport function createScreenshotPreviewDescriptor(\n overrides: Partial<PlaygroundPreviewDescriptor> = {},\n): PlaygroundPreviewDescriptor {\n return {\n kind: 'screenshot',\n screenshotPath: '/screenshot',\n capabilities: [\n {\n kind: 'screenshot',\n label: 'Screenshot polling',\n live: false,\n },\n ],\n ...overrides,\n };\n}\n\nexport function createMjpegPreviewDescriptor(\n overrides: Partial<PlaygroundPreviewDescriptor> = {},\n): PlaygroundPreviewDescriptor {\n return {\n kind: 'mjpeg',\n screenshotPath: '/screenshot',\n mjpegPath: '/mjpeg',\n capabilities: [\n {\n kind: 'mjpeg',\n label: 'MJPEG streaming',\n live: true,\n },\n {\n kind: 'screenshot',\n label: 'Screenshot fallback',\n live: false,\n },\n ],\n ...overrides,\n };\n}\n\nexport function createScrcpyPreviewDescriptor(\n custom: Record<string, unknown> = {},\n overrides: Partial<PlaygroundPreviewDescriptor> = {},\n): PlaygroundPreviewDescriptor {\n return {\n kind: 'scrcpy',\n screenshotPath: '/screenshot',\n capabilities: [\n {\n kind: 'scrcpy',\n label: 'scrcpy streaming',\n live: true,\n },\n {\n kind: 'screenshot',\n label: 'Screenshot fallback',\n live: false,\n },\n ],\n custom,\n ...overrides,\n };\n}\n\nexport function resolvePreparedLaunchOptions(\n prepared: PreparedPlaygroundPlatform,\n overrides: LaunchPlaygroundOptions = {},\n): LaunchPlaygroundOptions {\n return {\n ...(prepared.launchOptions || {}),\n ...overrides,\n };\n}\n","import type { DeviceAction, ExecutionDump } from '@midscene/core';\nimport { parseStructuredParams } from '../common';\nimport type { PlaygroundRuntimeInfo } from '../runtime-metadata';\nimport type { ExecutionOptions, FormValue, ValidationResult } from '../types';\nimport { BasePlaygroundAdapter } from './base';\n\nexport class RemoteExecutionAdapter extends BasePlaygroundAdapter {\n private serverUrl?: string;\n private _id?: string;\n private dumpUpdateCallback?: (\n dump: string,\n executionDump?: ExecutionDump,\n ) => void;\n private pollingIntervalId?: ReturnType<typeof setInterval>;\n\n constructor(serverUrl: string) {\n super();\n this.serverUrl = serverUrl;\n }\n\n // Set dump update callback\n onDumpUpdate(\n callback: (dump: string, executionDump?: ExecutionDump) => void,\n ): void {\n this.dumpUpdateCallback = undefined;\n this.dumpUpdateCallback = callback;\n }\n\n // Get adapter ID (cached after first status check for remote)\n get id(): string | undefined {\n return this._id;\n }\n\n // Override validateParams for remote execution\n // Since schemas from server are JSON-serialized and lack .parse() method\n validateParams(\n value: FormValue,\n action: DeviceAction<unknown> | undefined,\n ): ValidationResult {\n if (!action?.paramSchema) {\n return { valid: true };\n }\n\n const needsStructuredParams = this.actionNeedsStructuredParams(action);\n\n if (!needsStructuredParams) {\n return { valid: true };\n }\n\n if (!value.params) {\n return { valid: false, errorMessage: 'Parameters are required' };\n }\n\n // For remote execution, perform basic validation without .parse()\n // Check if required fields are present\n if (action.paramSchema && typeof action.paramSchema === 'object') {\n const schema = action.paramSchema as any;\n if (schema.shape || schema.type === 'ZodObject') {\n const shape = schema.shape || {};\n const missingFields = Object.keys(shape).filter((key) => {\n const fieldDef = shape[key];\n // Check if field is required (not optional)\n const isOptional =\n fieldDef?.isOptional ||\n fieldDef?._def?.innerType || // ZodOptional\n fieldDef?._def?.typeName === 'ZodOptional';\n return (\n !isOptional &&\n (value.params![key] === undefined || value.params![key] === '')\n );\n });\n\n if (missingFields.length > 0) {\n return {\n valid: false,\n errorMessage: `Missing required parameters: ${missingFields.join(', ')}`,\n };\n }\n }\n }\n\n return { valid: true };\n }\n\n async parseStructuredParams(\n action: DeviceAction<unknown>,\n params: Record<string, unknown>,\n options: ExecutionOptions,\n ): Promise<unknown[]> {\n // Use shared implementation from common.ts\n return await parseStructuredParams(action, params, options);\n }\n\n formatErrorMessage(error: any): string {\n const message = error?.message || '';\n\n // Handle Android-specific errors\n const androidErrors = [\n {\n keyword: 'adb',\n message:\n 'ADB connection error. Please ensure device is connected and USB debugging is enabled.',\n },\n {\n keyword: 'UIAutomator',\n message:\n 'UIAutomator error. Please ensure the UIAutomator server is running on the device.',\n },\n ];\n\n const androidError = androidErrors.find(({ keyword }) =>\n message.includes(keyword),\n );\n if (androidError) {\n return androidError.message;\n }\n\n return this.formatBasicErrorMessage(error);\n }\n\n // Remote execution adapter - simplified interface\n async executeAction(\n actionType: string,\n value: FormValue,\n options: ExecutionOptions,\n ): Promise<unknown> {\n // If serverUrl is provided, use server-side execution\n if (this.serverUrl && typeof window !== 'undefined') {\n return this.executeViaServer(actionType, value, options);\n }\n\n throw new Error(\n 'Remote execution adapter requires server URL for execution',\n );\n }\n\n // Remote execution via server - uses same endpoint as requestPlaygroundServer\n private async executeViaServer(\n actionType: string,\n value: FormValue,\n options: ExecutionOptions,\n ): Promise<unknown> {\n const payload: Record<string, unknown> = {\n type: actionType,\n prompt: value.prompt,\n ...this.buildOptionalPayloadParams(options, value),\n };\n\n // Add context only if it exists (server can handle single agent case without context)\n if (options.context) {\n payload.context = options.context;\n }\n\n // Start polling if requestId is provided and dumpUpdateCallback is set\n if (options.requestId && this.dumpUpdateCallback) {\n this.startProgressPolling(options.requestId);\n }\n\n try {\n const response = await fetch(`${this.serverUrl}/execute`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n throw new Error(\n `Server request failed (${response.status}): ${errorText}`,\n );\n }\n\n const result = await response.json();\n\n return result;\n } catch (error) {\n console.error('Execute via server failed:', error);\n throw error;\n } finally {\n // Stop polling when execution completes (success or error)\n this.stopProgressPolling();\n }\n }\n\n // Helper method to build optional payload parameters\n private buildOptionalPayloadParams(\n options: ExecutionOptions,\n value: FormValue,\n ): Record<string, unknown> {\n const optionalParams: Record<string, unknown> = {};\n\n // Add optional parameters only if they have meaningful values\n const optionalFields = [\n { key: 'requestId', value: options.requestId },\n { key: 'deepLocate', value: options.deepLocate },\n { key: 'deepThink', value: options.deepThink },\n { key: 'screenshotIncluded', value: options.screenshotIncluded },\n { key: 'domIncluded', value: options.domIncluded },\n { key: 'deviceOptions', value: options.deviceOptions },\n { key: 'params', value: value.params },\n ] as const;\n\n optionalFields.forEach(({ key, value }) => {\n if (value !== undefined && value !== null && value !== '') {\n optionalParams[key] = value;\n }\n });\n\n return optionalParams;\n }\n\n // Get action space from server with fallback\n async getActionSpace(context?: unknown): Promise<DeviceAction<unknown>[]> {\n // Try server first if available\n if (this.serverUrl && typeof window !== 'undefined') {\n try {\n const response = await fetch(`${this.serverUrl}/action-space`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ context }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to get action space: ${response.statusText}`);\n }\n\n const result = await response.json();\n return Array.isArray(result) ? result : [];\n } catch (error) {\n console.error('Failed to get action space from server:', error);\n // Fall through to context fallback\n }\n }\n\n // Fallback: try context.actionSpace if available\n if (context && typeof context === 'object' && 'actionSpace' in context) {\n try {\n const actionSpaceMethod = (\n context as {\n actionSpace: () =>\n | DeviceAction<unknown>[]\n | Promise<DeviceAction<unknown>[]>;\n }\n ).actionSpace;\n const result = await actionSpaceMethod();\n return Array.isArray(result) ? result : [];\n } catch (error) {\n console.error('Failed to get action space from context:', error);\n }\n }\n\n return [];\n }\n\n // Uses base implementation for validateParams and createDisplayContent\n\n // Server communication methods\n async checkStatus(): Promise<boolean> {\n if (!this.serverUrl) {\n return false;\n }\n\n try {\n const res = await fetch(`${this.serverUrl}/status`);\n if (res.status === 200) {\n // Try to extract id from response\n try {\n const data = await res.json();\n if (data.id && typeof data.id === 'string') {\n this._id = data.id;\n }\n } catch (jsonError) {\n // If JSON parsing fails, id remains undefined but status is still OK\n console.debug('Failed to parse status response:', jsonError);\n }\n return true;\n }\n return false;\n } catch (error) {\n console.warn('Server status check failed:', error);\n return false;\n }\n }\n\n async overrideConfig(aiConfig: Record<string, unknown>): Promise<void> {\n if (!this.serverUrl) {\n throw new Error('Server URL not configured');\n }\n\n try {\n const response = await fetch(`${this.serverUrl}/config`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ aiConfig }),\n });\n\n if (!response.ok) {\n const body = await response.json().catch(() => null);\n const detail = body?.error || response.statusText;\n throw new Error(detail);\n }\n } catch (error) {\n console.error('Failed to override server config:', error);\n throw error;\n }\n }\n\n async getTaskProgress(requestId: string): Promise<{\n executionDump?: ExecutionDump;\n }> {\n if (!this.serverUrl) {\n return {};\n }\n\n if (!requestId?.trim()) {\n console.warn('Invalid requestId provided for task progress');\n return {};\n }\n\n try {\n const response = await fetch(\n `${this.serverUrl}/task-progress/${encodeURIComponent(requestId)}`,\n );\n\n if (!response.ok) {\n console.warn(`Task progress request failed: ${response.statusText}`);\n return {};\n }\n\n return await response.json();\n } catch (error) {\n console.error('Failed to poll task progress:', error);\n return {};\n }\n }\n\n /**\n * Start polling for task progress and invoke dump update callback\n */\n private startProgressPolling(requestId: string): void {\n // Clear any existing polling\n this.stopProgressPolling();\n\n // Poll every 500ms for progress updates\n this.pollingIntervalId = setInterval(async () => {\n try {\n const progressData = await this.getTaskProgress(requestId);\n\n if (progressData.executionDump) {\n // Invoke dump update callback if set\n if (this.dumpUpdateCallback) {\n this.dumpUpdateCallback('', progressData.executionDump);\n }\n }\n } catch (error) {\n console.error('Error polling task progress:', error);\n }\n }, 500); // Poll every 500ms\n }\n\n /**\n * Stop polling for task progress\n */\n private stopProgressPolling(): void {\n if (this.pollingIntervalId) {\n clearInterval(this.pollingIntervalId);\n this.pollingIntervalId = undefined;\n }\n }\n\n // Cancel task\n async cancelTask(\n requestId: string,\n ): Promise<{ error?: string; success?: boolean }> {\n if (!this.serverUrl) {\n return { error: 'No server URL configured' };\n }\n\n if (!requestId?.trim()) {\n return { error: 'Invalid request ID' };\n }\n\n try {\n const res = await fetch(\n `${this.serverUrl}/cancel/${encodeURIComponent(requestId)}`,\n {\n method: 'POST',\n },\n );\n\n if (!res.ok) {\n return { error: `Cancel request failed: ${res.statusText}` };\n }\n\n const result = await res.json();\n return { success: true, ...result };\n } catch (error) {\n console.error('Failed to cancel task:', error);\n return { error: 'Failed to cancel task' };\n }\n }\n\n // Get screenshot from server\n async getScreenshot(): Promise<{\n screenshot: string;\n timestamp: number;\n } | null> {\n if (!this.serverUrl) {\n return null;\n }\n\n try {\n const response = await fetch(`${this.serverUrl}/screenshot`);\n\n if (!response.ok) {\n console.warn(`Screenshot request failed: ${response.statusText}`);\n return null;\n }\n\n return await response.json();\n } catch (error) {\n console.error('Failed to get screenshot:', error);\n return null;\n }\n }\n\n // Get interface information from server\n async getInterfaceInfo(): Promise<{\n type: string;\n description?: string;\n } | null> {\n if (!this.serverUrl) {\n return null;\n }\n\n try {\n const response = await fetch(`${this.serverUrl}/interface-info`);\n\n if (!response.ok) {\n console.warn(`Interface info request failed: ${response.statusText}`);\n return null;\n }\n\n return await response.json();\n } catch (error) {\n console.error('Failed to get interface info:', error);\n return null;\n }\n }\n\n async getRuntimeInfo(): Promise<PlaygroundRuntimeInfo | null> {\n if (!this.serverUrl) {\n return null;\n }\n\n try {\n const response = await fetch(`${this.serverUrl}/runtime-info`);\n\n if (!response.ok) {\n console.warn(`Runtime info request failed: ${response.statusText}`);\n return null;\n }\n\n return await response.json();\n } catch (error) {\n console.error('Failed to get runtime info:', error);\n return null;\n }\n }\n}\n","import type { DeviceAction } from '@midscene/core';\nimport { PLAYGROUND_SERVER_PORT } from '@midscene/shared/constants';\nimport type { BasePlaygroundAdapter } from '../adapters/base';\nimport { LocalExecutionAdapter } from '../adapters/local-execution';\nimport { RemoteExecutionAdapter } from '../adapters/remote-execution';\nimport type { PlaygroundRuntimeInfo } from '../runtime-metadata';\nimport type {\n AgentFactory,\n BeforeActionHook,\n ExecutionOptions,\n FormValue,\n PlaygroundAgent,\n PlaygroundConfig,\n ValidationResult,\n} from '../types';\n\nexport class PlaygroundSDK {\n private adapter: BasePlaygroundAdapter;\n private beforeActionHook?: BeforeActionHook;\n\n constructor(config: PlaygroundConfig) {\n this.adapter = this.createAdapter(\n config.type,\n config.serverUrl,\n config.agent,\n config.agentFactory,\n );\n }\n\n private createAdapter(\n type: string,\n serverUrl?: string,\n agent?: PlaygroundAgent,\n agentFactory?: AgentFactory,\n ): BasePlaygroundAdapter {\n switch (type) {\n case 'local-execution':\n if (!agent && !agentFactory) {\n throw new Error(\n 'Agent or agentFactory is required for local execution',\n );\n }\n return new LocalExecutionAdapter(agent, agentFactory);\n case 'remote-execution': {\n // Use provided serverUrl first, then fallback to localhost if current page origin is file:// or default\n const finalServerUrl =\n serverUrl ||\n (typeof window !== 'undefined' &&\n window.location.protocol.includes('http')\n ? window.location.origin\n : `http://localhost:${PLAYGROUND_SERVER_PORT}`);\n\n return new RemoteExecutionAdapter(finalServerUrl);\n }\n default:\n throw new Error(`Unsupported execution type: ${type}`);\n }\n }\n\n private runtimeMetadataAdapter():\n | LocalExecutionAdapter\n | RemoteExecutionAdapter\n | null {\n if (\n this.adapter instanceof LocalExecutionAdapter ||\n this.adapter instanceof RemoteExecutionAdapter\n ) {\n return this.adapter;\n }\n\n return null;\n }\n\n async executeAction(\n actionType: string,\n value: FormValue,\n options: ExecutionOptions,\n ): Promise<unknown> {\n await this.beforeActionHook?.(actionType, value, options);\n const result = await this.adapter.executeAction(actionType, value, options);\n return result;\n }\n\n setBeforeActionHook(hook?: BeforeActionHook): void {\n this.beforeActionHook = hook;\n }\n\n async getActionSpace(context?: unknown): Promise<DeviceAction<unknown>[]> {\n // Both adapters now accept context parameter\n // Local will prioritize internal agent, Remote will use server + fallback\n return this.adapter.getActionSpace(context);\n }\n\n validateStructuredParams(\n value: FormValue,\n action: DeviceAction<unknown> | undefined,\n ): ValidationResult {\n return this.adapter.validateParams(value, action);\n }\n\n formatErrorMessage(error: any): string {\n return this.adapter.formatErrorMessage(error);\n }\n\n createDisplayContent(\n value: FormValue,\n needsStructuredParams: boolean,\n action: DeviceAction<unknown> | undefined,\n ): string {\n return this.adapter.createDisplayContent(\n value,\n needsStructuredParams,\n action,\n );\n }\n\n // Get adapter ID (works for both remote and local execution)\n get id(): string | undefined {\n if (this.adapter instanceof RemoteExecutionAdapter) {\n return this.adapter.id;\n }\n if (this.adapter instanceof LocalExecutionAdapter) {\n return this.adapter.id;\n }\n return undefined;\n }\n\n // Server communication methods (for remote execution)\n async checkStatus(): Promise<boolean> {\n if (this.adapter instanceof RemoteExecutionAdapter) {\n return this.adapter.checkStatus();\n }\n return true; // For local execution, always return true\n }\n\n async overrideConfig(aiConfig: any): Promise<void> {\n if (this.adapter instanceof RemoteExecutionAdapter) {\n return this.adapter.overrideConfig(aiConfig);\n }\n // For local execution, this is a no-op\n }\n\n // Get task progress (for remote execution)\n async getTaskProgress(requestId: string): Promise<{ executionDump?: any }> {\n if (this.adapter instanceof RemoteExecutionAdapter) {\n return this.adapter.getTaskProgress(requestId);\n }\n // For local execution, progress is handled via onDumpUpdate callback\n return {};\n }\n\n // Cancel task (for remote execution)\n async cancelTask(requestId: string): Promise<any> {\n if (this.adapter instanceof RemoteExecutionAdapter) {\n return this.adapter.cancelTask(requestId);\n }\n return { error: 'Cancel task not supported in local execution mode' };\n }\n\n // Dump update callback management\n onDumpUpdate(callback: (dump: string, executionDump?: any) => void): void {\n if (this.adapter instanceof LocalExecutionAdapter) {\n this.adapter.onDumpUpdate(callback);\n } else if (this.adapter instanceof RemoteExecutionAdapter) {\n this.adapter.onDumpUpdate(callback);\n }\n }\n\n // Progress update callback management\n onProgressUpdate(callback: (tip: string) => void): void {\n if (this.adapter instanceof LocalExecutionAdapter) {\n this.adapter.setProgressCallback(callback);\n }\n // RemoteExecutionAdapter uses polling mechanism via onDumpUpdate, no separate progress callback needed\n }\n\n // Cancel execution - supports both remote and local\n async cancelExecution(requestId: string): Promise<{\n dump: any | null;\n reportHTML: string | null;\n } | null> {\n if (this.adapter instanceof RemoteExecutionAdapter) {\n const result = await this.adapter.cancelTask(requestId);\n // Return dump and reportHTML if available from cancellation\n if (result.success) {\n return {\n dump: (result as any).dump || null,\n reportHTML: (result as any).reportHTML || null,\n };\n }\n } else if (this.adapter instanceof LocalExecutionAdapter) {\n // Invoke adapter cancellation to destroy the agent and block further actions\n const result = await this.adapter.cancelTask(requestId);\n if (result.success) {\n return {\n dump: (result as any).dump || null,\n reportHTML: (result as any).reportHTML || null,\n };\n }\n }\n return null;\n }\n\n // Get current execution data (dump and report)\n async getCurrentExecutionData(): Promise<{\n dump: any | null;\n reportHTML: string | null;\n }> {\n if (\n this.adapter instanceof LocalExecutionAdapter &&\n this.adapter.getCurrentExecutionData\n ) {\n return await this.adapter.getCurrentExecutionData();\n }\n // For remote execution or if method not available, return empty data\n return { dump: null, reportHTML: null };\n }\n\n // Screenshot method for remote execution\n async getScreenshot(): Promise<{\n screenshot: string;\n timestamp: number;\n } | null> {\n if (this.adapter instanceof RemoteExecutionAdapter) {\n return this.adapter.getScreenshot();\n }\n return null; // For local execution, not supported yet\n }\n\n // Get interface information (type and description)\n async getInterfaceInfo(): Promise<{\n type: string;\n description?: string;\n } | null> {\n const adapter = this.runtimeMetadataAdapter();\n if (!adapter) {\n return null;\n }\n\n return adapter.getInterfaceInfo();\n }\n\n async getRuntimeInfo(): Promise<PlaygroundRuntimeInfo | null> {\n const adapter = this.runtimeMetadataAdapter();\n if (!adapter) {\n return null;\n }\n\n return adapter.getRuntimeInfo();\n }\n // Get service mode based on adapter type\n getServiceMode(): 'In-Browser-Extension' | 'Server' {\n if (this.adapter instanceof LocalExecutionAdapter) {\n return 'In-Browser-Extension';\n }\n return 'Server';\n }\n}\n","const elementColor = [\n '#01204E'\n];\nconst highlightColorForSearchArea = '#028391';\nconst highlightColorForElement = '#fd5907';\nfunction djb2Hash(str) {\n if (!str) str = 'unnamed';\n let hash = 5381;\n for(let i = 0; i < str.length; i++)hash = (hash << 5) + hash + str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction colorForName(name) {\n const hashNumber = djb2Hash(name);\n return elementColor[hashNumber % elementColor.length];\n}\nfunction highlightColorForType(type) {\n if ('searchArea' === type) return highlightColorForSearchArea;\n return highlightColorForElement;\n}\nfunction globalThemeConfig() {\n return {\n token: {\n colorPrimary: '#2B83FF'\n },\n components: {\n Layout: {\n headerHeight: 60,\n headerPadding: '0 30px',\n headerBg: '#FFF',\n bodyBg: '#FFF'\n }\n }\n };\n}\nexport { colorForName, globalThemeConfig, highlightColorForType };\n","import { jsx } from \"react/jsx-runtime\";\nimport { useTheme } from \"../../hooks/useTheme.mjs\";\nimport \"./index.css\";\nconst LogoUrl = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/vhaeh7vhabf/Midscene.png';\nconst LogoUrlLight = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/nupipfups/Midscene/midscene_with_text_light.png';\nconst LogoUrlDark = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/nupipfups/Midscene/midscene_with_text_dark.png';\nconst Logo = ({ hideLogo = false })=>{\n const { isDarkMode } = useTheme();\n if (hideLogo) return null;\n const logoSrc = isDarkMode ? LogoUrlDark : LogoUrlLight;\n return /*#__PURE__*/ jsx(\"div\", {\n className: \"logo\",\n children: /*#__PURE__*/ jsx(\"a\", {\n href: \"https://midscenejs.com/\",\n target: \"_blank\",\n rel: \"noreferrer\",\n children: /*#__PURE__*/ jsx(\"img\", {\n alt: \"Midscene_logo\",\n src: logoSrc\n })\n })\n });\n};\nexport { Logo, LogoUrl };\n","import { useEffect, useState } from \"react\";\nfunction useTheme() {\n const [isDarkMode, setIsDarkMode] = useState(false);\n useEffect(()=>{\n const checkTheme = ()=>{\n var _document_querySelector;\n const theme = null == (_document_querySelector = document.querySelector('[data-theme]')) ? void 0 : _document_querySelector.getAttribute('data-theme');\n setIsDarkMode('dark' === theme);\n };\n checkTheme();\n const observer = new MutationObserver(checkTheme);\n const target = document.querySelector('[data-theme]') || document.documentElement;\n observer.observe(target, {\n attributes: true,\n attributeFilter: [\n 'data-theme'\n ]\n });\n return ()=>observer.disconnect();\n }, []);\n return {\n isDarkMode\n };\n}\nexport { useTheme };\n","import { create } from \"zustand\";\nvar __webpack_require__ = {};\n(()=>{\n __webpack_require__.d = (exports, definition)=>{\n for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) Object.defineProperty(exports, key, {\n enumerable: true,\n get: definition[key]\n });\n };\n})();\n(()=>{\n __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);\n})();\n(()=>{\n __webpack_require__.r = (exports)=>{\n if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports, Symbol.toStringTag, {\n value: 'Module'\n });\n Object.defineProperty(exports, '__esModule', {\n value: true\n });\n };\n})();\nvar external_zustand_namespaceObject = {};\n__webpack_require__.r(external_zustand_namespaceObject);\n__webpack_require__.d(external_zustand_namespaceObject, {\n create: ()=>create\n});\nconst { create: store_create } = external_zustand_namespaceObject;\nconst AUTO_ZOOM_KEY = 'midscene-auto-zoom';\nconst BACKGROUND_VISIBLE_KEY = 'midscene-background-visible';\nconst ELEMENTS_VISIBLE_KEY = 'midscene-elements-visible';\nconst MODEL_CALL_DETAILS_KEY = 'midscene-model-call-details';\nconst DARK_MODE_KEY = 'midscene-dark-mode';\nconst PLAYBACK_SPEED_KEY = 'midscene-playback-speed';\nconst SUBTITLE_ENABLED_KEY = 'midscene-subtitle-enabled';\nconst parseBooleanParam = (value)=>{\n if (null === value) return;\n const normalized = value.trim().toLowerCase();\n if ([\n '1',\n 'true',\n 'yes',\n 'on'\n ].includes(normalized)) return true;\n if ([\n '0',\n 'false',\n 'no',\n 'off'\n ].includes(normalized)) return false;\n};\nconst getQueryPreference = (paramName)=>{\n if ('undefined' == typeof window) return;\n const searchParams = new URLSearchParams(window.location.search);\n return parseBooleanParam(searchParams.get(paramName));\n};\nconst useGlobalPreference = store_create((set)=>{\n const savedAutoZoom = 'false' !== localStorage.getItem(AUTO_ZOOM_KEY);\n const savedBackgroundVisible = 'false' !== localStorage.getItem(BACKGROUND_VISIBLE_KEY);\n const savedElementsVisible = 'false' !== localStorage.getItem(ELEMENTS_VISIBLE_KEY);\n const savedModelCallDetails = 'true' === localStorage.getItem(MODEL_CALL_DETAILS_KEY);\n const savedDarkMode = 'true' === localStorage.getItem(DARK_MODE_KEY);\n const parsedPlaybackSpeed = Number.parseFloat(localStorage.getItem(PLAYBACK_SPEED_KEY) || '1');\n const savedPlaybackSpeed = Number.isNaN(parsedPlaybackSpeed) ? 1 : parsedPlaybackSpeed;\n const savedSubtitleEnabled = 'false' !== localStorage.getItem(SUBTITLE_ENABLED_KEY);\n const autoZoomFromQuery = getQueryPreference('focusOnCursor');\n const elementsVisibleFromQuery = getQueryPreference('showElementMarkers');\n const darkModeFromQuery = getQueryPreference('darkMode');\n const initialDarkMode = void 0 === darkModeFromQuery ? savedDarkMode : darkModeFromQuery;\n if (void 0 !== darkModeFromQuery) localStorage.setItem(DARK_MODE_KEY, initialDarkMode.toString());\n return {\n backgroundVisible: savedBackgroundVisible,\n elementsVisible: void 0 === elementsVisibleFromQuery ? savedElementsVisible : elementsVisibleFromQuery,\n autoZoom: void 0 === autoZoomFromQuery ? savedAutoZoom : autoZoomFromQuery,\n modelCallDetailsEnabled: savedModelCallDetails,\n darkModeEnabled: initialDarkMode,\n playbackSpeed: [\n 0.5,\n 1,\n 1.5,\n 2\n ].includes(savedPlaybackSpeed) ? savedPlaybackSpeed : 1,\n setBackgroundVisible: (visible)=>{\n set({\n backgroundVisible: visible\n });\n localStorage.setItem(BACKGROUND_VISIBLE_KEY, visible.toString());\n },\n setElementsVisible: (visible)=>{\n set({\n elementsVisible: visible\n });\n localStorage.setItem(ELEMENTS_VISIBLE_KEY, visible.toString());\n },\n setAutoZoom: (enabled)=>{\n set({\n autoZoom: enabled\n });\n localStorage.setItem(AUTO_ZOOM_KEY, enabled.toString());\n },\n setModelCallDetailsEnabled: (enabled)=>{\n set({\n modelCallDetailsEnabled: enabled\n });\n localStorage.setItem(MODEL_CALL_DETAILS_KEY, enabled.toString());\n },\n setDarkModeEnabled: (enabled)=>{\n set({\n darkModeEnabled: enabled\n });\n localStorage.setItem(DARK_MODE_KEY, enabled.toString());\n },\n setPlaybackSpeed: (speed)=>{\n set({\n playbackSpeed: speed\n });\n localStorage.setItem(PLAYBACK_SPEED_KEY, speed.toString());\n },\n subtitleEnabled: savedSubtitleEnabled,\n setSubtitleEnabled: (enabled)=>{\n set({\n subtitleEnabled: enabled\n });\n localStorage.setItem(SUBTITLE_ENABLED_KEY, enabled.toString());\n }\n };\n});\nconst CONFIG_KEY = 'midscene-env-config';\nconst SERVICE_MODE_KEY = 'midscene-service-mode';\nconst TRACKING_ACTIVE_TAB_KEY = 'midscene-tracking-active-tab';\nconst DEEP_LOCATE_KEY = 'midscene-deep-locate';\nconst DEEP_THINK_KEY = 'midscene-deep-think';\nconst SCREENSHOT_INCLUDED_KEY = 'midscene-screenshot-included';\nconst DOM_INCLUDED_KEY = 'midscene-dom-included';\nconst IME_STRATEGY_KEY = 'midscene-ime-strategy';\nconst AUTO_DISMISS_KEYBOARD_KEY = 'midscene-auto-dismiss-keyboard';\nconst KEYBOARD_DISMISS_STRATEGY_KEY = 'midscene-keyboard-dismiss-strategy';\nconst ALWAYS_REFRESH_SCREEN_INFO_KEY = 'midscene-always-refresh-screen-info';\nconst getConfigStringFromLocalStorage = ()=>{\n const configString = localStorage.getItem(CONFIG_KEY);\n return configString || '';\n};\nconst parseConfig = (configString)=>{\n const lines = configString.split('\\n');\n const config = {};\n lines.forEach((line)=>{\n const trimmed = line.trim();\n if (trimmed.startsWith('#')) return;\n const cleanLine = trimmed.replace(/^export\\s+/i, '').replace(/;$/, '').trim();\n const match = cleanLine.match(/^(\\w+)=(.*)$/);\n if (match) {\n const [, key, value] = match;\n let parsedValue = value.trim();\n if (parsedValue.startsWith(\"'\") && parsedValue.endsWith(\"'\") || parsedValue.startsWith('\"') && parsedValue.endsWith('\"')) parsedValue = parsedValue.slice(1, -1);\n config[key] = parsedValue;\n }\n });\n return config;\n};\nconst useEnvConfig = store_create((set, get)=>{\n const configString = getConfigStringFromLocalStorage();\n const config = parseConfig(configString);\n const ifInExtension = window.location.href.startsWith('chrome-extension');\n const savedServiceMode = localStorage.getItem(SERVICE_MODE_KEY);\n const savedForceSameTabNavigation = 'false' !== localStorage.getItem(TRACKING_ACTIVE_TAB_KEY);\n const savedDeepLocate = 'true' === localStorage.getItem(DEEP_LOCATE_KEY);\n const savedDeepThinkRaw = localStorage.getItem(DEEP_THINK_KEY);\n const savedDeepThink = 'true' === savedDeepThinkRaw ? true : 'false' === savedDeepThinkRaw ? false : 'unset';\n const savedScreenshotIncluded = 'false' !== localStorage.getItem(SCREENSHOT_INCLUDED_KEY);\n const savedDomIncluded = localStorage.getItem(DOM_INCLUDED_KEY) || 'false';\n const savedImeStrategy = localStorage.getItem(IME_STRATEGY_KEY) || 'yadb-for-non-ascii';\n const savedAutoDismissKeyboard = 'false' !== localStorage.getItem(AUTO_DISMISS_KEYBOARD_KEY);\n const savedKeyboardDismissStrategy = localStorage.getItem(KEYBOARD_DISMISS_STRATEGY_KEY) || 'esc-first';\n const savedAlwaysRefreshScreenInfo = 'true' === localStorage.getItem(ALWAYS_REFRESH_SCREEN_INFO_KEY);\n return {\n serviceMode: ifInExtension ? 'In-Browser-Extension' : savedServiceMode || 'Server',\n setServiceMode: (serviceMode)=>{\n if (ifInExtension) throw new Error('serviceMode cannot be set in extension');\n set({\n serviceMode\n });\n localStorage.setItem(SERVICE_MODE_KEY, serviceMode);\n },\n config,\n configString,\n setConfig: (config)=>set({\n config\n }),\n loadConfig: (configString)=>{\n const config = parseConfig(configString);\n set({\n config,\n configString\n });\n localStorage.setItem(CONFIG_KEY, configString);\n },\n syncFromStorage: ()=>{\n const latestConfigString = getConfigStringFromLocalStorage();\n const latestConfig = parseConfig(latestConfigString);\n set({\n config: latestConfig,\n configString: latestConfigString\n });\n },\n forceSameTabNavigation: savedForceSameTabNavigation,\n setForceSameTabNavigation: (forceSameTabNavigation)=>{\n set({\n forceSameTabNavigation\n });\n localStorage.setItem(TRACKING_ACTIVE_TAB_KEY, forceSameTabNavigation.toString());\n },\n deepLocate: savedDeepLocate,\n setDeepLocate: (deepLocate)=>{\n set({\n deepLocate\n });\n localStorage.setItem(DEEP_LOCATE_KEY, deepLocate.toString());\n },\n deepThink: savedDeepThink,\n setDeepThink: (deepThink)=>{\n set({\n deepThink\n });\n localStorage.setItem(DEEP_THINK_KEY, deepThink.toString());\n },\n screenshotIncluded: savedScreenshotIncluded,\n setScreenshotIncluded: (screenshotIncluded)=>{\n set({\n screenshotIncluded\n });\n localStorage.setItem(SCREENSHOT_INCLUDED_KEY, screenshotIncluded.toString());\n },\n domIncluded: 'visible-only' === savedDomIncluded ? 'visible-only' : 'true' === savedDomIncluded,\n setDomIncluded: (domIncluded)=>{\n set({\n domIncluded\n });\n localStorage.setItem(DOM_INCLUDED_KEY, domIncluded.toString());\n },\n popupTab: 'playground',\n setPopupTab: (tab)=>{\n set({\n popupTab: tab\n });\n },\n imeStrategy: savedImeStrategy,\n setImeStrategy: (imeStrategy)=>{\n set({\n imeStrategy\n });\n localStorage.setItem(IME_STRATEGY_KEY, imeStrategy);\n },\n autoDismissKeyboard: savedAutoDismissKeyboard,\n setAutoDismissKeyboard: (autoDismissKeyboard)=>{\n set({\n autoDismissKeyboard\n });\n localStorage.setItem(AUTO_DISMISS_KEYBOARD_KEY, autoDismissKeyboard.toString());\n },\n keyboardDismissStrategy: savedKeyboardDismissStrategy,\n setKeyboardDismissStrategy: (keyboardDismissStrategy)=>{\n set({\n keyboardDismissStrategy\n });\n localStorage.setItem(KEYBOARD_DISMISS_STRATEGY_KEY, keyboardDismissStrategy);\n },\n alwaysRefreshScreenInfo: savedAlwaysRefreshScreenInfo,\n setAlwaysRefreshScreenInfo: (alwaysRefreshScreenInfo)=>{\n set({\n alwaysRefreshScreenInfo\n });\n localStorage.setItem(ALWAYS_REFRESH_SCREEN_INFO_KEY, alwaysRefreshScreenInfo.toString());\n }\n };\n});\nexport { useEnvConfig, useGlobalPreference };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { SettingOutlined } from \"@ant-design/icons\";\nimport { Input, Modal, Tooltip } from \"antd\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useEnvConfig } from \"../../store/store.mjs\";\nfunction EnvConfig({ showTooltipWhenEmpty = true, showModelName = true, tooltipPlacement = 'bottom', mode = 'icon' }) {\n const { config, configString, loadConfig, syncFromStorage } = useEnvConfig();\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [tempConfigString, setTempConfigString] = useState(configString);\n const midsceneModelName = config.MIDSCENE_MODEL_NAME;\n const componentRef = useRef(null);\n const showModal = (e)=>{\n syncFromStorage();\n setIsModalOpen(true);\n e.preventDefault();\n e.stopPropagation();\n };\n const handleOk = ()=>{\n setIsModalOpen(false);\n loadConfig(tempConfigString);\n };\n const handleCancel = ()=>{\n setIsModalOpen(false);\n };\n useEffect(()=>{\n if (isModalOpen) setTempConfigString(configString);\n }, [\n isModalOpen,\n configString\n ]);\n return /*#__PURE__*/ jsxs(\"div\", {\n style: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '10px',\n alignItems: 'center',\n height: '100%',\n minHeight: '32px'\n },\n ref: componentRef,\n children: [\n showModelName ? midsceneModelName : null,\n /*#__PURE__*/ jsx(Tooltip, {\n title: \"Please set up your environment variables before using.\",\n placement: tooltipPlacement,\n align: {\n offset: [\n -10,\n 5\n ]\n },\n getPopupContainer: ()=>componentRef.current,\n open: isModalOpen ? false : showTooltipWhenEmpty ? 0 === Object.keys(config).length : void 0,\n children: 'icon' === mode ? /*#__PURE__*/ jsx(SettingOutlined, {\n onClick: showModal\n }) : /*#__PURE__*/ jsx(\"span\", {\n onClick: showModal,\n style: {\n color: '#006AFF',\n cursor: 'pointer'\n },\n children: \"set up\"\n })\n }),\n /*#__PURE__*/ jsxs(Modal, {\n title: \"Model Env Config\",\n open: isModalOpen,\n onOk: handleOk,\n onCancel: handleCancel,\n okText: \"Save\",\n style: {\n width: '800px',\n height: '100%',\n marginTop: '10%'\n },\n destroyOnClose: true,\n maskClosable: true,\n centered: true,\n children: [\n /*#__PURE__*/ jsx(Input.TextArea, {\n rows: 7,\n placeholder: 'MIDSCENE_MODEL_API_KEY=sk-...\\nMIDSCENE_MODEL_NAME=gpt-4o-2024-08-06\\n...',\n value: tempConfigString,\n onChange: (e)=>setTempConfigString(e.target.value),\n style: {\n whiteSpace: 'nowrap',\n wordWrap: 'break-word'\n }\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n children: [\n /*#__PURE__*/ jsx(\"p\", {\n children: \"The format is KEY=VALUE and separated by new lines.\"\n }),\n /*#__PURE__*/ jsxs(\"p\", {\n children: [\n \"These data will be saved \",\n /*#__PURE__*/ jsx(\"strong\", {\n children: \"locally in your browser\"\n }),\n \".\"\n ]\n })\n ]\n })\n ]\n })\n ]\n });\n}\nexport { EnvConfig };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { GithubOutlined, QuestionCircleOutlined } from \"@ant-design/icons\";\nimport { Typography } from \"antd\";\nimport { EnvConfig } from \"../env-config/index.mjs\";\nimport \"./style.css\";\nfunction NavActions({ showEnvConfig = true, showTooltipWhenEmpty = false, showModelName = false, githubUrl = 'https://github.com/web-infra-dev/midscene', helpUrl = 'https://midscenejs.com/quick-experience.html', className = '' }) {\n return /*#__PURE__*/ jsxs(\"div\", {\n className: `nav-actions ${className}`,\n children: [\n /*#__PURE__*/ jsx(Typography.Link, {\n href: githubUrl,\n target: \"_blank\",\n children: /*#__PURE__*/ jsx(GithubOutlined, {\n className: \"nav-icon\"\n })\n }),\n /*#__PURE__*/ jsx(Typography.Link, {\n href: helpUrl,\n target: \"_blank\",\n children: /*#__PURE__*/ jsx(QuestionCircleOutlined, {\n className: \"nav-icon\"\n })\n }),\n showEnvConfig && /*#__PURE__*/ jsx(EnvConfig, {\n showTooltipWhenEmpty: showTooltipWhenEmpty,\n showModelName: showModelName\n })\n ]\n });\n}\nexport { NavActions };\n","const trackingTip = 'Limit popup to current tab';\nconst deepLocateTip = 'Deep Locate';\nconst deepThinkTip = 'Deep Think';\nconst screenshotIncludedTip = 'Include screenshot in request';\nconst domIncludedTip = 'Include DOM info in request';\nconst imeStrategyTip = 'IME strategy';\nconst autoDismissKeyboardTip = 'Auto dismiss keyboard';\nconst keyboardDismissStrategyTip = 'Keyboard dismiss strategy';\nconst alwaysRefreshScreenInfoTip = 'Always refresh screen info';\nconst apiMetadata = {\n aiAct: {\n group: 'interaction',\n title: 'Auto Planning: plan the steps and execute'\n },\n aiTap: {\n group: 'interaction',\n title: 'Click an element'\n },\n aiDoubleClick: {\n group: 'interaction',\n title: 'Double-click an element'\n },\n aiHover: {\n group: 'interaction',\n title: 'Hover over an element'\n },\n aiInput: {\n group: 'interaction',\n title: 'Input text into an element'\n },\n aiRightClick: {\n group: 'interaction',\n title: 'Right-click an element'\n },\n aiKeyboardPress: {\n group: 'interaction',\n title: 'Press keyboard keys'\n },\n aiScroll: {\n group: 'interaction',\n title: 'Scroll the page or element'\n },\n aiLocate: {\n group: 'interaction',\n title: 'Locate an element on the page'\n },\n aiQuery: {\n group: 'extraction',\n title: 'Extract data directly from the UI'\n },\n aiBoolean: {\n group: 'extraction',\n title: 'Get true/false answer'\n },\n aiNumber: {\n group: 'extraction',\n title: 'Extract numeric value'\n },\n aiString: {\n group: 'extraction',\n title: 'Extract text value'\n },\n aiAsk: {\n group: 'extraction',\n title: 'Ask a question about the UI'\n },\n aiAssert: {\n group: 'validation',\n title: 'Assert a condition is true'\n },\n aiWaitFor: {\n group: 'validation',\n title: 'Wait for a condition to be met'\n }\n};\nconst defaultMainButtons = [\n 'aiAct',\n 'aiTap',\n 'aiQuery',\n 'aiAssert'\n];\nconst getWelcomeMessageTemplate = (targetName = 'web page')=>({\n type: 'system',\n content: `\n Welcome to Midscene.js Playground!\n\n This is a panel for experimenting and testing Midscene.js features. You can use natural language instructions to operate the ${targetName}, such as clicking buttons, filling in forms, querying information, etc.\n\n Please enter your instructions in the input box below to start experiencing.\n `,\n loading: false,\n result: void 0,\n replayScriptsInfo: null,\n replayCounter: 0,\n loadingProgressText: '',\n verticalMode: false\n });\nconst WELCOME_MESSAGE_TEMPLATE = getWelcomeMessageTemplate();\nconst BLANK_RESULT = {\n result: void 0,\n dump: null,\n reportHTML: null,\n error: null\n};\nexport { BLANK_RESULT, WELCOME_MESSAGE_TEMPLATE, alwaysRefreshScreenInfoTip, apiMetadata, autoDismissKeyboardTip, deepLocateTip, deepThinkTip, defaultMainButtons, domIncludedTip, getWelcomeMessageTemplate, imeStrategyTip, keyboardDismissStrategyTip, screenshotIncludedTip, trackingTip };\n","import dayjs from \"dayjs\";\nfunction timeStr(timestamp) {\n return timestamp ? dayjs(timestamp).format('YYYY-MM-DD HH:mm:ss') : '-';\n}\nfunction fullTimeStrWithMilliseconds(timestamp) {\n return timestamp ? dayjs(timestamp).format('YYYY-MM-DD HH:mm:ss.SSS') : '-';\n}\nfunction filterBase64Value(input) {\n return input.replace(/data:image\\/[^\"]+\"/g, 'data:image...\"');\n}\nconst mousePointer = 'data:image/png;base64,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';\nconst mouseLoading = 'data:image/png;base64,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';\nexport { filterBase64Value, fullTimeStrWithMilliseconds, mouseLoading, mousePointer, timeStr };\n","\"use client\";\nimport { mousePointer } from \"./index.mjs\";\nimport { paramStr, typeStr } from \"@midscene/core/agent\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction replay_scripts_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else replay_scripts_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nconst stillDuration = 900;\nconst actionSpinningPointerDuration = 300;\nconst stillAfterInsightDuration = 300;\nconst locateDuration = 800;\nconst actionDuration = 500;\nconst clearInsightDuration = 200;\nconst lastFrameDuration = 200;\nconst cameraStateForRect = (rect, imageWidth, imageHeight)=>{\n const canvasRatio = imageWidth / imageHeight;\n const rectRatio = rect.width / rect.height;\n let rectWidthOnPage;\n rectWidthOnPage = rectRatio >= canvasRatio ? rect.width : rect.height / imageHeight * imageWidth;\n const cameraPaddingRatio = rectWidthOnPage > 400 ? 0.1 : rectWidthOnPage > 50 ? 0.2 : 0.3;\n const cameraWidth = Math.min(imageWidth, rectWidthOnPage + imageWidth * cameraPaddingRatio * 2);\n const cameraHeight = imageHeight / imageWidth * cameraWidth;\n let left = Math.min(rect.left - imageWidth * cameraPaddingRatio, imageWidth - cameraWidth);\n left = Math.max(left, 0);\n let top = Math.min(rect.top - imageHeight * cameraPaddingRatio, imageHeight - cameraHeight);\n top = Math.max(top, 0);\n return {\n left: Math.round(left),\n top: Math.round(top),\n width: Math.round(cameraWidth)\n };\n};\nconst mergeTwoCameraState = (cameraState1, cameraState2)=>{\n const newLeft = Math.min(cameraState1.left, cameraState2.left);\n const newTop = Math.min(cameraState1.top, cameraState2.top);\n const newRight = Math.max(cameraState1.left + cameraState1.width, cameraState2.left + cameraState2.width);\n const newWidth = newRight - newLeft;\n return {\n left: newLeft,\n top: newTop,\n width: newWidth\n };\n};\nconst isSameModelBrief = (a, b)=>a.intent === b.intent && a.name === b.name && a.modelDescription === b.modelDescription;\nconst pushModelBriefIfNotExists = (list, candidate)=>{\n if (!list.some((brief)=>isSameModelBrief(brief, candidate))) list.push(candidate);\n};\nconst normalizeDump = (dump)=>{\n if (!dump) return null;\n return Array.isArray(dump.executions) ? dump : {\n sdkVersion: '',\n groupName: 'Execution',\n modelBriefs: [],\n executions: [\n dump\n ]\n };\n};\nconst extractMetaFromNormalized = (normalizedDump)=>{\n var _normalizedDump_executions;\n let firstWidth;\n let firstHeight;\n const sdkVersion = normalizedDump.sdkVersion;\n const modelBriefs = [];\n null == (_normalizedDump_executions = normalizedDump.executions) || _normalizedDump_executions.filter(Boolean).forEach((execution)=>{\n execution.tasks.forEach((task)=>{\n var _task_uiContext_shotSize, _task_uiContext;\n if (null == (_task_uiContext = task.uiContext) ? void 0 : null == (_task_uiContext_shotSize = _task_uiContext.shotSize) ? void 0 : _task_uiContext_shotSize.width) {\n const w = task.uiContext.shotSize.width;\n const h = task.uiContext.shotSize.height;\n if (!firstWidth) {\n firstWidth = w;\n firstHeight = h;\n }\n }\n if (task.usage) {\n const { model_name, model_description, intent } = task.usage;\n const brief = {\n intent,\n name: model_name,\n modelDescription: model_description\n };\n pushModelBriefIfNotExists(modelBriefs, brief);\n }\n });\n });\n if (!firstWidth || !firstHeight) {\n console.warn('width or height is missing in dump file');\n return null;\n }\n return {\n width: firstWidth,\n height: firstHeight,\n sdkVersion,\n modelBriefs,\n deviceType: normalizedDump.deviceType\n };\n};\nconst extractDumpMetaInfo = (dump)=>{\n const normalizedDump = normalizeDump(dump);\n if (!normalizedDump) return null;\n return extractMetaFromNormalized(normalizedDump);\n};\nconst allScriptsFromDump = (dump)=>{\n var _normalizedDump_executions;\n const normalizedDump = normalizeDump(dump);\n if (!normalizedDump) {\n console.warn('[allScriptsFromDump] dump is empty');\n return {\n scripts: [],\n modelBriefs: []\n };\n }\n const metaInfo = extractMetaFromNormalized(normalizedDump);\n if (!metaInfo) return {\n scripts: [],\n sdkVersion: normalizedDump.sdkVersion,\n modelBriefs: []\n };\n const { width: firstWidth, height: firstHeight } = metaInfo;\n const allScripts = [];\n const executions = (null == (_normalizedDump_executions = normalizedDump.executions) ? void 0 : _normalizedDump_executions.filter(Boolean)) || [];\n for(let execIndex = 0; execIndex < executions.length; execIndex++){\n const execution = executions[execIndex];\n const scripts = generateAnimationScripts(execution, -1, firstWidth, firstHeight, execIndex);\n if (scripts) allScripts.push(...scripts);\n }\n const allScriptsWithoutIntermediateDoneFrame = allScripts.filter((script, index)=>{\n if (index !== allScripts.length - 1 && 'Done' === script.title) return false;\n return true;\n });\n return {\n scripts: allScriptsWithoutIntermediateDoneFrame,\n width: firstWidth,\n height: firstHeight,\n sdkVersion: metaInfo.sdkVersion,\n modelBriefs: metaInfo.modelBriefs,\n deviceType: metaInfo.deviceType\n };\n};\nconst generateAnimationScripts = (execution, task, imageWidth, imageHeight, executionIndex = 0)=>{\n if (!execution || !execution.tasks.length) return null;\n if (0 === imageWidth || 0 === imageHeight) return null;\n let tasksIncluded = [];\n if (-1 === task) tasksIncluded = execution.tasks;\n else {\n const startIndex = execution.tasks.findIndex((t)=>t === task);\n if (-1 === startIndex) {\n console.error(\"task not found, cannot generate animation scripts\");\n return null;\n }\n if (startIndex === execution.tasks.length - 1) return null;\n for(let i = startIndex; i < execution.tasks.length; i++){\n if (i > startIndex && 'Planning' === execution.tasks[i].type && 'Plan' === execution.tasks[i].subType) break;\n tasksIncluded.push(execution.tasks[i]);\n }\n }\n if (0 === tasksIncluded.length) return null;\n const fullPageCameraState = cameraStateForRect({\n left: 0,\n top: 0,\n width: imageWidth,\n height: imageHeight\n }, imageWidth, imageHeight);\n const getTaskId = (taskIndex)=>{\n var _tasksIncluded_taskIndex;\n return null == (_tasksIncluded_taskIndex = tasksIncluded[taskIndex]) ? void 0 : _tasksIncluded_taskIndex.taskId;\n };\n const setPointerScript = (img, title, subTitle, taskId)=>({\n type: 'pointer',\n img,\n duration: 0,\n title,\n subTitle,\n taskId\n });\n const asScreenshot = (s)=>s;\n const createScript = (base, screenshot)=>{\n if (!screenshot) return base;\n const script = _object_spread({}, base);\n let cachedImg = null;\n Object.defineProperty(script, 'img', {\n get () {\n if (null === cachedImg) cachedImg = screenshot.base64;\n return cachedImg;\n },\n enumerable: true\n });\n return script;\n };\n const scripts = [];\n let insightCameraState;\n let insightOnTop = false;\n let initSubTitle = '';\n let lastTaskId;\n tasksIncluded.forEach((task, index)=>{\n const currentTaskId = getTaskId(index);\n lastTaskId = currentTaskId;\n if (0 === index) initSubTitle = paramStr(task);\n if ('Planning' === task.type) {\n var _task_output;\n let locateElements = [];\n if ('Plan' === task.subType) {\n var _planTask_output;\n const planTask = task;\n const actions = (null == (_planTask_output = planTask.output) ? void 0 : _planTask_output.actions) || [];\n if (actions.length > 0) {\n const action = actions[0];\n const knownFields = [\n 'locate',\n 'start',\n 'end'\n ];\n if (action.param) {\n knownFields.forEach((field)=>{\n if (action.param[field] && 'object' == typeof action.param[field] && 'center' in (action.param[field] || {})) locateElements.push(action.param[field]);\n });\n for(const key in action.param)if (!knownFields.includes(key)) {\n if ('object' == typeof action.param[key] && 'center' in (action.param[key] || {})) locateElements.push(action.param[key]);\n }\n }\n }\n } else if ('Locate' === task.subType && (null == (_task_output = task.output) ? void 0 : _task_output.element)) {\n const locateTask = task;\n locateElements = [\n locateTask.output.element\n ];\n }\n const title = typeStr(task);\n const subTitle = paramStr(task);\n const context = task.uiContext;\n if (null == context ? void 0 : context.screenshot) {\n var _context_shotSize, _context_shotSize1;\n const width = (null == (_context_shotSize = context.shotSize) ? void 0 : _context_shotSize.width) || imageWidth;\n const height = (null == (_context_shotSize1 = context.shotSize) ? void 0 : _context_shotSize1.height) || imageHeight;\n const contextScreenshot = asScreenshot(context.screenshot);\n scripts.push(createScript({\n type: 'img',\n duration: stillAfterInsightDuration,\n title,\n subTitle,\n imageWidth: width,\n imageHeight: height,\n taskId: currentTaskId\n }, contextScreenshot));\n locateElements.forEach((element)=>{\n var _task_log_taskInfo, _task_log, _context_shotSize, _context_shotSize1;\n insightCameraState = _object_spread_props(_object_spread({}, cameraStateForRect(element.rect, width, height)), {\n pointerLeft: element.center[0],\n pointerTop: element.center[1]\n });\n const newCameraState = insightCameraState;\n scripts.push(createScript({\n type: 'insight',\n context: context,\n camera: newCameraState,\n highlightElement: element,\n searchArea: null == (_task_log = task.log) ? void 0 : null == (_task_log_taskInfo = _task_log.taskInfo) ? void 0 : _task_log_taskInfo.searchArea,\n duration: 0.5 * locateDuration,\n insightCameraDuration: locateDuration,\n title,\n subTitle: element.description || subTitle,\n imageWidth: (null == (_context_shotSize = context.shotSize) ? void 0 : _context_shotSize.width) || imageWidth,\n imageHeight: (null == (_context_shotSize1 = context.shotSize) ? void 0 : _context_shotSize1.height) || imageHeight,\n taskId: currentTaskId\n }, contextScreenshot));\n insightOnTop = true;\n });\n }\n const planningTask = task;\n if (planningTask.recorder && planningTask.recorder.length > 0) {\n var _planningTask_recorder_, _task_uiContext_shotSize, _task_uiContext, _task_uiContext_shotSize1, _task_uiContext1;\n const screenshot = null == (_planningTask_recorder_ = planningTask.recorder[0]) ? void 0 : _planningTask_recorder_.screenshot;\n scripts.push(createScript({\n type: 'img',\n duration: stillDuration,\n title: typeStr(task),\n subTitle: paramStr(task),\n imageWidth: (null == (_task_uiContext = task.uiContext) ? void 0 : null == (_task_uiContext_shotSize = _task_uiContext.shotSize) ? void 0 : _task_uiContext_shotSize.width) || imageWidth,\n imageHeight: (null == (_task_uiContext1 = task.uiContext) ? void 0 : null == (_task_uiContext_shotSize1 = _task_uiContext1.shotSize) ? void 0 : _task_uiContext_shotSize1.height) || imageHeight,\n taskId: currentTaskId\n }, asScreenshot(screenshot)));\n }\n } else if ('Action Space' === task.type) {\n var _task_recorder_, _task_recorder, _task_uiContext_shotSize2, _task_uiContext2, _task_uiContext_shotSize3, _task_uiContext3;\n const title = typeStr(task);\n const subTitle = paramStr(task);\n scripts.push({\n type: 'spinning-pointer',\n duration: actionSpinningPointerDuration,\n title,\n subTitle,\n taskId: currentTaskId\n });\n if (insightOnTop) {\n scripts.push({\n type: 'clear-insight',\n duration: clearInsightDuration,\n title,\n subTitle,\n taskId: currentTaskId\n });\n insightOnTop = false;\n }\n scripts.push(setPointerScript(mousePointer, title, subTitle, currentTaskId));\n const screenshot = null == (_task_recorder = task.recorder) ? void 0 : null == (_task_recorder_ = _task_recorder[0]) ? void 0 : _task_recorder_.screenshot;\n scripts.push(createScript({\n type: 'img',\n duration: actionDuration,\n camera: 'Sleep' === task.subType ? fullPageCameraState : void 0,\n title,\n subTitle,\n imageWidth: (null == (_task_uiContext2 = task.uiContext) ? void 0 : null == (_task_uiContext_shotSize2 = _task_uiContext2.shotSize) ? void 0 : _task_uiContext_shotSize2.width) || imageWidth,\n imageHeight: (null == (_task_uiContext3 = task.uiContext) ? void 0 : null == (_task_uiContext_shotSize3 = _task_uiContext3.shotSize) ? void 0 : _task_uiContext_shotSize3.height) || imageHeight,\n taskId: currentTaskId\n }, asScreenshot(screenshot)));\n } else {\n var _task_recorder_1, _task_recorder1;\n const title = typeStr(task);\n const subTitle = paramStr(task);\n const screenshot = null == (_task_recorder1 = task.recorder) ? void 0 : null == (_task_recorder_1 = _task_recorder1[task.recorder.length - 1]) ? void 0 : _task_recorder_1.screenshot;\n if (screenshot) {\n var _task_uiContext_shotSize4, _task_uiContext4, _task_uiContext_shotSize5, _task_uiContext5;\n scripts.push(createScript({\n type: 'img',\n duration: stillDuration,\n camera: fullPageCameraState,\n title,\n subTitle,\n imageWidth: (null == (_task_uiContext4 = task.uiContext) ? void 0 : null == (_task_uiContext_shotSize4 = _task_uiContext4.shotSize) ? void 0 : _task_uiContext_shotSize4.width) || imageWidth,\n imageHeight: (null == (_task_uiContext5 = task.uiContext) ? void 0 : null == (_task_uiContext_shotSize5 = _task_uiContext5.shotSize) ? void 0 : _task_uiContext_shotSize5.height) || imageHeight,\n taskId: currentTaskId\n }, asScreenshot(screenshot)));\n }\n }\n if ('finished' !== task.status) {\n var _task_recorder_2, _task_recorder2, _task_uiContext_shotSize6, _task_uiContext6, _task_uiContext_shotSize7, _task_uiContext7;\n const errorTitle = typeStr(task);\n const errorMsg = task.errorMessage || 'unknown error';\n const errorSubTitle = errorMsg.indexOf('NOT_IMPLEMENTED_AS_DESIGNED') > 0 ? 'Further actions cannot be performed in the current environment' : errorMsg;\n const screenshot = null == (_task_recorder2 = task.recorder) ? void 0 : null == (_task_recorder_2 = _task_recorder2[task.recorder.length - 1]) ? void 0 : _task_recorder_2.screenshot;\n scripts.push(createScript({\n type: 'img',\n camera: fullPageCameraState,\n duration: stillDuration,\n title: errorTitle,\n subTitle: errorSubTitle,\n imageWidth: (null == (_task_uiContext6 = task.uiContext) ? void 0 : null == (_task_uiContext_shotSize6 = _task_uiContext6.shotSize) ? void 0 : _task_uiContext_shotSize6.width) || imageWidth,\n imageHeight: (null == (_task_uiContext7 = task.uiContext) ? void 0 : null == (_task_uiContext_shotSize7 = _task_uiContext7.shotSize) ? void 0 : _task_uiContext_shotSize7.height) || imageHeight,\n taskId: currentTaskId\n }, asScreenshot(screenshot)));\n }\n });\n if (insightOnTop) {\n scripts.push({\n type: 'clear-insight',\n duration: clearInsightDuration,\n title: '',\n subTitle: '',\n taskId: lastTaskId\n });\n insightOnTop = false;\n }\n scripts.push({\n title: 'End',\n subTitle: initSubTitle,\n type: 'img',\n duration: lastFrameDuration,\n camera: fullPageCameraState,\n taskId: void 0\n });\n return scripts;\n};\nexport { allScriptsFromDump, cameraStateForRect, extractDumpMetaInfo, generateAnimationScripts, mergeTwoCameraState };\n","import { paramStr, typeStr } from \"@midscene/core/agent\";\nimport { useCallback } from \"react\";\nimport { useEnvConfig } from \"../store/store.mjs\";\nimport { BLANK_RESULT } from \"../utils/constants.mjs\";\nimport { allScriptsFromDump } from \"../utils/replay-scripts.mjs\";\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(void 0);\n });\n };\n}\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction usePlaygroundExecution_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else usePlaygroundExecution_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nfunction formatError(error) {\n var _error_dump;\n if (!error) return '';\n if ('string' == typeof error) return error;\n if (null == error ? void 0 : null == (_error_dump = error.dump) ? void 0 : _error_dump.error) return error.dump.error;\n if (error.message) return String(error.message);\n try {\n return JSON.stringify(error);\n } catch (e) {\n return String(error);\n }\n}\nfunction buildProgressContent(task) {\n const action = typeStr(task);\n const description = paramStr(task);\n return description ? `${action} - ${description}` : action;\n}\nfunction wrapExecutionDumpForReplay(dump, deviceType) {\n return {\n sdkVersion: '',\n groupName: 'Playground Execution',\n modelBriefs: [],\n executions: [\n dump\n ],\n deviceType\n };\n}\nfunction usePlaygroundExecution(options) {\n const { playgroundSDK, storage, actionSpace, loading, setLoading, setInfoList, replayCounter, setReplayCounter, verticalMode, currentRunningIdRef, interruptedFlagRef, deviceType } = options;\n const { deepLocate, deepThink, screenshotIncluded, domIncluded, imeStrategy, autoDismissKeyboard, keyboardDismissStrategy, alwaysRefreshScreenInfo } = useEnvConfig();\n const handleRun = useCallback((value)=>_async_to_generator(function*() {\n if (!playgroundSDK) return void console.warn('PlaygroundSDK is not available');\n const thisRunningId = Date.now();\n const actionType = value.type;\n const displayContent = `${value.type}: ${value.prompt || JSON.stringify(value.params)}`;\n const userItem = {\n id: `user-${Date.now()}`,\n type: 'user',\n content: displayContent,\n timestamp: new Date()\n };\n setInfoList((prev)=>[\n ...prev,\n userItem\n ]);\n setLoading(true);\n const result = _object_spread({}, BLANK_RESULT);\n const systemItem = {\n id: `system-${thisRunningId}`,\n type: 'system',\n content: '',\n timestamp: new Date(),\n loading: true,\n loadingProgressText: ''\n };\n setInfoList((prev)=>[\n ...prev,\n systemItem\n ]);\n try {\n currentRunningIdRef.current = thisRunningId;\n interruptedFlagRef.current[thisRunningId] = false;\n if (playgroundSDK.onDumpUpdate) playgroundSDK.onDumpUpdate((_, executionDump)=>{\n var _executionDump_tasks;\n if (interruptedFlagRef.current[thisRunningId] || !(null == executionDump ? void 0 : null == (_executionDump_tasks = executionDump.tasks) ? void 0 : _executionDump_tasks.length)) return;\n const progressItems = executionDump.tasks.map((task, index)=>{\n var _task_timing;\n return {\n id: `progress-${thisRunningId}-task-${index}`,\n type: 'progress',\n content: buildProgressContent(task),\n timestamp: new Date((null == (_task_timing = task.timing) ? void 0 : _task_timing.start) || Date.now()),\n result: task.error ? {\n error: formatError(task.error),\n result: null\n } : void 0\n };\n });\n setInfoList((prev)=>{\n const systemItemIndex = prev.findIndex((item)=>item.id === `system-${thisRunningId}`);\n if (-1 === systemItemIndex) return prev;\n const listWithoutCurrentProgress = prev.filter((item)=>!('progress' === item.type && item.id.startsWith(`progress-${thisRunningId}-`)));\n return [\n ...listWithoutCurrentProgress.slice(0, systemItemIndex + 1),\n ...progressItems,\n ...listWithoutCurrentProgress.slice(systemItemIndex + 1)\n ];\n });\n });\n if ('aiAct' !== actionType && true === deepThink) console.warn('[Playground] Non-aiAct action will be executed without deepThink. deepThink is only forwarded for aiAct.', {\n actionType,\n requestId: thisRunningId.toString()\n });\n const resolvedDeepThink = 'unset' === deepThink ? void 0 : deepThink;\n const executionOptions = _object_spread_props(_object_spread({\n requestId: thisRunningId.toString(),\n deepLocate\n }, 'aiAct' === actionType && void 0 !== resolvedDeepThink ? {\n deepThink: resolvedDeepThink\n } : {}), {\n screenshotIncluded,\n domIncluded,\n deviceOptions: {\n imeStrategy,\n autoDismissKeyboard,\n keyboardDismissStrategy,\n alwaysRefreshScreenInfo\n }\n });\n result.result = yield playgroundSDK.executeAction(actionType, value, executionOptions);\n if ('object' == typeof result.result && null !== result.result) {\n const resultObj = result.result;\n if (resultObj.dump) result.dump = resultObj.dump;\n if (resultObj.reportHTML) result.reportHTML = resultObj.reportHTML;\n if (resultObj.error) result.error = formatError(resultObj.error);\n if ('result' in resultObj) result.result = resultObj.result;\n }\n } catch (e) {\n result.error = formatError(e);\n console.error('Playground execution error:', e);\n if ('object' == typeof e && null !== e) {\n if (e.dump) result.dump = e.dump;\n if (e.reportHTML) result.reportHTML = e.reportHTML;\n }\n }\n if (interruptedFlagRef.current[thisRunningId]) return;\n setLoading(false);\n currentRunningIdRef.current = null;\n let replayInfo = null;\n let counter = replayCounter;\n if (null == result ? void 0 : result.dump) {\n if (result.dump.tasks && Array.isArray(result.dump.tasks)) {\n const groupedDump = wrapExecutionDumpForReplay(result.dump, deviceType);\n const info = allScriptsFromDump(groupedDump);\n setReplayCounter((c)=>c + 1);\n replayInfo = info;\n counter = replayCounter + 1;\n }\n }\n setInfoList((prev)=>prev.map((item)=>item.id === `system-${thisRunningId}` ? _object_spread_props(_object_spread({}, item), {\n content: '',\n loading: false,\n loadingProgressText: ''\n }) : item));\n const resultItem = {\n id: `result-${thisRunningId}`,\n type: 'result',\n content: 'Execution result',\n timestamp: new Date(),\n result: result,\n loading: false,\n replayScriptsInfo: replayInfo,\n replayCounter: counter,\n loadingProgressText: '',\n verticalMode: verticalMode,\n actionType: actionType\n };\n setInfoList((prev)=>[\n ...prev,\n resultItem\n ]);\n if (null == storage ? void 0 : storage.saveResult) try {\n yield storage.saveResult(resultItem.id, resultItem);\n } catch (error) {\n console.error('Failed to save result:', error);\n }\n const separatorItem = {\n id: `separator-${thisRunningId}`,\n type: 'separator',\n content: 'New Session',\n timestamp: new Date()\n };\n setInfoList((prev)=>[\n ...prev,\n separatorItem\n ]);\n })(), [\n playgroundSDK,\n storage,\n actionSpace,\n setLoading,\n setInfoList,\n replayCounter,\n setReplayCounter,\n verticalMode,\n currentRunningIdRef,\n interruptedFlagRef,\n deepLocate,\n deepThink,\n screenshotIncluded,\n domIncluded,\n deviceType,\n imeStrategy,\n autoDismissKeyboard,\n keyboardDismissStrategy,\n alwaysRefreshScreenInfo\n ]);\n const handleStop = useCallback(()=>_async_to_generator(function*() {\n const thisRunningId = currentRunningIdRef.current;\n if (thisRunningId && playgroundSDK && playgroundSDK.cancelExecution) try {\n const cancelResult = yield playgroundSDK.cancelExecution(thisRunningId.toString());\n let executionData = null;\n if (cancelResult) executionData = cancelResult;\n else if (playgroundSDK.getCurrentExecutionData) try {\n executionData = yield playgroundSDK.getCurrentExecutionData();\n } catch (error) {\n console.error('Failed to get execution data before stop:', error);\n }\n interruptedFlagRef.current[thisRunningId] = true;\n setLoading(false);\n if (playgroundSDK.onProgressUpdate) playgroundSDK.onProgressUpdate(()=>{});\n if (playgroundSDK.onDumpUpdate) playgroundSDK.onDumpUpdate(()=>{});\n setInfoList((prev)=>prev.map((item)=>item.id === `system-${thisRunningId}` ? _object_spread_props(_object_spread({}, item), {\n content: '',\n loading: false,\n loadingProgressText: ''\n }) : item));\n if (executionData && (executionData.dump || executionData.reportHTML)) {\n var _executionData_dump;\n let replayInfo = null;\n let counter = replayCounter;\n if ((null == (_executionData_dump = executionData.dump) ? void 0 : _executionData_dump.tasks) && Array.isArray(executionData.dump.tasks)) {\n const groupedDump = wrapExecutionDumpForReplay(executionData.dump, deviceType);\n replayInfo = allScriptsFromDump(groupedDump);\n setReplayCounter((c)=>c + 1);\n counter = replayCounter + 1;\n }\n const resultItem = {\n id: `stop-result-${thisRunningId}`,\n type: 'result',\n content: 'Execution stopped by user',\n timestamp: new Date(),\n result: {\n result: null,\n dump: executionData.dump,\n reportHTML: executionData.reportHTML,\n error: null\n },\n loading: false,\n verticalMode,\n replayScriptsInfo: replayInfo,\n replayCounter: counter\n };\n setInfoList((prev)=>[\n ...prev,\n resultItem\n ]);\n } else {\n const stopItem = {\n id: `stop-${thisRunningId}`,\n type: 'system',\n content: 'Operation stopped',\n timestamp: new Date(),\n loading: false\n };\n setInfoList((prev)=>[\n ...prev,\n stopItem\n ]);\n }\n const separatorItem = {\n id: `separator-${thisRunningId}`,\n type: 'separator',\n content: 'New Session',\n timestamp: new Date()\n };\n setInfoList((prev)=>[\n ...prev,\n separatorItem\n ]);\n } catch (error) {\n console.error('Failed to stop execution:', error);\n }\n })(), [\n playgroundSDK,\n currentRunningIdRef,\n interruptedFlagRef,\n setLoading,\n setInfoList,\n verticalMode,\n replayCounter,\n deviceType\n ]);\n const canStop = loading && !!currentRunningIdRef.current && !!playgroundSDK && !!playgroundSDK.cancelExecution;\n return {\n handleRun,\n handleStop,\n canStop\n };\n}\nexport { usePlaygroundExecution };\n","function _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nclass IndexedDBManager {\n initDB() {\n return new Promise((resolve, reject)=>{\n const request = indexedDB.open(this.dbName, this.version);\n request.onerror = ()=>reject(request.error);\n request.onsuccess = ()=>resolve(request.result);\n request.onupgradeneeded = (event)=>{\n const db = event.target.result;\n this.storeConfigs.forEach(({ name, keyPath })=>{\n if (!db.objectStoreNames.contains(name)) {\n const store = db.createObjectStore(name, {\n keyPath\n });\n store.createIndex('timestamp', 'timestamp', {\n unique: false\n });\n }\n });\n };\n });\n }\n async withTransaction(storeNames, mode, operation) {\n const db = await this.dbPromise;\n const transaction = db.transaction(storeNames, mode);\n const stores = Array.isArray(storeNames) ? storeNames.map((name)=>transaction.objectStore(name)) : transaction.objectStore(storeNames);\n return operation(stores);\n }\n promisifyRequest(request) {\n return new Promise((resolve, reject)=>{\n request.onsuccess = ()=>resolve(request.result);\n request.onerror = ()=>reject(request.error);\n });\n }\n async put(storeName, data) {\n await this.withTransaction(storeName, 'readwrite', async (store)=>{\n await this.promisifyRequest(store.put(data));\n });\n }\n async get(storeName, key) {\n return this.withTransaction(storeName, 'readonly', async (store)=>this.promisifyRequest(store.get(key)));\n }\n async getAll(storeName, sortByTimestamp = true) {\n return this.withTransaction(storeName, 'readonly', async (store)=>{\n const objectStore = store;\n const results = sortByTimestamp ? await this.promisifyRequest(objectStore.index('timestamp').getAll()) : await this.promisifyRequest(objectStore.getAll());\n return sortByTimestamp ? results.sort((a, b)=>a.timestamp - b.timestamp) : results;\n });\n }\n async clear(storeName) {\n await this.withTransaction(storeName, 'readwrite', async (store)=>{\n await this.promisifyRequest(store.clear());\n });\n }\n async delete(storeName, key) {\n await this.withTransaction(storeName, 'readwrite', async (store)=>{\n await this.promisifyRequest(store.delete(key));\n });\n }\n async count(storeName) {\n return this.withTransaction(storeName, 'readonly', async (store)=>this.promisifyRequest(store.count()));\n }\n getDBPromise() {\n return this.dbPromise;\n }\n constructor(dbName, version, storeConfigs){\n _define_property(this, \"dbPromise\", void 0);\n _define_property(this, \"dbName\", void 0);\n _define_property(this, \"version\", void 0);\n _define_property(this, \"storeConfigs\", void 0);\n this.dbName = dbName;\n this.version = version;\n this.storeConfigs = storeConfigs;\n this.dbPromise = this.initDB();\n }\n}\nconst withErrorHandling = async (operation, errorMessage, defaultValue, onQuotaExceeded)=>{\n try {\n return await operation();\n } catch (e) {\n console.error(errorMessage, e);\n if (e instanceof Error && 'QuotaExceededError' === e.name && onQuotaExceeded) {\n console.log('Storage quota exceeded, running cleanup...');\n await onQuotaExceeded();\n }\n return defaultValue;\n }\n};\nconst createCleanupFunction = (dbManager, storeName, maxItems)=>async ()=>{\n try {\n const results = await dbManager.getAll(storeName);\n if (results.length > maxItems) {\n const toDelete = results.sort((a, b)=>a.timestamp - b.timestamp).slice(0, results.length - maxItems);\n await Promise.all(toDelete.map((item)=>dbManager.delete(storeName, item.id)));\n }\n } catch (e) {\n console.error(`Failed to cleanup ${storeName}:`, e);\n }\n };\nexport { IndexedDBManager, createCleanupFunction, withErrorHandling };\n","import { IndexedDBManager, createCleanupFunction, withErrorHandling } from \"@midscene/shared/baseDB\";\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(void 0);\n });\n };\n}\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction indexeddb_storage_provider_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else indexeddb_storage_provider_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nconst DB_NAME = 'midscene_playground';\nconst DB_VERSION = 1;\nconst MESSAGES_STORE = 'playground_messages';\nconst RESULTS_STORE = 'playground_results';\nconst MAX_STORED_MESSAGES = 100;\nconst MAX_STORED_RESULTS = 50;\nclass IndexedDBStorageProvider {\n saveMessages(messages) {\n return _async_to_generator(function*() {\n yield withErrorHandling(()=>_async_to_generator(function*() {\n yield this.dbManager.clear(MESSAGES_STORE);\n const messagesToSave = messages.slice(-MAX_STORED_MESSAGES);\n yield Promise.all(messagesToSave.map((msg, index)=>{\n const lightMessage = _object_spread_props(_object_spread({}, msg), {\n result: 'result' === msg.type ? void 0 : msg.result\n });\n const data = {\n id: msg.id || `msg-${index}`,\n data: lightMessage,\n timestamp: msg.timestamp ? msg.timestamp.getTime() : Date.now() + index\n };\n return this.dbManager.put(MESSAGES_STORE, data);\n }));\n }).call(this), 'Failed to save messages to IndexedDB', void 0, this.messagesCleanup);\n }).call(this);\n }\n loadMessages() {\n return _async_to_generator(function*() {\n const result = yield withErrorHandling(()=>_async_to_generator(function*() {\n const messages = yield this.dbManager.getAll(MESSAGES_STORE, true);\n if (0 === messages.length) return [];\n return Promise.all(messages.map((msg)=>_async_to_generator(function*() {\n const item = msg.data;\n const restoredItem = _object_spread_props(_object_spread({}, item), {\n timestamp: new Date(item.timestamp)\n });\n if ('result' === item.type && item.id) {\n const fullResult = yield this.loadResult(item.id);\n if (fullResult) {\n restoredItem.result = fullResult.result;\n restoredItem.replayScriptsInfo = fullResult.replayScriptsInfo;\n restoredItem.replayCounter = fullResult.replayCounter;\n restoredItem.verticalMode = fullResult.verticalMode;\n }\n }\n return restoredItem;\n }).call(this)));\n }).call(this), 'Failed to load messages from IndexedDB', [], this.messagesCleanup);\n return result || [];\n }).call(this);\n }\n clearMessages() {\n return _async_to_generator(function*() {\n yield withErrorHandling(()=>_async_to_generator(function*() {\n yield Promise.all([\n this.dbManager.clear(MESSAGES_STORE),\n this.dbManager.clear(RESULTS_STORE)\n ]);\n }).call(this), 'Failed to clear messages from IndexedDB');\n }).call(this);\n }\n saveResult(id, result) {\n return _async_to_generator(function*() {\n yield withErrorHandling(()=>_async_to_generator(function*() {\n const compressedResult = this.compressResultForStorage(result);\n const data = {\n id,\n data: compressedResult,\n timestamp: Date.now(),\n size: JSON.stringify(compressedResult).length\n };\n yield this.dbManager.put(RESULTS_STORE, data);\n }).call(this), 'Failed to save result to IndexedDB', void 0, this.resultsCleanup);\n }).call(this);\n }\n loadResult(id) {\n return _async_to_generator(function*() {\n const result = yield withErrorHandling(()=>_async_to_generator(function*() {\n const data = yield this.dbManager.get(RESULTS_STORE, id);\n return (null == data ? void 0 : data.data) || null;\n }).call(this), 'Failed to load result from IndexedDB', null);\n return result || null;\n }).call(this);\n }\n compressResultForStorage(result) {\n var _result_result_dump, _result_result;\n if (!(null == (_result_result = result.result) ? void 0 : null == (_result_result_dump = _result_result.dump) ? void 0 : _result_result_dump.tasks)) return result;\n const compressedTasks = result.result.dump.tasks.map((task)=>{\n var _task_recorder;\n return _object_spread_props(_object_spread({}, task), {\n uiContext: task.uiContext ? _object_spread_props(_object_spread({}, task.uiContext), {\n screenshot: task.uiContext.screenshot\n }) : task.uiContext,\n recorder: null == (_task_recorder = task.recorder) ? void 0 : _task_recorder.map((record)=>_object_spread_props(_object_spread({}, record), {\n screenshot: record.screenshot\n }))\n });\n });\n return _object_spread_props(_object_spread({}, result), {\n result: _object_spread_props(_object_spread({}, result.result), {\n dump: _object_spread_props(_object_spread({}, result.result.dump), {\n tasks: compressedTasks\n })\n })\n });\n }\n compressScreenshotIfNeeded(screenshot) {\n if (!screenshot) return screenshot;\n if (screenshot.length > 1048576) {\n const sizeKB = Math.round(screenshot.length / 1024);\n return `[COMPRESSED: ${sizeKB}KB screenshot removed for storage]`;\n }\n return screenshot;\n }\n getStorageStats() {\n return _async_to_generator(function*() {\n const result = yield withErrorHandling(()=>_async_to_generator(function*() {\n const [messageCount, resultCount] = yield Promise.all([\n this.dbManager.count(MESSAGES_STORE),\n this.dbManager.count(RESULTS_STORE)\n ]);\n return {\n messageCount,\n resultCount\n };\n }).call(this), 'Failed to get storage statistics', {\n messageCount: 0,\n resultCount: 0\n });\n return result || {\n messageCount: 0,\n resultCount: 0\n };\n }).call(this);\n }\n cleanup() {\n return _async_to_generator(function*() {\n yield Promise.all([\n this.messagesCleanup(),\n this.resultsCleanup()\n ]);\n }).call(this);\n }\n constructor(namespace = 'playground'){\n _define_property(this, \"dbManager\", void 0);\n _define_property(this, \"namespace\", void 0);\n _define_property(this, \"messagesCleanup\", void 0);\n _define_property(this, \"resultsCleanup\", void 0);\n this.namespace = namespace;\n this.dbManager = new IndexedDBManager(`${DB_NAME}_${namespace}`, DB_VERSION, [\n {\n name: MESSAGES_STORE,\n keyPath: 'id'\n },\n {\n name: RESULTS_STORE,\n keyPath: 'id'\n }\n ]);\n this.messagesCleanup = createCleanupFunction(this.dbManager, MESSAGES_STORE, MAX_STORED_MESSAGES);\n this.resultsCleanup = createCleanupFunction(this.dbManager, RESULTS_STORE, MAX_STORED_RESULTS);\n }\n}\nclass MemoryStorageProvider {\n saveMessages(messages) {\n return _async_to_generator(function*() {\n this.messages = [\n ...messages\n ];\n }).call(this);\n }\n loadMessages() {\n return _async_to_generator(function*() {\n return [\n ...this.messages\n ];\n }).call(this);\n }\n clearMessages() {\n return _async_to_generator(function*() {\n this.messages = [];\n this.results.clear();\n }).call(this);\n }\n saveResult(id, result) {\n return _async_to_generator(function*() {\n this.results.set(id, result);\n }).call(this);\n }\n constructor(){\n _define_property(this, \"messages\", []);\n _define_property(this, \"results\", new Map());\n }\n}\nclass NoOpStorageProvider {\n saveMessages(_messages) {\n return _async_to_generator(function*() {})();\n }\n loadMessages() {\n return _async_to_generator(function*() {\n return [];\n })();\n }\n clearMessages() {\n return _async_to_generator(function*() {})();\n }\n saveResult(_id, _result) {\n return _async_to_generator(function*() {})();\n }\n}\nexport { IndexedDBStorageProvider, MemoryStorageProvider, NoOpStorageProvider };\n","import { IndexedDBStorageProvider, MemoryStorageProvider, NoOpStorageProvider } from \"./indexeddb-storage-provider.mjs\";\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(void 0);\n });\n };\n}\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction storage_provider_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else storage_provider_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nclass LocalStorageProvider {\n checkStorageSpace() {\n try {\n const testKey = 'storage-test';\n const testData = 'x'.repeat(102400);\n localStorage.setItem(testKey, testData);\n localStorage.removeItem(testKey);\n return true;\n } catch (e) {\n return false;\n }\n }\n saveMessages(messages) {\n return _async_to_generator(function*() {\n try {\n if (!this.checkStorageSpace()) {\n console.warn('Low storage space detected, clearing old data...');\n yield this.handleQuotaExceeded();\n }\n const messagesToSave = messages.slice(-this.maxStorageItems);\n const lightMessages = messagesToSave.map((msg)=>_object_spread_props(_object_spread({}, msg), {\n result: 'result' === msg.type ? void 0 : msg.result\n }));\n const messageData = JSON.stringify(lightMessages);\n localStorage.setItem(this.messagesKey, messageData);\n } catch (error) {\n if (error instanceof DOMException && 'QuotaExceededError' === error.name) {\n console.warn('LocalStorage quota exceeded, attempting to clear old data and retry...');\n yield this.handleQuotaExceeded();\n try {\n const recentMessages = messages.slice(-10);\n const lightRecentMessages = recentMessages.map((msg)=>_object_spread_props(_object_spread({}, msg), {\n result: 'result' === msg.type ? void 0 : msg.result\n }));\n const messageData = JSON.stringify(lightRecentMessages);\n localStorage.setItem(this.messagesKey, messageData);\n console.info('Successfully saved recent messages after clearing storage');\n } catch (retryError) {\n console.error('Failed to save even after clearing storage:', retryError);\n yield this.clearMessages();\n }\n } else console.error('Failed to save messages to localStorage:', error);\n }\n }).call(this);\n }\n loadMessages() {\n return _async_to_generator(function*() {\n try {\n const stored = localStorage.getItem(this.messagesKey);\n if (!stored) return [];\n const messages = JSON.parse(stored);\n const restoredMessages = yield Promise.all(messages.map((msg)=>_async_to_generator(function*() {\n if ('result' === msg.type && msg.id) {\n const resultKey = `${this.resultsKey}-${msg.id}`;\n const storedResult = localStorage.getItem(resultKey);\n if (storedResult) try {\n const resultItem = JSON.parse(storedResult);\n return _object_spread({}, msg, resultItem);\n } catch (e) {\n console.warn('Failed to parse stored result:', e);\n }\n }\n return msg;\n }).call(this)));\n return restoredMessages;\n } catch (error) {\n console.error('Failed to load messages from localStorage:', error);\n return [];\n }\n }).call(this);\n }\n clearMessages() {\n return _async_to_generator(function*() {\n try {\n localStorage.removeItem(this.messagesKey);\n const keys = Object.keys(localStorage);\n keys.forEach((key)=>{\n if (key.startsWith(this.resultsKey)) localStorage.removeItem(key);\n });\n } catch (error) {\n console.error('Failed to clear messages from localStorage:', error);\n }\n }).call(this);\n }\n saveResult(id, result) {\n return _async_to_generator(function*() {\n try {\n const resultKey = `${this.resultsKey}-${id}`;\n localStorage.setItem(resultKey, JSON.stringify(result));\n } catch (error) {\n if (error instanceof DOMException && 'QuotaExceededError' === error.name) {\n console.warn('LocalStorage quota exceeded when saving result, clearing old results...');\n yield this.handleQuotaExceeded();\n try {\n const resultKey = `${this.resultsKey}-${id}`;\n localStorage.setItem(resultKey, JSON.stringify(result));\n } catch (retryError) {\n console.error('Failed to save result even after clearing storage:', retryError);\n }\n } else console.error('Failed to save result to localStorage:', error);\n }\n }).call(this);\n }\n handleQuotaExceeded() {\n return _async_to_generator(function*() {\n try {\n const keys = Object.keys(localStorage);\n const resultKeys = keys.filter((key)=>key.startsWith(this.resultsKey));\n const keysToRemove = resultKeys.slice(0, Math.max(1, Math.floor(resultKeys.length / 2)));\n keysToRemove.forEach((key)=>{\n localStorage.removeItem(key);\n });\n console.info(`Cleared ${keysToRemove.length} old result entries to free up storage space`);\n const playgroundKeys = keys.filter((key)=>key.includes('playground') || key.includes('agent') || key.startsWith('midscene'));\n if (playgroundKeys.length > 10) {\n const additionalKeysToRemove = playgroundKeys.slice(0, Math.floor(playgroundKeys.length / 3));\n additionalKeysToRemove.forEach((key)=>{\n if (key !== this.messagesKey) localStorage.removeItem(key);\n });\n console.info(`Cleared ${additionalKeysToRemove.length} additional playground-related entries`);\n }\n } catch (error) {\n console.error('Failed to handle quota exceeded:', error);\n }\n }).call(this);\n }\n constructor(namespace = 'playground'){\n _define_property(this, \"messagesKey\", void 0);\n _define_property(this, \"resultsKey\", void 0);\n _define_property(this, \"maxStorageItems\", 50);\n this.messagesKey = `${namespace}-messages`;\n this.resultsKey = `${namespace}-results`;\n }\n}\nclass storage_provider_MemoryStorageProvider {\n saveMessages(messages) {\n return _async_to_generator(function*() {\n this.messages = [\n ...messages\n ];\n }).call(this);\n }\n loadMessages() {\n return _async_to_generator(function*() {\n return [\n ...this.messages\n ];\n }).call(this);\n }\n clearMessages() {\n return _async_to_generator(function*() {\n this.messages = [];\n this.results.clear();\n }).call(this);\n }\n saveResult(id, result) {\n return _async_to_generator(function*() {\n this.results.set(id, result);\n }).call(this);\n }\n constructor(){\n _define_property(this, \"messages\", []);\n _define_property(this, \"results\", new Map());\n }\n}\nclass storage_provider_NoOpStorageProvider {\n saveMessages(_messages) {\n return _async_to_generator(function*() {})();\n }\n loadMessages() {\n return _async_to_generator(function*() {\n return [];\n })();\n }\n clearMessages() {\n return _async_to_generator(function*() {})();\n }\n saveResult(_id, _result) {\n return _async_to_generator(function*() {})();\n }\n}\nvar storage_provider_StorageType = /*#__PURE__*/ function(StorageType) {\n StorageType[\"INDEXEDDB\"] = \"indexeddb\";\n StorageType[\"LOCALSTORAGE\"] = \"localStorage\";\n StorageType[\"MEMORY\"] = \"memory\";\n StorageType[\"NONE\"] = \"none\";\n return StorageType;\n}({});\nfunction createStorageProvider(type = \"indexeddb\", namespace = 'playground') {\n switch(type){\n case \"indexeddb\":\n if ('undefined' != typeof indexedDB) return new IndexedDBStorageProvider(namespace);\n console.warn('IndexedDB not available, falling back to localStorage');\n return createStorageProvider(\"localStorage\", namespace);\n case \"localStorage\":\n if ('undefined' != typeof localStorage) return new LocalStorageProvider(namespace);\n console.warn('localStorage not available, falling back to memory storage');\n return createStorageProvider(\"memory\", namespace);\n case \"memory\":\n return new storage_provider_MemoryStorageProvider();\n case \"none\":\n return new storage_provider_NoOpStorageProvider();\n default:\n throw new Error(`Unknown storage type: ${type}`);\n }\n}\nfunction detectBestStorageType() {\n if ('undefined' != typeof indexedDB) try {\n indexedDB.open('test', 1).onerror = ()=>{};\n return \"indexeddb\";\n } catch (e) {}\n if ('undefined' != typeof localStorage) try {\n localStorage.setItem('test', 'test');\n localStorage.removeItem('test');\n return \"localStorage\";\n } catch (e) {}\n return \"memory\";\n}\nexport { MemoryStorageProvider as IndexedDBMemoryStorageProvider, NoOpStorageProvider as IndexedDBNoOpStorageProvider, IndexedDBStorageProvider, LocalStorageProvider, storage_provider_MemoryStorageProvider as MemoryStorageProvider, storage_provider_NoOpStorageProvider as NoOpStorageProvider, storage_provider_StorageType as StorageType, createStorageProvider, detectBestStorageType };\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createStorageProvider, detectBestStorageType } from \"../component/universal-playground/providers/storage-provider.mjs\";\nimport { getWelcomeMessageTemplate } from \"../utils/constants.mjs\";\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(void 0);\n });\n };\n}\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction usePlaygroundState_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else usePlaygroundState_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nfunction usePlaygroundState(playgroundSDK, storage, contextProvider, targetName) {\n const [loading, setLoading] = useState(false);\n const [infoList, setInfoList] = useState([]);\n const [actionSpace, setActionSpace] = useState([]);\n const [actionSpaceLoading, setActionSpaceLoading] = useState(true);\n const [uiContextPreview, setUiContextPreview] = useState();\n const [showScrollToBottomButton, setShowScrollToBottomButton] = useState(false);\n const [autoScrollEnabled, setAutoScrollEnabled] = useState(true);\n const lastScrollTopRef = useRef(0);\n const [verticalMode, setVerticalMode] = useState(false);\n const [replayCounter, setReplayCounter] = useState(0);\n const infoListRef = useRef(null);\n const currentRunningIdRef = useRef(null);\n const interruptedFlagRef = useRef({});\n const initializedRef = useRef(false);\n useEffect(()=>{\n const migrateFromOldNamespace = ()=>_async_to_generator(function*() {\n const oldStorage = createStorageProvider(detectBestStorageType(), 'playground-default');\n try {\n if (null == oldStorage ? void 0 : oldStorage.loadMessages) {\n const oldMessages = yield oldStorage.loadMessages();\n if (oldMessages.length > 1) {\n console.log('Found data in old namespace, migrating...');\n if (null == storage ? void 0 : storage.saveMessages) yield storage.saveMessages(oldMessages);\n if (oldStorage.clearMessages) yield oldStorage.clearMessages();\n return oldMessages;\n }\n }\n } catch (error) {\n console.debug('No data found in old namespace:', error);\n }\n return [];\n })();\n const initializeMessages = ()=>_async_to_generator(function*() {\n const welcomeMessage = _object_spread_props(_object_spread({}, getWelcomeMessageTemplate(targetName)), {\n id: 'welcome',\n timestamp: new Date()\n });\n if (null == storage ? void 0 : storage.loadMessages) try {\n let storedMessages = yield storage.loadMessages();\n if (0 === storedMessages.length) storedMessages = yield migrateFromOldNamespace();\n const hasWelcomeMessage = storedMessages.some((msg)=>'welcome' === msg.id);\n hasWelcomeMessage ? setInfoList(storedMessages) : setInfoList([\n welcomeMessage,\n ...storedMessages\n ]);\n } catch (error) {\n console.error('Failed to load messages:', error);\n setInfoList([\n welcomeMessage\n ]);\n }\n else setInfoList([\n welcomeMessage\n ]);\n })();\n if (storage && !initializedRef.current) {\n initializedRef.current = true;\n initializeMessages();\n } else if (!storage && 0 === infoList.length) initializeMessages();\n }, [\n storage\n ]);\n useEffect(()=>{\n if ((null == storage ? void 0 : storage.saveMessages) && infoList.length > 1) storage.saveMessages(infoList).catch((error)=>{\n if (error instanceof DOMException && 'QuotaExceededError' === error.name) console.warn('Storage quota exceeded - some messages may not be saved persistently');\n else console.error('Failed to save messages:', error);\n });\n }, [\n infoList,\n storage\n ]);\n useEffect(()=>{\n if (!(null == contextProvider ? void 0 : contextProvider.getUIContext) || uiContextPreview) return;\n contextProvider.getUIContext().then((context)=>setUiContextPreview(context)).catch((error)=>{\n console.error('Failed to get UI context:', error);\n });\n }, [\n contextProvider,\n uiContextPreview\n ]);\n useEffect(()=>{\n const loadActionSpace = ()=>_async_to_generator(function*() {\n setActionSpaceLoading(true);\n try {\n var _contextProvider_getUIContext;\n if (!playgroundSDK) return void setActionSpace([]);\n const context = uiContextPreview || (yield null == contextProvider ? void 0 : null == (_contextProvider_getUIContext = contextProvider.getUIContext) ? void 0 : _contextProvider_getUIContext.call(contextProvider));\n const space = yield playgroundSDK.getActionSpace(context);\n setActionSpace(space || []);\n } catch (error) {\n console.error('Failed to load action space:', error);\n setActionSpace([]);\n } finally{\n setActionSpaceLoading(false);\n }\n })();\n loadActionSpace();\n }, [\n playgroundSDK,\n uiContextPreview,\n contextProvider\n ]);\n useEffect(()=>{\n const sizeThreshold = 750;\n setVerticalMode(window.innerWidth < sizeThreshold);\n const handleResize = ()=>{\n setVerticalMode(window.innerWidth < sizeThreshold);\n };\n window.addEventListener('resize', handleResize);\n return ()=>window.removeEventListener('resize', handleResize);\n }, []);\n const scrollToBottom = useCallback(()=>{\n setTimeout(()=>{\n if (infoListRef.current) infoListRef.current.scrollTop = infoListRef.current.scrollHeight;\n }, 100);\n }, []);\n const checkIfScrolledToBottom = useCallback(()=>{\n if (infoListRef.current) {\n const { scrollTop, scrollHeight, clientHeight } = infoListRef.current;\n const isAtBottom = scrollTop + clientHeight >= scrollHeight - 10;\n setShowScrollToBottomButton(!isAtBottom);\n const scrollingUp = scrollTop < lastScrollTopRef.current;\n lastScrollTopRef.current = scrollTop;\n if (isAtBottom) setAutoScrollEnabled(true);\n else if (scrollingUp) setAutoScrollEnabled(false);\n }\n }, []);\n const handleScrollToBottom = useCallback(()=>{\n if (infoListRef.current) {\n infoListRef.current.scrollTo({\n top: infoListRef.current.scrollHeight,\n behavior: 'smooth'\n });\n setShowScrollToBottomButton(false);\n setAutoScrollEnabled(true);\n }\n }, []);\n useEffect(()=>{\n if (infoList.length > 0 && autoScrollEnabled) scrollToBottom();\n }, [\n infoList,\n scrollToBottom,\n autoScrollEnabled\n ]);\n useEffect(()=>{\n const container = infoListRef.current;\n if (container) {\n container.addEventListener('scroll', checkIfScrolledToBottom);\n checkIfScrolledToBottom();\n return ()=>{\n container.removeEventListener('scroll', checkIfScrolledToBottom);\n };\n }\n }, [\n checkIfScrolledToBottom\n ]);\n const clearInfoList = useCallback(()=>_async_to_generator(function*() {\n const welcomeMessage = _object_spread_props(_object_spread({}, getWelcomeMessageTemplate(targetName)), {\n id: 'welcome',\n timestamp: new Date()\n });\n setInfoList([\n welcomeMessage\n ]);\n if (null == storage ? void 0 : storage.clearMessages) try {\n yield storage.clearMessages();\n } catch (error) {\n console.error('Failed to clear stored messages:', error);\n }\n })(), [\n storage,\n targetName\n ]);\n const refreshContext = useCallback(()=>_async_to_generator(function*() {\n if (null == contextProvider ? void 0 : contextProvider.refreshContext) try {\n const newContext = yield contextProvider.refreshContext();\n setUiContextPreview(newContext);\n } catch (error) {\n console.error('Failed to refresh context:', error);\n }\n })(), [\n contextProvider\n ]);\n return {\n loading,\n setLoading,\n infoList,\n setInfoList,\n actionSpace,\n actionSpaceLoading,\n uiContextPreview,\n setUiContextPreview,\n showScrollToBottomButton,\n verticalMode,\n replayCounter,\n setReplayCounter,\n infoListRef,\n currentRunningIdRef,\n interruptedFlagRef,\n clearInfoList,\n refreshContext,\n handleScrollToBottom,\n scrollToBottom\n };\n}\nexport { usePlaygroundState };\n","\"use client\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nimport react from \"react\";\nimport { normalizeBlackboardHighlights } from \"./highlights.mjs\";\nimport \"./index.css\";\nconst Blackboard = (props)=>{\n var _props_uiContext;\n const highlightElements = props.highlightElements || [];\n const highlightRect = props.highlightRect;\n if (!(null == (_props_uiContext = props.uiContext) ? void 0 : _props_uiContext.shotSize)) return /*#__PURE__*/ jsx(\"div\", {\n className: \"blackboard\",\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"blackboard-main-content\",\n style: {\n padding: '20px'\n },\n children: \"No UI context available\"\n })\n });\n const context = props.uiContext;\n const { shotSize, screenshot } = context;\n const screenWidth = shotSize.width;\n const screenHeight = shotSize.height;\n const highlightOverlays = react.useMemo(()=>normalizeBlackboardHighlights(highlightElements), [\n highlightElements\n ]);\n const screenshotBase64 = react.useMemo(()=>{\n if (!screenshot) return '';\n if ('object' == typeof screenshot && 'base64' in screenshot) return screenshot.base64;\n if ('string' == typeof screenshot) return screenshot;\n return '';\n }, [\n screenshot\n ]);\n const highlightElementRects = highlightOverlays.map((highlight)=>highlight.rect);\n let bottomTipA = null;\n if (1 === highlightElementRects.length) bottomTipA = /*#__PURE__*/ jsx(\"div\", {\n className: \"bottom-tip\",\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"bottom-tip-item\",\n children: [\n \"Element: \",\n JSON.stringify(highlightElementRects[0])\n ]\n })\n });\n else if (highlightElementRects.length > 1) bottomTipA = /*#__PURE__*/ jsx(\"div\", {\n className: \"bottom-tip\",\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"bottom-tip-item\",\n children: [\n \"Element: \",\n JSON.stringify(highlightElementRects)\n ]\n })\n });\n return /*#__PURE__*/ jsxs(\"div\", {\n className: \"blackboard\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"blackboard-main-content\",\n style: {\n width: 'fit-content',\n maxWidth: '100%',\n position: 'relative'\n },\n children: [\n screenshotBase64 && /*#__PURE__*/ jsx(\"img\", {\n src: screenshotBase64,\n alt: \"screenshot\",\n className: \"blackboard-screenshot\",\n draggable: false\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"blackboard-overlay\",\n style: {\n aspectRatio: `${screenWidth}/${screenHeight}`,\n '--ui-scale': Math.max(1, Math.sqrt(screenWidth / 1920))\n },\n children: [\n highlightRect && /*#__PURE__*/ jsx(\"div\", {\n className: \"blackboard-rect blackboard-rect-search\",\n style: {\n left: `${highlightRect.left / screenWidth * 100}%`,\n top: `${highlightRect.top / screenHeight * 100}%`,\n width: `${highlightRect.width / screenWidth * 100}%`,\n height: `${highlightRect.height / screenHeight * 100}%`\n },\n children: /*#__PURE__*/ jsx(\"span\", {\n className: \"blackboard-rect-label\",\n children: \"Search Area\"\n })\n }),\n highlightOverlays.map((el)=>/*#__PURE__*/ jsx(\"div\", {\n className: \"blackboard-rect blackboard-rect-highlight\",\n style: {\n left: `${el.rect.left / screenWidth * 100}%`,\n top: `${el.rect.top / screenHeight * 100}%`,\n width: `${el.rect.width / screenWidth * 100}%`,\n height: `${el.rect.height / screenHeight * 100}%`\n }\n }, `${el.key}-rect`))\n ]\n })\n ]\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"bottom-tip\",\n style: {\n display: props.hideController ? 'none' : 'block'\n },\n children: bottomTipA\n })\n ]\n });\n};\nconst blackboard = Blackboard;\nexport { Blackboard, blackboard as default };\n","function formatCenterKey(center) {\n return `${center[0]}:${center[1]}`;\n}\nfunction formatRectKey(rect) {\n return `${rect.left}:${rect.top}:${rect.width}:${rect.height}`;\n}\nfunction getElementLabel(element) {\n if ('content' in element && element.content) return element.content;\n if (\"description\" in element && element.description) return element.description;\n}\nfunction normalizeBlackboardHighlights(elements) {\n if (!(null == elements ? void 0 : elements.length)) return [];\n const deduped = new Map();\n elements.forEach((element, index)=>{\n if (!(null == element ? void 0 : element.rect) || !(null == element ? void 0 : element.center)) return;\n const label = getElementLabel(element);\n const dedupeKey = [\n 'id' in element ? element.id : '',\n label || '',\n formatCenterKey(element.center),\n formatRectKey(element.rect)\n ].join('|');\n if (!deduped.has(dedupeKey)) deduped.set(dedupeKey, {\n key: 'id' in element && element.id || `${dedupeKey || 'highlight'}-${index}`,\n label,\n center: element.center,\n rect: element.rect\n });\n });\n return Array.from(deduped.values());\n}\nfunction roundRect(rect) {\n return {\n left: Math.round(rect.left),\n top: Math.round(rect.top),\n width: Math.round(rect.width),\n height: Math.round(rect.height)\n };\n}\nfunction formatBlackboardHighlightSummary(highlight) {\n const center = `[${Math.round(highlight.center[0])}, ${Math.round(highlight.center[1])}]`;\n const rect = roundRect(highlight.rect);\n const rectText = `rect=${JSON.stringify(rect)}`;\n if (highlight.label) return `${highlight.label} center=${center}, ${rectText}`;\n return `center=${center}, ${rectText}`;\n}\nexport { formatBlackboardHighlightSummary, normalizeBlackboardHighlights };\n","import { jsx } from \"react/jsx-runtime\";\nimport \"./index.css\";\nconst ShinyText = ({ text, disabled = false, speed = 5, className = '', colorTheme = 'blue' })=>{\n const style = {\n '--animation-duration': `${speed}s`\n };\n const themeClass = `theme-${colorTheme}`;\n return /*#__PURE__*/ jsx(\"div\", {\n className: `shiny-text ${themeClass} ${disabled ? 'disabled' : ''} ${className}`,\n style: style,\n children: text\n });\n};\nconst shiny_text = ShinyText;\nexport { shiny_text as default };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { ArrowRightOutlined, CheckOutlined, ClockCircleOutlined, CloseOutlined, LogoutOutlined, MinusOutlined, WarningOutlined } from \"@ant-design/icons\";\nimport { Alert } from \"antd\";\nimport shiny_text from \"../shiny-text/index.mjs\";\nfunction timeCostStrElement(timeCost) {\n let str;\n str = 'number' != typeof timeCost ? '-' : `${(timeCost / 1000).toFixed(2)}s`;\n return /*#__PURE__*/ jsx(\"span\", {\n style: {\n fontVariantNumeric: 'tabular-nums',\n fontFeatureSettings: 'tnum'\n },\n children: str\n });\n}\nconst iconForStatus = (status)=>{\n switch(status){\n case 'finished':\n case 'passed':\n case 'success':\n case 'connected':\n return /*#__PURE__*/ jsx(\"span\", {\n style: {\n color: '#00AD4B'\n },\n children: /*#__PURE__*/ jsx(CheckOutlined, {})\n });\n case 'finishedWithWarning':\n return /*#__PURE__*/ jsx(\"span\", {\n style: {\n color: '#f7bb05'\n },\n children: /*#__PURE__*/ jsx(WarningOutlined, {})\n });\n case 'failed':\n case 'closed':\n case 'timedOut':\n case 'interrupted':\n return /*#__PURE__*/ jsx(\"span\", {\n style: {\n color: '#FF0A0A'\n },\n children: /*#__PURE__*/ jsx(CloseOutlined, {})\n });\n case 'pending':\n return /*#__PURE__*/ jsx(ClockCircleOutlined, {});\n case 'cancelled':\n case 'skipped':\n return /*#__PURE__*/ jsx(LogoutOutlined, {});\n case 'running':\n return /*#__PURE__*/ jsx(ArrowRightOutlined, {});\n default:\n return /*#__PURE__*/ jsx(MinusOutlined, {});\n }\n};\nconst errorMessageServerNotReady = /*#__PURE__*/ jsxs(\"span\", {\n children: [\n \"Don't worry, just one more step to launch the playground server.\",\n /*#__PURE__*/ jsx(\"br\", {}),\n \"Please run one of the commands under the midscene project directory:\",\n /*#__PURE__*/ jsx(\"br\", {}),\n \"a. \",\n /*#__PURE__*/ jsx(\"strong\", {\n children: \"npx midscene-playground\"\n }),\n /*#__PURE__*/ jsx(\"br\", {}),\n \"b. \",\n /*#__PURE__*/ jsx(\"strong\", {\n children: \"npx --yes @midscene/web\"\n })\n ]\n});\nconst serverLaunchTip = (notReadyMessage = errorMessageServerNotReady)=>/*#__PURE__*/ jsx(\"div\", {\n className: \"server-tip\",\n children: /*#__PURE__*/ jsx(Alert, {\n message: \"Playground Server Not Ready\",\n description: notReadyMessage,\n type: \"warning\"\n })\n });\nconst emptyResultTip = /*#__PURE__*/ jsx(\"div\", {\n className: \"result-empty-tip\",\n style: {\n textAlign: 'center'\n },\n children: /*#__PURE__*/ jsx(shiny_text, {\n disabled: true,\n text: \"The result will be shown here\"\n })\n});\nexport { emptyResultTip, errorMessageServerNotReady, iconForStatus, serverLaunchTip, timeCostStrElement };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { Button } from \"antd\";\nimport blackboard from \"../blackboard/index.mjs\";\nimport { iconForStatus } from \"../misc/index.mjs\";\nimport playground_demo_ui_context from \"../playground/playground-demo-ui-context.json\";\nconst ContextPreview = ({ uiContextPreview, setUiContextPreview, showContextPreview })=>{\n if (!showContextPreview) return null;\n return /*#__PURE__*/ jsxs(\"div\", {\n className: \"form-part context-panel\",\n children: [\n /*#__PURE__*/ jsx(\"h3\", {\n children: \"UI Context\"\n }),\n uiContextPreview ? /*#__PURE__*/ jsx(blackboard, {\n uiContext: uiContextPreview,\n hideController: true\n }) : /*#__PURE__*/ jsxs(\"div\", {\n children: [\n iconForStatus('failed'),\n \" No UI context\",\n /*#__PURE__*/ jsx(Button, {\n type: \"link\",\n onClick: (e)=>{\n e.preventDefault();\n setUiContextPreview(playground_demo_ui_context);\n },\n children: \"Load Demo\"\n }),\n /*#__PURE__*/ jsx(\"div\", {\n children: \"To load the UI context, you can either use the demo data above, or click the 'Send to Playground' in the report page.\"\n })\n ]\n })\n ]\n });\n};\nexport { ContextPreview };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { ExclamationCircleFilled } from \"@ant-design/icons\";\nimport { useEnvConfig } from \"../../store/store.mjs\";\nimport { EnvConfig } from \"../env-config/index.mjs\";\nimport \"./index.css\";\nconst EnvConfigReminder = ({ className = '' })=>{\n const { config } = useEnvConfig();\n const configAlreadySet = Object.keys(config || {}).length >= 1;\n if (configAlreadySet) return null;\n return /*#__PURE__*/ jsxs(\"div\", {\n className: `env-config-reminder ${className}`,\n children: [\n /*#__PURE__*/ jsx(ExclamationCircleFilled, {\n className: \"reminder-icon\"\n }),\n /*#__PURE__*/ jsx(\"span\", {\n className: \"reminder-text\",\n children: \"Please set up your environment variables before using.\"\n }),\n /*#__PURE__*/ jsx(EnvConfig, {\n mode: \"text\",\n showTooltipWhenEmpty: false\n })\n ]\n });\n};\nexport { EnvConfigReminder };\n","import { jsx } from \"react/jsx-runtime\";\nimport \"react\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction global_perspective_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else global_perspective_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nconst SvgGlobalPerspective = (props)=>/*#__PURE__*/ jsx(\"svg\", _object_spread_props(_object_spread({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 16,\n height: 16,\n fill: \"none\",\n viewBox: \"0 0 16 16\"\n }, props), {\n children: /*#__PURE__*/ jsx(\"path\", {\n fill: \"currentColor\",\n d: \"M1.333 13v-2.5a.667.667 0 0 1 1.334 0V13c0 .184.149.333.333.333h2.5a.667.667 0 0 1 0 1.334H3c-.92 0-1.667-.746-1.667-1.667m12 0v-2.5a.667.667 0 0 1 1.334 0V13c0 .92-.746 1.667-1.667 1.667h-2.5a.667.667 0 0 1 0-1.334H13a.333.333 0 0 0 .333-.333m-12-7.5V3c0-.92.747-1.667 1.667-1.667h2.5a.667.667 0 0 1 0 1.334H3A.333.333 0 0 0 2.667 3v2.5a.667.667 0 0 1-1.334 0m12 0V3A.333.333 0 0 0 13 2.667h-2.5a.667.667 0 0 1 0-1.334H13c.92 0 1.667.747 1.667 1.667v2.5a.667.667 0 0 1-1.334 0M5.667 10.333h4.666V5.667H5.667zm6 .167c0 .644-.523 1.167-1.167 1.167h-5A1.167 1.167 0 0 1 4.333 10.5v-5c0-.644.523-1.167 1.167-1.167h5c.644 0 1.167.523 1.167 1.167z\"\n })\n }));\nconst global_perspective = SvgGlobalPerspective;\nexport { global_perspective as default };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport \"react\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction player_setting_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else player_setting_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nconst SvgPlayerSetting = (props)=>/*#__PURE__*/ jsxs(\"svg\", _object_spread_props(_object_spread({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 16,\n height: 16,\n fill: \"none\",\n viewBox: \"0 0 16 16\"\n }, props), {\n children: [\n /*#__PURE__*/ jsx(\"path\", {\n stroke: \"currentColor\",\n strokeLinejoin: \"round\",\n strokeWidth: 1.333,\n d: \"M11.333 13.667 14.667 8l-3.334-5.667H4.667L1.333 8l3.334 5.667z\"\n }),\n /*#__PURE__*/ jsx(\"path\", {\n stroke: \"currentColor\",\n strokeLinejoin: \"round\",\n strokeWidth: 1.333,\n d: \"M8 9.667a1.667 1.667 0 1 0 0-3.334 1.667 1.667 0 0 0 0 3.334Z\"\n })\n ]\n }));\nconst player_setting = SvgPlayerSetting;\nexport { player_setting as default };\n","import { mousePointer } from \"../../../utils/index.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction derive_frame_state_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else derive_frame_state_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nfunction createDefaultCameraState(imageWidth, imageHeight) {\n return {\n left: 0,\n top: 0,\n width: imageWidth,\n pointerLeft: Math.round(imageWidth / 2),\n pointerTop: Math.round(imageHeight / 2)\n };\n}\nfunction updateImage(acc, sf, baseW, baseH) {\n if (!sf.img) return;\n if (acc.img && sf.img !== acc.img) {\n acc.prevImg = acc.img;\n acc.imageChanged = true;\n }\n const nextImgW = sf.imageWidth || baseW;\n const nextImgH = sf.imageHeight || baseH;\n const dimensionsChanged = acc.imgW !== nextImgW || acc.imgH !== nextImgH;\n acc.img = sf.img;\n acc.imgW = nextImgW;\n acc.imgH = nextImgH;\n if (dimensionsChanged) {\n const resetCamera = createDefaultCameraState(nextImgW, nextImgH);\n acc.camera = _object_spread({}, resetCamera);\n acc.prevCamera = _object_spread({}, resetCamera);\n acc.pointerMoved = false;\n }\n}\nfunction checkPointerMoved(prev, cur) {\n return Math.abs(prev.pointerLeft - cur.pointerLeft) > 1 || Math.abs(prev.pointerTop - cur.pointerTop) > 1;\n}\nfunction handleImg(acc, sf, frame, baseW, baseH) {\n updateImage(acc, sf, baseW, baseH);\n const sfEnd = sf.startFrame + sf.durationInFrames;\n if (sf.cameraTarget) {\n acc.prevCamera = _object_spread({}, acc.camera);\n acc.camera = _object_spread({}, sf.cameraTarget);\n acc.pointerMoved = checkPointerMoved(acc.prevCamera, acc.camera);\n } else if (frame >= sfEnd) {\n acc.pointerMoved = false;\n acc.imageChanged = false;\n }\n acc.spinning = false;\n}\nfunction handleInsight(acc, sf, frame, baseW, baseH) {\n updateImage(acc, sf, baseW, baseH);\n const alreadyAdded = acc.insights.some((ai)=>ai.highlightElement === sf.highlightElement && ai.searchArea === sf.searchArea);\n if (!alreadyAdded) acc.insights.push({\n highlightElement: sf.highlightElement,\n searchArea: sf.searchArea,\n alpha: 1\n });\n if (sf.cameraTarget && void 0 !== sf.insightPhaseFrames) {\n const cameraStartFrame = sf.startFrame + sf.insightPhaseFrames;\n if (frame >= cameraStartFrame) {\n acc.prevCamera = _object_spread({}, acc.camera);\n acc.camera = _object_spread({}, sf.cameraTarget);\n const cameraFrameIn = frame - cameraStartFrame;\n const cameraDur = sf.cameraPhaseFrames || 1;\n acc.rawProgress = Math.min(cameraFrameIn / cameraDur, 1);\n acc.pointerMoved = checkPointerMoved(acc.prevCamera, acc.camera);\n }\n }\n acc.spinning = false;\n}\nfunction handleClearInsight(acc, sf, frame) {\n const sfEnd = sf.startFrame + sf.durationInFrames;\n const alpha = 1 - acc.rawProgress;\n acc.insights = acc.insights.map((ai)=>_object_spread_props(_object_spread({}, ai), {\n alpha\n }));\n if (frame >= sfEnd) acc.insights = [];\n acc.spinning = false;\n}\nfunction handleSpinningPointer(acc, fps) {\n acc.spinning = true;\n acc.spinningElapsedMs = acc.frameInScript / fps * 1000;\n}\nfunction deriveFrameState(scriptFrames, frame, baseW, baseH, fps) {\n const defaultCamera = createDefaultCameraState(baseW, baseH);\n const acc = {\n img: '',\n imgW: baseW,\n imgH: baseH,\n camera: _object_spread({}, defaultCamera),\n prevCamera: _object_spread({}, defaultCamera),\n prevImg: null,\n insights: [],\n spinning: false,\n spinningElapsedMs: 0,\n pointerImg: mousePointer,\n title: '',\n subTitle: '',\n taskId: void 0,\n frameInScript: 0,\n scriptIndex: 0,\n imageChanged: false,\n pointerMoved: false,\n rawProgress: 0\n };\n for(let i = 0; i < scriptFrames.length; i++){\n const sf = scriptFrames[i];\n const sfEnd = sf.startFrame + sf.durationInFrames;\n if (0 === sf.durationInFrames) {\n if (sf.startFrame <= frame) {\n if ('pointer' === sf.type && sf.pointerImg) acc.pointerImg = sf.pointerImg;\n acc.title = sf.title || acc.title;\n acc.subTitle = sf.subTitle || acc.subTitle;\n var _sf_taskId;\n acc.taskId = null != (_sf_taskId = sf.taskId) ? _sf_taskId : acc.taskId;\n acc.scriptIndex = i;\n }\n continue;\n }\n if (frame < sf.startFrame) break;\n acc.title = sf.title || acc.title;\n acc.subTitle = sf.subTitle || acc.subTitle;\n var _sf_taskId1;\n acc.taskId = null != (_sf_taskId1 = sf.taskId) ? _sf_taskId1 : acc.taskId;\n acc.scriptIndex = i;\n acc.frameInScript = frame - sf.startFrame;\n acc.rawProgress = Math.min(acc.frameInScript / sf.durationInFrames, 1);\n switch(sf.type){\n case 'img':\n handleImg(acc, sf, frame, baseW, baseH);\n break;\n case 'insight':\n handleInsight(acc, sf, frame, baseW, baseH);\n break;\n case 'clear-insight':\n handleClearInsight(acc, sf, frame);\n break;\n case 'spinning-pointer':\n handleSpinningPointer(acc, fps);\n break;\n case 'sleep':\n acc.spinning = false;\n break;\n }\n if (frame >= sfEnd) {\n if ('clear-insight' !== sf.type) acc.imageChanged = false;\n acc.pointerMoved = false;\n acc.rawProgress = 1;\n if (sf.cameraTarget) acc.prevCamera = _object_spread({}, acc.camera);\n }\n }\n if (!acc.img) {\n const firstImgScript = scriptFrames.find((sf)=>'img' === sf.type && sf.img);\n if (firstImgScript) {\n acc.img = firstImgScript.img;\n acc.imgW = firstImgScript.imageWidth || baseW;\n acc.imgH = firstImgScript.imageHeight || baseH;\n }\n }\n return {\n img: acc.img,\n imageWidth: acc.imgW,\n imageHeight: acc.imgH,\n prevImg: acc.imageChanged ? acc.prevImg : null,\n camera: acc.camera,\n prevCamera: acc.prevCamera,\n insights: acc.insights,\n spinning: acc.spinning,\n spinningElapsedMs: acc.spinningElapsedMs,\n currentPointerImg: acc.pointerImg,\n title: acc.title,\n subTitle: acc.subTitle,\n taskId: acc.taskId,\n frameInScript: acc.frameInScript,\n scriptIndex: acc.scriptIndex,\n imageChanged: acc.imageChanged,\n pointerMoved: acc.pointerMoved,\n rawProgress: acc.rawProgress\n };\n}\nexport { deriveFrameState };\n","function getPlaybackViewport(containerWidth, containerHeight, imageWidth, imageHeight) {\n const scale = Math.min(containerWidth / imageWidth, containerHeight / imageHeight);\n const contentWidth = imageWidth * scale;\n const contentHeight = imageHeight * scale;\n return {\n offsetX: (containerWidth - contentWidth) / 2,\n offsetY: (containerHeight - contentHeight) / 2,\n contentWidth,\n contentHeight\n };\n}\nexport { getPlaybackViewport };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { useMemo } from \"react\";\nimport { mouseLoading } from \"../../../utils/index.mjs\";\nimport { deriveFrameState } from \"./derive-frame-state.mjs\";\nimport { getPlaybackViewport } from \"./playback-layout.mjs\";\nconst POINTER_PHASE = 0.375;\nconst CROSSFADE_FRAMES = 10;\nconst StepsTimeline = ({ frameMap, autoZoom, frame, width: compWidth, height: compHeight, fps })=>{\n const { scriptFrames, imageWidth: baseImgW, imageHeight: baseImgH } = frameMap;\n const state = useMemo(()=>deriveFrameState(scriptFrames, frame, baseImgW, baseImgH, fps), [\n scriptFrames,\n frame,\n baseImgW,\n baseImgH,\n fps\n ]);\n if (!state.img) return null;\n const { img, imageWidth: imgW, imageHeight: imgH, prevImg, camera, prevCamera, insights, spinning: spinningPointer, spinningElapsedMs, currentPointerImg, title, subTitle, frameInScript, imageChanged, pointerMoved, rawProgress } = state;\n const pT = pointerMoved ? Math.min(rawProgress / POINTER_PHASE, 1) : rawProgress;\n const cT = pointerMoved ? rawProgress <= POINTER_PHASE ? 0 : Math.min((rawProgress - POINTER_PHASE) / (1 - POINTER_PHASE), 1) : rawProgress;\n const pointerLeft = prevCamera.pointerLeft + (camera.pointerLeft - prevCamera.pointerLeft) * pT;\n const pointerTop = prevCamera.pointerTop + (camera.pointerTop - prevCamera.pointerTop) * pT;\n const cameraLeft = autoZoom ? prevCamera.left + (camera.left - prevCamera.left) * cT : 0;\n const cameraTop = autoZoom ? prevCamera.top + (camera.top - prevCamera.top) * cT : 0;\n const cameraWidth = autoZoom ? prevCamera.width + (camera.width - prevCamera.width) * cT : imgW;\n const { offsetX, offsetY, contentWidth, contentHeight } = getPlaybackViewport(compWidth, compHeight, imgW, imgH);\n const zoom = imgW / cameraWidth;\n const tx = contentWidth / imgW * -cameraLeft;\n const ty = contentHeight / imgH * -cameraTop;\n const transformStyle = `scale(${zoom}) translate(${tx}px, ${ty}px)`;\n const camH = imgH / imgW * cameraWidth;\n const ptrX = (pointerLeft - cameraLeft) / cameraWidth * contentWidth;\n const ptrY = (pointerTop - cameraTop) / camH * contentHeight;\n const showCursor = camera.pointerLeft !== Math.round(imgW / 2) || camera.pointerTop !== Math.round(imgH / 2) || prevCamera.pointerLeft !== Math.round(imgW / 2) || prevCamera.pointerTop !== Math.round(imgH / 2);\n const resScale = Math.max(1, Math.sqrt(imgW / 1920));\n const crossfadeAlpha = imageChanged ? Math.min(frameInScript / CROSSFADE_FRAMES, 1) : 1;\n const spinRotation = spinningPointer ? (Math.sin(spinningElapsedMs / 500 - Math.PI / 2) + 1) / 2 * Math.PI * 2 : 0;\n const renderInsightOverlays = ()=>{\n if (0 === insights.length) return null;\n return insights.map((insight, idx)=>{\n const overlays = [];\n if (insight.highlightElement) {\n const rect = insight.highlightElement.rect;\n overlays.push(/*#__PURE__*/ jsx(\"div\", {\n style: {\n position: 'absolute',\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n background: 'rgba(253, 89, 7, 0.4)',\n border: `${2 * resScale}px solid #fd5907`,\n boxShadow: `${2 * resScale}px ${2 * resScale}px ${+resScale}px rgba(51, 51, 51, 0.3)`,\n opacity: insight.alpha,\n pointerEvents: 'none'\n }\n }, `highlight-${idx}`));\n }\n if (insight.searchArea) {\n const rect = insight.searchArea;\n overlays.push(/*#__PURE__*/ jsx(\"div\", {\n style: {\n position: 'absolute',\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n background: 'rgba(2, 131, 145, 0.4)',\n border: `${2 * resScale}px solid #028391`,\n boxShadow: `${2 * resScale}px ${2 * resScale}px ${+resScale}px rgba(51, 51, 51, 0.3)`,\n opacity: insight.alpha,\n pointerEvents: 'none'\n }\n }, `search-${idx}`));\n }\n return overlays;\n });\n };\n const renderContentArea = (w, h)=>/*#__PURE__*/ jsxs(\"div\", {\n style: {\n width: w,\n height: h,\n position: 'relative',\n overflow: 'hidden'\n },\n children: [\n imageChanged && prevImg && crossfadeAlpha < 1 && /*#__PURE__*/ jsx(\"div\", {\n style: {\n position: 'absolute',\n width: w,\n height: h,\n overflow: 'hidden',\n opacity: 1 - crossfadeAlpha\n },\n children: /*#__PURE__*/ jsx(\"img\", {\n alt: \"\",\n src: prevImg,\n style: {\n width: w,\n height: h,\n transformOrigin: '0 0',\n transform: transformStyle\n }\n })\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n style: {\n position: 'absolute',\n width: w,\n height: h,\n overflow: 'hidden',\n opacity: imageChanged ? crossfadeAlpha : 1\n },\n children: [\n /*#__PURE__*/ jsx(\"img\", {\n alt: \"\",\n src: img,\n style: {\n width: w,\n height: h,\n transformOrigin: '0 0',\n transform: transformStyle\n }\n }),\n /*#__PURE__*/ jsx(\"div\", {\n style: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: w,\n height: h,\n transformOrigin: '0 0',\n transform: transformStyle,\n pointerEvents: 'none'\n },\n children: renderInsightOverlays()\n })\n ]\n }),\n spinningPointer && /*#__PURE__*/ jsx(\"img\", {\n alt: \"\",\n src: mouseLoading,\n style: {\n position: 'absolute',\n left: ptrX - 22 * resScale,\n top: ptrY - 28 * resScale,\n width: 44 * resScale,\n height: 56 * resScale,\n transform: `rotate(${spinRotation}rad)`,\n transformOrigin: 'center center',\n filter: 'drop-shadow(0 1px 2px rgba(0,0,0,0.3))'\n }\n }),\n showCursor && !spinningPointer && /*#__PURE__*/ jsx(\"img\", {\n alt: \"\",\n src: currentPointerImg,\n style: {\n position: 'absolute',\n left: ptrX - 6 * resScale,\n top: ptrY - 4 * resScale,\n width: 44 * resScale,\n height: 56 * resScale,\n filter: 'drop-shadow(0 1px 2px rgba(0,0,0,0.3))'\n }\n })\n ]\n });\n return /*#__PURE__*/ jsx(\"div\", {\n style: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: '#000'\n },\n children: /*#__PURE__*/ jsx(\"div\", {\n style: {\n position: 'absolute',\n left: offsetX,\n top: offsetY,\n width: contentWidth,\n height: contentHeight,\n overflow: 'hidden'\n },\n children: renderContentArea(contentWidth, contentHeight)\n })\n });\n};\nexport { StepsTimeline };\n","import { mouseLoading, mousePointer } from \"../../../utils/index.mjs\";\nimport { deriveFrameState } from \"./derive-frame-state.mjs\";\nimport { getPlaybackViewport } from \"./playback-layout.mjs\";\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(void 0);\n });\n };\n}\nconst W = 960;\nconst H = 540;\nconst POINTER_PHASE = 0.375;\nconst CROSSFADE_FRAMES = 10;\nfunction clamp(v, lo, hi) {\n return Math.min(Math.max(v, lo), hi);\n}\nfunction lerp(a, b, t) {\n return a + (b - a) * t;\n}\nfunction loadImage(src) {\n return new Promise((resolve, reject)=>{\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = ()=>resolve(img);\n img.onerror = reject;\n img.src = src;\n });\n}\nfunction drawInsightOverlays(ctx, insights, cameraTransform, bx, contentY) {\n for (const insight of insights)if (!(insight.alpha <= 0)) {\n ctx.save();\n ctx.globalAlpha *= insight.alpha;\n if (insight.highlightElement) {\n const r = insight.highlightElement.rect;\n const rx = bx + (r.left * cameraTransform.zoom + cameraTransform.tx * cameraTransform.zoom);\n const ry = contentY + (r.top * cameraTransform.zoom + cameraTransform.ty * cameraTransform.zoom);\n const rw = r.width * cameraTransform.zoom;\n const rh = r.height * cameraTransform.zoom;\n ctx.fillStyle = 'rgba(253, 89, 7, 0.4)';\n ctx.fillRect(rx, ry, rw, rh);\n ctx.strokeStyle = '#fd5907';\n ctx.lineWidth = 1;\n ctx.strokeRect(rx, ry, rw, rh);\n ctx.shadowColor = 'rgba(51, 51, 51, 0.4)';\n ctx.shadowBlur = 2;\n ctx.shadowOffsetX = 4;\n ctx.shadowOffsetY = 4;\n ctx.strokeRect(rx, ry, rw, rh);\n ctx.shadowBlur = 0;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n }\n if (insight.searchArea) {\n const r = insight.searchArea;\n const rx = bx + (r.left * cameraTransform.zoom + cameraTransform.tx * cameraTransform.zoom);\n const ry = contentY + (r.top * cameraTransform.zoom + cameraTransform.ty * cameraTransform.zoom);\n const rw = r.width * cameraTransform.zoom;\n const rh = r.height * cameraTransform.zoom;\n ctx.fillStyle = 'rgba(2, 131, 145, 0.4)';\n ctx.fillRect(rx, ry, rw, rh);\n ctx.strokeStyle = '#028391';\n ctx.lineWidth = 1;\n ctx.strokeRect(rx, ry, rw, rh);\n }\n ctx.restore();\n }\n}\nfunction drawSpinningPointer(ctx, img, x, y, elapsedMs) {\n const progress = (Math.sin(elapsedMs / 500 - Math.PI / 2) + 1) / 2;\n const rotation = progress * Math.PI * 2;\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rotation);\n ctx.drawImage(img, -11, -14, 22, 28);\n ctx.restore();\n}\nfunction drawSteps(ctx, stepsFrame, frameMap, imgCache, cursorImg, spinnerImg) {\n const { scriptFrames, imageWidth: baseW, imageHeight: baseH, fps } = frameMap;\n const st = deriveFrameState(scriptFrames, stepsFrame, baseW, baseH, fps);\n if (!st.img) return;\n const { img, prevImg, imageWidth: imgW, imageHeight: imgH, camera, prevCamera, pointerMoved, imageChanged, rawProgress, frameInScript: fInScript, spinning, spinningElapsedMs, insights } = st;\n const pT = pointerMoved ? Math.min(rawProgress / POINTER_PHASE, 1) : rawProgress;\n const cT = pointerMoved ? rawProgress <= POINTER_PHASE ? 0 : Math.min((rawProgress - POINTER_PHASE) / (1 - POINTER_PHASE), 1) : rawProgress;\n const camL = lerp(prevCamera.left, camera.left, cT);\n const camT2 = lerp(prevCamera.top, camera.top, cT);\n const camW = lerp(prevCamera.width, camera.width, cT);\n const ptrX = lerp(prevCamera.pointerLeft, camera.pointerLeft, pT);\n const ptrY = lerp(prevCamera.pointerTop, camera.pointerTop, pT);\n const zoom = imgW / camW;\n const { offsetX, offsetY, contentWidth, contentHeight } = getPlaybackViewport(W, H, imgW, imgH);\n const tx = contentWidth / imgW * -camL;\n const ty = contentHeight / imgH * -camT2;\n const crossAlpha = imageChanged ? clamp(fInScript / CROSSFADE_FRAMES, 0, 1) : 1;\n ctx.fillStyle = '#000';\n ctx.fillRect(0, 0, W, H);\n const drawImg = (src, alpha)=>{\n const imgEl = imgCache.get(src);\n if (!imgEl || alpha <= 0) return;\n ctx.save();\n ctx.globalAlpha = alpha;\n ctx.beginPath();\n ctx.rect(0, 0, W, H);\n ctx.clip();\n ctx.translate(offsetX + tx * zoom, offsetY + ty * zoom);\n ctx.scale(zoom, zoom);\n ctx.drawImage(imgEl, 0, 0, contentWidth, contentHeight);\n ctx.restore();\n };\n if (imageChanged && prevImg && crossAlpha < 1) drawImg(prevImg, 1 - crossAlpha);\n drawImg(img, imageChanged ? crossAlpha : 1);\n if (insights.length > 0) drawInsightOverlays(ctx, insights, {\n zoom,\n tx,\n ty\n }, offsetX, offsetY);\n const camH = imgH / imgW * camW;\n const sX = offsetX + (ptrX - camL) / camW * contentWidth;\n const sY = offsetY + (ptrY - camT2) / camH * contentHeight;\n const hasPtrData = Math.abs(camera.pointerLeft - Math.round(imgW / 2)) > 1 || Math.abs(camera.pointerTop - Math.round(imgH / 2)) > 1 || Math.abs(prevCamera.pointerLeft - Math.round(imgW / 2)) > 1 || Math.abs(prevCamera.pointerTop - Math.round(imgH / 2)) > 1;\n if (spinning && spinnerImg) drawSpinningPointer(ctx, spinnerImg, sX, sY, spinningElapsedMs);\n if (!spinning && hasPtrData && cursorImg) ctx.drawImage(cursorImg, sX - 3, sY - 2, 22, 28);\n}\nfunction exportBrandedVideo(frameMap, onProgress) {\n return _async_to_generator(function*() {\n const { totalDurationInFrames: total, fps } = frameMap;\n const imgSrcs = new Set();\n for (const sf of frameMap.scriptFrames)if (sf.img) imgSrcs.add(sf.img);\n const imgCache = new Map();\n yield Promise.all([\n ...imgSrcs\n ].map((src)=>_async_to_generator(function*() {\n try {\n imgCache.set(src, (yield loadImage(src)));\n } catch (e) {}\n })()));\n let cursorImg = null;\n let spinnerImg = null;\n try {\n cursorImg = yield loadImage(mousePointer);\n } catch (e) {}\n try {\n spinnerImg = yield loadImage(mouseLoading);\n } catch (e) {}\n const canvas = document.createElement('canvas');\n canvas.width = W;\n canvas.height = H;\n const ctx = canvas.getContext('2d');\n const stream = canvas.captureStream(fps);\n const recorder = new MediaRecorder(stream, {\n mimeType: 'video/webm'\n });\n const chunks = [];\n recorder.ondataavailable = (e)=>{\n if (e.data.size > 0) chunks.push(e.data);\n };\n return new Promise((resolve, reject)=>{\n recorder.onerror = ()=>reject(new Error('MediaRecorder error'));\n recorder.onstop = ()=>{\n if (0 === chunks.length) return void reject(new Error('No video data'));\n const blob = new Blob(chunks, {\n type: 'video/webm'\n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'midscene_replay.webm';\n a.click();\n stream.getTracks().forEach((track)=>track.stop());\n setTimeout(()=>URL.revokeObjectURL(url), 1000);\n resolve();\n };\n recorder.start();\n const frameDuration = 1000 / fps;\n const startTime = performance.now();\n let lastFrame = -1;\n const tick = ()=>{\n const elapsed = performance.now() - startTime;\n const targetFrame = Math.min(Math.floor(elapsed / frameDuration), total - 1);\n if (targetFrame > lastFrame) {\n lastFrame = targetFrame;\n ctx.clearRect(0, 0, W, H);\n drawSteps(ctx, targetFrame, frameMap, imgCache, cursorImg, spinnerImg);\n null == onProgress || onProgress((targetFrame + 1) / total);\n }\n if (targetFrame < total - 1) requestAnimationFrame(tick);\n else setTimeout(()=>recorder.stop(), 2 * frameDuration);\n };\n requestAnimationFrame(tick);\n });\n })();\n}\nexport { exportBrandedVideo };\n","\"use client\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport \"./index.css\";\nimport { CaretRightOutlined, CompressOutlined, DownloadOutlined, ExpandOutlined, ExportOutlined, FontSizeOutlined, PauseOutlined, ThunderboltOutlined } from \"@ant-design/icons\";\nimport { Dropdown, Spin, Switch, Tooltip, message } from \"antd\";\nimport global_perspective from \"../../icons/global-perspective.mjs\";\nimport player_setting from \"../../icons/player-setting.mjs\";\nimport { useGlobalPreference } from \"../../store/store.mjs\";\nimport { StepsTimeline } from \"./scenes/StepScene.mjs\";\nimport { exportBrandedVideo } from \"./scenes/export-branded-video.mjs\";\nimport { calculateFrameMap } from \"./scenes/frame-calculator.mjs\";\nimport { getPlaybackFrameState } from \"./scenes/playback-frame.mjs\";\nimport { useFramePlayer } from \"./use-frame-player.mjs\";\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(void 0);\n });\n };\n}\nconst downloadReport = (content)=>{\n const blob = new Blob([\n content\n ], {\n type: 'text/html'\n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'midscene_report.html';\n a.click();\n setTimeout(()=>URL.revokeObjectURL(url), 0);\n};\nfunction deriveTaskId(scriptFrames, stepsFrame) {\n let taskId = null;\n for (const sf of scriptFrames){\n if (0 === sf.durationInFrames) {\n if (sf.startFrame <= stepsFrame) {\n var _sf_taskId;\n taskId = null != (_sf_taskId = sf.taskId) ? _sf_taskId : taskId;\n }\n continue;\n }\n if (stepsFrame < sf.startFrame) break;\n var _sf_taskId1;\n taskId = null != (_sf_taskId1 = sf.taskId) ? _sf_taskId1 : taskId;\n }\n return taskId;\n}\nfunction formatTime(frame, fps) {\n const totalSeconds = Math.floor(frame / fps);\n const m = Math.floor(totalSeconds / 60);\n const s = totalSeconds % 60;\n return `${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`;\n}\nfunction Player(props) {\n const { autoZoom, setAutoZoom, playbackSpeed, setPlaybackSpeed, subtitleEnabled, setSubtitleEnabled } = useGlobalPreference();\n useEffect(()=>{\n if ((null == props ? void 0 : props.autoZoom) !== void 0) setAutoZoom(props.autoZoom);\n }, [\n null == props ? void 0 : props.autoZoom,\n setAutoZoom\n ]);\n const scripts = null == props ? void 0 : props.replayScripts;\n const frameMap = useMemo(()=>{\n if (!scripts || 0 === scripts.length) return null;\n return calculateFrameMap(scripts, {\n imageWidth: null == props ? void 0 : props.imageWidth,\n imageHeight: null == props ? void 0 : props.imageHeight\n });\n }, [\n null == props ? void 0 : props.imageHeight,\n null == props ? void 0 : props.imageWidth,\n scripts\n ]);\n const containerRef = useRef(null);\n const renderLayerRef = useRef(null);\n const lastTaskIdRef = useRef(null);\n const [containerSize, setContainerSize] = useState({\n width: 0,\n height: 0\n });\n useEffect(()=>{\n const el = renderLayerRef.current;\n if (!el) return;\n const ro = new ResizeObserver((entries)=>{\n for (const entry of entries){\n const { width, height } = entry.contentRect;\n setContainerSize((prev)=>prev.width === width && prev.height === height ? prev : {\n width,\n height\n });\n }\n });\n ro.observe(el);\n return ()=>ro.disconnect();\n }, []);\n var _frameMap_totalDurationInFrames, _frameMap_fps;\n const player = useFramePlayer({\n durationInFrames: Math.max(null != (_frameMap_totalDurationInFrames = null == frameMap ? void 0 : frameMap.totalDurationInFrames) ? _frameMap_totalDurationInFrames : 1, 1),\n fps: null != (_frameMap_fps = null == frameMap ? void 0 : frameMap.fps) ? _frameMap_fps : 30,\n autoPlay: true,\n loop: false,\n playbackRate: playbackSpeed\n });\n useEffect(()=>{\n if (!frameMap || player.playing) return;\n const { scriptFrames, totalDurationInFrames } = frameMap;\n if (player.currentFrame < totalDurationInFrames - 1) return;\n for(let i = scriptFrames.length - 1; i >= 0; i--){\n const sf = scriptFrames[i];\n if (sf.taskId) {\n player.seekTo(sf.startFrame + sf.durationInFrames - 1);\n break;\n }\n }\n }, [\n frameMap,\n player.playing\n ]);\n useEffect(()=>{\n if (!frameMap || !(null == props ? void 0 : props.onTaskChange)) return;\n if (!player.playing) {\n if (null !== lastTaskIdRef.current) {\n lastTaskIdRef.current = null;\n props.onTaskChange(null);\n }\n return;\n }\n const taskId = deriveTaskId(frameMap.scriptFrames, player.currentFrame);\n if (taskId !== lastTaskIdRef.current) {\n lastTaskIdRef.current = taskId;\n props.onTaskChange(taskId);\n }\n }, [\n frameMap,\n null == props ? void 0 : props.onTaskChange,\n player.currentFrame,\n player.playing\n ]);\n const currentFrameState = useMemo(()=>{\n if (!frameMap) return null;\n return getPlaybackFrameState(frameMap, player.currentFrame);\n }, [\n frameMap,\n player.currentFrame\n ]);\n const subtitle = useMemo(()=>{\n if (!currentFrameState) return null;\n if (!currentFrameState.title && !currentFrameState.subTitle) return null;\n return {\n title: currentFrameState.title,\n subTitle: currentFrameState.subTitle\n };\n }, [\n currentFrameState\n ]);\n const [controlsVisible, setControlsVisible] = useState(true);\n const hideTimerRef = useRef(null);\n const showControls = useCallback(()=>{\n setControlsVisible(true);\n if (hideTimerRef.current) clearTimeout(hideTimerRef.current);\n hideTimerRef.current = setTimeout(()=>setControlsVisible(false), 3000);\n }, []);\n const onMouseEnter = useCallback(()=>{\n setControlsVisible(true);\n if (hideTimerRef.current) clearTimeout(hideTimerRef.current);\n }, []);\n const onMouseLeave = useCallback(()=>{\n if (hideTimerRef.current) clearTimeout(hideTimerRef.current);\n hideTimerRef.current = setTimeout(()=>setControlsVisible(false), 1000);\n }, []);\n useEffect(()=>{\n const handleKeyDown = (e)=>{\n var _e_target;\n const tag = null == (_e_target = e.target) ? void 0 : _e_target.tagName;\n if ('INPUT' === tag || 'TEXTAREA' === tag || 'SELECT' === tag) return;\n if ('Space' === e.code) {\n e.preventDefault();\n player.toggle();\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return ()=>document.removeEventListener('keydown', handleKeyDown);\n }, [\n player\n ]);\n const seekBarRef = useRef(null);\n const handleSeekPointerDown = useCallback((e)=>{\n if (!frameMap || !seekBarRef.current) return;\n const bar = seekBarRef.current;\n bar.setPointerCapture(e.pointerId);\n const seek = (clientX)=>{\n const rect = bar.getBoundingClientRect();\n const ratio = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n player.seekTo(Math.round(ratio * (frameMap.totalDurationInFrames - 1)));\n };\n seek(e.clientX);\n const onMove = (ev)=>seek(ev.clientX);\n const onUp = ()=>{\n bar.removeEventListener('pointermove', onMove);\n bar.removeEventListener('pointerup', onUp);\n };\n bar.addEventListener('pointermove', onMove);\n bar.addEventListener('pointerup', onUp);\n }, [\n frameMap,\n player\n ]);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const toggleFullscreen = useCallback(()=>{\n const el = containerRef.current;\n if (!el) return;\n if (document.fullscreenElement) document.exitFullscreen().then(()=>setIsFullscreen(false));\n else el.requestFullscreen().then(()=>setIsFullscreen(true));\n }, []);\n useEffect(()=>{\n const handler = ()=>setIsFullscreen(!!document.fullscreenElement);\n document.addEventListener('fullscreenchange', handler);\n return ()=>document.removeEventListener('fullscreenchange', handler);\n }, []);\n const [isExporting, setIsExporting] = useState(false);\n const [exportProgress, setExportProgress] = useState(0);\n const handleExportVideo = useCallback(()=>_async_to_generator(function*() {\n if (!frameMap || isExporting) return;\n setIsExporting(true);\n setExportProgress(0);\n try {\n yield exportBrandedVideo(frameMap, (pct)=>setExportProgress(Math.round(100 * pct)));\n message.success('Video exported');\n } catch (e) {\n console.error('Export failed:', e);\n message.error('Export failed');\n } finally{\n setIsExporting(false);\n setExportProgress(0);\n }\n })(), [\n frameMap,\n isExporting\n ]);\n const chapterMarkers = useMemo(()=>{\n if (!frameMap) return [];\n const { scriptFrames, totalDurationInFrames } = frameMap;\n if (0 === totalDurationInFrames) return [];\n const markers = [];\n for (const sf of scriptFrames){\n if ('img' !== sf.type && 'insight' !== sf.type || 0 === sf.durationInFrames) continue;\n const globalFrame = sf.startFrame;\n const percent = globalFrame / totalDurationInFrames * 100;\n if (percent > 1 && percent < 99) {\n const parts = [\n sf.title,\n sf.subTitle\n ].filter(Boolean);\n markers.push({\n percent,\n title: parts.length > 0 ? parts.join(': ') : `Chapter ${markers.length + 1}`,\n frame: globalFrame\n });\n }\n }\n return markers;\n }, [\n frameMap\n ]);\n if (!scripts || 0 === scripts.length || !frameMap) return /*#__PURE__*/ jsx(\"div\", {\n className: \"player-container\"\n });\n const compositionWidth = (null == currentFrameState ? void 0 : currentFrameState.imageWidth) || frameMap.imageWidth;\n const compositionHeight = (null == currentFrameState ? void 0 : currentFrameState.imageHeight) || frameMap.imageHeight;\n const isPortraitCanvas = compositionHeight > compositionWidth;\n const totalFrames = frameMap.totalDurationInFrames;\n const seekPercent = totalFrames > 1 ? player.currentFrame / (totalFrames - 1) * 100 : 0;\n return /*#__PURE__*/ jsx(\"div\", {\n className: \"player-container\",\n \"data-fit-mode\": null == props ? void 0 : props.fitMode,\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"canvas-container\",\n ref: containerRef,\n onMouseMove: showControls,\n onMouseEnter: onMouseEnter,\n onMouseLeave: onMouseLeave,\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"player-wrapper\",\n \"data-portrait\": isPortraitCanvas ? '' : void 0,\n style: {\n aspectRatio: `${compositionWidth}/${compositionHeight}`\n },\n children: /*#__PURE__*/ jsx(\"div\", {\n ref: renderLayerRef,\n style: {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n width: '100%',\n height: '100%',\n overflow: 'hidden'\n },\n onClick: player.toggle,\n children: (()=>{\n const scale = containerSize.width > 0 && containerSize.height > 0 ? Math.min(containerSize.width / compositionWidth, containerSize.height / compositionHeight) : 1;\n return /*#__PURE__*/ jsx(\"div\", {\n style: {\n width: compositionWidth * scale,\n height: compositionHeight * scale,\n flexShrink: 0,\n position: 'relative',\n overflow: 'hidden'\n },\n children: /*#__PURE__*/ jsx(\"div\", {\n style: {\n width: compositionWidth,\n height: compositionHeight,\n transformOrigin: '0 0',\n transform: `scale(${scale})`\n },\n children: /*#__PURE__*/ jsx(StepsTimeline, {\n frameMap: frameMap,\n autoZoom: autoZoom && player.playing,\n frame: player.currentFrame,\n width: compositionWidth,\n height: compositionHeight,\n fps: frameMap.fps\n })\n })\n });\n })()\n })\n }),\n subtitleEnabled && subtitle && /*#__PURE__*/ jsxs(\"div\", {\n className: \"player-subtitle\",\n children: [\n subtitle.title && /*#__PURE__*/ jsx(\"span\", {\n className: \"player-subtitle-badge\",\n children: subtitle.title\n }),\n subtitle.subTitle && /*#__PURE__*/ jsx(\"span\", {\n className: \"player-subtitle-text\",\n children: subtitle.subTitle\n })\n ]\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n className: `control-bar ${controlsVisible ? '' : 'hidden'}`,\n onClick: (e)=>e.stopPropagation(),\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"status-icon\",\n onClick: player.toggle,\n children: player.playing ? /*#__PURE__*/ jsx(PauseOutlined, {}) : /*#__PURE__*/ jsx(CaretRightOutlined, {})\n }),\n /*#__PURE__*/ jsxs(\"span\", {\n className: \"time-display\",\n children: [\n formatTime(player.currentFrame, frameMap.fps),\n \" /\",\n ' ',\n formatTime(totalFrames, frameMap.fps)\n ]\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"seek-bar-track\",\n ref: seekBarRef,\n onPointerDown: handleSeekPointerDown,\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"seek-bar-fill\",\n style: {\n width: `${seekPercent}%`\n }\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"seek-bar-knob\",\n style: {\n left: `${seekPercent}%`\n }\n }),\n chapterMarkers.map((marker)=>/*#__PURE__*/ jsx(Tooltip, {\n title: marker.title,\n overlayClassName: \"chapter-tooltip\",\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"chapter-marker\",\n style: {\n left: `${marker.percent}%`\n },\n onClick: (e)=>{\n e.stopPropagation();\n player.seekTo(marker.frame);\n }\n })\n }, marker.percent))\n ]\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"player-custom-controls\",\n children: [\n (null == props ? void 0 : props.reportFileContent) && (null == props ? void 0 : props.canDownloadReport) !== false ? /*#__PURE__*/ jsx(Tooltip, {\n title: \"Download Report\",\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"status-icon\",\n onClick: ()=>downloadReport(props.reportFileContent),\n children: /*#__PURE__*/ jsx(DownloadOutlined, {})\n })\n }) : null,\n /*#__PURE__*/ jsx(Dropdown, {\n trigger: [\n 'hover',\n 'click'\n ],\n placement: \"topRight\",\n overlayStyle: {\n minWidth: '148px'\n },\n dropdownRender: ()=>/*#__PURE__*/ jsxs(\"div\", {\n className: \"player-settings-dropdown\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"player-settings-item\",\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n height: '32px',\n padding: '0 8px',\n borderRadius: '4px',\n cursor: isExporting ? 'not-allowed' : 'pointer',\n opacity: isExporting ? 0.5 : 1\n },\n onClick: isExporting ? void 0 : handleExportVideo,\n children: [\n isExporting ? /*#__PURE__*/ jsx(Spin, {\n size: \"small\"\n }) : /*#__PURE__*/ jsx(ExportOutlined, {\n style: {\n width: '16px',\n height: '16px'\n }\n }),\n /*#__PURE__*/ jsx(\"span\", {\n style: {\n fontSize: '14px'\n },\n children: isExporting ? `Exporting ${exportProgress}%` : 'Export video'\n })\n ]\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"player-settings-divider\"\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"player-settings-item\",\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n height: '32px',\n padding: '0 8px',\n borderRadius: '4px'\n },\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: '4px'\n },\n children: [\n /*#__PURE__*/ jsx(global_perspective, {\n style: {\n width: '16px',\n height: '16px'\n }\n }),\n /*#__PURE__*/ jsx(\"span\", {\n style: {\n fontSize: '14px',\n marginRight: '16px'\n },\n children: \"Focus on cursor\"\n })\n ]\n }),\n /*#__PURE__*/ jsx(Switch, {\n size: \"small\",\n checked: autoZoom,\n onChange: (checked)=>setAutoZoom(checked)\n })\n ]\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"player-settings-item\",\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n height: '32px',\n padding: '0 8px',\n borderRadius: '4px'\n },\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: '4px'\n },\n children: [\n /*#__PURE__*/ jsx(FontSizeOutlined, {\n style: {\n width: '16px',\n height: '16px'\n }\n }),\n /*#__PURE__*/ jsx(\"span\", {\n style: {\n fontSize: '14px',\n marginRight: '16px'\n },\n children: \"Subtitle\"\n })\n ]\n }),\n /*#__PURE__*/ jsx(Switch, {\n size: \"small\",\n checked: subtitleEnabled,\n onChange: (checked)=>setSubtitleEnabled(checked)\n })\n ]\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"player-settings-divider\"\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n height: '32px',\n padding: '0 8px'\n },\n children: [\n /*#__PURE__*/ jsx(ThunderboltOutlined, {\n style: {\n width: '16px',\n height: '16px'\n }\n }),\n /*#__PURE__*/ jsx(\"span\", {\n style: {\n fontSize: '14px'\n },\n children: \"Playback speed\"\n })\n ]\n }),\n [\n 0.5,\n 1,\n 1.5,\n 2\n ].map((speed)=>/*#__PURE__*/ jsxs(\"div\", {\n onClick: ()=>setPlaybackSpeed(speed),\n style: {\n height: '32px',\n lineHeight: '32px',\n padding: '0 8px 0 24px',\n fontSize: '14px',\n cursor: 'pointer',\n borderRadius: '4px'\n },\n className: `player-speed-option${playbackSpeed === speed ? ' active' : ''}`,\n children: [\n speed,\n \"x\"\n ]\n }, speed))\n ]\n }),\n menu: {\n items: []\n },\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"status-icon\",\n children: /*#__PURE__*/ jsx(player_setting, {\n style: {\n width: '16px',\n height: '16px'\n }\n })\n })\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"status-icon\",\n onClick: toggleFullscreen,\n children: isFullscreen ? /*#__PURE__*/ jsx(CompressOutlined, {}) : /*#__PURE__*/ jsx(ExpandOutlined, {})\n })\n ]\n })\n ]\n })\n ]\n })\n });\n}\nexport { Player };\n","const FPS = 30;\nfunction calculateFrameMap(scripts, options) {\n let baseImageWidth = (null == options ? void 0 : options.imageWidth) || 1920;\n let baseImageHeight = (null == options ? void 0 : options.imageHeight) || 1080;\n for (const s of scripts)if (('img' === s.type || 'insight' === s.type) && s.img) {\n baseImageWidth = s.imageWidth || baseImageWidth;\n baseImageHeight = s.imageHeight || baseImageHeight;\n break;\n }\n const scriptFrames = [];\n let currentFrame = 0;\n for (const script of scripts){\n const durationMs = script.duration;\n switch(script.type){\n case 'sleep':\n {\n const frames = Math.ceil(durationMs / 1000 * FPS);\n scriptFrames.push({\n type: 'sleep',\n startFrame: currentFrame,\n durationInFrames: frames,\n title: script.title,\n subTitle: script.subTitle,\n taskId: script.taskId\n });\n currentFrame += frames;\n break;\n }\n case 'img':\n {\n const frames = Math.max(Math.ceil(durationMs / 1000 * FPS), 1);\n const camera = script.camera;\n const iw = script.imageWidth || baseImageWidth;\n const ih = script.imageHeight || baseImageHeight;\n const sf = {\n type: 'img',\n startFrame: currentFrame,\n durationInFrames: frames,\n img: script.img,\n imageWidth: iw,\n imageHeight: ih,\n title: script.title,\n subTitle: script.subTitle,\n taskId: script.taskId\n };\n if (camera) {\n var _camera_pointerLeft, _camera_pointerTop;\n sf.cameraTarget = {\n left: camera.left,\n top: camera.top,\n width: camera.width,\n pointerLeft: null != (_camera_pointerLeft = camera.pointerLeft) ? _camera_pointerLeft : Math.round(iw / 2),\n pointerTop: null != (_camera_pointerTop = camera.pointerTop) ? _camera_pointerTop : Math.round(ih / 2)\n };\n }\n scriptFrames.push(sf);\n currentFrame += frames;\n break;\n }\n case 'insight':\n {\n const insightPhaseFrames = Math.max(Math.ceil(durationMs / 1000 * FPS), 1);\n const cameraDurationMs = script.insightCameraDuration || 0;\n const cameraPhaseFrames = Math.ceil(cameraDurationMs / 1000 * FPS);\n const totalFrames = insightPhaseFrames + cameraPhaseFrames;\n const iw = script.imageWidth || baseImageWidth;\n const ih = script.imageHeight || baseImageHeight;\n const camera = script.camera;\n const sf = {\n type: 'insight',\n startFrame: currentFrame,\n durationInFrames: totalFrames,\n img: script.img,\n imageWidth: iw,\n imageHeight: ih,\n insightPhaseFrames,\n cameraPhaseFrames,\n highlightElement: script.highlightElement,\n searchArea: script.searchArea,\n title: script.title,\n subTitle: script.subTitle,\n taskId: script.taskId\n };\n if (camera) {\n var _camera_pointerLeft1, _camera_pointerTop1;\n sf.cameraTarget = {\n left: camera.left,\n top: camera.top,\n width: camera.width,\n pointerLeft: null != (_camera_pointerLeft1 = camera.pointerLeft) ? _camera_pointerLeft1 : Math.round(iw / 2),\n pointerTop: null != (_camera_pointerTop1 = camera.pointerTop) ? _camera_pointerTop1 : Math.round(ih / 2)\n };\n }\n scriptFrames.push(sf);\n currentFrame += totalFrames;\n break;\n }\n case 'clear-insight':\n {\n const frames = Math.max(Math.ceil(durationMs / 1000 * FPS), 1);\n scriptFrames.push({\n type: 'clear-insight',\n startFrame: currentFrame,\n durationInFrames: frames,\n title: script.title,\n subTitle: script.subTitle,\n taskId: script.taskId\n });\n currentFrame += frames;\n break;\n }\n case 'spinning-pointer':\n {\n const frames = Math.max(Math.ceil(durationMs / 1000 * FPS), 1);\n scriptFrames.push({\n type: 'spinning-pointer',\n startFrame: currentFrame,\n durationInFrames: frames,\n title: script.title,\n subTitle: script.subTitle,\n taskId: script.taskId\n });\n currentFrame += frames;\n break;\n }\n case 'pointer':\n scriptFrames.push({\n type: 'pointer',\n startFrame: currentFrame,\n durationInFrames: 0,\n pointerImg: script.img,\n title: script.title,\n subTitle: script.subTitle,\n taskId: script.taskId\n });\n break;\n }\n }\n const stepsDurationInFrames = Math.max(currentFrame, 1);\n return {\n scriptFrames,\n totalDurationInFrames: stepsDurationInFrames,\n fps: FPS,\n stepsDurationInFrames,\n imageWidth: baseImageWidth,\n imageHeight: baseImageHeight\n };\n}\nexport { FPS, calculateFrameMap };\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nfunction useFramePlayer(options) {\n const { durationInFrames, fps, autoPlay = false, loop = false } = options;\n const [currentFrame, setCurrentFrame] = useState(0);\n const [playing, setPlaying] = useState(autoPlay);\n const playingRef = useRef(playing);\n const frameRef = useRef(currentFrame);\n var _options_playbackRate;\n const rateRef = useRef(null != (_options_playbackRate = options.playbackRate) ? _options_playbackRate : 1);\n const durationRef = useRef(durationInFrames);\n const fpsRef = useRef(fps);\n const loopRef = useRef(loop);\n playingRef.current = playing;\n frameRef.current = currentFrame;\n var _options_playbackRate1;\n rateRef.current = null != (_options_playbackRate1 = options.playbackRate) ? _options_playbackRate1 : 1;\n durationRef.current = durationInFrames;\n fpsRef.current = fps;\n loopRef.current = loop;\n useEffect(()=>{\n if (!playing) return;\n let rafId;\n let lastTime = null;\n let accumulated = 0;\n const tick = (now)=>{\n if (null !== lastTime) {\n const delta = (now - lastTime) * rateRef.current;\n accumulated += delta;\n const frameDuration = 1000 / fpsRef.current;\n while(accumulated >= frameDuration){\n accumulated -= frameDuration;\n const next = frameRef.current + 1;\n if (next >= durationRef.current) if (loopRef.current) {\n frameRef.current = 0;\n setCurrentFrame(0);\n } else {\n frameRef.current = durationRef.current - 1;\n setCurrentFrame(durationRef.current - 1);\n setPlaying(false);\n return;\n }\n else {\n frameRef.current = next;\n setCurrentFrame(next);\n }\n }\n }\n lastTime = now;\n rafId = requestAnimationFrame(tick);\n };\n rafId = requestAnimationFrame(tick);\n return ()=>cancelAnimationFrame(rafId);\n }, [\n playing\n ]);\n const resetIfAtEnd = ()=>{\n if (frameRef.current >= durationRef.current - 1) {\n frameRef.current = 0;\n setCurrentFrame(0);\n }\n };\n const play = useCallback(()=>{\n resetIfAtEnd();\n setPlaying(true);\n }, []);\n const pause = useCallback(()=>setPlaying(false), []);\n const toggle = useCallback(()=>{\n if (playingRef.current) setPlaying(false);\n else {\n resetIfAtEnd();\n setPlaying(true);\n }\n }, []);\n const seekTo = useCallback((frame)=>{\n const clamped = Math.max(0, Math.min(frame, durationRef.current - 1));\n frameRef.current = clamped;\n setCurrentFrame(clamped);\n }, []);\n return {\n currentFrame,\n playing,\n play,\n pause,\n toggle,\n seekTo\n };\n}\nexport { useFramePlayer };\n","import { deriveFrameState } from \"./derive-frame-state.mjs\";\nfunction getPlaybackFrameState(frameMap, frame) {\n const state = deriveFrameState(frameMap.scriptFrames, frame, frameMap.imageWidth, frameMap.imageHeight, frameMap.fps);\n return state.img ? state : null;\n}\nexport { getPlaybackFrameState };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { LoadingOutlined } from \"@ant-design/icons\";\nimport { noReplayAPIs } from \"@midscene/playground\";\nimport { Spin } from \"antd\";\nimport { emptyResultTip, serverLaunchTip } from \"../misc/index.mjs\";\nimport { Player } from \"../player/index.mjs\";\nimport shiny_text from \"../shiny-text/index.mjs\";\nimport \"./index.css\";\nconst PlaygroundResultView = ({ result, loading, serverValid, serviceMode, replayScriptsInfo, replayCounter, loadingProgressText, verticalMode = false, notReadyMessage, fitMode, autoZoom, actionType, canDownloadReport })=>{\n let resultWrapperClassName = 'result-wrapper';\n if (verticalMode) resultWrapperClassName += ' vertical-mode-result';\n if (replayScriptsInfo && verticalMode) resultWrapperClassName += ' result-wrapper-compact';\n let resultDataToShow = emptyResultTip;\n const shouldPrioritizeResult = actionType && noReplayAPIs.includes(actionType);\n if (serverValid || 'Server' !== serviceMode) {\n if (loading) resultDataToShow = /*#__PURE__*/ jsxs(\"div\", {\n className: \"loading-container\",\n children: [\n /*#__PURE__*/ jsx(Spin, {\n spinning: loading,\n indicator: /*#__PURE__*/ jsx(LoadingOutlined, {\n spin: true\n })\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"loading-progress-text loading-progress-text-progress\",\n children: /*#__PURE__*/ jsx(shiny_text, {\n text: loadingProgressText,\n speed: 3\n })\n })\n ]\n });\n else if (null == result ? void 0 : result.error) {\n const errorNode = /*#__PURE__*/ jsx(\"pre\", {\n style: {\n color: '#ff4d4f',\n whiteSpace: 'pre-wrap'\n },\n children: null == result ? void 0 : result.error\n });\n resultDataToShow = result.reportHTML || replayScriptsInfo ? /*#__PURE__*/ jsxs(\"div\", {\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n height: '100%'\n },\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n style: {\n flex: '0 0 auto',\n maxHeight: '40%',\n overflow: 'auto'\n },\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n style: {\n fontWeight: 'bold',\n marginBottom: '8px'\n },\n children: \"Error:\"\n }),\n errorNode\n ]\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n style: {\n flex: '1 1 auto',\n minHeight: 0\n },\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n style: {\n fontWeight: 'bold',\n marginBottom: '8px'\n },\n children: \"Report:\"\n }),\n /*#__PURE__*/ jsx(Player, {\n replayScripts: null == replayScriptsInfo ? void 0 : replayScriptsInfo.scripts,\n imageWidth: null == replayScriptsInfo ? void 0 : replayScriptsInfo.width,\n imageHeight: null == replayScriptsInfo ? void 0 : replayScriptsInfo.height,\n reportFileContent: result.reportHTML || null,\n fitMode: fitMode,\n autoZoom: autoZoom,\n canDownloadReport: null != canDownloadReport ? canDownloadReport : 'In-Browser' !== serviceMode\n }, replayCounter)\n ]\n })\n ]\n }) : errorNode;\n } else if (shouldPrioritizeResult && (null == result ? void 0 : result.result) !== void 0 && replayScriptsInfo) {\n const resultOutput = 'string' == typeof (null == result ? void 0 : result.result) ? /*#__PURE__*/ jsx(\"pre\", {\n children: null == result ? void 0 : result.result\n }) : /*#__PURE__*/ jsx(\"pre\", {\n children: JSON.stringify(null == result ? void 0 : result.result, null, 2)\n });\n const reportContent = (null == result ? void 0 : result.reportHTML) || null;\n resultDataToShow = /*#__PURE__*/ jsxs(\"div\", {\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n height: '100%'\n },\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n style: {\n flex: '0 0 auto'\n },\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n style: {\n fontWeight: 'bold',\n marginBottom: '8px'\n },\n children: \"Output:\"\n }),\n resultOutput\n ]\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n style: {\n flex: '1 1 auto',\n minHeight: 0\n },\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n style: {\n fontWeight: 'bold',\n marginBottom: '8px'\n },\n children: \"Report:\"\n }),\n /*#__PURE__*/ jsx(Player, {\n replayScripts: replayScriptsInfo.scripts,\n imageWidth: replayScriptsInfo.width,\n imageHeight: replayScriptsInfo.height,\n reportFileContent: reportContent,\n fitMode: fitMode,\n autoZoom: autoZoom,\n canDownloadReport: null != canDownloadReport ? canDownloadReport : 'In-Browser' !== serviceMode\n }, replayCounter)\n ]\n })\n ]\n });\n } else if (replayScriptsInfo) {\n const reportContent = (null == result ? void 0 : result.reportHTML) || null;\n resultDataToShow = /*#__PURE__*/ jsx(Player, {\n replayScripts: replayScriptsInfo.scripts,\n imageWidth: replayScriptsInfo.width,\n imageHeight: replayScriptsInfo.height,\n reportFileContent: reportContent,\n fitMode: fitMode,\n autoZoom: autoZoom,\n canDownloadReport: null != canDownloadReport ? canDownloadReport : 'In-Browser' !== serviceMode\n }, replayCounter);\n } else if (shouldPrioritizeResult && (null == result ? void 0 : result.result) !== void 0 && (null == result ? void 0 : result.reportHTML)) {\n const resultOutput = 'string' == typeof (null == result ? void 0 : result.result) ? /*#__PURE__*/ jsx(\"pre\", {\n children: null == result ? void 0 : result.result\n }) : /*#__PURE__*/ jsx(\"pre\", {\n children: JSON.stringify(null == result ? void 0 : result.result, null, 2)\n });\n resultDataToShow = /*#__PURE__*/ jsxs(\"div\", {\n style: {\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n height: '100%'\n },\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n style: {\n flex: '0 0 auto'\n },\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n style: {\n fontWeight: 'bold',\n marginBottom: '8px'\n },\n children: \"Output:\"\n }),\n resultOutput\n ]\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n style: {\n flex: '1 1 auto',\n minHeight: 0\n },\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n style: {\n fontWeight: 'bold',\n marginBottom: '8px'\n },\n children: \"Report:\"\n }),\n /*#__PURE__*/ jsx(Player, {\n reportFileContent: result.reportHTML,\n fitMode: fitMode,\n autoZoom: autoZoom,\n canDownloadReport: null != canDownloadReport ? canDownloadReport : 'In-Browser' !== serviceMode\n }, replayCounter)\n ]\n })\n ]\n });\n } else if (shouldPrioritizeResult && (null == result ? void 0 : result.result) !== void 0) resultDataToShow = 'string' == typeof (null == result ? void 0 : result.result) ? /*#__PURE__*/ jsx(\"pre\", {\n children: null == result ? void 0 : result.result\n }) : /*#__PURE__*/ jsx(\"pre\", {\n children: JSON.stringify(null == result ? void 0 : result.result, null, 2)\n });\n else if (null == result ? void 0 : result.reportHTML) resultDataToShow = /*#__PURE__*/ jsx(Player, {\n reportFileContent: result.reportHTML,\n fitMode: fitMode,\n autoZoom: autoZoom,\n canDownloadReport: null != canDownloadReport ? canDownloadReport : 'In-Browser' !== serviceMode\n }, replayCounter);\n else if ((null == result ? void 0 : result.result) !== void 0) resultDataToShow = 'string' == typeof (null == result ? void 0 : result.result) ? /*#__PURE__*/ jsx(\"pre\", {\n children: null == result ? void 0 : result.result\n }) : /*#__PURE__*/ jsx(\"pre\", {\n children: JSON.stringify(null == result ? void 0 : result.result, null, 2)\n });\n } else resultDataToShow = serverLaunchTip(notReadyMessage);\n return /*#__PURE__*/ jsx(\"div\", {\n className: resultWrapperClassName,\n style: {\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n flex: '1 1 auto',\n justifyContent: 'center'\n },\n children: resultDataToShow\n });\n};\nexport { PlaygroundResultView };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport \"react\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction avatar_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else avatar_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nconst SvgAvatar = (props)=>/*#__PURE__*/ jsxs(\"svg\", _object_spread_props(_object_spread({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 20,\n height: 20,\n fill: \"none\",\n \"aria-label\": \"Playground\",\n viewBox: \"0 0 20 20\"\n }, props), {\n children: [\n /*#__PURE__*/ jsx(\"rect\", {\n width: 20,\n height: 20,\n fill: \"#2B83FF\",\n rx: 10\n }),\n /*#__PURE__*/ jsx(\"path\", {\n fill: \"#2B83FF\",\n stroke: \"#fff\",\n strokeLinejoin: \"round\",\n strokeWidth: 1.125,\n d: \"M6.866 5.882a.56.56 0 0 1 .667-.078l3.248 1.875 3.247 1.875a.563.563 0 0 1 0 .974l-3.247 1.875-3.248 1.875a.563.563 0 0 1-.784-.74l1.749-3.497-1.75-3.498a.56.56 0 0 1 .118-.661Z\"\n })\n ]\n }));\nconst avatar = SvgAvatar;\nexport { avatar as default };\n","import { create } from \"zustand\";\nvar __webpack_require__ = {};\n(()=>{\n __webpack_require__.d = (exports, definition)=>{\n for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) Object.defineProperty(exports, key, {\n enumerable: true,\n get: definition[key]\n });\n };\n})();\n(()=>{\n __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);\n})();\n(()=>{\n __webpack_require__.r = (exports)=>{\n if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports, Symbol.toStringTag, {\n value: 'Module'\n });\n Object.defineProperty(exports, '__esModule', {\n value: true\n });\n };\n})();\nvar external_zustand_namespaceObject = {};\n__webpack_require__.r(external_zustand_namespaceObject);\n__webpack_require__.d(external_zustand_namespaceObject, {\n create: ()=>create\n});\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction history_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else history_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nconst { create: history_create } = external_zustand_namespaceObject;\nconst HISTORY_KEY = 'midscene-prompt-history-v2';\nconst LAST_SELECTED_TYPE_KEY = 'midscene-last-selected-type';\nconst getHistoryFromLocalStorage = ()=>{\n const historyString = localStorage.getItem(HISTORY_KEY);\n return historyString ? JSON.parse(historyString) : {};\n};\nconst getLastSelectedType = ()=>localStorage.getItem(LAST_SELECTED_TYPE_KEY) || 'aiAct';\nconst setLastSelectedType = (type)=>{\n localStorage.setItem(LAST_SELECTED_TYPE_KEY, type);\n};\nconst useHistoryStore = history_create((set, get)=>({\n history: getHistoryFromLocalStorage(),\n lastSelectedType: getLastSelectedType(),\n clearHistory: (type)=>{\n const newHistory = _object_spread({}, get().history);\n delete newHistory[type];\n set({\n history: newHistory\n });\n localStorage.setItem(HISTORY_KEY, JSON.stringify(newHistory));\n },\n addHistory: (historyItem)=>{\n const { type } = historyItem;\n const currentHistory = get().history;\n const typeHistory = currentHistory[type] || [];\n const stringifiedNewItem = JSON.stringify({\n prompt: historyItem.prompt,\n params: historyItem.params\n });\n const newTypeHistory = [\n historyItem,\n ...typeHistory.filter((h)=>{\n const stringifiedOldItem = JSON.stringify({\n prompt: h.prompt,\n params: h.params\n });\n return stringifiedOldItem !== stringifiedNewItem;\n })\n ];\n if (newTypeHistory.length > 10) newTypeHistory.length = 10;\n const newHistory = _object_spread_props(_object_spread({}, currentHistory), {\n [type]: newTypeHistory\n });\n set({\n history: newHistory\n });\n localStorage.setItem(HISTORY_KEY, JSON.stringify(newHistory));\n },\n getHistoryForType: (type)=>get().history[type] || [],\n setLastSelectedType: (type)=>{\n set({\n lastSelectedType: type\n });\n setLastSelectedType(type);\n }\n }));\nexport { useHistoryStore };\n","const VALIDATION_CONSTANTS = {\n ZOD_TYPES: {\n OPTIONAL: 'ZodOptional',\n DEFAULT: 'ZodDefault',\n NULLABLE: 'ZodNullable',\n OBJECT: 'ZodObject',\n ENUM: 'ZodEnum',\n NUMBER: 'ZodNumber',\n STRING: 'ZodString',\n BOOLEAN: 'ZodBoolean'\n },\n FIELD_FLAGS: {\n LOCATION: 'midscene_location_field_flag'\n },\n DEFAULT_VALUES: {\n ACTION_TYPE: 'aiAct',\n TIMEOUT_MS: 15000,\n CHECK_INTERVAL_MS: 3000\n }\n};\nconst isZodObjectSchema = (schema)=>'object' == typeof schema && null !== schema && ('shape' in schema || 'ZodObject' === schema.type);\nconst isLocateField = (field)=>{\n var _field__def;\n const fieldWithRuntime = field;\n if ((null == (_field__def = field._def) ? void 0 : _field__def.typeName) === VALIDATION_CONSTANTS.ZOD_TYPES.OBJECT) {\n var _field__def1;\n let shape;\n if (field._def.shape) shape = 'function' == typeof field._def.shape ? field._def.shape() : field._def.shape;\n if (!shape && fieldWithRuntime.shape) shape = fieldWithRuntime.shape;\n if (shape && VALIDATION_CONSTANTS.FIELD_FLAGS.LOCATION in shape) return true;\n const description = (null == (_field__def1 = field._def) ? void 0 : _field__def1.description) || fieldWithRuntime.description || '';\n if ('string' == typeof description && description.toLowerCase().includes('input field')) return true;\n }\n if ('object' == typeof field && null !== field) {\n var _fieldWithRuntime__def;\n const description = fieldWithRuntime.description || (null == (_fieldWithRuntime__def = fieldWithRuntime._def) ? void 0 : _fieldWithRuntime__def.description) || '';\n if ('string' == typeof description) {\n const desc = description.toLowerCase();\n if (desc.includes('input field') || desc.includes('element') || desc.includes('locate')) return true;\n }\n if ('ZodObject' === fieldWithRuntime.typeName || 'ZodObject' === fieldWithRuntime.type) return 'string' == typeof description && description.toLowerCase().includes('input field');\n }\n return false;\n};\nconst unwrapZodType = (field)=>{\n var _actualField__def, _actualField__def1, _actualField__def2;\n let actualField = field;\n let isOptional = false;\n let hasDefault = false;\n while((null == (_actualField__def = actualField._def) ? void 0 : _actualField__def.typeName) === VALIDATION_CONSTANTS.ZOD_TYPES.OPTIONAL || (null == (_actualField__def1 = actualField._def) ? void 0 : _actualField__def1.typeName) === VALIDATION_CONSTANTS.ZOD_TYPES.DEFAULT || (null == (_actualField__def2 = actualField._def) ? void 0 : _actualField__def2.typeName) === VALIDATION_CONSTANTS.ZOD_TYPES.NULLABLE){\n var _actualField__def3, _actualField__def4;\n if ((null == (_actualField__def3 = actualField._def) ? void 0 : _actualField__def3.typeName) === VALIDATION_CONSTANTS.ZOD_TYPES.OPTIONAL) isOptional = true;\n if ((null == (_actualField__def4 = actualField._def) ? void 0 : _actualField__def4.typeName) === VALIDATION_CONSTANTS.ZOD_TYPES.DEFAULT) hasDefault = true;\n actualField = actualField._def.innerType || actualField;\n }\n return {\n actualField,\n isOptional,\n hasDefault\n };\n};\nconst extractDefaultValue = (field)=>{\n var _currentField__def;\n let currentField = field;\n while(null == (_currentField__def = currentField._def) ? void 0 : _currentField__def.innerType){\n if (currentField._def.typeName === VALIDATION_CONSTANTS.ZOD_TYPES.DEFAULT && currentField._def.defaultValue) return currentField._def.defaultValue();\n currentField = currentField._def.innerType;\n }\n};\nexport { VALIDATION_CONSTANTS, extractDefaultValue, isLocateField, isZodObjectSchema, unwrapZodType };\n","function getDeviceCapabilities(deviceType) {\n return {\n supportsImeStrategy: 'android' === deviceType,\n supportsKeyboardDismissStrategy: 'android' === deviceType,\n supportsAutoDismissKeyboard: 'android' === deviceType || 'ios' === deviceType || 'harmony' === deviceType,\n supportsAlwaysRefreshScreenInfo: 'android' === deviceType\n };\n}\nfunction hasDeviceSpecificConfig(deviceType) {\n const capabilities = getDeviceCapabilities(deviceType);\n return Object.values(capabilities).some(Boolean);\n}\nexport { getDeviceCapabilities, hasDeviceSpecificConfig };\n","import { StaticPage, StaticPageAgent } from \"@midscene/web/static\";\nimport { isZodObjectSchema, unwrapZodType } from \"../types.mjs\";\nconst actionNameForType = (type)=>{\n if (!type) return '';\n const typeWithoutAi = type.startsWith('ai') ? type.slice(2) : type;\n if (typeWithoutAi.startsWith('IOS')) return typeWithoutAi.substring(3).replace(/([A-Z])/g, ' $1').replace(/^/, 'IOS').trim();\n const fullName = typeWithoutAi.replace(/([A-Z])/g, ' $1').trim();\n const words = fullName.split(' ');\n if (words.length > 3) return words.slice(-3).join(' ');\n return fullName;\n};\nconst staticAgentFromContext = (context)=>{\n const page = new StaticPage(context);\n return new StaticPageAgent(page);\n};\nconst getPlaceholderForType = (type)=>{\n if ('aiQuery' === type) return 'What do you want to query?';\n if ('aiAssert' === type) return 'What do you want to assert?';\n if ('aiTap' === type) return 'What element do you want to tap?';\n if ('aiDoubleClick' === type) return 'What element do you want to double-click?';\n if ('aiHover' === type) return 'What element do you want to hover over?';\n if ('aiInput' === type) return 'Format: <value> | <element>\\nExample: hello world | search box';\n if ('aiRightClick' === type) return 'What element do you want to right-click?';\n if ('aiKeyboardPress' === type) return 'Format: <key> | <element (optional)>\\nExample: Enter | text field';\n if ('aiScroll' === type) return 'Format: <direction> <amount> | <element (optional)>\\nExample: down 500 | main content';\n if ('aiLocate' === type) return 'What element do you want to locate?';\n if ('aiBoolean' === type) return 'What do you want to check (returns true/false)?';\n if ('aiNumber' === type) return 'What number do you want to extract?';\n if ('aiString' === type) return 'What text do you want to extract?';\n if ('aiAsk' === type) return 'What do you want to ask?';\n if ('aiWaitFor' === type) return 'What condition do you want to wait for?';\n return 'What do you want to do?';\n};\nconst isRunButtonEnabled = (runButtonEnabled, needsStructuredParams, params, actionSpace, selectedType, promptValue)=>{\n if (!runButtonEnabled) return false;\n const needsAnyInput = (()=>{\n if (actionSpace) {\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if (action) {\n if (!action.paramSchema) return false;\n if ('object' == typeof action.paramSchema && 'shape' in action.paramSchema) {\n const shape = action.paramSchema.shape || {};\n const shapeKeys = Object.keys(shape);\n return shapeKeys.length > 0;\n }\n }\n }\n return true;\n })();\n if (!needsAnyInput) return true;\n if (needsStructuredParams) {\n const currentParams = params || {};\n const action = null == actionSpace ? void 0 : actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {\n const schema = action.paramSchema;\n const shape = schema.shape || {};\n return Object.keys(shape).every((key)=>{\n const field = shape[key];\n const { isOptional } = unwrapZodType(field);\n const value = currentParams[key];\n return isOptional || void 0 !== value && '' !== value && null !== value;\n });\n }\n return true;\n }\n return promptValue.trim().length > 0;\n};\nexport { actionNameForType, getPlaceholderForType, isRunButtonEnabled, staticAgentFromContext };\n","import { jsx } from \"react/jsx-runtime\";\nimport \"react\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction setting_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else setting_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nconst SvgSetting = (props)=>/*#__PURE__*/ jsx(\"svg\", _object_spread_props(_object_spread({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 27,\n height: 27,\n fill: \"none\",\n viewBox: \"0 0 27 27\"\n }, props), {\n children: /*#__PURE__*/ jsx(\"path\", {\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeOpacity: 0.85,\n strokeWidth: 1.333,\n d: \"M19.527 8.855h-2M14.86 7.522v2.667M14.86 8.855H7.527M10.194 13.522H7.527M12.86 12.189v2.666M20.193 13.522H12.86M19.527 18.189h-2M14.86 16.855v2.667M14.86 18.189H7.527\"\n })\n }));\nconst setting = SvgSetting;\nexport { setting as default };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { Checkbox, Dropdown, Radio, Tooltip } from \"antd\";\nimport setting from \"../../icons/setting.mjs\";\nimport { useEnvConfig } from \"../../store/store.mjs\";\nimport { alwaysRefreshScreenInfoTip, autoDismissKeyboardTip, deepLocateTip, deepThinkTip, domIncludedTip, imeStrategyTip, keyboardDismissStrategyTip, screenshotIncludedTip, trackingTip } from \"../../utils/constants.mjs\";\nimport { getDeviceCapabilities, hasDeviceSpecificConfig } from \"../../utils/device-capabilities.mjs\";\nconst ConfigSelector = ({ showDeepLocateOption = false, showDeepThinkOption = false, enableTracking = false, showDataExtractionOptions = false, hideDomAndScreenshotOptions = false, deviceType })=>{\n const forceSameTabNavigation = useEnvConfig((state)=>state.forceSameTabNavigation);\n const setForceSameTabNavigation = useEnvConfig((state)=>state.setForceSameTabNavigation);\n const deepLocate = useEnvConfig((state)=>state.deepLocate);\n const setDeepLocate = useEnvConfig((state)=>state.setDeepLocate);\n const deepThink = useEnvConfig((state)=>state.deepThink);\n const setDeepThink = useEnvConfig((state)=>state.setDeepThink);\n const screenshotIncluded = useEnvConfig((state)=>state.screenshotIncluded);\n const setScreenshotIncluded = useEnvConfig((state)=>state.setScreenshotIncluded);\n const domIncluded = useEnvConfig((state)=>state.domIncluded);\n const setDomIncluded = useEnvConfig((state)=>state.setDomIncluded);\n const imeStrategy = useEnvConfig((state)=>state.imeStrategy);\n const setImeStrategy = useEnvConfig((state)=>state.setImeStrategy);\n const autoDismissKeyboard = useEnvConfig((state)=>state.autoDismissKeyboard);\n const setAutoDismissKeyboard = useEnvConfig((state)=>state.setAutoDismissKeyboard);\n const keyboardDismissStrategy = useEnvConfig((state)=>state.keyboardDismissStrategy);\n const setKeyboardDismissStrategy = useEnvConfig((state)=>state.setKeyboardDismissStrategy);\n const alwaysRefreshScreenInfo = useEnvConfig((state)=>state.alwaysRefreshScreenInfo);\n const setAlwaysRefreshScreenInfo = useEnvConfig((state)=>state.setAlwaysRefreshScreenInfo);\n const deviceCapabilities = getDeviceCapabilities(deviceType);\n const hasDeviceOptions = hasDeviceSpecificConfig(deviceType);\n if (!enableTracking && !showDeepLocateOption && !showDeepThinkOption && !showDataExtractionOptions && !hasDeviceOptions) return null;\n const configItems = buildConfigItems();\n return /*#__PURE__*/ jsx(\"div\", {\n className: \"selector-trigger\",\n children: /*#__PURE__*/ jsx(Dropdown, {\n menu: {\n items: configItems\n },\n trigger: [\n 'click'\n ],\n children: /*#__PURE__*/ jsx(setting, {\n width: 24,\n height: 24\n })\n })\n });\n function buildConfigItems() {\n const items = [];\n if (enableTracking) items.push({\n label: /*#__PURE__*/ jsx(Checkbox, {\n onChange: (e)=>setForceSameTabNavigation(e.target.checked),\n checked: forceSameTabNavigation,\n children: trackingTip\n }),\n key: 'track-config'\n });\n if (showDeepLocateOption) items.push({\n label: /*#__PURE__*/ jsx(Checkbox, {\n onChange: (e)=>{\n setDeepLocate(e.target.checked);\n },\n checked: deepLocate,\n children: deepLocateTip\n }),\n key: 'deep-locate-config'\n });\n if (showDeepThinkOption) items.push({\n label: /*#__PURE__*/ jsxs(\"div\", {\n style: {\n padding: '4px 0'\n },\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n style: {\n marginBottom: '4px',\n fontSize: '14px'\n },\n children: deepThinkTip\n }),\n /*#__PURE__*/ jsxs(Radio.Group, {\n size: \"small\",\n value: deepThink,\n onChange: (e)=>setDeepThink(e.target.value),\n children: [\n /*#__PURE__*/ jsx(Tooltip, {\n title: \"Controlled by MIDSCENE_MODEL_REASONING_ENABLED env variable\",\n children: /*#__PURE__*/ jsx(Radio, {\n value: 'unset',\n children: \"Auto\"\n })\n }),\n /*#__PURE__*/ jsx(Radio, {\n value: true,\n children: \"On\"\n }),\n /*#__PURE__*/ jsx(Radio, {\n value: false,\n children: \"Off\"\n })\n ]\n })\n ]\n }),\n key: 'deep-think-config'\n });\n if (showDataExtractionOptions && !hideDomAndScreenshotOptions) {\n items.push({\n label: /*#__PURE__*/ jsx(Checkbox, {\n onChange: (e)=>{\n setScreenshotIncluded(e.target.checked);\n },\n checked: screenshotIncluded,\n children: screenshotIncludedTip\n }),\n key: 'screenshot-included-config'\n });\n items.push({\n label: /*#__PURE__*/ jsxs(\"div\", {\n style: {\n padding: '4px 0'\n },\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n style: {\n marginBottom: '4px',\n fontSize: '14px'\n },\n children: domIncludedTip\n }),\n /*#__PURE__*/ jsxs(Radio.Group, {\n size: \"small\",\n value: domIncluded,\n onChange: (e)=>setDomIncluded(e.target.value),\n children: [\n /*#__PURE__*/ jsx(Radio, {\n value: false,\n children: \"Off\"\n }),\n /*#__PURE__*/ jsx(Radio, {\n value: true,\n children: \"All\"\n }),\n /*#__PURE__*/ jsx(Radio, {\n value: 'visible-only',\n children: \"Visible only\"\n })\n ]\n })\n ]\n }),\n key: 'dom-included-config'\n });\n }\n if (deviceCapabilities.supportsImeStrategy) {\n items.push({\n label: /*#__PURE__*/ jsxs(\"div\", {\n style: {\n padding: '4px 0'\n },\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n style: {\n marginBottom: '4px',\n fontSize: '14px'\n },\n children: imeStrategyTip\n }),\n /*#__PURE__*/ jsxs(Radio.Group, {\n size: \"small\",\n value: imeStrategy,\n onChange: (e)=>setImeStrategy(e.target.value),\n children: [\n /*#__PURE__*/ jsx(Radio, {\n value: \"always-yadb\",\n children: \"Always YADB\"\n }),\n /*#__PURE__*/ jsx(Radio, {\n value: \"yadb-for-non-ascii\",\n children: \"YADB for non-ASCII\"\n })\n ]\n })\n ]\n }),\n key: 'ime-strategy-config'\n });\n if (deviceCapabilities.supportsAutoDismissKeyboard) items.push({\n label: /*#__PURE__*/ jsx(Checkbox, {\n onChange: (e)=>setAutoDismissKeyboard(e.target.checked),\n checked: autoDismissKeyboard,\n children: autoDismissKeyboardTip\n }),\n key: 'auto-dismiss-keyboard-config'\n });\n if (deviceCapabilities.supportsKeyboardDismissStrategy) items.push({\n label: /*#__PURE__*/ jsxs(\"div\", {\n style: {\n padding: '4px 0'\n },\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n style: {\n marginBottom: '4px',\n fontSize: '14px'\n },\n children: keyboardDismissStrategyTip\n }),\n /*#__PURE__*/ jsxs(Radio.Group, {\n size: \"small\",\n value: keyboardDismissStrategy,\n onChange: (e)=>setKeyboardDismissStrategy(e.target.value),\n children: [\n /*#__PURE__*/ jsx(Radio, {\n value: \"esc-first\",\n children: \"ESC first\"\n }),\n /*#__PURE__*/ jsx(Radio, {\n value: \"back-first\",\n children: \"Back first\"\n })\n ]\n })\n ]\n }),\n key: 'keyboard-dismiss-strategy-config'\n });\n if (deviceCapabilities.supportsAlwaysRefreshScreenInfo) items.push({\n label: /*#__PURE__*/ jsx(Checkbox, {\n onChange: (e)=>setAlwaysRefreshScreenInfo(e.target.checked),\n checked: alwaysRefreshScreenInfo,\n children: alwaysRefreshScreenInfoTip\n }),\n key: 'always-refresh-screen-info-config'\n });\n }\n if (!deviceCapabilities.supportsImeStrategy && deviceCapabilities.supportsAutoDismissKeyboard) items.push({\n label: /*#__PURE__*/ jsx(Checkbox, {\n onChange: (e)=>setAutoDismissKeyboard(e.target.checked),\n checked: autoDismissKeyboard,\n children: autoDismissKeyboardTip\n }),\n key: 'auto-dismiss-keyboard-config'\n });\n return items;\n }\n};\nexport { ConfigSelector };\n","import { jsx } from \"react/jsx-runtime\";\nimport { Form, Input, InputNumber, Select } from \"antd\";\nconst { TextArea } = Input;\nconst renderLabel = (label, isOptional)=>`${label}${isOptional ? ' (Optional)' : ''}`;\nconst TextField = ({ name, label, isRequired, marginBottom, placeholder: customPlaceholder })=>{\n const placeholder = customPlaceholder || `Enter ${name}`;\n return /*#__PURE__*/ jsx(Form.Item, {\n name: [\n 'params',\n name\n ],\n label: renderLabel(label, !isRequired),\n rules: isRequired ? [\n {\n required: true,\n message: `Please input ${name}`\n }\n ] : [],\n style: {\n marginBottom\n },\n colon: false,\n children: /*#__PURE__*/ jsx(Input, {\n placeholder: placeholder\n })\n }, name);\n};\nconst LocateField = ({ name, label, isRequired, marginBottom, placeholder: customPlaceholder })=>{\n const placeholder = customPlaceholder || `Describe the ${name}, use natural language`;\n return /*#__PURE__*/ jsx(Form.Item, {\n name: [\n 'params',\n name\n ],\n label: renderLabel(label, !isRequired),\n rules: isRequired ? [\n {\n required: true,\n message: `The ${name} is required`\n }\n ] : [],\n style: {\n marginBottom\n },\n colon: false,\n children: /*#__PURE__*/ jsx(TextArea, {\n rows: 2,\n placeholder: placeholder\n })\n }, name);\n};\nconst EnumField = ({ name, label, fieldSchema, isRequired, marginBottom, placeholder: customPlaceholder })=>{\n var _fieldSchema__def;\n const enumValues = (null == (_fieldSchema__def = fieldSchema._def) ? void 0 : _fieldSchema__def.values) || [];\n const selectOptions = enumValues.map((value)=>({\n value,\n label: value.charAt(0).toUpperCase() + value.slice(1)\n }));\n return /*#__PURE__*/ jsx(Form.Item, {\n name: [\n 'params',\n name\n ],\n label: label,\n rules: isRequired ? [\n {\n required: true,\n message: `Please select ${name}`\n }\n ] : [],\n style: {\n marginBottom\n },\n colon: false,\n children: /*#__PURE__*/ jsx(Select, {\n placeholder: customPlaceholder || `Select ${name}`,\n options: selectOptions\n })\n }, name);\n};\nconst NumberField = ({ name, label, isRequired, marginBottom, placeholder: customPlaceholder })=>{\n const defaultPlaceholder = 'distance' === name ? 500 : 0;\n const placeholderValue = customPlaceholder ? Number(customPlaceholder) || defaultPlaceholder : defaultPlaceholder;\n const min = 0;\n const max = 'distance' === name ? 10000 : void 0;\n return /*#__PURE__*/ jsx(Form.Item, {\n name: [\n 'params',\n name\n ],\n label: `${label}${'distance' === name ? ' (px)' : ''}`,\n rules: isRequired ? [\n {\n required: true,\n message: `Please input ${name}`\n },\n {\n type: 'number',\n min,\n message: `${label} must be at least ${min}`\n }\n ] : [\n {\n type: 'number',\n min,\n message: `${label} must be at least ${min}`\n }\n ],\n style: {\n flex: 'distance' === name ? 1 : void 0,\n marginBottom\n },\n colon: false,\n children: /*#__PURE__*/ jsx(InputNumber, {\n placeholder: placeholderValue.toString(),\n min: min,\n max: max,\n step: 'distance' === name ? 10 : 1,\n style: {\n width: '100%'\n }\n })\n }, name);\n};\nconst BooleanField = ({ name, label, isRequired, marginBottom, placeholder: customPlaceholder })=>{\n const selectOptions = [\n {\n value: true,\n label: 'True'\n },\n {\n value: false,\n label: 'False'\n }\n ];\n return /*#__PURE__*/ jsx(Form.Item, {\n name: [\n 'params',\n name\n ],\n label: renderLabel(label, !isRequired),\n rules: isRequired ? [\n {\n required: true,\n message: `Please select ${name}`\n }\n ] : [],\n style: {\n marginBottom\n },\n colon: false,\n children: /*#__PURE__*/ jsx(Select, {\n placeholder: customPlaceholder || `Select ${name}`,\n options: selectOptions\n })\n }, name);\n};\nexport { BooleanField, EnumField, LocateField, NumberField, TextField };\n","import { jsx } from \"react/jsx-runtime\";\nimport \"react\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction close_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else close_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nconst SvgClose = (props)=>/*#__PURE__*/ jsx(\"svg\", _object_spread_props(_object_spread({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 18,\n height: 16,\n fill: \"none\",\n viewBox: \"0 0 18 16\"\n }, props), {\n children: /*#__PURE__*/ jsx(\"path\", {\n stroke: \"#333\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 1.333,\n d: \"m3.124 2.667 11.162 10.666M3.124 13.333 14.286 2.667\"\n })\n }));\nconst icons_close = SvgClose;\nexport { icons_close as default };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport \"react\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction history_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else history_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nconst SvgHistory = (props)=>/*#__PURE__*/ jsxs(\"svg\", _object_spread_props(_object_spread({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 25,\n height: 25,\n fill: \"none\",\n viewBox: \"0 0 25 25\"\n }, props), {\n children: [\n /*#__PURE__*/ jsx(\"path\", {\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeOpacity: 0.85,\n strokeWidth: 1.33,\n d: \"M6.63 9.021c-2.862 6.126 2.197 10.501 6.063 10.501a7 7 0 1 0-6.063-10.5\"\n }),\n /*#__PURE__*/ jsx(\"path\", {\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeOpacity: 0.85,\n strokeWidth: 1.33,\n d: \"M12.695 8.322v4.203l2.967 2.968\"\n })\n ]\n }));\nconst icons_history = SvgHistory;\nexport { icons_history as default };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport \"react\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction magnifying_glass_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else magnifying_glass_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nconst SvgMagnifyingGlass = (props)=>/*#__PURE__*/ jsxs(\"svg\", _object_spread_props(_object_spread({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 19,\n height: 19,\n fill: \"none\",\n viewBox: \"0 0 19 19\"\n }, props), {\n children: [\n /*#__PURE__*/ jsxs(\"g\", {\n stroke: \"currentColor\",\n strokeLinejoin: \"round\",\n strokeOpacity: 0.65,\n strokeWidth: 1.5,\n clipPath: \"url(#magnifying-glass_svg__a)\",\n children: [\n /*#__PURE__*/ jsx(\"path\", {\n d: \"M8.397 14.29a6.375 6.375 0 1 0 0-12.75 6.375 6.375 0 0 0 0 12.75Z\"\n }),\n /*#__PURE__*/ jsx(\"path\", {\n strokeLinecap: \"round\",\n d: \"M10.519 5.42a3 3 0 0 0-2.122-.88 3 3 0 0 0-2.121.88M12.98 12.499l3.182 3.182\"\n })\n ]\n }),\n /*#__PURE__*/ jsx(\"defs\", {\n children: /*#__PURE__*/ jsx(\"clipPath\", {\n id: \"magnifying-glass_svg__a\",\n children: /*#__PURE__*/ jsx(\"path\", {\n fill: \"#fff\",\n d: \"M.522.04h18v18h-18z\"\n })\n })\n })\n ]\n }));\nconst magnifying_glass = SvgMagnifyingGlass;\nexport { magnifying_glass as default };\n","import { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nimport { Button, Input, Typography } from \"antd\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport icons_close from \"../../icons/close.mjs\";\nimport icons_history from \"../../icons/history.mjs\";\nimport magnifying_glass from \"../../icons/magnifying-glass.mjs\";\nimport { useHistoryStore } from \"../../store/history.mjs\";\nimport \"./index.css\";\nconst { Text } = Typography;\nconst HistorySelector = ({ onSelect, history, currentType })=>{\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [searchText, setSearchText] = useState('');\n const clearHistory = useHistoryStore((state)=>state.clearHistory);\n const modalRef = useRef(null);\n const groupedHistory = useMemo(()=>{\n const now = Date.now();\n const sevenDaysAgo = now - 604800000;\n const oneYearAgo = now - 31536000000;\n const filteredHistory = history.filter((item)=>item.prompt.toLowerCase().includes(searchText.toLowerCase()));\n const groups = {\n recent7Days: filteredHistory.filter((item)=>item.timestamp >= sevenDaysAgo),\n recent1Year: filteredHistory.filter((item)=>item.timestamp < sevenDaysAgo && item.timestamp >= oneYearAgo),\n older: filteredHistory.filter((item)=>item.timestamp < oneYearAgo)\n };\n return groups;\n }, [\n history,\n searchText\n ]);\n const handleHistoryClick = (item)=>{\n onSelect(item);\n setIsModalOpen(false);\n };\n const handleClearHistory = ()=>{\n clearHistory(currentType);\n setSearchText('');\n setIsModalOpen(false);\n };\n useEffect(()=>{\n if (!isModalOpen) return;\n const handleClickOutside = (event)=>{\n if (modalRef.current && !modalRef.current.contains(event.target)) setIsModalOpen(false);\n };\n const timer = setTimeout(()=>{\n document.addEventListener('click', handleClickOutside);\n }, 100);\n return ()=>{\n clearTimeout(timer);\n document.removeEventListener('click', handleClickOutside);\n };\n }, [\n isModalOpen\n ]);\n const renderHistoryGroup = (title, items)=>{\n if (0 === items.length) return null;\n return /*#__PURE__*/ jsxs(\"div\", {\n className: \"history-group\",\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"history-group-title\",\n children: title\n }),\n items.map((item, index)=>/*#__PURE__*/ jsx(\"div\", {\n className: \"history-item\",\n onClick: ()=>handleHistoryClick(item),\n children: item.prompt\n }, `${item.timestamp}-${index}`))\n ]\n }, title);\n };\n return /*#__PURE__*/ jsxs(\"div\", {\n className: \"history-selector-wrapper\",\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"selector-trigger\",\n onClick: ()=>setIsModalOpen(true),\n children: /*#__PURE__*/ jsx(icons_history, {\n width: 24,\n height: 24\n })\n }),\n isModalOpen && /*#__PURE__*/ jsx(\"div\", {\n className: \"history-modal-overlay\",\n ref: modalRef,\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"history-modal-container\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"history-modal-header\",\n children: [\n /*#__PURE__*/ jsxs(Text, {\n strong: true,\n style: {\n fontSize: '16px'\n },\n children: [\n \"History (\",\n history.length,\n \")\"\n ]\n }),\n /*#__PURE__*/ jsx(Button, {\n size: \"small\",\n type: \"text\",\n icon: /*#__PURE__*/ jsx(icons_close, {\n width: 16,\n height: 16\n }),\n onClick: ()=>setIsModalOpen(false),\n className: \"close-button\"\n })\n ]\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"history-search-section\",\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"search-input-wrapper\",\n children: [\n /*#__PURE__*/ jsx(Input, {\n placeholder: \"Search\",\n value: searchText,\n onChange: (e)=>setSearchText(e.target.value),\n prefix: /*#__PURE__*/ jsx(magnifying_glass, {\n width: 18,\n height: 18\n }),\n className: \"search-input\",\n allowClear: true\n }),\n /*#__PURE__*/ jsx(Button, {\n type: \"link\",\n onClick: handleClearHistory,\n className: \"clear-button\",\n disabled: 0 === history.length,\n children: \"Clear\"\n })\n ]\n })\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"history-content\",\n children: 0 === history.length ? /*#__PURE__*/ jsx(\"div\", {\n className: \"no-results\",\n children: /*#__PURE__*/ jsx(Text, {\n type: \"secondary\",\n children: \"No history record\"\n })\n }) : /*#__PURE__*/ jsxs(Fragment, {\n children: [\n renderHistoryGroup('Last 7 days', groupedHistory.recent7Days),\n renderHistoryGroup('Last 1 year', groupedHistory.recent1Year),\n renderHistoryGroup('Earlier', groupedHistory.older),\n searchText && 0 === groupedHistory.recent7Days.length && 0 === groupedHistory.recent1Year.length && 0 === groupedHistory.older.length && /*#__PURE__*/ jsx(\"div\", {\n className: \"no-results\",\n children: /*#__PURE__*/ jsx(Text, {\n type: \"secondary\",\n children: \"No matching history record\"\n })\n })\n ]\n })\n })\n ]\n })\n })\n ]\n });\n};\nexport { HistorySelector };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { BorderOutlined, DownOutlined, SendOutlined } from \"@ant-design/icons\";\nimport \"./index.css\";\nimport { Button, Dropdown, Form, Input, Radio, Tooltip } from \"antd\";\nimport react, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useHistoryStore } from \"../../store/history.mjs\";\nimport { extractDefaultValue, isLocateField, isZodObjectSchema, unwrapZodType } from \"../../types.mjs\";\nimport { apiMetadata, defaultMainButtons } from \"../../utils/constants.mjs\";\nimport { hasDeviceSpecificConfig } from \"../../utils/device-capabilities.mjs\";\nimport { actionNameForType, getPlaceholderForType, isRunButtonEnabled as playground_utils_mjs_isRunButtonEnabled } from \"../../utils/playground-utils.mjs\";\nimport { ConfigSelector } from \"../config-selector/index.mjs\";\nimport { BooleanField, EnumField, LocateField, NumberField, TextField } from \"../form-field/index.mjs\";\nimport { HistorySelector } from \"../history-selector/index.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nconst { TextArea } = Input;\nconst PromptInput = ({ runButtonEnabled, form, serviceMode, selectedType, dryMode, stoppable, loading, onRun, onStop, clearPromptAfterRun = true, actionSpace, hideDomAndScreenshotOptions = false, deviceType })=>{\n const [hoveringSettings, setHoveringSettings] = useState(false);\n const [promptValue, setPromptValue] = useState('');\n const placeholder = getPlaceholderForType(selectedType);\n const textAreaRef = useRef(null);\n const modeRadioGroupRef = useRef(null);\n const params = Form.useWatch('params', form);\n const lastHistoryRef = useRef(null);\n const history = useHistoryStore((state)=>state.history);\n const lastSelectedType = useHistoryStore((state)=>state.lastSelectedType);\n const addHistory = useHistoryStore((state)=>state.addHistory);\n const setLastSelectedType = useHistoryStore((state)=>state.setLastSelectedType);\n const historyForSelectedType = useMemo(()=>history[selectedType] || [], [\n history,\n selectedType\n ]);\n const needsStructuredParams = useMemo(()=>{\n if (actionSpace) {\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if (!(null == action ? void 0 : action.paramSchema)) return false;\n if (isZodObjectSchema(action.paramSchema)) {\n const schema = action.paramSchema;\n const shape = schema.shape || {};\n const shapeKeys = Object.keys(shape);\n return shapeKeys.length > 0;\n }\n return true;\n }\n return false;\n }, [\n selectedType,\n actionSpace\n ]);\n const needsAnyInput = useMemo(()=>{\n if (actionSpace && actionSpace.length > 0) {\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if (action) {\n if (action.paramSchema && isZodObjectSchema(action.paramSchema)) {\n const schema = action.paramSchema;\n const shape = schema.shape || {};\n const hasRequiredFields = Object.keys(shape).some((key)=>{\n const field = shape[key];\n const { isOptional } = unwrapZodType(field);\n return !isOptional;\n });\n return hasRequiredFields;\n }\n return !!action.paramSchema;\n }\n }\n return true;\n }, [\n selectedType,\n actionSpace\n ]);\n const showDataExtractionOptions = useMemo(()=>{\n const dataExtractionMethods = [\n 'aiQuery',\n 'aiBoolean',\n 'aiNumber',\n 'aiString',\n 'aiAsk',\n 'aiAssert'\n ];\n return dataExtractionMethods.includes(selectedType);\n }, [\n selectedType\n ]);\n const showDeepLocateOption = useMemo(()=>{\n if ('aiAct' === selectedType || 'aiLocate' === selectedType) return true;\n if (actionSpace) {\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {\n const schema = action.paramSchema;\n const shape = schema.shape || {};\n const hasLocateField = Object.keys(shape).some((key)=>{\n const field = shape[key];\n const { actualField } = unwrapZodType(field);\n return isLocateField(actualField);\n });\n return hasLocateField;\n }\n }\n return false;\n }, [\n selectedType,\n actionSpace\n ]);\n const showDeepThinkOption = useMemo(()=>'aiAct' === selectedType, [\n selectedType\n ]);\n const hasConfigOptions = useMemo(()=>{\n const hasTracking = 'In-Browser-Extension' === serviceMode;\n const hasDeepLocate = showDeepLocateOption;\n const hasDeepThink = showDeepThinkOption;\n const hasDataExtraction = showDataExtractionOptions && !hideDomAndScreenshotOptions;\n const hasDeviceOptions = hasDeviceSpecificConfig(deviceType);\n return hasTracking || hasDeepLocate || hasDeepThink || hasDataExtraction || hasDeviceOptions;\n }, [\n serviceMode,\n showDeepLocateOption,\n showDeepThinkOption,\n showDataExtractionOptions,\n hideDomAndScreenshotOptions,\n deviceType\n ]);\n const availableDropdownMethods = useMemo(()=>{\n const metadataMethods = Object.keys(apiMetadata);\n if (!actionSpace || 0 === actionSpace.length) return metadataMethods;\n const availableMethods = actionSpace.map((action)=>action.interfaceAlias || action.name);\n const finalMethods = new Set();\n metadataMethods.forEach((method)=>{\n const methodInfo = apiMetadata[method];\n if ((null == methodInfo ? void 0 : methodInfo.group) === 'extraction' || (null == methodInfo ? void 0 : methodInfo.group) === 'validation') finalMethods.add(method);\n else if (availableMethods.includes(method)) finalMethods.add(method);\n });\n availableMethods.forEach((method)=>{\n finalMethods.add(method);\n });\n return Array.from(finalMethods);\n }, [\n actionSpace\n ]);\n const getDefaultParams = useCallback(()=>{\n if (!needsStructuredParams || !actionSpace) return {};\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {\n const defaultParams = {};\n const schema = action.paramSchema;\n const shape = schema.shape || {};\n Object.keys(shape).forEach((key)=>{\n const field = shape[key];\n const defaultValue = extractDefaultValue(field);\n if (void 0 !== defaultValue) defaultParams[key] = defaultValue;\n });\n return defaultParams;\n }\n return {};\n }, [\n selectedType,\n needsStructuredParams,\n actionSpace\n ]);\n useEffect(()=>{\n if (!form.getFieldValue('type') && lastSelectedType) form.setFieldValue('type', lastSelectedType);\n }, [\n form,\n lastSelectedType\n ]);\n useEffect(()=>{\n if (selectedType && selectedType !== lastSelectedType) setLastSelectedType(selectedType);\n }, [\n selectedType,\n lastSelectedType,\n setLastSelectedType\n ]);\n const scrollToSelectedItem = useCallback(()=>{\n const container = modeRadioGroupRef.current;\n if (!container) return;\n let targetElement = null;\n const selectedRadioButton = container.querySelector('.ant-radio-button-wrapper-checked');\n const dropdownButton = container.querySelector('.more-apis-button.selected-from-dropdown');\n if (selectedRadioButton) targetElement = selectedRadioButton;\n else if (dropdownButton) targetElement = dropdownButton;\n if (targetElement) {\n const containerRect = container.getBoundingClientRect();\n const targetRect = targetElement.getBoundingClientRect();\n const targetLeft = targetRect.left - containerRect.left + container.scrollLeft;\n const targetWidth = targetRect.width;\n const containerWidth = containerRect.width;\n const optimalScrollLeft = targetLeft - (containerWidth - targetWidth) / 2;\n container.scrollTo({\n left: Math.max(0, optimalScrollLeft),\n behavior: 'smooth'\n });\n }\n }, []);\n useEffect(()=>{\n const lastHistory = historyForSelectedType[0];\n if (lastHistory && lastHistoryRef.current && lastHistory.timestamp === lastHistoryRef.current.timestamp) return;\n if (lastHistory) {\n form.setFieldsValue({\n type: lastHistory.type,\n prompt: lastHistory.prompt || '',\n params: lastHistory.params\n });\n setPromptValue(lastHistory.prompt || '');\n lastHistoryRef.current = lastHistory;\n } else {\n const defaultParams = getDefaultParams();\n form.setFieldsValue({\n prompt: '',\n params: defaultParams\n });\n setPromptValue('');\n lastHistoryRef.current = null;\n }\n }, [\n selectedType,\n historyForSelectedType,\n form,\n getDefaultParams\n ]);\n useEffect(()=>{\n const timeoutId = setTimeout(()=>{\n scrollToSelectedItem();\n }, 100);\n return ()=>clearTimeout(timeoutId);\n }, [\n selectedType,\n scrollToSelectedItem\n ]);\n const formPromptValue = Form.useWatch('prompt', form);\n useEffect(()=>{\n if (formPromptValue !== promptValue) setPromptValue(formPromptValue || '');\n }, [\n formPromptValue,\n promptValue\n ]);\n const handleSelectHistory = useCallback((historyItem)=>{\n form.setFieldsValue({\n prompt: historyItem.prompt,\n type: historyItem.type,\n params: historyItem.params\n });\n setPromptValue(historyItem.prompt);\n }, [\n form\n ]);\n const handlePromptChange = useCallback((e)=>{\n const value = e.target.value;\n setPromptValue(value);\n }, []);\n const hasSingleStructuredParam = useMemo(()=>{\n if (!needsStructuredParams || !actionSpace) return false;\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {\n const schema = action.paramSchema;\n const shape = schema.shape || {};\n return 1 === Object.keys(shape).length;\n }\n return false;\n }, [\n selectedType,\n needsStructuredParams,\n actionSpace\n ]);\n const isRunButtonEnabled = useMemo(()=>playground_utils_mjs_isRunButtonEnabled(runButtonEnabled, !!needsStructuredParams, params, actionSpace, selectedType, promptValue), [\n runButtonEnabled,\n needsStructuredParams,\n selectedType,\n actionSpace,\n promptValue,\n params\n ]);\n const handleRunWithHistory = useCallback(()=>{\n const values = form.getFieldsValue();\n let historyPrompt = '';\n if (needsStructuredParams && values.params && actionSpace) {\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {\n let locateValue = '';\n const otherValues = [];\n const schema = action.paramSchema;\n const shape = schema.shape || {};\n Object.keys(shape).forEach((key)=>{\n var _values_params;\n const paramValue = null == (_values_params = values.params) ? void 0 : _values_params[key];\n if (null != paramValue && '' !== paramValue) {\n const field = shape[key];\n const { actualField } = unwrapZodType(field);\n if (isLocateField(actualField)) locateValue = String(paramValue);\n else if ('distance' === key) otherValues.push(`${paramValue}`);\n else otherValues.push(String(paramValue));\n }\n });\n const mainPart = otherValues.join(' ');\n historyPrompt = locateValue ? `${locateValue} - ${mainPart}` : mainPart;\n } else historyPrompt = values.prompt || '';\n } else historyPrompt = values.prompt || '';\n const newHistoryItem = {\n type: values.type,\n prompt: historyPrompt,\n params: values.params,\n timestamp: Date.now()\n };\n addHistory(newHistoryItem);\n onRun();\n if (clearPromptAfterRun) {\n lastHistoryRef.current = newHistoryItem;\n setPromptValue('');\n if (needsStructuredParams) {\n const defaultParams = getDefaultParams();\n form.setFieldValue('params', defaultParams);\n } else form.setFieldValue('prompt', '');\n }\n }, [\n form,\n addHistory,\n onRun,\n needsStructuredParams,\n selectedType,\n clearPromptAfterRun,\n actionSpace,\n getDefaultParams\n ]);\n const handleKeyDown = useCallback((e)=>{\n if ('Enter' === e.key && e.metaKey && isRunButtonEnabled) {\n handleRunWithHistory();\n e.preventDefault();\n e.stopPropagation();\n } else if ('Enter' === e.key) setTimeout(()=>{\n if (textAreaRef.current) {\n var _textAreaRef_current_resizableTextArea;\n const textarea = null == (_textAreaRef_current_resizableTextArea = textAreaRef.current.resizableTextArea) ? void 0 : _textAreaRef_current_resizableTextArea.textArea;\n if (textarea) {\n const selectionStart = textarea.selectionStart;\n const value = textarea.value;\n const lastNewlineIndex = value.lastIndexOf('\\n');\n const isAtLastLine = -1 === lastNewlineIndex || selectionStart > lastNewlineIndex;\n if (isAtLastLine) textarea.scrollTop = textarea.scrollHeight;\n }\n }\n }, 0);\n }, [\n handleRunWithHistory,\n isRunButtonEnabled\n ]);\n const handleStructuredKeyDown = useCallback((e)=>{\n if ('Enter' === e.key && e.metaKey && isRunButtonEnabled) {\n handleRunWithHistory();\n e.preventDefault();\n e.stopPropagation();\n }\n }, [\n handleRunWithHistory,\n isRunButtonEnabled\n ]);\n const renderStructuredParams = useCallback(()=>{\n if (!needsStructuredParams) return null;\n if (actionSpace) {\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {\n const schema = action.paramSchema;\n const shape = schema.shape || {};\n const schemaKeys = Object.keys(shape);\n if (1 === schemaKeys.length) {\n const key = schemaKeys[0];\n const field = shape[key];\n const { actualField } = unwrapZodType(field);\n const isLocateFieldFlag = isLocateField(actualField);\n const placeholderText = (()=>{\n var _fieldWithRuntime__def;\n const fieldWithRuntime = actualField;\n if (null == (_fieldWithRuntime__def = fieldWithRuntime._def) ? void 0 : _fieldWithRuntime__def.description) return fieldWithRuntime._def.description;\n if (fieldWithRuntime.description) return fieldWithRuntime.description;\n if (actionSpace) {\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if ((null == action ? void 0 : action.paramSchema) && 'object' == typeof action.paramSchema && 'shape' in action.paramSchema) {\n var _fieldDef__def;\n const shape = action.paramSchema.shape || {};\n const fieldDef = shape[key];\n if (null == fieldDef ? void 0 : null == (_fieldDef__def = fieldDef._def) ? void 0 : _fieldDef__def.description) return fieldDef._def.description;\n if (null == fieldDef ? void 0 : fieldDef.description) return fieldDef.description;\n }\n }\n if (isLocateFieldFlag) return 'Describe the element you want to interact with';\n if ('keyName' === key) return 'Enter key name or text to type';\n if ('value' === key) return 'Enter text to input';\n return `Enter ${key}`;\n })();\n return /*#__PURE__*/ jsx(Form.Item, {\n name: [\n 'params',\n key\n ],\n style: {\n margin: 0\n },\n children: /*#__PURE__*/ jsx(Input.TextArea, {\n className: \"main-side-console-input-textarea\",\n rows: 3,\n placeholder: placeholderText,\n autoFocus: true,\n onKeyDown: handleStructuredKeyDown\n })\n });\n }\n const fields = [];\n const sortedKeys = schemaKeys.sort((keyA, keyB)=>{\n const fieldSchemaA = shape[keyA];\n const fieldSchemaB = shape[keyB];\n const { isOptional: isOptionalA } = unwrapZodType(fieldSchemaA);\n const { isOptional: isOptionalB } = unwrapZodType(fieldSchemaB);\n if (!isOptionalA && isOptionalB) return -1;\n if (isOptionalA && !isOptionalB) return 1;\n return 0;\n });\n sortedKeys.forEach((key, index)=>{\n var _actualField__def, _actualField__def1, _actualField__def2;\n const fieldSchema = shape[key];\n const { actualField, isOptional } = unwrapZodType(fieldSchema);\n const isLocateFieldFlag = isLocateField(actualField);\n const label = key.charAt(0).toUpperCase() + key.slice(1);\n const isRequired = !isOptional;\n const marginBottom = index === sortedKeys.length - 1 ? 0 : 12;\n const placeholder = (()=>{\n var _fieldWithRuntime__def;\n const fieldWithRuntime = actualField;\n if (null == (_fieldWithRuntime__def = fieldWithRuntime._def) ? void 0 : _fieldWithRuntime__def.description) return fieldWithRuntime._def.description;\n if (fieldWithRuntime.description) return fieldWithRuntime.description;\n if (actionSpace) {\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if ((null == action ? void 0 : action.paramSchema) && 'object' == typeof action.paramSchema && 'shape' in action.paramSchema) {\n var _fieldDef__def;\n const shape = action.paramSchema.shape || {};\n const fieldDef = shape[key];\n if (null == fieldDef ? void 0 : null == (_fieldDef__def = fieldDef._def) ? void 0 : _fieldDef__def.description) return fieldDef._def.description;\n if (null == fieldDef ? void 0 : fieldDef.description) return fieldDef.description;\n }\n }\n if (isLocateFieldFlag) return 'Describe the element you want to interact with';\n })();\n const fieldProps = {\n name: key,\n label,\n fieldSchema: actualField,\n isRequired,\n marginBottom,\n placeholder\n };\n if (isLocateFieldFlag) fields.push(/*#__PURE__*/ jsx(LocateField, _object_spread({}, fieldProps), key));\n else if ((null == (_actualField__def = actualField._def) ? void 0 : _actualField__def.typeName) === 'ZodEnum') fields.push(/*#__PURE__*/ jsx(EnumField, _object_spread({}, fieldProps), key));\n else if ((null == (_actualField__def1 = actualField._def) ? void 0 : _actualField__def1.typeName) === 'ZodNumber') fields.push(/*#__PURE__*/ jsx(NumberField, _object_spread({}, fieldProps), key));\n else if ((null == (_actualField__def2 = actualField._def) ? void 0 : _actualField__def2.typeName) === 'ZodBoolean') fields.push(/*#__PURE__*/ jsx(BooleanField, _object_spread({}, fieldProps), key));\n else fields.push(/*#__PURE__*/ jsx(TextField, _object_spread({}, fieldProps), key));\n });\n if ('aiScroll' === selectedType) {\n const directionField = fields.find((field)=>/*#__PURE__*/ react.isValidElement(field) && 'direction' === field.props.name);\n const distanceField = fields.find((field)=>/*#__PURE__*/ react.isValidElement(field) && 'distance' === field.props.name);\n const otherFields = fields.filter((field)=>/*#__PURE__*/ react.isValidElement(field) && 'direction' !== field.props.name && 'distance' !== field.props.name);\n if (directionField && distanceField) return /*#__PURE__*/ jsxs(\"div\", {\n className: \"structured-params\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n style: {\n display: 'flex',\n gap: 12,\n marginBottom: 12\n },\n children: [\n directionField,\n distanceField\n ]\n }),\n otherFields\n ]\n });\n }\n return /*#__PURE__*/ jsx(\"div\", {\n className: \"structured-params\",\n children: fields\n });\n }\n }\n return null;\n }, [\n selectedType,\n needsStructuredParams,\n actionSpace,\n handleStructuredKeyDown\n ]);\n const handleMouseEnter = useCallback(()=>{\n setHoveringSettings(true);\n }, []);\n const handleMouseLeave = useCallback(()=>{\n setHoveringSettings(false);\n }, []);\n const renderActionButton = useCallback(()=>{\n const runButton = (text)=>/*#__PURE__*/ jsx(Button, {\n type: \"primary\",\n icon: /*#__PURE__*/ jsx(SendOutlined, {}),\n style: {\n borderRadius: 20,\n zIndex: 999\n },\n onClick: handleRunWithHistory,\n disabled: !isRunButtonEnabled,\n loading: loading,\n children: text\n });\n if (dryMode) return 'aiAct' === selectedType ? /*#__PURE__*/ jsx(Tooltip, {\n title: \"Start executing until some interaction actions need to be performed. You can see the process of planning and locating.\",\n children: runButton('Dry Run')\n }) : runButton('Run');\n if (stoppable) return /*#__PURE__*/ jsx(Button, {\n icon: /*#__PURE__*/ jsx(BorderOutlined, {}),\n onClick: onStop,\n style: {\n borderRadius: 20,\n zIndex: 999\n },\n children: \"Stop\"\n });\n return runButton('Run');\n }, [\n dryMode,\n loading,\n handleRunWithHistory,\n onStop,\n isRunButtonEnabled,\n selectedType,\n stoppable\n ]);\n return /*#__PURE__*/ jsxs(\"div\", {\n className: \"prompt-input-wrapper\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"mode-radio-group-wrapper\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"mode-radio-group\",\n ref: modeRadioGroupRef,\n children: [\n /*#__PURE__*/ jsx(Form.Item, {\n name: \"type\",\n style: {\n margin: 0\n },\n children: /*#__PURE__*/ jsx(Radio.Group, {\n buttonStyle: \"solid\",\n disabled: !runButtonEnabled,\n children: defaultMainButtons.map((apiType)=>{\n var _apiMetadata_apiType;\n return /*#__PURE__*/ jsx(Tooltip, {\n title: (null == (_apiMetadata_apiType = apiMetadata[apiType]) ? void 0 : _apiMetadata_apiType.title) || '',\n children: /*#__PURE__*/ jsx(Radio.Button, {\n value: apiType,\n children: actionNameForType(apiType)\n })\n }, apiType);\n })\n })\n }),\n /*#__PURE__*/ jsx(Dropdown, {\n menu: (()=>{\n const hiddenAPIs = availableDropdownMethods.filter((api)=>!defaultMainButtons.includes(api));\n const groupedItems = [];\n const interactionAPIs = hiddenAPIs.filter((api)=>{\n var _apiMetadata_api;\n return (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.group) === 'interaction';\n });\n if (interactionAPIs.length > 0) groupedItems.push({\n key: 'interaction-group',\n type: 'group',\n label: 'Interaction APIs',\n children: interactionAPIs.map((api)=>{\n var _apiMetadata_api;\n return {\n key: api,\n label: actionNameForType(api),\n title: (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.title) || '',\n onClick: ()=>{\n form.setFieldValue('type', api);\n }\n };\n })\n });\n const extractionAPIs = hiddenAPIs.filter((api)=>{\n var _apiMetadata_api;\n return (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.group) === 'extraction';\n });\n if (extractionAPIs.length > 0) groupedItems.push({\n key: 'extraction-group',\n type: 'group',\n label: 'Data Extraction APIs',\n children: extractionAPIs.map((api)=>{\n var _apiMetadata_api;\n return {\n key: api,\n label: actionNameForType(api),\n title: (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.title) || '',\n onClick: ()=>{\n form.setFieldValue('type', api);\n }\n };\n })\n });\n const validationAPIs = hiddenAPIs.filter((api)=>{\n var _apiMetadata_api;\n return (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.group) === 'validation';\n });\n if (validationAPIs.length > 0) groupedItems.push({\n key: 'validation-group',\n type: 'group',\n label: 'Validation APIs',\n children: validationAPIs.map((api)=>{\n var _apiMetadata_api;\n return {\n key: api,\n label: actionNameForType(api),\n title: (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.title) || '',\n onClick: ()=>{\n form.setFieldValue('type', api);\n }\n };\n })\n });\n const deviceSpecificAPIs = hiddenAPIs.filter((api)=>!apiMetadata[api]);\n if (deviceSpecificAPIs.length > 0) groupedItems.push({\n key: 'device-specific-group',\n type: 'group',\n label: 'Device-Specific APIs',\n children: deviceSpecificAPIs.map((api)=>({\n key: api,\n label: actionNameForType(api),\n title: '',\n onClick: ()=>{\n form.setFieldValue('type', api);\n }\n }))\n });\n return {\n items: groupedItems\n };\n })(),\n placement: \"bottomLeft\",\n trigger: [\n 'click'\n ],\n disabled: !runButtonEnabled,\n overlayClassName: \"more-apis-dropdown\",\n children: /*#__PURE__*/ jsxs(Button, {\n className: `more-apis-button ${!defaultMainButtons.includes(selectedType) ? 'selected-from-dropdown' : ''}`,\n children: [\n selectedType && !defaultMainButtons.includes(selectedType) ? actionNameForType(selectedType) : 'more',\n /*#__PURE__*/ jsx(DownOutlined, {\n style: {\n fontSize: '10px',\n marginLeft: '2px'\n }\n })\n ]\n })\n })\n ]\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"action-icons\",\n children: [\n hasConfigOptions && /*#__PURE__*/ jsx(\"div\", {\n className: hoveringSettings ? 'settings-wrapper settings-wrapper-hover' : 'settings-wrapper',\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n children: /*#__PURE__*/ jsx(ConfigSelector, {\n enableTracking: 'In-Browser-Extension' === serviceMode,\n showDeepLocateOption: showDeepLocateOption,\n showDeepThinkOption: showDeepThinkOption,\n showDataExtractionOptions: showDataExtractionOptions,\n hideDomAndScreenshotOptions: hideDomAndScreenshotOptions,\n deviceType: deviceType\n })\n }),\n /*#__PURE__*/ jsx(HistorySelector, {\n onSelect: handleSelectHistory,\n history: historyForSelectedType,\n currentType: selectedType\n })\n ]\n })\n ]\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n className: `main-side-console-input ${!runButtonEnabled ? 'disabled' : ''} ${loading ? 'loading' : ''}`,\n children: [\n needsAnyInput ? needsStructuredParams ? hasSingleStructuredParam ? renderStructuredParams() : /*#__PURE__*/ jsx(\"div\", {\n className: \"structured-params-container\",\n children: renderStructuredParams()\n }) : /*#__PURE__*/ jsx(Form.Item, {\n name: \"prompt\",\n style: {\n margin: 0\n },\n children: /*#__PURE__*/ jsx(TextArea, {\n className: \"main-side-console-input-textarea\",\n disabled: !runButtonEnabled,\n rows: 3,\n placeholder: placeholder,\n autoFocus: true,\n onKeyDown: handleKeyDown,\n onChange: handlePromptChange,\n ref: textAreaRef\n })\n }) : /*#__PURE__*/ jsxs(\"div\", {\n className: \"no-input-method\",\n style: {\n padding: '20px',\n textAlign: 'center',\n color: '#666',\n fontSize: '14px'\n },\n children: [\n 'Click \"Run\" to execute ',\n actionNameForType(selectedType)\n ]\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"form-controller-wrapper\",\n children: renderActionButton()\n })\n ]\n })\n ]\n });\n};\nexport { PromptInput };\n","import { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nimport icons, { ArrowDownOutlined, ClearOutlined, LoadingOutlined } from \"@ant-design/icons\";\nimport { Alert, Button, Form, List, Typography, message } from \"antd\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { usePlaygroundExecution } from \"../../hooks/usePlaygroundExecution.mjs\";\nimport { usePlaygroundState } from \"../../hooks/usePlaygroundState.mjs\";\nimport { useEnvConfig } from \"../../store/store.mjs\";\nimport { ContextPreview } from \"../context-preview/index.mjs\";\nimport { EnvConfigReminder } from \"../env-config-reminder/index.mjs\";\nimport { PlaygroundResultView } from \"../playground-result/index.mjs\";\nimport \"./index.css\";\nimport avatar from \"../../icons/avatar.mjs\";\nimport { defaultMainButtons } from \"../../utils/constants.mjs\";\nimport { PromptInput } from \"../prompt-input/index.mjs\";\nimport shiny_text from \"../shiny-text/index.mjs\";\nimport { createStorageProvider, detectBestStorageType } from \"./providers/storage-provider.mjs\";\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(void 0);\n });\n };\n}\nconst { Text } = Typography;\nfunction getSDKId(sdk) {\n if (!sdk) return 'playground-default';\n if (sdk.id && 'string' == typeof sdk.id) return `agent-${sdk.id}`;\n return 'playground-default';\n}\nfunction ErrorMessage({ error }) {\n if (!error) return null;\n const cleanError = error.replace(/^(Error:\\s*)+/, 'Error: ');\n return /*#__PURE__*/ jsx(Alert, {\n message: /*#__PURE__*/ jsx(\"span\", {\n style: {\n color: '#ff4d4f'\n },\n children: cleanError\n }),\n type: \"error\",\n showIcon: true\n });\n}\nfunction UniversalPlayground({ playgroundSDK, storage, contextProvider, config: componentConfig = {}, branding = {}, className = '', dryMode = false, showContextPreview = true }) {\n const [form] = Form.useForm();\n const { config } = useEnvConfig();\n const [sdkReady, setSdkReady] = useState(false);\n useEffect(()=>{\n form.setFieldsValue({\n type: defaultMainButtons[\"0\"]\n });\n }, [\n form\n ]);\n useEffect(()=>{\n const initializeSDK = ()=>_async_to_generator(function*() {\n if (playgroundSDK && 'function' == typeof playgroundSDK.checkStatus) try {\n yield playgroundSDK.checkStatus();\n setSdkReady(true);\n } catch (error) {\n console.warn('Failed to initialize SDK, using default namespace:', error);\n setSdkReady(true);\n }\n else setSdkReady(true);\n })();\n initializeSDK();\n }, [\n playgroundSDK\n ]);\n const effectiveStorage = useMemo(()=>{\n if (storage) return storage;\n if (!sdkReady) return null;\n const namespace = componentConfig.storageNamespace || getSDKId(playgroundSDK);\n const bestStorageType = detectBestStorageType();\n console.log(`Using ${bestStorageType} storage for namespace: ${namespace}`);\n return createStorageProvider(bestStorageType, namespace);\n }, [\n storage,\n sdkReady,\n componentConfig.storageNamespace,\n playgroundSDK\n ]);\n const { loading, setLoading, infoList, setInfoList, actionSpace, actionSpaceLoading, uiContextPreview, setUiContextPreview, showScrollToBottomButton, verticalMode, replayCounter, setReplayCounter, infoListRef, currentRunningIdRef, interruptedFlagRef, clearInfoList, handleScrollToBottom } = usePlaygroundState(playgroundSDK, effectiveStorage, contextProvider, branding.targetName);\n const { handleRun: executeAction, handleStop, canStop } = usePlaygroundExecution({\n playgroundSDK,\n storage: effectiveStorage,\n actionSpace,\n loading,\n setLoading,\n setInfoList,\n replayCounter,\n setReplayCounter,\n verticalMode,\n currentRunningIdRef,\n interruptedFlagRef,\n deviceType: componentConfig.deviceType\n });\n useEffect(()=>{\n if ((null == playgroundSDK ? void 0 : playgroundSDK.overrideConfig) && config) playgroundSDK.overrideConfig(config).catch((error)=>{\n console.error('Failed to override SDK config:', error);\n const errorMsg = error instanceof Error ? error.message : String(error);\n message.error(`Failed to apply AI configuration: ${errorMsg}`);\n });\n }, [\n playgroundSDK,\n config\n ]);\n const handleFormRun = useCallback(()=>_async_to_generator(function*() {\n try {\n const value = form.getFieldsValue();\n yield executeAction(value);\n } catch (error) {\n message.error((null == error ? void 0 : error.message) || 'Execution failed');\n }\n })(), [\n form,\n executeAction\n ]);\n const configAlreadySet = Object.keys(config || {}).length >= 1;\n const runButtonEnabled = componentConfig.serverMode || !dryMode && !actionSpaceLoading && configAlreadySet;\n const selectedType = Form.useWatch('type', form);\n const serviceMode = useMemo(()=>{\n if (!playgroundSDK || 'function' != typeof playgroundSDK.getServiceMode) return 'Server';\n return playgroundSDK.getServiceMode();\n }, [\n playgroundSDK\n ]);\n const finalShowContextPreview = showContextPreview && false !== componentConfig.showContextPreview;\n const layout = componentConfig.layout || 'vertical';\n const showVersionInfo = false !== componentConfig.showVersionInfo;\n const deviceType = componentConfig.deviceType;\n return /*#__PURE__*/ jsx(\"div\", {\n className: `playground-container ${layout}-mode ${className}`.trim(),\n children: /*#__PURE__*/ jsxs(Form, {\n form: form,\n onFinish: handleFormRun,\n className: \"command-form\",\n children: [\n finalShowContextPreview && /*#__PURE__*/ jsx(\"div\", {\n className: \"context-preview-section\",\n children: /*#__PURE__*/ jsx(ContextPreview, {\n uiContextPreview: uiContextPreview,\n setUiContextPreview: setUiContextPreview,\n showContextPreview: finalShowContextPreview\n })\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"middle-dialog-area\",\n children: [\n infoList.length > 1 && /*#__PURE__*/ jsx(\"div\", {\n className: \"clear-button-container\",\n children: /*#__PURE__*/ jsx(Button, {\n size: \"small\",\n icon: /*#__PURE__*/ jsx(ClearOutlined, {}),\n onClick: clearInfoList,\n type: \"text\",\n className: \"clear-button\"\n })\n }),\n /*#__PURE__*/ jsx(\"div\", {\n ref: infoListRef,\n className: \"info-list-container\",\n children: /*#__PURE__*/ jsx(List, {\n itemLayout: \"vertical\",\n dataSource: infoList,\n renderItem: (item)=>/*#__PURE__*/ jsx(List.Item, {\n className: \"list-item\",\n children: 'user' === item.type ? /*#__PURE__*/ jsx(\"div\", {\n className: \"user-message-container\",\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"user-message-bubble\",\n children: item.content\n })\n }) : 'progress' === item.type ? /*#__PURE__*/ jsx(\"div\", {\n children: (()=>{\n var _parts_, _item_result, _item_result1, _item_result2;\n const parts = item.content.split(' - ');\n const action = null == (_parts_ = parts[0]) ? void 0 : _parts_.trim();\n const description = parts.slice(1).join(' - ').trim();\n const currentIndex = infoList.findIndex((listItem)=>listItem.id === item.id);\n const laterProgressExists = infoList.slice(currentIndex + 1).some((listItem)=>'progress' === listItem.type);\n const isLatestProgress = !laterProgressExists;\n const shouldShowLoading = loading && isLatestProgress;\n return /*#__PURE__*/ jsxs(Fragment, {\n children: [\n action && /*#__PURE__*/ jsxs(\"span\", {\n className: \"progress-action-item\",\n children: [\n action,\n /*#__PURE__*/ jsx(\"span\", {\n className: `progress-status-icon ${shouldShowLoading ? 'loading' : (null == (_item_result = item.result) ? void 0 : _item_result.error) ? 'error' : 'completed'}`,\n children: shouldShowLoading ? /*#__PURE__*/ jsx(LoadingOutlined, {\n spin: true\n }) : (null == (_item_result1 = item.result) ? void 0 : _item_result1.error) ? '✗' : '✓'\n })\n ]\n }),\n description && /*#__PURE__*/ jsx(\"div\", {\n children: /*#__PURE__*/ jsx(shiny_text, {\n text: description,\n className: \"progress-description\",\n disabled: !shouldShowLoading\n })\n }),\n (null == (_item_result2 = item.result) ? void 0 : _item_result2.error) && /*#__PURE__*/ jsx(ErrorMessage, {\n error: item.result.error\n })\n ]\n });\n })()\n }) : 'separator' === item.type ? /*#__PURE__*/ jsxs(\"div\", {\n className: \"new-conversation-separator\",\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"separator-line\"\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"separator-text-container\",\n children: /*#__PURE__*/ jsx(Text, {\n type: \"secondary\",\n className: \"separator-text\",\n children: item.content\n })\n })\n ]\n }) : /*#__PURE__*/ jsxs(\"div\", {\n className: \"system-message-container\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"system-message-header\",\n children: [\n /*#__PURE__*/ jsx(icons, {\n component: branding.icon || avatar,\n style: {\n fontSize: 20\n }\n }),\n /*#__PURE__*/ jsx(\"span\", {\n className: \"system-message-title\",\n children: branding.title || 'Playground'\n })\n ]\n }),\n (item.content || item.result) && /*#__PURE__*/ jsx(\"div\", {\n className: \"system-message-content\",\n children: 'result' === item.type ? /*#__PURE__*/ jsx(PlaygroundResultView, {\n result: item.result || null,\n loading: item.loading || false,\n serverValid: true,\n serviceMode: serviceMode,\n replayScriptsInfo: item.replayScriptsInfo || null,\n replayCounter: item.replayCounter || 0,\n loadingProgressText: item.loadingProgressText || '',\n verticalMode: item.verticalMode || false,\n fitMode: \"width\",\n actionType: item.actionType\n }) : /*#__PURE__*/ jsxs(Fragment, {\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"system-message-text\",\n children: item.content\n }),\n item.loading && item.loadingProgressText && /*#__PURE__*/ jsx(\"div\", {\n className: \"loading-progress-text\",\n children: /*#__PURE__*/ jsx(\"span\", {\n children: item.loadingProgressText\n })\n })\n ]\n })\n })\n ]\n })\n }, item.id)\n })\n }),\n showScrollToBottomButton && false !== componentConfig.enableScrollToBottom && /*#__PURE__*/ jsx(Button, {\n className: \"scroll-to-bottom-button\",\n type: \"primary\",\n shape: \"circle\",\n icon: /*#__PURE__*/ jsx(ArrowDownOutlined, {}),\n onClick: handleScrollToBottom,\n size: \"large\"\n })\n ]\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"bottom-input-section\",\n children: [\n componentConfig.showEnvConfigReminder ? /*#__PURE__*/ jsx(EnvConfigReminder, {}) : null,\n /*#__PURE__*/ jsx(PromptInput, {\n runButtonEnabled: runButtonEnabled,\n form: form,\n serviceMode: serviceMode,\n selectedType: selectedType,\n dryMode: dryMode,\n stoppable: canStop,\n loading: loading,\n onRun: handleFormRun,\n onStop: handleStop,\n actionSpace: actionSpace,\n deviceType: deviceType\n })\n ]\n }),\n showVersionInfo && branding.version && /*#__PURE__*/ jsx(\"div\", {\n className: \"version-info-section\",\n children: /*#__PURE__*/ jsxs(\"span\", {\n className: \"version-text\",\n children: [\n \"Midscene.js version: \",\n branding.version\n ]\n })\n })\n ]\n })\n });\n}\nconst universal_playground = UniversalPlayground;\nexport { UniversalPlayground, universal_playground as default };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { InfoCircleOutlined, ReloadOutlined } from \"@ant-design/icons\";\nimport { Button, Spin, Tooltip } from \"antd\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport \"./index.css\";\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(void 0);\n });\n };\n}\nfunction ScreenshotViewer({ getScreenshot, getInterfaceInfo, serverOnline, isUserOperating = false, mjpegUrl }) {\n const [screenshot, setScreenshot] = useState(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n const [lastUpdateTime, setLastUpdateTime] = useState(0);\n const [interfaceInfo, setInterfaceInfo] = useState(null);\n const isMjpeg = Boolean(mjpegUrl && serverOnline);\n const pollingIntervalRef = useRef(null);\n const isPollingPausedRef = useRef(false);\n const fetchScreenshot = useCallback((isManual = false)=>_async_to_generator(function*() {\n if (!serverOnline) return;\n setLoading(true);\n if (isManual) setError(null);\n try {\n const result = yield getScreenshot();\n console.log('Screenshot API response:', result);\n if (null == result ? void 0 : result.screenshot) {\n const screenshotData = result.screenshot.toString().trim();\n if (screenshotData) {\n setScreenshot(screenshotData);\n setError(null);\n setLastUpdateTime(Date.now());\n } else setError('Empty screenshot data received');\n } else setError('No screenshot data in response');\n } catch (err) {\n console.error('Screenshot fetch error:', err);\n setError(err instanceof Error ? err.message : 'Failed to fetch screenshot');\n } finally{\n setLoading(false);\n }\n })(), [\n getScreenshot,\n serverOnline\n ]);\n const fetchInterfaceInfo = useCallback(()=>_async_to_generator(function*() {\n if (!serverOnline || !getInterfaceInfo) return;\n try {\n const info = yield getInterfaceInfo();\n if (info) setInterfaceInfo(info);\n } catch (err) {\n console.error('Interface info fetch error:', err);\n }\n })(), [\n getInterfaceInfo,\n serverOnline\n ]);\n const startPolling = useCallback(()=>{\n if (pollingIntervalRef.current) clearInterval(pollingIntervalRef.current);\n console.log('Starting screenshot polling (5s interval)');\n pollingIntervalRef.current = setInterval(()=>{\n if (!isPollingPausedRef.current && serverOnline) fetchScreenshot(false);\n }, 5000);\n }, [\n fetchScreenshot,\n serverOnline\n ]);\n const stopPolling = useCallback(()=>{\n if (pollingIntervalRef.current) {\n console.log('Stopping screenshot polling');\n clearInterval(pollingIntervalRef.current);\n pollingIntervalRef.current = null;\n }\n }, []);\n const pausePolling = useCallback(()=>{\n console.log('Pausing screenshot polling');\n isPollingPausedRef.current = true;\n }, []);\n const resumePolling = useCallback(()=>{\n console.log('Resuming screenshot polling');\n isPollingPausedRef.current = false;\n }, []);\n const handleManualRefresh = useCallback(()=>{\n fetchScreenshot(true);\n }, [\n fetchScreenshot\n ]);\n useEffect(()=>{\n if (!serverOnline) {\n setScreenshot(null);\n setError(null);\n setInterfaceInfo(null);\n stopPolling();\n return;\n }\n fetchInterfaceInfo();\n if (isMjpeg) return void stopPolling();\n fetchScreenshot(false);\n startPolling();\n return ()=>{\n stopPolling();\n };\n }, [\n serverOnline,\n isMjpeg,\n startPolling,\n stopPolling,\n fetchScreenshot,\n fetchInterfaceInfo\n ]);\n useEffect(()=>{\n if (!serverOnline) return;\n if (isUserOperating) pausePolling();\n else {\n resumePolling();\n fetchScreenshot(false);\n }\n }, [\n isUserOperating,\n pausePolling,\n resumePolling,\n fetchScreenshot,\n serverOnline\n ]);\n useEffect(()=>()=>{\n stopPolling();\n }, [\n stopPolling\n ]);\n if (!serverOnline) return /*#__PURE__*/ jsx(\"div\", {\n className: \"screenshot-viewer offline\",\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"screenshot-placeholder\",\n children: [\n /*#__PURE__*/ jsx(\"h3\", {\n children: \"\\uD83D\\uDCF1 Screen Preview\"\n }),\n /*#__PURE__*/ jsx(\"p\", {\n children: \"Start the playground server to see real-time screenshots\"\n })\n ]\n })\n });\n if (!isMjpeg && loading && !screenshot) return /*#__PURE__*/ jsxs(\"div\", {\n className: \"screenshot-viewer loading\",\n children: [\n /*#__PURE__*/ jsx(Spin, {\n size: \"large\"\n }),\n /*#__PURE__*/ jsx(\"p\", {\n children: \"Loading screenshot...\"\n })\n ]\n });\n if (!isMjpeg && error && !screenshot) return /*#__PURE__*/ jsx(\"div\", {\n className: \"screenshot-viewer error\",\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"screenshot-placeholder\",\n children: [\n /*#__PURE__*/ jsx(\"h3\", {\n children: \"\\uD83D\\uDCF1 Screen Preview\"\n }),\n /*#__PURE__*/ jsx(\"p\", {\n className: \"error-message\",\n children: error\n })\n ]\n })\n });\n const formatLastUpdateTime = (timestamp)=>{\n if (!timestamp) return '';\n const now = Date.now();\n const diff = Math.floor((now - timestamp) / 1000);\n if (diff < 60) return `${diff}s ago`;\n if (diff < 3600) return `${Math.floor(diff / 60)}m ago`;\n return new Date(timestamp).toLocaleTimeString();\n };\n return /*#__PURE__*/ jsxs(\"div\", {\n className: \"screenshot-viewer\",\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"screenshot-header\",\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"screenshot-title\",\n children: /*#__PURE__*/ jsx(\"h3\", {\n children: (null == interfaceInfo ? void 0 : interfaceInfo.type) ? interfaceInfo.type : 'Device Name'\n })\n })\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"screenshot-container\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"screenshot-overlay\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"device-name-overlay\",\n children: [\n \"Device Name\",\n /*#__PURE__*/ jsx(Tooltip, {\n title: null == interfaceInfo ? void 0 : interfaceInfo.description,\n children: /*#__PURE__*/ jsx(InfoCircleOutlined, {\n size: 16,\n className: \"info-icon\"\n })\n })\n ]\n }),\n !isMjpeg && /*#__PURE__*/ jsxs(\"div\", {\n className: \"screenshot-controls\",\n children: [\n lastUpdateTime > 0 && /*#__PURE__*/ jsxs(\"span\", {\n className: \"last-update-time\",\n children: [\n \"Last updated \",\n formatLastUpdateTime(lastUpdateTime)\n ]\n }),\n /*#__PURE__*/ jsx(Tooltip, {\n title: \"Refresh screenshot\",\n children: /*#__PURE__*/ jsx(Button, {\n icon: /*#__PURE__*/ jsx(ReloadOutlined, {}),\n onClick: handleManualRefresh,\n loading: loading,\n size: \"small\"\n })\n }),\n isUserOperating && /*#__PURE__*/ jsxs(\"span\", {\n className: \"operation-indicator\",\n children: [\n /*#__PURE__*/ jsx(Spin, {\n size: \"small\"\n }),\n \" Operating...\"\n ]\n })\n ]\n })\n ]\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"screenshot-content\",\n children: isMjpeg ? /*#__PURE__*/ jsx(\"img\", {\n src: mjpegUrl,\n alt: \"Device Live Stream\",\n className: \"screenshot-image\"\n }) : screenshot ? /*#__PURE__*/ jsx(\"img\", {\n src: screenshot.startsWith('data:image/') ? screenshot : `data:image/png;base64,${screenshot}`,\n alt: \"Device Screenshot\",\n className: \"screenshot-image\",\n onLoad: ()=>console.log('Screenshot image loaded successfully'),\n onError: (e)=>{\n console.error('Screenshot image load error:', e);\n console.error('Screenshot data preview:', screenshot.substring(0, 100));\n setError('Failed to load screenshot image');\n }\n }) : /*#__PURE__*/ jsx(\"div\", {\n className: \"screenshot-placeholder\",\n children: /*#__PURE__*/ jsx(\"p\", {\n children: \"No screenshot available\"\n })\n })\n })\n ]\n })\n ]\n });\n}\nexport { ScreenshotViewer as default };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { ScrcpyVideoCodecId } from \"@yume-chan/scrcpy\";\nimport { BitmapVideoFrameRenderer, WebCodecsVideoDecoder, WebGLVideoFrameRenderer } from \"@yume-chan/scrcpy-decoder-webcodecs\";\nimport { Alert, Button, Card, Space, Spin, Typography } from \"antd\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { io } from \"socket.io-client\";\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(void 0);\n });\n };\n}\nconst { Text } = Typography;\nfunction ScrcpyPanel({ serverUrl, reconnectInterval = 3000 }) {\n const canvasStageRef = useRef(null);\n const socketRef = useRef(null);\n const decoderRef = useRef(null);\n const reconnectTimerRef = useRef(null);\n const connectRef = useRef(null);\n const disconnectRef = useRef(null);\n const manuallyDisconnectedRef = useRef(false);\n const [status, setStatus] = useState('connecting');\n const [errorMessage, setErrorMessage] = useState(null);\n const [screenInfo, setScreenInfo] = useState(null);\n const [webCodecsSupported, setWebCodecsSupported] = useState(true);\n const statusText = useMemo(()=>{\n switch(status){\n case 'connected':\n return 'Live scrcpy preview connected';\n case 'error':\n return 'Unable to start scrcpy preview';\n case 'disconnected':\n return 'scrcpy preview disconnected, retrying…';\n default:\n return 'Connecting to scrcpy preview…';\n }\n }, [\n status\n ]);\n const clearCanvas = ()=>{\n const stage = canvasStageRef.current;\n if (!stage) return;\n stage.replaceChildren();\n };\n const disposeDecoder = ()=>{\n if (!decoderRef.current) return;\n decoderRef.current.dispose();\n decoderRef.current = null;\n };\n const handleConnect = useCallback(()=>{\n var _connectRef_current;\n manuallyDisconnectedRef.current = false;\n null == (_connectRef_current = connectRef.current) || _connectRef_current.call(connectRef);\n }, []);\n const handleDisconnect = useCallback(()=>{\n var _disconnectRef_current;\n manuallyDisconnectedRef.current = true;\n null == (_disconnectRef_current = disconnectRef.current) || _disconnectRef_current.call(disconnectRef);\n }, []);\n useEffect(()=>{\n if (!serverUrl) {\n setStatus('error');\n setErrorMessage('scrcpy preview metadata is missing a server URL.');\n return;\n }\n if (!WebCodecsVideoDecoder.isSupported) {\n setWebCodecsSupported(false);\n setStatus('error');\n setErrorMessage('Current browser does not support WebCodecs, so live scrcpy preview is unavailable.');\n return;\n }\n let disposed = false;\n const cleanup = ()=>{\n if (reconnectTimerRef.current) {\n clearTimeout(reconnectTimerRef.current);\n reconnectTimerRef.current = null;\n }\n if (socketRef.current) {\n socketRef.current.disconnect();\n socketRef.current = null;\n }\n disposeDecoder();\n clearCanvas();\n };\n const scheduleReconnect = ()=>{\n if (disposed || reconnectTimerRef.current || manuallyDisconnectedRef.current) return;\n reconnectTimerRef.current = setTimeout(()=>{\n reconnectTimerRef.current = null;\n cleanup();\n connect();\n }, reconnectInterval);\n };\n const createDecoder = (codecId)=>_async_to_generator(function*() {\n var _canvasStageRef_current;\n const renderer = WebGLVideoFrameRenderer.isSupported ? new WebGLVideoFrameRenderer() : new BitmapVideoFrameRenderer();\n const canvas = renderer.canvas;\n canvas.style.width = '100%';\n canvas.style.height = '100%';\n canvas.style.objectFit = 'contain';\n clearCanvas();\n null == (_canvasStageRef_current = canvasStageRef.current) || _canvasStageRef_current.appendChild(canvas);\n const decoder = new WebCodecsVideoDecoder({\n codec: codecId,\n renderer\n });\n decoder.sizeChanged(({ width, height })=>{\n setScreenInfo({\n width,\n height\n });\n });\n return decoder;\n })();\n const setupVideoStream = ()=>{\n const socket = socketRef.current;\n let configurationPacketSent = false;\n let pendingDataPackets = [];\n const transformStream = new TransformStream({\n transform (chunk, controller) {\n const packet = {\n type: chunk.type,\n data: new Uint8Array(chunk.data),\n timestamp: chunk.timestamp\n };\n if ('configuration' === packet.type) {\n configurationPacketSent = true;\n controller.enqueue(packet);\n pendingDataPackets.forEach((queuedPacket)=>controller.enqueue(queuedPacket));\n pendingDataPackets = [];\n return;\n }\n if ('data' === packet.type && !configurationPacketSent) return void pendingDataPackets.push(packet);\n controller.enqueue(packet);\n }\n });\n let cleanupListeners;\n const readable = new ReadableStream({\n start (controller) {\n const handleVideoData = (data)=>{\n try {\n controller.enqueue(data);\n } catch (error) {\n controller.error(error);\n }\n };\n const handleDisconnect = ()=>controller.close();\n const handleError = (error)=>controller.error(error);\n cleanupListeners = ()=>{\n null == socket || socket.off('video-data', handleVideoData);\n null == socket || socket.off('disconnect', handleDisconnect);\n null == socket || socket.off('error', handleError);\n };\n null == socket || socket.on('video-data', handleVideoData);\n null == socket || socket.on('disconnect', handleDisconnect);\n null == socket || socket.on('error', handleError);\n },\n cancel () {\n null == cleanupListeners || cleanupListeners();\n }\n });\n return readable.pipeThrough(transformStream);\n };\n const connect = ()=>{\n if (disposed) return;\n manuallyDisconnectedRef.current = false;\n setStatus('connecting');\n setErrorMessage(null);\n setScreenInfo(null);\n const socket = io(serverUrl, {\n withCredentials: true,\n reconnection: false,\n timeout: 10000\n });\n socketRef.current = socket;\n socket.on('connect', ()=>{\n socket.emit('connect-device', {\n maxSize: 1024\n });\n });\n socket.on('video-metadata', (metadata)=>_async_to_generator(function*() {\n try {\n disposeDecoder();\n const codecId = metadata.codec ? metadata.codec : ScrcpyVideoCodecId.H264;\n const decoder = yield createDecoder(codecId);\n decoderRef.current = decoder;\n if (metadata.width && metadata.height) setScreenInfo({\n width: metadata.width,\n height: metadata.height\n });\n setupVideoStream().pipeTo(decoder.writable).catch((error)=>{\n if (disposed) return;\n setStatus('error');\n setErrorMessage(error.message);\n scheduleReconnect();\n });\n setStatus('connected');\n } catch (error) {\n if (disposed) return;\n setStatus('error');\n setErrorMessage(error instanceof Error ? error.message : 'Failed to start decoder.');\n scheduleReconnect();\n }\n })());\n socket.on('disconnect', ()=>{\n if (disposed) return;\n setStatus('disconnected');\n scheduleReconnect();\n });\n socket.on('connect_error', (error)=>{\n if (disposed) return;\n setStatus('error');\n setErrorMessage(error.message);\n scheduleReconnect();\n });\n socket.on('error', (error)=>{\n if (disposed) return;\n setStatus('error');\n setErrorMessage(error.message);\n scheduleReconnect();\n });\n };\n const disconnect = ()=>{\n cleanup();\n setStatus('disconnected');\n setErrorMessage(null);\n setScreenInfo(null);\n };\n connectRef.current = connect;\n disconnectRef.current = disconnect;\n connect();\n return ()=>{\n disposed = true;\n connectRef.current = null;\n disconnectRef.current = null;\n cleanup();\n };\n }, [\n reconnectInterval,\n serverUrl\n ]);\n return /*#__PURE__*/ jsxs(Card, {\n size: \"small\",\n title: \"Live scrcpy preview\",\n style: {\n height: '100%',\n display: 'flex',\n flexDirection: 'column'\n },\n styles: {\n body: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0\n }\n },\n extra: /*#__PURE__*/ jsxs(Space, {\n size: \"small\",\n children: [\n screenInfo ? /*#__PURE__*/ jsxs(Text, {\n type: \"secondary\",\n children: [\n screenInfo.width,\n \" \\xd7 \",\n screenInfo.height\n ]\n }) : null,\n 'connected' === status ? /*#__PURE__*/ jsx(Button, {\n size: \"small\",\n onClick: handleDisconnect,\n children: \"Disconnect\"\n }) : /*#__PURE__*/ jsx(Button, {\n size: \"small\",\n type: \"primary\",\n loading: 'connecting' === status,\n onClick: handleConnect,\n children: \"Connect\"\n })\n ]\n }),\n children: [\n errorMessage ? /*#__PURE__*/ jsx(Alert, {\n type: \"warning\",\n showIcon: true,\n style: {\n marginBottom: 12\n },\n message: statusText,\n description: errorMessage\n }) : null,\n /*#__PURE__*/ jsxs(\"div\", {\n style: {\n position: 'relative',\n flex: 1,\n minHeight: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: '#111827',\n borderRadius: 8,\n overflow: 'hidden'\n },\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n ref: canvasStageRef,\n style: {\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n }\n }),\n 'connected' !== status && /*#__PURE__*/ jsxs(\"div\", {\n style: {\n position: 'absolute',\n inset: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 12,\n color: '#fff',\n background: 'rgba(17, 24, 39, 0.78)',\n textAlign: 'center',\n padding: 24,\n zIndex: 1\n },\n children: [\n /*#__PURE__*/ jsx(Spin, {\n spinning: true\n }),\n /*#__PURE__*/ jsx(Text, {\n style: {\n color: '#fff'\n },\n children: statusText\n }),\n !webCodecsSupported && /*#__PURE__*/ jsx(Text, {\n style: {\n color: '#d1d5db'\n },\n children: \"Please use a modern Chromium browser to view the stream.\"\n })\n ]\n })\n ]\n })\n ]\n });\n}\nexport { ScrcpyPanel };\n","function _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction runtime_info_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else runtime_info_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nconst VALID_DEVICE_TYPES = [\n 'android',\n 'ios',\n 'web',\n 'harmony',\n 'computer'\n];\nconst VALID_EXECUTION_UX_HINTS = [\n 'countdown-before-run'\n];\nfunction isValidDeviceType(type) {\n return VALID_DEVICE_TYPES.includes(type);\n}\nfunction normalizeRuntimeDeviceType(runtimeInfo, fallback) {\n var _runtimeInfo_interface;\n const candidates = [\n null == runtimeInfo ? void 0 : runtimeInfo.platformId,\n null == runtimeInfo ? void 0 : null == (_runtimeInfo_interface = runtimeInfo.interface) ? void 0 : _runtimeInfo_interface.type\n ].filter((value)=>Boolean(value));\n for (const candidate of candidates){\n const normalized = candidate.toLowerCase();\n if (isValidDeviceType(normalized)) return normalized;\n }\n return fallback;\n}\nfunction buildFallbackRuntimeInfo(previousRuntimeInfo, interfaceInfo) {\n return _object_spread_props(_object_spread({}, previousRuntimeInfo), {\n interface: interfaceInfo,\n preview: (null == previousRuntimeInfo ? void 0 : previousRuntimeInfo.preview) || {\n kind: 'none',\n capabilities: []\n },\n executionUxHints: (null == previousRuntimeInfo ? void 0 : previousRuntimeInfo.executionUxHints) || [],\n metadata: (null == previousRuntimeInfo ? void 0 : previousRuntimeInfo.metadata) || {}\n });\n}\nfunction filterValidExecutionUxHints(runtimeInfo) {\n return ((null == runtimeInfo ? void 0 : runtimeInfo.executionUxHints) || []).filter((hint)=>VALID_EXECUTION_UX_HINTS.includes(hint));\n}\nfunction resolvePreviewConnectionInfo(runtimeInfo, serverUrl) {\n const preview = null == runtimeInfo ? void 0 : runtimeInfo.preview;\n if (!preview || 'none' === preview.kind || 'custom' === preview.kind) return {\n type: 'none'\n };\n const resolvedServerUrl = serverUrl || 'undefined' != typeof window && window.location.origin || '';\n if ('mjpeg' === preview.kind) {\n const mjpegPath = preview.mjpegPath || '/mjpeg';\n if (!resolvedServerUrl) return {\n type: 'screenshot'\n };\n return {\n type: 'mjpeg',\n mjpegUrl: new URL(mjpegPath, `${resolvedServerUrl}/`).toString()\n };\n }\n if ('scrcpy' === preview.kind) {\n var _preview_custom;\n const scrcpyPort = Number(null == (_preview_custom = preview.custom) ? void 0 : _preview_custom.scrcpyPort);\n const resolvedScrcpyPort = Number.isFinite(scrcpyPort) ? scrcpyPort : void 0;\n const scrcpyUrl = resolvedScrcpyPort && resolvedServerUrl ? (()=>{\n const url = new URL(resolvedServerUrl);\n url.port = String(resolvedScrcpyPort);\n url.pathname = '/';\n url.search = '';\n url.hash = '';\n return url.toString();\n })() : void 0;\n return {\n type: 'scrcpy',\n scrcpyPort: resolvedScrcpyPort,\n scrcpyUrl\n };\n }\n return {\n type: 'screenshot'\n };\n}\nexport { buildFallbackRuntimeInfo, filterValidExecutionUxHints, isValidDeviceType, normalizeRuntimeDeviceType, resolvePreviewConnectionInfo };\n","import { jsx } from \"react/jsx-runtime\";\nimport { ScreenshotViewer } from \"@midscene/visualizer\";\nimport { Alert } from \"antd\";\nimport { ScrcpyPanel } from \"./ScrcpyPanel.mjs\";\nimport { resolvePreviewConnectionInfo } from \"./runtime-info.mjs\";\nfunction PreviewRenderer({ playgroundSDK, runtimeInfo, serverUrl, serverOnline, isUserOperating }) {\n const previewConnection = resolvePreviewConnectionInfo(runtimeInfo, serverUrl);\n const usesScreenshotPolling = 'screenshot' === previewConnection.type;\n return /*#__PURE__*/ jsx(\"div\", {\n style: {\n flex: 1,\n minHeight: 0,\n height: '100%'\n },\n children: 'none' === previewConnection.type ? /*#__PURE__*/ jsx(Alert, {\n type: \"warning\",\n showIcon: true,\n message: \"Preview unavailable\",\n description: \"This session did not expose a preview capability in runtime metadata.\"\n }) : 'scrcpy' === previewConnection.type ? /*#__PURE__*/ jsx(ScrcpyPanel, {\n serverUrl: previewConnection.scrcpyUrl\n }) : /*#__PURE__*/ jsx(ScreenshotViewer, {\n getScreenshot: ()=>usesScreenshotPolling ? playgroundSDK.getScreenshot() : Promise.resolve(null),\n getInterfaceInfo: ()=>playgroundSDK.getInterfaceInfo(),\n serverOnline: serverOnline,\n isUserOperating: isUserOperating,\n mjpegUrl: previewConnection.mjpegUrl\n })\n });\n}\nexport { PreviewRenderer };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport \"react\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction server_offline_background_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else server_offline_background_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nconst SvgServerOfflineBackground = (props)=>/*#__PURE__*/ jsxs(\"svg\", _object_spread_props(_object_spread({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 400,\n height: 283,\n fill: \"none\",\n viewBox: \"0 0 400 283\"\n }, props), {\n children: [\n /*#__PURE__*/ jsx(\"path\", {\n fill: \"url(#server-offline-background_svg__a)\",\n fillOpacity: 0.7,\n d: \"M0 283h283v400H0z\",\n transform: \"rotate(-90 0 283)\"\n }),\n /*#__PURE__*/ jsx(\"path\", {\n fill: \"url(#server-offline-background_svg__b)\",\n d: \"M0 0h400v283H0z\"\n }),\n /*#__PURE__*/ jsxs(\"defs\", {\n children: [\n /*#__PURE__*/ jsxs(\"radialGradient\", {\n id: \"server-offline-background_svg__b\",\n cx: 0,\n cy: 0,\n r: 1,\n gradientTransform: \"matrix(0 115.5 -163.251 0 200 141.5)\",\n gradientUnits: \"userSpaceOnUse\",\n children: [\n /*#__PURE__*/ jsx(\"stop\", {\n stopColor: \"#F2F4F7\",\n stopOpacity: 0\n }),\n /*#__PURE__*/ jsx(\"stop\", {\n offset: 1,\n stopColor: \"#F2F4F7\"\n })\n ]\n }),\n /*#__PURE__*/ jsx(\"pattern\", {\n id: \"server-offline-background_svg__a\",\n width: 1,\n height: 1,\n patternTransform: \"matrix(18 0 0 18 0 283)\",\n patternUnits: \"userSpaceOnUse\",\n preserveAspectRatio: \"none\",\n viewBox: \"0 0 12 12\",\n children: /*#__PURE__*/ jsx(\"path\", {\n stroke: \"#A1A1A1\",\n strokeWidth: 0.2,\n d: \"M.1.1h11.8v11.8H.1z\"\n })\n })\n ]\n })\n ]\n }));\nconst server_offline_background = SvgServerOfflineBackground;\nexport { server_offline_background as default };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport \"react\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction server_offline_foreground_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else server_offline_foreground_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nconst SvgServerOfflineForeground = (props)=>/*#__PURE__*/ jsxs(\"svg\", _object_spread_props(_object_spread({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 178,\n height: 135,\n fill: \"none\",\n viewBox: \"0 0 178 135\"\n }, props), {\n children: [\n /*#__PURE__*/ jsx(\"g\", {\n filter: \"url(#server-offline-foreground_svg__a)\",\n children: /*#__PURE__*/ jsx(\"rect\", {\n width: 74,\n height: 97.5,\n fill: \"url(#server-offline-foreground_svg__b)\",\n rx: 12,\n transform: \"matrix(.86603 .5 -.86603 .5 99.136 28.5)\"\n })\n }),\n /*#__PURE__*/ jsx(\"rect\", {\n width: 78,\n height: 101.5,\n y: -2,\n fill: \"url(#server-offline-foreground_svg__c)\",\n stroke: \"url(#server-offline-foreground_svg__d)\",\n strokeWidth: 4,\n rx: 14,\n transform: \"matrix(.86603 .5 -.86603 .5 97.404 4)\"\n }),\n /*#__PURE__*/ jsx(\"path\", {\n fill: \"url(#server-offline-foreground_svg__e)\",\n d: \"M78.147 31.404a.9.9 0 0 1 .156-.559c.117-.178.295-.34.524-.478.228-.138.503-.248.806-.322a4 4 0 0 1 .961-.114c.33 0 .657.038.961.113s.578.184.807.322c.23.137.407.3.525.478.117.178.17.368.157.559v3c.014.19-.04.38-.156.559a1.6 1.6 0 0 1-.524.478 3 3 0 0 1-.806.322c-.304.075-.631.114-.961.114s-.657-.038-.961-.113a3 3 0 0 1-.807-.321 1.6 1.6 0 0 1-.525-.479.9.9 0 0 1-.157-.559zm-9.678 8.414c-.632-.015-1.23-.17-1.668-.434s-.682-.615-.682-.98c0-.366.246-.717.684-.98.438-.264 1.036-.42 1.669-.434h5.196c.33-.007.659.024.968.091.308.068.59.17.828.303s.428.29.557.466a.93.93 0 0 1 .196.555.93.93 0 0 1-.197.554c-.13.176-.32.334-.558.466s-.52.235-.829.303a4 4 0 0 1-.968.09zm38.106 11a4 4 0 0 1-.956-.098 3 3 0 0 1-.815-.305 1.7 1.7 0 0 1-.547-.463.93.93 0 0 1-.193-.55c0-.188.066-.375.193-.549s.313-.331.547-.463c.233-.132.511-.235.815-.304.304-.07.629-.102.956-.098h5.196c.327-.004.652.029.956.098s.582.172.815.304c.234.132.42.29.547.463s.193.361.193.55a.93.93 0 0 1-.193.55 1.7 1.7 0 0 1-.547.462 3 3 0 0 1-.815.305 4 4 0 0 1-.956.097zm-9.38 2.585c.017-.369.281-.72.74-.978.457-.258 1.071-.402 1.71-.402.64 0 1.255.144 1.713.402.457.258.722.61.738.978v3a.9.9 0 0 1-.169.552c-.12.176-.299.336-.527.471a3 3 0 0 1-.803.316 4 4 0 0 1-.951.11c-.327 0-.65-.037-.952-.11a3 3 0 0 1-.802-.316 1.6 1.6 0 0 1-.527-.47.9.9 0 0 1-.17-.553zm8.515-18.5c-1.838-1.06-4.33-1.656-6.93-1.656-2.598 0-5.09.596-6.928 1.657l-5.196 3c-.225.14-.495.252-.796.33s-.626.12-.956.123a4 4 0 0 1-.963-.102 3 3 0 0 1-.817-.312 1.7 1.7 0 0 1-.54-.471.9.9 0 0 1-.178-.557.95.95 0 0 1 .215-.551c.135-.174.33-.33.571-.46l5.196-3c2.757-1.591 6.495-2.485 10.393-2.485s7.636.894 10.392 2.485c2.756 1.592 4.305 3.75 4.305 6s-1.549 4.409-4.305 6l-5.196 3a2.9 2.9 0 0 1-.796.33 4.087 4.087 0 0 1-1.919.021 3 3 0 0 1-.817-.311 1.7 1.7 0 0 1-.54-.472.9.9 0 0 1-.177-.556.95.95 0 0 1 .214-.552c.135-.174.33-.33.572-.46l5.196-3c1.837-1.06 2.87-2.5 2.87-4s-1.033-2.94-2.87-4m-29.444 5c.224-.14.494-.252.795-.33s.626-.12.956-.123.657.03.963.102c.306.071.584.177.817.312.234.135.417.295.54.472a.9.9 0 0 1 .178.556.95.95 0 0 1-.215.551c-.135.174-.329.33-.571.46l-5.196 3c-1.838 1.06-2.87 2.5-2.87 4s1.032 2.94 2.87 4c1.838 1.062 4.33 1.658 6.929 1.658s5.091-.596 6.929-1.657l5.196-3c.465-.249 1.079-.384 1.712-.376.633.007 1.238.155 1.686.414.448.258.705.607.717.973s-.221.72-.652.988l-5.196 3c-2.756 1.592-6.494 2.486-10.392 2.486s-7.636-.894-10.392-2.486c-2.757-1.591-4.305-3.75-4.305-6s1.548-4.408 4.305-6z\"\n }),\n /*#__PURE__*/ jsx(\"path\", {\n fill: \"#000\",\n d: \"m108.005 6.698 3.211-1.854c.954-.55 2.247-.86 3.596-.86s2.642.31 3.596.86c.953.55 1.489 1.297 1.489 2.076 0 .778-.536 1.525-1.489 2.076l-9.589 5.535c-.317.184-.749.287-1.198.287-.45 0-.881-.103-1.199-.287-.317-.183-.496-.432-.496-.692s.179-.508.496-.692l9.589-5.535-2.398-1.384-9.588 5.535c-.953.551-1.489 1.298-1.489 2.076 0 .779.536 1.526 1.489 2.076s2.247.86 3.596.86c1.348 0 2.642-.31 3.595-.86l9.589-5.535c1.589-.918 2.482-2.163 2.482-3.46s-.893-2.543-2.482-3.46c-1.59-.918-3.745-1.433-5.993-1.433s-4.403.515-5.993 1.433l-4.394 2.537z\"\n }),\n /*#__PURE__*/ jsxs(\"defs\", {\n children: [\n /*#__PURE__*/ jsxs(\"linearGradient\", {\n id: \"server-offline-foreground_svg__b\",\n x1: 37,\n x2: 37,\n y1: 0,\n y2: 97.5,\n gradientUnits: \"userSpaceOnUse\",\n children: [\n /*#__PURE__*/ jsx(\"stop\", {\n stopColor: \"#D9D9D9\"\n }),\n /*#__PURE__*/ jsx(\"stop\", {\n offset: 1,\n stopColor: \"#E9E9EB\"\n })\n ]\n }),\n /*#__PURE__*/ jsxs(\"linearGradient\", {\n id: \"server-offline-foreground_svg__c\",\n x1: 37,\n x2: 37,\n y1: 0,\n y2: 97.5,\n gradientUnits: \"userSpaceOnUse\",\n children: [\n /*#__PURE__*/ jsx(\"stop\", {\n stopColor: \"#7D7E80\"\n }),\n /*#__PURE__*/ jsx(\"stop\", {\n offset: 1,\n stopColor: \"#C7C9CC\"\n })\n ]\n }),\n /*#__PURE__*/ jsxs(\"linearGradient\", {\n id: \"server-offline-foreground_svg__d\",\n x1: 37,\n x2: 37,\n y1: 0,\n y2: 97.5,\n gradientUnits: \"userSpaceOnUse\",\n children: [\n /*#__PURE__*/ jsx(\"stop\", {\n stopColor: \"#fff\"\n }),\n /*#__PURE__*/ jsx(\"stop\", {\n offset: 1,\n stopColor: \"#fff\",\n stopOpacity: 0.2\n })\n ]\n }),\n /*#__PURE__*/ jsxs(\"linearGradient\", {\n id: \"server-offline-foreground_svg__e\",\n x1: 72.75,\n x2: 90.111,\n y1: 33.874,\n y2: 63.944,\n gradientUnits: \"userSpaceOnUse\",\n children: [\n /*#__PURE__*/ jsx(\"stop\", {\n stopColor: \"#fff\"\n }),\n /*#__PURE__*/ jsx(\"stop\", {\n offset: 1,\n stopColor: \"#fff\",\n stopOpacity: 0.5\n })\n ]\n }),\n /*#__PURE__*/ jsxs(\"filter\", {\n id: \"server-offline-foreground_svg__a\",\n width: 176.348,\n height: 118.721,\n x: 0.786,\n y: 16.015,\n colorInterpolationFilters: \"sRGB\",\n filterUnits: \"userSpaceOnUse\",\n children: [\n /*#__PURE__*/ jsx(\"feFlood\", {\n floodOpacity: 0,\n result: \"BackgroundImageFix\"\n }),\n /*#__PURE__*/ jsx(\"feColorMatrix\", {\n in: \"SourceAlpha\",\n result: \"hardAlpha\",\n values: \"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n }),\n /*#__PURE__*/ jsx(\"feOffset\", {\n dy: 4\n }),\n /*#__PURE__*/ jsx(\"feGaussianBlur\", {\n stdDeviation: 10\n }),\n /*#__PURE__*/ jsx(\"feComposite\", {\n in2: \"hardAlpha\",\n operator: \"out\"\n }),\n /*#__PURE__*/ jsx(\"feColorMatrix\", {\n values: \"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.04 0\"\n }),\n /*#__PURE__*/ jsx(\"feBlend\", {\n in2: \"BackgroundImageFix\",\n result: \"effect1_dropShadow_4624_2901\"\n }),\n /*#__PURE__*/ jsx(\"feBlend\", {\n in: \"SourceGraphic\",\n in2: \"effect1_dropShadow_4624_2901\",\n result: \"shape\"\n })\n ]\n })\n ]\n })\n ]\n }));\nconst server_offline_foreground = SvgServerOfflineForeground;\nexport { server_offline_foreground as default };\n","import { useEffect, useRef, useState } from \"react\";\nimport { buildFallbackRuntimeInfo, filterValidExecutionUxHints, normalizeRuntimeDeviceType } from \"./runtime-info.mjs\";\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(void 0);\n });\n };\n}\nfunction useServerStatus(playgroundSDK, defaultDeviceType, pollIntervalMs) {\n const [serverOnline, setServerOnline] = useState(false);\n const [isUserOperating, setIsUserOperating] = useState(false);\n const [deviceType, setDeviceType] = useState(defaultDeviceType);\n const [runtimeInfo, setRuntimeInfo] = useState(null);\n const [executionUxHints, setExecutionUxHints] = useState([]);\n const runtimeInfoRef = useRef(null);\n useEffect(()=>{\n runtimeInfoRef.current = runtimeInfo;\n }, [\n runtimeInfo\n ]);\n useEffect(()=>{\n playgroundSDK.onProgressUpdate((tip)=>{\n setIsUserOperating(Boolean(tip));\n });\n }, [\n playgroundSDK\n ]);\n useEffect(()=>{\n let active = true;\n const checkServer = ()=>_async_to_generator(function*() {\n try {\n const online = yield playgroundSDK.checkStatus();\n if (!active) return;\n setServerOnline(online);\n if (!online) {\n runtimeInfoRef.current = null;\n setRuntimeInfo(null);\n setExecutionUxHints([]);\n return;\n }\n try {\n const nextRuntimeInfo = yield playgroundSDK.getRuntimeInfo();\n if (!active) return;\n if (nextRuntimeInfo) {\n setRuntimeInfo(nextRuntimeInfo);\n setDeviceType(normalizeRuntimeDeviceType(nextRuntimeInfo, defaultDeviceType));\n setExecutionUxHints(filterValidExecutionUxHints(nextRuntimeInfo));\n return;\n }\n } catch (error) {\n console.warn('Failed to get runtime info:', error);\n }\n try {\n const interfaceInfo = yield playgroundSDK.getInterfaceInfo();\n if (!active || !(null == interfaceInfo ? void 0 : interfaceInfo.type)) return;\n const fallbackRuntimeInfo = buildFallbackRuntimeInfo(runtimeInfoRef.current, interfaceInfo);\n runtimeInfoRef.current = fallbackRuntimeInfo;\n setRuntimeInfo(fallbackRuntimeInfo);\n setDeviceType(normalizeRuntimeDeviceType(fallbackRuntimeInfo, defaultDeviceType));\n setExecutionUxHints(filterValidExecutionUxHints(fallbackRuntimeInfo));\n } catch (error) {\n console.warn('Failed to get interface info:', error);\n }\n } catch (error) {\n if (!active) return;\n console.error('Failed to check server status:', error);\n setServerOnline(false);\n }\n })();\n checkServer();\n const interval = window.setInterval(checkServer, pollIntervalMs);\n return ()=>{\n active = false;\n window.clearInterval(interval);\n };\n }, [\n playgroundSDK,\n pollIntervalMs,\n defaultDeviceType\n ]);\n return {\n serverOnline,\n isUserOperating,\n deviceType,\n runtimeInfo,\n executionUxHints\n };\n}\nexport { useServerStatus };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { PlaygroundSDK } from \"@midscene/playground\";\nimport { Logo, NavActions, UniversalPlayground, globalThemeConfig } from \"@midscene/visualizer\";\nimport { Button, ConfigProvider, Layout, Modal } from \"antd\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Panel, PanelGroup, PanelResizeHandle } from \"react-resizable-panels\";\nimport { PreviewRenderer } from \"./PreviewRenderer.mjs\";\nimport server_offline_background from \"./icons/server-offline-background.mjs\";\nimport server_offline_foreground from \"./icons/server-offline-foreground.mjs\";\nimport { useServerStatus } from \"./useServerStatus.mjs\";\nimport \"./PlaygroundApp.css\";\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(void 0);\n });\n };\n}\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = null != arguments[i] ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (\"function\" == typeof Object.getOwnPropertySymbols) ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction PlaygroundApp_ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = null != source ? source : {};\n if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n else PlaygroundApp_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nconst { Content } = Layout;\nfunction PlaygroundApp({ serverUrl, appVersion, title = 'Playground', defaultDeviceType = 'web', branding, playgroundConfig, offlineTitle = 'Midscene Playground', offlineStatusText = 'Server offline...', pollIntervalMs = 5000 }) {\n var _playgroundConfig_executionUx;\n const [isNarrowScreen, setIsNarrowScreen] = useState(false);\n const [countdown, setCountdown] = useState(null);\n var _playgroundConfig_executionUx_countdownSeconds;\n const countdownSeconds = null != (_playgroundConfig_executionUx_countdownSeconds = null == playgroundConfig ? void 0 : null == (_playgroundConfig_executionUx = playgroundConfig.executionUx) ? void 0 : _playgroundConfig_executionUx.countdownSeconds) ? _playgroundConfig_executionUx_countdownSeconds : 3;\n const playgroundSDK = useMemo(()=>new PlaygroundSDK({\n type: 'remote-execution',\n serverUrl\n }), [\n serverUrl\n ]);\n const { serverOnline, isUserOperating, deviceType, runtimeInfo, executionUxHints } = useServerStatus(playgroundSDK, defaultDeviceType, pollIntervalMs);\n const countdownTimerRef = useRef(null);\n const countdownResolveRef = useRef(null);\n const mountedRef = useRef(true);\n const finishCountdown = useCallback(()=>{\n if (null !== countdownTimerRef.current) {\n window.clearInterval(countdownTimerRef.current);\n countdownTimerRef.current = null;\n }\n const resolve = countdownResolveRef.current;\n countdownResolveRef.current = null;\n if (mountedRef.current) setCountdown(null);\n null == resolve || resolve();\n }, []);\n const showCountdownModal = useCallback(()=>_async_to_generator(function*() {\n if (countdownSeconds <= 0) return;\n finishCountdown();\n return new Promise((resolve)=>{\n countdownResolveRef.current = resolve;\n let count = countdownSeconds;\n if (mountedRef.current) setCountdown(count);\n countdownTimerRef.current = window.setInterval(()=>{\n count -= 1;\n if (count > 0) {\n if (mountedRef.current) setCountdown(count);\n return;\n }\n if (0 === count) {\n if (mountedRef.current) setCountdown('GO!');\n return;\n }\n finishCountdown();\n }, 1000);\n });\n })(), [\n countdownSeconds,\n finishCountdown\n ]);\n useEffect(()=>{\n mountedRef.current = true;\n return ()=>{\n mountedRef.current = false;\n finishCountdown();\n };\n }, [\n finishCountdown\n ]);\n useEffect(()=>{\n if (!executionUxHints.includes('countdown-before-run')) return void playgroundSDK.setBeforeActionHook(void 0);\n playgroundSDK.setBeforeActionHook(()=>_async_to_generator(function*() {\n yield showCountdownModal();\n })());\n return ()=>{\n playgroundSDK.setBeforeActionHook(void 0);\n };\n }, [\n executionUxHints,\n playgroundSDK,\n showCountdownModal\n ]);\n useEffect(()=>{\n const handleResize = ()=>{\n setIsNarrowScreen(window.innerWidth <= 1024);\n };\n handleResize();\n window.addEventListener('resize', handleResize);\n return ()=>window.removeEventListener('resize', handleResize);\n }, []);\n const mergedConfig = _object_spread({\n showContextPreview: false,\n layout: 'vertical',\n showVersionInfo: true,\n enableScrollToBottom: true,\n serverMode: true,\n showEnvConfigReminder: true,\n deviceType,\n executionUx: {\n hints: executionUxHints,\n countdownSeconds\n }\n }, playgroundConfig);\n var _runtimeInfo_title, _runtimeInfo_platformId, _ref, _ref1;\n const mergedBranding = _object_spread_props(_object_spread({}, branding), {\n title: null != (_runtimeInfo_title = null == runtimeInfo ? void 0 : runtimeInfo.title) ? _runtimeInfo_title : title,\n version: appVersion,\n targetName: null != (_ref1 = null != (_ref = null != (_runtimeInfo_platformId = null == runtimeInfo ? void 0 : runtimeInfo.platformId) ? _runtimeInfo_platformId : null == branding ? void 0 : branding.targetName) ? _ref : deviceType) ? _ref1 : 'screen'\n });\n if (!serverOnline) return /*#__PURE__*/ jsx(ConfigProvider, {\n theme: globalThemeConfig(),\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"server-offline-container\",\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"server-offline-message\",\n children: [\n /*#__PURE__*/ jsx(Logo, {}),\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"server-offline-content\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"server-offline-icon\",\n children: [\n /*#__PURE__*/ jsx(server_offline_background, {\n className: \"icon-background\"\n }),\n /*#__PURE__*/ jsx(server_offline_foreground, {\n className: \"icon-foreground\"\n })\n ]\n }),\n /*#__PURE__*/ jsx(\"h1\", {\n children: offlineTitle\n }),\n /*#__PURE__*/ jsx(\"p\", {\n className: \"connection-status\",\n children: offlineStatusText\n })\n ]\n })\n ]\n })\n })\n });\n return /*#__PURE__*/ jsxs(ConfigProvider, {\n theme: globalThemeConfig(),\n children: [\n /*#__PURE__*/ jsx(Modal, {\n open: null !== countdown,\n footer: /*#__PURE__*/ jsx(Button, {\n onClick: finishCountdown,\n type: \"default\",\n children: \"Skip countdown\"\n }),\n closable: true,\n maskClosable: true,\n onCancel: finishCountdown,\n centered: true,\n width: 400,\n style: {\n top: '30%'\n },\n styles: {\n mask: {\n backgroundColor: 'rgba(0, 0, 0, 0.75)'\n }\n },\n children: /*#__PURE__*/ jsxs(\"div\", {\n style: {\n textAlign: 'center',\n padding: '40px 20px'\n },\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n style: {\n fontSize: '72px',\n fontWeight: 'bold',\n color: 'GO!' === countdown ? '#52c41a' : '#1890ff',\n marginBottom: '24px',\n lineHeight: 1\n },\n children: countdown\n }),\n /*#__PURE__*/ jsx(\"div\", {\n style: {\n fontSize: '18px',\n fontWeight: 500,\n marginBottom: '12px'\n },\n children: \"Automation Starting Soon\"\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n style: {\n fontSize: '14px',\n color: 'rgba(0, 0, 0, 0.65)'\n },\n children: [\n \"The selected session requested a countdown before execution.\",\n /*#__PURE__*/ jsx(\"br\", {}),\n \"Please wait until the run starts.\"\n ]\n })\n ]\n })\n }),\n /*#__PURE__*/ jsx(Layout, {\n className: \"app-container playground-container\",\n children: /*#__PURE__*/ jsx(Content, {\n className: \"app-content\",\n children: /*#__PURE__*/ jsxs(PanelGroup, {\n autoSaveId: \"playground-layout\",\n direction: isNarrowScreen ? 'vertical' : 'horizontal',\n children: [\n /*#__PURE__*/ jsx(Panel, {\n defaultSize: isNarrowScreen ? 67 : 32,\n maxSize: isNarrowScreen ? 85 : 60,\n minSize: isNarrowScreen ? 67 : 25,\n className: \"app-panel left-panel\",\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"panel-content left-panel-content\",\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"playground-panel-header\",\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"header-row\",\n children: [\n /*#__PURE__*/ jsx(Logo, {}),\n /*#__PURE__*/ jsx(NavActions, {\n showTooltipWhenEmpty: false,\n showModelName: false\n })\n ]\n })\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"playground-panel-playground\",\n children: /*#__PURE__*/ jsx(UniversalPlayground, {\n playgroundSDK: playgroundSDK,\n config: mergedConfig,\n branding: mergedBranding,\n className: \"playground-container\"\n })\n })\n ]\n })\n }),\n /*#__PURE__*/ jsx(PanelResizeHandle, {\n className: `panel-resize-handle ${isNarrowScreen ? 'vertical' : 'horizontal'}`\n }),\n /*#__PURE__*/ jsx(Panel, {\n className: \"app-panel right-panel\",\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"panel-content right-panel-content\",\n children: /*#__PURE__*/ jsx(PreviewRenderer, {\n playgroundSDK: playgroundSDK,\n runtimeInfo: runtimeInfo,\n serverUrl: serverUrl,\n serverOnline: serverOnline,\n isUserOperating: isUserOperating\n })\n })\n })\n ]\n })\n })\n })\n ]\n });\n}\nexport { PlaygroundApp };\n","import { StrictMode } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport App from './App';\n\nconst container = document.getElementById('root');\nif (!container) {\n throw new Error('Root element not found');\n}\n\nconst root = createRoot(container);\nroot.render(\n <StrictMode>\n <App />\n </StrictMode>,\n);\n","import { PlaygroundApp } from '@midscene/playground-app';\n\ndeclare const __APP_VERSION__: string;\ndeclare const __SERVER_URL__: string;\n\nexport default function App() {\n return (\n <PlaygroundApp\n serverUrl={__SERVER_URL__}\n appVersion={__APP_VERSION__}\n title=\"Playground\"\n offlineTitle=\"Midscene Playground\"\n />\n );\n}\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport node_path from \"node:path\";\nimport { getBasicEnvValue } from \"./env/basic.mjs\";\nimport { MIDSCENE_RUN_DIR } from \"./env/types.mjs\";\nimport { ifInNode } from \"./utils.mjs\";\nconst defaultRunDirName = 'midscene_run';\nconst getMidsceneRunDir = ()=>{\n if (!ifInNode) return '';\n return getBasicEnvValue(MIDSCENE_RUN_DIR) || defaultRunDirName;\n};\nconst getMidsceneRunBaseDir = ()=>{\n if (!ifInNode) return '';\n let basePath = node_path.resolve(process.cwd(), getMidsceneRunDir());\n if (!existsSync(basePath)) try {\n mkdirSync(basePath, {\n recursive: true\n });\n } catch (error) {\n basePath = node_path.join(tmpdir(), defaultRunDirName);\n mkdirSync(basePath, {\n recursive: true\n });\n }\n return basePath;\n};\nconst getMidsceneRunSubDir = (subdir)=>{\n if (!ifInNode) return '';\n const basePath = getMidsceneRunBaseDir();\n const logPath = node_path.join(basePath, subdir);\n if (!existsSync(logPath)) mkdirSync(logPath, {\n recursive: true\n });\n return logPath;\n};\nconst ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED = 'NOT_IMPLEMENTED_AS_DESIGNED';\nexport { ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED, defaultRunDirName, getMidsceneRunBaseDir, getMidsceneRunDir, getMidsceneRunSubDir };\n","import { BASIC_ENV_KEYS } from \"./types.mjs\";\nconst getBasicEnvValue = (key)=>{\n if (!BASIC_ENV_KEYS.includes(key)) throw new Error(`getBasicEnvValue with key ${key} is not supported.`);\n return process.env[key];\n};\nexport { getBasicEnvValue };\n","const MIDSCENE_MODEL_INIT_CONFIG_JSON = 'MIDSCENE_MODEL_INIT_CONFIG_JSON';\nconst MIDSCENE_MODEL_EXTRA_BODY_JSON = 'MIDSCENE_MODEL_EXTRA_BODY_JSON';\nconst MIDSCENE_MODEL_NAME = 'MIDSCENE_MODEL_NAME';\nconst MIDSCENE_DEBUG_MODEL_PROFILE = 'MIDSCENE_DEBUG_MODEL_PROFILE';\nconst MIDSCENE_DEBUG_MODEL_RESPONSE = 'MIDSCENE_DEBUG_MODEL_RESPONSE';\nconst MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG = 'MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG';\nconst MIDSCENE_DEBUG_MODE = 'MIDSCENE_DEBUG_MODE';\nconst MIDSCENE_MCP_USE_PUPPETEER_MODE = 'MIDSCENE_MCP_USE_PUPPETEER_MODE';\nconst MIDSCENE_MCP_CHROME_PATH = 'MIDSCENE_MCP_CHROME_PATH';\nconst MIDSCENE_MCP_ANDROID_MODE = 'MIDSCENE_MCP_ANDROID_MODE';\nconst DOCKER_CONTAINER = 'DOCKER_CONTAINER';\nconst MIDSCENE_LANGSMITH_DEBUG = 'MIDSCENE_LANGSMITH_DEBUG';\nconst MIDSCENE_LANGFUSE_DEBUG = 'MIDSCENE_LANGFUSE_DEBUG';\nconst MIDSCENE_MODEL_SOCKS_PROXY = 'MIDSCENE_MODEL_SOCKS_PROXY';\nconst MIDSCENE_MODEL_HTTP_PROXY = 'MIDSCENE_MODEL_HTTP_PROXY';\nconst MIDSCENE_MODEL_API_KEY = 'MIDSCENE_MODEL_API_KEY';\nconst MIDSCENE_MODEL_BASE_URL = 'MIDSCENE_MODEL_BASE_URL';\nconst MIDSCENE_MODEL_MAX_TOKENS = 'MIDSCENE_MODEL_MAX_TOKENS';\nconst MIDSCENE_MODEL_TIMEOUT = 'MIDSCENE_MODEL_TIMEOUT';\nconst MIDSCENE_MODEL_TEMPERATURE = 'MIDSCENE_MODEL_TEMPERATURE';\nconst MIDSCENE_MODEL_RETRY_COUNT = 'MIDSCENE_MODEL_RETRY_COUNT';\nconst MIDSCENE_MODEL_RETRY_INTERVAL = 'MIDSCENE_MODEL_RETRY_INTERVAL';\nconst MIDSCENE_MODEL_REASONING_EFFORT = 'MIDSCENE_MODEL_REASONING_EFFORT';\nconst MIDSCENE_MODEL_REASONING_ENABLED = 'MIDSCENE_MODEL_REASONING_ENABLED';\nconst MIDSCENE_MODEL_REASONING_BUDGET = 'MIDSCENE_MODEL_REASONING_BUDGET';\nconst OPENAI_API_KEY = 'OPENAI_API_KEY';\nconst OPENAI_BASE_URL = 'OPENAI_BASE_URL';\nconst MIDSCENE_OPENAI_INIT_CONFIG_JSON = 'MIDSCENE_OPENAI_INIT_CONFIG_JSON';\nconst MIDSCENE_OPENAI_HTTP_PROXY = 'MIDSCENE_OPENAI_HTTP_PROXY';\nconst MIDSCENE_OPENAI_SOCKS_PROXY = 'MIDSCENE_OPENAI_SOCKS_PROXY';\nconst OPENAI_MAX_TOKENS = 'OPENAI_MAX_TOKENS';\nconst MIDSCENE_ADB_PATH = 'MIDSCENE_ADB_PATH';\nconst MIDSCENE_ADB_REMOTE_HOST = 'MIDSCENE_ADB_REMOTE_HOST';\nconst MIDSCENE_ADB_REMOTE_PORT = 'MIDSCENE_ADB_REMOTE_PORT';\nconst MIDSCENE_ANDROID_IME_STRATEGY = 'MIDSCENE_ANDROID_IME_STRATEGY';\nconst MIDSCENE_IOS_DEVICE_UDID = 'MIDSCENE_IOS_DEVICE_UDID';\nconst MIDSCENE_IOS_SIMULATOR_UDID = 'MIDSCENE_IOS_SIMULATOR_UDID';\nconst MIDSCENE_CACHE = 'MIDSCENE_CACHE';\nconst MIDSCENE_USE_VLM_UI_TARS = 'MIDSCENE_USE_VLM_UI_TARS';\nconst MIDSCENE_USE_QWEN_VL = 'MIDSCENE_USE_QWEN_VL';\nconst MIDSCENE_USE_QWEN3_VL = 'MIDSCENE_USE_QWEN3_VL';\nconst MIDSCENE_USE_DOUBAO_VISION = 'MIDSCENE_USE_DOUBAO_VISION';\nconst MIDSCENE_USE_GEMINI = 'MIDSCENE_USE_GEMINI';\nconst MIDSCENE_USE_VL_MODEL = 'MIDSCENE_USE_VL_MODEL';\nconst MATCH_BY_POSITION = 'MATCH_BY_POSITION';\nconst MIDSCENE_REPORT_TAG_NAME = 'MIDSCENE_REPORT_TAG_NAME';\nconst MIDSCENE_REPORT_QUIET = 'MIDSCENE_REPORT_QUIET';\nconst MIDSCENE_PREFERRED_LANGUAGE = 'MIDSCENE_PREFERRED_LANGUAGE';\nconst MIDSCENE_CACHE_MAX_FILENAME_LENGTH = 'MIDSCENE_CACHE_MAX_FILENAME_LENGTH';\nconst MIDSCENE_REPLANNING_CYCLE_LIMIT = 'MIDSCENE_REPLANNING_CYCLE_LIMIT';\nconst MIDSCENE_RUN_DIR = 'MIDSCENE_RUN_DIR';\nconst MIDSCENE_INSIGHT_MODEL_NAME = 'MIDSCENE_INSIGHT_MODEL_NAME';\nconst MIDSCENE_INSIGHT_MODEL_SOCKS_PROXY = 'MIDSCENE_INSIGHT_MODEL_SOCKS_PROXY';\nconst MIDSCENE_INSIGHT_MODEL_HTTP_PROXY = 'MIDSCENE_INSIGHT_MODEL_HTTP_PROXY';\nconst MIDSCENE_INSIGHT_MODEL_BASE_URL = 'MIDSCENE_INSIGHT_MODEL_BASE_URL';\nconst MIDSCENE_INSIGHT_MODEL_API_KEY = 'MIDSCENE_INSIGHT_MODEL_API_KEY';\nconst MIDSCENE_INSIGHT_MODEL_INIT_CONFIG_JSON = 'MIDSCENE_INSIGHT_MODEL_INIT_CONFIG_JSON';\nconst MIDSCENE_INSIGHT_MODEL_EXTRA_BODY_JSON = 'MIDSCENE_INSIGHT_MODEL_EXTRA_BODY_JSON';\nconst MIDSCENE_INSIGHT_MODEL_TIMEOUT = 'MIDSCENE_INSIGHT_MODEL_TIMEOUT';\nconst MIDSCENE_INSIGHT_MODEL_TEMPERATURE = 'MIDSCENE_INSIGHT_MODEL_TEMPERATURE';\nconst MIDSCENE_INSIGHT_MODEL_RETRY_COUNT = 'MIDSCENE_INSIGHT_MODEL_RETRY_COUNT';\nconst MIDSCENE_INSIGHT_MODEL_RETRY_INTERVAL = 'MIDSCENE_INSIGHT_MODEL_RETRY_INTERVAL';\nconst MIDSCENE_INSIGHT_MODEL_FAMILY = 'MIDSCENE_INSIGHT_MODEL_FAMILY';\nconst MIDSCENE_INSIGHT_MODEL_REASONING_EFFORT = 'MIDSCENE_INSIGHT_MODEL_REASONING_EFFORT';\nconst MIDSCENE_INSIGHT_MODEL_REASONING_ENABLED = 'MIDSCENE_INSIGHT_MODEL_REASONING_ENABLED';\nconst MIDSCENE_INSIGHT_MODEL_REASONING_BUDGET = 'MIDSCENE_INSIGHT_MODEL_REASONING_BUDGET';\nconst MIDSCENE_PLANNING_MODEL_NAME = 'MIDSCENE_PLANNING_MODEL_NAME';\nconst MIDSCENE_PLANNING_MODEL_SOCKS_PROXY = 'MIDSCENE_PLANNING_MODEL_SOCKS_PROXY';\nconst MIDSCENE_PLANNING_MODEL_HTTP_PROXY = 'MIDSCENE_PLANNING_MODEL_HTTP_PROXY';\nconst MIDSCENE_PLANNING_MODEL_BASE_URL = 'MIDSCENE_PLANNING_MODEL_BASE_URL';\nconst MIDSCENE_PLANNING_MODEL_API_KEY = 'MIDSCENE_PLANNING_MODEL_API_KEY';\nconst MIDSCENE_PLANNING_MODEL_INIT_CONFIG_JSON = 'MIDSCENE_PLANNING_MODEL_INIT_CONFIG_JSON';\nconst MIDSCENE_PLANNING_MODEL_EXTRA_BODY_JSON = 'MIDSCENE_PLANNING_MODEL_EXTRA_BODY_JSON';\nconst MIDSCENE_PLANNING_MODEL_TIMEOUT = 'MIDSCENE_PLANNING_MODEL_TIMEOUT';\nconst MIDSCENE_PLANNING_MODEL_TEMPERATURE = 'MIDSCENE_PLANNING_MODEL_TEMPERATURE';\nconst MIDSCENE_PLANNING_MODEL_RETRY_COUNT = 'MIDSCENE_PLANNING_MODEL_RETRY_COUNT';\nconst MIDSCENE_PLANNING_MODEL_RETRY_INTERVAL = 'MIDSCENE_PLANNING_MODEL_RETRY_INTERVAL';\nconst MIDSCENE_PLANNING_MODEL_FAMILY = 'MIDSCENE_PLANNING_MODEL_FAMILY';\nconst MIDSCENE_PLANNING_MODEL_REASONING_EFFORT = 'MIDSCENE_PLANNING_MODEL_REASONING_EFFORT';\nconst MIDSCENE_PLANNING_MODEL_REASONING_ENABLED = 'MIDSCENE_PLANNING_MODEL_REASONING_ENABLED';\nconst MIDSCENE_PLANNING_MODEL_REASONING_BUDGET = 'MIDSCENE_PLANNING_MODEL_REASONING_BUDGET';\nconst MIDSCENE_MODEL_FAMILY = 'MIDSCENE_MODEL_FAMILY';\nconst UNUSED_ENV_KEYS = [\n MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG\n];\nconst BASIC_ENV_KEYS = [\n MIDSCENE_DEBUG_MODE,\n MIDSCENE_DEBUG_MODEL_PROFILE,\n MIDSCENE_DEBUG_MODEL_RESPONSE,\n MIDSCENE_RUN_DIR\n];\nconst BOOLEAN_ENV_KEYS = [\n MIDSCENE_CACHE,\n MIDSCENE_MCP_USE_PUPPETEER_MODE,\n MIDSCENE_MCP_ANDROID_MODE,\n MIDSCENE_LANGSMITH_DEBUG,\n MIDSCENE_LANGFUSE_DEBUG,\n MIDSCENE_REPORT_QUIET\n];\nconst NUMBER_ENV_KEYS = [\n MIDSCENE_MODEL_MAX_TOKENS,\n MIDSCENE_CACHE_MAX_FILENAME_LENGTH,\n MIDSCENE_REPLANNING_CYCLE_LIMIT\n];\nconst STRING_ENV_KEYS = [\n MIDSCENE_MODEL_MAX_TOKENS,\n OPENAI_MAX_TOKENS,\n MIDSCENE_ADB_PATH,\n MIDSCENE_ADB_REMOTE_HOST,\n MIDSCENE_ADB_REMOTE_PORT,\n MIDSCENE_ANDROID_IME_STRATEGY,\n MIDSCENE_IOS_DEVICE_UDID,\n MIDSCENE_IOS_SIMULATOR_UDID,\n MIDSCENE_REPORT_TAG_NAME,\n MIDSCENE_PREFERRED_LANGUAGE,\n MATCH_BY_POSITION,\n MIDSCENE_MCP_CHROME_PATH,\n DOCKER_CONTAINER\n];\nconst GLOBAL_ENV_KEYS = [\n ...BOOLEAN_ENV_KEYS,\n ...NUMBER_ENV_KEYS,\n ...STRING_ENV_KEYS\n];\nconst MODEL_ENV_KEYS = [\n MIDSCENE_MODEL_NAME,\n MIDSCENE_MODEL_INIT_CONFIG_JSON,\n MIDSCENE_MODEL_EXTRA_BODY_JSON,\n MIDSCENE_MODEL_API_KEY,\n MIDSCENE_MODEL_BASE_URL,\n MIDSCENE_MODEL_SOCKS_PROXY,\n MIDSCENE_MODEL_HTTP_PROXY,\n MIDSCENE_MODEL_TIMEOUT,\n MIDSCENE_MODEL_TEMPERATURE,\n MIDSCENE_MODEL_RETRY_COUNT,\n MIDSCENE_MODEL_RETRY_INTERVAL,\n MIDSCENE_MODEL_REASONING_EFFORT,\n MIDSCENE_MODEL_REASONING_ENABLED,\n MIDSCENE_MODEL_REASONING_BUDGET,\n MIDSCENE_USE_VLM_UI_TARS,\n MIDSCENE_USE_QWEN_VL,\n MIDSCENE_USE_QWEN3_VL,\n MIDSCENE_USE_DOUBAO_VISION,\n MIDSCENE_USE_GEMINI,\n MIDSCENE_USE_VL_MODEL,\n OPENAI_API_KEY,\n OPENAI_BASE_URL,\n MIDSCENE_OPENAI_INIT_CONFIG_JSON,\n MIDSCENE_OPENAI_HTTP_PROXY,\n MIDSCENE_OPENAI_SOCKS_PROXY,\n MIDSCENE_INSIGHT_MODEL_NAME,\n MIDSCENE_INSIGHT_MODEL_SOCKS_PROXY,\n MIDSCENE_INSIGHT_MODEL_HTTP_PROXY,\n MIDSCENE_INSIGHT_MODEL_BASE_URL,\n MIDSCENE_INSIGHT_MODEL_API_KEY,\n MIDSCENE_INSIGHT_MODEL_INIT_CONFIG_JSON,\n MIDSCENE_INSIGHT_MODEL_EXTRA_BODY_JSON,\n MIDSCENE_INSIGHT_MODEL_TIMEOUT,\n MIDSCENE_INSIGHT_MODEL_TEMPERATURE,\n MIDSCENE_INSIGHT_MODEL_RETRY_COUNT,\n MIDSCENE_INSIGHT_MODEL_RETRY_INTERVAL,\n MIDSCENE_INSIGHT_MODEL_FAMILY,\n MIDSCENE_INSIGHT_MODEL_REASONING_EFFORT,\n MIDSCENE_INSIGHT_MODEL_REASONING_ENABLED,\n MIDSCENE_INSIGHT_MODEL_REASONING_BUDGET,\n MIDSCENE_PLANNING_MODEL_NAME,\n MIDSCENE_PLANNING_MODEL_SOCKS_PROXY,\n MIDSCENE_PLANNING_MODEL_HTTP_PROXY,\n MIDSCENE_PLANNING_MODEL_BASE_URL,\n MIDSCENE_PLANNING_MODEL_API_KEY,\n MIDSCENE_PLANNING_MODEL_INIT_CONFIG_JSON,\n MIDSCENE_PLANNING_MODEL_EXTRA_BODY_JSON,\n MIDSCENE_PLANNING_MODEL_TIMEOUT,\n MIDSCENE_PLANNING_MODEL_TEMPERATURE,\n MIDSCENE_PLANNING_MODEL_RETRY_COUNT,\n MIDSCENE_PLANNING_MODEL_RETRY_INTERVAL,\n MIDSCENE_PLANNING_MODEL_FAMILY,\n MIDSCENE_PLANNING_MODEL_REASONING_EFFORT,\n MIDSCENE_PLANNING_MODEL_REASONING_ENABLED,\n MIDSCENE_PLANNING_MODEL_REASONING_BUDGET,\n MIDSCENE_MODEL_FAMILY\n];\nconst ALL_ENV_KEYS = [\n ...UNUSED_ENV_KEYS,\n ...BASIC_ENV_KEYS,\n ...GLOBAL_ENV_KEYS,\n ...MODEL_ENV_KEYS\n];\nconst MODEL_FAMILY_VALUES = [\n 'doubao-vision',\n 'doubao-seed',\n 'gemini',\n 'qwen2.5-vl',\n 'qwen3-vl',\n 'qwen3.5',\n 'vlm-ui-tars',\n 'vlm-ui-tars-doubao',\n 'vlm-ui-tars-doubao-1.5',\n 'glm-v',\n 'auto-glm',\n 'auto-glm-multilingual',\n 'gpt-5'\n];\nvar types_UITarsModelVersion = /*#__PURE__*/ function(UITarsModelVersion) {\n UITarsModelVersion[\"V1_0\"] = \"1.0\";\n UITarsModelVersion[\"V1_5\"] = \"1.5\";\n UITarsModelVersion[\"DOUBAO_1_5_15B\"] = \"doubao-1.5-15B\";\n UITarsModelVersion[\"DOUBAO_1_5_20B\"] = \"doubao-1.5-20B\";\n return UITarsModelVersion;\n}({});\nexport { ALL_ENV_KEYS, BASIC_ENV_KEYS, BOOLEAN_ENV_KEYS, DOCKER_CONTAINER, GLOBAL_ENV_KEYS, MATCH_BY_POSITION, MIDSCENE_ADB_PATH, MIDSCENE_ADB_REMOTE_HOST, MIDSCENE_ADB_REMOTE_PORT, MIDSCENE_ANDROID_IME_STRATEGY, MIDSCENE_CACHE, MIDSCENE_CACHE_MAX_FILENAME_LENGTH, MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG, MIDSCENE_DEBUG_MODE, MIDSCENE_DEBUG_MODEL_PROFILE, MIDSCENE_DEBUG_MODEL_RESPONSE, MIDSCENE_INSIGHT_MODEL_API_KEY, MIDSCENE_INSIGHT_MODEL_BASE_URL, MIDSCENE_INSIGHT_MODEL_EXTRA_BODY_JSON, MIDSCENE_INSIGHT_MODEL_FAMILY, MIDSCENE_INSIGHT_MODEL_HTTP_PROXY, MIDSCENE_INSIGHT_MODEL_INIT_CONFIG_JSON, MIDSCENE_INSIGHT_MODEL_NAME, MIDSCENE_INSIGHT_MODEL_REASONING_BUDGET, MIDSCENE_INSIGHT_MODEL_REASONING_EFFORT, MIDSCENE_INSIGHT_MODEL_REASONING_ENABLED, MIDSCENE_INSIGHT_MODEL_RETRY_COUNT, MIDSCENE_INSIGHT_MODEL_RETRY_INTERVAL, MIDSCENE_INSIGHT_MODEL_SOCKS_PROXY, MIDSCENE_INSIGHT_MODEL_TEMPERATURE, MIDSCENE_INSIGHT_MODEL_TIMEOUT, MIDSCENE_IOS_DEVICE_UDID, MIDSCENE_IOS_SIMULATOR_UDID, MIDSCENE_LANGFUSE_DEBUG, MIDSCENE_LANGSMITH_DEBUG, MIDSCENE_MCP_ANDROID_MODE, MIDSCENE_MCP_CHROME_PATH, MIDSCENE_MCP_USE_PUPPETEER_MODE, MIDSCENE_MODEL_API_KEY, MIDSCENE_MODEL_BASE_URL, MIDSCENE_MODEL_EXTRA_BODY_JSON, MIDSCENE_MODEL_FAMILY, MIDSCENE_MODEL_HTTP_PROXY, MIDSCENE_MODEL_INIT_CONFIG_JSON, MIDSCENE_MODEL_MAX_TOKENS, MIDSCENE_MODEL_NAME, MIDSCENE_MODEL_REASONING_BUDGET, MIDSCENE_MODEL_REASONING_EFFORT, MIDSCENE_MODEL_REASONING_ENABLED, MIDSCENE_MODEL_RETRY_COUNT, MIDSCENE_MODEL_RETRY_INTERVAL, MIDSCENE_MODEL_SOCKS_PROXY, MIDSCENE_MODEL_TEMPERATURE, MIDSCENE_MODEL_TIMEOUT, MIDSCENE_OPENAI_HTTP_PROXY, MIDSCENE_OPENAI_INIT_CONFIG_JSON, MIDSCENE_OPENAI_SOCKS_PROXY, MIDSCENE_PLANNING_MODEL_API_KEY, MIDSCENE_PLANNING_MODEL_BASE_URL, MIDSCENE_PLANNING_MODEL_EXTRA_BODY_JSON, MIDSCENE_PLANNING_MODEL_FAMILY, MIDSCENE_PLANNING_MODEL_HTTP_PROXY, MIDSCENE_PLANNING_MODEL_INIT_CONFIG_JSON, MIDSCENE_PLANNING_MODEL_NAME, MIDSCENE_PLANNING_MODEL_REASONING_BUDGET, MIDSCENE_PLANNING_MODEL_REASONING_EFFORT, MIDSCENE_PLANNING_MODEL_REASONING_ENABLED, MIDSCENE_PLANNING_MODEL_RETRY_COUNT, MIDSCENE_PLANNING_MODEL_RETRY_INTERVAL, MIDSCENE_PLANNING_MODEL_SOCKS_PROXY, MIDSCENE_PLANNING_MODEL_TEMPERATURE, MIDSCENE_PLANNING_MODEL_TIMEOUT, MIDSCENE_PREFERRED_LANGUAGE, MIDSCENE_REPLANNING_CYCLE_LIMIT, MIDSCENE_REPORT_QUIET, MIDSCENE_REPORT_TAG_NAME, MIDSCENE_RUN_DIR, MIDSCENE_USE_DOUBAO_VISION, MIDSCENE_USE_GEMINI, MIDSCENE_USE_QWEN3_VL, MIDSCENE_USE_QWEN_VL, MIDSCENE_USE_VLM_UI_TARS, MIDSCENE_USE_VL_MODEL, MODEL_ENV_KEYS, MODEL_FAMILY_VALUES, NUMBER_ENV_KEYS, OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_MAX_TOKENS, STRING_ENV_KEYS, types_UITarsModelVersion as UITarsModelVersion, UNUSED_ENV_KEYS };\n","import node_fs from \"node:fs\";\nimport node_path from \"node:path\";\nimport node_util from \"node:util\";\nimport debug from \"debug\";\nimport { getMidsceneRunSubDir } from \"./common.mjs\";\nimport { ifInNode } from \"./utils.mjs\";\nconst topicPrefix = 'midscene';\nconst logStreams = new Map();\nconst debugInstances = new Map();\nfunction getLogStream(topic) {\n const topicFileName = topic.replace(/:/g, '-');\n if (!logStreams.has(topicFileName)) {\n const logFile = node_path.join(getMidsceneRunSubDir('log'), `${topicFileName}.log`);\n const stream = node_fs.createWriteStream(logFile, {\n flags: 'a'\n });\n logStreams.set(topicFileName, stream);\n }\n return logStreams.get(topicFileName);\n}\nfunction writeLogToFile(topic, message) {\n if (!ifInNode) return;\n const stream = getLogStream(topic);\n const now = new Date();\n const isoDate = now.toLocaleDateString('sv-SE');\n const isoTime = now.toLocaleTimeString('sv-SE');\n const milliseconds = now.getMilliseconds().toString().padStart(3, '0');\n const timezoneOffsetMinutes = now.getTimezoneOffset();\n const sign = timezoneOffsetMinutes <= 0 ? '+' : '-';\n const hours = Math.floor(Math.abs(timezoneOffsetMinutes) / 60).toString().padStart(2, '0');\n const minutes = (Math.abs(timezoneOffsetMinutes) % 60).toString().padStart(2, '0');\n const timezoneString = `${sign}${hours}:${minutes}`;\n const localISOTime = `${isoDate}T${isoTime}.${milliseconds}${timezoneString}`;\n stream.write(`[${localISOTime}] ${message}\\n`);\n}\nfunction getDebug(topic, options) {\n const fullTopic = `${topicPrefix}:${topic}`;\n const withConsole = options?.console ?? false;\n const cacheKey = withConsole ? `${fullTopic}:withConsole` : fullTopic;\n if (!debugInstances.has(cacheKey)) if (withConsole) {\n const baseFn = getDebug(topic);\n const wrapper = (...args)=>{\n baseFn(...args);\n console.warn('[Midscene]', ...args);\n };\n debugInstances.set(cacheKey, wrapper);\n } else {\n const debugFn = debug(fullTopic);\n const wrapper = (...args)=>{\n if (ifInNode) {\n const message = node_util.format(...args);\n writeLogToFile(topic, message);\n }\n debugFn(...args);\n };\n debugInstances.set(cacheKey, wrapper);\n }\n return debugInstances.get(cacheKey);\n}\nfunction enableDebug(topic) {\n if (ifInNode) return;\n debug.enable(`${topicPrefix}:${topic}`);\n}\nfunction cleanupLogStreams() {\n if (!ifInNode) return;\n for (const stream of logStreams.values())stream.end();\n logStreams.clear();\n debugInstances.clear();\n}\nexport { cleanupLogStreams, enableDebug, getDebug };\n","import { sha256 } from \"js-sha256\";\nimport { v4 } from \"uuid\";\nconst ifInBrowser = 'undefined' != typeof window;\nconst ifInWorker = 'undefined' != typeof WorkerGlobalScope;\nconst ifInNode = 'undefined' != typeof process && process.versions?.node;\nfunction uuid() {\n return v4();\n}\nconst hashMap = {};\nfunction generateHashId(rect, content = '') {\n const combined = JSON.stringify({\n content,\n rect\n });\n let sliceLength = 5;\n let slicedHash = '';\n const hashHex = sha256.create().update(combined).hex();\n const toLetters = (hex)=>hex.split('').map((char)=>{\n const code = Number.parseInt(char, 16);\n return String.fromCharCode(97 + code % 26);\n }).join('');\n const hashLetters = toLetters(hashHex);\n while(sliceLength < hashLetters.length - 1){\n slicedHash = hashLetters.slice(0, sliceLength);\n if (hashMap[slicedHash] && hashMap[slicedHash] !== combined) {\n sliceLength++;\n continue;\n }\n hashMap[slicedHash] = combined;\n break;\n }\n return slicedHash;\n}\nfunction assert(condition, message) {\n if (!condition) throw new Error(message || 'Assertion failed');\n}\nfunction getGlobalScope() {\n if ('undefined' != typeof window) return window;\n if ('undefined' != typeof globalThis) return globalThis;\n if ('undefined' != typeof self) return self;\n}\nlet isMcp = false;\nfunction setIsMcp(value) {\n isMcp = value;\n}\nfunction logMsg(...message) {\n if (!isMcp) console.log(...message);\n}\nasync function repeat(times, fn) {\n for(let i = 0; i < times; i++)await fn(i);\n}\nconst utils_REGEXP_LT = /</g;\nconst utils_REGEXP_GT = />/g;\nconst REGEXP_LT_ESCAPE = '__midscene_lt__';\nconst REGEXP_GT_ESCAPE = '__midscene_gt__';\nconst escapeScriptTag = (html)=>html.replace(utils_REGEXP_LT, REGEXP_LT_ESCAPE).replace(utils_REGEXP_GT, REGEXP_GT_ESCAPE);\nconst antiEscapeScriptTag = (html)=>{\n const REGEXP_LT = new RegExp(REGEXP_LT_ESCAPE, 'g');\n const REGEXP_GT = new RegExp(REGEXP_GT_ESCAPE, 'g');\n return html.replace(REGEXP_LT, '<').replace(REGEXP_GT, '>');\n};\nfunction replaceIllegalPathCharsAndSpace(str) {\n return str.replace(/[:*?\"<>|# ]/g, '-');\n}\nfunction isPlainObject(value) {\n return 'object' == typeof value && null !== value && !Array.isArray(value);\n}\nfunction normalizeForComparison(str) {\n return str.toLowerCase().replace(/[\\s\\-_]+/g, '');\n}\nfunction mergeAndNormalizeAppNameMapping(defaultMapping, userMapping) {\n const result = {};\n for (const [key, value] of Object.entries(defaultMapping))result[normalizeForComparison(key)] = value;\n if (userMapping) for (const [key, value] of Object.entries(userMapping))result[normalizeForComparison(key)] = value;\n return result;\n}\nexport { antiEscapeScriptTag, assert, escapeScriptTag, generateHashId, getGlobalScope, ifInBrowser, ifInNode, ifInWorker, isPlainObject, logMsg, mergeAndNormalizeAppNameMapping, normalizeForComparison, repeat, replaceIllegalPathCharsAndSpace, setIsMcp, uuid };\n","// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__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__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(\n\t\tObject.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t\t__webpack_require__.f[key](chunkId, promises);\n\t\t\treturn promises;\n\t\t}, [])\n\t);\n};","// This function allow to reference chunks\n__webpack_require__.u = (chunkId) => {\n // return url for filenames not based on template\n \n // return url for filenames based on template\n return \"static/js/async/\" + chunkId + \".\" + {\"195\": \"0366f6e8\",\"236\": \"a5d2c1b1\",\"271\": \"72510be8\",\"467\": \"710fa05a\",\"985\": \"b167d918\",}[chunkId] + \".js\"\n}","// This function allow to reference chunks\n__webpack_require__.miniCssF = (chunkId) => {\n // return url for filenames not based on template\n \n // return url for filenames based on template\n return \"\" + chunkId + \".css\"\n}","__webpack_require__.g = (() => {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\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};","__webpack_require__.p = \"/\";"],"names":["Promise","Error","_baseUrlFixScript","initDebugConfig","shouldPrintTiming","getBasicEnvValue","MIDSCENE_DEBUG_MODEL_PROFILE","debugConfig","console","MIDSCENE_DEBUG_MODEL_RESPONSE","enableDebug","_define_property","obj","key","value","Object","INSIGHT_MODEL_CONFIG_KEYS","MIDSCENE_INSIGHT_MODEL_NAME","MIDSCENE_INSIGHT_MODEL_SOCKS_PROXY","MIDSCENE_INSIGHT_MODEL_HTTP_PROXY","MIDSCENE_INSIGHT_MODEL_BASE_URL","MIDSCENE_INSIGHT_MODEL_API_KEY","MIDSCENE_INSIGHT_MODEL_INIT_CONFIG_JSON","MIDSCENE_INSIGHT_MODEL_EXTRA_BODY_JSON","MIDSCENE_INSIGHT_MODEL_FAMILY","MIDSCENE_INSIGHT_MODEL_TIMEOUT","MIDSCENE_INSIGHT_MODEL_TEMPERATURE","MIDSCENE_INSIGHT_MODEL_RETRY_COUNT","MIDSCENE_INSIGHT_MODEL_RETRY_INTERVAL","MIDSCENE_INSIGHT_MODEL_REASONING_EFFORT","MIDSCENE_INSIGHT_MODEL_REASONING_ENABLED","MIDSCENE_INSIGHT_MODEL_REASONING_BUDGET","PLANNING_MODEL_CONFIG_KEYS","MIDSCENE_PLANNING_MODEL_NAME","MIDSCENE_PLANNING_MODEL_SOCKS_PROXY","MIDSCENE_PLANNING_MODEL_HTTP_PROXY","MIDSCENE_PLANNING_MODEL_BASE_URL","MIDSCENE_PLANNING_MODEL_API_KEY","MIDSCENE_PLANNING_MODEL_INIT_CONFIG_JSON","MIDSCENE_PLANNING_MODEL_EXTRA_BODY_JSON","MIDSCENE_PLANNING_MODEL_FAMILY","MIDSCENE_PLANNING_MODEL_TIMEOUT","MIDSCENE_PLANNING_MODEL_TEMPERATURE","MIDSCENE_PLANNING_MODEL_RETRY_COUNT","MIDSCENE_PLANNING_MODEL_RETRY_INTERVAL","MIDSCENE_PLANNING_MODEL_REASONING_EFFORT","MIDSCENE_PLANNING_MODEL_REASONING_ENABLED","MIDSCENE_PLANNING_MODEL_REASONING_BUDGET","DEFAULT_MODEL_CONFIG_KEYS","MIDSCENE_MODEL_NAME","MIDSCENE_MODEL_SOCKS_PROXY","MIDSCENE_MODEL_HTTP_PROXY","MIDSCENE_MODEL_BASE_URL","MIDSCENE_MODEL_API_KEY","MIDSCENE_MODEL_INIT_CONFIG_JSON","MIDSCENE_MODEL_EXTRA_BODY_JSON","MIDSCENE_MODEL_FAMILY","MIDSCENE_MODEL_TIMEOUT","MIDSCENE_MODEL_TEMPERATURE","MIDSCENE_MODEL_RETRY_COUNT","MIDSCENE_MODEL_RETRY_INTERVAL","MIDSCENE_MODEL_REASONING_EFFORT","MIDSCENE_MODEL_REASONING_ENABLED","MIDSCENE_MODEL_REASONING_BUDGET","maskKey","maskChar","prefixLen","prefix","suffix","maskLength","mask","maskConfig","config","valueStr","JSON","parseJson","e","KEYS_MAP","decideModelConfigFromIntentConfig","intent","configMap","debugLog","getDebug","keysForFn","finalResult","parseOpenaiSdkConfig","_provider_keys_reasoningEffort","_provider_keys_reasoningEnabled_trim","val","keys","provider","useLegacyLogic","legacyAPIKey","OPENAI_API_KEY","legacyBaseURL","OPENAI_BASE_URL","legacySocksProxy","MIDSCENE_OPENAI_SOCKS_PROXY","legacyHttpProxy","MIDSCENE_OPENAI_HTTP_PROXY","legacyOpenaiExtraConfig","MIDSCENE_OPENAI_INIT_CONFIG_JSON","legacyModelFamily","legacyConfigToModelFamily","isDoubao","MIDSCENE_USE_DOUBAO_VISION","isQwen","MIDSCENE_USE_QWEN_VL","isQwen3","MIDSCENE_USE_QWEN3_VL","isUiTars","MIDSCENE_USE_VLM_UI_TARS","isGemini","MIDSCENE_USE_GEMINI","enabledModes","Boolean","modelFamilyRaw","openaiApiKey","openaiBaseURL","socksProxy","httpProxy","modelName","openaiExtraConfigStr","openaiExtraConfig","extraBodyStr","extraBody","temperature","Number","modelFamily","MODEL_FAMILY_VALUES","uiTarsModelVersion","UITarsModelVersion","modelDescription","_provider_keys_reasoningBudget","num","assert","ModelConfigManager","_this_globalConfigManager","defaultConfig","insightConfig","planningConfig","acc","String","globalConfigManager","modelConfig","createOpenAIClientFn","globalModelConfigManager","envConfig","ALL_ENV_KEYS","p","name","process","newConfig","extendMode","allConfig","MATCH_BY_POSITION","STRING_ENV_KEYS","BOOLEAN_ENV_KEYS","NUMBER_ENV_KEYS","trimmed","numValue","_this_override","GLOBAL_ENV_KEYS","MODEL_ENV_KEYS","savedNewConfig","getCurrentTime","device","useDeviceTimestamp","error","Date","getPreferredLanguage","prefer","MIDSCENE_PREFERRED_LANGUAGE","isChina","Intl","overrideAIConfig","isAutoGLM","isUITars","debugCodex","warnCodex","SerializedRunner","work","release","previous","resolve","isAbortError","message","toNonEmptyString","undefined","normalizeCodexLocalImagePath","imageUrl","platform","parsed","URL","pathname","decodeURIComponent","host","windowsPath","extractTextFromMessage","content","Array","part","extractImageInputs","inputs","partType","path","CodexAppServerConnection","ifInBrowser","spawn","readline","child","lineReader","connection","threadId","turnId","latestErrorMessage","latestUsage","messages","stream","onChunk","deepThink","abortSignal","startTime","timeoutMs","deadlineAt","isStreaming","developerInstructions","input","buildCodexTurnPayloadFromMessages","developerInstructionParts","transcriptParts","imageInputs","role","text","roleTag","fullTranscript","effort","resolveCodexReasoningEffort","normalized","accumulatedText","accumulatedReasoning","emitChunk","reasoning","isComplete","usage","turnStartResponse","params","turnStatus","threadStartResponse","method","notification","messageText","delta","t","line","chunk","Buffer","code","tokenUsage","picked","requestId","request","result","includePending","setTimeout","payload","reject","stderr","codexConnectionManager","staleConnection","callAIWithCodexAppServer","options","AIResponseParseError","rawResponse","createChatClient","proxyAgent","createOpenAIClient","timeout","warnClient","debugProxy","warnProxy","sanitizeProxyUrl","url","ProxyAgent","socksDispatcher","proxyUrl","port","protocol","socksType","openAIOptions","baseOpenAI","OpenAI","openai","MIDSCENE_LANGSMITH_DEBUG","wrapOpenAI","MIDSCENE_LANGFUSE_DEBUG","observeOpenAI","wrappedClient","callAI","baseURL","timeCost","normalizedDeepThink","completion","maxTokens","MIDSCENE_MODEL_MAX_TOKENS","OPENAI_MAX_TOKENS","debugCall","warnCall","debugProfileStats","debugProfileDetail","accumulated","buildUsageInfo","usageData","cachedInputTokens","commonConfig","reasoningEffortConfig","reasoningEffortDebugMessage","warningMessage","resolveReasoningConfig","reasoningEnabled","reasoningEffort","reasoningBudget","debugMessages","messagesWithImageDetail","msg","reasoning_content","chunkData","estimatedTokens","Math","finalChunk","lastError","retryCount","retryInterval","maxAttempts","attempt","callAIWithObjectResponse","response","jsonContent","safeParseJson","callAIWithStringResponse","msgs","normalizeJsonObject","item","trimmedKey","normalizedValue","cleanJsonString","extractJSONFromCodeBlock","jsonMatch","codeBlockMatch","jsonLikeMatch","jsonrepair","jsonString","preprocessDoubaoBboxJson","generateElementByPoint","center","description","edgeSize","centerX","centerY","offset","generateElementByRect","sourceRect","debug","photonModule","isInitialized","getPhoton","env","ifInWorker","ifInNode","photon","createCanvasFallbackModule","fallbackError","getSharp","sharp","imgDebug","resizeAndConvertImgBuffer","inputFormat","inputData","newSize","node_assert","resizeStartTime","Sharp","get_sharp","originalWidth","originalHeight","resizedBuffer","resizeEndTime","PhotonImage","SamplingFilter","resize","get_photon","inputBytes","Uint8Array","bytesliceResult","inputImage","outputImage","outputBytes","resizeImgBase64","inputBase64","body","mimeType","parseBase64","imageBuffer","buffer","format","photonFromBase64","base64","paddingToMatchBlock","image","blockSize","width","height","targetWidth","targetHeight","padding_right","padding_bottom","Rgba","rightPadding","bottomPadding","white","previousResult","paddingToMatchBlockByBase64","imageBase64","photonImage","paddedResult","photonToBase64","cropByRect","rect","paddingImage","crop","left","top","cropped","quality","bytes","base64Body","httpImg2Base64","fetch","contentType","localImg2Base64","imgPath","withoutHeader","readFileSync","type","node_path","preProcessImageUrl","convertHttpImage2Base64","fullBase64String","separator","index","scaleImage","scale","scaleStartTime","metadata","newWidth","newHeight","scaleEndTime","debugInspectUtils","adaptBbox","bbox","normalizedBbox","adaptDoubaoBbox","splitted","bboxList","x","y","defaultBboxSize","adaptQwen2_5Bbox","adaptGpt5Bbox","numericBbox","adaptBboxToRect","offsetX","offsetY","rightLimit","bottomLimit","right","bottom","rectLeft","rectTop","rectWidth","boundedRight","rectHeight","boundedBottom","finalLeft","finalTop","expandSearchArea","screenSize","expandedLeft","expandedTop","expandRect","currentArea","scaleFactor","minArea","PointSchema","z","SizeSchema","TMultimodalPromptSchema","TUserPromptSchema","MidsceneLocationInput","findAllMidsceneLocatorField","zodType","requiredOnly","zodObject","field","ifMidsceneLocatorField","actualField","shape","r","dumpActionParam","jsonObject","zodSchema","isPlainObject","locatorFields","fieldName","fieldValue","getReadableTimeString","timestamp","now","year","month","day","hours","minutes","seconds","timeString","extractValueAfter","src","idx","rest","parseAutoGLMResponse","parts","think","getMultilingualFormattedDate","today","date","dayOfWeek","getChineseFormattedDate","weekday","weekdayNames","extractXMLTag","xmlString","tagName","lowerXmlString","lowerTagName","closeTag","openTag","lastCloseIndex","lastOpenIndex","contentStart","remaining","nextTagIndex","searchArea","bboxDescription","debugInspect","debugSection","buildSearchAreaConfig","context","baseRect","sectionRect","croppedResult","scaledResult","extraTextFromUserPrompt","prompt","promptsToChatParam","multimodalPrompt","AiLocateElement","res","resRect","preferredLanguage","bboxComment","targetElementDescription","screenshotBase64","targetElementDescriptionText","userInstructionPrompt","systemPrompt","getAutoGLMLocatePrompt","imagePayload","imageWidth","imageHeight","originalImageWidth","originalImageHeight","addOns","rawResponseContent","parseAutoGLMLocateResponse","actionContent","elementMatch","errorMessage","matchedElements","errors","pixelX","pixelY","finalX","finalY","element","callError","l","AiLocateSection","rects","searchAreaConfig","bboxFormat","sectionDescription","sectionBbox","minLeft","minTop","targetRect","referenceBboxList","referenceRects","mergedRect","maxRight","maxBottom","expandedRect","AiExtractElementInfo","pageDescription","parseResult","dataQueryText","dataQuery","extractOption","extractDataPromptText","userContent","parseXMLExtractionResponse","data","thought","dataJsonStr","errorsStr","parsedErrors","parseError","unwrapZodField","f","typeName","isMidsceneLocatorField","_actualField__def","_actualField__def1","getZodTypeName","locatorTypeDescription","_actualField__def_values","_actualField__def2","fieldTypeName","values","option","types","opt","getZodDescription","findDefaultValue","current","visited","Set","currentWithDef","SAMPLE_BBOXES","descriptionForAction","action","locatorSchemaTypeDescription","includeBbox","fields","schema","paramLines","isZodObject","keyWithOptional","isOptional","defaultValue","hasDefault","paramLine","comments","defaultStr","paramDescription","locateFields","sampleWithBbox","injectBboxIntoSample","sample","bboxIndex","sampleStr","systemPromptToTaskPlanning","actionSpace","includeThought","includeSubGoals","actionList","actionDescriptionList","shouldIncludeSubGoals","locateExample1","locateNameField","locateEmailField","explicitInstructionRule","thoughtTagDescription","subGoalTags","checkGoalStepNumber","actionStepNumber","warnLog","parseXMLPlanningResponse","finalizeMessage","finalizeSuccess","memory","log","actionType","actionParamStr","completeGoalMatch","updatePlanContent","markSubGoalDone","updateSubGoals","parseSubGoalsFromXML","xmlContent","match","subGoals","regex","status","markFinishedIndexes","parseMarkFinishedIndexes","indexes","param","plan","userInstruction","opts","latestFeedbackMessage","planFromAI","conversationHistory","shotSize","actionContext","instruction","subGoalsText","subGoalsSection","memoriesText","memoriesSection","retry","actions","shouldContinuePlanning","returnValue","buildYamlFlowFromPlans","plans","flow","verb","flowItem","actionInActionSpace","locateResult","locate","autoGLMCoordinateToBbox","pointToBbox","bboxSize","halfSize","BACK_BUTTON_NAMES","HOME_BUTTON_NAMES","findActionName","knownNames","defaultName","a","autoGLMPlanning","parsedResponse","transformedActions","getAutoGLMPlanPrompt","imagePayloadBase64","parsedAction","parseAction","trimmedResponse","actionMatch","baseAction","startMatch","endMatch","app","durationMatch","durationMs","transformAutoGLMAction","size","finishAction","doAction","x1","y1","x2","y2","tapAction","doubleTapAction","typeAction","direction","distance","swipeAction","deltaX","deltaY","absDeltaX","absDeltaY","longPressAction","backAction","homeAction","waitAction","launchAction","_keyDefinitions","lowerCaseKeyDefinitions","definition","lowerKey","getKeyDefinition","isMac","window","keyMap","point","uiTarsPlanning","convertedText","getUiTarsPlanningPrompt","cleanedText","x1Num","y1Num","x2Num","y2Num","actionParser","transformActions","unhandledActions","shouldContinue","getPoint","startPoint","endPoint","keyInput","errorDetails","prediction","startBox","Symbol","ConversationHistory","maxImages","clonedMessages","structuredClone","imageCount","i","j","goal","existingByIndex","Map","validSubGoals","mergedSubGoals","existingGoal","hasNonEmptyDescription","updates","g","changed","firstPending","runningGoal","lines","currentGoal","currentGoalText","logLines","threshold","keepCount","omittedCount","omittedPlaceholder","recentMessages","debugUtils","multimodalLocateOptionKeys","multimodalLocateOptionFieldMap","extractMultimodalPrompt","entries","buildDetailedLocateParam","locatePrompt","xpath","normalizedLocatePrompt","innerPrompt","hasMultimodalFields","deepLocate","cacheable","aiTaskHandlerMap","isStringParamSchema","schemaDef","buildLaunchOrAdbShellParam","actionName","interfaceAlias","ScriptPlayer","keyToUse","taskIndex","taskIndexToNotify","taskStatus","statusValue","output","outputDir","dirname","existsSync","mkdirSync","writeFileSync","filePath","agent","flowItemIndex","simpleAIKey","aiAct","aiAction","ai","actionOptions","restOpts","pass","agentMethod","aiResult","aiWaitFor","restWaitForOpts","waitForOptions","ms","sleepTask","msNumber","evaluateJavaScriptTask","title","recordTask","aiInput","rawValue","inputTask","keyName","aiKeyboardPress","keyboardPressTask","aiScroll","scrollTask","scrollOptions","aiTap","tapOptions","locateObj","lp","locateOpts","locatePromptShortcut","actionParamForMatchedAction","stringParamToCall","matchedAction","actionInterfaceAlias","keyOfActionInActionSpace","schemaIsStringParam","specialActionParamToCall","resultName","sourceForParams","locateParam","restParams","buildDetailedLocateParamAndRestParams","excludeKeys","allKeys","locateParamKeys","multimodalPromptKeys","flowParams","target","web","android","ios","computer","tasks","freeFn","newAgent","newFreeFn","webEnv","originalOnTaskStartTip","tip","errorFlag","fn","script","setupAgent","onTaskStatusChange","scriptPath","resolvedAiActContext","scriptName","basename","join","getMidsceneRunSubDir","task","noReplayAPIs","parseStructuredParams","_","optionsWithoutDeviceOptions","paramObj","locatorFieldKeys","locateKey","detailedLocateParam","executeAction","activeAgent","parsedParams","actionParams","examplesMap","escapeContent","escapeScriptTag","unescapeContent","antiEscapeScriptTag","generateDumpScriptTag","json","attributes","attrString","k","v","encodeURIComponent","ScreenshotItem","capturedAt","uuid","htmlPath","imageId","targetTag","streamScanTags","onMatch","fd","openSync","fileSize","statSync","position","leftover","capturing","currentContent","bytesRead","readSync","searchStart","endIdx","startIdx","closeSync","relativePath","absolutePath","record","id","detectFormat","ServiceError","dump","replacerForDumpSerialization","_key","reviverForDumpDeserialization","ExecutionDump","indents","serialized","screenshots","GroupedActionDump","processValue","exec","execution","basePath","screenshotsDir","screenshotMap","screenshot","imagePath","rawBase64","dumpString","screenshotsMapPath","imageMap","mime","restoreImageReferences","resolveImage","screenshotData","resolved","rmSync","DIGIT_FONT","fillRect","pixels","color","w","h","py","px","createSvgOverlay","elements","boxPadding","borderThickness","overlayPixels","colors","promptY","paddedLeft","paddedTop","paddedWidth","paddedHeight","drawRect","thickness","isLeftBorder","isRightBorder","isTopBorder","isBottomBorder","indexId","textWidth","FONT_WIDTH","rectX","rectY","textHeight","checkOverlap","otherElement","isWithinBounds","drawNumber","startX","startY","str","digit","drawDigit","bitmap","row","col","sy","sx","compositeElementInfoImg","resized","elementsPositionInfo","basePixels","blendedPixels","blendPixels","overlayAlpha","baseAlpha","outAlpha","resultImage","createServiceDump","baseData","Service","query","searchAreaPrompt","searchAreaRawResponse","searchAreaUsage","searchAreaResponse","errorLog","queryPrompt","hasPlanLocatedElement","taskInfo","dumpData","dataDemand","examples","defaultRectSize","debugTiming","setTimingFieldOnce","timing","existingValue","TaskRunner","shouldReuse","uiContext","phase","recorderItem","previousFindOutput","finalizeError","nextPendingIndex","successfullyCompleted","executor","forceRefresh","executorContext","errorTask","messageBase","stack","TaskExecutionError","outputIndex","errorMsg","uiContextBuilder","runner","reportInitializedMap","reportGroupIdMap","getReportTpl","sleep","debugMode","MIDSCENE_DEBUG_MODE","gitInfoPromise","lastReportedRepoUrl","uploadTestInfoToServer","testUrl","serverUrl","repoUrl","userEmail","getGitInfoAsync","execFileAsync","promisify","execFile","stdout","nullReportGenerator","ReportGenerator","reportFileName","groupMeta","MIDSCENE_REPORT_QUIET","logMsg","dir","appendFileSync","singleDump","ext","dumpAttributes","getMidsceneLocationSchema","ActionSleepParamSchema","imageInfoOfBase64","base64Data","commonContextParser","interfaceInstance","_opt","interfaceSize","logicalWidth","logicalHeight","screenshotCapturedAt","imgWidth","imgHeight","logicalIsPortrait","screenshotIsPortrait","finalLogicalWidth","userShrinkFactor","dpr","shrunkShotToLogicalRatio","resizedBase64","ifPlanLocateParamIsBbox","planLocateParam","matchElementFromCache","cacheEntry","cachePrompt","cacheDebug","parsePrompt","cacheFileExt","TaskCache","promptStr","isDeepStrictEqual","locateItem","cb","yamlWorkflow","yaml","hasNonEmptyFlow","cache","cacheFile","jsonTypeCacheFile","jsonData","semver","__VERSION__","err","originalLength","usedIndices","isUsed","isNew","removedCount","sortedCaches","b","cacheToWrite","yamlData","newRecord","cachedRecord","locateCache","cacheId","isCacheResultUsed","cacheFilePath","cacheContent","safeCacheId","replaceIllegalPathCharsAndSpace","cacheMaxFilenameLength","MIDSCENE_CACHE_MAX_FILENAME_LENGTH","hash","generateHashId","readOnlyMode","writeOnlyMode","ExecutionSession","contextProvider","hasNonEmptyCache","locatePlanForLocate","TaskBuilder","modelConfigForPlanning","modelConfigForDefaultIntent","planHandlers","defaultHandler","handler","taskActionFinished","taskLocate","planType","requiredLocateFields","locatePlan","locateTask","taskContext","originalError","originalMessage","parseActionParam","rawParam","locateFieldValues","paramsForValidation","validated","ratio","actionFn","actionResult","delayAfterRunner","onResult","locateCacheRecord","locateDump","rectFromXpath","elementFromAiLocate","currentCacheEntry","hitBy","applyDump","planLocatedElement","matchElementFromPlan","elementFromBbox","isPlanHit","elementFromXpath","isXpathHit","elementFromCacheResult","elementFromCache","isCacheHit","locateCacheAlreadyExists","pointForCache","feature","service","taskCache","waitAfterAction","truncateText","maxLength","typeStr","locateParamStr","taskTitleStr","paramStr","planTask","scrollParam","extractInsightParam","taskParam","extractImages","source","toContent","locateStr","scrollParamStr","pullParamStr","pullParam","TaskExecutor","yamlString","session","userPrompt","includeBboxInPlanning","aiActContext","replanningCycleLimitOverride","imagesIncludeCount","fileChooserAccept","withFileChooser","outputString","replanCount","yamlFlow","replanningCycleLimit","errorCountInOnePlanningLoop","executables","subGoalStatus","memoriesStatus","planResult","planImpl","planError","initialTimeString","demand","queryDump","extractResult","ifTypeRestricted","demandInput","keyOfResult","extraPageDescription","tree","descriptionOfTree","truncateTextLength","filterNonTextContent","visibleOnly","attributesString","kv","buildContentTree","node","indent","before","contentWithIndent","after","emptyNode","indentStr","children","childContent","_node_node_attributes","nodeTypeString","rectAttribute","currentKey","attributeVal","outputResult","queryTask","assertion","textPrompt","checkIntervalMs","domIncluded","screenshotIncluded","restOpt","serviceExtractOpt","overallStartTime","lastCheckStart","errorThought","currentCheckStart","elapsed","timeRemaining","sleepTasks","chooser","dispose","getError","defaultServiceExtractOption","CACHE_STRATEGIES","CACHE_STRATEGY_VALUES","legacyScrollTypeMap","Agent","callback","_error","maxRetries","WeakMap","currentDump","existingIndex","reportHTMLContent","reportPath","appendReport","withTpl","tpl","writeToFile","dumpContent","resolveAutoGroupId","existingGroupId","newGroupId","attributesArr","insertScriptBeforeClosingHtml","scriptContent","htmlEndTag","stat","fs","readSize","start","tailStr","htmlEndIdx","beforeHtmlInTail","htmlEndPos","executionDump","actionPlan","defaultIntentModelConfig","locatePromptOrValue","locatePromptOrOpt","optOrUndefined","optWithValue","stringValue","mode","locatePromptOrKeyName","o","locatePromptOrScrollParam","scrollType","isLocatePromptLike","normalizedScrollType","taskPrompt","runAiAct","actionOutput","noIndividualLocateModel","isVlmUiTars","isAutoGlm","matchedCache","yamlContent","yamlFlowStr","verifyResult","verifyPrompt","retryLimit","success","resultPrompt","locateOpt","expectCenter","verifyLocateOption","verifyCenter","verifyRect","distanceOfTwoPoints","p1","p2","included","includedInRect","serviceOpt","assertionText","rawError","rawMessage","args","yamlScriptContent","player","parseYamlScript","processedContent","matchedDeviceId","deviceId","interpolatedContent","processedLines","trimmedLine","envVar","pathTip","listener","finalPath","recorder","groupName","groupDescription","executions","cacheConfig","processCacheConfig","envEnabled","MIDSCENE_CACHE","strategyValue","strategy","rawStrategy","isReadOnly","isWriteOnly","files","file","filesArray","envReplanningCycleLimit","MIDSCENE_REPLANNING_CYCLE_LIMIT","hasCustomConfig","cacheConfigObj","baseActionSpace","duration","getReportFileName","tag","reportTagName","MIDSCENE_REPORT_TAG_NAME","dateTimeInFileName","dayjs","uniqueId","BasePlaygroundAdapter","_context","needsStructuredParams","paramsList","filtered","zodError","errorMessages","shapeKeys","paramValue","displayKey","formattedValue","isLocateField","LocalExecutionAdapter","page","contextPage","aiConfig","removeListener","executionError","groupedDump","_requestId","reportHTML","html","interfaceType","createScrcpyPreviewDescriptor","custom","overrides","createMjpegPreviewDescriptor","createScreenshotPreviewDescriptor","normalizeExecutionUxHints","fromHints","fromSingle","agentFactory","RemoteExecutionAdapter","missingFields","fieldDef","androidError","androidErrors","keyword","errorText","optionalParams","optionalFields","actionSpaceMethod","jsonError","detail","setInterval","progressData","clearInterval","PlaygroundSDK","hook","adapter","globalThemeConfig","Logo","hideLogo","isDarkMode","useTheme","setIsDarkMode","useState","useEffect","checkTheme","_document_querySelector","document","observer","MutationObserver","jsx","__webpack_require__","exports","prop","external_zustand_namespaceObject","create","store_create","AUTO_ZOOM_KEY","BACKGROUND_VISIBLE_KEY","ELEMENTS_VISIBLE_KEY","MODEL_CALL_DETAILS_KEY","DARK_MODE_KEY","PLAYBACK_SPEED_KEY","SUBTITLE_ENABLED_KEY","getQueryPreference","paramName","searchParams","URLSearchParams","useGlobalPreference","set","savedAutoZoom","localStorage","savedBackgroundVisible","savedElementsVisible","savedModelCallDetails","savedDarkMode","parsedPlaybackSpeed","savedPlaybackSpeed","savedSubtitleEnabled","autoZoomFromQuery","elementsVisibleFromQuery","darkModeFromQuery","initialDarkMode","visible","enabled","speed","CONFIG_KEY","SERVICE_MODE_KEY","TRACKING_ACTIVE_TAB_KEY","DEEP_LOCATE_KEY","DEEP_THINK_KEY","SCREENSHOT_INCLUDED_KEY","DOM_INCLUDED_KEY","IME_STRATEGY_KEY","AUTO_DISMISS_KEYBOARD_KEY","KEYBOARD_DISMISS_STRATEGY_KEY","ALWAYS_REFRESH_SCREEN_INFO_KEY","getConfigStringFromLocalStorage","configString","parseConfig","cleanLine","parsedValue","useEnvConfig","get","ifInExtension","savedServiceMode","savedForceSameTabNavigation","savedDeepLocate","savedDeepThinkRaw","savedScreenshotIncluded","savedDomIncluded","serviceMode","latestConfigString","forceSameTabNavigation","tab","imeStrategy","autoDismissKeyboard","keyboardDismissStrategy","alwaysRefreshScreenInfo","EnvConfig","showTooltipWhenEmpty","showModelName","tooltipPlacement","loadConfig","syncFromStorage","isModalOpen","setIsModalOpen","tempConfigString","setTempConfigString","midsceneModelName","componentRef","useRef","showModal","jsxs","Tooltip","SettingOutlined","Modal","Input","NavActions","showEnvConfig","githubUrl","helpUrl","className","Typography","GithubOutlined","QuestionCircleOutlined","autoDismissKeyboardTip","apiMetadata","defaultMainButtons","getWelcomeMessageTemplate","targetName","BLANK_RESULT","mousePointer","mouseLoading","_object_spread","arguments","ownKeys","sym","cameraStateForRect","rectWidthOnPage","cameraPaddingRatio","rectRatio","cameraWidth","allScriptsFromDump","_normalizedDump_executions","firstWidth","firstHeight","sdkVersion","modelBriefs","normalizedDump","metaInfo","_task_uiContext_shotSize","_task_uiContext","candidate","model_name","model_description","list","brief","allScripts","execIndex","scripts","generateAnimationScripts","insightCameraState","lastTaskId","executionIndex","tasksIncluded","startIndex","fullPageCameraState","createScript","base","cachedImg","insightOnTop","initSubTitle","_task_output","_planTask_output","_context_shotSize","_context_shotSize1","_planningTask_recorder_","_task_uiContext_shotSize1","_task_uiContext1","_task_recorder_","_task_recorder","_task_uiContext_shotSize2","_task_uiContext2","_task_uiContext_shotSize3","_task_uiContext3","_task_recorder_1","_task_recorder1","_task_uiContext_shotSize4","_task_uiContext4","_task_uiContext_shotSize5","_task_uiContext5","_task_recorder_2","_task_recorder2","_task_uiContext_shotSize6","_task_uiContext6","_task_uiContext_shotSize7","_task_uiContext7","_tasksIncluded_taskIndex","currentTaskId","locateElements","knownFields","subTitle","contextScreenshot","_task_log_taskInfo","_task_log","replay_scripts_ownKeys","object","enumerableOnly","symbols","planningTask","img","taskId","errorTitle","errorSubTitle","asyncGeneratorStep","gen","_next","_throw","arg","info","_async_to_generator","self","_object_spread_props","usePlaygroundExecution_ownKeys","formatError","_error_dump","wrapExecutionDumpForReplay","deviceType","IndexedDBManager","indexedDB","event","db","keyPath","store","storeNames","operation","transaction","storeName","sortByTimestamp","results","objectStore","dbName","version","storeConfigs","withErrorHandling","onQuotaExceeded","createCleanupFunction","dbManager","maxItems","toDelete","indexeddb_storage_provider_ownKeys","MESSAGES_STORE","RESULTS_STORE","IndexedDBStorageProvider","messagesToSave","lightMessage","restoredItem","fullResult","compressedResult","_result_result_dump","_result_result","compressedTasks","sizeKB","messageCount","resultCount","namespace","storage_provider_ownKeys","LocalStorageProvider","testKey","testData","lightMessages","messageData","DOMException","lightRecentMessages","retryError","stored","resultKey","storedResult","resultItem","resultKeys","keysToRemove","playgroundKeys","additionalKeysToRemove","storage_provider_MemoryStorageProvider","storage_provider_NoOpStorageProvider","_messages","_id","_result","createStorageProvider","detectBestStorageType","usePlaygroundState_ownKeys","blackboard","props","_props_uiContext","highlightElements","highlightRect","screenWidth","screenHeight","highlightOverlays","react","normalizeBlackboardHighlights","deduped","label","dedupeKey","highlightElementRects","highlight","bottomTipA","el","shiny_text","disabled","colorTheme","style","themeClass","errorMessageServerNotReady","serverLaunchTip","notReadyMessage","Alert","emptyResultTip","ContextPreview","uiContextPreview","setUiContextPreview","showContextPreview","iconForStatus","CheckOutlined","WarningOutlined","CloseOutlined","ClockCircleOutlined","LogoutOutlined","ArrowRightOutlined","MinusOutlined","Button","playground_demo_ui_context","EnvConfigReminder","ExclamationCircleFilled","global_perspective","global_perspective_ownKeys","player_setting","player_setting_ownKeys","createDefaultCameraState","updateImage","sf","baseW","baseH","nextImgW","nextImgH","dimensionsChanged","resetCamera","checkPointerMoved","prev","cur","deriveFrameState","scriptFrames","frame","fps","defaultCamera","_sf_taskId","_sf_taskId1","sfEnd","handleImg","handleInsight","cameraStartFrame","cameraFrameIn","handleClearInsight","alpha","derive_frame_state_ownKeys","firstImgScript","getPlaybackViewport","containerWidth","containerHeight","contentWidth","contentHeight","StepsTimeline","frameMap","autoZoom","compWidth","compHeight","baseImgW","baseImgH","state","useMemo","imgW","imgH","prevImg","camera","prevCamera","insights","spinningPointer","spinningElapsedMs","currentPointerImg","frameInScript","imageChanged","pointerMoved","rawProgress","pT","cT","pointerLeft","pointerTop","cameraLeft","cameraTop","tx","ty","transformStyle","camH","ptrX","ptrY","showCursor","resScale","crossfadeAlpha","spinRotation","insight","overlays","loadImage","Image","formatTime","totalSeconds","m","Player","_frameMap_totalDurationInFrames","_frameMap_fps","setAutoZoom","playbackSpeed","setPlaybackSpeed","subtitleEnabled","setSubtitleEnabled","calculateFrameMap","baseImageWidth","baseImageHeight","s","currentFrame","_camera_pointerLeft","_camera_pointerTop","_camera_pointerLeft1","_camera_pointerTop1","frames","iw","ih","insightPhaseFrames","cameraPhaseFrames","cameraDurationMs","totalFrames","stepsDurationInFrames","containerRef","renderLayerRef","lastTaskIdRef","containerSize","setContainerSize","ro","ResizeObserver","entry","useFramePlayer","_options_playbackRate","_options_playbackRate1","durationInFrames","autoPlay","loop","setCurrentFrame","playing","setPlaying","playingRef","frameRef","rateRef","durationRef","fpsRef","loopRef","rafId","lastTime","tick","frameDuration","next","requestAnimationFrame","cancelAnimationFrame","resetIfAtEnd","play","useCallback","pause","toggle","seekTo","clamped","totalDurationInFrames","deriveTaskId","stepsFrame","currentFrameState","subtitle","controlsVisible","setControlsVisible","hideTimerRef","showControls","clearTimeout","onMouseEnter","onMouseLeave","handleKeyDown","_e_target","seekBarRef","handleSeekPointerDown","bar","seek","clientX","onMove","ev","onUp","isFullscreen","setIsFullscreen","toggleFullscreen","isExporting","setIsExporting","exportProgress","setExportProgress","handleExportVideo","onProgress","pct","total","imgSrcs","imgCache","cursorImg","spinnerImg","canvas","ctx","MediaRecorder","chunks","blob","Blob","track","performance","lastFrame","targetFrame","drawSteps","rotation","st","fInScript","spinning","POINTER_PHASE","camL","camT2","camW","zoom","crossAlpha","drawImg","imgEl","drawInsightOverlays","cameraTransform","bx","contentY","rx","ry","rw","rh","sX","sY","hasPtrData","progress","elapsedMs","chapterMarkers","markers","globalFrame","percent","compositionWidth","compositionHeight","isPortraitCanvas","seekPercent","PauseOutlined","CaretRightOutlined","marker","DownloadOutlined","Dropdown","Spin","ExportOutlined","Switch","checked","FontSizeOutlined","ThunderboltOutlined","CompressOutlined","ExpandOutlined","PlaygroundResultView","loading","serverValid","replayScriptsInfo","replayCounter","loadingProgressText","verticalMode","fitMode","canDownloadReport","resultWrapperClassName","resultDataToShow","shouldPrioritizeResult","LoadingOutlined","errorNode","resultOutput","reportContent","avatar","avatar_ownKeys","history_create","HISTORY_KEY","LAST_SELECTED_TYPE_KEY","useHistoryStore","historyString","newHistory","historyItem","currentHistory","typeHistory","stringifiedNewItem","newTypeHistory","stringifiedOldItem","history_ownKeys","isZodObjectSchema","_field__def","_field__def1","_fieldWithRuntime__def","fieldWithRuntime","VALIDATION_CONSTANTS","desc","unwrapZodType","_actualField__def3","_actualField__def4","getDeviceCapabilities","hasDeviceSpecificConfig","actionNameForType","typeWithoutAi","fullName","words","setting","setting_ownKeys","ConfigSelector","items","showDeepLocateOption","showDeepThinkOption","enableTracking","showDataExtractionOptions","hideDomAndScreenshotOptions","setForceSameTabNavigation","setDeepLocate","setDeepThink","setScreenshotIncluded","setDomIncluded","setImeStrategy","setAutoDismissKeyboard","setKeyboardDismissStrategy","setAlwaysRefreshScreenInfo","deviceCapabilities","hasDeviceOptions","configItems","Checkbox","Radio","TextArea","renderLabel","TextField","isRequired","marginBottom","customPlaceholder","placeholder","Form","LocateField","EnumField","_fieldSchema__def","fieldSchema","selectOptions","enumValues","Select","NumberField","defaultPlaceholder","placeholderValue","max","min","InputNumber","BooleanField","icons_close","close_ownKeys","icons_history","magnifying_glass","magnifying_glass_ownKeys","Text","HistorySelector","onSelect","history","currentType","searchText","setSearchText","clearHistory","modalRef","groupedHistory","sevenDaysAgo","oneYearAgo","filteredHistory","handleClickOutside","timer","renderHistoryGroup","Fragment","PromptInput","hiddenAPIs","groupedItems","interactionAPIs","extractionAPIs","validationAPIs","deviceSpecificAPIs","runButtonEnabled","form","selectedType","dryMode","stoppable","onRun","onStop","clearPromptAfterRun","hoveringSettings","setHoveringSettings","promptValue","setPromptValue","textAreaRef","modeRadioGroupRef","lastHistoryRef","lastSelectedType","addHistory","setLastSelectedType","historyForSelectedType","needsAnyInput","dataExtractionMethods","hasConfigOptions","hasTracking","hasDataExtraction","availableDropdownMethods","metadataMethods","availableMethods","finalMethods","methodInfo","getDefaultParams","defaultParams","extractDefaultValue","_currentField__def","currentField","scrollToSelectedItem","container","targetElement","selectedRadioButton","dropdownButton","containerRect","targetLeft","lastHistory","timeoutId","formPromptValue","handleSelectHistory","handlePromptChange","hasSingleStructuredParam","isRunButtonEnabled","playground_utils_mjs_isRunButtonEnabled","currentParams","handleRunWithHistory","historyPrompt","locateValue","otherValues","_values_params","mainPart","newHistoryItem","_textAreaRef_current_resizableTextArea","textarea","selectionStart","lastNewlineIndex","isAtLastLine","handleStructuredKeyDown","renderStructuredParams","schemaKeys","isLocateFieldFlag","placeholderText","_fieldDef__def","sortedKeys","keyA","keyB","fieldSchemaA","fieldSchemaB","isOptionalA","isOptionalB","fieldProps","directionField","distanceField","otherFields","handleMouseEnter","handleMouseLeave","renderActionButton","runButton","SendOutlined","BorderOutlined","apiType","_apiMetadata_apiType","api","_apiMetadata_api","DownOutlined","ErrorMessage","cleanError","UniversalPlayground","playgroundSDK","storage","componentConfig","branding","sdkReady","setSdkReady","effectiveStorage","sdk","bestStorageType","setLoading","infoList","setInfoList","actionSpaceLoading","showScrollToBottomButton","setReplayCounter","infoListRef","currentRunningIdRef","interruptedFlagRef","clearInfoList","handleScrollToBottom","usePlaygroundState","setActionSpace","setActionSpaceLoading","setShowScrollToBottomButton","autoScrollEnabled","setAutoScrollEnabled","lastScrollTopRef","setVerticalMode","initializedRef","initializeMessages","welcomeMessage","storedMessages","oldStorage","oldMessages","hasWelcomeMessage","_contextProvider_getUIContext","space","handleResize","scrollToBottom","checkIfScrolledToBottom","scrollTop","scrollHeight","clientHeight","isAtBottom","scrollingUp","refreshContext","newContext","handleStop","canStop","usePlaygroundExecution","handleRun","thisRunningId","displayContent","userItem","systemItem","_executionDump_tasks","progressItems","_task_timing","systemItemIndex","listWithoutCurrentProgress","resolvedDeepThink","executionOptions","resultObj","replayInfo","counter","c","separatorItem","cancelResult","executionData","_executionData_dump","stopItem","handleFormRun","configAlreadySet","finalShowContextPreview","layout","showVersionInfo","ClearOutlined","List","_parts_","_item_result","_item_result1","_item_result2","currentIndex","laterProgressExists","shouldShowLoading","listItem","icons","ArrowDownOutlined","ScreenshotViewer","getScreenshot","getInterfaceInfo","serverOnline","isUserOperating","mjpegUrl","setScreenshot","setError","lastUpdateTime","setLastUpdateTime","interfaceInfo","setInterfaceInfo","isMjpeg","pollingIntervalRef","isPollingPausedRef","fetchScreenshot","isManual","fetchInterfaceInfo","startPolling","stopPolling","pausePolling","resumePolling","handleManualRefresh","InfoCircleOutlined","formatLastUpdateTime","diff","ReloadOutlined","ScrcpyPanel","reconnectInterval","canvasStageRef","socketRef","decoderRef","reconnectTimerRef","connectRef","disconnectRef","manuallyDisconnectedRef","setStatus","setErrorMessage","screenInfo","setScreenInfo","webCodecsSupported","setWebCodecsSupported","statusText","clearCanvas","stage","disposeDecoder","handleConnect","_connectRef_current","handleDisconnect","_disconnectRef_current","WebCodecsVideoDecoder","disposed","cleanup","scheduleReconnect","connect","socket","io","cleanupListeners","configurationPacketSent","pendingDataPackets","transformStream","codecId","ScrcpyVideoCodecId","decoder","_canvasStageRef_current","renderer","WebGLVideoFrameRenderer","BitmapVideoFrameRenderer","setupVideoStream","TransformStream","controller","packet","queuedPacket","readable","ReadableStream","handleVideoData","handleError","Card","Space","VALID_DEVICE_TYPES","VALID_EXECUTION_UX_HINTS","normalizeRuntimeDeviceType","runtimeInfo","fallback","_runtimeInfo_interface","filterValidExecutionUxHints","hint","PreviewRenderer","previewConnection","resolvePreviewConnectionInfo","preview","resolvedServerUrl","mjpegPath","_preview_custom","scrcpyPort","resolvedScrcpyPort","scrcpyUrl","usesScreenshotPolling","server_offline_background","server_offline_background_ownKeys","server_offline_foreground","server_offline_foreground_ownKeys","Content","Layout","PlaygroundApp","_playgroundConfig_executionUx","_playgroundConfig_executionUx_countdownSeconds","_runtimeInfo_title","_runtimeInfo_platformId","_ref","_ref1","appVersion","defaultDeviceType","playgroundConfig","offlineTitle","offlineStatusText","pollIntervalMs","isNarrowScreen","setIsNarrowScreen","countdown","setCountdown","countdownSeconds","executionUxHints","useServerStatus","setServerOnline","setIsUserOperating","setDeviceType","setRuntimeInfo","setExecutionUxHints","runtimeInfoRef","active","checkServer","online","nextRuntimeInfo","previousRuntimeInfo","fallbackRuntimeInfo","runtime_info_ownKeys","interval","countdownTimerRef","countdownResolveRef","mountedRef","finishCountdown","showCountdownModal","count","mergedConfig","mergedBranding","PlaygroundApp_ownKeys","ConfigProvider","PanelGroup","Panel","PanelResizeHandle","root","createRoot","StrictMode","__SERVER_URL__","__APP_VERSION__","App","defaultRunDirName","subdir","getMidsceneRunBaseDir","MIDSCENE_RUN_DIR","tmpdir","logPath","BASIC_ENV_KEYS","types_UITarsModelVersion","topic","fullTopic","topicPrefix","withConsole","cacheKey","debugInstances","baseFn","debugFn","writeLogToFile","getLogStream","topicFileName","logStreams","logFile","node_fs","isoDate","isoTime","milliseconds","timezoneOffsetMinutes","timezoneString","localISOTime","node_util","_process_versions","WorkerGlobalScope","v4","hashMap","combined","sliceLength","slicedHash","hashLetters","hex","sha256","char","condition","utils_REGEXP_LT","utils_REGEXP_GT","REGEXP_LT_ESCAPE","REGEXP_GT_ESCAPE","REGEXP_LT","RegExp","REGEXP_GT","globalThis","Function"],"mappings":"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MglB,GAAkB,CACxB,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,MAAO,CACH,IAAK,QACL,KAAM,OACV,EACA,MAAO,CACH,IAAK,QACL,KAAM,OACV,EACA,MAAO,CACH,QAAS,EACT,KAAM,QACN,IAAK,QACT,EACA,KAAM,CACF,QAAS,EACT,KAAM,OACN,IAAK,MACT,EACA,UAAW,CACP,QAAS,EACT,KAAM,YACN,IAAK,WACT,EACA,IAAK,CACD,QAAS,EACT,KAAM,MACN,IAAK,KACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,QACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,YAAa,CACT,QAAS,GACT,KAAM,cACN,IAAK,QACL,KAAM,KACN,SAAU,CACd,EACA,MAAO,CACH,QAAS,GACT,KAAM,QACN,IAAK,QACL,KAAM,IACV,EACA,KAAM,CACF,QAAS,GACT,KAAM,QACN,IAAK,QACL,KAAM,IACV,EACA,KAAM,CACF,QAAS,GACT,KAAM,QACN,IAAK,QACL,KAAM,IACV,EACA,UAAW,CACP,QAAS,GACT,KAAM,YACN,IAAK,QACL,SAAU,CACd,EACA,WAAY,CACR,QAAS,GACT,KAAM,aACN,IAAK,QACL,SAAU,CACd,EACA,YAAa,CACT,QAAS,GACT,KAAM,cACN,IAAK,UACL,SAAU,CACd,EACA,aAAc,CACV,QAAS,GACT,KAAM,eACN,IAAK,UACL,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,KAAM,UACN,IAAK,MACL,SAAU,CACd,EACA,SAAU,CACN,QAAS,GACT,KAAM,WACN,IAAK,MACL,SAAU,CACd,EACA,MAAO,CACH,QAAS,GACT,KAAM,QACN,IAAK,OACT,EACA,SAAU,CACN,QAAS,GACT,KAAM,WACN,IAAK,UACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,IAAK,QACT,EACA,QAAS,CACL,QAAS,GACT,KAAM,UACN,IAAK,SACT,EACA,WAAY,CACR,QAAS,GACT,KAAM,aACN,IAAK,YACT,EACA,MAAO,CACH,QAAS,GACT,KAAM,QACN,IAAK,GACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,SACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,IAAK,QACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,GACd,IAAK,WACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,SAAU,CACN,QAAS,GACT,KAAM,WACN,IAAK,UACT,EACA,IAAK,CACD,QAAS,GACT,KAAM,MACN,IAAK,KACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,GACd,IAAK,MACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,IAAK,MACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,OACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,UAAW,CACP,QAAS,GACT,KAAM,YACN,IAAK,WACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,YACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,UACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,KAAM,UACN,IAAK,SACT,EACA,WAAY,CACR,QAAS,GACT,KAAM,aACN,IAAK,YACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,aACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,aAAc,GACd,IAAK,YACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,UAAW,CACP,QAAS,GACT,KAAM,YACN,IAAK,WACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,IAAK,QACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,IAAK,SACT,EACA,YAAa,CACT,QAAS,GACT,KAAM,cACN,IAAK,aACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,IAAK,QACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,GACd,IAAK,SACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,IAAK,QACT,EACA,cAAe,CACX,QAAS,GACT,aAAc,IACd,KAAM,gBACN,IAAK,KACL,SAAU,IACV,SAAU,CACd,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,SAAU,CACN,QAAS,GACT,KAAM,WACN,IAAK,OACL,SAAU,CACd,EACA,UAAW,CACP,QAAS,GACT,KAAM,YACN,IAAK,OACL,SAAU,CACd,EACA,YAAa,CACT,QAAS,GACT,KAAM,cACN,IAAK,aACT,EACA,eAAgB,CACZ,QAAS,IACT,KAAM,iBACN,IAAK,IACL,SAAU,CACd,EACA,UAAW,CACP,QAAS,IACT,KAAM,YACN,IAAK,IACL,SAAU,CACd,EACA,eAAgB,CACZ,QAAS,IACT,KAAM,iBACN,IAAK,IACL,SAAU,CACd,EACA,aAAc,CACV,QAAS,IACT,KAAM,eACN,IAAK,IACL,SAAU,CACd,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,QAAS,CACL,QAAS,IACT,KAAM,UACN,IAAK,SACT,EACA,WAAY,CACR,QAAS,IACT,KAAM,aACN,IAAK,YACT,EACA,gBAAiB,CACb,QAAS,IACT,KAAM,kBACN,IAAK,iBACT,EACA,gBAAiB,CACb,QAAS,IACT,KAAM,kBACN,IAAK,iBACT,EACA,cAAe,CACX,QAAS,IACT,KAAM,gBACN,IAAK,eACT,EACA,eAAgB,CACZ,QAAS,IACT,KAAM,iBACN,IAAK,gBACT,EACA,mBAAoB,CAChB,QAAS,IACT,KAAM,qBACN,IAAK,oBACT,EACA,UAAW,CACP,QAAS,IACT,KAAM,YACN,IAAK,WACT,EACA,eAAgB,CACZ,QAAS,IACT,KAAM,iBACN,IAAK,gBACT,EACA,UAAW,CACP,QAAS,IACT,KAAM,YACN,SAAU,IACV,IAAK,GACT,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,SAAU,IACV,IAAK,GACT,EACA,YAAa,CACT,QAAS,IACT,KAAM,cACN,IAAK,IACL,SAAU,CACd,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,SAAU,IACV,IAAK,GACT,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,IACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,SAAU,IACV,IAAK,GACT,EACA,UAAW,CACP,QAAS,IACT,KAAM,YACN,SAAU,IACV,IAAK,GACT,EACA,YAAa,CACT,QAAS,IACT,KAAM,cACN,SAAU,IACV,IAAK,GACT,EACA,UAAW,CACP,QAAS,IACT,KAAM,YACN,SAAU,IACV,IAAK,IACT,EACA,aAAc,CACV,QAAS,IACT,KAAM,eACN,SAAU,IACV,IAAK,GACT,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,SAAU,IACV,IAAK,GACT,EACA,SAAU,CACN,QAAS,IACT,KAAM,WACN,IAAK,UACT,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,IAAK,OACT,EACA,OAAQ,CACJ,QAAS,EACT,IAAK,SACL,KAAM,OACV,EACA,MAAO,CACH,QAAS,GACT,IAAK,QACL,KAAM,UACN,SAAU,CACd,EACA,MAAO,CACH,QAAS,GACT,IAAK,QACL,KAAM,YACN,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,IAAK,UACL,KAAM,cACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,GACT,IAAK,MACL,KAAM,UACN,SAAU,CACd,EACA,OAAQ,CACJ,QAAS,GACT,IAAK,QACT,EACA,WAAY,CACR,QAAS,GACT,IAAK,YACT,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,OACV,EACA,MAAO,CACH,QAAS,GACT,IAAK,OACT,EACA,QAAS,CACL,QAAS,GACT,IAAK,UACL,KAAM,MACV,EACA,KAAU,CACN,QAAS,GACT,IAAK,KACL,KAAM,gBACN,SAAU,CACd,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,KAAM,CACF,QAAS,GACT,IAAK,OACL,KAAM,WACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,iBACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,YACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,iBACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,eACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,WACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,WACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,aACV,EACA,KAAM,CACF,QAAS,IACT,IAAK,KACL,KAAM,WACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,cACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,KAAM,CACF,QAAS,IACT,IAAK,MACT,EACA,MAAO,CACH,QAAS,IACT,IAAK,QACL,KAAM,OACV,EACA,MAAO,CACH,QAAS,IACT,IAAK,OACT,EACA,SAAU,CACN,QAAS,IACT,IAAK,UACT,EACA,KAAM,CACF,QAAS,IACT,IAAK,MACT,EACA,QAAS,CACL,QAAS,IACT,IAAK,SACT,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,WACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,EAAG,CACC,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,WACV,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AM,CAER,CAEJ,CAQA,OAAO,aAAa6I,CAAgB,CAAY,CAC9C,MAAO,CACLA,EACA,CAAC,EAAEA,EAAS,iBAAiB,CAAC,CAC9B,CAAC,EAAEA,EAAS,YAAY,CAAC,CAC1B,AACH,CA9MA,YAAYrY,CAAwB,CAAE,CAPtC,6BACA,4BACA,mCACA,8BACA,6BACA,6BAGE,IAAI,CAAC,UAAU,CAAGA,EAAK,UAAU,CACjC,IAAI,CAAC,SAAS,CAAGA,EAAK,SAAS,CAC/B,IAAI,CAAC,gBAAgB,CAAGA,EAAK,gBAAgB,CAC7C,IAAI,CAAC,WAAW,CAAGA,EAAK,WAAW,CACnC,IAAI,CAAC,UAAU,CAAGA,EAAK,UAAU,CAAC,GAAG,CAAC,AAACmY,GACrCA,aAAgBN,GAAgBM,EAAON,GAAc,QAAQ,CAACM,IAEhE,IAAI,CAAC,UAAU,CAAGnY,EAAK,UAAU,AACnC,CAsMF,CE/7BA,IAAMoZ,GAAa,CACf,EAAG,CACC,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACJ,CACD,EAAG,CACC,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACJ,CACD,EAAG,CACC,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACJ,CACD,EAAG,CACC,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACJ,CACD,EAAG,CACC,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACJ,CACD,EAAG,CACC,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACJ,CACD,EAAG,CACC,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACJ,CACD,EAAG,CACC,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACJ,CACD,EAAG,CACC,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACJ,CACD,EAAG,CACC,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACD,CACI,EACA,EACA,EACA,EACA,EACH,CACJ,AACL,EAkDA,SAASC,GAASC,CAAM,CAAExmB,CAAK,CAAEC,CAAM,CAAEgB,CAAI,CAAEwlB,CAAK,EAChD,IAAMnjB,EAAIxI,KAAK,KAAK,CAACmG,EAAK,CAAC,EACrBsC,EAAIzI,KAAK,KAAK,CAACmG,EAAK,CAAC,EACrBylB,EAAI5rB,KAAK,KAAK,CAACmG,EAAK,CAAC,EACrB0lB,EAAI7rB,KAAK,KAAK,CAACmG,EAAK,CAAC,EAC3B,IAAI,IAAI2lB,EAAKrjB,EAAGqjB,EAAKrjB,EAAIojB,GAAKC,EAAK3mB,EAAQ2mB,IAAK,IAAI,IAAIC,EAAKvjB,EAAGujB,EAAKvjB,EAAIojB,GAAKG,EAAK7mB,EAAO6mB,IAAK,CAC3F,GAAIA,EAAK,GAAKD,EAAK,EAAG,SACtB,IAAMvf,EAAOuf,AAAAA,CAAAA,EAAK5mB,EAAQ6mB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CK,GAA0C,0CAC1CC,GAA2C,2CAC3CC,GAA0C,0CAC1CE,GAA+B,+BAC/BC,GAAsC,sCACtCC,GAAqC,qCACrCC,GAAmC,mCACnCC,GAAkC,kCAClCC,GAA2C,2CAC3CC,GAA0C,0CAC1CE,GAAkC,kCAClCC,GAAsC,sCACtCC,GAAsC,sCACtCC,GAAyC,yCACzCJ,GAAiC,iCACjCK,GAA2C,2CAC3CC,GAA4C,4CAC5CC,GAA2C,2CAC3CS,GAAwB,wBAIxBu7E,GAAiB,CACnB34C,EACA9lC,EACAG,EACAm+E,EACH,CACK/0E,GAAmB,CACrB6wC,EArFoC,kCAEN,4BAsF9BroC,EACAE,EACA80B,EACH,CACKv9B,GAAkB,CACpBkJ,EACA04B,EACA0P,EACH,CACKxxC,GAAkB,CACpBoJ,EACAC,EA3EsB,oBACO,2BACA,2BACK,gCACL,2BACG,8BA6EhC2oC,EACAhxC,EACAjB,EA3G6B,2BAER,mBA4GxB,CACKO,GAAkB,IACjBL,MACAC,MACAF,GACN,CACKO,GAAiB,CACnBlH,EACAK,EACAC,EACAF,EACAD,EACAF,EACAC,EACAM,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAgD,EACAJ,EACAE,EACAJ,EACAQ,EApG0B,wBAsG1BpB,EACAE,EACAM,EACAF,EACAF,EACAhF,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAE,EACAC,EACAC,EACAC,EACAJ,EACAK,GACAC,GACAC,GACAE,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAE,GACAC,GACAC,GACAC,GACAJ,GACAK,GACAC,GACAC,GACAS,GACH,CACK4F,GAAe,CAjLyB,2CAmLvC21E,MACA70E,MACAC,GACN,CACKlC,GAAsB,CACxB,gBACA,cACA,SACA,aACA,WACA,UACA,cACA,qBACA,yBACA,QACA,WACA,wBACA,QACH,CACD,IAAsDE,GAAlD62E,IACA72E,CADkDA,GAMpD,CAAC,GALoB,IAAO,CAAG,MAC7BA,GAAmB,IAAO,CAAG,MAC7BA,GAAmB,cAAiB,CAAG,iBACvCA,GAAmB,cAAiB,CA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"}