@midscene/android-playground 1.0.1-beta-20251021060907.0 → 1.0.1-beta-20251022061922.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.
Files changed (46) hide show
  1. package/package.json +5 -5
  2. package/static/index.html +1 -1
  3. package/static/static/js/142.64c1e0d5.js +697 -0
  4. package/static/static/js/{825.c5ade4c6.js.map → 142.64c1e0d5.js.map} +1 -1
  5. package/static/static/js/async/150.d439b38c.js +158 -0
  6. package/static/static/js/async/{212.850ade70.js.map → 150.d439b38c.js.map} +1 -1
  7. package/static/static/js/async/{624.8a1fe2e8.js → 195.aa1e3152.js} +3 -3
  8. package/static/static/js/async/{624.8a1fe2e8.js.map → 195.aa1e3152.js.map} +1 -1
  9. package/static/static/js/async/260.d838b3b7.js +2 -0
  10. package/static/static/js/async/{544.18ac9afb.js.map → 260.d838b3b7.js.map} +1 -1
  11. package/static/static/js/async/271.71b3326b.js +3 -0
  12. package/static/static/js/async/{173.f2381e64.js.map → 271.71b3326b.js.map} +1 -1
  13. package/static/static/js/async/355.76c31308.js +1 -0
  14. package/static/static/js/async/{644.910ce3d0.js → 441.675c15a8.js} +1 -1
  15. package/static/static/js/async/45.ce50b37f.js +21 -0
  16. package/static/static/js/async/45.ce50b37f.js.map +1 -0
  17. package/static/static/js/async/586.ffc417d5.js +26 -0
  18. package/static/static/js/async/{329.261bc4a1.js.map → 586.ffc417d5.js.map} +1 -1
  19. package/static/static/js/async/631.9799e85f.js +30 -0
  20. package/static/static/js/async/{364.d88c3cff.js.map → 631.9799e85f.js.map} +1 -1
  21. package/static/static/js/async/{702.1f38a17e.js → 779.e7bfc2ed.js} +15 -15
  22. package/static/static/js/async/{702.1f38a17e.js.map → 779.e7bfc2ed.js.map} +1 -1
  23. package/static/static/js/async/782.f77f2205.js +2 -0
  24. package/static/static/js/async/782.f77f2205.js.map +1 -0
  25. package/static/static/js/index.52b7b369.js +30 -0
  26. package/static/static/js/index.52b7b369.js.map +1 -0
  27. package/static/static/js/lib-react.d7dec362.js +3 -0
  28. package/static/static/js/{lib-react.c74a0742.js.map → lib-react.d7dec362.js.map} +1 -1
  29. package/static/static/js/825.c5ade4c6.js +0 -697
  30. package/static/static/js/async/166.834644b5.js +0 -2
  31. package/static/static/js/async/166.834644b5.js.map +0 -1
  32. package/static/static/js/async/173.f2381e64.js +0 -3
  33. package/static/static/js/async/212.850ade70.js +0 -158
  34. package/static/static/js/async/329.261bc4a1.js +0 -26
  35. package/static/static/js/async/364.d88c3cff.js +0 -30
  36. package/static/static/js/async/544.18ac9afb.js +0 -2
  37. package/static/static/js/async/582.8f4b5264.js +0 -21
  38. package/static/static/js/async/582.8f4b5264.js.map +0 -1
  39. package/static/static/js/async/983.b98b40af.js +0 -1
  40. package/static/static/js/index.eb785992.js +0 -30
  41. package/static/static/js/index.eb785992.js.map +0 -1
  42. package/static/static/js/lib-react.c74a0742.js +0 -3
  43. /package/static/static/js/{825.c5ade4c6.js.LICENSE.txt → 142.64c1e0d5.js.LICENSE.txt} +0 -0
  44. /package/static/static/js/{index.eb785992.js.LICENSE.txt → index.52b7b369.js.LICENSE.txt} +0 -0
  45. /package/static/static/js/{lib-react.c74a0742.js.LICENSE.txt → lib-react.d7dec362.js.LICENSE.txt} +0 -0
  46. /package/static/static/wasm/{9e906fbf55e08f98.module.wasm → 9e906fbf.module.wasm} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/js/index.52b7b369.js","sources":["webpack://android-playground/webpack/runtime/create_fake_namespace_object","webpack://android-playground/webpack/runtime/load_script","webpack://android-playground/webpack/runtime/on_chunk_loaded","webpack://android-playground/webpack/runtime/jsonp_chunk_loading","webpack://android-playground/../../packages/shared/dist/es/env/types.mjs","webpack://android-playground/../../packages/shared/dist/es/utils.mjs","webpack://android-playground/../../packages/visualizer/dist/es/store/store.mjs","webpack://android-playground/../../packages/shared/dist/es/env/basic.mjs","webpack://android-playground/../../packages/shared/dist/es/common.mjs","webpack://android-playground/../../packages/shared/dist/es/logger.mjs","webpack://android-playground/../../packages/shared/dist/es/env/init-debug.mjs","webpack://android-playground/../../packages/shared/dist/es/env/global-config-manager.mjs","webpack://android-playground/../../packages/shared/dist/es/env/constants.mjs","webpack://android-playground/../../packages/shared/dist/es/env/helper.mjs","webpack://android-playground/../../packages/shared/dist/es/env/parse.mjs","webpack://android-playground/../../packages/shared/dist/es/env/decide-model-config.mjs","webpack://android-playground/../../packages/shared/dist/es/env/model-config-manager.mjs","webpack://android-playground/../../packages/shared/dist/es/env/utils.mjs","webpack://android-playground/../../packages/visualizer/dist/es/utils/color.mjs","webpack://android-playground/../../packages/core/dist/es/ai-model/webpack:/@midscene/core/src/ai-model/common.ts","webpack://android-playground/../../packages/shared/dist/es/extractor/tree.mjs","webpack://android-playground/../../packages/core/dist/es/ai-model/prompt/webpack:/@midscene/core/src/ai-model/prompt/llm-locator.ts","webpack://android-playground/../../packages/shared/dist/es/img/transform.mjs","webpack://android-playground/../../packages/core/dist/es/ai-model/prompt/webpack:/@midscene/core/src/ai-model/prompt/llm-section-locator.ts","webpack://android-playground/../../packages/core/dist/es/ai-model/webpack:/@midscene/core/src/ai-model/inspect.ts","webpack://android-playground/../../packages/core/dist/es/ai-model/webpack:/@midscene/core/src/ai-model/llm-planning.ts","webpack://android-playground/../../packages/shared/dist/es/us-keyboard-layout.mjs","webpack://android-playground/../../packages/core/dist/es/ai-model/webpack:/@midscene/core/src/ai-model/ui-tars-planning.ts","webpack://android-playground/../../packages/core/dist/es/yaml/webpack:/@midscene/core/src/yaml/utils.ts","webpack://android-playground/../../packages/core/dist/es/yaml/webpack:/@midscene/core/src/yaml/player.ts","webpack://android-playground/../../packages/playground/dist/es/webpack:/@midscene/playground/src/common.ts","webpack://android-playground/../../packages/playground/dist/es/adapters/webpack:/@midscene/playground/src/adapters/base.ts","webpack://android-playground/../../packages/playground/dist/es/adapters/webpack:/@midscene/playground/src/adapters/local-execution.ts","webpack://android-playground/../../packages/playground/dist/es/adapters/webpack:/@midscene/playground/src/adapters/remote-execution.ts","webpack://android-playground/../../packages/playground/dist/es/sdk/webpack:/@midscene/playground/src/sdk/index.ts","webpack://android-playground/../../packages/visualizer/dist/es/hooks/useServerValid.mjs","webpack://android-playground/./src/components/adb-device/index.tsx","webpack://android-playground/../../packages/visualizer/dist/es/component/logo/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/env-config/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/nav-actions/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/utils/constants.mjs","webpack://android-playground/../../packages/visualizer/dist/es/utils/index.mjs","webpack://android-playground/../../packages/core/dist/es/agent/webpack:/@midscene/core/src/agent/ui-utils.ts","webpack://android-playground/../../packages/core/dist/es/insight/webpack:/@midscene/core/src/insight/index.ts","webpack://android-playground/../../packages/core/dist/es/agent/webpack:/@midscene/core/src/agent/utils.ts","webpack://android-playground/../../packages/core/dist/es/agent/webpack:/@midscene/core/src/agent/task-cache.ts","webpack://android-playground/../../packages/core/dist/es/agent/webpack:/@midscene/core/src/agent/task-builder.ts","webpack://android-playground/../../packages/core/dist/es/agent/webpack:/@midscene/core/src/agent/tasks.ts","webpack://android-playground/../../packages/core/dist/es/agent/webpack:/@midscene/core/src/agent/agent.ts","webpack://android-playground/../../packages/visualizer/dist/es/utils/replay-scripts.mjs","webpack://android-playground/../../packages/shared/dist/es/baseDB.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/universal-playground/providers/indexeddb-storage-provider.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/universal-playground/providers/storage-provider.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/blackboard/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/shiny-text/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/misc/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/context-preview/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/env-config-reminder/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/icons/global-perspective.mjs","webpack://android-playground/../../packages/visualizer/dist/es/icons/player-setting.mjs","webpack://android-playground/../../packages/visualizer/dist/es/icons/show-marker.mjs","webpack://android-playground/../../packages/visualizer/dist/es/utils/pixi-loader.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/player/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/playground-result/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/icons/avatar.mjs","webpack://android-playground/../../packages/visualizer/dist/es/store/history.mjs","webpack://android-playground/../../packages/visualizer/dist/es/types.mjs","webpack://android-playground/../../packages/core/dist/es/device/webpack:/@midscene/core/src/device/index.ts","webpack://android-playground/../../packages/visualizer/dist/es/utils/playground-utils.mjs","webpack://android-playground/../../packages/visualizer/dist/es/icons/setting.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/config-selector/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/form-field/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/icons/close.mjs","webpack://android-playground/../../packages/visualizer/dist/es/icons/history.mjs","webpack://android-playground/../../packages/visualizer/dist/es/icons/magnifying-glass.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/history-selector/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/prompt-input/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/universal-playground/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/hooks/usePlaygroundState.mjs","webpack://android-playground/../../packages/visualizer/dist/es/hooks/usePlaygroundExecution.mjs","webpack://android-playground/./src/components/playground-panel/index.tsx","webpack://android-playground/./src/icons/linked.svg","webpack://android-playground/./src/icons/screenshot.svg","webpack://android-playground/./src/icons/unlink.svg","webpack://android-playground/./src/components/scrcpy-player/index.tsx","webpack://android-playground/./src/App.tsx","webpack://android-playground/./src/index.tsx","webpack://android-playground/../../packages/visualizer/dist/es/hooks/useSafeOverrideAIConfig.mjs","webpack://android-playground/webpack/runtime/compat_get_default_export","webpack://android-playground/webpack/runtime/define_property_getters","webpack://android-playground/webpack/runtime/ensure_chunk","webpack://android-playground/webpack/runtime/get javascript chunk filename","webpack://android-playground/webpack/runtime/get mini-css chunk filename","webpack://android-playground/webpack/runtime/global","webpack://android-playground/webpack/runtime/has_own_property","webpack://android-playground/webpack/runtime/make_namespace_object","webpack://android-playground/webpack/runtime/node_module_decorator","webpack://android-playground/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' && !~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\t\n script = document.createElement('script');\n \n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\t\n\t\tscript.src = url;\n\t\t\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\treturn __webpack_require__.O(result);\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","const MIDSCENE_OPENAI_INIT_CONFIG_JSON = 'MIDSCENE_OPENAI_INIT_CONFIG_JSON';\nconst MIDSCENE_MODEL_NAME = 'MIDSCENE_MODEL_NAME';\nconst MIDSCENE_LANGSMITH_DEBUG = 'MIDSCENE_LANGSMITH_DEBUG';\nconst MIDSCENE_DEBUG_AI_PROFILE = 'MIDSCENE_DEBUG_AI_PROFILE';\nconst MIDSCENE_DEBUG_AI_RESPONSE = 'MIDSCENE_DEBUG_AI_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_OPENAI_SOCKS_PROXY = 'MIDSCENE_OPENAI_SOCKS_PROXY';\nconst MIDSCENE_OPENAI_HTTP_PROXY = 'MIDSCENE_OPENAI_HTTP_PROXY';\nconst OPENAI_API_KEY = 'OPENAI_API_KEY';\nconst OPENAI_BASE_URL = 'OPENAI_BASE_URL';\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_REPLANNING_CYCLE_LIMIT = 'MIDSCENE_REPLANNING_CYCLE_LIMIT';\nconst MIDSCENE_PREFERRED_LANGUAGE = 'MIDSCENE_PREFERRED_LANGUAGE';\nconst MIDSCENE_CACHE_MAX_FILENAME_LENGTH = 'MIDSCENE_CACHE_MAX_FILENAME_LENGTH';\nconst MIDSCENE_RUN_DIR = 'MIDSCENE_RUN_DIR';\nconst MIDSCENE_OPENAI_BASE_URL = 'MIDSCENE_OPENAI_BASE_URL';\nconst MIDSCENE_OPENAI_API_KEY = 'MIDSCENE_OPENAI_API_KEY';\nconst MIDSCENE_VL_MODE = 'MIDSCENE_VL_MODE';\nconst MIDSCENE_VQA_MODEL_NAME = 'MIDSCENE_VQA_MODEL_NAME';\nconst MIDSCENE_VQA_OPENAI_SOCKS_PROXY = 'MIDSCENE_VQA_OPENAI_SOCKS_PROXY';\nconst MIDSCENE_VQA_OPENAI_HTTP_PROXY = 'MIDSCENE_VQA_OPENAI_HTTP_PROXY';\nconst MIDSCENE_VQA_OPENAI_BASE_URL = 'MIDSCENE_VQA_OPENAI_BASE_URL';\nconst MIDSCENE_VQA_OPENAI_API_KEY = 'MIDSCENE_VQA_OPENAI_API_KEY';\nconst MIDSCENE_VQA_OPENAI_INIT_CONFIG_JSON = 'MIDSCENE_VQA_OPENAI_INIT_CONFIG_JSON';\nconst MIDSCENE_VQA_VL_MODE = 'MIDSCENE_VQA_VL_MODE';\nconst MIDSCENE_PLANNING_MODEL_NAME = 'MIDSCENE_PLANNING_MODEL_NAME';\nconst MIDSCENE_PLANNING_OPENAI_SOCKS_PROXY = 'MIDSCENE_PLANNING_OPENAI_SOCKS_PROXY';\nconst MIDSCENE_PLANNING_OPENAI_HTTP_PROXY = 'MIDSCENE_PLANNING_OPENAI_HTTP_PROXY';\nconst MIDSCENE_PLANNING_OPENAI_BASE_URL = 'MIDSCENE_PLANNING_OPENAI_BASE_URL';\nconst MIDSCENE_PLANNING_OPENAI_API_KEY = 'MIDSCENE_PLANNING_OPENAI_API_KEY';\nconst MIDSCENE_PLANNING_OPENAI_INIT_CONFIG_JSON = 'MIDSCENE_PLANNING_OPENAI_INIT_CONFIG_JSON';\nconst MIDSCENE_PLANNING_VL_MODE = 'MIDSCENE_PLANNING_VL_MODE';\nconst MIDSCENE_GROUNDING_MODEL_NAME = 'MIDSCENE_GROUNDING_MODEL_NAME';\nconst MIDSCENE_GROUNDING_OPENAI_SOCKS_PROXY = 'MIDSCENE_GROUNDING_OPENAI_SOCKS_PROXY';\nconst MIDSCENE_GROUNDING_OPENAI_HTTP_PROXY = 'MIDSCENE_GROUNDING_OPENAI_HTTP_PROXY';\nconst MIDSCENE_GROUNDING_OPENAI_BASE_URL = 'MIDSCENE_GROUNDING_OPENAI_BASE_URL';\nconst MIDSCENE_GROUNDING_OPENAI_API_KEY = 'MIDSCENE_GROUNDING_OPENAI_API_KEY';\nconst MIDSCENE_GROUNDING_OPENAI_INIT_CONFIG_JSON = 'MIDSCENE_GROUNDING_OPENAI_INIT_CONFIG_JSON';\nconst MIDSCENE_GROUNDING_VL_MODE = 'MIDSCENE_GROUNDING_VL_MODE';\nconst UNUSED_ENV_KEYS = [\n MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG\n];\nconst BASIC_ENV_KEYS = [\n MIDSCENE_DEBUG_MODE,\n MIDSCENE_DEBUG_AI_PROFILE,\n MIDSCENE_DEBUG_AI_RESPONSE,\n MIDSCENE_RUN_DIR\n];\nconst BOOLEAN_ENV_KEYS = [\n MIDSCENE_CACHE,\n MIDSCENE_LANGSMITH_DEBUG,\n MIDSCENE_FORCE_DEEP_THINK,\n MIDSCENE_MCP_USE_PUPPETEER_MODE,\n MIDSCENE_MCP_ANDROID_MODE\n];\nconst NUMBER_ENV_KEYS = [\n MIDSCENE_CACHE_MAX_FILENAME_LENGTH,\n MIDSCENE_REPLANNING_CYCLE_LIMIT\n];\nconst STRING_ENV_KEYS = [\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_OPENAI_INIT_CONFIG_JSON,\n MIDSCENE_OPENAI_API_KEY,\n MIDSCENE_OPENAI_BASE_URL,\n MIDSCENE_OPENAI_SOCKS_PROXY,\n MIDSCENE_OPENAI_HTTP_PROXY,\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 MIDSCENE_VL_MODE,\n OPENAI_API_KEY,\n OPENAI_BASE_URL,\n MIDSCENE_VQA_MODEL_NAME,\n MIDSCENE_VQA_OPENAI_SOCKS_PROXY,\n MIDSCENE_VQA_OPENAI_HTTP_PROXY,\n MIDSCENE_VQA_OPENAI_BASE_URL,\n MIDSCENE_VQA_OPENAI_API_KEY,\n MIDSCENE_VQA_OPENAI_INIT_CONFIG_JSON,\n MIDSCENE_VQA_VL_MODE,\n MIDSCENE_PLANNING_MODEL_NAME,\n MIDSCENE_PLANNING_OPENAI_SOCKS_PROXY,\n MIDSCENE_PLANNING_OPENAI_HTTP_PROXY,\n MIDSCENE_PLANNING_OPENAI_BASE_URL,\n MIDSCENE_PLANNING_OPENAI_API_KEY,\n MIDSCENE_PLANNING_OPENAI_INIT_CONFIG_JSON,\n MIDSCENE_PLANNING_VL_MODE,\n MIDSCENE_GROUNDING_MODEL_NAME,\n MIDSCENE_GROUNDING_OPENAI_SOCKS_PROXY,\n MIDSCENE_GROUNDING_OPENAI_HTTP_PROXY,\n MIDSCENE_GROUNDING_OPENAI_BASE_URL,\n MIDSCENE_GROUNDING_OPENAI_API_KEY,\n MIDSCENE_GROUNDING_OPENAI_INIT_CONFIG_JSON,\n MIDSCENE_GROUNDING_VL_MODE\n];\nconst ALL_ENV_KEYS = [\n ...UNUSED_ENV_KEYS,\n ...BASIC_ENV_KEYS,\n ...GLOBAL_ENV_KEYS,\n ...MODEL_ENV_KEYS\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}({});\nconst VL_MODE_RAW_VALID_VALUES = [\n 'doubao-vision',\n 'gemini',\n 'qwen-vl',\n 'qwen3-vl',\n 'vlm-ui-tars',\n 'vlm-ui-tars-doubao',\n 'vlm-ui-tars-doubao-1.5'\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_AI_PROFILE, MIDSCENE_DEBUG_AI_RESPONSE, MIDSCENE_DEBUG_MODE, MIDSCENE_FORCE_DEEP_THINK, MIDSCENE_GROUNDING_MODEL_NAME, MIDSCENE_GROUNDING_OPENAI_API_KEY, MIDSCENE_GROUNDING_OPENAI_BASE_URL, MIDSCENE_GROUNDING_OPENAI_HTTP_PROXY, MIDSCENE_GROUNDING_OPENAI_INIT_CONFIG_JSON, MIDSCENE_GROUNDING_OPENAI_SOCKS_PROXY, MIDSCENE_GROUNDING_VL_MODE, MIDSCENE_IOS_DEVICE_UDID, MIDSCENE_IOS_SIMULATOR_UDID, MIDSCENE_LANGSMITH_DEBUG, MIDSCENE_MCP_ANDROID_MODE, MIDSCENE_MCP_CHROME_PATH, MIDSCENE_MCP_USE_PUPPETEER_MODE, MIDSCENE_MODEL_NAME, MIDSCENE_OPENAI_API_KEY, MIDSCENE_OPENAI_BASE_URL, MIDSCENE_OPENAI_HTTP_PROXY, MIDSCENE_OPENAI_INIT_CONFIG_JSON, MIDSCENE_OPENAI_SOCKS_PROXY, MIDSCENE_PLANNING_MODEL_NAME, MIDSCENE_PLANNING_OPENAI_API_KEY, MIDSCENE_PLANNING_OPENAI_BASE_URL, MIDSCENE_PLANNING_OPENAI_HTTP_PROXY, MIDSCENE_PLANNING_OPENAI_INIT_CONFIG_JSON, MIDSCENE_PLANNING_OPENAI_SOCKS_PROXY, MIDSCENE_PLANNING_VL_MODE, 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, MIDSCENE_VL_MODE, MIDSCENE_VQA_MODEL_NAME, MIDSCENE_VQA_OPENAI_API_KEY, MIDSCENE_VQA_OPENAI_BASE_URL, MIDSCENE_VQA_OPENAI_HTTP_PROXY, MIDSCENE_VQA_OPENAI_INIT_CONFIG_JSON, MIDSCENE_VQA_OPENAI_SOCKS_PROXY, MIDSCENE_VQA_VL_MODE, MODEL_ENV_KEYS, 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\";\nvar _process_versions;\nconst ifInBrowser = 'undefined' != typeof window;\nconst ifInWorker = 'undefined' != typeof WorkerGlobalScope;\nconst ifInNode = 'undefined' != typeof process && (null == (_process_versions = process.versions) ? void 0 : _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 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 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 };\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_AI_PROFILE, MIDSCENE_DEBUG_AI_RESPONSE } from \"./types.mjs\";\nconst initDebugConfig = ()=>{\n const shouldPrintTiming = getBasicEnvValue(MIDSCENE_DEBUG_AI_PROFILE);\n let debugConfig = '';\n if (shouldPrintTiming) {\n console.warn('MIDSCENE_DEBUG_AI_PROFILE is deprecated, use DEBUG=midscene:ai:profile instead');\n debugConfig = 'ai:profile';\n }\n const shouldPrintAIResponse = getBasicEnvValue(MIDSCENE_DEBUG_AI_RESPONSE);\n if (shouldPrintAIResponse) {\n console.warn('MIDSCENE_DEBUG_AI_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 (!STRING_ENV_KEYS.includes(key)) throw new Error(`getEnvConfigValue with key ${key} is not supported.`);\n if (key === MATCH_BY_POSITION) throw new Error('MATCH_BY_POSITION is deprecated, use MIDSCENE_USE_VL_MODEL instead');\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 var _this_override;\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 ...null == (_this_override = this.override) ? void 0 : _this_override.newConfig,\n ...newConfig\n } : newConfig;\n this.override = {\n newConfig: {\n ...savedNewConfig\n },\n extendMode\n };\n if (!this.globalModelConfigManager) throw new Error('globalModelConfigManager is not registered, which should not happen');\n this.globalModelConfigManager.clearModelConfigMap();\n }\n constructor(){\n _define_property(this, \"override\", void 0);\n _define_property(this, \"keysHaveBeenRead\", {});\n _define_property(this, \"globalModelConfigManager\", void 0);\n initDebugConfig();\n }\n}\nexport { GlobalConfigManager };\n","import { MIDSCENE_GROUNDING_MODEL_NAME, MIDSCENE_GROUNDING_OPENAI_API_KEY, MIDSCENE_GROUNDING_OPENAI_BASE_URL, MIDSCENE_GROUNDING_OPENAI_HTTP_PROXY, MIDSCENE_GROUNDING_OPENAI_INIT_CONFIG_JSON, MIDSCENE_GROUNDING_OPENAI_SOCKS_PROXY, MIDSCENE_GROUNDING_VL_MODE, MIDSCENE_MODEL_NAME, MIDSCENE_OPENAI_API_KEY, MIDSCENE_OPENAI_BASE_URL, MIDSCENE_OPENAI_HTTP_PROXY, MIDSCENE_OPENAI_INIT_CONFIG_JSON, MIDSCENE_OPENAI_SOCKS_PROXY, MIDSCENE_PLANNING_MODEL_NAME, MIDSCENE_PLANNING_OPENAI_API_KEY, MIDSCENE_PLANNING_OPENAI_BASE_URL, MIDSCENE_PLANNING_OPENAI_HTTP_PROXY, MIDSCENE_PLANNING_OPENAI_INIT_CONFIG_JSON, MIDSCENE_PLANNING_OPENAI_SOCKS_PROXY, MIDSCENE_PLANNING_VL_MODE, MIDSCENE_VL_MODE, MIDSCENE_VQA_MODEL_NAME, MIDSCENE_VQA_OPENAI_API_KEY, MIDSCENE_VQA_OPENAI_BASE_URL, MIDSCENE_VQA_OPENAI_HTTP_PROXY, MIDSCENE_VQA_OPENAI_INIT_CONFIG_JSON, MIDSCENE_VQA_OPENAI_SOCKS_PROXY, MIDSCENE_VQA_VL_MODE, OPENAI_API_KEY, OPENAI_BASE_URL } from \"./types.mjs\";\nconst VQA_MODEL_CONFIG_KEYS = {\n modelName: MIDSCENE_VQA_MODEL_NAME,\n socksProxy: MIDSCENE_VQA_OPENAI_SOCKS_PROXY,\n httpProxy: MIDSCENE_VQA_OPENAI_HTTP_PROXY,\n openaiBaseURL: MIDSCENE_VQA_OPENAI_BASE_URL,\n openaiApiKey: MIDSCENE_VQA_OPENAI_API_KEY,\n openaiExtraConfig: MIDSCENE_VQA_OPENAI_INIT_CONFIG_JSON,\n vlMode: MIDSCENE_VQA_VL_MODE\n};\nconst GROUNDING_MODEL_CONFIG_KEYS = {\n modelName: MIDSCENE_GROUNDING_MODEL_NAME,\n socksProxy: MIDSCENE_GROUNDING_OPENAI_SOCKS_PROXY,\n httpProxy: MIDSCENE_GROUNDING_OPENAI_HTTP_PROXY,\n openaiBaseURL: MIDSCENE_GROUNDING_OPENAI_BASE_URL,\n openaiApiKey: MIDSCENE_GROUNDING_OPENAI_API_KEY,\n openaiExtraConfig: MIDSCENE_GROUNDING_OPENAI_INIT_CONFIG_JSON,\n vlMode: MIDSCENE_GROUNDING_VL_MODE\n};\nconst PLANNING_MODEL_CONFIG_KEYS = {\n modelName: MIDSCENE_PLANNING_MODEL_NAME,\n socksProxy: MIDSCENE_PLANNING_OPENAI_SOCKS_PROXY,\n httpProxy: MIDSCENE_PLANNING_OPENAI_HTTP_PROXY,\n openaiBaseURL: MIDSCENE_PLANNING_OPENAI_BASE_URL,\n openaiApiKey: MIDSCENE_PLANNING_OPENAI_API_KEY,\n openaiExtraConfig: MIDSCENE_PLANNING_OPENAI_INIT_CONFIG_JSON,\n vlMode: MIDSCENE_PLANNING_VL_MODE\n};\nconst DEFAULT_MODEL_CONFIG_KEYS = {\n modelName: MIDSCENE_MODEL_NAME,\n socksProxy: MIDSCENE_OPENAI_SOCKS_PROXY,\n httpProxy: MIDSCENE_OPENAI_HTTP_PROXY,\n openaiBaseURL: MIDSCENE_OPENAI_BASE_URL,\n openaiApiKey: MIDSCENE_OPENAI_API_KEY,\n openaiExtraConfig: MIDSCENE_OPENAI_INIT_CONFIG_JSON,\n vlMode: MIDSCENE_VL_MODE\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 vlMode: 'DEFAULT_MODEL_CONFIG_KEYS has no vlMode key'\n};\nexport { DEFAULT_MODEL_CONFIG_KEYS, DEFAULT_MODEL_CONFIG_KEYS_LEGACY, GROUNDING_MODEL_CONFIG_KEYS, PLANNING_MODEL_CONFIG_KEYS, VQA_MODEL_CONFIG_KEYS };\n","import { assert } from \"../utils.mjs\";\nconst 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 ([\n 'openaiApiKey'\n ].includes(key)) return [\n key,\n maskKey(value)\n ];\n if ([\n 'openaiExtraConfig'\n ].includes(key)) return [\n key,\n maskKey(JSON.stringify(value))\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};\nconst createAssert = (modelNameKey, provider, modelName)=>(value, key, modelVendorFlag)=>{\n if (modelName) modelVendorFlag ? assert(value, `The ${key} must be a non-empty string because of the ${modelNameKey} is declared as ${modelName} and ${modelVendorFlag} has also been specified in ${provider}, but got: ${value}. Please check your config.`) : assert(value, `The ${key} must be a non-empty string because of the ${modelNameKey} is declared as ${modelName} in ${provider}, but got: ${value}. Please check your config.`);\n else assert(value, `The ${key} must be a non-empty string, but got: ${value}. Please check your config.`);\n };\nexport { createAssert, maskConfig, parseJson };\n","import { MIDSCENE_USE_DOUBAO_VISION, MIDSCENE_USE_GEMINI, MIDSCENE_USE_QWEN3_VL, MIDSCENE_USE_QWEN_VL, MIDSCENE_USE_VLM_UI_TARS, UITarsModelVersion, VL_MODE_RAW_VALID_VALUES } from \"./types.mjs\";\nconst parseVlModeAndUiTarsModelVersionFromRawValue = (vlModeRaw)=>{\n if (!vlModeRaw) return {\n vlMode: void 0,\n uiTarsVersion: void 0\n };\n if (!VL_MODE_RAW_VALID_VALUES.includes(vlModeRaw)) throw new Error(`the value ${vlModeRaw} is not a valid VL_MODE value, must be one of ${VL_MODE_RAW_VALID_VALUES}`);\n const raw = vlModeRaw;\n if ('vlm-ui-tars' === raw) return {\n vlMode: 'vlm-ui-tars',\n uiTarsVersion: UITarsModelVersion.V1_0\n };\n if ('vlm-ui-tars-doubao' === raw || 'vlm-ui-tars-doubao-1.5' === raw) return {\n vlMode: 'vlm-ui-tars',\n uiTarsVersion: UITarsModelVersion.DOUBAO_1_5_20B\n };\n return {\n vlMode: raw,\n uiTarsVersion: void 0\n };\n};\nconst parseVlModeAndUiTarsFromGlobalConfig = (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 {\n vlMode: 'qwen3-vl',\n uiTarsVersion: void 0\n };\n if (isQwen) return {\n vlMode: 'qwen-vl',\n uiTarsVersion: void 0\n };\n if (isDoubao) return {\n vlMode: 'doubao-vision',\n uiTarsVersion: void 0\n };\n if (isGemini) return {\n vlMode: 'gemini',\n uiTarsVersion: void 0\n };\n if (isUiTars) if ('1' === isUiTars) return {\n vlMode: 'vlm-ui-tars',\n uiTarsVersion: UITarsModelVersion.V1_0\n };\n else if ('DOUBAO' === isUiTars || 'DOUBAO-1.5' === isUiTars) return {\n vlMode: 'vlm-ui-tars',\n uiTarsVersion: UITarsModelVersion.DOUBAO_1_5_20B\n };\n else return {\n vlMode: 'vlm-ui-tars',\n uiTarsVersion: `${isUiTars}`\n };\n return {\n vlMode: void 0,\n uiTarsVersion: void 0\n };\n};\nexport { parseVlModeAndUiTarsFromGlobalConfig, parseVlModeAndUiTarsModelVersionFromRawValue };\n","import { DEFAULT_MODEL_CONFIG_KEYS, DEFAULT_MODEL_CONFIG_KEYS_LEGACY, GROUNDING_MODEL_CONFIG_KEYS, PLANNING_MODEL_CONFIG_KEYS, VQA_MODEL_CONFIG_KEYS } from \"./constants.mjs\";\nimport { getDebug } from \"../logger.mjs\";\nimport { assert } from \"../utils.mjs\";\nimport { createAssert, maskConfig, parseJson } from \"./helper.mjs\";\nimport { initDebugConfig } from \"./init-debug.mjs\";\nimport { parseVlModeAndUiTarsFromGlobalConfig, parseVlModeAndUiTarsModelVersionFromRawValue } from \"./parse.mjs\";\nconst KEYS_MAP = {\n VQA: VQA_MODEL_CONFIG_KEYS,\n grounding: GROUNDING_MODEL_CONFIG_KEYS,\n planning: PLANNING_MODEL_CONFIG_KEYS,\n default: DEFAULT_MODEL_CONFIG_KEYS\n};\nconst decideOpenaiSdkConfig = ({ keys, provider, valueAssert })=>{\n initDebugConfig();\n const debugLog = getDebug('ai:config');\n const socksProxy = provider[keys.socksProxy];\n const httpProxy = provider[keys.httpProxy];\n const vlMode = provider[keys.vlMode];\n debugLog('enter decideOpenaiSdkConfig with keys:', keys);\n const openaiBaseURL = provider[keys.openaiBaseURL];\n const openaiApiKey = provider[keys.openaiApiKey];\n const openaiExtraConfig = parseJson(keys.openaiExtraConfig, provider[keys.openaiExtraConfig]);\n valueAssert(openaiApiKey, keys.openaiApiKey);\n return {\n socksProxy,\n httpProxy,\n vlModeRaw: vlMode,\n openaiBaseURL,\n openaiApiKey,\n openaiExtraConfig\n };\n};\nconst getModelDescription = (vlMode, uiTarsVersion)=>{\n if (vlMode) if (uiTarsVersion) return `UI-TARS=${uiTarsVersion}`;\n else return `${vlMode} mode`;\n return '';\n};\nconst decideModelConfigFromIntentConfig = (intent, intentConfig)=>{\n const debugLog = getDebug('ai:config');\n debugLog('decideModelConfig base on agent.modelConfig()');\n const keysForFn = KEYS_MAP[intent];\n const candidateModelNameFromConfig = intentConfig[keysForFn.modelName];\n debugLog('Got modelName from modelConfigFn', candidateModelNameFromConfig);\n const chosenKeys = (()=>{\n if (candidateModelNameFromConfig) {\n debugLog('query modelConfig from fn by intent got corresponding modelName, will get other corresponding keys');\n return keysForFn;\n }\n debugLog('query modelConfig from fn by intent got no corresponding modelName, will get other keys by default');\n assert(intentConfig[DEFAULT_MODEL_CONFIG_KEYS.modelName], `The return value of agent.modelConfig do not have a valid value with key ${DEFAULT_MODEL_CONFIG_KEYS.modelName}.`);\n return DEFAULT_MODEL_CONFIG_KEYS;\n })();\n const result = decideOpenaiSdkConfig({\n keys: chosenKeys,\n provider: intentConfig,\n valueAssert: createAssert(chosenKeys.modelName, 'modelConfig', candidateModelNameFromConfig)\n });\n const { vlMode, uiTarsVersion } = parseVlModeAndUiTarsModelVersionFromRawValue(result.vlModeRaw);\n const modelDescription = getModelDescription(vlMode, uiTarsVersion);\n const finalResult = {\n ...result,\n modelName: intentConfig[chosenKeys.modelName],\n vlMode,\n uiTarsModelVersion: uiTarsVersion,\n modelDescription,\n from: 'modelConfig',\n intent\n };\n debugLog(`decideModelConfig result by agent.modelConfig() with intent ${intent}:`, maskConfig(finalResult));\n return finalResult;\n};\nconst decideModelConfigFromEnv = (intent, allEnvConfig)=>{\n initDebugConfig();\n const debugLog = getDebug('ai:config');\n const keysForEnv = 'default' === intent ? DEFAULT_MODEL_CONFIG_KEYS_LEGACY : KEYS_MAP[intent];\n if ('default' !== intent && allEnvConfig[keysForEnv.modelName]) {\n const modelName = allEnvConfig[keysForEnv.modelName];\n debugLog(`Got intent ${intent} corresponding modelName ${modelName} by key ${keysForEnv.modelName} from globalConfig, will get other config by intent.`);\n const result = decideOpenaiSdkConfig({\n keys: keysForEnv,\n provider: allEnvConfig,\n valueAssert: createAssert(keysForEnv.modelName, 'process.env', modelName)\n });\n const { vlMode, uiTarsVersion } = parseVlModeAndUiTarsModelVersionFromRawValue(result.vlModeRaw);\n const modelDescription = getModelDescription(vlMode, uiTarsVersion);\n const finalResult = {\n ...result,\n modelName,\n vlMode,\n uiTarsModelVersion: uiTarsVersion,\n modelDescription,\n from: 'env',\n intent\n };\n debugLog(`decideModelConfig result by process.env with intent ${intent}:`, maskConfig(finalResult));\n return finalResult;\n }\n debugLog(`decideModelConfig as legacy logic with intent ${intent}.`);\n const result = decideOpenaiSdkConfig({\n keys: DEFAULT_MODEL_CONFIG_KEYS_LEGACY,\n provider: allEnvConfig,\n valueAssert: createAssert(DEFAULT_MODEL_CONFIG_KEYS_LEGACY.modelName, 'process.env')\n });\n const { vlMode, uiTarsVersion } = parseVlModeAndUiTarsFromGlobalConfig(allEnvConfig);\n const modelDescription = getModelDescription(vlMode, uiTarsVersion);\n const finalResult = {\n ...result,\n modelName: allEnvConfig[DEFAULT_MODEL_CONFIG_KEYS_LEGACY.modelName] || 'gpt-4o',\n vlMode,\n uiTarsModelVersion: uiTarsVersion,\n modelDescription,\n from: 'legacy-env',\n intent\n };\n debugLog(`decideModelConfig result by legacy logic with intent ${intent}:`, maskConfig(finalResult));\n return finalResult;\n};\nexport { decideModelConfigFromEnv, decideModelConfigFromIntentConfig, decideOpenaiSdkConfig };\n","import { decideModelConfigFromEnv, decideModelConfigFromIntentConfig } from \"./decide-model-config.mjs\";\nimport { VL_MODE_RAW_VALID_VALUES } 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}\nconst ALL_INTENTS = [\n 'VQA',\n 'default',\n 'grounding',\n 'planning'\n];\nclass ModelConfigManager {\n calcIntentConfigMap(modelConfigFn) {\n const intentConfigMap = {\n VQA: void 0,\n default: void 0,\n grounding: void 0,\n planning: void 0\n };\n for (const i of ALL_INTENTS){\n const result = modelConfigFn({\n intent: i\n });\n if (!result) throw new Error(`The agent has an option named modelConfig is a function, but it return ${result} when call with intent ${i}, which should be a object.`);\n intentConfigMap[i] = result;\n }\n return intentConfigMap;\n }\n calcModelConfigMapBaseOnIntent(intentConfigMap) {\n const modelConfigMap = {\n VQA: void 0,\n default: void 0,\n grounding: void 0,\n planning: void 0\n };\n for (const i of ALL_INTENTS){\n const result = decideModelConfigFromIntentConfig(i, intentConfigMap[i]);\n modelConfigMap[i] = {\n ...result,\n createOpenAIClient: this.createOpenAIClientFn\n };\n }\n return modelConfigMap;\n }\n calcModelConfigMapBaseOnEnv(allEnvConfig) {\n const modelConfigMap = {\n VQA: void 0,\n default: void 0,\n grounding: void 0,\n planning: void 0\n };\n for (const i of ALL_INTENTS){\n const result = decideModelConfigFromEnv(i, allEnvConfig);\n modelConfigMap[i] = {\n ...result,\n createOpenAIClient: this.createOpenAIClientFn\n };\n }\n return modelConfigMap;\n }\n clearModelConfigMap() {\n if (this.isolatedMode) throw new Error('ModelConfigManager work in isolated mode, so clearModelConfigMap should not be called');\n this.modelConfigMap = void 0;\n }\n getModelConfig(intent) {\n let config;\n if (this.isolatedMode) {\n if (!this.modelConfigMap) throw new Error('modelConfigMap is not initialized in isolated mode, which should not happen');\n config = this.modelConfigMap[intent];\n } else {\n if (!this.modelConfigMap) {\n if (!this.globalConfigManager) throw new Error('globalConfigManager is not registered, which should not happen');\n this.modelConfigMap = this.calcModelConfigMapBaseOnEnv(this.globalConfigManager.getAllEnvConfig());\n }\n config = this.modelConfigMap[intent];\n }\n if ('planning' === intent && !config.vlMode) throw new Error(`Planning requires a vision language model (VL model). DOM-based planning is not supported.\n\nPlease configure one of the following VL modes:\n ${VL_MODE_RAW_VALID_VALUES.map((mode)=>`- ${mode}`).join('\\n ')}\n\nConfiguration examples:\n - Environment variable: MIDSCENE_PLANNING_VL_MODE=qwen-vl\n - Or use modelConfig function with planning intent\n\nLearn more: https://midscenejs.com/choose-a-model`);\n return config;\n }\n getUploadTestServerUrl() {\n const { openaiExtraConfig } = this.getModelConfig('default');\n const serverUrl = null == openaiExtraConfig ? void 0 : openaiExtraConfig.REPORT_SERVER_URL;\n return serverUrl;\n }\n registerGlobalConfigManager(globalConfigManager) {\n this.globalConfigManager = globalConfigManager;\n }\n throwErrorIfNonVLModel(intent = 'grounding') {\n const modelConfig = this.getModelConfig(intent);\n if (!modelConfig.vlMode) throw new Error('No visual language model (VL model) detected for the current scenario. Element localization may be inaccurate. Please verify your model configuration. Learn more: https://midscenejs.com/choose-a-model');\n }\n constructor(modelConfigFn, createOpenAIClientFn){\n _define_property(this, \"modelConfigMap\", void 0);\n _define_property(this, \"isolatedMode\", false);\n _define_property(this, \"globalConfigManager\", void 0);\n _define_property(this, \"createOpenAIClientFn\", void 0);\n this.createOpenAIClientFn = createOpenAIClientFn;\n if (modelConfigFn) {\n this.isolatedMode = true;\n const intentConfigMap = this.calcIntentConfigMap(modelConfigFn);\n this.modelConfigMap = this.calcModelConfigMapBaseOnIntent(intentConfigMap);\n }\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 type {\n AIUsageInfo,\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');\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 adaptQwenBbox(\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 if (Array.isArray(bbox) && Array.isArray(bbox[0])) {\n bbox = bbox[0];\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\nexport function adaptBbox(\n bbox: number[],\n width: number,\n height: number,\n rightLimit: number,\n bottomLimit: number,\n vlMode: TVlModeTypes | undefined,\n): [number, number, number, number] {\n let result: [number, number, number, number] = [0, 0, 0, 0];\n if (vlMode === 'doubao-vision' || vlMode === 'vlm-ui-tars') {\n result = adaptDoubaoBbox(bbox, width, height);\n } else if (vlMode === 'gemini') {\n result = adaptGeminiBbox(bbox, width, height);\n } else if (vlMode === 'qwen3-vl') {\n result = normalized01000(bbox, width, height);\n } else {\n result = adaptQwenBbox(bbox);\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>,\n zodSchema: z.ZodType<any>,\n): Record<string, any> => {\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","function truncateText(text, maxLength = 150) {\n if (void 0 === text) return '';\n if ('object' == typeof text) text = JSON.stringify(text);\n if ('number' == typeof text) return text.toString();\n if ('string' == typeof text && text.length > maxLength) return `${text.slice(0, maxLength)}...`;\n if ('string' == typeof text) return text.trim();\n return '';\n}\nfunction trimAttributes(attributes, truncateTextLength) {\n const tailorAttributes = Object.keys(attributes).reduce((res, currentKey)=>{\n const attributeVal = attributes[currentKey];\n if ('style' === currentKey || 'htmlTagName' === currentKey || 'nodeType' === currentKey) return res;\n res[currentKey] = truncateText(attributeVal, truncateTextLength);\n return res;\n }, {});\n return tailorAttributes;\n}\nconst nodeSizeThreshold = 4;\nfunction descriptionOfTree(tree, truncateTextLength, filterNonTextContent = false, visibleOnly = true) {\n const attributesString = (kv)=>Object.entries(kv).map(([key, value])=>`${key}=\"${truncateText(value, truncateTextLength)}\"`).join(' ');\n function buildContentTree(node, indent = 0, visibleOnly = true) {\n let before = '';\n let contentWithIndent = '';\n let after = '';\n let emptyNode = true;\n const indentStr = ' '.repeat(indent);\n let children = '';\n for(let i = 0; i < (node.children || []).length; i++){\n const childContent = buildContentTree(node.children[i], indent + 1, visibleOnly);\n if (childContent) children += `\\n${childContent}`;\n }\n if (node.node && node.node.rect.width > nodeSizeThreshold && node.node.rect.height > nodeSizeThreshold && (!filterNonTextContent || filterNonTextContent && node.node.content) && (!visibleOnly || visibleOnly && node.node.isVisible)) {\n var _node_node_attributes;\n emptyNode = false;\n let nodeTypeString;\n nodeTypeString = (null == (_node_node_attributes = node.node.attributes) ? void 0 : _node_node_attributes.htmlTagName) ? node.node.attributes.htmlTagName.replace(/[<>]/g, '') : node.node.attributes.nodeType.replace(/\\sNode$/, '').toLowerCase();\n const markerId = node.node.indexId;\n const markerIdString = markerId ? `markerId=\"${markerId}\"` : '';\n const rectAttribute = node.node.rect ? {\n left: node.node.rect.left,\n top: node.node.rect.top,\n width: node.node.rect.width,\n height: node.node.rect.height\n } : {};\n before = `<${nodeTypeString} id=\"${node.node.id}\" ${markerIdString} ${attributesString(trimAttributes(node.node.attributes || {}, truncateTextLength))} ${attributesString(rectAttribute)}>`;\n const content = truncateText(node.node.content, truncateTextLength);\n contentWithIndent = content ? `\\n${indentStr} ${content}` : '';\n after = `</${nodeTypeString}>`;\n } else if (!filterNonTextContent) {\n if (!children.trim().startsWith('<>')) {\n before = '<>';\n contentWithIndent = '';\n after = '</>';\n }\n }\n if (emptyNode && !children.trim()) return '';\n const result = `${indentStr}${before}${contentWithIndent}${children}\\n${indentStr}${after}`;\n if (result.trim()) return result;\n return '';\n }\n const result = buildContentTree(tree, 0, visibleOnly);\n return result.replace(/^\\s*\\n/gm, '');\n}\nfunction treeToList(tree) {\n const result = [];\n function dfs(node) {\n if (node.node) result.push(node.node);\n for (const child of node.children)dfs(child);\n }\n dfs(tree);\n return result;\n}\nfunction traverseTree(tree, onNode) {\n function dfs(node) {\n if (node.node) node.node = onNode(node.node);\n for (const child of node.children)dfs(child);\n }\n dfs(tree);\n return tree;\n}\nexport { descriptionOfTree, traverseTree, treeToList, trimAttributes, truncateText };\n","import { PromptTemplate } from '@langchain/core/prompts';\nimport type { TVlModeTypes } from '@midscene/shared/env';\nimport { bboxDescription } from './common';\nexport function systemPromptToLocateElement(vlMode: TVlModeTypes | undefined) {\n const bboxComment = bboxDescription(vlMode);\n return `\n## Role:\nYou are an expert in software testing.\n\n## Objective:\n- Identify elements in screenshots and text that match the user's description.\n- Give the coordinates of the element that matches the user's description best in the screenshot.\n- Determine whether the user's description is order-sensitive (e.g., contains phrases like 'the third item in the list', 'the last button', etc.).\n\n## Output Format:\n\\`\\`\\`json\n{\n \"bbox\": [number, number, number, number], // ${bboxComment}\n \"errors\"?: string[],\n \"isOrderSensitive\": boolean // Whether the targetElementDescription is order-sensitive (true/false)\n}\n\\`\\`\\`\n\nFields:\n* \\`bbox\\` is the bounding box of the element that matches the user's description best in the screenshot\n* \\`isOrderSensitive\\` is a boolean indicating whether the user's description is order-sensitive (true/false)\n* \\`errors\\` is an optional array of error messages (if any)\n\nOrder-sensitive means the description contains phrases like:\n- \"the third item in the list\"\n- \"the last button\"\n- \"the first input box\"\n- \"the second row\"\n\nNot order-sensitive means the description is like:\n- \"confirm button\"\n- \"search box\"\n- \"password input\"\n\nFor example, when an element is found and the description is order-sensitive:\n\\`\\`\\`json\n{\n \"bbox\": [100, 100, 200, 200],\n \"isOrderSensitive\": true,\n \"errors\": []\n}\n\\`\\`\\`\n\nWhen no element is found and the description is not order-sensitive:\n\\`\\`\\`json\n{\n \"bbox\": [],\n \"isOrderSensitive\": false,\n \"errors\": [\"I can see ..., but {some element} is not found\"]\n}\n\\`\\`\\`\n`;\n}\n\nexport const findElementPrompt = new PromptTemplate({\n template: `\nHere is the item user want to find:\n=====================================\n{targetElementDescription}\n=====================================\n\n{pageDescription}\n `,\n inputVariables: ['pageDescription', 'targetElementDescription'],\n});\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 { PromptTemplate } from '@langchain/core/prompts';\nimport type { TVlModeTypes } from '@midscene/shared/env';\nimport { bboxDescription } from './common';\n\nexport function systemPromptToLocateSection(vlMode: TVlModeTypes | undefined) {\n return `\nYou goal is to find out one section containing the target element in the screenshot, put it in the \\`bbox\\` field. If the user describe the target element with some reference elements, you should also find the section containing the reference elements, put it in the \\`references_bbox\\` field.\n\nUsually, it should be approximately an area not more than 300x300px. Changes of the size are allowed if there are many elements to cover.\n\nreturn in this JSON format:\n\\`\\`\\`json\n{\n \"bbox\": [number, number, number, number],\n \"references_bbox\"?: [\n [number, number, number, number],\n [number, number, number, number],\n ...\n ],\n \"error\"?: string\n}\n\\`\\`\\`\n\nIn which, all the numbers in the \\`bbox\\` and \\`references_bbox\\` represent ${bboxDescription(vlMode)}.\n\nFor example, if the user describe the target element as \"the delete button on the second row with title 'Peter'\", you should put the bounding box of the delete button in the \\`bbox\\` field, and the bounding box of the second row in the \\`references_bbox\\` field.\n\nthe return value should be like this:\n\\`\\`\\`json\n{\n \"bbox\": [100, 100, 200, 200],\n \"references_bbox\": [[100, 100, 200, 200]]\n}\n\\`\\`\\`\n`;\n}\n\nexport const sectionLocatorInstruction = new PromptTemplate({\n template: `Here is the target element user interested in:\n<targetDescription>\n{sectionDescription}\n</targetDescription>\n `,\n inputVariables: ['sectionDescription'],\n});\n","import type {\n AIDataExtractionResponse,\n AIElementLocatorResponse,\n AIElementResponse,\n AISectionLocatorResponse,\n AIUsageInfo,\n BaseElement,\n ElementById,\n InsightExtractOption,\n Rect,\n ReferenceImage,\n UIContext,\n} from '@/types';\nimport type { IModelConfig } from '@midscene/shared/env';\nimport {\n cropByRect,\n paddingToMatchBlockByBase64,\n preProcessImageUrl,\n} from '@midscene/shared/img';\nimport { getDebug } from '@midscene/shared/logger';\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 describeUserPage,\n distance,\n distanceThreshold,\n elementByPositionWithElementInfo,\n} from './prompt/util';\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: `reference image ${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<\n ElementType extends BaseElement = BaseElement,\n>(options: {\n context: UIContext<ElementType>;\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: AIElementLocatorResponse;\n rect?: Rect;\n rawResponse: string;\n elementById: ElementById;\n usage?: AIUsageInfo;\n isOrderSensitive?: boolean;\n}> {\n const { context, targetElementDescription, callAIFn, modelConfig } = options;\n const { vlMode } = modelConfig;\n const { screenshotBase64 } = context;\n\n const { description, elementById, insertElementByPosition } =\n await describeUserPage(context, { vlMode });\n\n assert(\n targetElementDescription,\n 'cannot find the target element description',\n );\n const userInstructionPrompt = await findElementPrompt.format({\n pageDescription: description,\n targetElementDescription: extraTextFromUserPrompt(targetElementDescription),\n });\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 === 'qwen-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: AIElementLocatorResponse['elements'] =\n 'elements' in res.content ? res.content.elements : [];\n let errors: AIElementLocatorResponse['errors'] | undefined =\n 'errors' in res.content ? res.content.errors : [];\n try {\n if ('bbox' in res.content && Array.isArray(res.content.bbox)) {\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 let element = elementByPositionWithElementInfo(context.tree, rectCenter);\n\n const distanceToCenter = element\n ? distance({ x: element.center[0], y: element.center[1] }, rectCenter)\n : 0;\n\n if (!element || distanceToCenter > distanceThreshold) {\n element = insertElementByPosition(rectCenter);\n }\n\n if (element) {\n matchedElements = [element];\n errors = [];\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,\n errors,\n },\n rawResponse,\n elementById,\n usage: res.usage,\n isOrderSensitive:\n typeof res.content === 'object' &&\n res.content !== null &&\n 'isOrderSensitive' in res.content\n ? (res.content as any).isOrderSensitive\n : undefined,\n };\n}\n\nexport async function AiLocateSection(options: {\n context: UIContext<BaseElement>;\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 = await sectionLocatorInstruction.format({\n sectionDescription: 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 === 'qwen-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<\n T,\n ElementType extends BaseElement = BaseElement,\n>(options: {\n dataQuery: string | Record<string, string>;\n multimodalPrompt?: TMultimodalPrompt;\n context: UIContext<ElementType>;\n extractOption?: InsightExtractOption;\n modelConfig: IModelConfig;\n}) {\n const { dataQuery, context, extractOption, multimodalPrompt, modelConfig } =\n options;\n const { vlMode } = modelConfig;\n const systemPrompt = systemPromptToExtract();\n\n const { screenshotBase64 } = context;\n\n const { description, elementById } = await describeUserPage(context, {\n truncateTextLength: 200,\n filterNonTextContent: false,\n visibleOnly: false,\n domIncluded: extractOption?.domIncluded,\n vlMode,\n });\n\n const extractDataPromptText = await extractDataQueryPrompt(\n description,\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 elementById,\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 },\n): Promise<PlanningAIResponse> {\n const { context, modelConfig, conversationHistory } = opts;\n const { screenshotBase64, size } = context;\n\n const { vlMode } = modelConfig;\n\n // Planning requires VL mode (validated by ModelConfigManager.getModelConfig)\n assert(vlMode, 'Planning requires vlMode to be configured.');\n\n const systemPrompt = await systemPromptToTaskPlanning({\n actionSpace: opts.actionSpace,\n vlMode: vlMode,\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 === 'qwen-vl') {\n const paddedResult = await paddingToMatchBlockByBase64(imagePayload);\n imageWidth = paddedResult.width;\n imageHeight = paddedResult.height;\n imagePayload = paddedResult.imageBase64;\n }\n\n const historyLog = opts.conversationHistory?.snapshot() || [];\n // .filter((item) => item.role === 'assistant') || [];\n\n const knowledgeContext: ChatCompletionMessageParam[] = opts.actionContext\n ? [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `<high_priority_knowledge>${opts.actionContext}</high_priority_knowledge>`,\n },\n ],\n },\n ]\n : [];\n\n const instruction: ChatCompletionMessageParam[] = [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `<user_instruction>${userInstruction}</user_instruction>`,\n },\n ],\n },\n ];\n\n const msgs: ChatCompletionMessageParam[] = [\n { role: 'system', content: systemPrompt },\n ...knowledgeContext,\n ...instruction,\n ...historyLog,\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imagePayload,\n detail: 'high',\n },\n },\n // Planning uses pure vision mode, no DOM description needed\n ],\n },\n ];\n\n const { content: planFromAI, usage } =\n await callAIWithObjectResponse<RawResponsePlanningAIResponse>(\n msgs,\n AIActionType.PLAN,\n modelConfig,\n );\n const rawResponse = JSON.stringify(planFromAI, undefined, 2);\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) {\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 // in Qwen-VL, error means error. In GPT-4o, error may mean more actions are needed.\n assert(!planFromAI.error, `Failed to plan actions: ${planFromAI.error}`);\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 conversationHistory?.append({\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'I have finished the action previously planned',\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 | '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 },\n): Promise<PlanningAIResponse> {\n const { conversationHistory, context, modelConfig } = options;\n const { uiTarsModelVersion } = modelConfig;\n const systemPrompt = getUiTarsPlanningPrompt() + userInstruction;\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 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 === '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 }\n });\n\n if (transformActions.length === 0) {\n throw new Error(`No actions found, response: ${res.content}`, {\n cause: {\n prediction: res.content,\n parsed,\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 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 | 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 '@/ai-model/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 return content.replace(/\\$\\{([^}]+)\\}/g, (_, envVar) => {\n const value = process.env[envVar.trim()];\n if (value === undefined) {\n throw new Error(`Environment variable \"${envVar.trim()}\" is not defined`);\n }\n return value;\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';\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 '@/ai-model/common';\nimport type {\n DeviceAction,\n FreeFn,\n LocateOption,\n MidsceneYamlFlowItemAIAction,\n MidsceneYamlFlowItemAIAsk,\n MidsceneYamlFlowItemAIAssert,\n MidsceneYamlFlowItemAIBoolean,\n MidsceneYamlFlowItemAILocate,\n MidsceneYamlFlowItemAINumber,\n MidsceneYamlFlowItemAIQuery,\n MidsceneYamlFlowItemAIString,\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');\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 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 prompt = actionTask.aiAct || actionTask.aiAction || actionTask.ai;\n assert(prompt, 'missing prompt for ai (aiAct)');\n await agent.aiAct(prompt, {\n cacheable: actionTask.cacheable,\n });\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 ('aiQuery' in (flowItem as MidsceneYamlFlowItemAIQuery)) {\n const queryTask = flowItem as MidsceneYamlFlowItemAIQuery;\n const prompt = queryTask.aiQuery;\n const options = {\n domIncluded: queryTask.domIncluded,\n screenshotIncluded: queryTask.screenshotIncluded,\n };\n assert(prompt, 'missing prompt for aiQuery');\n const queryResult = await agent.aiQuery(prompt, options);\n this.setResult(queryTask.name, queryResult);\n } else if ('aiNumber' in (flowItem as MidsceneYamlFlowItemAINumber)) {\n const numberTask = flowItem as MidsceneYamlFlowItemAINumber;\n const prompt = numberTask.aiNumber;\n const options = {\n domIncluded: numberTask.domIncluded,\n screenshotIncluded: numberTask.screenshotIncluded,\n };\n assert(prompt, 'missing prompt for aiNumber');\n const numberResult = await agent.aiNumber(prompt, options);\n this.setResult(numberTask.name, numberResult);\n } else if ('aiString' in (flowItem as MidsceneYamlFlowItemAIString)) {\n const stringTask = flowItem as MidsceneYamlFlowItemAIString;\n const prompt = stringTask.aiString;\n const options = {\n domIncluded: stringTask.domIncluded,\n screenshotIncluded: stringTask.screenshotIncluded,\n };\n assert(prompt, 'missing prompt for aiString');\n const stringResult = await agent.aiString(prompt, options);\n this.setResult(stringTask.name, stringResult);\n } else if ('aiBoolean' in (flowItem as MidsceneYamlFlowItemAIBoolean)) {\n const booleanTask = flowItem as MidsceneYamlFlowItemAIBoolean;\n const prompt = booleanTask.aiBoolean;\n const options = {\n domIncluded: booleanTask.domIncluded,\n screenshotIncluded: booleanTask.screenshotIncluded,\n };\n assert(prompt, 'missing prompt for aiBoolean');\n const booleanResult = await agent.aiBoolean(prompt, options);\n this.setResult(booleanTask.name, booleanResult);\n } else if ('aiAsk' in (flowItem as MidsceneYamlFlowItemAIAsk)) {\n const askTask = flowItem as MidsceneYamlFlowItemAIAsk;\n const prompt = askTask.aiAsk;\n assert(prompt, 'missing prompt for aiAsk');\n const askResult = await agent.aiAsk(prompt);\n this.setResult(askTask.name, askResult);\n } else if ('aiLocate' in (flowItem as MidsceneYamlFlowItemAILocate)) {\n const locateTask = flowItem as MidsceneYamlFlowItemAILocate;\n const prompt = locateTask.aiLocate;\n assert(prompt, 'missing prompt for aiLocate');\n const locateResult = await agent.aiLocate(prompt, locateTask);\n this.setResult(locateTask.name, locateResult);\n } else if ('aiWaitFor' in (flowItem as MidsceneYamlFlowItemAIWaitFor)) {\n const waitForTask = flowItem as MidsceneYamlFlowItemAIWaitFor;\n const prompt = waitForTask.aiWaitFor;\n assert(prompt, 'missing prompt for aiWaitFor');\n const timeout = waitForTask.timeout;\n await agent.aiWaitFor(prompt, { timeoutMs: timeout });\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 const matchedAction = actionSpace.find((action) => {\n const actionInterfaceAlias = action.interfaceAlias;\n if (\n actionInterfaceAlias &&\n Object.prototype.hasOwnProperty.call(flowItem, actionInterfaceAlias)\n ) {\n locatePromptShortcut = flowItem[\n actionInterfaceAlias as keyof typeof flowItem\n ] as string;\n return true;\n }\n\n const keyOfActionInActionSpace = action.name;\n if (\n Object.prototype.hasOwnProperty.call(\n flowItem,\n keyOfActionInActionSpace,\n )\n ) {\n locatePromptShortcut = flowItem[\n keyOfActionInActionSpace as keyof typeof flowItem\n ] as string;\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 // Create a new object instead of mutating the original flowItem\n // This prevents issues when the same YAML script is executed multiple times\n const flowItemForProcessing = locatePromptShortcut\n ? { ...flowItem, prompt: locatePromptShortcut }\n : flowItem;\n\n const { locateParam, restParams } =\n buildDetailedLocateParamAndRestParams(\n locatePromptShortcut || '',\n flowItemForProcessing 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 await agent.callActionInActionSpace(matchedAction.name, flowParams);\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 const paramObj: Record<string, unknown> = { ...options };\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 return await activeAgent.callActionInActionSpace(action.name, {\n locate: detailedLocateParam,\n ...options,\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: '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\";\nconst useServerValid = function() {\n let shouldRun = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 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 ()=>{\n while(!interruptFlag){\n const playgroundSDK = new PlaygroundSDK({\n type: 'remote-execution'\n });\n const status = await playgroundSDK.checkStatus();\n status ? setServerValid(true) : setServerValid(false);\n await 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 \"./index.css\";\nconst LogoUrl = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/vhaeh7vhabf/Midscene.png';\nconst Logo = (param)=>{\n let { hideLogo = false } = param;\n if (hideLogo) return null;\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: \"https://lf3-static.bytednsdoc.com/obj/eden-cn/vhaeh7vhabf/Midscene.png\"\n })\n })\n });\n};\nexport { Logo, LogoUrl };\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(param) {\n let { showTooltipWhenEmpty = true, showModelName = true, tooltipPlacement = 'bottom', mode = 'icon' } = param;\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(param) {\n let { showEnvConfig = true, showTooltipWhenEmpty = false, showModelName = false, githubUrl = 'https://github.com/web-infra-dev/midscene', helpUrl = 'https://midscenejs.com/quick-experience.html', className = '' } = param;\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 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, apiMetadata, deepThinkTip, defaultMainButtons, domIncludedTip, screenshotIncludedTip, trackingTip };\n","import dayjs from \"dayjs\";\nfunction timeStr(timestamp) {\n return timestamp ? dayjs(timestamp).format('YYYY-MM-DD HH:mm:ss') : '-';\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, mouseLoading, mousePointer, timeStr };\n","import type {\n DetailedLocateParam,\n ExecutionTask,\n ExecutionTaskAction,\n ExecutionTaskInsightAssertion,\n ExecutionTaskInsightLocate,\n ExecutionTaskInsightQuery,\n ExecutionTaskPlanning,\n PullParam,\n ScrollParam,\n} from '@/types';\n\nexport function typeStr(task: ExecutionTask) {\n return task.subType && task.subType !== 'Plan'\n ? `${task.type} / ${task.subType || ''}`\n : 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 if (typeof locate.prompt === 'string') {\n return locate.prompt;\n }\n\n if (typeof locate.prompt === 'object' && locate.prompt.prompt) {\n const prompt = locate.prompt.prompt;\n const images = locate.prompt.images || [];\n\n if (images.length === 0) return prompt;\n\n const imagesStr = images\n .map((image) => {\n let url = image.url;\n if (\n url.startsWith('data:image/') ||\n (url.startsWith('data:') && url.includes('base64'))\n ) {\n url = `${url.substring(0, 15)}...`;\n }\n return `[${image.name}](${url})`;\n })\n .join(', ');\n\n return `${prompt}, ${imagesStr}`;\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 || 'once'}, ${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 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 value = (task as ExecutionTaskPlanning)?.param?.userInstruction;\n }\n\n if (task.type === 'Insight') {\n value =\n locateParamStr((task as ExecutionTaskInsightLocate)?.param) ||\n (task as ExecutionTaskInsightLocate)?.param?.id ||\n (task as ExecutionTaskInsightQuery)?.param?.dataDemand ||\n (task as ExecutionTaskInsightAssertion)?.param?.assertion;\n }\n\n if (task.type === 'Action') {\n const locate = (task as ExecutionTaskAction)?.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 }\n\n if (locateStr) {\n if (value) {\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' && locateParamStr(value as any)) {\n return locateParamStr(value as any);\n }\n\n return JSON.stringify(value, undefined, 2);\n}\n","import { AIActionType, type AIArgs, expandSearchArea } from '@/ai-model/common';\nimport {\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 type {\n AIDescribeElementResponse,\n AIUsageInfo,\n BaseElement,\n DetailedLocateParam,\n InsightAction,\n InsightExtractOption,\n InsightExtractParam,\n InsightExtractResult,\n InsightTaskInfo,\n LocateResultWithDump,\n PartialInsightDumpFromSDK,\n Rect,\n UIContext,\n} from '@/types';\nimport { InsightError } 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 '../ai-model/common';\nimport { createInsightDump } from './utils';\n\nexport interface LocateOpts {\n context?: UIContext<BaseElement>;\n}\n\nexport type AnyValue<T> = {\n [K in keyof T]: unknown extends T[K] ? any : T[K];\n};\n\ninterface InsightOptions {\n taskInfo?: Omit<InsightTaskInfo, 'durationMs'>;\n aiVendorFn?: typeof callAIWithObjectResponse;\n}\n\nconst debug = getDebug('ai:insight');\nexport default class Insight<\n ElementType extends BaseElement = BaseElement,\n ContextType extends UIContext<ElementType> = UIContext<ElementType>,\n> {\n contextRetrieverFn: () => Promise<ContextType> | ContextType;\n\n aiVendorFn: Exclude<InsightOptions['aiVendorFn'], undefined> =\n callAIWithObjectResponse;\n\n taskInfo?: Omit<InsightTaskInfo, 'durationMs'>;\n\n constructor(\n context: ContextType | (() => Promise<ContextType> | ContextType),\n opt?: InsightOptions,\n ) {\n assert(context, 'context is required for Insight');\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 {\n parseResult,\n rect,\n elementById,\n rawResponse,\n usage,\n isOrderSensitive,\n } = 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: InsightTaskInfo = {\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 = `AI model failed to locate: \\n${parseResult.errors.join('\\n')}`;\n }\n\n const dumpData: PartialInsightDumpFromSDK = {\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: BaseElement[] = [];\n (parseResult.elements || []).forEach((item) => {\n if ('id' in item) {\n const element = elementById(item?.id);\n\n if (!element) {\n console.warn(\n `locate: cannot find element id=${item.id}. Maybe an unstable response from AI model`,\n );\n return;\n }\n elements.push(element);\n }\n });\n\n const dump = createInsightDump({\n ...dumpData,\n matchedElement: elements,\n });\n\n if (errorLog) {\n throw new InsightError(errorLog, dump);\n }\n\n if (elements.length > 1) {\n throw new InsightError(\n `locate: multiple elements found, length = ${elements.length}`,\n dump,\n );\n }\n\n if (elements.length === 1) {\n return {\n element: {\n id: elements[0]!.id,\n indexId: elements[0]!.indexId,\n center: elements[0]!.center,\n rect: elements[0]!.rect,\n xpaths: elements[0]!.xpaths || [],\n attributes: elements[0]!.attributes,\n isOrderSensitive,\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: InsightExtractParam,\n modelConfig: IModelConfig,\n opt?: InsightExtractOption,\n multimodalPrompt?: TMultimodalPrompt,\n ): Promise<InsightExtractResult<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 });\n\n const timeCost = Date.now() - startTime;\n const taskInfo: InsightTaskInfo = {\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: PartialInsightDumpFromSDK = {\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 = createInsightDump({\n ...dumpData,\n data,\n });\n\n if (errorLog && !data && !opt?.doNotThrowError) {\n throw new InsightError(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 insight.describe');\n const context = await this.contextRetrieverFn();\n const { screenshotBase64, size } = context;\n assert(screenshotBase64, 'screenshot is required for insight.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 === 'qwen-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 { elementByPositionWithElementInfo } from '@/ai-model';\nimport type { TMultimodalPrompt, TUserPrompt } from '@/ai-model/common';\nimport type { AbstractInterface } from '@/device';\nimport type {\n BaseElement,\n ElementCacheFeature,\n ElementTreeNode,\n ExecutionDump,\n ExecutionTask,\n ExecutorContext,\n LocateResultElement,\n PlanningLocateParam,\n UIContext,\n} from '@/types';\nimport { uploadTestInfoToServer } from '@/utils';\nimport { NodeType } from '@midscene/shared/constants';\nimport {\n MIDSCENE_REPORT_TAG_NAME,\n globalConfigManager,\n} from '@midscene/shared/env';\nimport {\n generateElementByPosition,\n getNodeFromCacheList,\n} 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 tree: {\n node: null,\n children: [],\n },\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 matchElementFromPlan(\n planLocateParam: PlanningLocateParam,\n tree: ElementTreeNode<BaseElement>,\n) {\n if (!planLocateParam) {\n return undefined;\n }\n if (planLocateParam.id) {\n return getNodeFromCacheList(planLocateParam.id);\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 let element = elementByPositionWithElementInfo(tree, centerPosition);\n\n if (!element) {\n element = generateElementByPosition(centerPosition) as BaseElement;\n }\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 id: uuid(),\n center: [\n Math.round(rect.left + rect.width / 2),\n Math.round(rect.top + rect.height / 2),\n ],\n rect,\n xpaths: [],\n attributes: {\n nodeType: NodeType.POSITION,\n },\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\nexport function trimContextByViewport(execution: ExecutionDump) {\n function filterVisibleTree(\n node: ElementTreeNode<BaseElement>,\n ): ElementTreeNode<BaseElement> | null {\n if (!node) return null;\n\n // recursively process all children\n const filteredChildren = Array.isArray(node.children)\n ? (node.children\n .map(filterVisibleTree)\n .filter((child) => child !== null) as ElementTreeNode<BaseElement>[])\n : [];\n\n // if the current node is visible, keep it and the filtered children\n if (node.node && node.node.isVisible === true) {\n return {\n ...node,\n children: filteredChildren,\n };\n }\n\n // if the current node is invisible, but has visible children, create an empty node to include these children\n if (filteredChildren.length > 0) {\n return {\n node: null,\n children: filteredChildren,\n };\n }\n\n // if the current node is invisible and has no visible children, return null\n return null;\n }\n\n return {\n ...execution,\n tasks: Array.isArray(execution.tasks)\n ? execution.tasks.map((task: ExecutionTask) => {\n const newTask = { ...task };\n if (task.uiContext?.tree) {\n newTask.uiContext = {\n ...task.uiContext,\n tree: filterVisibleTree(task.uiContext.tree) || {\n node: null,\n children: [],\n },\n };\n }\n return newTask;\n })\n : execution.tasks,\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 Insight from '@/insight';\nimport type {\n DetailedLocateParam,\n ElementCacheFeature,\n ExecutionTaskActionApply,\n ExecutionTaskApply,\n ExecutionTaskHitBy,\n ExecutionTaskInsightLocateApply,\n InsightDump,\n LocateResultElement,\n LocateResultWithDump,\n PlanningAction,\n PlanningActionParamSleep,\n PlanningLocateParam,\n Rect,\n} from '@/types';\nimport { InsightError } from '@/types';\nimport { sleep } from '@/utils';\nimport type { IModelConfig } from '@midscene/shared/env';\nimport { getDebug } from '@midscene/shared/logger';\nimport { assert } from '@midscene/shared/utils';\nimport type { TaskCache } from './task-cache';\nimport { matchElementFromCache, matchElementFromPlan } 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 locate,\n param: locate,\n thought: '',\n };\n return locatePlan;\n}\n\ninterface TaskBuilderDeps {\n interfaceInstance: AbstractInterface;\n insight: Insight;\n taskCache?: TaskCache;\n}\n\ninterface BuildOptions {\n cacheable?: boolean;\n subTask?: boolean;\n}\n\ninterface PlanBuildContext {\n tasks: ExecutionTaskApply[];\n modelConfig: IModelConfig;\n cacheable?: boolean;\n subTask: boolean;\n}\n\nexport class TaskBuilder {\n private readonly interface: AbstractInterface;\n\n private readonly insight: Insight;\n\n private readonly taskCache?: TaskCache;\n\n constructor({ interfaceInstance, insight, taskCache }: TaskBuilderDeps) {\n this.interface = interfaceInstance;\n this.insight = insight;\n this.taskCache = taskCache;\n }\n\n public async build(\n plans: PlanningAction[],\n modelConfig: 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 modelConfig,\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',\n subType: 'Finished',\n param: null,\n thought: plan.thought,\n locate: plan.locate,\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 locate: plan.locate,\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; locate?: PlanningAction['locate'] | null },\n ): ExecutionTaskActionApply<PlanningActionParamSleep> {\n return {\n type: 'Action',\n subType: 'Sleep',\n param,\n thought: meta?.thought,\n locate: meta?.locate ?? null,\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 if (!plan.locate || plan.locate === null) {\n debug('Locate action with id is null, will be ignored', plan);\n return;\n }\n\n const taskLocate = this.createLocateTask(plan, plan.locate, 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 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 } 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',\n any,\n { success: boolean; action: string; param: any },\n void\n > = {\n type: 'Action',\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 await actionFn(param, taskContext);\n debug('called action', action.name);\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: {\n success: true,\n action: planType,\n param: param,\n },\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 ): ExecutionTaskInsightLocateApply {\n const { cacheable, modelConfig } = context;\n let locateParam = detailedLocateParam;\n\n if (typeof locateParam === 'string') {\n locateParam = {\n prompt: locateParam,\n };\n }\n\n if (cacheable !== undefined) {\n locateParam = {\n ...locateParam,\n cacheable,\n };\n }\n\n const taskFind: ExecutionTaskInsightLocateApply = {\n type: 'Insight',\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?.id || 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.insight.contextRetrieverFn();\n }\n\n assert(uiContext, 'uiContext is required for Insight task');\n\n let locateDump: InsightDump | undefined;\n let locateResult: LocateResultWithDump | undefined;\n\n const applyDump = (dump?: InsightDump) => {\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 elementFromXpath: Rect | undefined;\n if (param.xpath && this.interface.rectMatchesCacheFeature) {\n elementFromXpath = await this.interface.rectMatchesCacheFeature({\n xpaths: [param.xpath],\n });\n }\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 elementFromPlan =\n !userExpectedPathHitFlag && !cacheHitFlag\n ? matchElementFromPlan(param, uiContext.tree)\n : undefined;\n const planHitFlag = !!elementFromPlan;\n\n let elementFromAiLocate: LocateResultElement | null | undefined;\n if (!userExpectedPathHitFlag && !cacheHitFlag && !planHitFlag) {\n try {\n locateResult = await this.insight.locate(\n param,\n {\n context: uiContext,\n },\n modelConfig,\n );\n applyDump(locateResult.dump);\n elementFromAiLocate = locateResult.element;\n } catch (error) {\n if (error instanceof InsightError) {\n applyDump(error.dump);\n }\n throw error;\n }\n }\n\n const element =\n elementFromXpath ||\n elementFromCache ||\n elementFromPlan ||\n 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 element.isOrderSensitive !== undefined\n ? { _orderSensitive: element.isOrderSensitive }\n : undefined,\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 InsightError(\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 } else if (planHitFlag) {\n hitBy = {\n from: 'Planning',\n context: {\n id: elementFromPlan?.id,\n bbox: elementFromPlan?.bbox,\n },\n };\n }\n\n onResult?.(element);\n\n return {\n output: {\n element,\n },\n hitBy,\n };\n },\n };\n\n return taskFind;\n }\n}\n","import { ConversationHistory, plan, uiTarsPlanning } from '@/ai-model';\nimport type { TMultimodalPrompt, TUserPrompt } from '@/ai-model/common';\nimport type { AbstractInterface } from '@/device';\nimport type Insight from '@/insight';\nimport type { TaskRunner } from '@/task-runner';\nimport type {\n ExecutionTaskApply,\n ExecutionTaskInsightQueryApply,\n ExecutionTaskPlanningApply,\n ExecutionTaskProgressOptions,\n InsightDump,\n InsightExtractOption,\n InsightExtractParam,\n InterfaceType,\n MidsceneYamlFlowItem,\n PlanningAIResponse,\n PlanningAction,\n PlanningActionParamSleep,\n PlanningActionParamWaitFor,\n} from '@/types';\nimport { InsightError } from '@/types';\nimport {\n type IModelConfig,\n MIDSCENE_REPLANNING_CYCLE_LIMIT,\n globalConfigManager,\n} 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 { taskTitleStr } from './ui-utils';\nimport { parsePrompt } from './utils';\n\ninterface ExecutionResult<OutputType = any> {\n output: OutputType;\n thought?: string;\n runner: TaskRunner;\n}\n\nconst debug = getDebug('device-task-executor');\nconst defaultReplanningCycleLimit = 10;\nconst defaultVlmUiTarsReplanningCycleLimit = 40;\n\nexport class TaskExecutor {\n interface: AbstractInterface;\n\n insight: Insight;\n\n taskCache?: TaskCache;\n\n private readonly taskBuilder: TaskBuilder;\n\n private conversationHistory: ConversationHistory;\n\n onTaskStartCallback?: ExecutionTaskProgressOptions['onTaskStart'];\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 insight: Insight,\n opts: {\n taskCache?: TaskCache;\n onTaskStart?: ExecutionTaskProgressOptions['onTaskStart'];\n replanningCycleLimit?: number;\n },\n ) {\n this.interface = interfaceInstance;\n this.insight = insight;\n this.taskCache = opts.taskCache;\n this.onTaskStartCallback = opts?.onTaskStart;\n this.replanningCycleLimit = opts.replanningCycleLimit;\n this.conversationHistory = new ConversationHistory();\n this.taskBuilder = new TaskBuilder({\n interfaceInstance,\n insight,\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.insight.contextRetrieverFn()),\n {\n onTaskStart: this.onTaskStartCallback,\n tasks: options?.tasks,\n },\n );\n }\n\n public async convertPlanToExecutable(\n plans: PlanningAction[],\n modelConfig: IModelConfig,\n options?: {\n cacheable?: boolean;\n subTask?: boolean;\n },\n ) {\n return this.taskBuilder.build(plans, modelConfig, options);\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 locate: null,\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 await session.appendAndRun(task);\n\n return {\n runner: session.getRunner(),\n };\n }\n\n private createPlanningTask(\n userInstruction: string,\n actionContext: string | undefined,\n modelConfig: IModelConfig,\n ): ExecutionTaskPlanningApply {\n const task: ExecutionTaskPlanningApply = {\n type: 'Planning',\n subType: 'Plan',\n locate: null,\n param: {\n userInstruction,\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 } = modelConfig;\n const uiTarsModelVersion =\n vlMode === 'vlm-ui-tars' ? modelConfig.uiTarsModelVersion : 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 ? uiTarsPlanning : plan)(\n param.userInstruction,\n {\n context: uiContext,\n actionContext,\n interfaceType: this.interface.interfaceType as InterfaceType,\n actionSpace,\n modelConfig,\n conversationHistory: this.conversationHistory,\n },\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\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 if (finalActions.length === 0) {\n assert(\n !more_actions_needed_by_instruction || sleep,\n error ? `Failed to plan: ${error}` : 'No plan found',\n );\n }\n\n return {\n output: {\n actions: finalActions,\n more_actions_needed_by_instruction,\n log,\n yamlFlow: planResult.yamlFlow,\n },\n cache: {\n hit: false,\n },\n uiContext,\n };\n },\n };\n\n return task;\n }\n\n async runPlans(\n title: string,\n plans: PlanningAction[],\n modelConfig: IModelConfig,\n ): Promise<ExecutionResult> {\n const session = this.createExecutionSession(title);\n const { tasks } = await this.convertPlanToExecutable(plans, modelConfig);\n const result = await session.appendAndRun(tasks);\n const { output } = result!;\n return {\n output,\n runner: session.getRunner(),\n };\n }\n\n private getReplanningCycleLimit(isVlmUiTars: boolean) {\n return (\n this.replanningCycleLimit ||\n globalConfigManager.getEnvConfigInNumber(\n MIDSCENE_REPLANNING_CYCLE_LIMIT,\n ) ||\n (isVlmUiTars\n ? defaultVlmUiTarsReplanningCycleLimit\n : defaultReplanningCycleLimit)\n );\n }\n\n async action(\n userPrompt: string,\n modelConfig: IModelConfig,\n actionContext?: string,\n cacheable?: boolean,\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 = this.getReplanningCycleLimit(\n modelConfig.vlMode === 'vlm-ui-tars',\n );\n\n // Main planning loop - unified plan/replan logic\n while (true) {\n if (replanCount > replanningCycleLimit) {\n const errorMsg = `Replanning ${replanningCycleLimit} times, which is more than the limit, please split the task into multiple steps`;\n\n return session.appendErrorPlan(errorMsg);\n }\n\n // Create planning task (automatically includes execution history if available)\n const planningTask = this.createPlanningTask(\n userPrompt,\n actionContext,\n modelConfig,\n );\n\n const result = await session.appendAndRun(planningTask);\n const planResult: PlanningAIResponse = result?.output;\n if (session.isInErrorState()) {\n return {\n output: planResult,\n runner,\n };\n }\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(plans, modelConfig, {\n cacheable,\n subTask: true,\n });\n await session.appendAndRun(executables.tasks);\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 (session.isInErrorState()) {\n return {\n output: undefined,\n runner,\n };\n }\n\n // Check if task is complete\n if (!planResult.more_actions_needed_by_instruction) {\n break;\n }\n\n // Increment replan count for next iteration\n replanCount++;\n }\n\n return {\n output: {\n yamlFlow,\n },\n runner,\n };\n }\n\n private createTypeQueryTask(\n type: 'Query' | 'Boolean' | 'Number' | 'String' | 'Assert' | 'WaitFor',\n demand: InsightExtractParam,\n modelConfig: IModelConfig,\n opt?: InsightExtractOption,\n multimodalPrompt?: TMultimodalPrompt,\n ) {\n const queryTask: ExecutionTaskInsightQueryApply = {\n type: 'Insight',\n subType: type,\n locate: null,\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: InsightDump | undefined;\n const applyDump = (dump: InsightDump) => {\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 try {\n extractResult = await this.insight.extract<any>(\n demandInput,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n } catch (error) {\n if (error instanceof InsightError) {\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 {\n assert(\n type !== 'WaitFor' ? data?.[keyOfResult] !== undefined : true,\n 'No result in query data',\n );\n outputResult = (data as any)[keyOfResult];\n }\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: InsightExtractParam,\n modelConfig: IModelConfig,\n opt?: InsightExtractOption,\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 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: session.getRunner(),\n };\n }\n\n private sleepPlan(timeMs: number): PlanningAction<PlanningActionParamSleep> {\n return {\n type: 'Sleep',\n param: {\n timeMs,\n },\n locate: null,\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 startTime = Date.now();\n let errorThought = '';\n while (Date.now() - overallStartTime < timeoutMs) {\n startTime = Date.now();\n const queryTask = await this.createTypeQueryTask(\n 'WaitFor',\n textPrompt,\n modelConfig,\n {\n doNotThrowError: true,\n },\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 - startTime < checkIntervalMs) {\n const timeRemaining = checkIntervalMs - (now - startTime);\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 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 Insight,\n type InsightAction,\n type InsightExtractOption,\n type InsightExtractParam,\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 type TUserPrompt,\n type TaskRunner,\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 {\n ModelConfigManager,\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 { TaskExecutor, locatePlanForLocate } from './tasks';\nimport { locateParamStr, paramStr, taskTitleStr, typeStr } from './ui-utils';\nimport {\n commonContextParser,\n getReportFileName,\n parsePrompt,\n printReportMsg,\n} from './utils';\nimport { trimContextByViewport } 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 defaultInsightExtractOption: InsightExtractOption = {\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\nexport class Agent<\n InterfaceType extends AbstractInterface = AbstractInterface,\n> {\n interface: InterfaceType;\n\n insight: Insight;\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 // @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 constructor(interfaceInstance: InterfaceType, opts?: AgentOpt) {\n this.interface = interfaceInstance;\n this.opts = Object.assign(\n {\n generateReport: true,\n autoPrintReportMsg: true,\n groupName: 'Midscene Report',\n groupDescription: '',\n },\n opts || {},\n );\n\n if (opts?.modelConfig && typeof opts?.modelConfig !== 'function') {\n throw new Error(\n `opts.modelConfig must be one of function or undefined, but got ${typeof opts?.modelConfig}`,\n );\n }\n this.modelConfigManager = opts?.modelConfig\n ? new ModelConfigManager(opts.modelConfig, opts?.createOpenAIClient)\n : globalModelConfigManager;\n\n this.onTaskStartTip = this.opts.onTaskStartTip;\n\n this.insight = new Insight(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.insight, {\n taskCache: this.taskCache,\n onTaskStart: this.callbackOnTaskStartTip.bind(this),\n replanningCycleLimit: this.opts.replanningCycleLimit,\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?: InsightAction): 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\n return this.dump;\n }\n\n appendExecutionDump(execution: ExecutionDump) {\n // use trimContextByViewport to process execution\n const trimmedExecution = trimContextByViewport(execution);\n const currentDump = this.dump;\n currentDump.executions.push(trimmedExecution);\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 private async afterTaskRunning(runner: TaskRunner, doNotThrowError = false) {\n const executionDump = runner.dump();\n if (this.opts.aiActionContext) {\n executionDump.aiActionContext = this.opts.aiActionContext;\n }\n this.appendExecutionDump(executionDump);\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 if (runner.isInErrorState() && !doNotThrowError) {\n const errorTask = runner.latestErrorTask();\n throw new Error(`${errorTask?.errorMessage}\\n${errorTask?.errorStack}`, {\n cause: errorTask?.error,\n });\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 modelConfig = this.modelConfigManager.getModelConfig('grounding');\n\n const { output, runner } = await this.taskExecutor.runPlans(\n title,\n plans,\n modelConfig,\n );\n await this.afterTaskRunning(runner);\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 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 },\n ) {\n const modelConfig = this.modelConfigManager.getModelConfig('planning');\n\n const cacheable = opt?.cacheable;\n // if vlm-ui-tars, plan cache is not used\n const isVlmUiTars = modelConfig.vlMode === 'vlm-ui-tars';\n const matchedCache =\n isVlmUiTars || cacheable === false\n ? undefined\n : this.taskCache?.matchPlanCache(taskPrompt);\n if (matchedCache && this.taskCache?.isCacheResultUsed) {\n // log into report file\n const { runner } = await this.taskExecutor.loadYamlFlowAsPlanning(\n taskPrompt,\n matchedCache.cacheContent?.yamlWorkflow,\n );\n\n await this.afterTaskRunning(runner);\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 const { output, runner } = await this.taskExecutor.action(\n taskPrompt,\n modelConfig,\n this.opts.aiActionContext,\n cacheable,\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 await this.afterTaskRunning(runner);\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: InsightExtractParam,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<ReturnType> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n const { output, runner } = await this.taskExecutor.createTypeQueryExecution(\n 'Query',\n demand,\n modelConfig,\n opt,\n );\n await this.afterTaskRunning(runner);\n return output as ReturnType;\n }\n\n async aiBoolean(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<boolean> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, runner } = await this.taskExecutor.createTypeQueryExecution(\n 'Boolean',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(runner);\n return output as boolean;\n }\n\n async aiNumber(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<number> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, runner } = await this.taskExecutor.createTypeQueryExecution(\n 'Number',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(runner);\n return output as number;\n }\n\n async aiString(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\n ): Promise<string> {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, runner } = await this.taskExecutor.createTypeQueryExecution(\n 'String',\n textPrompt,\n modelConfig,\n opt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(runner);\n return output as string;\n }\n\n async aiAsk(\n prompt: TUserPrompt,\n opt: InsightExtractOption = defaultInsightExtractOption,\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('grounding');\n\n const text = await this.insight.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 modelConfig = this.modelConfigManager.getModelConfig('grounding');\n\n const { runner, output } = await this.taskExecutor.runPlans(\n taskTitleStr('Locate', locateParamStr(locateParam)),\n plans,\n modelConfig,\n );\n await this.afterTaskRunning(runner);\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 & InsightExtractOption,\n ) {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n\n const insightOpt: InsightExtractOption = {\n domIncluded: opt?.domIncluded ?? defaultInsightExtractOption.domIncluded,\n screenshotIncluded:\n opt?.screenshotIncluded ??\n defaultInsightExtractOption.screenshotIncluded,\n doNotThrowError: opt?.doNotThrowError,\n };\n\n const { textPrompt, multimodalPrompt } = parsePrompt(assertion);\n\n const { output, runner, thought } =\n await this.taskExecutor.createTypeQueryExecution<boolean>(\n 'Assert',\n textPrompt,\n modelConfig,\n insightOpt,\n multimodalPrompt,\n );\n await this.afterTaskRunning(runner, true);\n\n const message = output\n ? undefined\n : `Assertion failed: ${msg || (typeof assertion === 'string' ? assertion : assertion.prompt)}\\nReason: ${\n thought || runner.latestErrorTask()?.error || '(no_reason)'\n }`;\n\n if (opt?.keepRawResponse) {\n return {\n pass: output,\n thought,\n message,\n };\n }\n\n if (!output) {\n throw new Error(message);\n }\n }\n\n async aiWaitFor(assertion: TUserPrompt, opt?: AgentWaitForOpt) {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n const { runner } = await this.taskExecutor.waitFor(\n assertion,\n {\n timeoutMs: opt?.timeoutMs || 15 * 1000,\n checkIntervalMs: opt?.checkIntervalMs || 3 * 1000,\n },\n modelConfig,\n );\n await this.afterTaskRunning(runner, true);\n\n if (runner.isInErrorState()) {\n const errorTask = runner.latestErrorTask();\n throw new Error(`${errorTask?.error}\\n${errorTask?.errorStack}`);\n }\n }\n\n async ai(taskPrompt: string, type = 'action') {\n if (type === 'action') {\n return this.aiAct(taskPrompt);\n }\n if (type === 'query') {\n return this.aiQuery(taskPrompt);\n }\n\n if (type === 'assert') {\n return this.aiAssert(taskPrompt);\n }\n\n if (type === 'tap') {\n return this.aiTap(taskPrompt);\n }\n\n if (type === 'rightClick') {\n return this.aiRightClick(taskPrompt);\n }\n\n if (type === 'doubleClick') {\n return this.aiDoubleClick(taskPrompt);\n }\n\n throw new Error(\n `Unknown type: ${type}, only support 'action', 'query', 'assert', 'tap', 'rightClick', 'doubleClick'`,\n );\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 if (this.opts.aiActionContext) {\n executionDump.aiActionContext = this.opts.aiActionContext;\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 const newExecutions = Array.isArray(executions)\n ? executions.map((execution: any) => {\n const { tasks, ...restExecution } = execution;\n let newTasks = tasks;\n if (Array.isArray(tasks)) {\n newTasks = tasks.map((task: any) => {\n // only remove uiContext and log from task\n const { uiContext, log, ...restTask } = task;\n return restTask;\n });\n }\n return { ...restExecution, ...(newTasks ? { tasks: newTasks } : {}) };\n })\n : [];\n return {\n groupName,\n groupDescription,\n executions: newExecutions,\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\";\nimport { treeToList } from \"@midscene/shared/extractor\";\nconst stillDuration = 900;\nconst actionSpinningPointerDuration = 300;\nconst stillAfterInsightDuration = 300;\nconst locateDuration = 800;\nconst actionDuration = 1000;\nconst clearInsightDuration = 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 capitalizeFirstLetter = (str)=>{\n if ('string' != typeof str || 0 === str.length) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\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 ? `${capitalizeFirstLetter(intent)}/${model_name}(${model_description})` : 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 pointerScript = (img, title, subTitle)=>({\n type: 'pointer',\n img,\n duration: 0,\n title,\n subTitle\n });\n const scripts = [];\n let insightCameraState;\n let currentCameraState = fullPageCameraState;\n let insightOnTop = false;\n const taskCount = 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 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 camera: 0 === index ? fullPageCameraState : void 0,\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 ('Insight' === task.type && 'Locate' === task.subType) {\n var _insightTask_output;\n const insightTask = task;\n const resultElement = null == (_insightTask_output = insightTask.output) ? void 0 : _insightTask_output.element;\n const title = typeStr(task);\n const subTitle = paramStr(task);\n if (null == resultElement ? void 0 : resultElement.rect) insightCameraState = {\n ...cameraStateForRect(resultElement.rect, imageWidth, imageHeight),\n pointerLeft: resultElement.center[0],\n pointerTop: resultElement.center[1]\n };\n const context = insightTask.uiContext;\n if (null == context ? void 0 : context.screenshotBase64) {\n var _insightTask_output1, _insightDump_taskInfo, _context_size, _context_size1;\n const insightDump = insightTask.log;\n const insightContentLength = context.tree ? treeToList(context.tree).length : 0;\n if (context.screenshotBase64) {\n var _context_size2, _context_size3;\n scripts.push({\n type: 'img',\n img: context.screenshotBase64,\n duration: stillAfterInsightDuration,\n title,\n subTitle,\n imageWidth: (null == (_context_size2 = context.size) ? void 0 : _context_size2.width) || imageWidth,\n imageHeight: (null == (_context_size3 = context.size) ? void 0 : _context_size3.height) || imageHeight\n });\n }\n let cameraState;\n cameraState = currentCameraState === fullPageCameraState ? void 0 : insightCameraState ? mergeTwoCameraState(currentCameraState, insightCameraState) : void 0;\n scripts.push({\n type: 'insight',\n img: context.screenshotBase64,\n context: context,\n camera: cameraState,\n highlightElement: (null == (_insightTask_output1 = insightTask.output) ? void 0 : _insightTask_output1.element) || void 0,\n searchArea: null == insightDump ? void 0 : null == (_insightDump_taskInfo = insightDump.taskInfo) ? void 0 : _insightDump_taskInfo.searchArea,\n duration: insightContentLength > 20 ? locateDuration : 0.5 * locateDuration,\n insightCameraDuration: locateDuration,\n title,\n 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 scripts.push({\n type: 'sleep',\n duration: stillAfterInsightDuration,\n title,\n subTitle\n });\n insightOnTop = true;\n }\n } else if ('Action' === task.type && 'FalsyConditionStatement' !== task.subType) {\n var _task_recorder_, _task_recorder, _task_uiContext_size2, _task_uiContext2, _task_uiContext_size3, _task_uiContext3, _task_recorder_1, _task_recorder1;\n const title = typeStr(task);\n const subTitle = paramStr(task);\n scripts.push(pointerScript(mousePointer, title, subTitle));\n currentCameraState = null != insightCameraState ? insightCameraState : fullPageCameraState;\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 : insightCameraState,\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 if (insightOnTop) {\n scripts.push({\n type: 'clear-insight',\n duration: clearInsightDuration,\n title,\n subTitle\n });\n insightOnTop = false;\n }\n const imgStillDuration = index < taskCount - 1 ? stillDuration : 0;\n if (null == (_task_recorder1 = task.recorder) ? void 0 : null == (_task_recorder_1 = _task_recorder1[1]) ? void 0 : _task_recorder_1.screenshot) {\n var _task_recorder_2, _task_recorder2, _task_uiContext_size4, _task_uiContext4, _task_uiContext_size5, _task_uiContext5;\n scripts.push({\n type: 'spinning-pointer',\n duration: actionSpinningPointerDuration,\n title,\n subTitle\n });\n scripts.push(pointerScript(mousePointer, title, subTitle));\n scripts.push({\n type: 'img',\n img: null == (_task_recorder2 = task.recorder) ? void 0 : null == (_task_recorder_2 = _task_recorder2[1]) ? void 0 : _task_recorder_2.screenshot,\n duration: imgStillDuration,\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 } else scripts.push({\n type: 'sleep',\n duration: imgStillDuration,\n title,\n subTitle\n });\n } else {\n var _task_recorder_3, _task_recorder3;\n const title = typeStr(task);\n const subTitle = paramStr(task);\n const screenshot = null == (_task_recorder3 = task.recorder) ? void 0 : null == (_task_recorder_3 = _task_recorder3[task.recorder.length - 1]) ? void 0 : _task_recorder_3.screenshot;\n if (screenshot) {\n var _task_uiContext_size6, _task_uiContext6, _task_uiContext_size7, _task_uiContext7;\n scripts.push({\n type: 'img',\n img: screenshot,\n duration: stillDuration,\n camera: fullPageCameraState,\n title,\n subTitle,\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 }\n }\n if ('finished' !== task.status) {\n var _task_uiContext_size8, _task_uiContext8, _task_uiContext_size9, _task_uiContext9;\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_uiContext8 = task.uiContext) ? void 0 : null == (_task_uiContext_size8 = _task_uiContext8.size) ? void 0 : _task_uiContext_size8.width) || imageWidth,\n imageHeight: (null == (_task_uiContext9 = task.uiContext) ? void 0 : null == (_task_uiContext_size9 = _task_uiContext9.size) ? void 0 : _task_uiContext_size9.height) || imageHeight\n });\n return;\n }\n });\n if (!errorStateFlag) scripts.push({\n title: 'Done',\n subTitle: initSubTitle,\n type: 'img',\n duration: stillDuration,\n camera: fullPageCameraState\n });\n return scripts;\n};\nexport { allScriptsFromDump, cameraStateForRect, generateAnimationScripts, mergeTwoCameraState };\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 _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}\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 async saveMessages(messages) {\n await withErrorHandling(async ()=>{\n await this.dbManager.clear(MESSAGES_STORE);\n const messagesToSave = messages.slice(-MAX_STORED_MESSAGES);\n await Promise.all(messagesToSave.map((msg, index)=>{\n const lightMessage = {\n ...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 }, 'Failed to save messages to IndexedDB', void 0, this.messagesCleanup);\n }\n async loadMessages() {\n const result = await withErrorHandling(async ()=>{\n const messages = await this.dbManager.getAll(MESSAGES_STORE, true);\n if (0 === messages.length) return [];\n return Promise.all(messages.map(async (msg)=>{\n const item = msg.data;\n const restoredItem = {\n ...item,\n timestamp: new Date(item.timestamp)\n };\n if ('result' === item.type && item.id) {\n const fullResult = await 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 }));\n }, 'Failed to load messages from IndexedDB', [], this.messagesCleanup);\n return result || [];\n }\n async clearMessages() {\n await withErrorHandling(async ()=>{\n await Promise.all([\n this.dbManager.clear(MESSAGES_STORE),\n this.dbManager.clear(RESULTS_STORE)\n ]);\n }, 'Failed to clear messages from IndexedDB');\n }\n async saveResult(id, result) {\n await withErrorHandling(async ()=>{\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 await this.dbManager.put(RESULTS_STORE, data);\n }, 'Failed to save result to IndexedDB', void 0, this.resultsCleanup);\n }\n async loadResult(id) {\n const result = await withErrorHandling(async ()=>{\n const data = await this.dbManager.get(RESULTS_STORE, id);\n return (null == data ? void 0 : data.data) || null;\n }, 'Failed to load result from IndexedDB', null);\n return result || null;\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 {\n ...execution,\n tasks: (null == (_execution_tasks = execution.tasks) ? void 0 : _execution_tasks.map((task)=>{\n var _task_recorder;\n var _this_compressScreenshotIfNeeded;\n return {\n ...task,\n uiContext: task.uiContext ? {\n ...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)=>({\n ...record,\n screenshot: this.compressScreenshotIfNeeded(record.screenshot)\n }))\n };\n })) || []\n };\n });\n return {\n ...result,\n result: {\n ...result.result,\n dump: {\n ...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 async getStorageStats() {\n const result = await withErrorHandling(async ()=>{\n const [messageCount, resultCount] = await Promise.all([\n this.dbManager.count(MESSAGES_STORE),\n this.dbManager.count(RESULTS_STORE)\n ]);\n return {\n messageCount,\n resultCount\n };\n }, 'Failed to get storage statistics', {\n messageCount: 0,\n resultCount: 0\n });\n return result || {\n messageCount: 0,\n resultCount: 0\n };\n }\n async cleanup() {\n await Promise.all([\n this.messagesCleanup(),\n this.resultsCleanup()\n ]);\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 async saveMessages(messages) {\n this.messages = [\n ...messages\n ];\n }\n async loadMessages() {\n return [\n ...this.messages\n ];\n }\n async clearMessages() {\n this.messages = [];\n this.results.clear();\n }\n async saveResult(id, result) {\n this.results.set(id, result);\n }\n constructor(){\n _define_property(this, \"messages\", []);\n _define_property(this, \"results\", new Map());\n }\n}\nclass NoOpStorageProvider {\n async saveMessages(_messages) {}\n async loadMessages() {\n return [];\n }\n async clearMessages() {}\n async saveResult(_id, _result) {}\n}\nexport { IndexedDBStorageProvider, MemoryStorageProvider, NoOpStorageProvider };\n","import { IndexedDBStorageProvider, MemoryStorageProvider, NoOpStorageProvider } from \"./indexeddb-storage-provider.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 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 async saveMessages(messages) {\n try {\n if (!this.checkStorageSpace()) {\n console.warn('Low storage space detected, clearing old data...');\n await this.handleQuotaExceeded();\n }\n const messagesToSave = messages.slice(-this.maxStorageItems);\n const lightMessages = messagesToSave.map((msg)=>({\n ...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 await this.handleQuotaExceeded();\n try {\n const recentMessages = messages.slice(-10);\n const lightRecentMessages = recentMessages.map((msg)=>({\n ...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 await this.clearMessages();\n }\n } else console.error('Failed to save messages to localStorage:', error);\n }\n }\n async loadMessages() {\n try {\n const stored = localStorage.getItem(this.messagesKey);\n if (!stored) return [];\n const messages = JSON.parse(stored);\n const restoredMessages = await Promise.all(messages.map(async (msg)=>{\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 {\n ...msg,\n ...resultItem\n };\n } catch (e) {\n console.warn('Failed to parse stored result:', e);\n }\n }\n return msg;\n }));\n return restoredMessages;\n } catch (error) {\n console.error('Failed to load messages from localStorage:', error);\n return [];\n }\n }\n async clearMessages() {\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 }\n async saveResult(id, result) {\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 await 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 }\n async handleQuotaExceeded() {\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 }\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 async saveMessages(messages) {\n this.messages = [\n ...messages\n ];\n }\n async loadMessages() {\n return [\n ...this.messages\n ];\n }\n async clearMessages() {\n this.messages = [];\n this.results.clear();\n }\n async saveResult(id, result) {\n this.results.set(id, result);\n }\n constructor(){\n _define_property(this, \"messages\", []);\n _define_property(this, \"results\", new Map());\n }\n}\nclass storage_provider_NoOpStorageProvider {\n async saveMessages(_messages) {}\n async loadMessages() {\n return [];\n }\n async clearMessages() {}\n async saveResult(_id, _result) {}\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() {\n let type = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : \"indexeddb\", namespace = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : '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","'use client';\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nimport \"pixi.js/unsafe-eval\";\nimport { Checkbox } from \"antd\";\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 { treeToList } from \"@midscene/shared/extractor\";\nimport { DropShadowFilter } from \"pixi-filters\";\nimport { useBlackboardPreference } from \"../../store/store.mjs\";\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 const highlightIds = 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 { backgroundVisible, setBackgroundVisible, elementsVisible, setElementsVisible } = useBlackboardPreference();\n useEffect(()=>{\n Promise.resolve((async ()=>{\n if (!domRef.current || !screenWidth) return;\n await 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 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 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 [graphics] = rectMarkForItem(rect, content, 'highlight');\n highlightContainer.addChild(graphics);\n });\n if (null == highlightPoints ? void 0 : highlightPoints.length) highlightPoints.forEach((point)=>{\n const graphics = pointMarkForItem(point, 'highlightPoint');\n highlightContainer.addChild(graphics);\n });\n const elements = treeToList(context.tree);\n elements.forEach((element)=>{\n const { rect, content, id } = element;\n const ifHighlight = highlightIds.includes(id) || (null == hoverElement ? void 0 : hoverElement.id) === id;\n if (ifHighlight) return;\n const [graphics] = rectMarkForItem(rect, content, 'element');\n elementMarkContainer.addChild(graphics);\n });\n elementMarkContainer.visible = elementsVisible;\n return {\n highlightElementRects\n };\n }, [\n app,\n appInitialed,\n highlightElements,\n context.tree,\n hoverElement,\n highlightRect,\n highlightPoints\n ]);\n const onSetBackgroundVisible = (e)=>{\n setBackgroundVisible(e.target.checked);\n if (pixiBgRef.current) pixiBgRef.current.visible = e.target.checked;\n };\n const onSetElementsVisible = (e)=>{\n setElementsVisible(e.target.checked);\n elementMarkContainer.visible = e.target.checked;\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: \"blackboard-filter\",\n style: {\n display: props.hideController ? 'none' : 'block'\n },\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"overlay-control\",\n children: [\n /*#__PURE__*/ jsx(Checkbox, {\n checked: backgroundVisible,\n onChange: onSetBackgroundVisible,\n children: \"Background\"\n }),\n /*#__PURE__*/ jsx(Checkbox, {\n checked: elementsVisible,\n onChange: onSetElementsVisible,\n children: \"Elements\"\n })\n ]\n })\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"bottom-tip\",\n style: {\n display: props.hideController ? 'none' : 'block'\n },\n children: bottomTipA\n })\n ]\n });\n};\nconst blackboard = Blackboard;\nexport { Blackboard, blackboard as default, pointMarkForItem, rectMarkForItem };\n","import { jsx } from \"react/jsx-runtime\";\nimport \"./index.css\";\nconst ShinyText = (param)=>{\n let { text, disabled = false, speed = 5, className = '' } = param;\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 = function() {\n let notReadyMessage = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : errorMessageServerNotReady;\n return /*#__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 });\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 = (param)=>{\n let { uiContextPreview, setUiContextPreview, showContextPreview } = param;\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 = (param)=>{\n let { className = '' } = param;\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\";\nconst SvgGlobalPerspective = (props)=>/*#__PURE__*/ jsx(\"svg\", {\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: \"#333\",\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\";\nconst SvgPlayerSetting = (props)=>/*#__PURE__*/ jsxs(\"svg\", {\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: \"#333\",\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: \"#333\",\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 { jsx } from \"react/jsx-runtime\";\nimport \"react\";\nconst SvgShowMarker = (props)=>/*#__PURE__*/ jsx(\"svg\", {\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: \"#333\",\n d: \"M13 1.835a2.165 2.165 0 0 1 .665 4.225v3.88a2.166 2.166 0 1 1-2.725 2.725H5.06a2.165 2.165 0 1 1-2.725-2.726V6.06A2.165 2.165 0 1 1 5.06 3.336h5.88c.281-.87 1.097-1.5 2.06-1.5m-10 9.33a.835.835 0 1 0 0 1.67.835.835 0 0 0 0-1.67m10 0a.835.835 0 1 0 0 1.67.835.835 0 0 0 0-1.67m-7.94-6.5A2.17 2.17 0 0 1 3.665 6.06v3.88c.66.213 1.181.734 1.395 1.395h5.88a2.17 2.17 0 0 1 1.395-1.396V6.06a2.17 2.17 0 0 1-1.395-1.394zM3 3.165a.835.835 0 1 0 0 1.67.835.835 0 0 0 0-1.67m10 0a.835.835 0 1 0 0 1.67.835.835 0 0 0 0-1.67\"\n })\n });\nconst show_marker = SvgShowMarker;\nexport { show_marker as default };\n","import \"pixi.js/unsafe-eval\";\nimport { Assets } from \"pixi.js\";\nconst globalTextureMap = new Map();\nconst loadTexture = async (img)=>{\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 = async (name)=>{\n if (globalTextureMap.has(name)) return globalTextureMap.get(name);\n await 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 { treeToList } from \"@midscene/shared/extractor\";\nimport { Dropdown, Spin, Switch, Tooltip } from \"antd\";\nimport global_perspective from \"../../icons/global-perspective.mjs\";\nimport player_setting from \"../../icons/player-setting.mjs\";\nimport show_marker from \"../../icons/show-marker.mjs\";\nimport { useBlackboardPreference } from \"../../store/store.mjs\";\nimport { getTextureFromCache, loadTexture } from \"../../utils/pixi-loader.mjs\";\nimport { rectMarkForItem } from \"../blackboard/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}\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 this.mediaRecorder = mediaRecorder;\n this.recording = true;\n return this.mediaRecorder.start();\n }\n stop() {\n var _this_mediaRecorder;\n if (!this.recording || !this.mediaRecorder) return void console.warn('not recording');\n this.mediaRecorder.onstop = ()=>{\n const blob = new Blob(this.chunks, {\n type: 'video/webm'\n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'midscene_replay.webm';\n a.click();\n URL.revokeObjectURL(url);\n };\n null == (_this_mediaRecorder = this.mediaRecorder) || _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, elementsVisible, setElementsVisible } = 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 useEffect(()=>{\n if ((null == props ? void 0 : props.elementsVisible) !== void 0) setElementsVisible(props.elementsVisible);\n }, [\n null == props ? void 0 : props.elementsVisible,\n setElementsVisible\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 useEffect(()=>{\n insightMarkContainer.visible = elementsVisible;\n }, [\n elementsVisible,\n insightMarkContainer\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({\n ...basicCameraState\n });\n const resizeCanvasIfNeeded = async (newWidth, newHeight)=>{\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 = async (scriptWidth, scriptHeight)=>{\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 await resizeCanvasIfNeeded(targetWidth, targetHeight);\n if (!getTextureFromCache(imgToUpdate)) {\n console.warn('image not loaded', imgToUpdate);\n await 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 = async (img, x, y)=>{\n var _pointerSprite_current, _pointerSprite_current1;\n if (!getTextureFromCache(img)) {\n console.warn('image not loaded', img);\n await 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 = async (targetState, duration, frame)=>{\n const currentCanvasWidth = app.screen.width || imageWidth;\n const currentCanvasHeight = app.screen.height || imageHeight;\n if (!autoZoom) {\n const currentState = {\n ...cameraState.current\n };\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 await 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 = {\n ...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 = {\n ...cameraState.current\n };\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 await new Promise((resolve)=>{\n const animate = (currentTime)=>{\n const nextState = {\n ...cameraState.current\n };\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 = function(graphics, duration, frame) {\n let targetAlpha = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : 1;\n return 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 };\n const fadeOutItem = async (graphics, duration, frame)=>fadeInGraphics(graphics, duration, frame, 0);\n const insightElementsAnimation = async (elements, highlightElements, searchArea, duration, frame)=>{\n insightMarkContainer.removeChildren();\n const elementsToAdd = [\n ...elements\n ];\n const totalLength = elementsToAdd.length;\n let childrenCount = 0;\n await 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 ()=>{\n if (!divContainerRef.current || !scripts) return;\n await 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 handleExport = ()=>{\n if (recorderSessionRef.current) return void console.warn('recorderSession exists');\n if (!app.canvas) return void console.warn('canvas is not initialized');\n recorderSessionRef.current = new RecordingSession(app.canvas);\n setIsRecording(true);\n triggerReplay();\n };\n const play = ()=>{\n let cancelFn;\n Promise.resolve((async ()=>{\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 const allImages = scripts.filter((item)=>!!item.img).map((item)=>item.img);\n await Promise.all([\n ...allImages,\n mouseLoading,\n mousePointer\n ].map(loadTexture));\n insightMarkContainer.removeChildren();\n await updatePointer(mousePointer, imageWidth / 2, imageHeight / 2);\n await repaintImage();\n await updateCamera({\n ...basicCameraState\n });\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) await sleep(item.duration);\n else if ('insight' === item.type) {\n var _item_context;\n if (!item.img) throw new Error('img is required');\n currentImg.current = item.img;\n await repaintImage(item.imageWidth, item.imageHeight);\n const elements = (null == (_item_context = item.context) ? void 0 : _item_context.tree) ? treeToList(item.context.tree) : [];\n const highlightElements = item.highlightElement ? [\n item.highlightElement\n ] : [];\n await insightElementsAnimation(elements, highlightElements, item.searchArea, item.duration, frame);\n if (item.camera) {\n if (!item.insightCameraDuration) throw new Error('insightCameraDuration is required');\n await cameraAnimation(item.camera, item.insightCameraDuration, frame);\n }\n } else if ('clear-insight' === item.type) {\n await 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 await repaintImage(item.imageWidth, item.imageHeight);\n }\n if (item.camera) await cameraAnimation(item.camera, item.duration, frame);\n else await sleep(item.duration);\n } else if ('pointer' === item.type) {\n if (!item.img) throw new Error('pointer img is required');\n await updatePointer(item.img);\n } else if ('spinning-pointer' === item.type) {\n const stop = spinningPointer(frame);\n await sleep(item.duration);\n stop();\n }\n }\n if (recorderSessionRef.current) {\n await sleep(1200);\n recorderSessionRef.current.stop();\n recorderSessionRef.current = null;\n setIsRecording(false);\n }\n })().catch((e)=>{\n console.error('player error', e);\n }));\n return ()=>{\n null == cancelFn || cancelFn();\n };\n };\n useEffect(()=>{\n Promise.resolve((async ()=>{\n await 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 key: 'elementsVisible',\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(show_marker, {\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: \"Show element markers\"\n })\n ]\n }),\n /*#__PURE__*/ jsx(Switch, {\n size: \"small\",\n checked: elementsVisible,\n onChange: (checked)=>{\n setElementsVisible(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 = (param)=>{\n let { result, loading, serverValid, serviceMode, replayScriptsInfo, replayCounter, loadingProgressText, verticalMode = false, notReadyMessage, fitMode, autoZoom } = param;\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\";\nconst SvgAvatar = (props)=>/*#__PURE__*/ jsxs(\"svg\", {\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});\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 = {\n ...get().history\n };\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 = {\n ...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 '@/ai-model';\nimport type { DeviceAction, LocateResultElement } from '@/types';\nimport type { ElementNode } from '@midscene/shared/extractor';\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 opt?: { _orderSensitive: boolean },\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)\nexport const defineAction = <\n TSchema extends z.ZodType,\n TRuntime = z.infer<TSchema>,\n>(\n config: {\n name: string;\n description: string;\n interfaceAlias?: string;\n paramSchema: TSchema;\n call: (param: TRuntime) => Promise<void>;\n } & Partial<\n Omit<\n DeviceAction<TRuntime>,\n 'name' | 'description' | 'interfaceAlias' | 'paramSchema' | 'call'\n >\n >,\n): DeviceAction<TRuntime> => {\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\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('The element to be input')\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.string().describe('The key to be pressed'),\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 function key, like \"Enter\", \"Tab\", \"Escape\". 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(['once', 'untilBottom', 'untilTop', 'untilRight', 'untilLeft'])\n .default('once')\n .describe('The scroll type'),\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 element to be scrolled'),\n});\nexport type ActionScrollParam = {\n direction?: 'down' | 'up' | 'right' | 'left';\n scrollType?: 'once' | 'untilBottom' | 'untilTop' | 'untilRight' | 'untilLeft';\n distance?: number | null;\n locate?: LocateResultElement;\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: 'Clear the text content of an input field',\n interfaceAlias: 'aiClearInput',\n paramSchema: actionClearInputParamSchema,\n call,\n });\n};\n\nexport type { DeviceAction } from '../types';\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\";\nconst SvgSetting = (props)=>/*#__PURE__*/ jsx(\"svg\", {\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: \"#000\",\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 { deepThinkTip, domIncludedTip, screenshotIncludedTip, trackingTip } from \"../../utils/constants.mjs\";\nconst ConfigSelector = (param)=>{\n let { showDeepThinkOption = false, enableTracking = false, showDataExtractionOptions = false, hideDomAndScreenshotOptions = false } = param;\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 if (!enableTracking && !showDeepThinkOption && !showDataExtractionOptions) 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 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 = (param)=>{\n let { name, label, isRequired, marginBottom, placeholder: customPlaceholder } = param;\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 = (param)=>{\n let { name, label, isRequired, marginBottom, placeholder: customPlaceholder } = param;\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 = (param)=>{\n let { name, label, fieldSchema, isRequired, marginBottom, placeholder: customPlaceholder } = param;\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 = (param)=>{\n let { name, label, isRequired, marginBottom, placeholder: customPlaceholder } = param;\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 = (param)=>{\n let { name, label, isRequired, marginBottom, placeholder: customPlaceholder } = param;\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\";\nconst SvgClose = (props)=>/*#__PURE__*/ jsx(\"svg\", {\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\";\nconst SvgHistory = (props)=>/*#__PURE__*/ jsxs(\"svg\", {\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: \"#000\",\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: \"#000\",\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\";\nconst SvgMagnifyingGlass = (props)=>/*#__PURE__*/ jsxs(\"svg\", {\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: \"#000\",\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 = (param)=>{\n let { onSelect, history, currentType } = param;\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\";\nconst { TextArea } = Input;\nconst PromptInput = (param)=>{\n let { runButtonEnabled, form, serviceMode, selectedType, dryMode, stoppable, loading, onRun, onStop, clearPromptAfterRun = true, actionSpace, hideDomAndScreenshotOptions = false } = param;\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 return hasTracking || hasDeepThink || hasDataExtraction;\n }, [\n serviceMode,\n showDeepThinkOption,\n showDataExtractionOptions,\n hideDomAndScreenshotOptions\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, {\n ...fieldProps\n }, key));\n else if ((null == (_actualField__def = actualField._def) ? void 0 : _actualField__def.typeName) === 'ZodEnum') fields.push(/*#__PURE__*/ jsx(EnumField, {\n ...fieldProps\n }, key));\n else if ((null == (_actualField__def1 = actualField._def) ? void 0 : _actualField__def1.typeName) === 'ZodNumber') fields.push(/*#__PURE__*/ jsx(NumberField, {\n ...fieldProps\n }, key));\n else if ((null == (_actualField__def2 = actualField._def) ? void 0 : _actualField__def2.typeName) === 'ZodBoolean') fields.push(/*#__PURE__*/ jsx(BooleanField, {\n ...fieldProps\n }, key));\n else fields.push(/*#__PURE__*/ jsx(TextField, {\n ...fieldProps\n }, 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 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 })\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 { PromptInput } from \"../prompt-input/index.mjs\";\nimport { createStorageProvider, detectBestStorageType } from \"./providers/storage-provider.mjs\";\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(param) {\n let { error } = param;\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(param) {\n let { playgroundSDK, storage, contextProvider, config: componentConfig = {}, branding = {}, className = '', dryMode = false, showContextPreview = true } = param;\n const [form] = Form.useForm();\n const { config } = useEnvConfig();\n const [sdkReady, setSdkReady] = useState(false);\n useEffect(()=>{\n const initializeSDK = async ()=>{\n if (playgroundSDK && 'function' == typeof playgroundSDK.checkStatus) try {\n await 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 ()=>{\n try {\n const value = form.getFieldsValue();\n await 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 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) ? \"\\u2717\" : \"\\u2713\"\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 })\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 { 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 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 ()=>{\n const oldStorage = createStorageProvider(detectBestStorageType(), 'playground-default');\n try {\n if (null == oldStorage ? void 0 : oldStorage.loadMessages) {\n const oldMessages = await oldStorage.loadMessages();\n if (oldMessages.length > 1) {\n console.log('Found data in old namespace, migrating...');\n if (null == storage ? void 0 : storage.saveMessages) await storage.saveMessages(oldMessages);\n if (oldStorage.clearMessages) await 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 ()=>{\n const welcomeMessage = {\n ...WELCOME_MESSAGE_TEMPLATE,\n id: 'welcome',\n timestamp: new Date()\n };\n if (null == storage ? void 0 : storage.loadMessages) try {\n let storedMessages = await storage.loadMessages();\n if (0 === storedMessages.length) storedMessages = await 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 ()=>{\n setActionSpaceLoading(true);\n try {\n var _contextProvider_getUIContext;\n if (!playgroundSDK) return void setActionSpace([]);\n const context = uiContextPreview || await (null == contextProvider ? void 0 : null == (_contextProvider_getUIContext = contextProvider.getUIContext) ? void 0 : _contextProvider_getUIContext.call(contextProvider));\n const space = await 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 ()=>{\n const welcomeMessage = {\n ...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 await storage.clearMessages();\n } catch (error) {\n console.error('Failed to clear stored messages:', error);\n }\n }, [\n storage\n ]);\n const refreshContext = useCallback(async ()=>{\n if (null == contextProvider ? void 0 : contextProvider.refreshContext) try {\n const newContext = await 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","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 usePlaygroundExecution(playgroundSDK, storage, actionSpace, loading, setLoading, infoList, setInfoList, replayCounter, setReplayCounter, verticalMode, currentRunningIdRef, interruptedFlagRef) {\n const { deepThink, screenshotIncluded, domIncluded } = useEnvConfig();\n const handleRun = useCallback(async (value)=>{\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 = {\n ...BLANK_RESULT\n };\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 result.result = await playgroundSDK.executeAction(actionType, value, {\n requestId: thisRunningId.toString(),\n deepThink,\n screenshotIncluded,\n domIncluded\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}` ? {\n ...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 await 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 ]);\n const handleStop = useCallback(async ()=>{\n const thisRunningId = currentRunningIdRef.current;\n if (thisRunningId && playgroundSDK && playgroundSDK.cancelExecution) try {\n await 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 ? {\n ...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","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 }}\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 { SCRCPY_SERVER_PORT } from '@midscene/shared/constants';\nimport {\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\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\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 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 <ScrcpyPlayer\n ref={scrcpyPlayerRef}\n serverUrl={serverUrl}\n autoConnect={connectToDevice}\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) {\n let extendMode = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : false, showErrorMessage = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 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 = function(newConfig) {\n let extendMode = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : false, showErrorMessage = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : true;\n return safeOverrideAIConfig(newConfig, extendMode, showErrorMessage);\n };\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 + \".\" + {\"150\": \"d439b38c\",\"195\": \"aa1e3152\",\"260\": \"d838b3b7\",\"271\": \"71b3326b\",\"355\": \"76c31308\",\"441\": \"675c15a8\",\"45\": \"ce50b37f\",\"586\": \"ffc417d5\",\"631\": \"9799e85f\",\"779\": \"e7bfc2ed\",\"782\": \"f77f2205\",}[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":["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","getConfigStringFromLocalStorage","configString","parseConfig","lines","config","line","trimmed","match","cleanLine","parsedValue","useEnvConfig","get","ifInExtension","savedServiceMode","savedForceSameTabNavigation","savedDeepThink","savedScreenshotIncluded","savedDomIncluded","serviceMode","Error","latestConfigString","forceSameTabNavigation","deepThink","screenshotIncluded","domIncluded","tab","MIDSCENE_OPENAI_INIT_CONFIG_JSON","MIDSCENE_MODEL_NAME","MIDSCENE_DEBUG_AI_PROFILE","MIDSCENE_DEBUG_AI_RESPONSE","MIDSCENE_OPENAI_SOCKS_PROXY","MIDSCENE_OPENAI_HTTP_PROXY","OPENAI_API_KEY","OPENAI_BASE_URL","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_OPENAI_BASE_URL","MIDSCENE_OPENAI_API_KEY","MIDSCENE_VL_MODE","MIDSCENE_VQA_MODEL_NAME","MIDSCENE_VQA_OPENAI_SOCKS_PROXY","MIDSCENE_VQA_OPENAI_HTTP_PROXY","MIDSCENE_VQA_OPENAI_BASE_URL","MIDSCENE_VQA_OPENAI_API_KEY","MIDSCENE_VQA_OPENAI_INIT_CONFIG_JSON","MIDSCENE_VQA_VL_MODE","MIDSCENE_PLANNING_MODEL_NAME","MIDSCENE_PLANNING_OPENAI_SOCKS_PROXY","MIDSCENE_PLANNING_OPENAI_HTTP_PROXY","MIDSCENE_PLANNING_OPENAI_BASE_URL","MIDSCENE_PLANNING_OPENAI_API_KEY","MIDSCENE_PLANNING_OPENAI_INIT_CONFIG_JSON","MIDSCENE_PLANNING_VL_MODE","MIDSCENE_GROUNDING_MODEL_NAME","MIDSCENE_GROUNDING_OPENAI_SOCKS_PROXY","MIDSCENE_GROUNDING_OPENAI_HTTP_PROXY","MIDSCENE_GROUNDING_OPENAI_BASE_URL","MIDSCENE_GROUNDING_OPENAI_API_KEY","MIDSCENE_GROUNDING_OPENAI_INIT_CONFIG_JSON","MIDSCENE_GROUNDING_VL_MODE","BASIC_ENV_KEYS","BOOLEAN_ENV_KEYS","NUMBER_ENV_KEYS","STRING_ENV_KEYS","GLOBAL_ENV_KEYS","MODEL_ENV_KEYS","ALL_ENV_KEYS","types_UITarsModelVersion","VL_MODE_RAW_VALID_VALUES","getBasicEnvValue","process","ifInNode","assert","condition","message","defaultRunDirName","topicPrefix","logStreams","Map","debugInstances","getDebug","topic","fullTopic","debugFn","debug","args","writeLogToFile","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","DEFAULT_MODEL_CONFIG_KEYS","DEFAULT_MODEL_CONFIG_KEYS_LEGACY","maskKey","maskChar","prefixLen","prefix","suffix","maskLength","mask","maskConfig","JSON","createAssert","modelNameKey","provider","modelName","modelVendorFlag","parseVlModeAndUiTarsModelVersionFromRawValue","vlModeRaw","KEYS_MAP","decideOpenaiSdkConfig","keys","valueAssert","debugLog","socksProxy","httpProxy","vlMode","openaiBaseURL","openaiApiKey","openaiExtraConfig","parseJson","e","getModelDescription","uiTarsVersion","decideModelConfigFromIntentConfig","intent","intentConfig","keysForFn","candidateModelNameFromConfig","chosenKeys","result","modelDescription","finalResult","decideModelConfigFromEnv","allEnvConfig","keysForEnv","parseVlModeAndUiTarsFromGlobalConfig","isDoubao","isQwen","isQwen3","isUiTars","isGemini","enabledModes","Boolean","ALL_INTENTS","globalModelConfigManager","modelConfigFn","intentConfigMap","i","modelConfigMap","mode","globalConfigManager","modelConfig","createOpenAIClientFn","envConfig","p","name","newConfig","extendMode","allConfig","Number","_this_override","savedNewConfig","overrideAIConfig","elementColor","highlightColorForType","type","PointSchema","z","SizeSchema","RectSchema","TMultimodalPromptSchema","TUserPromptSchema","locateFieldFlagName","MidsceneLocationInput","findAllMidsceneLocatorField","zodType","requiredOnly","_zodObject__def","zodObject","field","ifMidsceneLocatorField","_actualField__def","_actualField__def1","actualField","shape","_field__def","treeToList","tree","dfs","node","child","PromptTemplate","_keyDefinitions","acc","lowerKey","isMac","debugUtils","buildDetailedLocateParam","locatePrompt","opt","xpath","prompt","cacheable","noReplayAPIs","parseStructuredParams","action","params","options","schema","paramObj","undefined","locatorFieldKeys","locateKey","detailedLocateParam","executeAction","activeAgent","actionType","actionSpace","a","parsedParams","pass","thought","BasePlaygroundAdapter","_context","paramsForValidation","needsStructuredParams","paramsList","excludeKeys","filtered","zodError","errorMessages","err","path","errorMsg","shapeKeys","paramValue","displayKey","formattedValue","str","isLocateField","LocalExecutionAdapter","callback","requestId","errorMessage","context","_this_agent","page","contextPage","aiConfig","originalOnTaskStartTip","tip","response","dumpString","_requestId","_this_agent_interface","description","agent","v4","RemoteExecutionAdapter","missingFields","_fieldDef__def","_fieldDef__def1","fieldDef","androidError","androidErrors","keyword","payload","fetch","errorText","optionalParams","optionalFields","Array","actionSpaceMethod","res","data","jsonError","encodeURIComponent","lastTip","interval","setInterval","_progress_tip","progress","clearInterval","serverUrl","PlaygroundSDK","useServerValid","shouldRun","arguments","serverValid","setServerValid","useState","useEffect","interruptFlag","Promise","playgroundSDK","status","resolve","setTimeout","selectedDeviceId","scrcpyPlayerRef","messageApi","contextHolder","useCallback","MobileOutlined","Logo","param","hideLogo","jsx","EnvConfig","showTooltipWhenEmpty","showModelName","tooltipPlacement","loadConfig","syncFromStorage","isModalOpen","setIsModalOpen","tempConfigString","setTempConfigString","midsceneModelName","componentRef","useRef","showModal","jsxs","Tooltip","SettingOutlined","Modal","Input","NavActions","showEnvConfig","githubUrl","helpUrl","className","Typography","GithubOutlined","QuestionCircleOutlined","apiMetadata","defaultMainButtons","WELCOME_MESSAGE_TEMPLATE","BLANK_RESULT","mousePointer","mouseLoading","typeStr","task","locateParamStr","locate","images","imagesStr","image","url","paramStr","_task_param","_task_param1","_task_param2","_task_param3","_task_param4","_task_param5","_task_param6","_task_param7","_task_param8","_task_param9","scrollParam","locateStr","pullParamStr","pullParam","parts","CACHE_STRATEGIES","cameraStateForRect","rect","imageWidth","imageHeight","rectWidthOnPage","cameraPaddingRatio","rectRatio","cameraWidth","left","top","IndexedDBManager","reject","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","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","screenshot","sizeKB","messageCount","resultCount","namespace","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","rectMarkForItem","themeColor","width","height","hashNumber","djb2Hash","hash","graphics","Graphics","DropShadowFilter","texts","Text","nameFontSize","blackboard","props","highlightElements","highlightIds","highlightRect","highlightPoints","size","screenshotBase64","screenWidth","screenHeight","domRef","app","useMemo","Application","appInitialed","setAppInitialed","highlightContainer","Container","elementMarkContainer","hoverElement","setHoverElement","pixiBgRef","backgroundVisible","setBackgroundVisible","elementsVisible","setElementsVisible","canvasEl","clientWidth","targetHeight","ratio","Rectangle","_props_onCanvasClick","x","y","_app_stage","img","Image","screenshotTexture","Texture","backgroundSprite","Sprite","highlightElementRects","element","content","point","pointMarkForItem","elements","bottomTipA","Checkbox","shiny_text","text","disabled","speed","style","errorMessageServerNotReady","serverLaunchTip","notReadyMessage","Alert","emptyResultTip","ContextPreview","uiContextPreview","setUiContextPreview","showContextPreview","iconForStatus","CheckOutlined","WarningOutlined","CloseOutlined","ClockCircleOutlined","LogoutOutlined","ArrowRightOutlined","MinusOutlined","Button","playground_demo_ui_context","EnvConfigReminder","ExclamationCircleFilled","global_perspective","player_setting","show_marker","globalTextureMap","loadTexture","Assets","texture","sleep","ms","ERROR_FRAME_CANCEL","RecordingSession","mediaRecorder","MediaRecorder","_this_mediaRecorder","blob","Blob","URL","document","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","resizeCanvasIfNeeded","newWidth","newHeight","aspectRatio","repaintImage","scriptWidth","scriptHeight","imgToUpdate","targetWidth","sprite","mainImgLabel","spinningPointer","frame","_pointerSprite_current","_pointerSprite_current1","startTime","isCancelled","animate","currentTime","rotation","elapsedTime","updatePointer","targetX","targetY","pointer","updateCamera","state","currentWidth","effectiveWidth","newScale","canvasPaddingLeft","canvasPaddingTop","cameraAnimation","targetState","duration","currentCanvasWidth","currentCanvasHeight","currentState","startPointerLeft","startPointerTop","performance","startLeft","startTop","startScale","shouldMovePointer","pointerMoveDuration","cameraMoveDuration","nextState","mouseProgress","cameraProgress","cameraElapsedTime","progressScale","targetScale","progressWidth","progressLeft","progressTop","horizontalExceed","verticalExceed","fadeInGraphics","targetAlpha","fadeOutItem","insightElementsAnimation","searchArea","elementsToAdd","totalLength","childrenCount","t","t2","elementsToAddNow","p0","p3","randomIndex","insightMarkGraphic","searchAreaGraphic","init","isRecording","setIsRecording","recorderSessionRef","playerContainer","cancelFn","cancel","timeout","requestAnimationFrame","allImages","totalDuration","updateProgress","_item_context","stop","mouseOverStatusIcon","setMouseOverStatusIcon","mouseOverSettingsIcon","setMouseOverSettingsIcon","progressString","canReplayNow","listener","statusOnClick","Spin","LoadingOutlined","CaretRightOutlined","DownloadOutlined","ExportOutlined","Dropdown","menu","Switch","checked","_","_e_stopPropagation","PlaygroundResultView","loading","replayScriptsInfo","replayCounter","loadingProgressText","verticalMode","resultWrapperClassName","resultDataToShow","avatar","history_create","HISTORY_KEY","LAST_SELECTED_TYPE_KEY","useHistoryStore","historyString","newHistory","historyItem","currentHistory","typeHistory","stringifiedNewItem","newTypeHistory","h","stringifiedOldItem","isZodObjectSchema","_field__def1","_fieldWithRuntime__def","fieldWithRuntime","VALIDATION_CONSTANTS","desc","unwrapZodType","_actualField__def2","_actualField__def3","_actualField__def4","isOptional","hasDefault","getMidsceneLocationSchema","val","String","actionNameForType","typeWithoutAi","fullName","words","setting","ConfigSelector","items","showDeepThinkOption","enableTracking","showDataExtractionOptions","hideDomAndScreenshotOptions","setForceSameTabNavigation","setDeepThink","setScreenshotIncluded","setDomIncluded","configItems","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","icons_history","magnifying_glass","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","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","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","initializeSDK","effectiveStorage","sdk","bestStorageType","setLoading","infoList","setInfoList","actionSpaceLoading","showScrollToBottomButton","setReplayCounter","infoListRef","currentRunningIdRef","interruptedFlagRef","clearInfoList","handleScrollToBottom","usePlaygroundState","setActionSpace","setActionSpaceLoading","setShowScrollToBottomButton","setVerticalMode","initializedRef","migrateFromOldNamespace","oldStorage","oldMessages","initializeMessages","welcomeMessage","storedMessages","hasWelcomeMessage","loadActionSpace","_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","info","allScriptsFromDump","dump","firstWidth","firstHeight","dimensionsSet","sdkVersion","modelBriefsSet","_task_uiContext_size","_task_uiContext","w","allScripts","generateAnimationScripts","insightCameraState","tasksIncluded","startIndex","fullPageCameraState","pointerScript","subTitle","currentCameraState","insightOnTop","taskCount","initSubTitle","errorStateFlag","_planningTask_recorder_","_planningTask_recorder","_task_uiContext_size1","_task_uiContext1","_insightTask_output","_insightTask_output1","_insightDump_taskInfo","_context_size","_context_size1","_context_size2","_context_size3","_task_recorder_","_task_uiContext_size2","_task_uiContext2","_task_uiContext_size3","_task_uiContext3","_task_recorder_1","_task_recorder1","_task_recorder_2","_task_recorder2","_task_uiContext_size4","_task_uiContext4","_task_uiContext_size5","_task_uiContext5","_task_recorder_3","_task_recorder3","_task_uiContext_size6","_task_uiContext6","_task_uiContext_size7","_task_uiContext7","_task_uiContext_size8","_task_uiContext8","_task_uiContext_size9","_task_uiContext9","cameraState1","cameraState2","planningTask","resultElement","insightTask","newLeft","newTop","insightDump","insightContentLength","newRight","imgStillDuration","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","InfoCircleOutlined","ScreenshotIcon","Divider","LinkedIcon","UnlinkIcon","Row","Col","Content","Layout","rootEl","root","ReactDOM","setSelectedDeviceId","connectToDevice","setConnectToDevice","setServerUrl","isNarrowScreen","setIsNarrowScreen","safeOverrideAIConfig","showErrorMessage","scrcpyPort","socket","ConfigProvider","PanelGroup","Panel","PanelResizeHandle","AdbDevice","App","globalThis","Function","self","r"],"mappings":"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CD,QAAS,EACT,KAAM,MACN,IAAK,KACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,QACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,YAAa,CACT,QAAS,GACT,KAAM,cACN,IAAK,QACL,KAAM,KACN,SAAU,CACd,EACA,MAAO,CACH,QAAS,GACT,KAAM,QACN,IAAK,QACL,KAAM,IACV,EACA,KAAM,CACF,QAAS,GACT,KAAM,QACN,IAAK,QACL,KAAM,IACV,EACA,KAAM,CACF,QAAS,GACT,KAAM,QACN,IAAK,QACL,KAAM,IACV,EACA,UAAW,CACP,QAAS,GACT,KAAM,YACN,IAAK,QACL,SAAU,CACd,EACA,WAAY,CACR,QAAS,GACT,KAAM,aACN,IAAK,QACL,SAAU,CACd,EACA,YAAa,CACT,QAAS,GACT,KAAM,cACN,IAAK,UACL,SAAU,CACd,EACA,aAAc,CACV,QAAS,GACT,KAAM,eACN,IAAK,UACL,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,KAAM,UACN,IAAK,MACL,SAAU,CACd,EACA,SAAU,CACN,QAAS,GACT,KAAM,WACN,IAAK,MACL,SAAU,CACd,EACA,MAAO,CACH,QAAS,GACT,KAAM,QACN,IAAK,OACT,EACA,SAAU,CACN,QAAS,GACT,KAAM,WACN,IAAK,UACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,IAAK,QACT,EACA,QAAS,CACL,QAAS,GACT,KAAM,UACN,IAAK,SACT,EACA,WAAY,CACR,QAAS,GACT,KAAM,aACN,IAAK,YACT,EACA,MAAO,CACH,QAAS,GACT,KAAM,QACN,IAAK,GACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,SACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,IAAK,QACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,GACd,IAAK,WACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,SAAU,CACN,QAAS,GACT,KAAM,WACN,IAAK,UACT,EACA,IAAK,CACD,QAAS,GACT,KAAM,MACN,IAAK,KACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,GACd,IAAK,MACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,IAAK,MACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,OACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,UAAW,CACP,QAAS,GACT,KAAM,YACN,IAAK,WACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,YACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,UACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,KAAM,UACN,IAAK,SACT,EACA,WAAY,CACR,QAAS,GACT,KAAM,aACN,IAAK,YACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,aACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,aAAc,GACd,IAAK,YACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,UAAW,CACP,QAAS,GACT,KAAM,YACN,IAAK,WACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,IAAK,QACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,IAAK,SACT,EACA,YAAa,CACT,QAAS,GACT,KAAM,cACN,IAAK,aACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,IAAK,QACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,GACd,IAAK,SACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,IAAK,QACT,EACA,cAAe,CACX,QAAS,GACT,aAAc,IACd,KAAM,gBACN,IAAK,KACL,SAAU,IACV,SAAU,CACd,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,SAAU,CACN,QAAS,GACT,KAAM,WACN,IAAK,OACL,SAAU,CACd,EACA,UAAW,CACP,QAAS,GACT,KAAM,YACN,IAAK,OACL,SAAU,CACd,EACA,YAAa,CACT,QAAS,GACT,KAAM,cACN,IAAK,aACT,EACA,eAAgB,CACZ,QAAS,IACT,KAAM,iBACN,IAAK,IACL,SAAU,CACd,EACA,UAAW,CACP,QAAS,IACT,KAAM,YACN,IAAK,IACL,SAAU,CACd,EACA,eAAgB,CACZ,QAAS,IACT,KAAM,iBACN,IAAK,IACL,SAAU,CACd,EACA,aAAc,CACV,QAAS,IACT,KAAM,eACN,IAAK,IACL,SAAU,CACd,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,QAAS,CACL,QAAS,IACT,KAAM,UACN,IAAK,SACT,EACA,WAAY,CACR,QAAS,IACT,KAAM,aACN,IAAK,YACT,EACA,gBAAiB,CACb,QAAS,IACT,KAAM,kBACN,IAAK,iBACT,EACA,gBAAiB,CACb,QAAS,IACT,KAAM,kBACN,IAAK,iBACT,EACA,cAAe,CACX,QAAS,IACT,KAAM,gBACN,IAAK,eACT,EACA,eAAgB,CACZ,QAAS,IACT,KAAM,iBACN,IAAK,gBACT,EACA,mBAAoB,CAChB,QAAS,IACT,KAAM,qBACN,IAAK,oBACT,EACA,UAAW,CACP,QAAS,IACT,KAAM,YACN,IAAK,WACT,EACA,eAAgB,CACZ,QAAS,IACT,KAAM,iBACN,IAAK,gBACT,EACA,UAAW,CACP,QAAS,IACT,KAAM,YACN,SAAU,IACV,IAAK,GACT,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,SAAU,IACV,IAAK,GACT,EACA,YAAa,CACT,QAAS,IACT,KAAM,cACN,IAAK,IACL,SAAU,CACd,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,SAAU,IACV,IAAK,GACT,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,IACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,SAAU,IACV,IAAK,GACT,EACA,UAAW,CACP,QAAS,IACT,KAAM,YACN,SAAU,IACV,IAAK,GACT,EACA,YAAa,CACT,QAAS,IACT,KAAM,cACN,SAAU,IACV,IAAK,GACT,EACA,UAAW,CACP,QAAS,IACT,KAAM,YACN,SAAU,IACV,IAAK,IACT,EACA,aAAc,CACV,QAAS,IACT,KAAM,eACN,SAAU,IACV,IAAK,GACT,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,SAAU,IACV,IAAK,GACT,EACA,SAAU,CACN,QAAS,IACT,KAAM,WACN,IAAK,UACT,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,IAAK,OACT,EACA,OAAQ,CACJ,QAAS,EACT,IAAK,SACL,KAAM,OACV,EACA,MAAO,CACH,QAAS,GACT,IAAK,QACL,KAAM,UACN,SAAU,CACd,EACA,MAAO,CACH,QAAS,GACT,IAAK,QACL,KAAM,YACN,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,IAAK,UACL,KAAM,cACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,GACT,IAAK,MACL,KAAM,UACN,SAAU,CACd,EACA,OAAQ,CACJ,QAAS,GACT,IAAK,QACT,EACA,WAAY,CACR,QAAS,GACT,IAAK,YACT,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,OACV,EACA,MAAO,CACH,QAAS,GACT,IAAK,OACT,EACA,QAAS,CACL,QAAS,GACT,IAAK,UACL,KAAM,MACV,EACA,KAAU,CACN,QAAS,GACT,IAAK,KACL,KAAM,gBACN,SAAU,CACd,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,KAAM,CACF,QAAS,GACT,IAAK,OACL,KAAM,WACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,iBACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,YACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,iBACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,eACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,WACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,WACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,aACV,EACA,KAAM,CACF,QAAS,IACT,IAAK,KACL,KAAM,WACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,cACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,KAAM,CACF,QAAS,IACT,IAAK,MACT,EACA,MAAO,CACH,QAAS,IACT,IAAK,QACL,KAAM,OACV,EACA,MAAO,CACH,QAAS,IACT,IAAK,OACT,EACA,SAAU,CACN,QAAS,IACT,IAAK,UACT,EACA,KAAM,CACF,QAAS,IACT,IAAK,MACT,EACA,QAAS,CACL,QAAS,IACT,IAAK,SACT,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,WACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,EAAG,CACC,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,WACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,aACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,WACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,cACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,SAAU,CACN,IAAK,WACL,KAAM,WACN,SAAU,CACd,EACA,UAAW,CACP,IAAK,YACL,KAAM,YACN,SAAU,CACd,EACA,OAAQ,CACJ,QAAS,GACT,IAAK,SACL,KAAM,SACN,SAAU,CACd,EACA,KAAM,CACF,IAAK,OACL,KAAM,OACN,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,IAAK,UACL,KAAM,UACN,SAAU,CACd,EACA,WAAY,CACR,QAAS,IACT,IAAK,aACL,KAAM,aACN,SAAU,CACd,EACA,SAAU,CACN,QAAS,IACT,IAAK,WACL,KAAM,WACN,SAAU,CACd,CACJ,EACgCnQ,OAAO,OAAO,CAACmQ,IAAiB,MAAM,CAAC,CAACC,EAAK,SAACrQ,EAAKD,EAAW,GACpFuQ,EAAWtQ,EAAI,WAAW,GAEhC,OADIsQ,IAAatQ,GAAKqQ,CAAAA,CAAG,CAACC,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"}