@midscene/android-playground 1.0.1-beta-20251204081114.0 → 1.0.1-beta-20251205024737.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -5
- package/static/index.html +1 -1
- package/static/static/js/{633.9983f909.js → 9.abb4d07f.js} +58 -55
- package/static/static/js/{633.9983f909.js.LICENSE.txt → 9.abb4d07f.js.LICENSE.txt} +4 -0
- package/static/static/js/{633.9983f909.js.map → 9.abb4d07f.js.map} +1 -1
- package/static/static/js/{index.e33e0261.js → index.7911d2ff.js} +5 -5
- package/static/static/js/index.7911d2ff.js.map +1 -0
- package/static/static/js/index.e33e0261.js.map +0 -1
- /package/static/static/js/{index.e33e0261.js.LICENSE.txt → index.7911d2ff.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static/js/index.7911d2ff.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: observeOpenAI|groupOptions: {}|namespace object","../../../../../packages/core/dist/es/ai-model/service-caller|lazy|referencedExports: wrapOpenAI|groupOptions: {}|namespace object","../../../../../packages/shared/dist/es/env/types.mjs","../../../../../packages/shared/dist/es/utils.mjs","../../../../../packages/visualizer/dist/es/store/store.mjs","../../../../../packages/shared/dist/es/env/basic.mjs","../../../../../packages/shared/dist/es/common.mjs","../../../../../packages/shared/dist/es/logger.mjs","../../../../../packages/shared/dist/es/env/init-debug.mjs","../../../../../packages/shared/dist/es/env/global-config-manager.mjs","../../../../../packages/shared/dist/es/env/helper.mjs","../../../../../packages/shared/dist/es/env/parse-model-config.mjs","../../../../../packages/shared/dist/es/env/constants.mjs","../../../../../packages/shared/dist/es/env/model-config-manager.mjs","../../../../../packages/shared/dist/es/env/utils.mjs","../../../../../packages/visualizer/dist/es/utils/color.mjs","../../../../../packages/visualizer/dist/es/component/screenshot-viewer/index.mjs","../../../../../packages/shared/dist/es/img/transform.mjs","../../../../../packages/core/src/common.ts","../../../../../packages/core/src/ai-model/inspect.ts","../../../../../packages/core/src/ai-model/llm-planning.ts","../../../../../packages/shared/dist/es/us-keyboard-layout.mjs","../../../../../packages/core/src/ai-model/ui-tars-planning.ts","../../../../../packages/core/src/yaml/utils.ts","../../../../../packages/core/src/yaml/player.ts","../../../../../packages/playground/src/common.ts","../../../../../packages/playground/src/adapters/base.ts","../../../../../packages/playground/src/adapters/local-execution.ts","../../../../../packages/playground/src/adapters/remote-execution.ts","../../../../../packages/playground/src/sdk/index.ts","../../../../../packages/visualizer/dist/es/hooks/useServerValid.mjs","../../../src/components/adb-device/index.tsx","../../../../../packages/visualizer/dist/es/component/logo/index.mjs","../../../../../packages/visualizer/dist/es/hooks/useTheme.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/core/src/agent/ui-utils.ts","../../../../../packages/core/src/service/index.ts","../../../../../packages/core/src/task-runner.ts","../../../../../packages/core/src/agent/utils.ts","../../../../../packages/core/src/agent/task-cache.ts","../../../../../packages/core/src/agent/task-builder.ts","../../../../../packages/core/src/agent/tasks.ts","../../../../../packages/core/src/agent/agent.ts","../../../../../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/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/utils/pixi-loader.mjs","../../../../../packages/visualizer/dist/es/component/player/index.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/core/src/device/index.ts","../../../../../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","../../../src/components/playground-panel/index.tsx","../../../src/icons/linked.svg","../../../src/icons/screenshot.svg","../../../src/icons/unlink.svg","../../../src/components/scrcpy-player/index.tsx","../../../src/App.tsx","../../../src/index.tsx","../../../../../packages/visualizer/dist/es/hooks/useSafeOverrideAIConfig.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/node_module_decorator","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 dataWebpackPrefix = \"android-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-webpack\") == dataWebpackPrefix + 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-webpack\", dataWebpackPrefix + 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 webpackJsonpCallback = (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[\"webpackChunkandroid_playground\"] = self[\"webpackChunkandroid_playground\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.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 = 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 = 51560;\nmodule.exports = webpackEmptyAsyncContext;\n","const MIDSCENE_MODEL_INIT_CONFIG_JSON = 'MIDSCENE_MODEL_INIT_CONFIG_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_FORCE_DEEP_THINK = 'MIDSCENE_FORCE_DEEP_THINK';\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 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_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_TIMEOUT = 'MIDSCENE_INSIGHT_MODEL_TIMEOUT';\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_TIMEOUT = 'MIDSCENE_PLANNING_MODEL_TIMEOUT';\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_FORCE_DEEP_THINK,\n MIDSCENE_MCP_USE_PUPPETEER_MODE,\n MIDSCENE_MCP_ANDROID_MODE,\n MIDSCENE_LANGSMITH_DEBUG,\n MIDSCENE_LANGFUSE_DEBUG\n];\nconst NUMBER_ENV_KEYS = [\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_API_KEY,\n MIDSCENE_MODEL_BASE_URL,\n MIDSCENE_MODEL_SOCKS_PROXY,\n MIDSCENE_MODEL_HTTP_PROXY,\n MIDSCENE_MODEL_TIMEOUT,\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_TIMEOUT,\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_TIMEOUT,\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 VL_MODE_RAW_VALID_VALUES = [\n 'doubao-vision',\n 'gemini',\n 'qwen2.5-vl',\n 'qwen3-vl',\n 'vlm-ui-tars',\n 'vlm-ui-tars-doubao',\n 'vlm-ui-tars-doubao-1.5'\n];\nconst MODEL_FAMILY_VALUES = [\n ...VL_MODE_RAW_VALID_VALUES\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_FORCE_DEEP_THINK, MIDSCENE_INSIGHT_MODEL_API_KEY, MIDSCENE_INSIGHT_MODEL_BASE_URL, MIDSCENE_INSIGHT_MODEL_HTTP_PROXY, MIDSCENE_INSIGHT_MODEL_INIT_CONFIG_JSON, MIDSCENE_INSIGHT_MODEL_NAME, MIDSCENE_INSIGHT_MODEL_SOCKS_PROXY, 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_FAMILY, MIDSCENE_MODEL_HTTP_PROXY, MIDSCENE_MODEL_INIT_CONFIG_JSON, MIDSCENE_MODEL_MAX_TOKENS, MIDSCENE_MODEL_NAME, MIDSCENE_MODEL_SOCKS_PROXY, 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_HTTP_PROXY, MIDSCENE_PLANNING_MODEL_INIT_CONFIG_JSON, MIDSCENE_PLANNING_MODEL_NAME, MIDSCENE_PLANNING_MODEL_SOCKS_PROXY, MIDSCENE_PLANNING_MODEL_TIMEOUT, MIDSCENE_PREFERRED_LANGUAGE, MIDSCENE_REPLANNING_CYCLE_LIMIT, 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, VL_MODE_RAW_VALID_VALUES };\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}\nexport { antiEscapeScriptTag, assert, escapeScriptTag, generateHashId, getGlobalScope, ifInBrowser, ifInNode, ifInWorker, logMsg, repeat, replaceIllegalPathCharsAndSpace, setIsMcp, uuid };\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 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 useBlackboardPreference = 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 autoZoomFromQuery = getQueryPreference('focusOnCursor');\n const elementsVisibleFromQuery = getQueryPreference('showElementMarkers');\n return {\n backgroundVisible: savedBackgroundVisible,\n elementsVisible: void 0 === elementsVisibleFromQuery ? savedElementsVisible : elementsVisibleFromQuery,\n autoZoom: void 0 === autoZoomFromQuery ? savedAutoZoom : autoZoomFromQuery,\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 };\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_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 savedDeepThink = 'true' === localStorage.getItem(DEEP_THINK_KEY);\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 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 { useBlackboardPreference, useEnvConfig };\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","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 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) {\n const fullTopic = `${topicPrefix}:${topic}`;\n if (!debugInstances.has(fullTopic)) {\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(fullTopic, wrapper);\n }\n return debugInstances.get(fullTopic);\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 { 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 getEnvConfigInNumber(key) {\n const allConfig = this.getAllEnvConfig();\n if (!NUMBER_ENV_KEYS.includes(key)) throw new Error(`getEnvConfigInNumber with key ${key} is not supported`);\n const value = allConfig[key];\n this.keysHaveBeenRead[key] = true;\n return Number(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 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","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 modelFamilyToVLConfig = (modelFamily)=>{\n if (!modelFamily) return {\n vlMode: void 0,\n uiTarsVersion: void 0\n };\n if ('vlm-ui-tars' === modelFamily) return {\n vlMode: 'vlm-ui-tars',\n uiTarsVersion: UITarsModelVersion.V1_0\n };\n if ('vlm-ui-tars-doubao' === modelFamily || 'vlm-ui-tars-doubao-1.5' === modelFamily) return {\n vlMode: 'vlm-ui-tars',\n uiTarsVersion: UITarsModelVersion.DOUBAO_1_5_20B\n };\n if (!MODEL_FAMILY_VALUES.includes(modelFamily)) throw new Error(`Invalid MIDSCENE_MODEL_FAMILY value: ${modelFamily}`);\n return {\n vlMode: modelFamily,\n uiTarsVersion: void 0\n };\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 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 { vlMode, uiTarsVersion } = modelFamilyToVLConfig(modelFamilyRaw);\n const getModelDescription = (vlMode, uiTarsVersion)=>{\n if (vlMode) if (uiTarsVersion) return `UI-TARS=${uiTarsVersion}`;\n else return `${vlMode} mode`;\n return '';\n };\n const modelDescription = getModelDescription(vlMode, uiTarsVersion);\n return {\n socksProxy,\n httpProxy,\n vlModeRaw: vlMode,\n openaiBaseURL,\n openaiApiKey,\n openaiExtraConfig,\n vlMode,\n uiTarsModelVersion: uiTarsVersion,\n modelName: modelName,\n modelDescription,\n intent: '-',\n timeout: provider[keys.timeout] ? Number(provider[keys.timeout]) : void 0\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, legacyConfigToModelFamily, modelFamilyToVLConfig, parseOpenaiSdkConfig };\n","import { MIDSCENE_INSIGHT_MODEL_API_KEY, MIDSCENE_INSIGHT_MODEL_BASE_URL, MIDSCENE_INSIGHT_MODEL_HTTP_PROXY, MIDSCENE_INSIGHT_MODEL_INIT_CONFIG_JSON, MIDSCENE_INSIGHT_MODEL_NAME, MIDSCENE_INSIGHT_MODEL_SOCKS_PROXY, MIDSCENE_INSIGHT_MODEL_TIMEOUT, MIDSCENE_MODEL_API_KEY, MIDSCENE_MODEL_BASE_URL, MIDSCENE_MODEL_FAMILY, MIDSCENE_MODEL_HTTP_PROXY, MIDSCENE_MODEL_INIT_CONFIG_JSON, MIDSCENE_MODEL_NAME, MIDSCENE_MODEL_SOCKS_PROXY, 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_HTTP_PROXY, MIDSCENE_PLANNING_MODEL_INIT_CONFIG_JSON, MIDSCENE_PLANNING_MODEL_NAME, MIDSCENE_PLANNING_MODEL_SOCKS_PROXY, 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 modelFamily: 'THERE_IS_NO_MODEL_FAMILY_FOR_INSIGHT',\n timeout: MIDSCENE_INSIGHT_MODEL_TIMEOUT\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 modelFamily: 'THERE_IS_NO_MODEL_FAMILY_FOR_PLANNING',\n timeout: MIDSCENE_PLANNING_MODEL_TIMEOUT\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 modelFamily: MIDSCENE_MODEL_FAMILY,\n timeout: MIDSCENE_MODEL_TIMEOUT\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 modelFamily: 'DEFAULT_MODEL_CONFIG_KEYS has no modelFamily key',\n timeout: MIDSCENE_MODEL_TIMEOUT\n};\nexport { DEFAULT_MODEL_CONFIG_KEYS, DEFAULT_MODEL_CONFIG_KEYS_LEGACY, INSIGHT_MODEL_CONFIG_KEYS, PLANNING_MODEL_CONFIG_KEYS };\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('default model config is not found, which should not happen');\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.vlMode) 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);\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 { getPreferredLanguage, globalConfigManager, globalModelConfigManager, overrideAIConfig };\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, 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 }) {\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 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 fetchScreenshot(false);\n fetchInterfaceInfo();\n startPolling();\n return ()=>{\n stopPolling();\n };\n }, [\n serverOnline,\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 (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 (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 /*#__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: 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 node_assert from \"node:assert\";\nimport { Buffer } from \"node:buffer\";\nimport { readFileSync } from \"node:fs\";\nimport node_path from \"node:path\";\nimport { getDebug } from \"../logger.mjs\";\nimport { ifInNode } from \"../utils.mjs\";\nimport get_jimp from \"./get-jimp.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 const Jimp = await get_jimp();\n const image = await Jimp.read(imageBuffer);\n await image.writeAsync(outputPath);\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 inputImage = PhotonImage.new_from_byteslice(inputBytes);\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 jimpFromBase64(base64) {\n const Jimp = await get_jimp();\n const { body } = parseBase64(base64);\n const imageBuffer = Buffer.from(body, 'base64');\n return Jimp.read(imageBuffer);\n}\nasync function paddingToMatchBlock(image, blockSize = 28) {\n const { width, height } = image.bitmap;\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 Jimp = await get_jimp();\n const paddedImage = new Jimp(targetWidth, targetHeight, 0xffffffff);\n paddedImage.composite(image, 0, 0);\n return {\n width: targetWidth,\n height: targetHeight,\n image: paddedImage\n };\n}\nasync function paddingToMatchBlockByBase64(imageBase64, blockSize = 28) {\n const jimpImage = await jimpFromBase64(imageBase64);\n const paddedResult = await paddingToMatchBlock(jimpImage, blockSize);\n return {\n width: paddedResult.width,\n height: paddedResult.height,\n imageBase64: await jimpToBase64(paddedResult.image)\n };\n}\nasync function cropByRect(imageBase64, rect, paddingImage) {\n const jimpImage = await jimpFromBase64(imageBase64);\n const { left, top, width, height } = rect;\n jimpImage.crop(left, top, width, height);\n if (paddingImage) {\n const paddedResult = await paddingToMatchBlock(jimpImage);\n return {\n width: paddedResult.width,\n height: paddedResult.height,\n imageBase64: await jimpToBase64(paddedResult.image)\n };\n }\n return {\n width: jimpImage.bitmap.width,\n height: jimpImage.bitmap.height,\n imageBase64: await jimpToBase64(jimpImage)\n };\n}\nasync function jimpToBase64(image) {\n const Jimp = await get_jimp();\n return image.getBase64Async(Jimp.MIME_JPEG);\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};\nexport { createImgBase64ByFormat, cropByRect, httpImg2Base64, jimpFromBase64, jimpToBase64, localImg2Base64, paddingToMatchBlock, paddingToMatchBlockByBase64, parseBase64, preProcessImageUrl, resizeAndConvertImgBuffer, resizeImgBase64, saveBase64Image, zoomForGPT4o };\n","import type {\n BaseElement,\n DeviceAction,\n ElementTreeNode,\n MidsceneYamlFlowItem,\n PlanningAction,\n Rect,\n Size,\n} from '@/types';\nimport { assert } from '@midscene/shared/utils';\n\nimport type { ChatCompletionMessageParam } from 'openai/resources/index';\n\nimport type { PlanningLocateParam } from '@/types';\nimport { NodeType } from '@midscene/shared/constants';\nimport type { TVlModeTypes } 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\nexport enum AIActionType {\n ASSERT = 0,\n INSPECT_ELEMENT = 1,\n EXTRACT_DATA = 2,\n PLAN = 3,\n DESCRIBE_ELEMENT = 4,\n TEXT = 5,\n}\n\nconst defaultBboxSize = 20; // must be even number\nconst debugInspectUtils = getDebug('ai:common');\ntype AdaptBboxInput = number[] | string[] | string | (number[] | string[])[];\n\n// transform the param of locate from qwen mode\nexport function fillBboxParam(\n locate: PlanningLocateParam,\n width: number,\n height: number,\n rightLimit: number,\n bottomLimit: number,\n vlMode: TVlModeTypes | 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(\n locate.bbox,\n width,\n height,\n rightLimit,\n bottomLimit,\n vlMode,\n );\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 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 rightLimit: number,\n bottomLimit: number,\n vlMode: TVlModeTypes | 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 (vlMode === 'doubao-vision' || vlMode === 'vlm-ui-tars') {\n result = adaptDoubaoBbox(normalizedBbox, width, height);\n } else if (vlMode === 'gemini') {\n result = adaptGeminiBbox(normalizedBbox as number[], width, height);\n } else if (vlMode === 'qwen3-vl') {\n result = normalized01000(normalizedBbox as number[], width, height);\n } else {\n result = adaptQwen2_5Bbox(normalizedBbox as number[]);\n }\n\n result[2] = Math.min(result[2], rightLimit);\n result[3] = Math.min(result[3], bottomLimit);\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 vlMode?: TVlModeTypes | undefined,\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 'vlMode',\n vlMode,\n );\n const [left, top, right, bottom] = adaptBbox(\n bbox,\n width,\n height,\n rightLimit,\n bottomLimit,\n vlMode,\n );\n\n // Calculate initial rect dimensions\n const rectLeft = left;\n const rectTop = top;\n let rectWidth = right - left;\n let rectHeight = bottom - top;\n\n // Ensure the rect doesn't exceed image boundaries\n // If right edge exceeds width, adjust the width\n if (rectLeft + rectWidth > width) {\n rectWidth = width - rectLeft;\n }\n\n // If bottom edge exceeds height, adjust the height\n if (rectTop + rectHeight > height) {\n rectHeight = height - rectTop;\n }\n\n // Ensure minimum dimensions (width and height should be at least 1)\n rectWidth = Math.max(1, rectWidth);\n rectHeight = Math.max(1, rectHeight);\n\n const rect = {\n left: rectLeft + offsetX,\n top: rectTop + offsetY,\n width: rectWidth,\n height: rectHeight,\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// expand the search area to at least 300 x 300, or add a default padding\nexport function expandSearchArea(\n rect: Rect,\n screenSize: Size,\n vlMode: TVlModeTypes | undefined,\n) {\n const minEdgeSize = vlMode === 'doubao-vision' ? 500 : 300;\n const defaultPadding = 160;\n\n // Calculate padding needed to reach minimum edge size\n const paddingSizeHorizontal =\n rect.width < minEdgeSize\n ? Math.ceil((minEdgeSize - rect.width) / 2)\n : defaultPadding;\n const paddingSizeVertical =\n rect.height < minEdgeSize\n ? Math.ceil((minEdgeSize - rect.height) / 2)\n : defaultPadding;\n\n // Calculate new dimensions (ensure minimum edge size)\n let newWidth = Math.max(minEdgeSize, rect.width + paddingSizeHorizontal * 2);\n let newHeight = Math.max(minEdgeSize, rect.height + paddingSizeVertical * 2);\n\n // Calculate initial position with padding\n let newLeft = rect.left - paddingSizeHorizontal;\n let newTop = rect.top - paddingSizeVertical;\n\n // Ensure the rect doesn't exceed screen boundaries by adjusting position\n // If the rect goes beyond the right edge, shift it left\n if (newLeft + newWidth > screenSize.width) {\n newLeft = screenSize.width - newWidth;\n }\n\n // If the rect goes beyond the bottom edge, shift it up\n if (newTop + newHeight > screenSize.height) {\n newTop = screenSize.height - newHeight;\n }\n\n // Ensure the rect doesn't go beyond the left/top edges\n newLeft = Math.max(0, newLeft);\n newTop = Math.max(0, newTop);\n\n // If after position adjustment, the rect still exceeds screen boundaries,\n // clamp the dimensions to fit within screen\n if (newLeft + newWidth > screenSize.width) {\n newWidth = screenSize.width - newLeft;\n }\n if (newTop + newHeight > screenSize.height) {\n newHeight = screenSize.height - newTop;\n }\n\n rect.left = newLeft;\n rect.top = newTop;\n rect.width = newWidth;\n rect.height = newHeight;\n\n return rect;\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 sleep?: number,\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 if (sleep) {\n flow.push({\n sleep,\n });\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 dpr: z.number().optional(),\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 deepThink: z.boolean().optional(),\n cacheable: z.boolean().optional(),\n xpath: z.union([z.string(), z.boolean()]).optional(),\n })\n .passthrough();\n\n// Schema for locator field result (when AI returns locate results)\nconst MidsceneLocationResult = z\n .object({\n [locateFieldFlagName]: z.literal(true),\n prompt: TUserPromptSchema,\n\n // optional fields\n deepThink: z.boolean().optional(), // only available in vl model\n cacheable: z.boolean().optional(),\n xpath: z.boolean().optional(), // preset result for xpath\n\n // these two fields will only appear in the result\n center: z.tuple([z.number(), z.number()]),\n rect: RectSchema,\n })\n .passthrough();\n\n// Export the result type - this is used for runtime results that include center and rect\nexport type MidsceneLocationResultType = z.infer<typeof MidsceneLocationResult>;\n\n// Export the input type - this is the inferred type from getMidsceneLocationSchema()\nexport type MidsceneLocationInputType = z.infer<typeof MidsceneLocationInput>;\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 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\nexport const loadActionParam = (\n jsonObject: Record<string, any>,\n zodSchema: z.ZodType<any>,\n): Record<string, any> => {\n const locatorFields = findAllMidsceneLocatorField(zodSchema);\n const result = { ...jsonObject };\n\n for (const fieldName of locatorFields) {\n const fieldValue = result[fieldName];\n if (fieldValue && typeof fieldValue === 'string') {\n result[fieldName] = {\n [locateFieldFlagName]: true,\n prompt: fieldValue,\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 */\nexport const parseActionParam = (\n rawParam: Record<string, any> | undefined,\n zodSchema?: z.ZodType<any>,\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 for (const fieldName in locateFieldValues) {\n validated[fieldName] = locateFieldValues[fieldName];\n }\n\n return validated;\n};\n","import type {\n AIDataExtractionResponse,\n AIElementResponse,\n AISectionLocatorResponse,\n AIUsageInfo,\n Rect,\n ReferenceImage,\n ServiceExtractOption,\n UIContext,\n} from '@/types';\nimport type { IModelConfig } from '@midscene/shared/env';\nimport { generateElementByPosition } from '@midscene/shared/extractor/dom-util';\nimport {\n cropByRect,\n paddingToMatchBlockByBase64,\n preProcessImageUrl,\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 {\n AIActionType,\n adaptBboxToRect,\n expandSearchArea,\n mergeRects,\n} from '../common';\nimport {\n extractDataQueryPrompt,\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 { callAIWithObjectResponse } 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\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 referenceImage?: ReferenceImage;\n callAIFn: typeof callAIWithObjectResponse<\n AIElementResponse | [number, number]\n >;\n searchConfig?: Awaited<ReturnType<typeof AiLocateSection>>;\n modelConfig: IModelConfig;\n}): Promise<{\n parseResult: {\n elements: LocateResultElement[];\n errors?: string[];\n };\n rect?: Rect;\n rawResponse: string;\n usage?: AIUsageInfo;\n}> {\n const { context, targetElementDescription, callAIFn, modelConfig } = options;\n const { vlMode } = modelConfig;\n const { screenshotBase64 } = context;\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 = systemPromptToLocateElement(vlMode);\n\n let imagePayload = screenshotBase64;\n let imageWidth = context.size.width;\n let imageHeight = context.size.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 (vlMode === '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: 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 const res = await callAIFn(msgs, AIActionType.INSPECT_ELEMENT, modelConfig);\n\n const rawResponse = JSON.stringify(res.content);\n\n let resRect: Rect | undefined;\n let matchedElements = 'elements' in res.content ? res.content.elements : [];\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 vlMode,\n );\n\n debugInspect('resRect', resRect);\n\n const rectCenter = {\n x: resRect.left + resRect.width / 2,\n y: resRect.top + resRect.height / 2,\n };\n\n const element: LocateResultElement = generateElementByPosition(\n rectCenter,\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 };\n}\n\nexport async function AiLocateSection(options: {\n context: UIContext;\n sectionDescription: TUserPrompt;\n modelConfig: IModelConfig;\n}): Promise<{\n rect?: Rect;\n imageBase64?: string;\n error?: string;\n rawResponse: string;\n usage?: AIUsageInfo;\n}> {\n const { context, sectionDescription, modelConfig } = options;\n const { vlMode } = modelConfig;\n const { screenshotBase64 } = context;\n\n const systemPrompt = systemPromptToLocateSection(vlMode);\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 const result = await callAIWithObjectResponse<AISectionLocatorResponse>(\n msgs,\n AIActionType.EXTRACT_DATA,\n modelConfig,\n );\n\n let sectionRect: Rect | undefined;\n const sectionBbox = result.content.bbox;\n if (sectionBbox) {\n const targetRect = adaptBboxToRect(\n sectionBbox,\n context.size.width,\n context.size.height,\n 0,\n 0,\n context.size.width,\n context.size.height,\n vlMode,\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.size.width,\n context.size.height,\n 0,\n 0,\n context.size.width,\n context.size.height,\n vlMode,\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 // expand search area to at least 200 x 200\n sectionRect = expandSearchArea(mergedRect, context.size, vlMode);\n debugSection('expanded sectionRect %j', sectionRect);\n }\n\n let imageBase64 = screenshotBase64;\n if (sectionRect) {\n const croppedResult = await cropByRect(\n screenshotBase64,\n sectionRect,\n vlMode === 'qwen2.5-vl',\n );\n imageBase64 = croppedResult.imageBase64;\n sectionRect.width = croppedResult.width;\n sectionRect.height = croppedResult.height;\n }\n\n return {\n rect: sectionRect,\n imageBase64,\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;\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 result = await callAIWithObjectResponse<AIDataExtractionResponse<T>>(\n msgs,\n AIActionType.EXTRACT_DATA,\n modelConfig,\n );\n return {\n parseResult: result.content,\n usage: result.usage,\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(\n msgs,\n AIActionType.INSPECT_ELEMENT, // Reuse existing action type for now\n modelConfig,\n );\n\n return {\n isOrderSensitive: result.content.isOrderSensitive ?? false,\n usage: result.usage,\n };\n}\n","import type {\n DeviceAction,\n InterfaceType,\n PlanningAIResponse,\n RawResponsePlanningAIResponse,\n UIContext,\n} from '@/types';\nimport type { IModelConfig } 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 AIActionType,\n buildYamlFlowFromPlans,\n fillBboxParam,\n findAllMidsceneLocatorField,\n} from '../common';\nimport type { ConversationHistory } from './conversation-history';\nimport { systemPromptToTaskPlanning } from './prompt/llm-planning';\nimport { callAIWithObjectResponse } from './service-caller/index';\n\nconst debug = getDebug('planning');\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 },\n): Promise<PlanningAIResponse> {\n const { context, modelConfig, conversationHistory } = opts;\n const { screenshotBase64, size } = context;\n\n const { vlMode } = modelConfig;\n\n const systemPrompt = await systemPromptToTaskPlanning({\n actionSpace: opts.actionSpace,\n vlMode,\n includeBbox: opts.includeBbox,\n });\n\n let imagePayload = screenshotBase64;\n let imageWidth = size.width;\n let imageHeight = size.height;\n const rightLimit = imageWidth;\n const bottomLimit = imageHeight;\n\n // Process image based on VL mode requirements\n if (vlMode === '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 instruction: ChatCompletionMessageParam[] = [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `<high_priority_knowledge>${opts.actionContext}</high_priority_knowledge>\\n<user_instruction>${userInstruction}</user_instruction>`,\n },\n ],\n },\n ];\n\n let latestFeedbackMessage: ChatCompletionMessageParam;\n\n if (conversationHistory.pendingFeedbackMessage) {\n latestFeedbackMessage = {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `${conversationHistory.pendingFeedbackMessage}. The last screenshot is attached. Please going on according to the instruction.`,\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',\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 const historyLog = conversationHistory.snapshot();\n\n const msgs: ChatCompletionMessageParam[] = [\n { role: 'system', content: systemPrompt },\n ...instruction,\n ...historyLog,\n ];\n\n const {\n content: planFromAI,\n contentString: rawResponse,\n usage,\n } = await callAIWithObjectResponse<RawResponsePlanningAIResponse>(\n msgs,\n AIActionType.PLAN,\n modelConfig,\n );\n\n const actions = planFromAI.action ? [planFromAI.action] : [];\n const returnValue: PlanningAIResponse = {\n ...planFromAI,\n actions,\n rawResponse,\n usage,\n yamlFlow: buildYamlFlowFromPlans(\n actions,\n opts.actionSpace,\n planFromAI.sleep,\n ),\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 && vlMode !== undefined) {\n // Always use VL mode to fill bbox parameters\n action.param[field] = fillBboxParam(\n locateResult,\n imageWidth,\n imageHeight,\n rightLimit,\n bottomLimit,\n vlMode,\n );\n }\n });\n });\n\n if (\n actions.length === 0 &&\n returnValue.more_actions_needed_by_instruction &&\n !returnValue.sleep\n ) {\n console.warn(\n 'No actions planned for the prompt, but model said more actions are needed:',\n userInstruction,\n );\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}\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 { resizeImgBase64 } from '@midscene/shared/img';\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 { AIActionType } from '../common';\nimport type { ConversationHistory } from './conversation-history';\nimport { getSummary, getUiTarsPlanningPrompt } from './prompt/ui-tars-planning';\nimport { callAIWithStringResponse } from './service-caller/index';\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 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 },\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 imagePayload = await resizeImageForUiTars(\n context.screenshotBase64,\n context.size,\n uiTarsModelVersion,\n );\n\n conversationHistory.append({\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imagePayload,\n },\n },\n ],\n });\n\n const res = await callAIWithStringResponse(\n [\n {\n role: 'user',\n content: systemPrompt,\n },\n ...conversationHistory.snapshot(),\n ],\n AIActionType.INSPECT_ELEMENT,\n modelConfig,\n );\n const convertedText = convertBboxToCoordinates(res.content);\n\n const { size } = context;\n const { parsed } = actionParser({\n prediction: convertedText,\n factor: [1000, 1000],\n screenContext: {\n width: size.width,\n height: size.height,\n },\n modelVer: uiTarsModelVersion,\n });\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, size);\n transformActions.push({\n type: 'Tap',\n param: {\n locate: {\n prompt: action.thought || '',\n bbox: pointToBbox(\n { x: point[0], y: point[1] },\n size.width,\n size.height,\n ),\n },\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, size);\n transformActions.push({\n type: 'DoubleClick',\n param: {\n locate: {\n prompt: action.thought || '',\n bbox: pointToBbox(\n { x: point[0], y: point[1] },\n size.width,\n size.height,\n ),\n },\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, size);\n transformActions.push({\n type: 'RightClick',\n param: {\n locate: {\n prompt: action.thought || '',\n bbox: pointToBbox(\n { x: point[0], y: point[1] },\n size.width,\n size.height,\n ),\n },\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, size);\n const endPoint = getPoint(action.action_inputs.end_box, size);\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 size.width,\n size.height,\n ),\n },\n to: {\n prompt: action.thought || '',\n bbox: pointToBbox(\n { x: endPoint[0], y: endPoint[1] },\n size.width,\n size.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 console.warn(\n 'No key found in action: hotkey. Will not perform action.',\n );\n } else {\n const keys = transformHotkeyInput(action.action_inputs.key);\n\n transformActions.push({\n type: 'KeyboardPress',\n param: {\n keyName: keys,\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 `\\nRaw response: ${res.content}`,\n ].join('\\n');\n\n throw new Error(errorMessage, {\n cause: {\n prediction: res.content,\n parsed,\n unhandledActions,\n convertedText,\n },\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 more_actions_needed_by_instruction: 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\nexport async function resizeImageForUiTars(\n imageBase64: string,\n size: Size,\n uiTarsVersion: UITarsModelVersion | undefined,\n) {\n if (uiTarsVersion === UITarsModelVersion.V1_5) {\n debug('ui-tars-v1.5, will check image size', size);\n const currentPixels = size.width * size.height;\n const maxPixels = 16384 * 28 * 28; //\n if (currentPixels > maxPixels) {\n const resizeFactor = Math.sqrt(maxPixels / currentPixels);\n const newWidth = Math.floor(size.width * resizeFactor);\n const newHeight = Math.floor(size.height * resizeFactor);\n debug(\n 'resize image for ui-tars, new width: %s, new height: %s',\n newWidth,\n newHeight,\n );\n const resizedImage = await resizeImgBase64(imageBase64, {\n width: newWidth,\n height: newHeight,\n });\n return resizedImage;\n }\n }\n return imageBase64;\n}\n","import type { 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\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 let prompt = locatePrompt || opt?.prompt || (opt as any)?.locate; // as a shortcut\n let deepThink = false;\n let cacheable = true;\n let xpath = undefined;\n\n if (typeof opt === 'object' && opt !== null) {\n deepThink = 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 return {\n prompt,\n deepThink,\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 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, deepThink, cacheable, xpath\n const locateParamKeys = Object.keys(locateParam || {});\n\n // Extract all other keys\n for (const key of allKeys) {\n if (\n !locateParamKeys.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};\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 this.target =\n script.target ||\n script.web ||\n script.android ||\n script.ios ||\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 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 prompt = assertTask.aiAssert;\n const msg = assertTask.errorMessage;\n assert(prompt, 'missing prompt for aiAssert');\n const { pass, thought, message } =\n (await agent.aiAssert(prompt, msg, {\n keepRawResponse: true,\n })) || {};\n\n this.setResult(assertTask.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 let locatePrompt: TUserPrompt | undefined;\n if ((scrollTask as any).locate) {\n // Old format - locate is the prompt, aiScroll is null/ignored\n locatePrompt = (scrollTask as any).locate;\n } else {\n // New format - aiScroll is the prompt, or no prompt for global scroll\n locatePrompt = aiScroll;\n }\n\n await agent.callActionInActionSpace('Scroll', {\n ...scrollTask,\n ...(locatePrompt\n ? { locate: buildDetailedLocateParam(locatePrompt, scrollTask) }\n : {}),\n });\n } else {\n // generic action, find the action in actionSpace\n\n /* for aiTap, aiRightClick, the parameters are a flattened data for the 'locate', these are all valid data\n\n - aiTap: 'search input box'\n - aiTap: 'search input box'\n deepThink: true\n cacheable: false\n - aiTap:\n prompt: 'search input box'\n - aiTap:\n prompt: 'search input box'\n deepThink: 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 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\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 } 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, tasks } = this.script;\n const webEnv = web || target;\n const androidEnv = android;\n const iosEnv = ios;\n const platform = webEnv || androidEnv || iosEnv;\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 deepThink: options.deepThink,\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 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 deepThink: options.deepThink,\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 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 } from '@midscene/core';\nimport { overrideAIConfig } from '@midscene/shared/env';\nimport { uuid } from '@midscene/shared/utils';\nimport { executeAction, parseStructuredParams } from '../common';\nimport type { ExecutionOptions, FormValue, PlaygroundAgent } from '../types';\nimport { BasePlaygroundAdapter } from './base';\n\nexport class LocalExecutionAdapter extends BasePlaygroundAdapter {\n private agent: PlaygroundAgent;\n private taskProgressTips: Record<string, string> = {};\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) {\n super();\n this.agent = agent;\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 setProgressCallback(callback: (tip: string) => void): void {\n // Clear any existing callback before setting new one\n this.progressCallback = undefined;\n // Set the new callback\n this.progressCallback = callback;\n }\n\n private cleanup(requestId: string): void {\n delete this.taskProgressTips[requestId];\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 // 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?: () => Promise<DeviceAction<unknown>[]>;\n };\n if (page?.actionSpace) {\n return await 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: () => Promise<DeviceAction<unknown>[]>;\n };\n return await 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 }\n\n async executeAction(\n actionType: string,\n value: FormValue,\n options: ExecutionOptions,\n ): Promise<unknown> {\n // Get actionSpace using our simplified getActionSpace method\n const actionSpace = await this.getActionSpace();\n let originalOnTaskStartTip: ((tip: string) => void) | undefined;\n\n // Setup progress tracking if requestId is provided\n if (options.requestId && this.agent) {\n // Track current request ID to prevent stale callbacks\n this.currentRequestId = options.requestId;\n originalOnTaskStartTip = this.agent.onTaskStartTip;\n\n // Set up a fresh callback\n this.agent.onTaskStartTip = (tip: string) => {\n // Only process if this is still the current request\n if (this.currentRequestId !== options.requestId) {\n return;\n }\n\n // Store tip for our progress tracking\n this.taskProgressTips[options.requestId!] = tip;\n\n // Call the direct progress callback set via setProgressCallback\n if (this.progressCallback) {\n this.progressCallback(tip);\n }\n\n if (typeof originalOnTaskStartTip === 'function') {\n originalOnTaskStartTip(tip);\n }\n };\n }\n\n try {\n // Call the base implementation with the original signature\n const result = await executeAction(\n this.agent,\n actionType,\n actionSpace,\n value,\n options,\n );\n\n // For local execution, we need to package the result with dump and reportHTML\n // similar to how the server does it\n const response = {\n result,\n dump: null as unknown,\n reportHTML: null as string | null,\n error: null as string | null,\n };\n\n try {\n // Get dump and reportHTML from agent like the server does\n if (this.agent.dumpDataString) {\n const dumpString = this.agent.dumpDataString();\n if (dumpString) {\n response.dump = JSON.parse(dumpString);\n }\n }\n\n if (this.agent.reportHTMLString) {\n response.reportHTML = this.agent.reportHTMLString() || null;\n }\n\n // Write out action dumps\n if (this.agent.writeOutActionDumps) {\n this.agent.writeOutActionDumps();\n }\n } catch (error: unknown) {\n console.error('Failed to get dump/reportHTML from agent:', error);\n }\n\n this.agent.resetDump();\n\n return response;\n } finally {\n // Always clean up progress tracking to prevent memory leaks\n if (options.requestId) {\n this.cleanup(options.requestId);\n // Clear the agent callback to prevent accumulation\n if (this.agent) {\n this.agent.onTaskStartTip = originalOnTaskStartTip;\n }\n }\n }\n }\n\n async getTaskProgress(requestId: string): Promise<{ tip?: string }> {\n // Return the stored tip for this requestId\n return { tip: this.taskProgressTips[requestId] || undefined };\n }\n\n // Local execution task cancellation - minimal implementation\n async cancelTask(\n _requestId: string,\n ): Promise<{ error?: string; success?: boolean }> {\n if (!this.agent) {\n return { error: 'No active agent found for this requestId' };\n }\n\n try {\n await this.agent.destroy?.();\n return { success: true };\n } catch (error: unknown) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n console.error(`Failed to cancel agent: ${errorMessage}`);\n return { error: `Failed to cancel: ${errorMessage}` };\n }\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","import type { DeviceAction } from '@midscene/core';\nimport { parseStructuredParams } from '../common';\nimport type { ExecutionOptions, FormValue, ValidationResult } from '../types';\nimport { BasePlaygroundAdapter } from './base';\n\nexport class RemoteExecutionAdapter extends BasePlaygroundAdapter {\n private serverUrl?: string;\n private progressPolling = new Map<string, NodeJS.Timeout>();\n private progressCallback?: (tip: string) => void;\n private _id?: string;\n\n constructor(serverUrl: string) {\n super();\n this.serverUrl = serverUrl;\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 progress polling if callback is set and requestId exists\n if (options.requestId && this.progressCallback) {\n this.startProgressPolling(options.requestId, this.progressCallback);\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 // Stop progress polling when execution completes\n if (options.requestId) {\n this.stopProgressPolling(options.requestId);\n }\n\n return result;\n } catch (error) {\n // Stop progress polling on error\n if (options.requestId) {\n this.stopProgressPolling(options.requestId);\n }\n console.error('Execute via server failed:', error);\n throw error;\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: '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 { actionSpace: () => Promise<DeviceAction<unknown>[]> }\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 throw new Error(\n `Failed to override server config: ${response.statusText}`,\n );\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<{ tip?: string }> {\n if (!this.serverUrl) {\n return { tip: undefined };\n }\n\n if (!requestId?.trim()) {\n console.warn('Invalid requestId provided for task progress');\n return { tip: undefined };\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 { tip: undefined };\n }\n\n return await response.json();\n } catch (error) {\n console.error('Failed to poll task progress:', error);\n return { tip: undefined };\n }\n }\n\n // Cancel task\n async cancelTask(\n requestId: string,\n ): Promise<{ error?: string; success?: boolean }> {\n // Stop progress polling\n this.stopProgressPolling(requestId);\n\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 // Progress callback management\n setProgressCallback(callback: (tip: string) => void): void {\n this.progressCallback = callback;\n }\n\n // Start progress polling\n private startProgressPolling(\n requestId: string,\n callback: (tip: string) => void,\n ): void {\n // Don't start multiple polling for the same request\n if (this.progressPolling.has(requestId)) {\n return;\n }\n\n let lastTip = '';\n const interval = setInterval(async () => {\n try {\n const progress = await this.getTaskProgress(requestId);\n if (progress?.tip?.trim?.() && progress.tip !== lastTip) {\n lastTip = progress.tip;\n callback(progress.tip);\n }\n } catch (error) {\n // Silently ignore progress polling errors to avoid spam\n console.debug('Progress polling error:', error);\n }\n }, 500); // Poll every 500ms\n\n this.progressPolling.set(requestId, interval);\n }\n\n // Stop progress polling\n private stopProgressPolling(requestId: string): void {\n const interval = this.progressPolling.get(requestId);\n if (interval) {\n clearInterval(interval);\n this.progressPolling.delete(requestId);\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","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 {\n ExecutionOptions,\n FormValue,\n PlaygroundAgent,\n PlaygroundConfig,\n ValidationResult,\n} from '../types';\n\nexport class PlaygroundSDK {\n private adapter: BasePlaygroundAdapter;\n\n constructor(config: PlaygroundConfig) {\n this.adapter = this.createAdapter(\n config.type,\n config.serverUrl,\n config.agent,\n );\n }\n\n private createAdapter(\n type: string,\n serverUrl?: string,\n agent?: PlaygroundAgent,\n ): BasePlaygroundAdapter {\n switch (type) {\n case 'local-execution':\n if (!agent) {\n throw new Error('Agent is required for local execution');\n }\n return new LocalExecutionAdapter(agent);\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 async executeAction(\n actionType: string,\n value: FormValue,\n options: ExecutionOptions,\n ): Promise<unknown> {\n const result = await this.adapter.executeAction(actionType, value, options);\n\n // Stop any active polling for this request after execution completes\n if (options.requestId) {\n this.stopProgressPolling(options.requestId);\n }\n\n return result;\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 async getTaskProgress(requestId: string): Promise<{ tip?: string }> {\n if (this.adapter instanceof RemoteExecutionAdapter) {\n return this.adapter.getTaskProgress(requestId);\n }\n if (this.adapter instanceof LocalExecutionAdapter) {\n return this.adapter.getTaskProgress(requestId);\n }\n return { tip: undefined }; // Fallback\n }\n\n // Cancel task (for remote execution)\n async cancelTask(requestId: string): Promise<any> {\n // Stop progress polling for this request\n this.stopProgressPolling(requestId);\n\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 // Progress callback management\n onProgressUpdate(callback: (tip: string) => void): void {\n // Pass the callback to the adapter if it supports it\n if (this.adapter instanceof RemoteExecutionAdapter) {\n this.adapter.setProgressCallback(callback);\n } else if (this.adapter instanceof LocalExecutionAdapter) {\n this.adapter.setProgressCallback(callback);\n }\n }\n\n // Start progress polling for remote execution (deprecated - now handled by adapter)\n startProgressPolling(requestId: string): void {\n // This method is now handled by the RemoteExecutionAdapter automatically\n // when executeAction is called with a requestId\n console.warn(\n 'startProgressPolling is deprecated - polling is now automatic',\n );\n }\n\n // Stop progress polling for a specific request (deprecated - now handled by adapter)\n stopProgressPolling(requestId: string): void {\n // This method is now handled by the RemoteExecutionAdapter automatically\n console.warn(\n 'stopProgressPolling is deprecated - polling cleanup is now automatic',\n );\n }\n\n // Cancel execution - supports both remote and local\n async cancelExecution(requestId: string): Promise<void> {\n this.stopProgressPolling(requestId);\n\n if (this.adapter instanceof RemoteExecutionAdapter) {\n await this.adapter.cancelTask(requestId);\n } else if (this.adapter instanceof LocalExecutionAdapter) {\n // For local execution, we might need to implement agent cancellation\n console.warn('Local execution cancellation not fully implemented');\n }\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 if (this.adapter instanceof LocalExecutionAdapter) {\n return this.adapter.getInterfaceInfo();\n }\n if (this.adapter instanceof RemoteExecutionAdapter) {\n return this.adapter.getInterfaceInfo();\n }\n return null;\n }\n}\n","import { PlaygroundSDK } from \"@midscene/playground\";\nimport { useEffect, useState } from \"react\";\nimport { useEnvConfig } from \"../store/store.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 useServerValid = (shouldRun = true)=>{\n const [serverValid, setServerValid] = useState(true);\n const { serviceMode } = useEnvConfig();\n useEffect(()=>{\n let interruptFlag = false;\n if (!shouldRun) return;\n Promise.resolve((()=>_async_to_generator(function*() {\n while(!interruptFlag){\n const playgroundSDK = new PlaygroundSDK({\n type: 'remote-execution'\n });\n const status = yield playgroundSDK.checkStatus();\n status ? setServerValid(true) : setServerValid(false);\n yield new Promise((resolve)=>setTimeout(resolve, 1000));\n }\n })())());\n return ()=>{\n interruptFlag = true;\n };\n }, [\n serviceMode,\n shouldRun\n ]);\n return serverValid;\n};\nexport { useServerValid };\n","import './index.less';\nimport { MobileOutlined } from '@ant-design/icons';\nimport { useServerValid } from '@midscene/visualizer';\nimport { message } from 'antd';\nimport { useCallback } from 'react';\nimport type { RefObject } from 'react';\nimport type { ScrcpyRefMethods } from '../scrcpy-player';\n\n// status dot indicator\nconst onlineStatus = (color: string) => (\n <span\n className=\"status-dot\"\n style={{\n color: color,\n }}\n >\n ●\n </span>\n);\n\nexport interface Device {\n id: string;\n name: string;\n status: string;\n}\n\nexport interface AdbDeviceProps {\n selectedDeviceId: string | null;\n scrcpyPlayerRef: RefObject<ScrcpyRefMethods>;\n}\n\nconst AdbDevice: React.FC<AdbDeviceProps> = ({\n selectedDeviceId,\n scrcpyPlayerRef,\n}) => {\n const [messageApi, contextHolder] = message.useMessage();\n const serverValid = useServerValid(true);\n\n // disconnect device\n const disconnectDevice = useCallback(() => {\n // call ScrcpyPlayer's disconnectDevice method\n if (scrcpyPlayerRef.current) {\n scrcpyPlayerRef.current.disconnectDevice();\n messageApi.info('Device disconnected');\n }\n }, [scrcpyPlayerRef, messageApi]);\n\n return (\n <div className=\"device-header\">\n {contextHolder}\n <div className=\"device-title-container\">\n <h2 className=\"device-title\">Device</h2>\n <div className=\"device-info-display\">\n <div className=\"device-icon-container\">\n <MobileOutlined className=\"device-icon\" />\n {selectedDeviceId && serverValid && (\n <div className=\"status-indicator\">{onlineStatus('#52c41a')}</div>\n )}\n </div>\n {selectedDeviceId ? (\n <span className=\"device-name\">{selectedDeviceId}</span>\n ) : (\n <span className=\"device-name no-device\">No device selected</span>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default AdbDevice;\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 { 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: 'OPENAI_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 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 WELCOME_MESSAGE_TEMPLATE = {\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 web page, 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 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, deepThinkTip, defaultMainButtons, domIncludedTip, 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","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 | 'Action'\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 value = (task as ExecutionTaskPlanning)?.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 === 'AndroidPull'\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 AiExtractElementInfo,\n AiLocateElement,\n callAIWithObjectResponse,\n} from '@/ai-model/index';\nimport { AiLocateSection } from '@/ai-model/inspect';\nimport { elementDescriberInstruction } from '@/ai-model/prompt/describe';\nimport { AIActionType, type AIArgs, expandSearchArea } from '@/common';\nimport type {\n AIDescribeElementResponse,\n AIUsageInfo,\n DetailedLocateParam,\n LocateResultWithDump,\n PartialServiceDumpFromSDK,\n Rect,\n ServiceExtractOption,\n ServiceExtractParam,\n ServiceExtractResult,\n ServiceTaskInfo,\n UIContext,\n} from '@/types';\nimport { ServiceError } from '@/types';\nimport {\n type IModelConfig,\n MIDSCENE_FORCE_DEEP_THINK,\n globalConfigManager,\n} 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}\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 aiVendorFn?: typeof callAIWithObjectResponse;\n}\n\nconst debug = getDebug('ai:service');\nexport default class Service {\n contextRetrieverFn: () => Promise<UIContext> | UIContext;\n\n aiVendorFn: Exclude<ServiceOptions['aiVendorFn'], undefined> =\n callAIWithObjectResponse;\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 // just for unit test, aiVendorFn is callAIWithObjectResponse by default\n if (typeof opt?.aiVendorFn !== 'undefined') {\n this.aiVendorFn = opt.aiVendorFn;\n }\n if (typeof opt?.taskInfo !== 'undefined') {\n this.taskInfo = opt.taskInfo;\n }\n }\n\n async locate(\n query: DetailedLocateParam,\n opt: LocateOpts,\n modelConfig: IModelConfig,\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 globalDeepThinkSwitch = globalConfigManager.getEnvConfigInBoolean(\n MIDSCENE_FORCE_DEEP_THINK,\n );\n if (globalDeepThinkSwitch) {\n debug('globalDeepThinkSwitch', globalDeepThinkSwitch);\n }\n let searchAreaPrompt;\n if (query.deepThink || globalDeepThinkSwitch) {\n searchAreaPrompt = query.prompt;\n }\n\n const { vlMode } = modelConfig;\n\n if (searchAreaPrompt && !vlMode) {\n console.warn(\n 'The \"deepThink\" feature is not supported with multimodal LLM. Please config VL model for Midscene. https://midscenejs.com/choose-a-model',\n );\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 (searchAreaPrompt) {\n searchAreaResponse = await AiLocateSection({\n context,\n sectionDescription: searchAreaPrompt,\n modelConfig,\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 } = await AiLocateElement({\n callAIFn: this.aiVendorFn,\n context,\n targetElementDescription: queryPrompt,\n searchConfig: searchAreaResponse,\n modelConfig,\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 };\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 deepThink: !!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 ): Promise<ServiceExtractResult<T>> {\n assert(\n typeof dataDemand === 'object' || typeof dataDemand === 'string',\n `dataDemand should be object or string, but get ${typeof dataDemand}`,\n );\n const context = await this.contextRetrieverFn();\n\n const startTime = Date.now();\n\n const { parseResult, usage } = await AiExtractElementInfo<T>({\n context,\n dataQuery: dataDemand,\n multimodalPrompt,\n extractOption: opt,\n modelConfig,\n pageDescription,\n });\n\n const timeCost = Date.now() - startTime;\n const taskInfo: ServiceTaskInfo = {\n ...(this.taskInfo ? this.taskInfo : {}),\n durationMs: timeCost,\n rawResponse: JSON.stringify(parseResult),\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 // 4\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 dump,\n };\n }\n\n async describe(\n target: Rect | [number, number],\n modelConfig: IModelConfig,\n opt?: {\n deepThink?: boolean;\n },\n ): Promise<Pick<AIDescribeElementResponse, 'description'>> {\n assert(target, 'target is required for service.describe');\n const context = await this.contextRetrieverFn();\n const { screenshotBase64, size } = context;\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 { vlMode } = 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,\n elementsPositionInfo: [\n {\n rect: targetRect,\n },\n ],\n borderThickness: 3,\n });\n\n if (opt?.deepThink) {\n const searchArea = expandSearchArea(targetRect, context.size, vlMode);\n debug('describe: set searchArea', searchArea);\n const croppedResult = await cropByRect(\n imagePayload,\n searchArea,\n vlMode === '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 callAIFn = this\n .aiVendorFn as typeof callAIWithObjectResponse<AIDescribeElementResponse>;\n\n const res = await callAIFn(\n msgs,\n AIActionType.DESCRIBE_ELEMENT,\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 {\n ExecutionDump,\n ExecutionRecorderItem,\n ExecutionTask,\n ExecutionTaskActionApply,\n ExecutionTaskApply,\n ExecutionTaskPlanningLocateOutput,\n ExecutionTaskProgressOptions,\n ExecutionTaskReturn,\n ExecutorContext,\n PlanningActionParamError,\n UIContext,\n} from '@/types';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } 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 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 constructor(\n name: string,\n uiContextBuilder: () => Promise<UIContext>,\n options?: TaskRunnerInitOptions,\n ) {\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 }\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<string | undefined> {\n try {\n const uiContext = await this.getUiContext({ forceRefresh: true });\n return uiContext?.screenshotBase64;\n } catch (error) {\n console.error('error while capturing screenshot', error);\n }\n return undefined;\n }\n\n private attachRecorderItem(\n task: ExecutionTask,\n contextOrScreenshot: UIContext | string | undefined,\n phase: 'after-calling',\n ): void {\n const timing = phase;\n const screenshot =\n typeof contextOrScreenshot === 'string'\n ? contextOrScreenshot\n : contextOrScreenshot?.screenshotBase64;\n if (!timing || !screenshot) {\n return;\n }\n\n const recorderItem: ExecutionRecorderItem = {\n type: 'screenshot',\n ts: Date.now(),\n screenshot,\n timing,\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 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 private findPreviousNonSubTaskUIContext(\n currentIndex: number,\n ): UIContext | undefined {\n for (let i = currentIndex - 1; i >= 0; i--) {\n const candidate = this.tasks[i];\n if (!candidate || candidate.subTask) {\n continue;\n }\n if (candidate.uiContext) {\n return candidate.uiContext;\n }\n }\n return undefined;\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 let uiContext: UIContext | undefined;\n if (task.subTask) {\n uiContext = this.findPreviousNonSubTaskUIContext(taskIndex);\n assert(\n uiContext,\n 'subTask requires uiContext from previous non-subTask task',\n );\n } else {\n uiContext = await this.getUiContext();\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 const screenshot = await this.captureScreenshot();\n this.attachRecorderItem(task, screenshot, 'after-calling');\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 const errorTaskIndex = this.tasks.findIndex(\n (task) => task.status === 'failed',\n );\n if (errorTaskIndex >= 0) {\n return this.tasks[errorTaskIndex];\n }\n return null;\n }\n\n dump(): ExecutionDump {\n const dumpData: ExecutionDump = {\n logTime: Date.now(),\n name: this.name,\n tasks: this.tasks,\n };\n return dumpData;\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 type { TMultimodalPrompt, TUserPrompt } from '@/common';\nimport type { AbstractInterface } from '@/device';\nimport type {\n ElementCacheFeature,\n LocateResultElement,\n PlanningLocateParam,\n UIContext,\n} from '@/types';\nimport { uploadTestInfoToServer } from '@/utils';\nimport {\n MIDSCENE_REPORT_TAG_NAME,\n globalConfigManager,\n} from '@midscene/shared/env';\nimport { generateElementByPosition } from '@midscene/shared/extractor';\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\nconst debugProfile = getDebug('web:tool:profile');\n\nexport async function commonContextParser(\n interfaceInstance: AbstractInterface,\n _opt: { uploadServerUrl?: string },\n): Promise<UIContext> {\n assert(interfaceInstance, 'interfaceInstance is required');\n\n debugProfile('Getting interface description');\n const description = interfaceInstance.describe?.() || '';\n debugProfile('Interface description end');\n\n debugProfile('Uploading test info to server');\n uploadTestInfoToServer({\n testUrl: description,\n serverUrl: _opt.uploadServerUrl,\n });\n debugProfile('UploadTestInfoToServer end');\n\n const screenshotBase64 = await interfaceInstance.screenshotBase64();\n assert(screenshotBase64!, 'screenshotBase64 is required');\n\n const size = await interfaceInstance.size();\n debugProfile(`size: ${size.width}x${size.height} dpr: ${size.dpr}`);\n\n return {\n size,\n screenshotBase64: screenshotBase64!,\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 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 const centerPosition = {\n x: Math.floor((planLocateParam.bbox[0] + planLocateParam.bbox[2]) / 2),\n y: Math.floor((planLocateParam.bbox[1] + planLocateParam.bbox[3]) / 2),\n };\n\n const element = generateElementByPosition(\n centerPosition,\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","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 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.getEnvConfigInNumber(\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 for (let i = 0; i < this.cacheOriginalLength; i++) {\n const item = this.cache.caches[i];\n const promptStr =\n typeof prompt === 'string' ? prompt : JSON.stringify(prompt);\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 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 return this.matchCache(prompt, 'plan') as\n | MatchCacheResult<PlanningCache>\n | undefined;\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);\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 { findAllMidsceneLocatorField, parseActionParam } from '@/ai-model';\nimport type { AbstractInterface } from '@/device';\nimport type Service from '@/service';\nimport type {\n DetailedLocateParam,\n ElementCacheFeature,\n ExecutionTaskActionApply,\n ExecutionTaskApply,\n ExecutionTaskHitBy,\n ExecutionTaskPlanningLocateApply,\n LocateResultElement,\n LocateResultWithDump,\n PlanningAction,\n PlanningActionParamSleep,\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 { generateElementByPosition } 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} from './utils';\n\nconst debug = getDebug('agent:task-builder');\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}\n\ninterface BuildOptions {\n cacheable?: boolean;\n subTask?: boolean;\n}\n\ninterface PlanBuildContext {\n tasks: ExecutionTaskApply[];\n modelConfigForPlanning: IModelConfig;\n modelConfigForDefaultIntent: IModelConfig;\n cacheable?: boolean;\n subTask: boolean;\n}\n\nexport class TaskBuilder {\n private readonly interface: AbstractInterface;\n\n private readonly service: Service;\n\n private readonly taskCache?: TaskCache;\n\n constructor({ interfaceInstance, service, taskCache }: TaskBuilderDeps) {\n this.interface = interfaceInstance;\n this.service = service;\n this.taskCache = taskCache;\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 subTask: !!options?.subTask,\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 'Sleep',\n (plan) =>\n this.handleSleepPlan(\n plan as PlanningAction<PlanningActionParamSleep>,\n context,\n ),\n ],\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 subTask: context.subTask || undefined,\n executor: async () => {},\n };\n context.tasks.push(taskActionFinished);\n }\n\n private handleSleepPlan(\n plan: PlanningAction<PlanningActionParamSleep>,\n context: PlanBuildContext,\n ): void {\n const sleepTask = this.createSleepTask(plan.param, {\n thought: plan.thought,\n });\n if (context.subTask) {\n sleepTask.subTask = true;\n }\n context.tasks.push(sleepTask);\n }\n\n public createSleepTask(\n param: PlanningActionParamSleep,\n meta?: { thought?: string },\n ): ExecutionTaskActionApply<PlanningActionParamSleep> {\n return {\n type: 'Action Space',\n subType: 'Sleep',\n param,\n thought: meta?.thought,\n executor: async (taskParam) => {\n await sleep(taskParam?.timeMs || 3000);\n },\n };\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 = await this.interface.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 if (ifPlanLocateParamIsBbox(param[field])) {\n debug(\n 'plan locate param is bbox, will match element from plan',\n param[field],\n );\n const elementFromPlan = matchElementFromPlan(param[field]);\n if (elementFromPlan) {\n param[field] = elementFromPlan;\n }\n } else {\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 );\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 }\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 subTask: context.subTask || undefined,\n executor: async (param, taskContext) => {\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 try {\n await Promise.all([\n (async () => {\n if (this.interface.beforeInvokeAction) {\n debug('will call \"beforeInvokeAction\" for interface');\n await this.interface.beforeInvokeAction(action.name, param);\n debug('called \"beforeInvokeAction\" for interface');\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\n if (action.paramSchema) {\n try {\n param = parseActionParam(param, action.paramSchema);\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 debug('calling action', action.name);\n const actionFn = action.call.bind(this.interface);\n const actionResult = await actionFn(param, taskContext);\n debug('called action', action.name, 'result:', actionResult);\n\n const delayAfterRunner = action.delayAfterRunner ?? 300;\n if (delayAfterRunner > 0) {\n await sleep(delayAfterRunner);\n }\n\n try {\n if (this.interface.afterInvokeAction) {\n debug('will call \"afterInvokeAction\" for interface');\n await this.interface.afterInvokeAction(action.name, param);\n debug('called \"afterInvokeAction\" for interface');\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 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 } = context;\n\n let locateParam = detailedLocateParam;\n console.log(\n 'modelConfigForDefaultIntent-locateParam',\n modelConfigForDefaultIntent,\n locateParam,\n );\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 const taskLocator: ExecutionTaskPlanningLocateApply = {\n type: 'Planning',\n subType: 'Locate',\n subTask: context.subTask || undefined,\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 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 };\n task.usage = dump.taskInfo?.usage;\n if (dump.taskInfo?.searchAreaUsage) {\n task.searchAreaUsage = dump.taskInfo.searchAreaUsage;\n }\n };\n\n // from xpath\n let rectFromXpath: Rect | undefined;\n if (param.xpath && this.interface.rectMatchesCacheFeature) {\n try {\n rectFromXpath = await this.interface.rectMatchesCacheFeature({\n xpaths: [param.xpath],\n });\n } catch (error) {\n // xpath locate failed, allow fallback to cache or AI locate\n rectFromXpath = undefined;\n }\n }\n const elementFromXpath = rectFromXpath\n ? generateElementByPosition(\n {\n x: rectFromXpath.left + rectFromXpath.width / 2,\n y: rectFromXpath.top + rectFromXpath.height / 2,\n },\n typeof param.prompt === 'string'\n ? param.prompt\n : param.prompt?.prompt || '',\n )\n : undefined;\n const userExpectedPathHitFlag = !!elementFromXpath;\n\n const cachePrompt = param.prompt;\n const locateCacheRecord = this.taskCache?.matchLocateCache(cachePrompt);\n const cacheEntry = locateCacheRecord?.cacheContent?.cache;\n\n const elementFromCache = userExpectedPathHitFlag\n ? null\n : await matchElementFromCache(\n {\n taskCache: this.taskCache,\n interfaceInstance: this.interface,\n },\n cacheEntry,\n cachePrompt,\n param.cacheable,\n );\n const cacheHitFlag = !!elementFromCache;\n\n const planHitFlag = false;\n\n let elementFromAiLocate: LocateResultElement | null | undefined;\n if (!userExpectedPathHitFlag && !cacheHitFlag && !planHitFlag) {\n try {\n locateResult = await this.service.locate(\n param,\n {\n context: uiContext,\n },\n modelConfigForDefaultIntent,\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 }\n }\n\n const element =\n elementFromXpath || elementFromCache || elementFromAiLocate;\n\n let currentCacheEntry: ElementCacheFeature | undefined;\n if (\n element &&\n this.taskCache &&\n !cacheHitFlag &&\n param?.cacheable !== false\n ) {\n if (this.interface.cacheFeatureForRect) {\n try {\n const feature = await this.interface.cacheFeatureForRect(\n element.rect,\n {\n targetDescription:\n typeof param.prompt === 'string'\n ? param.prompt\n : param.prompt?.prompt,\n modelConfig: modelConfigForDefaultIntent,\n },\n );\n if (feature && Object.keys(feature).length > 0) {\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('cacheFeatureForRect failed: %s', error);\n }\n } else {\n debug('cacheFeatureForRect 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 (userExpectedPathHitFlag) {\n hitBy = {\n from: 'User expected path',\n context: {\n xpath: param.xpath,\n },\n };\n } else if (cacheHitFlag) {\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 },\n hitBy,\n };\n },\n };\n\n return taskLocator;\n }\n}\n","import { ConversationHistory, plan, uiTarsPlanning } from '@/ai-model';\nimport type { TMultimodalPrompt, TUserPrompt } from '@/common';\nimport type { AbstractInterface } from '@/device';\nimport type Service from '@/service';\nimport type { TaskRunner } from '@/task-runner';\nimport { TaskExecutionError } from '@/task-runner';\nimport type {\n ExecutionTaskApply,\n ExecutionTaskInsightQueryApply,\n ExecutionTaskPlanningApply,\n ExecutionTaskProgressOptions,\n InterfaceType,\n MidsceneYamlFlowItem,\n PlanningAIResponse,\n PlanningAction,\n PlanningActionParamSleep,\n PlanningActionParamWaitFor,\n ServiceDump,\n ServiceExtractOption,\n ServiceExtractParam,\n} from '@/types';\nimport { ServiceError } from '@/types';\nimport type { IModelConfig } 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 { 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 taskBuilder: TaskBuilder;\n\n private conversationHistory: ConversationHistory;\n\n onTaskStartCallback?: ExecutionTaskProgressOptions['onTaskStart'];\n\n private readonly hooks?: TaskExecutorHooks;\n\n replanningCycleLimit?: number;\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 hooks?: TaskExecutorHooks;\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.hooks = opts.hooks;\n this.conversationHistory = new ConversationHistory();\n this.taskBuilder = new TaskBuilder({\n interfaceInstance,\n service,\n taskCache: opts.taskCache,\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 public async convertPlanToExecutable(\n plans: PlanningAction[],\n modelConfigForPlanning: IModelConfig,\n modelConfigForDefaultIntent: IModelConfig,\n options?: {\n cacheable?: boolean;\n subTask?: boolean;\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('Action', 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 more_actions_needed_by_instruction: 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 backgroundKnowledge?: string,\n cacheable?: boolean,\n replanningCycleLimitOverride?: number,\n ): Promise<\n ExecutionResult<\n | {\n yamlFlow?: MidsceneYamlFlowItem[]; // for cache use\n }\n | undefined\n >\n > {\n this.conversationHistory.reset();\n\n const session = this.createExecutionSession(\n taskTitleStr('Action', 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\n // Main planning loop - unified plan/replan logic\n while (true) {\n const result = await session.appendAndRun(\n {\n type: 'Planning',\n subType: 'Plan',\n param: {\n userInstruction: userPrompt,\n aiActionContext: backgroundKnowledge,\n },\n executor: async (param, executorContext) => {\n const startTime = Date.now();\n const { uiContext } = executorContext;\n assert(uiContext, 'uiContext is required for Planning task');\n const { vlMode } = modelConfigForPlanning;\n const uiTarsModelVersion =\n vlMode === 'vlm-ui-tars'\n ? modelConfigForPlanning.uiTarsModelVersion\n : undefined;\n\n assert(\n this.interface.actionSpace,\n 'actionSpace for device is not implemented',\n );\n const actionSpace = await this.interface.actionSpace();\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 planResult = await (uiTarsModelVersion\n ? uiTarsPlanning\n : plan)(param.userInstruction, {\n context: uiContext,\n actionContext: param.aiActionContext,\n interfaceType: this.interface.interfaceType as InterfaceType,\n actionSpace,\n modelConfig: modelConfigForPlanning,\n conversationHistory: this.conversationHistory,\n includeBbox: includeBboxInPlanning,\n });\n debug('planResult', JSON.stringify(planResult, null, 2));\n\n const {\n actions,\n log,\n more_actions_needed_by_instruction,\n error,\n usage,\n rawResponse,\n sleep,\n } = planResult;\n\n executorContext.task.log = {\n ...(executorContext.task.log || {}),\n rawResponse,\n };\n executorContext.task.usage = usage;\n executorContext.task.output = {\n actions: actions || [],\n more_actions_needed_by_instruction,\n log,\n yamlFlow: planResult.yamlFlow,\n };\n executorContext.uiContext = uiContext;\n\n const finalActions = [...(actions || [])];\n\n if (sleep) {\n const timeNow = Date.now();\n const timeRemaining = sleep - (timeNow - startTime);\n if (timeRemaining > 0) {\n finalActions.push(this.sleepPlan(timeRemaining));\n }\n }\n\n assert(!error, `Failed to continue: ${error}\\n${log || ''}`);\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 subTask: true,\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 (this.conversationHistory.pendingFeedbackMessage) {\n console.warn(\n 'unconsumed pending feedback message detected, this may lead to unexpected planning result:',\n this.conversationHistory.pendingFeedbackMessage,\n );\n }\n let errorFlag = false;\n try {\n await session.appendAndRun(executables.tasks);\n } catch (error: any) {\n errorFlag = true;\n errorCountInOnePlanningLoop++;\n this.conversationHistory.pendingFeedbackMessage = `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 if task is complete\n if (!planResult?.more_actions_needed_by_instruction) {\n if (errorFlag) {\n debug(\n 'more_actions_needed_by_instruction is false, but there are errors in one planning loop, continue to run',\n );\n } else {\n break;\n }\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 (!this.conversationHistory.pendingFeedbackMessage) {\n this.conversationHistory.pendingFeedbackMessage =\n 'I have finished the action previously planned.';\n }\n }\n\n const finalResult = {\n output: {\n yamlFlow,\n },\n runner,\n };\n return finalResult;\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 };\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 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 );\n } catch (error) {\n if (error instanceof ServiceError) {\n applyDump(error.dump);\n }\n throw error;\n }\n\n const { data, usage, 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.usage = usage;\n task.thought = thought;\n throw new Error(`Assertion failed: ${thought}`);\n }\n\n return {\n output: outputResult,\n log: queryDump,\n usage,\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 private sleepPlan(timeMs: number): PlanningAction<PlanningActionParamSleep> {\n return {\n type: 'Sleep',\n param: {\n timeMs,\n },\n };\n }\n\n async taskForSleep(timeMs: number, _modelConfig: IModelConfig) {\n return this.taskBuilder.createSleepTask({\n timeMs,\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 { timeoutMs, checkIntervalMs } = opt;\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 undefined,\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 timeRemaining = checkIntervalMs - (now - currentCheckStart);\n const sleepTask = this.taskBuilder.createSleepTask({\n timeMs: timeRemaining,\n });\n await session.append(sleepTask);\n }\n }\n\n return session.appendErrorPlan(`waitFor timeout: ${errorThought}`);\n }\n}\n","import {\n type ActionParam,\n type ActionReturn,\n type AgentAssertOpt,\n type AgentDescribeElementAtPointResult,\n type AgentOpt,\n type AgentWaitForOpt,\n type CacheConfig,\n type DeviceAction,\n type ExecutionDump,\n type ExecutionRecorderItem,\n type ExecutionTask,\n type ExecutionTaskLog,\n type GroupedActionDump,\n type LocateOption,\n type LocateResultElement,\n type LocateValidatorResult,\n type LocatorValidatorOption,\n type MidsceneYamlScript,\n type OnTaskStartTip,\n type PlanningAction,\n type Rect,\n type ScrollParam,\n Service,\n type ServiceAction,\n type ServiceExtractOption,\n type ServiceExtractParam,\n type TUserPrompt,\n type UIContext,\n} from '../index';\nexport type TestStatus =\n | 'passed'\n | 'failed'\n | 'timedOut'\n | 'skipped'\n | 'interrupted';\nimport yaml from 'js-yaml';\n\nimport {\n getVersion,\n groupedActionDumpFileExt,\n processCacheConfig,\n reportHTMLContent,\n stringifyDumpData,\n writeLogFile,\n} from '@/utils';\nimport {\n ScriptPlayer,\n buildDetailedLocateParam,\n parseYamlScript,\n} from '../yaml/index';\n\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 { imageInfoOfBase64, resizeImgBase64 } from '@midscene/shared/img';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\n// import type { AndroidDeviceInputOpt } from '../device';\nimport { TaskCache } from './task-cache';\nimport { TaskExecutionError, TaskExecutor, locatePlanForLocate } from './tasks';\nimport { locateParamStr, paramStr, taskTitleStr, typeStr } from './ui-utils';\nimport {\n commonContextParser,\n getReportFileName,\n parsePrompt,\n printReportMsg,\n} 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;\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 onDumpUpdate?: (dump: string) => void;\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 /**\n * Flag to track if VL model warning has been shown\n */\n private hasWarnedNonVLModel = false;\n\n /**\n * Screenshot scale factor derived from actual screenshot dimensions\n */\n private screenshotScale?: number;\n\n /**\n * Internal promise to deduplicate screenshot scale computation\n */\n private screenshotScalePromise?: Promise<number>;\n\n private executionDumpIndexByRunner = new WeakMap<TaskRunner, number>();\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 /**\n * Lazily compute the ratio between the physical screenshot width and the logical page width\n */\n private async getScreenshotScale(context: UIContext): Promise<number> {\n if (this.screenshotScale !== undefined) {\n return this.screenshotScale;\n }\n\n if (!this.screenshotScalePromise) {\n this.screenshotScalePromise = (async () => {\n const pageWidth = context.size?.width;\n assert(\n pageWidth && pageWidth > 0,\n `Invalid page width when computing screenshot scale: ${pageWidth}`,\n );\n\n const { width: screenshotWidth } = await imageInfoOfBase64(\n context.screenshotBase64,\n );\n\n assert(\n Number.isFinite(screenshotWidth) && screenshotWidth > 0,\n `Invalid screenshot width when computing screenshot scale: ${screenshotWidth}`,\n );\n\n const computedScale = screenshotWidth / pageWidth;\n assert(\n Number.isFinite(computedScale) && computedScale > 0,\n `Invalid computed screenshot scale: ${computedScale}`,\n );\n\n debug(\n `Computed screenshot scale ${computedScale} from screenshot width ${screenshotWidth} and page width ${pageWidth}`,\n );\n return computedScale;\n })();\n }\n\n try {\n this.screenshotScale = await this.screenshotScalePromise;\n return this.screenshotScale;\n } finally {\n this.screenshotScalePromise = undefined;\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 modelConfigForPlanning.vlMode === 'vlm-ui-tars'\n ? defaultVlmUiTarsReplanningCycleLimit\n : defaultReplanningCycleLimit;\n }\n\n constructor(interfaceInstance: InterfaceType, opts?: AgentOpt) {\n this.interface = interfaceInstance;\n\n const envConfig = globalConfigManager.getAllEnvConfig();\n const envReplanningCycleLimitRaw =\n envConfig[MIDSCENE_REPLANNING_CYCLE_LIMIT];\n const envReplanningCycleLimit =\n envReplanningCycleLimitRaw !== undefined\n ? Number(envReplanningCycleLimitRaw)\n : undefined;\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 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 this.taskExecutor = new TaskExecutor(this.interface, this.service, {\n taskCache: this.taskCache,\n onTaskStart: this.callbackOnTaskStartTip.bind(this),\n replanningCycleLimit: this.opts.replanningCycleLimit,\n hooks: {\n onTaskUpdate: (runner) => {\n const executionDump = runner.dump();\n this.appendExecutionDump(executionDump, runner);\n\n try {\n if (this.onDumpUpdate) {\n this.onDumpUpdate(this.dumpDataString());\n }\n } catch (error) {\n console.error('Error in onDumpUpdate', error);\n }\n\n this.writeOutActionDumps();\n },\n },\n });\n this.dump = this.resetDump();\n this.reportFileName =\n opts?.reportFileName ||\n getReportFileName(opts?.testId || this.interface.interfaceType || 'web');\n }\n\n async getActionSpace(): Promise<DeviceAction[]> {\n return this.interface.actionSpace();\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 // Get original context\n let context: UIContext;\n if (this.interface.getContext) {\n debug('Using page.getContext for action:', action);\n context = await this.interface.getContext();\n } else {\n debug('Using commonContextParser for action:', action);\n context = await commonContextParser(this.interface, {\n uploadServerUrl: this.modelConfigManager.getUploadTestServerUrl(),\n });\n }\n\n const computedScreenshotScale = await this.getScreenshotScale(context);\n\n if (computedScreenshotScale !== 1) {\n const scaleForLog = Number.parseFloat(computedScreenshotScale.toFixed(4));\n debug(\n `Applying computed screenshot scale: ${scaleForLog} (resize to logical size)`,\n );\n const targetWidth = Math.round(context.size.width);\n const targetHeight = Math.round(context.size.height);\n debug(`Resizing screenshot to ${targetWidth}x${targetHeight}`);\n context.screenshotBase64 = await resizeImgBase64(\n context.screenshotBase64,\n { width: targetWidth, height: targetHeight },\n );\n } else {\n debug(`screenshot scale=${computedScreenshotScale}`);\n }\n\n return context;\n }\n\n async _snapshotContext(): Promise<UIContext> {\n return await this.getUIContext('locate');\n }\n\n async setAIActionContext(prompt: string) {\n if (this.opts.aiActionContext) {\n console.warn(\n 'aiActionContext is already set, and it is called again, will override the previous setting',\n );\n }\n this.opts.aiActionContext = prompt;\n }\n\n resetDump() {\n this.dump = {\n sdkVersion: getVersion(),\n groupName: this.opts.groupName!,\n groupDescription: this.opts.groupDescription,\n executions: [],\n modelBriefs: [],\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() {\n // update dump info\n this.dump.groupName = this.opts.groupName!;\n this.dump.groupDescription = this.opts.groupDescription;\n return stringifyDumpData(this.dump);\n }\n\n reportHTMLString() {\n return reportHTMLContent(this.dumpDataString());\n }\n\n writeOutActionDumps() {\n if (this.destroyed) {\n throw new Error(\n 'PageAgent has been destroyed. Cannot update report file.',\n );\n }\n const { generateReport, autoPrintReportMsg } = this.opts;\n this.reportFile = writeLogFile({\n fileName: this.reportFileName!,\n fileExt: groupedActionDumpFileExt,\n fileContent: this.dumpDataString(),\n type: 'dump',\n generateReport,\n });\n debug('writeOutActionDumps', this.reportFile);\n if (generateReport && autoPrintReportMsg && this.reportFile) {\n printReportMsg(this.reportFile);\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(locatePrompt: TUserPrompt, opt?: LocateOption) {\n assert(locatePrompt, 'missing locate prompt for tap');\n\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n\n return this.callActionInActionSpace('Tap', {\n locate: detailedLocateParam,\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' | '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' | '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' | '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' | '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 return this.callActionInActionSpace('Input', {\n ...(opt || {}),\n value: stringValue,\n locate: detailedLocateParam,\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 // Check if using new signature (first param is locatePrompt, second has scroll params)\n if (\n typeof locatePromptOrOpt === 'object' &&\n ('direction' in locatePromptOrOpt ||\n 'scrollType' in locatePromptOrOpt ||\n 'distance' in locatePromptOrOpt)\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 aiAct(\n taskPrompt: string,\n opt?: {\n cacheable?: boolean;\n _deepThink?: boolean;\n },\n ) {\n const modelConfigForPlanning =\n this.modelConfigManager.getModelConfig('planning');\n const defaultIntentModelConfig =\n this.modelConfigManager.getModelConfig('default');\n\n let thinkingLevelToUse = opt?._deepThink ? 'high' : 'medium';\n if (this.opts.aiActionContext) {\n debug('using high thinking level because of aiActionContext');\n thinkingLevelToUse = 'high';\n }\n\n // should include bbox in planning if\n // 1. the planning model is the same as the default intent model\n // and\n // 2. the thinking level is not high\n const includeBboxInPlanning =\n modelConfigForPlanning.modelName === defaultIntentModelConfig.modelName &&\n thinkingLevelToUse !== 'high';\n debug('setting includeBboxInPlanning to', includeBboxInPlanning);\n\n const cacheable = opt?.cacheable;\n const replanningCycleLimit = this.resolveReplanningCycleLimit(\n modelConfigForPlanning,\n );\n // if vlm-ui-tars, plan cache is not used\n const isVlmUiTars = modelConfigForPlanning.vlMode === 'vlm-ui-tars';\n const matchedCache =\n isVlmUiTars || cacheable === false\n ? undefined\n : this.taskCache?.matchPlanCache(taskPrompt);\n if (\n matchedCache &&\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 return this.runYaml(yaml);\n }\n\n // If cache matched but yamlWorkflow is empty, fall through to normal execution\n\n const { output } = await this.taskExecutor.action(\n taskPrompt,\n modelConfigForPlanning,\n defaultIntentModelConfig,\n includeBboxInPlanning,\n this.opts.aiActionContext,\n cacheable,\n replanningCycleLimit,\n );\n\n // update cache\n if (this.taskCache && output?.yamlFlow && cacheable !== false) {\n const yamlContent: MidsceneYamlScript = {\n tasks: [\n {\n name: taskPrompt,\n flow: output.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 output;\n }\n\n /**\n * @deprecated Use {@link Agent.aiAct} instead.\n */\n async aiAction(\n taskPrompt: string,\n opt?: {\n cacheable?: boolean;\n },\n ) {\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 deepThink?: 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 deepThink = opt?.deepThink || false;\n let verifyResult: LocateValidatorResult | undefined;\n\n while (!success && retryCount < retryLimit) {\n if (retryCount >= 2) {\n deepThink = true;\n }\n debug(\n 'aiDescribe',\n center,\n 'verifyPrompt',\n verifyPrompt,\n 'retryCount',\n retryCount,\n 'deepThink',\n deepThink,\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 deepThink,\n });\n debug('aiDescribe text', text);\n assert(text.description, `failed to describe element at [${center}]`);\n resultPrompt = text.description;\n\n verifyResult = await this.verifyLocator(\n resultPrompt,\n deepThink ? { deepThink: true } : 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 deepThink,\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 const dprValue = await (this.interface.size() as any).dpr;\n const dprEntry = dprValue\n ? {\n dpr: dprValue,\n }\n : {};\n return {\n rect: element?.rect,\n center: element?.center,\n ...dprEntry,\n } as Pick<LocateResultElement, 'rect' | 'center'> & {\n dpr?: number; // this field is deprecated\n };\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 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 async destroy() {\n // Early return if already destroyed\n if (this.destroyed) {\n return;\n }\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 // 2. build recorder\n const recorder: ExecutionRecorderItem[] = [\n {\n type: 'screenshot',\n ts: now,\n screenshot: base64,\n },\n ];\n // 3. build ExecutionTaskLog\n const task: ExecutionTaskLog = {\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: ExecutionDump = {\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 try {\n this.onDumpUpdate?.(this.dumpDataString());\n } catch (error) {\n console.error('Failed to update dump', error);\n }\n\n this.writeOutActionDumps();\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 /**\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","\"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 allScriptsFromDump = (dump)=>{\n const dimensionsSet = new Set();\n let firstWidth;\n let firstHeight;\n const sdkVersion = dump.sdkVersion;\n const modelBriefsSet = new Set();\n dump.executions.forEach((execution)=>{\n execution.tasks.forEach((task)=>{\n var _task_uiContext_size, _task_uiContext;\n if (null == (_task_uiContext = task.uiContext) ? void 0 : null == (_task_uiContext_size = _task_uiContext.size) ? void 0 : _task_uiContext_size.width) {\n const w = task.uiContext.size.width;\n const h = task.uiContext.size.height;\n if (!firstWidth) {\n firstWidth = w;\n firstHeight = h;\n }\n dimensionsSet.add(`${w}x${h}`);\n }\n });\n });\n if (!firstWidth || !firstHeight) {\n console.warn('width or height is missing in dump file');\n return {\n scripts: [],\n sdkVersion,\n modelBriefs: []\n };\n }\n const allScripts = [];\n dump.executions.forEach((execution)=>{\n const scripts = generateAnimationScripts(execution, -1, firstWidth, firstHeight);\n if (scripts) allScripts.push(...scripts);\n execution.tasks.forEach((task)=>{\n if (task.usage) {\n const { model_name, model_description, intent } = task.usage;\n if (intent && model_name) modelBriefsSet.add(model_description ? `${intent}/${model_name}(${model_description})` : `${intent}/${model_name}`);\n }\n });\n });\n const allScriptsWithoutIntermediateDoneFrame = allScripts.filter((script, index)=>{\n if (index !== allScripts.length - 1 && 'Done' === script.title) return false;\n return true;\n });\n const modelBriefs = (()=>{\n var _list_;\n const list = [\n ...modelBriefsSet\n ];\n if (!list.length) return list;\n const firstOneInfo = null == (_list_ = list[0]) ? void 0 : _list_.split('/', 2)[1];\n if (firstOneInfo && list.slice(1).every((item)=>(null == item ? void 0 : item.split('/', 2)[1]) === firstOneInfo)) return [\n firstOneInfo\n ];\n return list;\n })();\n return {\n scripts: allScriptsWithoutIntermediateDoneFrame,\n width: firstWidth,\n height: firstHeight,\n sdkVersion,\n modelBriefs\n };\n};\nconst generateAnimationScripts = (execution, task, imageWidth, imageHeight)=>{\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) 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 setPointerScript = (img, title, subTitle)=>({\n type: 'pointer',\n img,\n duration: 0,\n title,\n subTitle\n });\n const scripts = [];\n let insightCameraState;\n let insightOnTop = false;\n tasksIncluded.length;\n let initSubTitle = '';\n let errorStateFlag = false;\n tasksIncluded.forEach((task, index)=>{\n if (errorStateFlag) return;\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.screenshotBase64) {\n var _context_size, _context_size1;\n const width = (null == (_context_size = context.size) ? void 0 : _context_size.width) || imageWidth;\n const height = (null == (_context_size1 = context.size) ? void 0 : _context_size1.height) || imageHeight;\n scripts.push({\n type: 'img',\n img: context.screenshotBase64,\n duration: stillAfterInsightDuration,\n title,\n subTitle,\n imageWidth: width,\n imageHeight: height\n });\n locateElements.forEach((element)=>{\n var _task_log_taskInfo, _task_log, _context_size, _context_size1;\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({\n type: 'insight',\n img: context.screenshotBase64,\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_size = context.size) ? void 0 : _context_size.width) || imageWidth,\n imageHeight: (null == (_context_size1 = context.size) ? void 0 : _context_size1.height) || imageHeight\n });\n insightOnTop = true;\n });\n }\n const planningTask = task;\n if (planningTask.recorder && planningTask.recorder.length > 0) {\n var _planningTask_recorder_, _planningTask_recorder, _task_uiContext_size, _task_uiContext, _task_uiContext_size1, _task_uiContext1;\n scripts.push({\n type: 'img',\n img: null == (_planningTask_recorder = planningTask.recorder) ? void 0 : null == (_planningTask_recorder_ = _planningTask_recorder[0]) ? void 0 : _planningTask_recorder_.screenshot,\n duration: stillDuration,\n title: typeStr(task),\n subTitle: paramStr(task),\n imageWidth: (null == (_task_uiContext = task.uiContext) ? void 0 : null == (_task_uiContext_size = _task_uiContext.size) ? void 0 : _task_uiContext_size.width) || imageWidth,\n imageHeight: (null == (_task_uiContext1 = task.uiContext) ? void 0 : null == (_task_uiContext_size1 = _task_uiContext1.size) ? void 0 : _task_uiContext_size1.height) || imageHeight\n });\n }\n } else if ('Action Space' === task.type) {\n var _task_recorder_, _task_recorder, _task_uiContext_size2, _task_uiContext2, _task_uiContext_size3, _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 });\n if (insightOnTop) {\n scripts.push({\n type: 'clear-insight',\n duration: clearInsightDuration,\n title,\n subTitle\n });\n insightOnTop = false;\n }\n scripts.push(setPointerScript(mousePointer, title, subTitle));\n scripts.push({\n type: 'img',\n img: null == (_task_recorder = task.recorder) ? void 0 : null == (_task_recorder_ = _task_recorder[0]) ? void 0 : _task_recorder_.screenshot,\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_size2 = _task_uiContext2.size) ? void 0 : _task_uiContext_size2.width) || imageWidth,\n imageHeight: (null == (_task_uiContext3 = task.uiContext) ? void 0 : null == (_task_uiContext_size3 = _task_uiContext3.size) ? void 0 : _task_uiContext_size3.height) || imageHeight\n });\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_size4, _task_uiContext4, _task_uiContext_size5, _task_uiContext5;\n scripts.push({\n type: 'img',\n img: screenshot,\n duration: stillDuration,\n camera: fullPageCameraState,\n title,\n subTitle,\n imageWidth: (null == (_task_uiContext4 = task.uiContext) ? void 0 : null == (_task_uiContext_size4 = _task_uiContext4.size) ? void 0 : _task_uiContext_size4.width) || imageWidth,\n imageHeight: (null == (_task_uiContext5 = task.uiContext) ? void 0 : null == (_task_uiContext_size5 = _task_uiContext5.size) ? void 0 : _task_uiContext_size5.height) || imageHeight\n });\n }\n }\n if ('finished' !== task.status) {\n var _task_uiContext_size6, _task_uiContext6, _task_uiContext_size7, _task_uiContext7;\n errorStateFlag = true;\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 scripts.push({\n type: 'img',\n img: task.recorder && task.recorder.length > 0 ? task.recorder[task.recorder.length - 1].screenshot : '',\n camera: fullPageCameraState,\n duration: stillDuration,\n title: errorTitle,\n subTitle: errorSubTitle,\n imageWidth: (null == (_task_uiContext6 = task.uiContext) ? void 0 : null == (_task_uiContext_size6 = _task_uiContext6.size) ? void 0 : _task_uiContext_size6.width) || imageWidth,\n imageHeight: (null == (_task_uiContext7 = task.uiContext) ? void 0 : null == (_task_uiContext_size7 = _task_uiContext7.size) ? void 0 : _task_uiContext_size7.height) || imageHeight\n });\n return;\n }\n });\n if (!errorStateFlag) scripts.push({\n title: 'Done',\n subTitle: initSubTitle,\n type: 'img',\n duration: lastFrameDuration,\n camera: fullPageCameraState\n });\n return scripts;\n};\nexport { allScriptsFromDump, cameraStateForRect, generateAnimationScripts, mergeTwoCameraState };\n","import { useCallback } from \"react\";\nimport { useEnvConfig } from \"../store/store.mjs\";\nimport { noReplayAPIs } from \"@midscene/playground\";\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 usePlaygroundExecution(playgroundSDK, storage, actionSpace, loading, setLoading, infoList, setInfoList, replayCounter, setReplayCounter, verticalMode, currentRunningIdRef, interruptedFlagRef) {\n const { 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.onProgressUpdate) playgroundSDK.onProgressUpdate(()=>{});\n if (playgroundSDK.onProgressUpdate) playgroundSDK.onProgressUpdate((tip)=>{\n if (interruptedFlagRef.current[thisRunningId]) return;\n setInfoList((prev)=>{\n const lastItem = prev[prev.length - 1];\n if (lastItem && 'progress' === lastItem.type && lastItem.content === tip) return prev;\n const progressItem = {\n id: `progress-${thisRunningId}-${Date.now()}`,\n type: 'progress',\n content: tip,\n timestamp: new Date()\n };\n return [\n ...prev,\n progressItem\n ];\n });\n });\n const deviceOptionsToSend = {\n imeStrategy,\n autoDismissKeyboard,\n keyboardDismissStrategy,\n alwaysRefreshScreenInfo\n };\n result.result = yield playgroundSDK.executeAction(actionType, value, {\n requestId: thisRunningId.toString(),\n deepThink,\n screenshotIncluded,\n domIncluded,\n deviceOptions: deviceOptionsToSend\n });\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 = resultObj.error;\n if (void 0 !== resultObj.result) result.result = resultObj.result;\n }\n } catch (e) {\n result.error = (null == e ? void 0 : e.message) || String(e);\n console.error('Playground execution error:', e);\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) && !noReplayAPIs.includes(actionType)) {\n const info = allScriptsFromDump(result.dump);\n setReplayCounter((c)=>c + 1);\n replayInfo = info;\n counter = replayCounter + 1;\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 };\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 deepThink,\n screenshotIncluded,\n domIncluded,\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 yield playgroundSDK.cancelExecution(thisRunningId.toString());\n interruptedFlagRef.current[thisRunningId] = true;\n setLoading(false);\n if (playgroundSDK.onProgressUpdate) playgroundSDK.onProgressUpdate(()=>{});\n setInfoList((prev)=>prev.map((item)=>item.id === `system-${thisRunningId}` && item.loading ? _object_spread_props(_object_spread({}, item), {\n content: 'Operation stopped',\n loading: false,\n loadingProgressText: ''\n }) : item));\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 ]);\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: void 0\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.executions)) return result;\n const compressedExecutions = result.result.dump.executions.map((execution)=>{\n var _execution_tasks;\n return _object_spread_props(_object_spread({}, execution), {\n tasks: (null == (_execution_tasks = execution.tasks) ? void 0 : _execution_tasks.map((task)=>{\n var _task_recorder;\n var _this_compressScreenshotIfNeeded;\n return _object_spread_props(_object_spread({}, task), {\n uiContext: task.uiContext ? _object_spread_props(_object_spread({}, task.uiContext), {\n screenshotBase64: null != (_this_compressScreenshotIfNeeded = this.compressScreenshotIfNeeded(task.uiContext.screenshotBase64)) ? _this_compressScreenshotIfNeeded : task.uiContext.screenshotBase64\n }) : task.uiContext,\n recorder: null == (_task_recorder = task.recorder) ? void 0 : _task_recorder.map((record)=>_object_spread_props(_object_spread({}, record), {\n screenshot: this.compressScreenshotIfNeeded(record.screenshot)\n }))\n });\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 executions: compressedExecutions\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: void 0\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: void 0\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 { WELCOME_MESSAGE_TEMPLATE } 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) {\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 [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({}, WELCOME_MESSAGE_TEMPLATE), {\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 }\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 }\n }, []);\n useEffect(()=>{\n if (infoList.length > 0) scrollToBottom();\n }, [\n infoList,\n scrollToBottom\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({}, WELCOME_MESSAGE_TEMPLATE), {\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 ]);\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 \"pixi.js/unsafe-eval\";\nimport { Application, Container, Graphics, Rectangle, Sprite, Text, Texture } from \"pixi.js\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { colorForName, highlightColorForType } from \"../../utils/color.mjs\";\nimport \"./index.css\";\nimport { DropShadowFilter, GlowFilter } from \"pixi-filters\";\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 itemFillAlpha = 0.4;\nconst highlightAlpha = 0.4;\nconst pointRadius = 10;\nconst pointMarkForItem = (point, type)=>{\n const [x, y] = point;\n const themeColor = highlightColorForType('element');\n const graphics = new Graphics();\n graphics.beginFill(themeColor, itemFillAlpha);\n graphics.drawCircle(x, y, pointRadius);\n graphics.endFill();\n return graphics;\n};\nconst rectMarkForItem = (rect, name, type)=>{\n const { left, top, width, height } = rect;\n let themeColor;\n themeColor = 'element' === type ? colorForName(name) : 'searchArea' === type ? highlightColorForType('searchArea') : highlightColorForType('element');\n const alpha = 'highlight' === type ? highlightAlpha : itemFillAlpha;\n const graphics = new Graphics();\n graphics.beginFill(themeColor, alpha);\n graphics.lineStyle(1, themeColor, 1);\n graphics.drawRect(left, top, width, height);\n graphics.endFill();\n const dropShadowFilter = new DropShadowFilter({\n blur: 2,\n quality: 3,\n alpha: 0.4,\n offset: {\n x: 4,\n y: 4\n },\n color: 0x333333\n });\n graphics.filters = [\n dropShadowFilter\n ];\n const nameFontSize = 18;\n if (!name) return [\n graphics\n ];\n const texts = new Text(name, {\n fontSize: nameFontSize,\n fill: 0x0\n });\n texts.x = left;\n texts.y = Math.max(top - (nameFontSize + 4), 0);\n return [\n graphics,\n texts\n ];\n};\nconst Blackboard = (props)=>{\n const highlightElements = props.highlightElements || [];\n highlightElements.map((e)=>e.id);\n const highlightRect = props.highlightRect;\n const highlightPoints = props.highlightPoints;\n const context = props.uiContext;\n const { size, screenshotBase64 } = context;\n const screenWidth = size.width;\n const screenHeight = size.height;\n const domRef = useRef(null);\n const app = useMemo(()=>new Application(), []);\n const [appInitialed, setAppInitialed] = useState(false);\n const highlightContainer = useMemo(()=>new Container(), []);\n const elementMarkContainer = useMemo(()=>new Container(), []);\n const [hoverElement, setHoverElement] = useState(null);\n const pixiBgRef = useRef(void 0);\n const animationFrameRef = useRef(null);\n const highlightGraphicsRef = useRef([]);\n const glowFiltersRef = useRef([]);\n const backgroundVisible = true;\n const elementsVisible = true;\n useEffect(()=>{\n Promise.resolve((()=>_async_to_generator(function*() {\n if (!domRef.current || !screenWidth) return;\n yield app.init({\n width: screenWidth,\n height: screenHeight,\n background: 0xffffff\n });\n const canvasEl = domRef.current;\n domRef.current.appendChild(app.canvas);\n const { clientWidth } = domRef.current.parentElement;\n const targetHeight = 0.6 * window.innerHeight;\n const viewportRatio = clientWidth / targetHeight;\n if (screenWidth / screenHeight <= viewportRatio) {\n const ratio = targetHeight / screenHeight;\n canvasEl.style.width = `${Math.floor(screenWidth * ratio)}px`;\n canvasEl.style.height = `${Math.floor(screenHeight * ratio)}px`;\n }\n app.stage.addChild(highlightContainer);\n app.stage.addChild(elementMarkContainer);\n setAppInitialed(true);\n })())());\n return ()=>{\n console.log('will destroy');\n if (null !== animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n animationFrameRef.current = null;\n }\n try {\n app.destroy(true, {\n children: true,\n texture: true\n });\n } catch (e) {\n console.warn('destroy failed', e);\n }\n };\n }, [\n app,\n screenWidth,\n screenHeight\n ]);\n useEffect(()=>{\n if (!appInitialed) return;\n app.stage.eventMode = 'static';\n app.stage.hitArea = new Rectangle(0, 0, screenWidth, screenHeight);\n const clickHandler = (event)=>{\n var _props_onCanvasClick;\n console.log('pixi click', event);\n const { x, y } = event.data.global;\n null == (_props_onCanvasClick = props.onCanvasClick) || _props_onCanvasClick.call(props, [\n Math.round(x),\n Math.round(y)\n ]);\n };\n app.stage.on('click', clickHandler);\n return ()=>{\n var _app_stage;\n null == app || null == (_app_stage = app.stage) || _app_stage.off('click');\n };\n }, [\n appInitialed,\n props.onCanvasClick,\n screenWidth,\n screenHeight\n ]);\n useEffect(()=>{\n if (!appInitialed) return;\n const img = new Image();\n img.onload = ()=>{\n if (!app.stage) return;\n const screenshotTexture = Texture.from(img);\n const backgroundSprite = new Sprite(screenshotTexture);\n backgroundSprite.x = 0;\n backgroundSprite.y = 0;\n backgroundSprite.width = screenWidth;\n backgroundSprite.height = screenHeight;\n backgroundSprite.eventMode = 'passive';\n app.stage.addChildAt(backgroundSprite, 0);\n pixiBgRef.current = backgroundSprite;\n backgroundSprite.visible = backgroundVisible;\n };\n img.onerror = (e)=>{\n console.error('load screenshot failed', e);\n };\n img.src = screenshotBase64;\n }, [\n app.stage,\n appInitialed,\n screenWidth,\n screenHeight\n ]);\n const { highlightElementRects } = useMemo(()=>{\n const highlightElementRects = [];\n highlightContainer.removeChildren();\n elementMarkContainer.removeChildren();\n highlightContainer.eventMode = 'passive';\n elementMarkContainer.eventMode = 'passive';\n highlightGraphicsRef.current = [];\n glowFiltersRef.current = [];\n if (highlightRect) {\n const [graphics] = rectMarkForItem(highlightRect, 'Search Area', 'searchArea');\n highlightContainer.addChild(graphics);\n }\n if (highlightElements.length) highlightElements.forEach((element)=>{\n const { rect, content, id } = element;\n const items = rectMarkForItem(rect, content, 'highlight');\n const graphics = items[0];\n const glowFilter = new GlowFilter({\n distance: 30,\n outerStrength: 3,\n innerStrength: 0,\n color: 0xfd5907,\n quality: 0.5\n });\n const existingFilters = graphics.filters;\n if (Array.isArray(existingFilters)) graphics.filters = [\n ...existingFilters,\n glowFilter\n ];\n else if (existingFilters) graphics.filters = [\n existingFilters,\n glowFilter\n ];\n else graphics.filters = [\n glowFilter\n ];\n items.forEach((item)=>highlightContainer.addChild(item));\n highlightGraphicsRef.current.push(graphics);\n glowFiltersRef.current.push(glowFilter);\n });\n if (null == highlightPoints ? void 0 : highlightPoints.length) highlightPoints.forEach((point)=>{\n const graphics = pointMarkForItem(point, 'highlightPoint');\n const glowFilter = new GlowFilter({\n distance: 25,\n outerStrength: 2.5,\n innerStrength: 0,\n color: 0xfd5907,\n quality: 0.5\n });\n graphics.filters = [\n glowFilter\n ];\n highlightContainer.addChild(graphics);\n highlightGraphicsRef.current.push(graphics);\n glowFiltersRef.current.push(glowFilter);\n });\n elementMarkContainer.visible = elementsVisible;\n return {\n highlightElementRects\n };\n }, [\n app,\n appInitialed,\n highlightElements,\n hoverElement,\n highlightRect,\n highlightPoints\n ]);\n useEffect(()=>{\n if (!appInitialed || 0 === highlightGraphicsRef.current.length) return void console.log('Animation skipped:', {\n appInitialed,\n graphicsCount: highlightGraphicsRef.current.length\n });\n console.log('Starting pulsing animation for', highlightGraphicsRef.current.length, 'graphics');\n const graphicsToAnimate = highlightGraphicsRef.current;\n const glowFilters = glowFiltersRef.current;\n const pulseDuration = 1200;\n const minAlpha = 0.4;\n const maxAlpha = 1.0;\n const minGlowStrength = 2.0;\n const maxGlowStrength = 5.0;\n const startTime = performance.now();\n const animate = ()=>{\n const elapsed = performance.now() - startTime;\n const progress = elapsed % pulseDuration / pulseDuration;\n const sineValue = Math.sin(progress * Math.PI * 2);\n const normalizedSine = (sineValue + 1) / 2;\n const alpha = minAlpha + normalizedSine * (maxAlpha - minAlpha);\n const glowStrength = minGlowStrength + normalizedSine * (maxGlowStrength - minGlowStrength);\n graphicsToAnimate.forEach((graphics, index)=>{\n graphics.alpha = alpha;\n if (glowFilters[index]) glowFilters[index].outerStrength = glowStrength;\n });\n animationFrameRef.current = requestAnimationFrame(animate);\n };\n animate();\n return ()=>{\n console.log('Stopping pulsing animation');\n if (null !== animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n animationFrameRef.current = null;\n }\n };\n }, [\n appInitialed,\n highlightElements,\n highlightPoints\n ]);\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__*/ jsx(\"div\", {\n className: \"blackboard-main-content\",\n style: {\n width: '100%'\n },\n ref: domRef\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, pointMarkForItem, rectMarkForItem };\n","import { jsx } from \"react/jsx-runtime\";\nimport \"./index.css\";\nconst ShinyText = ({ text, disabled = false, speed = 5, className = '' })=>{\n const style = {\n '--animation-duration': `${speed}s`\n };\n return /*#__PURE__*/ jsx(\"div\", {\n className: `shiny-text ${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 \"pixi.js/unsafe-eval\";\nimport { Assets } from \"pixi.js\";\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 globalTextureMap = new Map();\nconst loadTexture = (img)=>_async_to_generator(function*() {\n if (globalTextureMap.has(img)) return;\n return Assets.load(img).then((texture)=>{\n globalTextureMap.set(img, texture);\n });\n })();\nconst getTextureFromCache = (name)=>globalTextureMap.get(name);\nconst getTexture = (name)=>_async_to_generator(function*() {\n if (globalTextureMap.has(name)) return globalTextureMap.get(name);\n yield loadTexture(name);\n return globalTextureMap.get(name);\n })();\nexport { getTexture, getTextureFromCache, loadTexture };\n","\"use client\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nimport \"pixi.js/unsafe-eval\";\nimport { Application, Container, Sprite } from \"pixi.js\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport \"./index.css\";\nimport { mouseLoading, mousePointer } from \"../../utils/index.mjs\";\nimport { CaretRightOutlined, DownloadOutlined, ExportOutlined, LoadingOutlined } 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 { useBlackboardPreference } from \"../../store/store.mjs\";\nimport { getTextureFromCache, loadTexture } from \"../../utils/pixi-loader.mjs\";\nimport { rectMarkForItem } from \"../blackboard/index.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 player_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_ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n return target;\n}\nconst canvasPaddingLeft = 0;\nconst canvasPaddingTop = 0;\nconst cubicBezier = (t, p0, p1, p2, p3)=>{\n const t2 = 1 - t;\n return p0 * t2 * t2 * t2 + 3 * p1 * t * t2 * t2 + 3 * p2 * t * t * t2 + p3 * t * t * t;\n};\nconst cubicImage = (t)=>linear(t);\nconst cubicInsightElement = (t)=>cubicBezier(t, 0, 0.5, 0.5, 1);\nconst cubicMouse = (t)=>linear(t);\nconst linear = (t)=>t;\nconst sleep = (ms)=>new Promise((resolve)=>setTimeout(resolve, ms));\nconst ERROR_FRAME_CANCEL = 'frame cancel (this is an error on purpose)';\nconst frameKit = ()=>{\n let cancelFlag = false;\n return {\n frame: (callback)=>{\n if (cancelFlag) throw new Error(ERROR_FRAME_CANCEL);\n requestAnimationFrame(()=>{\n if (cancelFlag) throw new Error(ERROR_FRAME_CANCEL);\n callback(performance.now());\n });\n },\n timeout: (callback, ms)=>{\n if (cancelFlag) throw new Error(ERROR_FRAME_CANCEL);\n setTimeout(()=>{\n if (cancelFlag) throw new Error(ERROR_FRAME_CANCEL);\n callback();\n }, ms);\n },\n cancel: ()=>{\n cancelFlag = true;\n }\n };\n};\nconst singleElementFadeInDuration = 80;\nconst LAYER_ORDER_IMG = 0;\nconst LAYER_ORDER_INSIGHT = 1;\nconst LAYER_ORDER_POINTER = 2;\nconst LAYER_ORDER_SPINNING_POINTER = 3;\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};\nclass RecordingSession {\n start() {\n const stream = this.canvas.captureStream(60);\n const mediaRecorder = new MediaRecorder(stream, {\n mimeType: 'video/webm'\n });\n mediaRecorder.ondataavailable = (event)=>{\n if (event.data.size > 0) this.chunks.push(event.data);\n };\n mediaRecorder.onerror = (event)=>{\n console.error('MediaRecorder error:', event);\n message.error('Video recording failed. Please try again.');\n this.recording = false;\n this.mediaRecorder = null;\n };\n this.mediaRecorder = mediaRecorder;\n this.recording = true;\n return this.mediaRecorder.start();\n }\n stop() {\n if (!this.recording || !this.mediaRecorder) return void console.warn('not recording');\n this.mediaRecorder.onstop = ()=>{\n if (0 === this.chunks.length) {\n console.error('No video data captured');\n message.error('Video export failed: No data captured.');\n return;\n }\n const blob = new Blob(this.chunks, {\n type: 'video/webm'\n });\n if (0 === blob.size) {\n console.error('Video blob is empty');\n message.error('Video export failed: Empty file.');\n return;\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 URL.revokeObjectURL(url);\n };\n this.mediaRecorder.stop();\n this.recording = false;\n this.mediaRecorder = null;\n }\n constructor(canvas){\n _define_property(this, \"canvas\", void 0);\n _define_property(this, \"mediaRecorder\", null);\n _define_property(this, \"chunks\", void 0);\n _define_property(this, \"recording\", false);\n this.canvas = canvas;\n this.chunks = [];\n }\n}\nfunction Player(props) {\n var _scripts_;\n const [titleText, setTitleText] = useState('');\n const [subTitleText, setSubTitleText] = useState('');\n const { autoZoom, setAutoZoom } = useBlackboardPreference();\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 imageWidth = (null == props ? void 0 : props.imageWidth) || 1920;\n const imageHeight = (null == props ? void 0 : props.imageHeight) || 1080;\n const fitMode = (null == props ? void 0 : props.fitMode) || 'height';\n const currentImg = useRef((null == scripts ? void 0 : null == (_scripts_ = scripts[0]) ? void 0 : _scripts_.img) || null);\n const divContainerRef = useRef(null);\n const app = useMemo(()=>new Application(), []);\n const pointerSprite = useRef(null);\n const spinningPointerSprite = useRef(null);\n const [replayMark, setReplayMark] = useState(0);\n const triggerReplay = ()=>{\n setReplayMark(Date.now());\n };\n const windowContentContainer = useMemo(()=>{\n const container = new Container();\n return container;\n }, []);\n const insightMarkContainer = useMemo(()=>{\n const container = new Container();\n container.zIndex = LAYER_ORDER_INSIGHT;\n return container;\n }, []);\n const basicCameraState = {\n left: 0,\n top: 0,\n width: imageWidth,\n pointerLeft: Math.round(imageWidth / 2),\n pointerTop: Math.round(imageHeight / 2)\n };\n const [animationProgress, setAnimationProgress] = useState(-1);\n const cancelFlag = useRef(false);\n useEffect(()=>{\n cancelFlag.current = false;\n return ()=>{\n cancelFlag.current = true;\n };\n }, []);\n const cameraState = useRef(_object_spread({}, basicCameraState));\n const resizeCanvasIfNeeded = (newWidth, newHeight)=>_async_to_generator(function*() {\n if (app.screen.width !== newWidth || app.screen.height !== newHeight) {\n app.renderer.resize(newWidth, newHeight);\n if (divContainerRef.current) {\n const aspectRatio = newWidth / newHeight;\n divContainerRef.current.style.setProperty('--canvas-aspect-ratio', aspectRatio.toString());\n }\n const newBasicCameraState = {\n left: 0,\n top: 0,\n width: newWidth,\n pointerLeft: Math.round(newWidth / 2),\n pointerTop: Math.round(newHeight / 2)\n };\n cameraState.current = newBasicCameraState;\n }\n })();\n const repaintImage = (scriptWidth, scriptHeight)=>_async_to_generator(function*() {\n const imgToUpdate = currentImg.current;\n if (!imgToUpdate) return void console.warn('no image to update');\n const targetWidth = scriptWidth || imageWidth;\n const targetHeight = scriptHeight || imageHeight;\n yield resizeCanvasIfNeeded(targetWidth, targetHeight);\n if (!getTextureFromCache(imgToUpdate)) {\n console.warn('image not loaded', imgToUpdate);\n yield loadTexture(imgToUpdate);\n }\n const texture = getTextureFromCache(imgToUpdate);\n if (!texture) throw new Error('texture not found');\n const sprite = Sprite.from(texture);\n if (!sprite) throw new Error('sprite not found');\n const mainImgLabel = 'main-img';\n const child = windowContentContainer.getChildByLabel(mainImgLabel);\n if (child) windowContentContainer.removeChild(child);\n sprite.label = mainImgLabel;\n sprite.zIndex = LAYER_ORDER_IMG;\n sprite.width = targetWidth;\n sprite.height = targetHeight;\n windowContentContainer.addChild(sprite);\n })();\n const spinningPointer = (frame)=>{\n var _pointerSprite_current, _pointerSprite_current1;\n if (!spinningPointerSprite.current) {\n spinningPointerSprite.current = Sprite.from(mouseLoading);\n spinningPointerSprite.current.zIndex = LAYER_ORDER_SPINNING_POINTER;\n spinningPointerSprite.current.anchor.set(0.5, 0.5);\n spinningPointerSprite.current.scale.set(0.5);\n spinningPointerSprite.current.label = 'spinning-pointer';\n }\n spinningPointerSprite.current.x = (null == (_pointerSprite_current = pointerSprite.current) ? void 0 : _pointerSprite_current.x) || 0;\n spinningPointerSprite.current.y = (null == (_pointerSprite_current1 = pointerSprite.current) ? void 0 : _pointerSprite_current1.y) || 0;\n windowContentContainer.addChild(spinningPointerSprite.current);\n let startTime;\n let isCancelled = false;\n const animate = (currentTime)=>{\n if (isCancelled) return;\n if (!startTime) startTime = currentTime;\n const elapsedTime = currentTime - startTime;\n const progress = (Math.sin(elapsedTime / 500 - Math.PI / 2) + 1) / 2;\n const rotation = progress * Math.PI * 2;\n if (spinningPointerSprite.current) spinningPointerSprite.current.rotation = rotation;\n frame(animate);\n };\n frame(animate);\n const stopFn = ()=>{\n if (spinningPointerSprite.current) windowContentContainer.removeChild(spinningPointerSprite.current);\n isCancelled = true;\n };\n return stopFn;\n };\n const updatePointer = (img, x, y)=>_async_to_generator(function*() {\n var _pointerSprite_current, _pointerSprite_current1;\n if (!getTextureFromCache(img)) {\n console.warn('image not loaded', img);\n yield loadTexture(img);\n }\n const texture = getTextureFromCache(img);\n if (!texture) throw new Error('texture not found');\n const sprite = Sprite.from(texture);\n let targetX = null == (_pointerSprite_current = pointerSprite.current) ? void 0 : _pointerSprite_current.x;\n let targetY = null == (_pointerSprite_current1 = pointerSprite.current) ? void 0 : _pointerSprite_current1.y;\n if ('number' == typeof x) targetX = x;\n if ('number' == typeof y) targetY = y;\n if (void 0 === targetX || void 0 === targetY) return void console.warn('invalid pointer position', x, y);\n if (pointerSprite.current) {\n const pointer = windowContentContainer.getChildByLabel('pointer');\n if (pointer) windowContentContainer.removeChild(pointer);\n }\n pointerSprite.current = sprite;\n pointerSprite.current.x = targetX;\n pointerSprite.current.y = targetY;\n pointerSprite.current.label = 'pointer';\n pointerSprite.current.zIndex = LAYER_ORDER_POINTER;\n windowContentContainer.addChild(pointerSprite.current);\n })();\n const updateCamera = (state, currentWidth)=>{\n cameraState.current = state;\n const effectiveWidth = currentWidth || app.screen.width || imageWidth;\n const newScale = autoZoom ? Math.max(1, effectiveWidth / state.width) : 1;\n windowContentContainer.scale.set(newScale);\n windowContentContainer.x = autoZoom ? Math.round(canvasPaddingLeft - state.left * newScale) : canvasPaddingLeft;\n windowContentContainer.y = autoZoom ? Math.round(canvasPaddingTop - state.top * newScale) : canvasPaddingTop;\n const pointer = windowContentContainer.getChildByLabel('pointer');\n if (pointer) {\n pointer.scale.set(1 / newScale);\n if ('number' == typeof state.pointerLeft && 'number' == typeof state.pointerTop) {\n pointer.x = state.pointerLeft;\n pointer.y = state.pointerTop;\n }\n }\n };\n const cameraAnimation = (targetState, duration, frame)=>_async_to_generator(function*() {\n const currentCanvasWidth = app.screen.width || imageWidth;\n const currentCanvasHeight = app.screen.height || imageHeight;\n if (!autoZoom) {\n const currentState = _object_spread({}, cameraState.current);\n const startPointerLeft = currentState.pointerLeft;\n const startPointerTop = currentState.pointerTop;\n const startTime = performance.now();\n const shouldMovePointer = 'number' == typeof targetState.pointerLeft && 'number' == typeof targetState.pointerTop && (targetState.pointerLeft !== startPointerLeft || targetState.pointerTop !== startPointerTop);\n if (!shouldMovePointer) return;\n yield new Promise((resolve)=>{\n const animate = (currentTime)=>{\n const elapsedTime = currentTime - startTime;\n const rawProgress = Math.min(elapsedTime / duration, 1);\n const progress = cubicMouse(rawProgress);\n const nextState = _object_spread_props(_object_spread({}, currentState), {\n pointerLeft: startPointerLeft + (targetState.pointerLeft - startPointerLeft) * progress,\n pointerTop: startPointerTop + (targetState.pointerTop - startPointerTop) * progress\n });\n updateCamera(nextState, currentCanvasWidth);\n if (elapsedTime < duration) frame(animate);\n else resolve();\n };\n frame(animate);\n });\n return;\n }\n const currentState = _object_spread({}, cameraState.current);\n const startLeft = currentState.left;\n const startTop = currentState.top;\n const startPointerLeft = currentState.pointerLeft;\n const startPointerTop = currentState.pointerTop;\n const startScale = currentState.width / currentCanvasWidth;\n const startTime = performance.now();\n const shouldMovePointer = 'number' == typeof targetState.pointerLeft && 'number' == typeof targetState.pointerTop && (targetState.pointerLeft !== startPointerLeft || targetState.pointerTop !== startPointerTop);\n const pointerMoveDuration = shouldMovePointer ? 0.375 * duration : 0;\n const cameraMoveStart = pointerMoveDuration;\n const cameraMoveDuration = duration - pointerMoveDuration;\n yield new Promise((resolve)=>{\n const animate = (currentTime)=>{\n const nextState = _object_spread({}, cameraState.current);\n const elapsedTime = currentTime - startTime;\n if (shouldMovePointer) if (elapsedTime <= pointerMoveDuration) {\n const rawMouseProgress = Math.min(elapsedTime / pointerMoveDuration, 1);\n const mouseProgress = cubicMouse(rawMouseProgress);\n nextState.pointerLeft = startPointerLeft + (targetState.pointerLeft - startPointerLeft) * mouseProgress;\n nextState.pointerTop = startPointerTop + (targetState.pointerTop - startPointerTop) * mouseProgress;\n } else {\n nextState.pointerLeft = targetState.pointerLeft;\n nextState.pointerTop = targetState.pointerTop;\n }\n if (elapsedTime > cameraMoveStart) {\n const cameraElapsedTime = elapsedTime - cameraMoveStart;\n const rawCameraProgress = Math.min(cameraElapsedTime / cameraMoveDuration, 1);\n const cameraProgress = cubicImage(rawCameraProgress);\n const targetScale = targetState.width / currentCanvasWidth;\n const progressScale = startScale + (targetScale - startScale) * cameraProgress;\n const progressWidth = currentCanvasWidth * progressScale;\n const progressHeight = currentCanvasHeight * progressScale;\n nextState.width = progressWidth;\n const progressLeft = startLeft + (targetState.left - startLeft) * cameraProgress;\n const progressTop = startTop + (targetState.top - startTop) * cameraProgress;\n const horizontalExceed = progressLeft + progressWidth - currentCanvasWidth;\n const verticalExceed = progressTop + progressHeight - currentCanvasHeight;\n nextState.left = horizontalExceed > 0 ? progressLeft + horizontalExceed : progressLeft;\n nextState.top = verticalExceed > 0 ? progressTop + verticalExceed : progressTop;\n }\n updateCamera(nextState, currentCanvasWidth);\n if (elapsedTime < duration) frame(animate);\n else resolve();\n };\n frame(animate);\n });\n })();\n const fadeInGraphics = (graphics, duration, frame, targetAlpha = 1)=>new Promise((resolve)=>{\n const startTime = performance.now();\n const animate = (currentTime)=>{\n const elapsedTime = currentTime - startTime;\n const progress = Math.min(elapsedTime / duration, 1);\n graphics.alpha = 0 === targetAlpha ? 1 - linear(progress) : linear(progress);\n if (elapsedTime < duration) frame(animate);\n else resolve();\n };\n frame(animate);\n });\n const fadeOutItem = (graphics, duration, frame)=>_async_to_generator(function*() {\n return fadeInGraphics(graphics, duration, frame, 0);\n })();\n const insightElementsAnimation = (elements, highlightElements, searchArea, duration, frame)=>_async_to_generator(function*() {\n insightMarkContainer.removeChildren();\n const elementsToAdd = [\n ...elements\n ];\n const totalLength = elementsToAdd.length;\n let childrenCount = 0;\n yield new Promise((resolve)=>{\n const startTime = performance.now();\n const animate = (currentTime)=>{\n const elapsedTime = currentTime - startTime;\n const progress = cubicInsightElement(Math.min(elapsedTime / duration, 1));\n const elementsToAddNow = Math.floor(progress * totalLength);\n while(childrenCount < elementsToAddNow){\n const randomIndex = Math.floor(Math.random() * elementsToAdd.length);\n const element = elementsToAdd.splice(randomIndex, 1)[0];\n if (element) {\n const [insightMarkGraphic] = rectMarkForItem(element.rect, element.content, 'element');\n insightMarkGraphic.alpha = 0;\n insightMarkContainer.addChild(insightMarkGraphic);\n childrenCount++;\n fadeInGraphics(insightMarkGraphic, singleElementFadeInDuration, frame);\n }\n }\n if (elapsedTime < duration) frame(animate);\n else {\n while(elementsToAdd.length > 0){\n const randomIndex = Math.floor(Math.random() * elementsToAdd.length);\n const element = elementsToAdd.splice(randomIndex, 1)[0];\n const [insightMarkGraphic] = rectMarkForItem(element.rect, element.content, 'element');\n insightMarkGraphic.alpha = 1;\n insightMarkContainer.addChild(insightMarkGraphic);\n }\n if (searchArea) {\n const [searchAreaGraphic] = rectMarkForItem(searchArea, 'Search Area', 'searchArea');\n searchAreaGraphic.alpha = 1;\n insightMarkContainer.addChild(searchAreaGraphic);\n }\n highlightElements.map((element)=>{\n const [insightMarkGraphic] = rectMarkForItem(element.rect, element.content || '', 'highlight');\n insightMarkGraphic.alpha = 1;\n insightMarkContainer.addChild(insightMarkGraphic);\n });\n resolve();\n }\n };\n frame(animate);\n });\n })();\n const init = ()=>_async_to_generator(function*() {\n if (!divContainerRef.current || !scripts) return;\n yield app.init({\n width: imageWidth,\n height: imageHeight,\n background: 0xf4f4f4,\n autoDensity: true,\n antialias: true\n });\n if (!divContainerRef.current) return;\n divContainerRef.current.appendChild(app.canvas);\n windowContentContainer.x = 0;\n windowContentContainer.y = 0;\n app.stage.addChild(windowContentContainer);\n insightMarkContainer.x = 0;\n insightMarkContainer.y = 0;\n windowContentContainer.addChild(insightMarkContainer);\n })();\n const [isRecording, setIsRecording] = useState(false);\n const recorderSessionRef = useRef(null);\n const cancelAnimationRef = useRef(null);\n const handleExport = ()=>_async_to_generator(function*() {\n if (recorderSessionRef.current) return void console.warn('recorderSession exists');\n if (!app.canvas) return void console.warn('canvas is not initialized');\n if (cancelAnimationRef.current) {\n cancelAnimationRef.current();\n cancelAnimationRef.current = null;\n yield new Promise((resolve)=>setTimeout(resolve, 100));\n }\n recorderSessionRef.current = new RecordingSession(app.canvas);\n setIsRecording(true);\n triggerReplay();\n })();\n const play = ()=>{\n let cancelFn;\n Promise.resolve((()=>_async_to_generator(function*() {\n if (!app) throw new Error('app is not initialized');\n if (!scripts) throw new Error(\"scripts is required\");\n const { frame, cancel, timeout } = frameKit();\n cancelFn = cancel;\n cancelAnimationRef.current = cancel;\n const allImages = scripts.filter((item)=>!!item.img).map((item)=>item.img);\n yield Promise.all([\n ...allImages,\n mouseLoading,\n mousePointer\n ].map(loadTexture));\n insightMarkContainer.removeChildren();\n yield updatePointer(mousePointer, imageWidth / 2, imageHeight / 2);\n yield repaintImage();\n yield updateCamera(_object_spread({}, basicCameraState));\n const totalDuration = scripts.reduce((acc, item)=>acc + item.duration + (item.camera && item.insightCameraDuration ? item.insightCameraDuration : 0), 0);\n const progressUpdateInterval = 200;\n const startTime = performance.now();\n setAnimationProgress(0);\n const updateProgress = ()=>{\n const progress = Math.min((performance.now() - startTime) / totalDuration, 1);\n setAnimationProgress(progress);\n if (progress < 1) return timeout(updateProgress, progressUpdateInterval);\n };\n frame(updateProgress);\n if (recorderSessionRef.current) recorderSessionRef.current.start();\n for(const index in scripts){\n const item = scripts[index];\n setTitleText(item.title || '');\n setSubTitleText(item.subTitle || '');\n if ('sleep' === item.type) yield sleep(item.duration);\n else if ('insight' === item.type) {\n if (!item.img) throw new Error('img is required');\n currentImg.current = item.img;\n yield repaintImage(item.imageWidth, item.imageHeight);\n const highlightElements = item.highlightElement ? [\n item.highlightElement\n ] : [];\n yield insightElementsAnimation([], highlightElements, item.searchArea, item.duration, frame);\n if (item.camera) {\n if (!item.insightCameraDuration) throw new Error('insightCameraDuration is required');\n yield cameraAnimation(item.camera, item.insightCameraDuration, frame);\n }\n } else if ('clear-insight' === item.type) {\n yield fadeOutItem(insightMarkContainer, item.duration, frame);\n insightMarkContainer.removeChildren();\n insightMarkContainer.alpha = 1;\n } else if ('img' === item.type) {\n if (item.img && item.img !== currentImg.current) {\n currentImg.current = item.img;\n yield repaintImage(item.imageWidth, item.imageHeight);\n }\n if (item.camera) yield cameraAnimation(item.camera, item.duration, frame);\n else yield sleep(item.duration);\n } else if ('pointer' === item.type) {\n if (!item.img) throw new Error('pointer img is required');\n yield updatePointer(item.img);\n } else if ('spinning-pointer' === item.type) {\n const stop = spinningPointer(frame);\n yield sleep(item.duration);\n stop();\n }\n }\n if (recorderSessionRef.current) {\n yield sleep(1200);\n recorderSessionRef.current.stop();\n recorderSessionRef.current = null;\n setIsRecording(false);\n }\n })())().catch((e)=>{\n console.error('player error', e);\n if ((null == e ? void 0 : e.message) === ERROR_FRAME_CANCEL) return void console.log('Animation cancelled (expected behavior)');\n const wasRecording = !!recorderSessionRef.current;\n if (recorderSessionRef.current) {\n try {\n recorderSessionRef.current.stop();\n } catch (stopError) {\n console.error('Error stopping recorder:', stopError);\n }\n recorderSessionRef.current = null;\n }\n setIsRecording(false);\n if (wasRecording) message.error('Failed to export video. Please try again.');\n }));\n return ()=>{\n null == cancelFn || cancelFn();\n cancelAnimationRef.current = null;\n };\n };\n useEffect(()=>{\n Promise.resolve((()=>_async_to_generator(function*() {\n yield init();\n if (divContainerRef.current && imageWidth && imageHeight) {\n const aspectRatio = imageWidth / imageHeight;\n divContainerRef.current.style.setProperty('--canvas-aspect-ratio', aspectRatio.toString());\n divContainerRef.current.setAttribute('data-fit-mode', fitMode);\n const playerContainer = divContainerRef.current.closest('.player-container');\n if (playerContainer) playerContainer.setAttribute('data-fit-mode', fitMode);\n }\n triggerReplay();\n })())());\n return ()=>{\n try {\n app.destroy(true, {\n children: true,\n texture: true\n });\n } catch (e) {\n console.warn('destroy failed', e);\n }\n };\n }, [\n imageWidth,\n imageHeight,\n fitMode\n ]);\n useEffect(()=>{\n if (replayMark) return play();\n }, [\n replayMark\n ]);\n const [mouseOverStatusIcon, setMouseOverStatusIcon] = useState(false);\n const [mouseOverSettingsIcon, setMouseOverSettingsIcon] = useState(false);\n const progressString = Math.round(100 * animationProgress);\n const transitionStyle = 0 === animationProgress ? 'none' : '0.3s';\n const canReplayNow = 1 === animationProgress;\n useEffect(()=>{\n if (canReplayNow) {\n const listener = (event)=>{\n if (' ' === event.key) triggerReplay();\n };\n window.addEventListener('keydown', listener);\n return ()=>{\n window.removeEventListener('keydown', listener);\n };\n }\n }, [\n canReplayNow\n ]);\n let statusIconElement;\n let statusOnClick = ()=>{};\n if (animationProgress < 1) statusIconElement = /*#__PURE__*/ jsx(Spin, {\n indicator: /*#__PURE__*/ jsx(LoadingOutlined, {\n spin: true,\n color: \"#333\"\n }),\n size: \"default\"\n });\n else if (mouseOverStatusIcon) {\n statusIconElement = /*#__PURE__*/ jsx(Spin, {\n indicator: /*#__PURE__*/ jsx(CaretRightOutlined, {\n color: \"#333\"\n }),\n size: \"default\"\n });\n statusOnClick = ()=>triggerReplay();\n } else statusIconElement = /*#__PURE__*/ jsx(Spin, {\n indicator: /*#__PURE__*/ jsx(CaretRightOutlined, {\n color: \"#333\"\n }),\n size: \"default\"\n });\n return /*#__PURE__*/ jsxs(\"div\", {\n className: \"player-container\",\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"canvas-container\",\n ref: divContainerRef\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"player-timeline-wrapper\",\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"player-timeline\",\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"player-timeline-progress\",\n style: {\n width: `${progressString}%`,\n transition: transitionStyle\n }\n })\n })\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"player-tools-wrapper\",\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"player-tools\",\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"player-control\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"status-text\",\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"title\",\n children: titleText\n }),\n /*#__PURE__*/ jsx(Tooltip, {\n title: subTitleText,\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"subtitle\",\n children: subTitleText\n })\n })\n ]\n }),\n isRecording ? null : /*#__PURE__*/ jsx(\"div\", {\n className: \"status-icon\",\n onMouseEnter: ()=>setMouseOverStatusIcon(true),\n onMouseLeave: ()=>setMouseOverStatusIcon(false),\n onClick: statusOnClick,\n children: statusIconElement\n }),\n (null == props ? void 0 : props.reportFileContent) ? /*#__PURE__*/ jsx(Tooltip, {\n title: \"Download Report\",\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"status-icon\",\n onMouseEnter: ()=>setMouseOverStatusIcon(true),\n onMouseLeave: ()=>setMouseOverStatusIcon(false),\n onClick: ()=>downloadReport(props.reportFileContent),\n children: /*#__PURE__*/ jsx(DownloadOutlined, {\n color: \"#333\"\n })\n })\n }) : null,\n /*#__PURE__*/ jsx(Tooltip, {\n title: isRecording ? 'Generating...' : 'Export Video',\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"status-icon\",\n onClick: isRecording ? void 0 : handleExport,\n style: {\n opacity: isRecording ? 0.5 : 1,\n cursor: isRecording ? 'not-allowed' : 'pointer'\n },\n children: isRecording ? /*#__PURE__*/ jsx(Spin, {\n size: \"default\",\n percent: progressString\n }) : /*#__PURE__*/ jsx(ExportOutlined, {})\n })\n }),\n /*#__PURE__*/ jsx(Dropdown, {\n trigger: [\n 'hover',\n 'click'\n ],\n placement: \"bottomRight\",\n overlayStyle: {\n minWidth: '148px'\n },\n dropdownRender: (menu)=>/*#__PURE__*/ jsx(\"div\", {\n style: {\n borderRadius: '8px',\n border: '1px solid rgba(0, 0, 0, 0.08)',\n backgroundColor: '#fff',\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.08)',\n overflow: 'hidden'\n },\n children: menu\n }),\n menu: {\n style: {\n borderRadius: '8px',\n padding: 0\n },\n items: [\n {\n key: 'autoZoom',\n style: {\n height: '39px',\n margin: 0,\n padding: '0 12px'\n },\n label: /*#__PURE__*/ jsxs(\"div\", {\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n height: '39px'\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: '12px',\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)=>{\n setAutoZoom(checked);\n triggerReplay();\n },\n onClick: (_, e)=>{\n var _e_stopPropagation;\n return null == e ? void 0 : null == (_e_stopPropagation = e.stopPropagation) ? void 0 : _e_stopPropagation.call(e);\n }\n })\n ]\n })\n }\n ]\n },\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"status-icon\",\n onMouseEnter: ()=>setMouseOverSettingsIcon(true),\n onMouseLeave: ()=>setMouseOverSettingsIcon(false),\n style: {\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n opacity: mouseOverSettingsIcon ? 1 : 0.7,\n transition: 'opacity 0.2s'\n },\n children: /*#__PURE__*/ jsx(player_setting, {\n style: {\n width: '16px',\n height: '16px'\n }\n })\n })\n })\n ]\n })\n })\n })\n ]\n });\n}\nexport { Player };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { LoadingOutlined } from \"@ant-design/icons\";\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 })=>{\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 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 (replayScriptsInfo) resultDataToShow = /*#__PURE__*/ jsx(Player, {\n replayScripts: replayScriptsInfo.scripts,\n imageWidth: replayScriptsInfo.width,\n imageHeight: replayScriptsInfo.height,\n reportFileContent: ('In-Browser-Extension' === serviceMode || 'Server' === serviceMode) && (null == result ? void 0 : result.reportHTML) ? null == result ? void 0 : result.reportHTML : null,\n fitMode: fitMode,\n autoZoom: autoZoom\n }, replayCounter);\n else if (null == result ? void 0 : result.error) resultDataToShow = /*#__PURE__*/ jsx(\"pre\", {\n children: null == result ? void 0 : result.error\n });\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","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 abstract class AbstractInterface {\n abstract interfaceType: string;\n\n abstract screenshotBase64(): Promise<string>;\n abstract size(): Promise<Size>;\n abstract actionSpace(): DeviceAction[] | Promise<DeviceAction[]>;\n\n abstract cacheFeatureForRect?(\n rect: Rect,\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 // @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 // @deprecated do NOT extend this method\n abstract getContext?(): Promise<UIContext>;\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});\n// Override the inferred type to use LocateResultElement for the runtime locate field\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 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 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 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 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', 'append'])\n .default('replace')\n .optional()\n .describe(\n 'Input mode: \"replace\" (default) - clear the field and input the value; \"append\" - append the value to existing content; \"clear\" - clear the field without inputting new text.',\n ),\n});\nexport type ActionInputParam = {\n value: string;\n locate?: LocateResultElement;\n mode?: 'replace' | 'clear' | '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 call,\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 call,\n });\n};\n\n// Scroll\nexport const actionScrollParamSchema = z.object({\n direction: z\n .enum(['down', 'up', 'right', 'left'])\n .default('down')\n .describe('The direction to scroll'),\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 to the bottom, \"scrollToTop\" for scrolling to the top, \"scrollToRight\" for scrolling to the right, \"scrollToLeft\" for scrolling to the left',\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('The target element to be scrolled'),\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 an element. The direction to scroll, the scroll type, and the distance to scroll. The distance is the number of pixels to scroll. If not specified, use `down` direction, `once` scroll type, and `null` distance.',\n interfaceAlias: 'aiScroll',\n paramSchema: actionScrollParamSchema,\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: 'Drag and drop the element',\n interfaceAlias: 'aiDragAndDrop',\n paramSchema: actionDragAndDropParamSchema,\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 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 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 swipe gesture. You must specify either \"end\" (target location) or \"distance\" + \"direction\" - they are mutually exclusive. Use \"end\" for precise location-based swipes, or \"distance\" + \"direction\" for relative movement.',\n paramSchema: ActionSwipeParamSchema,\n call,\n });\n};\n\n// ClearInput\nexport const actionClearInputParamSchema = z.object({\n locate: getMidsceneLocationSchema().describe('The input field to be cleared'),\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 call,\n });\n};\n\n// Assert\nexport const actionAssertParamSchema = z.object({\n condition: z.string().describe('The condition of the assertion'),\n});\nexport type ActionAssertParam = {\n condition: string;\n};\n\nexport const defineActionAssert = (\n call: (param: ActionAssertParam) => Promise<void>,\n): DeviceAction<ActionAssertParam> => {\n return defineAction<typeof actionAssertParamSchema, ActionAssertParam>({\n name: 'Assert',\n description:\n 'If the user explicitly requires making an assertion (like \"there should be a button with text \"Yes\" in the popup\"), this tool will think about it, and then provide a solid result',\n interfaceAlias: 'aiAssert',\n paramSchema: actionAssertParamSchema,\n call,\n });\n};\n\nexport type { DeviceAction } from '../types';\nexport type {\n AndroidDeviceOpt,\n AndroidDeviceInputOpt,\n IOSDeviceOpt,\n IOSDeviceInputOpt,\n} from './device-options';\n","import { StaticPage, StaticPageAgent } from \"@midscene/web/static\";\nimport { isZodObjectSchema, unwrapZodType } from \"../types.mjs\";\nconst actionNameForType = (type)=>{\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 } from \"antd\";\nimport setting from \"../../icons/setting.mjs\";\nimport { useEnvConfig } from \"../../store/store.mjs\";\nimport { alwaysRefreshScreenInfoTip, autoDismissKeyboardTip, deepThinkTip, domIncludedTip, imeStrategyTip, keyboardDismissStrategyTip, screenshotIncludedTip, trackingTip } from \"../../utils/constants.mjs\";\nconst ConfigSelector = ({ 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 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 hasDeviceOptions = 'android' === deviceType || 'ios' === deviceType;\n if (!enableTracking && !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 (showDeepThinkOption) items.push({\n label: /*#__PURE__*/ jsx(Checkbox, {\n onChange: (e)=>{\n setDeepThink(e.target.checked);\n },\n checked: deepThink,\n children: deepThinkTip\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 ('android' === deviceType) {\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 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 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 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 ('ios' === deviceType) 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 { 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 showDeepThinkOption = useMemo(()=>{\n if ('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 hasConfigOptions = useMemo(()=>{\n const hasTracking = 'In-Browser-Extension' === serviceMode;\n const hasDeepThink = showDeepThinkOption;\n const hasDataExtraction = showDataExtractionOptions && !hideDomAndScreenshotOptions;\n const hasDeviceOptions = 'android' === deviceType || 'ios' === deviceType;\n return hasTracking || hasDeepThink || hasDataExtraction || hasDeviceOptions;\n }, [\n serviceMode,\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: 4,\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 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: 4,\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 { Button, Form, List, Tooltip, 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 { 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.id && 'string' == typeof sdk.id) return `agent-${sdk.id}`;\n return 'playground-default';\n}\nfunction ErrorMessage({ error }) {\n if (!error) return null;\n return /*#__PURE__*/ jsxs(Tooltip, {\n title: /*#__PURE__*/ jsx(\"span\", {\n style: {\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all'\n },\n children: error\n }),\n overlayStyle: {\n maxWidth: '100vw'\n },\n children: [\n \"Error: \",\n error.split('\\n')[0]\n ]\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);\n const { handleRun: executeAction, handleStop, canStop } = usePlaygroundExecution(playgroundSDK, effectiveStorage, actionSpace, loading, setLoading, infoList, setInfoList, replayCounter, setReplayCounter, verticalMode, currentRunningIdRef, interruptedFlagRef);\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 });\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 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)=>{\n var _item_result;\n return /*#__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(\"span\", {\n className: \"progress-description\",\n children: description\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__*/ jsxs(\"div\", {\n className: \"system-message-content\",\n children: [\n 'result' === item.type && (null == (_item_result = item.result) ? void 0 : _item_result.error) && /*#__PURE__*/ jsxs(\"div\", {\n className: \"error-message\",\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"divider\"\n }),\n /*#__PURE__*/ jsx(ErrorMessage, {\n error: item.result.error\n })\n ]\n }),\n 'result' === item.type ? /*#__PURE__*/ jsx(PlaygroundResultView, {\n result: item.result || null,\n loading: item.loading || false,\n serverValid: true,\n serviceMode: 'Server',\n replayScriptsInfo: item.replayScriptsInfo || null,\n replayCounter: item.replayCounter || 0,\n loadingProgressText: item.loadingProgressText || '',\n verticalMode: item.verticalMode || false,\n fitMode: \"width\"\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 })\n }, item.id);\n }\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: 'Server',\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 { PlaygroundSDK } from '@midscene/playground';\nimport {\n Logo,\n NavActions,\n UniversalPlayground,\n useEnvConfig,\n} from '@midscene/visualizer';\nimport { useEffect, useMemo } from 'react';\nimport './index.less';\n\ndeclare const __APP_VERSION__: string;\n\n/**\n * Playground panel component for Android Playground using Universal Playground\n * Replaces the left panel with form and results\n */\nexport default function PlaygroundPanel() {\n // Get config from the global state\n const { config } = useEnvConfig();\n\n // Initialize PlaygroundSDK for remote execution\n const playgroundSDK = useMemo(() => {\n return new PlaygroundSDK({\n type: 'remote-execution',\n });\n }, []);\n\n // Check server status on mount to initialize SDK ID\n useEffect(() => {\n const checkServer = async () => {\n try {\n const online = await playgroundSDK.checkStatus();\n console.log(\n '[DEBUG] Android playground server status:',\n online,\n 'ID:',\n playgroundSDK.id,\n );\n } catch (error) {\n console.error(\n 'Failed to check android playground server status:',\n error,\n );\n }\n };\n\n checkServer();\n }, [playgroundSDK]);\n\n // Override SDK config when configuration changes\n useEffect(() => {\n if (playgroundSDK.overrideConfig && config) {\n playgroundSDK.overrideConfig(config).catch((error) => {\n console.error('Failed to override SDK config:', error);\n });\n }\n }, [playgroundSDK, config]);\n\n return (\n <div className=\"playground-panel\">\n {/* Header with Logo and Config */}\n <div className=\"playground-panel-header\">\n <div className=\"header-row\">\n <Logo />\n <NavActions showTooltipWhenEmpty={false} showModelName={false} />\n </div>\n </div>\n\n {/* Main playground area */}\n <div className=\"playground-panel-playground\">\n <UniversalPlayground\n playgroundSDK={playgroundSDK}\n config={{\n showContextPreview: false,\n layout: 'vertical',\n showVersionInfo: true,\n enableScrollToBottom: true,\n serverMode: true,\n showEnvConfigReminder: true,\n deviceType: 'android',\n }}\n branding={{\n title: 'Android Playground',\n version: __APP_VERSION__,\n }}\n className=\"playground-container\"\n />\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nconst SvgLinked = props => <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" viewBox=\"0 0 16 16\" {...props}><path fill=\"#000\" fillOpacity={0.25} fillRule=\"evenodd\" d=\"M9.68 2c1.2-1.2 3.2-1.28 4.4-.08s1.12 3.2-.08 4.4l-2.16 2.16c-.24.24-.56.24-.8 0s-.24-.56 0-.8l2.16-2.16c.8-.8.8-2.08.08-2.8s-2-.72-2.8.08L8.32 4.96c-.24.24-.56.24-.8 0s-.24-.56 0-.8zM5.6 13.2l2.16-2.16c.24-.24.56-.24.8 0s.24.56 0 .8L6.4 14c-1.2 1.2-3.12 1.36-4.4.08-1.36-1.28-1.2-3.2.08-4.4l2.16-2.16c.24-.24.56-.24.8 0s.24.56 0 .8l-2.16 2.16c-.8.8-.88 2-.08 2.8s2 .72 2.8-.08m4.64-8.24c.24-.24.64-.24.96 0 .24.24.24.64 0 .96L5.92 11.2c-.24.24-.64.24-.96 0-.24-.24-.24-.64 0-.96z\" clipRule=\"evenodd\" /></svg>;\nexport default SvgLinked;","import * as React from \"react\";\nconst SvgScreenshot = props => <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" viewBox=\"0 0 16 16\" {...props}><g fill=\"#606266\" clipPath=\"url(#screenshot_svg__a)\"><path d=\"m4.883 2.663-.858 2.001h-2.69v8.673h13.341V4.664H11.32l-.859-2zm-1.738.667.858-2.001h7.338l.858 2.001h2.477a1.334 1.334 0 0 1 1.334 1.334v8.673a1.335 1.335 0 0 1-1.334 1.334H1.334A1.334 1.334 0 0 1 0 13.337V4.664A1.334 1.334 0 0 1 1.334 3.33z\" /><path d=\"M8.005 10.001a1.334 1.334 0 1 0 0-2.668 1.334 1.334 0 0 0 0 2.668m0 1.335a2.668 2.668 0 1 1 0-5.337 2.668 2.668 0 0 1 0 5.337m3.336-6.004h.667q.667 0 .667.667 0 .666-.667.667h-.667q-.667 0-.667-.667t.667-.667\" /></g><defs><clipPath id=\"screenshot_svg__a\"><path fill=\"#fff\" d=\"M0 0h16v16H0z\" /></clipPath></defs></svg>;\nexport default SvgScreenshot;","import * as React from \"react\";\nconst SvgUnlink = props => <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" viewBox=\"0 0 16 16\" {...props}><path fill=\"#FF4550\" d=\"M14.08 1.92C12.88.72 10.88.8 9.68 2L7.52 4.16c-.24.24-.24.56 0 .8s.56.24.8 0l2.16-2.16c.8-.8 2.08-.8 2.8-.08s.72 2-.08 2.8l-2.16 2.16c-.24.24-.24.56 0 .8s.56.24.8 0L14 6.32c1.2-1.2 1.28-3.2.08-4.4m-6.32 9.12L5.6 13.2c-.8.8-2 .88-2.8.08s-.72-2 .08-2.8l2.16-2.16c.24-.24.24-.56 0-.8s-.56-.24-.8 0L2.08 9.68C.8 10.88.64 12.8 2 14.08c1.28 1.28 3.2 1.12 4.4-.08l2.16-2.16c.24-.24.24-.56 0-.8s-.56-.24-.8 0M5.92 4.96c-.24-.24-.64-.24-.96 0-.24.24-.24.64 0 .96l5.28 5.28c.24.24.64.24.96 0 .24-.24.24-.64 0-.96z\" /></svg>;\nexport default SvgUnlink;","import { InfoCircleOutlined } from '@ant-design/icons';\nimport { useServerValid } from '@midscene/visualizer';\nimport { ScrcpyVideoCodecId } from '@yume-chan/scrcpy';\nimport { WebCodecsVideoDecoder } from '@yume-chan/scrcpy-decoder-webcodecs';\nimport {\n BitmapVideoFrameRenderer,\n WebGLVideoFrameRenderer,\n} from '@yume-chan/scrcpy-decoder-webcodecs';\nimport {\n Button,\n Card,\n Col,\n Divider,\n Row,\n Spin,\n Tooltip,\n Typography,\n message,\n} from 'antd';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport type { Socket } from 'socket.io-client';\nimport { io } from 'socket.io-client';\nimport LinkedIcon from '../../icons/linked.svg?react';\nimport ScreenshotIcon from '../../icons/screenshot.svg?react';\nimport UnlinkIcon from '../../icons/unlink.svg?react';\nimport './index.less';\n\nconst { Text } = Typography;\n\ninterface ScrcpyProps {\n serverUrl?: string;\n maxSize?: number;\n autoConnect?: boolean;\n autoReconnect?: boolean;\n reconnectInterval?: number;\n}\n\ninterface VideoMetadata {\n codec?: string;\n width?: number;\n height?: number;\n [key: string]: any;\n}\n\nexport interface ScrcpyRefMethods {\n disconnectDevice: () => void;\n}\n\nexport const ScrcpyPlayer = forwardRef<ScrcpyRefMethods, ScrcpyProps>(\n (\n {\n serverUrl,\n maxSize = 1024,\n autoConnect = true,\n autoReconnect = true,\n reconnectInterval = 5000,\n },\n ref,\n ) => {\n const [connecting, setConnecting] = useState(false);\n const [connected, setConnected] = useState(false);\n const [screenInfo, setScreenInfo] = useState<{\n width: number;\n height: number;\n } | null>(null);\n const [deviceId, setDeviceId] = useState<string>('');\n\n const socketRef = useRef<Socket | null>(null);\n const videoContainerRef = useRef<HTMLDivElement>(null);\n const videoElementRef = useRef<HTMLCanvasElement | null>(null);\n const decoderRef = useRef<any>(null);\n const reconnectTimerRef = useRef<NodeJS.Timeout | null>(null);\n const metadataTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const serverValid = useServerValid(true);\n // create a safe remove child nodes tool function\n const safeRemoveChildNodes = useCallback((parent: Element | null) => {\n if (!parent) return;\n\n try {\n // use a safer way to clear child nodes\n while (parent.firstChild) {\n try {\n parent.removeChild(parent.firstChild);\n } catch (e) {\n console.warn('Failed to remove child, skipping:', e);\n // if remove failed, set it to null to avoid trying to remove again\n if (parent.firstChild) {\n parent.innerHTML = '';\n break;\n }\n }\n }\n } catch (e) {\n console.error('Error clearing container:', e);\n // last resort - directly reset HTML\n try {\n parent.innerHTML = '';\n } catch (innerErr) {\n console.error('Failed to reset innerHTML:', innerErr);\n }\n }\n }, []);\n\n // update canvas size to fit container\n const updateCanvasSize = useCallback(() => {\n if (!videoElementRef.current || !videoContainerRef.current || !screenInfo)\n return;\n\n const container = videoContainerRef.current;\n const canvas = videoElementRef.current;\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n const { width: originalWidth, height: originalHeight } = screenInfo;\n\n // leave 20px padding on top and bottom\n const paddingVertical = 40; // padding on top and bottom, each 20px\n const availableHeight = containerHeight - paddingVertical;\n\n // calculate the size fit to container, keep the aspect ratio\n const aspectRatio = originalWidth / originalHeight;\n let targetWidth = containerWidth;\n let targetHeight = containerWidth / aspectRatio;\n\n if (targetHeight > availableHeight) {\n targetHeight = availableHeight;\n targetWidth = availableHeight * aspectRatio;\n }\n\n // update canvas properties and styles\n canvas.width = originalWidth;\n canvas.height = originalHeight;\n canvas.style.width = `${targetWidth}px`;\n canvas.style.height = `${targetHeight}px`;\n canvas.style.marginTop = '20px';\n canvas.style.marginBottom = '20px';\n }, [screenInfo]);\n\n // listen window size change\n useEffect(() => {\n const handleResize = () => {\n updateCanvasSize();\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [updateCanvasSize]);\n\n // when screenInfo updates, adjust the size\n useEffect(() => {\n updateCanvasSize();\n }, [screenInfo, updateCanvasSize]);\n\n // create and initialize renderer\n const createVideoFrameRenderer = async () => {\n // use WebGL renderer first, if not supported, fallback to Bitmap renderer\n if (WebGLVideoFrameRenderer.isSupported) {\n const renderer = new WebGLVideoFrameRenderer();\n return {\n renderer,\n element: renderer.canvas as HTMLCanvasElement,\n };\n }\n\n const renderer = new BitmapVideoFrameRenderer();\n return {\n renderer,\n element: renderer.canvas as HTMLCanvasElement,\n };\n };\n\n // create and initialize decoder\n const createDecoder = async (codecId: ScrcpyVideoCodecId) => {\n // check if WebCodecs API is supported\n if (!WebCodecsVideoDecoder.isSupported) {\n throw new Error(\n 'Current browser does not support WebCodecs API, please use the latest version of Chrome/Edge browser',\n );\n }\n\n // create renderer\n const { renderer, element } = await createVideoFrameRenderer();\n videoElementRef.current = element;\n\n // add video element to page\n if (videoContainerRef.current) {\n const canvasWrapper =\n videoContainerRef.current.querySelector('.canvas-wrapper');\n if (canvasWrapper) {\n // safely clear container\n safeRemoveChildNodes(canvasWrapper);\n canvasWrapper.appendChild(videoElementRef.current);\n }\n }\n\n // create decoder\n return new WebCodecsVideoDecoder({\n codec: codecId,\n renderer: renderer,\n });\n };\n\n // setup video stream processing\n const setupVideoStream = (_metadata: VideoMetadata) => {\n // for tracking if the configuration frame has been received\n let configurationPacketSent = false;\n let pendingDataPackets: any[] = [];\n\n // create transform stream to convert data to Uint8Array\n const transformStream = new TransformStream({\n transform(chunk: any, controller: any) {\n // convert array to Uint8Array\n const packet = {\n type: chunk.type,\n data: new Uint8Array(chunk.data),\n timestamp: chunk.timestamp,\n };\n\n // for configuration frame, we should handle it first\n if (packet.type === 'configuration') {\n controller.enqueue(packet);\n configurationPacketSent = true;\n\n // after sending the configuration frame, send all pending data frames\n if (pendingDataPackets.length > 0) {\n pendingDataPackets.forEach((p) => controller.enqueue(p));\n pendingDataPackets = [];\n }\n } else if (packet.type === 'data') {\n // if the configuration frame has not been received, cache the data frame\n if (!configurationPacketSent) {\n pendingDataPackets.push(packet);\n } else {\n controller.enqueue(packet);\n }\n } else {\n // other types of frames are passed directly\n controller.enqueue(packet);\n }\n },\n });\n\n // create a readable stream to receive video data from the server\n const videoStream = new ReadableStream({\n start(controller) {\n // for tracking if the stream has been closed\n let streamClosed = false;\n\n // receive video data\n const videoDataHandler = (data: any) => {\n // check if the stream has been closed\n if (streamClosed) return;\n\n try {\n controller.enqueue(data);\n } catch (error) {\n console.error(\n 'error occurred while enqueuing video data:',\n error,\n );\n // if an error occurs, mark the stream as closed and clean up\n streamClosed = true;\n cleanupHandlers();\n }\n };\n\n // handle error\n const errorHandler = (error: any) => {\n console.error('stream error:', error);\n if (!streamClosed) {\n controller.error(new Error(error.message));\n streamClosed = true;\n cleanupHandlers();\n }\n };\n\n // handle disconnection\n const disconnectHandler = () => {\n if (!streamClosed) {\n controller.close();\n streamClosed = true;\n cleanupHandlers();\n }\n };\n\n // clean up all event handlers\n const cleanupHandlers = () => {\n if (socketRef.current) {\n socketRef.current.off('video-data', videoDataHandler);\n socketRef.current.off('error', errorHandler);\n socketRef.current.off('disconnect', disconnectHandler);\n }\n };\n\n // register event handlers\n if (socketRef.current) {\n socketRef.current.on('video-data', videoDataHandler);\n socketRef.current.on('error', errorHandler);\n socketRef.current.on('disconnect', disconnectHandler);\n }\n\n // clean up when the stream is cancelled\n return () => {\n streamClosed = true;\n cleanupHandlers();\n };\n },\n });\n\n // handle video stream\n return videoStream.pipeThrough(transformStream);\n };\n\n // screenshot feature\n const takeScreenshot = async () => {\n if (!decoderRef.current) return;\n\n try {\n const blob = await decoderRef.current.snapshot();\n if (blob) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `screenshot_${new Date().toISOString().replace(/:/g, '-')}.png`;\n a.click();\n URL.revokeObjectURL(url);\n }\n } catch (error) {\n console.error('screenshot failed:', error);\n alert('screenshot failed');\n }\n };\n\n // disconnect device\n const disconnectDevice = useCallback(() => {\n // dispose decoder resources\n if (decoderRef.current) {\n try {\n decoderRef.current.dispose();\n decoderRef.current = null;\n } catch (error) {\n console.error('Error disposing decoder:', error);\n }\n }\n\n // clear video container\n if (videoContainerRef.current) {\n const canvasWrapper =\n videoContainerRef.current.querySelector('.canvas-wrapper');\n safeRemoveChildNodes(canvasWrapper);\n }\n\n // disconnect socket\n if (socketRef.current) {\n socketRef.current.disconnect();\n socketRef.current = null;\n }\n\n // clean up timers\n if (reconnectTimerRef.current) {\n clearTimeout(reconnectTimerRef.current);\n reconnectTimerRef.current = null;\n }\n\n if (metadataTimeoutRef.current) {\n clearTimeout(metadataTimeoutRef.current);\n metadataTimeoutRef.current = null;\n }\n\n // reset status\n setConnected(false);\n setConnecting(false);\n setScreenInfo(null);\n }, [safeRemoveChildNodes]);\n\n // Expose methods to parent component\n useImperativeHandle(\n ref,\n () => ({\n disconnectDevice,\n }),\n [disconnectDevice],\n );\n\n // connect device\n const connectDevice = useCallback(async () => {\n try {\n // always clean up previous resources, ensure clean state\n disconnectDevice();\n\n // ensure status reset\n setConnected(false);\n setConnecting(true);\n setScreenInfo(null);\n\n // short delay to ensure resources are cleaned\n await new Promise((resolve) => setTimeout(resolve, 150));\n\n // ensure the component is still mounted and has a valid server URL\n if (!serverUrl) {\n console.error('Cannot connect: missing server URL');\n setConnecting(false);\n return;\n }\n\n // setup metadata timeout check\n const setupMetadataTimeout = () => {\n // clear previous timeout\n if (metadataTimeoutRef.current) {\n clearTimeout(metadataTimeoutRef.current);\n metadataTimeoutRef.current = null;\n }\n\n // setup new timeout check\n metadataTimeoutRef.current = setTimeout(() => {\n if (socketRef.current?.connected) {\n try {\n socketRef.current.emit('connect-device', {\n maxSize,\n });\n\n // setup metadata timeout check again\n setupMetadataTimeout();\n } catch (err) {\n console.error('Failed to request connection:', err);\n message.error(\n 'connection request failed, please refresh the page',\n );\n }\n } else {\n try {\n if (socketRef.current) {\n setTimeout(() => {\n // reconnect after a short delay\n if (socketRef.current) {\n socketRef.current.connect();\n }\n }, 500);\n }\n } catch (err) {\n console.error('Failed to reconnect:', err);\n message.error('reconnection failed, please refresh the page');\n }\n }\n }, 5000);\n };\n\n // connect to server\n if (!socketRef.current) {\n try {\n socketRef.current = io(serverUrl, {\n withCredentials: true,\n reconnection: true,\n reconnectionAttempts: 5,\n reconnectionDelay: 1000,\n timeout: 10000,\n });\n\n // notify parent component after connection is successful\n socketRef.current.on('connect', () => {\n // get device id from socket\n if (socketRef.current?.id) {\n setDeviceId(socketRef.current.id);\n }\n\n if (reconnectTimerRef.current) {\n clearTimeout(reconnectTimerRef.current);\n reconnectTimerRef.current = null;\n }\n\n socketRef.current?.emit('connect-device', {\n maxSize,\n });\n\n // setup metadata timeout check\n setupMetadataTimeout();\n });\n\n // handle video metadata\n socketRef.current.on(\n 'video-metadata',\n async (metadata: VideoMetadata) => {\n try {\n // clear metadata timeout\n if (metadataTimeoutRef.current) {\n clearTimeout(metadataTimeoutRef.current);\n metadataTimeoutRef.current = null;\n }\n\n // if there is already a decoder, clean it first\n if (decoderRef.current) {\n try {\n decoderRef.current.dispose();\n decoderRef.current = null;\n } catch (error) {\n console.error('Error disposing old decoder:', error);\n }\n }\n\n // clean video container\n if (videoContainerRef.current) {\n const canvasWrapper =\n videoContainerRef.current.querySelector(\n '.canvas-wrapper',\n );\n safeRemoveChildNodes(canvasWrapper);\n }\n\n // ensure the metadata object exists, and set the default codec\n // convert string to ScrcpyVideoCodecId enum\n const codecId = metadata?.codec\n ? (metadata.codec as unknown as ScrcpyVideoCodecId)\n : ScrcpyVideoCodecId.H264;\n\n // create decoder\n decoderRef.current = await createDecoder(codecId);\n\n // ensure the decoder is created successfully\n if (!decoderRef.current) {\n throw new Error('Failed to create decoder');\n }\n\n // listen to size change event\n decoderRef.current.sizeChanged(\n ({ width, height }: { width: number; height: number }) => {\n setScreenInfo({ width, height });\n },\n );\n\n // setup video stream processing\n const videoStream = setupVideoStream(metadata);\n\n // pass the video stream to the decoder\n videoStream\n .pipeTo(decoderRef.current.writable)\n .catch((error: Error) => {\n console.error('video stream processing error:', error);\n });\n\n // update UI status\n setConnected(true);\n setConnecting(false);\n // video metadata received successfully, device connected\n } catch (error: any) {\n console.error('Failed to initialize decoder:', error);\n setConnecting(false);\n }\n },\n );\n\n // handle error\n socketRef.current.on('error', (error: Error) => {\n console.error('server error:', error);\n message.error('server error');\n setConnecting(false);\n\n // clear metadata timeout\n if (metadataTimeoutRef.current) {\n clearTimeout(metadataTimeoutRef.current);\n metadataTimeoutRef.current = null;\n }\n });\n\n // handle disconnection event\n socketRef.current.on('disconnect', () => {\n setConnected(false);\n\n // clear metadata timeout\n if (metadataTimeoutRef.current) {\n clearTimeout(metadataTimeoutRef.current);\n metadataTimeoutRef.current = null;\n }\n\n // clean up video container\n if (decoderRef.current) {\n decoderRef.current.dispose();\n decoderRef.current = null;\n }\n\n if (videoContainerRef.current) {\n // safely clear container\n safeRemoveChildNodes(\n videoContainerRef.current.querySelector('.canvas-wrapper'),\n );\n }\n\n if (autoReconnect && !reconnectTimerRef.current) {\n reconnectTimerRef.current = setTimeout(() => {\n reconnectTimerRef.current = null;\n connectDevice();\n }, reconnectInterval);\n }\n });\n } catch (error: any) {\n console.error('Failed to create socket connection:', error);\n setConnecting(false);\n\n if (autoReconnect && !reconnectTimerRef.current) {\n reconnectTimerRef.current = setTimeout(() => {\n reconnectTimerRef.current = null;\n connectDevice();\n }, reconnectInterval);\n }\n }\n } else {\n if (!socketRef.current.connected) {\n socketRef.current.connect();\n } else {\n socketRef.current.emit('connect-device', {\n maxSize,\n });\n\n // setup metadata timeout check\n setupMetadataTimeout();\n }\n }\n } catch (error: any) {\n setConnecting(false);\n console.error(`Failed to connect: ${error.message}`);\n message.error('connection failed');\n\n if (autoReconnect && !reconnectTimerRef.current) {\n reconnectTimerRef.current = setTimeout(() => {\n reconnectTimerRef.current = null;\n connectDevice();\n }, reconnectInterval);\n }\n }\n }, [\n serverUrl,\n maxSize,\n autoReconnect,\n reconnectInterval,\n disconnectDevice,\n ]);\n\n // detect autoConnect change, connect device when autoConnect is true\n useEffect(() => {\n if (autoConnect && !connected && !connecting) {\n // only trigger connection when not connected and not connecting\n const timer = setTimeout(() => {\n connectDevice();\n }, 300);\n\n return () => clearTimeout(timer);\n }\n }, [autoConnect, connected, connecting, connectDevice]);\n\n // resource cleanup useEffect\n useEffect(() => {\n // return cleanup function, called when component unmounts\n return () => {\n // dispose decoder\n if (decoderRef.current) {\n try {\n decoderRef.current.dispose();\n decoderRef.current = null;\n } catch (error) {\n console.error('Error disposing decoder during unmount:', error);\n }\n }\n\n // clean video container\n if (videoContainerRef.current) {\n try {\n const canvasWrapper =\n videoContainerRef.current.querySelector('.canvas-wrapper');\n if (canvasWrapper) {\n // safely clear content instead of removing node\n canvasWrapper.innerHTML = '';\n }\n } catch (error) {\n console.error(\n 'Error clearing canvas wrapper during unmount:',\n error,\n );\n }\n }\n\n // disconnect socket connection\n if (socketRef.current) {\n socketRef.current.disconnect();\n socketRef.current = null;\n }\n\n // clean up all timers\n if (reconnectTimerRef.current) {\n clearTimeout(reconnectTimerRef.current);\n reconnectTimerRef.current = null;\n }\n\n if (metadataTimeoutRef.current) {\n clearTimeout(metadataTimeoutRef.current);\n metadataTimeoutRef.current = null;\n }\n };\n }, []);\n\n return (\n <div className=\"scrcpy-container\">\n <Card>\n {connected && (\n <div className=\"header-bar\">\n <div className=\"header-left\">\n <Text style={{ fontWeight: 600, fontSize: 12 }}>\n Screen Projection\n </Text>\n <Tooltip\n placement=\"bottom\"\n title={`Device ID: ${deviceId || 'Unknown'}`}\n >\n <InfoCircleOutlined />\n </Tooltip>\n </div>\n <div className=\"screen-info\">\n <Text type=\"secondary\">\n size : {screenInfo?.width}×{screenInfo?.height}\n </Text>\n </div>\n <div className=\"header-right\">\n <Tooltip placement=\"bottom\" title=\"Screenshot\">\n <Button icon={<ScreenshotIcon />} onClick={takeScreenshot} />\n </Tooltip>\n <Divider\n type=\"vertical\"\n style={{\n margin: '0 16px',\n }}\n />\n <Tooltip placement=\"bottom\" title=\"Connect Device\">\n <Button\n disabled={connected}\n style={{\n backgroundColor: '#fff',\n }}\n icon={<LinkedIcon />}\n onClick={connectDevice}\n />\n </Tooltip>\n {connected && (\n <>\n <Divider\n type=\"vertical\"\n style={{\n margin: '0 16px',\n }}\n />\n <Tooltip title=\"Disconnect Device\">\n <Button\n icon={<UnlinkIcon />}\n onClick={disconnectDevice}\n />\n </Tooltip>\n </>\n )}\n </div>\n </div>\n )}\n <Row gutter={[16, 16]}>\n <Col span={24}>\n <div className=\"video-section\">\n <div ref={videoContainerRef} className=\"video-container\">\n <div className=\"canvas-wrapper\" />\n {!connected && serverValid && (\n <div className=\"empty-state\">\n <div className=\"empty-state-icon\">📱</div>\n <div className=\"empty-state-text\">\n {connecting\n ? 'Connecting to device...'\n : 'No device connected'}\n </div>\n {!connecting && (\n <Button\n type=\"primary\"\n onClick={() => {\n connectDevice();\n }}\n >\n Connect now\n </Button>\n )}\n {connecting && (\n <div className=\"loading-spinner\">\n <Spin size=\"large\" />\n </div>\n )}\n </div>\n )}\n {!serverValid && (\n <span>Please launch playground server!</span>\n )}\n </div>\n </div>\n </Col>\n </Row>\n </Card>\n </div>\n );\n },\n);\n\nexport default ScrcpyPlayer;\n","import './App.less';\nimport {\n PLAYGROUND_SERVER_PORT,\n SCRCPY_SERVER_PORT,\n} from '@midscene/shared/constants';\nimport {\n ScreenshotViewer,\n globalThemeConfig,\n safeOverrideAIConfig,\n useEnvConfig,\n} from '@midscene/visualizer';\nimport { ConfigProvider, Layout, message } from 'antd';\nimport { useEffect, useRef, useState } from 'react';\nimport { Panel, PanelGroup, PanelResizeHandle } from 'react-resizable-panels';\nimport { type Socket, io } from 'socket.io-client';\nimport AdbDevice from './components/adb-device';\nimport PlaygroundPanel from './components/playground-panel';\nimport ScrcpyPlayer, {\n type ScrcpyRefMethods,\n} from './components/scrcpy-player';\n\nconst { Content } = Layout;\n\n// Helper function to detect if device is remote (IP:Port format)\nconst isRemoteDevice = (deviceId: string | null): boolean => {\n if (!deviceId) return false;\n // Remote device format: IP:Port (e.g., 192.168.1.10:5555)\n return /^\\d+\\.\\d+\\.\\d+\\.\\d+:\\d+$/.test(deviceId);\n};\n\nexport default function App() {\n // Device and connection state - now simplified since device is pre-selected\n const [selectedDeviceId, setSelectedDeviceId] = useState<string | null>(null);\n const [connectToDevice, setConnectToDevice] = useState(false);\n const [messageApi, contextHolder] = message.useMessage();\n const [serverUrl, setServerUrl] = useState(\n `http://localhost:${SCRCPY_SERVER_PORT}`,\n );\n const [isNarrowScreen, setIsNarrowScreen] = useState(false);\n const [usePollingMode, setUsePollingMode] = useState(false);\n\n // Configuration state\n const { config } = useEnvConfig();\n\n // Override AI configuration when config changes\n useEffect(() => {\n safeOverrideAIConfig(config);\n }, [config]);\n\n // Get scrcpy port from injected window variable\n useEffect(() => {\n const scrcpyPort = (window as any).SCRCPY_PORT;\n if (scrcpyPort) {\n setServerUrl(`http://localhost:${scrcpyPort}`);\n }\n }, []);\n\n // Socket connection and device management\n const socketRef = useRef<Socket | null>(null);\n const scrcpyPlayerRef = useRef<ScrcpyRefMethods>(null);\n\n // connect to device server - simplified since device is pre-selected\n useEffect(() => {\n if (!serverUrl) return;\n\n const socket = io(serverUrl, {\n withCredentials: true,\n reconnectionAttempts: 5,\n reconnectionDelay: 1000,\n timeout: 5000,\n });\n\n socket.on('connect', () => {\n socket.emit('get-devices');\n });\n\n socket.on(\n 'devices-list',\n (data: {\n devices: { id: string; name: string; status: string }[];\n currentDeviceId: string | null;\n }) => {\n if (data.currentDeviceId) {\n setSelectedDeviceId(data.currentDeviceId);\n // Auto-connect since device is already selected\n setConnectToDevice(true);\n }\n },\n );\n\n socket.on('connect_error', (error: Error) => {\n console.error('Socket.IO connection error:', error);\n messageApi.error(\n 'Waiting for device server connection, please try again later',\n );\n });\n\n socket.on('error', (error: Error) => {\n console.error('Socket.IO error:', error);\n messageApi.error(\n `Error occurred while communicating with the server: ${error.message || 'Unknown error'}`,\n );\n });\n\n socketRef.current = socket;\n\n return () => {\n socket.disconnect();\n };\n }, [messageApi, serverUrl]);\n\n // reset the connection flag\n useEffect(() => {\n if (connectToDevice) {\n // reset the connection flag after a delay\n const timer = setTimeout(() => {\n setConnectToDevice(false);\n }, 800);\n\n return () => clearTimeout(timer);\n }\n }, [connectToDevice]);\n\n // Handle window resize to detect narrow screens\n useEffect(() => {\n const handleResize = () => {\n setIsNarrowScreen(window.innerWidth <= 1024);\n };\n\n // Set initial value\n handleResize();\n\n // Add event listener\n window.addEventListener('resize', handleResize);\n\n // Cleanup\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n // Detect if device is remote and switch to polling mode\n useEffect(() => {\n setUsePollingMode(isRemoteDevice(selectedDeviceId));\n }, [selectedDeviceId]);\n\n return (\n <ConfigProvider theme={globalThemeConfig()}>\n {contextHolder}\n <Layout className=\"app-container playground-container vertical-mode\">\n <Content className=\"app-content\">\n <PanelGroup\n autoSaveId=\"android-playground-layout\"\n direction={isNarrowScreen ? 'vertical' : 'horizontal'}\n >\n {/* left panel: PlaygroundPanel with Universal Playground */}\n <Panel\n defaultSize={isNarrowScreen ? 67 : 32}\n maxSize={isNarrowScreen ? 85 : 60}\n minSize={isNarrowScreen ? 67 : 25}\n className=\"app-panel left-panel\"\n >\n <div className=\"panel-content left-panel-content\">\n <PlaygroundPanel />\n </div>\n </Panel>\n\n <PanelResizeHandle\n className={`panel-resize-handle ${isNarrowScreen ? 'vertical' : 'horizontal'}`}\n />\n\n {/* right panel: ScrcpyPlayer */}\n <Panel className=\"app-panel right-panel\">\n <div className=\"panel-content right-panel-content\">\n <AdbDevice\n selectedDeviceId={selectedDeviceId}\n scrcpyPlayerRef={scrcpyPlayerRef}\n />\n {!usePollingMode ? (\n <ScrcpyPlayer\n ref={scrcpyPlayerRef}\n serverUrl={serverUrl}\n autoConnect={connectToDevice}\n />\n ) : (\n <ScreenshotViewer\n getScreenshot={() =>\n fetch(\n `http://localhost:${PLAYGROUND_SERVER_PORT}/screenshot`,\n ).then((r) => r.json())\n }\n getInterfaceInfo={() =>\n fetch(\n `http://localhost:${PLAYGROUND_SERVER_PORT}/interface-info`,\n ).then((r) => r.json())\n }\n serverOnline={true}\n isUserOperating={false}\n />\n )}\n </div>\n </Panel>\n </PanelGroup>\n </Content>\n </Layout>\n </ConfigProvider>\n );\n}\n","import ReactDOM from 'react-dom/client';\nimport App from './App';\n\nconst rootEl = document.getElementById('root');\nif (rootEl) {\n const root = ReactDOM.createRoot(rootEl);\n root.render(<App />);\n}\n","import { overrideAIConfig } from \"@midscene/shared/env\";\nimport { message } from \"antd\";\nfunction safeOverrideAIConfig(newConfig, extendMode = false, showErrorMessage = true) {\n try {\n overrideAIConfig(newConfig, extendMode);\n return true;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error('Failed to override AI config:', err);\n if (showErrorMessage) message.error(`Failed to apply AI configuration: ${err.message}`);\n return false;\n }\n}\nfunction useSafeOverrideAIConfig() {\n const applyConfig = (newConfig, extendMode = false, showErrorMessage = true)=>safeOverrideAIConfig(newConfig, extendMode, showErrorMessage);\n return {\n applyConfig\n };\n}\nexport { safeOverrideAIConfig, useSafeOverrideAIConfig };\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\": \"35f1e68e\",\"199\": \"ea3634f6\",\"221\": \"3f81253d\",\"271\": \"aad1ebb5\",\"35\": \"c1ca8ab2\",\"376\": \"b7913581\",\"467\": \"887e5efa\",\"652\": \"26c99dbf\",\"856\": \"20036e0a\",\"860\": \"9fc10f4b\",\"990\": \"65e3a3ab\",}[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__.nmd = (module) => {\n module.paths = [];\n if (!module.children) module.children = [];\n return module;\n};","__webpack_require__.p = \"/\";"],"names":["Promise","e","Error","UITarsModelVersion","_process_versions","__webpack_require__","exports","definition","key","Object","obj","prop","Symbol","external_zustand_namespaceObject","create","store_create","AUTO_ZOOM_KEY","BACKGROUND_VISIBLE_KEY","ELEMENTS_VISIBLE_KEY","getQueryPreference","paramName","window","value","searchParams","URLSearchParams","normalized","useBlackboardPreference","set","savedAutoZoom","localStorage","savedBackgroundVisible","savedElementsVisible","autoZoomFromQuery","elementsVisibleFromQuery","visible","enabled","CONFIG_KEY","SERVICE_MODE_KEY","TRACKING_ACTIVE_TAB_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","lines","config","line","trimmed","match","cleanLine","parsedValue","useEnvConfig","get","ifInExtension","savedServiceMode","savedForceSameTabNavigation","savedDeepThink","savedScreenshotIncluded","savedDomIncluded","serviceMode","latestConfigString","forceSameTabNavigation","deepThink","screenshotIncluded","domIncluded","tab","imeStrategy","autoDismissKeyboard","keyboardDismissStrategy","alwaysRefreshScreenInfo","MIDSCENE_MODEL_INIT_CONFIG_JSON","MIDSCENE_MODEL_NAME","MIDSCENE_DEBUG_MODEL_PROFILE","MIDSCENE_DEBUG_MODEL_RESPONSE","MIDSCENE_MODEL_SOCKS_PROXY","MIDSCENE_MODEL_HTTP_PROXY","MIDSCENE_MODEL_API_KEY","MIDSCENE_MODEL_BASE_URL","MIDSCENE_MODEL_TIMEOUT","OPENAI_API_KEY","OPENAI_BASE_URL","MIDSCENE_OPENAI_INIT_CONFIG_JSON","MIDSCENE_OPENAI_HTTP_PROXY","MIDSCENE_OPENAI_SOCKS_PROXY","MIDSCENE_USE_VLM_UI_TARS","MIDSCENE_USE_QWEN_VL","MIDSCENE_USE_QWEN3_VL","MIDSCENE_USE_DOUBAO_VISION","MIDSCENE_USE_GEMINI","MATCH_BY_POSITION","MIDSCENE_RUN_DIR","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_TIMEOUT","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_TIMEOUT","MIDSCENE_MODEL_FAMILY","BASIC_ENV_KEYS","BOOLEAN_ENV_KEYS","NUMBER_ENV_KEYS","STRING_ENV_KEYS","GLOBAL_ENV_KEYS","MODEL_ENV_KEYS","ALL_ENV_KEYS","MODEL_FAMILY_VALUES","types_UITarsModelVersion","getBasicEnvValue","process","ifInNode","defaultRunDirName","topicPrefix","logStreams","Map","debugInstances","getDebug","topic","fullTopic","debugFn","debug","args","writeLogToFile","message","stream","getLogStream","topicFileName","logFile","node_path","getMidsceneRunSubDir","subdir","basePath","getMidsceneRunBaseDir","existsSync","mkdirSync","error","tmpdir","logPath","node_fs","now","Date","isoDate","isoTime","milliseconds","timezoneOffsetMinutes","hours","Math","minutes","timezoneString","localISOTime","node_util","initDebugConfig","shouldPrintTiming","debugConfig","console","_define_property","maskKey","maskChar","prefixLen","prefix","suffix","maskLength","mask","maskConfig","valueStr","JSON","KEYS_MAP","decideModelConfigFromIntentConfig","intent","configMap","debugLog","keysForFn","finalResult","parseOpenaiSdkConfig","keys","provider","useLegacyLogic","legacyAPIKey","legacyBaseURL","legacySocksProxy","legacyHttpProxy","legacyOpenaiExtraConfig","legacyModelFamily","legacyConfigToModelFamily","isDoubao","isQwen","isQwen3","isUiTars","isGemini","enabledModes","Boolean","modelFamilyRaw","openaiApiKey","openaiBaseURL","socksProxy","httpProxy","modelName","openaiExtraConfigStr","openaiExtraConfig","parseJson","vlMode","uiTarsVersion","modelFamilyToVLConfig","modelFamily","modelDescription","getModelDescription","Number","condition","globalModelConfigManager","_this_globalConfigManager","defaultConfig","insightConfig","planningConfig","acc","String","globalConfigManager","modelConfig","createOpenAIClientFn","envConfig","p","name","newConfig","extendMode","allConfig","_this_override","savedNewConfig","overrideAIConfig","elementColor","highlightColorForType","type","asyncGeneratorStep","gen","resolve","reject","_next","_throw","arg","info","_async_to_generator","fn","self","arguments","err","ScreenshotViewer","param","getScreenshot","getInterfaceInfo","serverOnline","isUserOperating","screenshot","setScreenshot","useState","loading","setLoading","setError","lastUpdateTime","setLastUpdateTime","interfaceInfo","setInterfaceInfo","pollingIntervalRef","useRef","isPollingPausedRef","fetchScreenshot","useCallback","isManual","result","screenshotData","fetchInterfaceInfo","startPolling","clearInterval","setInterval","stopPolling","pausePolling","resumePolling","handleManualRefresh","useEffect","jsxs","jsx","Spin","Tooltip","InfoCircleOutlined","formatLastUpdateTime","timestamp","diff","Button","ReloadOutlined","PointSchema","z","SizeSchema","RectSchema","TMultimodalPromptSchema","TUserPromptSchema","locateFieldFlagName","MidsceneLocationInput","findAllMidsceneLocatorField","zodType","requiredOnly","zodObject","field","ifMidsceneLocatorField","actualField","shape","r","_keyDefinitions","lowerKey","isMac","debugUtils","buildDetailedLocateParam","locatePrompt","opt","xpath","prompt","cacheable","noReplayAPIs","parseStructuredParams","action","params","options","schema","_","optionsWithoutDeviceOptions","paramObj","undefined","locatorFieldKeys","locateKey","detailedLocateParam","executeAction","activeAgent","actionType","actionSpace","a","parsedParams","actionParams","pass","thought","BasePlaygroundAdapter","_context","paramsForValidation","needsStructuredParams","paramsList","excludeKeys","filtered","zodError","errorMessages","path","errorMsg","shapeKeys","paramValue","displayKey","formattedValue","str","isLocateField","LocalExecutionAdapter","callback","requestId","errorMessage","context","page","contextPage","aiConfig","originalOnTaskStartTip","tip","response","dumpString","_requestId","t","description","agent","v4","RemoteExecutionAdapter","missingFields","fieldDef","isOptional","androidError","androidErrors","keyword","payload","fetch","errorText","optionalParams","optionalFields","Array","actionSpaceMethod","res","data","jsonError","encodeURIComponent","lastTip","interval","progress","serverUrl","PlaygroundSDK","useServerValid","shouldRun","serverValid","setServerValid","interruptFlag","playgroundSDK","status","setTimeout","selectedDeviceId","scrcpyPlayerRef","messageApi","contextHolder","MobileOutlined","Logo","hideLogo","isDarkMode","useTheme","setIsDarkMode","checkTheme","_document_querySelector","document","observer","MutationObserver","target","EnvConfig","showTooltipWhenEmpty","showModelName","tooltipPlacement","mode","loadConfig","syncFromStorage","isModalOpen","setIsModalOpen","tempConfigString","setTempConfigString","midsceneModelName","componentRef","showModal","SettingOutlined","Modal","Input","NavActions","showEnvConfig","githubUrl","helpUrl","className","Typography","GithubOutlined","QuestionCircleOutlined","autoDismissKeyboardTip","apiMetadata","defaultMainButtons","WELCOME_MESSAGE_TEMPLATE","BLANK_RESULT","mousePointer","mouseLoading","typeStr","task","locateParamStr","locate","paramStr","scrollParam","extractInsightParam","taskParam","extractImages","source","toContent","dataDemand","locateStr","scrollParamStr","pullParamStr","pullParam","parts","CACHE_STRATEGIES","cameraStateForRect","rect","imageWidth","imageHeight","rectWidthOnPage","cameraPaddingRatio","rectRatio","cameraWidth","left","top","_object_spread","i","ownKeys","sym","_object_spread_props","usePlaygroundExecution_ownKeys","object","enumerableOnly","symbols","IndexedDBManager","request","indexedDB","event","db","keyPath","store","storeNames","operation","transaction","storeName","sortByTimestamp","results","objectStore","b","dbName","version","storeConfigs","withErrorHandling","defaultValue","onQuotaExceeded","createCleanupFunction","dbManager","maxItems","toDelete","item","indexeddb_storage_provider_ownKeys","MESSAGES_STORE","RESULTS_STORE","IndexedDBStorageProvider","messages","messagesToSave","msg","index","lightMessage","restoredItem","fullResult","id","compressedResult","_result_result_dump","_result_result","compressedExecutions","execution","_execution_tasks","_task_recorder","_this_compressScreenshotIfNeeded","record","sizeKB","messageCount","resultCount","namespace","storage_provider_ownKeys","LocalStorageProvider","testKey","testData","lightMessages","messageData","DOMException","lightRecentMessages","recentMessages","retryError","stored","resultKey","storedResult","resultItem","resultKeys","keysToRemove","playgroundKeys","additionalKeysToRemove","storage_provider_MemoryStorageProvider","storage_provider_NoOpStorageProvider","_messages","_id","_result","createStorageProvider","detectBestStorageType","usePlaygroundState_ownKeys","rectMarkForItem","themeColor","width","height","hashNumber","djb2Hash","hash","graphics","Graphics","DropShadowFilter","texts","Text","nameFontSize","blackboard","props","highlightElements","highlightRect","highlightPoints","size","screenshotBase64","screenWidth","screenHeight","domRef","app","useMemo","Application","appInitialed","setAppInitialed","highlightContainer","Container","elementMarkContainer","hoverElement","setHoverElement","pixiBgRef","animationFrameRef","highlightGraphicsRef","glowFiltersRef","canvasEl","clientWidth","targetHeight","ratio","cancelAnimationFrame","Rectangle","_props_onCanvasClick","x","y","_app_stage","img","Image","screenshotTexture","Texture","backgroundSprite","Sprite","highlightElementRects","element","content","items","glowFilter","GlowFilter","existingFilters","point","pointMarkForItem","graphicsToAnimate","glowFilters","startTime","performance","animate","normalizedSine","sineValue","alpha","minAlpha","maxAlpha","glowStrength","minGlowStrength","maxGlowStrength","requestAnimationFrame","bottomTipA","shiny_text","text","disabled","speed","style","errorMessageServerNotReady","serverLaunchTip","notReadyMessage","Alert","emptyResultTip","ContextPreview","uiContextPreview","setUiContextPreview","showContextPreview","iconForStatus","CheckOutlined","WarningOutlined","CloseOutlined","ClockCircleOutlined","LogoutOutlined","ArrowRightOutlined","MinusOutlined","playground_demo_ui_context","EnvConfigReminder","ExclamationCircleFilled","global_perspective","global_perspective_ownKeys","player_setting","player_setting_ownKeys","globalTextureMap","loadTexture","Assets","texture","sleep","ms","ERROR_FRAME_CANCEL","RecordingSession","mediaRecorder","MediaRecorder","blob","Blob","url","URL","canvas","Player","_scripts_","statusIconElement","titleText","setTitleText","subTitleText","setSubTitleText","autoZoom","setAutoZoom","scripts","fitMode","currentImg","divContainerRef","pointerSprite","spinningPointerSprite","replayMark","setReplayMark","triggerReplay","windowContentContainer","insightMarkContainer","container","basicCameraState","animationProgress","setAnimationProgress","cancelFlag","cameraState","repaintImage","scriptWidth","scriptHeight","imgToUpdate","targetWidth","aspectRatio","newWidth","newHeight","sprite","mainImgLabel","child","spinningPointer","frame","_pointerSprite_current","_pointerSprite_current1","isCancelled","currentTime","rotation","elapsedTime","updatePointer","targetX","targetY","pointer","updateCamera","state","currentWidth","effectiveWidth","newScale","canvasPaddingLeft","canvasPaddingTop","cameraAnimation","targetState","duration","currentCanvasWidth","currentCanvasHeight","currentState","startPointerLeft","startPointerTop","player_ownKeys","startLeft","startTop","startScale","shouldMovePointer","pointerMoveDuration","cameraMoveDuration","nextState","mouseProgress","cameraProgress","cameraElapsedTime","progressScale","targetScale","progressWidth","progressLeft","progressTop","horizontalExceed","verticalExceed","fadeInGraphics","targetAlpha","fadeOutItem","insightElementsAnimation","elements","searchArea","elementsToAdd","totalLength","childrenCount","t2","elementsToAddNow","p0","p3","randomIndex","insightMarkGraphic","searchAreaGraphic","isRecording","setIsRecording","recorderSessionRef","cancelAnimationRef","playerContainer","cancelFn","cancel","timeout","allImages","totalDuration","updateProgress","stop","wasRecording","stopError","mouseOverStatusIcon","setMouseOverStatusIcon","mouseOverSettingsIcon","setMouseOverSettingsIcon","progressString","canReplayNow","listener","statusOnClick","LoadingOutlined","CaretRightOutlined","DownloadOutlined","ExportOutlined","Dropdown","menu","Switch","checked","_e_stopPropagation","PlaygroundResultView","replayScriptsInfo","replayCounter","loadingProgressText","verticalMode","resultWrapperClassName","resultDataToShow","avatar","avatar_ownKeys","history_create","HISTORY_KEY","LAST_SELECTED_TYPE_KEY","useHistoryStore","historyString","newHistory","historyItem","currentHistory","typeHistory","stringifiedNewItem","newTypeHistory","h","stringifiedOldItem","history_ownKeys","isZodObjectSchema","_field__def","_field__def1","_fieldWithRuntime__def","fieldWithRuntime","VALIDATION_CONSTANTS","desc","unwrapZodType","_actualField__def","_actualField__def1","_actualField__def2","_actualField__def3","_actualField__def4","hasDefault","getMidsceneLocationSchema","val","actionNameForType","typeWithoutAi","fullName","words","setting","setting_ownKeys","ConfigSelector","showDeepThinkOption","enableTracking","showDataExtractionOptions","hideDomAndScreenshotOptions","deviceType","setForceSameTabNavigation","setDeepThink","setScreenshotIncluded","setDomIncluded","setImeStrategy","setAutoDismissKeyboard","setKeyboardDismissStrategy","setAlwaysRefreshScreenInfo","configItems","Checkbox","Radio","TextArea","renderLabel","label","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","HistorySelector","onSelect","history","currentType","searchText","setSearchText","clearHistory","modalRef","groupedHistory","sevenDaysAgo","oneYearAgo","filteredHistory","handleClickOutside","timer","clearTimeout","renderHistoryGroup","title","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","hasDataExtraction","hasDeviceOptions","hasTracking","availableDropdownMethods","metadataMethods","availableMethods","finalMethods","Set","method","methodInfo","getDefaultParams","defaultParams","extractDefaultValue","_currentField__def","currentField","scrollToSelectedItem","targetElement","selectedRadioButton","dropdownButton","containerRect","targetRect","targetLeft","containerWidth","lastHistory","timeoutId","formPromptValue","handleSelectHistory","handlePromptChange","hasSingleStructuredParam","isRunButtonEnabled","playground_utils_mjs_isRunButtonEnabled","currentParams","handleRunWithHistory","values","historyPrompt","locateValue","otherValues","_values_params","mainPart","newHistoryItem","handleKeyDown","_textAreaRef_current_resizableTextArea","textarea","selectionStart","lastNewlineIndex","isAtLastLine","handleStructuredKeyDown","renderStructuredParams","schemaKeys","isLocateFieldFlag","placeholderText","_fieldDef__def","fields","sortedKeys","keyA","keyB","fieldSchemaA","fieldSchemaB","isOptionalA","isOptionalB","fieldProps","directionField","react","distanceField","otherFields","handleMouseEnter","handleMouseLeave","renderActionButton","runButton","SendOutlined","BorderOutlined","apiType","_apiMetadata_apiType","api","_apiMetadata_api","DownOutlined","ErrorMessage","UniversalPlayground","storage","contextProvider","componentConfig","branding","sdkReady","setSdkReady","effectiveStorage","sdk","bestStorageType","infoList","setInfoList","actionSpaceLoading","showScrollToBottomButton","setReplayCounter","infoListRef","currentRunningIdRef","interruptedFlagRef","clearInfoList","handleScrollToBottom","usePlaygroundState","setActionSpace","setActionSpaceLoading","setShowScrollToBottomButton","setVerticalMode","initializedRef","initializeMessages","welcomeMessage","storedMessages","oldStorage","oldMessages","hasWelcomeMessage","_contextProvider_getUIContext","space","handleResize","scrollToBottom","checkIfScrolledToBottom","scrollTop","scrollHeight","clientHeight","refreshContext","newContext","handleStop","canStop","usePlaygroundExecution","handleRun","thisRunningId","displayContent","userItem","prev","systemItem","lastItem","progressItem","resultObj","replayInfo","counter","allScriptsFromDump","dump","firstWidth","firstHeight","dimensionsSet","sdkVersion","modelBriefsSet","_task_uiContext_size","_task_uiContext","w","allScripts","generateAnimationScripts","insightCameraState","tasksIncluded","startIndex","fullPageCameraState","insightOnTop","initSubTitle","errorStateFlag","_task_output","_planTask_output","_context_size","_context_size1","_planningTask_recorder_","_planningTask_recorder","_task_uiContext_size1","_task_uiContext1","_task_recorder_","_task_uiContext_size2","_task_uiContext2","_task_uiContext_size3","_task_uiContext3","_task_recorder_1","_task_recorder1","_task_uiContext_size4","_task_uiContext4","_task_uiContext_size5","_task_uiContext5","_task_uiContext_size6","_task_uiContext6","_task_uiContext_size7","_task_uiContext7","locateElements","actions","planTask","knownFields","locateTask","subTitle","_task_log_taskInfo","_task_log","replay_scripts_ownKeys","planningTask","errorTitle","errorSubTitle","model_name","model_description","allScriptsWithoutIntermediateDoneFrame","script","modelBriefs","_list_","list","firstOneInfo","c","separatorItem","handleFormRun","configAlreadySet","finalShowContextPreview","layout","showVersionInfo","ClearOutlined","List","_item_result","_parts_","_item_result1","_item_result2","currentIndex","laterProgressExists","shouldShowLoading","listItem","icons","ArrowDownOutlined","PlaygroundPanel","checkServer","online","__APP_VERSION__","ScrcpyPlayer","forwardRef","ref","maxSize","autoConnect","autoReconnect","reconnectInterval","connecting","setConnecting","connected","setConnected","screenInfo","setScreenInfo","deviceId","setDeviceId","socketRef","videoContainerRef","videoElementRef","decoderRef","reconnectTimerRef","metadataTimeoutRef","safeRemoveChildNodes","parent","innerErr","updateCanvasSize","containerHeight","originalWidth","originalHeight","availableHeight","createVideoFrameRenderer","WebGLVideoFrameRenderer","renderer","BitmapVideoFrameRenderer","createDecoder","codecId","WebCodecsVideoDecoder","canvasWrapper","takeScreenshot","alert","disconnectDevice","useImperativeHandle","connectDevice","setupMetadataTimeout","_socketRef_current","io","_socketRef_current1","metadata","configurationPacketSent","pendingDataPackets","transformStream","ScrcpyVideoCodecId","videoStream","TransformStream","chunk","controller","packet","Uint8Array","ReadableStream","streamClosed","videoDataHandler","cleanupHandlers","errorHandler","disconnectHandler","Card","ScreenshotIcon","Divider","LinkedIcon","UnlinkIcon","Row","Col","Content","Layout","rootEl","root","ReactDOM","setSelectedDeviceId","connectToDevice","setConnectToDevice","setServerUrl","isNarrowScreen","setIsNarrowScreen","usePollingMode","setUsePollingMode","safeOverrideAIConfig","showErrorMessage","scrcpyPort","socket","ConfigProvider","PanelGroup","Panel","PanelResizeHandle","AdbDevice","App","n","globalThis","Function"],"mappings":"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kCH,MAKxBF,GACK,AAAP,OAAAM,CAAAA,EAAA,EAAa,IAAI,AAAD,EAAC,SAAE,QAAQ,AAAD,IAAM,cAIpC,GAIK,EAAE,AACX,ECljBqB1L,GAAS,cACTA,GAAS,cCjChBA,GAAS,4BCjBnB,IAAM2L,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,IA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"}
|