@midscene/core 1.8.11 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/agent/agent.mjs +40 -50
- package/dist/es/agent/agent.mjs.map +1 -1
- package/dist/es/agent/task-builder.mjs +39 -19
- package/dist/es/agent/task-builder.mjs.map +1 -1
- package/dist/es/agent/tasks.mjs +24 -22
- package/dist/es/agent/tasks.mjs.map +1 -1
- package/dist/es/agent/utils.mjs +11 -14
- package/dist/es/agent/utils.mjs.map +1 -1
- package/dist/es/ai-model/connectivity.mjs +7 -3
- package/dist/es/ai-model/connectivity.mjs.map +1 -1
- package/dist/es/ai-model/errors.mjs +9 -0
- package/dist/es/ai-model/errors.mjs.map +1 -0
- package/dist/es/ai-model/index.mjs +3 -4
- package/dist/es/ai-model/inspect.mjs +132 -144
- package/dist/es/ai-model/inspect.mjs.map +1 -1
- package/dist/es/ai-model/llm-planning.mjs +46 -28
- package/dist/es/ai-model/llm-planning.mjs.map +1 -1
- package/dist/es/ai-model/{auto-glm → models/auto-glm}/actions.mjs +22 -44
- package/dist/es/ai-model/models/auto-glm/actions.mjs.map +1 -0
- package/dist/es/ai-model/models/auto-glm/adapter.mjs +45 -0
- package/dist/es/ai-model/models/auto-glm/adapter.mjs.map +1 -0
- package/dist/es/ai-model/models/auto-glm/locate.mjs +112 -0
- package/dist/es/ai-model/models/auto-glm/locate.mjs.map +1 -0
- package/dist/es/ai-model/models/auto-glm/parser.mjs.map +1 -0
- package/dist/es/ai-model/{auto-glm → models/auto-glm}/planning.mjs +6 -7
- package/dist/es/ai-model/models/auto-glm/planning.mjs.map +1 -0
- package/dist/es/ai-model/{auto-glm → models/auto-glm}/prompt.mjs +3 -11
- package/dist/es/ai-model/models/auto-glm/prompt.mjs.map +1 -0
- package/dist/es/ai-model/models/default.mjs +12 -0
- package/dist/es/ai-model/models/default.mjs.map +1 -0
- package/dist/es/ai-model/models/doubao.mjs +138 -0
- package/dist/es/ai-model/models/doubao.mjs.map +1 -0
- package/dist/es/ai-model/models/gemini.mjs +34 -0
- package/dist/es/ai-model/models/gemini.mjs.map +1 -0
- package/dist/es/ai-model/models/glm.mjs +37 -0
- package/dist/es/ai-model/models/glm.mjs.map +1 -0
- package/dist/es/ai-model/models/gpt.mjs +31 -0
- package/dist/es/ai-model/models/gpt.mjs.map +1 -0
- package/dist/es/ai-model/models/index.mjs +2 -0
- package/dist/es/ai-model/models/qwen.mjs +113 -0
- package/dist/es/ai-model/models/qwen.mjs.map +1 -0
- package/dist/es/ai-model/models/registry.mjs +45 -0
- package/dist/es/ai-model/models/registry.mjs.map +1 -0
- package/dist/es/ai-model/models/resolved.mjs +104 -0
- package/dist/es/ai-model/models/resolved.mjs.map +1 -0
- package/dist/es/ai-model/models/types.mjs +0 -0
- package/dist/es/ai-model/models/ui-tars/adapter.mjs +142 -0
- package/dist/es/ai-model/models/ui-tars/adapter.mjs.map +1 -0
- package/dist/es/ai-model/{ui-tars-planning.mjs → models/ui-tars/planning.mjs} +44 -62
- package/dist/es/ai-model/models/ui-tars/planning.mjs.map +1 -0
- package/dist/es/ai-model/prompt/extraction.mjs +3 -3
- package/dist/es/ai-model/prompt/extraction.mjs.map +1 -1
- package/dist/es/ai-model/prompt/llm-locator.mjs +11 -11
- package/dist/es/ai-model/prompt/llm-locator.mjs.map +1 -1
- package/dist/es/ai-model/prompt/llm-planning.mjs +25 -60
- package/dist/es/ai-model/prompt/llm-planning.mjs.map +1 -1
- package/dist/es/ai-model/prompt/llm-section-locator.mjs +15 -10
- package/dist/es/ai-model/prompt/llm-section-locator.mjs.map +1 -1
- package/dist/es/ai-model/prompt/locate-grounding-rules.mjs +9 -0
- package/dist/es/ai-model/prompt/locate-grounding-rules.mjs.map +1 -0
- package/dist/es/ai-model/prompt/locate-param-example.mjs +15 -0
- package/dist/es/ai-model/prompt/locate-param-example.mjs.map +1 -0
- package/dist/es/ai-model/prompt/playwright-generator.mjs +5 -5
- package/dist/es/ai-model/prompt/playwright-generator.mjs.map +1 -1
- package/dist/es/ai-model/prompt/yaml-generator.mjs +5 -5
- package/dist/es/ai-model/prompt/yaml-generator.mjs.map +1 -1
- package/dist/es/ai-model/prompts/locate-result-coordinates.mjs +107 -0
- package/dist/es/ai-model/prompts/locate-result-coordinates.mjs.map +1 -0
- package/dist/es/ai-model/service-caller/index.mjs +59 -190
- package/dist/es/ai-model/service-caller/index.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/json.mjs +60 -0
- package/dist/es/ai-model/service-caller/json.mjs.map +1 -0
- package/dist/es/ai-model/shared/model-locate-result/bbox.mjs +68 -0
- package/dist/es/ai-model/shared/model-locate-result/bbox.mjs.map +1 -0
- package/dist/es/ai-model/shared/model-locate-result/factory.mjs +96 -0
- package/dist/es/ai-model/shared/model-locate-result/factory.mjs.map +1 -0
- package/dist/es/ai-model/shared/model-locate-result/index.mjs +3 -0
- package/dist/es/ai-model/shared/model-locate-result/parse.mjs +41 -0
- package/dist/es/ai-model/shared/model-locate-result/parse.mjs.map +1 -0
- package/dist/es/ai-model/shared/model-locate-result/pixel-bbox-mapper.mjs +64 -0
- package/dist/es/ai-model/shared/model-locate-result/pixel-bbox-mapper.mjs.map +1 -0
- package/dist/es/ai-model/shared/model-locate-result/types.mjs +0 -0
- package/dist/es/ai-model/types.mjs +0 -0
- package/dist/es/ai-model/workflows/image-preprocess.mjs +27 -0
- package/dist/es/ai-model/workflows/image-preprocess.mjs.map +1 -0
- package/dist/es/ai-model/workflows/inspect/index.mjs +2 -0
- package/dist/es/ai-model/workflows/inspect/locate-result-rect.mjs +23 -0
- package/dist/es/ai-model/workflows/inspect/locate-result-rect.mjs.map +1 -0
- package/dist/es/ai-model/workflows/inspect/search-area-mapping.mjs +18 -0
- package/dist/es/ai-model/workflows/inspect/search-area-mapping.mjs.map +1 -0
- package/dist/es/ai-model/workflows/inspect/types.mjs +0 -0
- package/dist/es/ai-model/workflows/planning/index.mjs +5 -0
- package/dist/es/ai-model/workflows/planning/index.mjs.map +1 -0
- package/dist/es/ai-model/workflows/planning/types.mjs +0 -0
- package/dist/es/common.mjs +2 -174
- package/dist/es/common.mjs.map +1 -1
- package/dist/es/device/index.mjs.map +1 -1
- package/dist/es/service/index.mjs +96 -69
- package/dist/es/service/index.mjs.map +1 -1
- package/dist/es/types.mjs.map +1 -1
- package/dist/es/utils.mjs +2 -2
- package/dist/es/yaml/player.mjs +4 -3
- package/dist/es/yaml/player.mjs.map +1 -1
- package/dist/lib/agent/agent.js +43 -53
- package/dist/lib/agent/agent.js.map +1 -1
- package/dist/lib/agent/task-builder.js +38 -18
- package/dist/lib/agent/task-builder.js.map +1 -1
- package/dist/lib/agent/tasks.js +23 -21
- package/dist/lib/agent/tasks.js.map +1 -1
- package/dist/lib/agent/utils.js +17 -17
- package/dist/lib/agent/utils.js.map +1 -1
- package/dist/lib/ai-model/connectivity.js +7 -3
- package/dist/lib/ai-model/connectivity.js.map +1 -1
- package/dist/lib/ai-model/errors.js +46 -0
- package/dist/lib/ai-model/errors.js.map +1 -0
- package/dist/lib/ai-model/index.js +7 -14
- package/dist/lib/ai-model/inspect.js +141 -144
- package/dist/lib/ai-model/inspect.js.map +1 -1
- package/dist/lib/ai-model/llm-planning.js +44 -26
- package/dist/lib/ai-model/llm-planning.js.map +1 -1
- package/dist/lib/ai-model/{auto-glm → models/auto-glm}/actions.js +22 -44
- package/dist/lib/ai-model/models/auto-glm/actions.js.map +1 -0
- package/dist/lib/ai-model/models/auto-glm/adapter.js +79 -0
- package/dist/lib/ai-model/models/auto-glm/adapter.js.map +1 -0
- package/dist/lib/ai-model/models/auto-glm/locate.js +146 -0
- package/dist/lib/ai-model/models/auto-glm/locate.js.map +1 -0
- package/dist/lib/ai-model/models/auto-glm/parser.js.map +1 -0
- package/dist/lib/ai-model/{auto-glm → models/auto-glm}/planning.js +8 -9
- package/dist/lib/ai-model/models/auto-glm/planning.js.map +1 -0
- package/dist/lib/ai-model/{auto-glm → models/auto-glm}/prompt.js +14 -16
- package/dist/lib/ai-model/models/auto-glm/prompt.js.map +1 -0
- package/dist/lib/ai-model/{auto-glm/util.js → models/default.js} +13 -13
- package/dist/lib/ai-model/models/default.js.map +1 -0
- package/dist/lib/ai-model/models/doubao.js +184 -0
- package/dist/lib/ai-model/models/doubao.js.map +1 -0
- package/dist/lib/ai-model/models/gemini.js +68 -0
- package/dist/lib/ai-model/models/gemini.js.map +1 -0
- package/dist/lib/ai-model/models/glm.js +71 -0
- package/dist/lib/ai-model/models/glm.js.map +1 -0
- package/dist/lib/ai-model/models/gpt.js +65 -0
- package/dist/lib/ai-model/models/gpt.js.map +1 -0
- package/dist/lib/ai-model/{service-caller/image-detail.js → models/index.js} +8 -7
- package/dist/lib/ai-model/models/index.js.map +1 -0
- package/dist/lib/ai-model/models/qwen.js +147 -0
- package/dist/lib/ai-model/models/qwen.js.map +1 -0
- package/dist/lib/ai-model/models/registry.js +85 -0
- package/dist/lib/ai-model/models/registry.js.map +1 -0
- package/dist/lib/ai-model/models/resolved.js +138 -0
- package/dist/lib/ai-model/models/resolved.js.map +1 -0
- package/dist/lib/ai-model/models/types.js +20 -0
- package/dist/lib/ai-model/models/types.js.map +1 -0
- package/dist/lib/ai-model/models/ui-tars/adapter.js +176 -0
- package/dist/lib/ai-model/models/ui-tars/adapter.js.map +1 -0
- package/dist/lib/ai-model/{ui-tars-planning.js → models/ui-tars/planning.js} +44 -62
- package/dist/lib/ai-model/models/ui-tars/planning.js.map +1 -0
- package/dist/lib/ai-model/prompt/extraction.js +3 -3
- package/dist/lib/ai-model/prompt/extraction.js.map +1 -1
- package/dist/lib/ai-model/prompt/llm-locator.js +11 -11
- package/dist/lib/ai-model/prompt/llm-locator.js.map +1 -1
- package/dist/lib/ai-model/prompt/llm-planning.js +25 -60
- package/dist/lib/ai-model/prompt/llm-planning.js.map +1 -1
- package/dist/lib/ai-model/prompt/llm-section-locator.js +15 -10
- package/dist/lib/ai-model/prompt/llm-section-locator.js.map +1 -1
- package/dist/lib/ai-model/prompt/locate-grounding-rules.js +43 -0
- package/dist/lib/ai-model/prompt/locate-grounding-rules.js.map +1 -0
- package/dist/lib/ai-model/prompt/locate-param-example.js +52 -0
- package/dist/lib/ai-model/prompt/locate-param-example.js.map +1 -0
- package/dist/lib/ai-model/prompt/playwright-generator.js +5 -5
- package/dist/lib/ai-model/prompt/playwright-generator.js.map +1 -1
- package/dist/lib/ai-model/prompt/yaml-generator.js +5 -5
- package/dist/lib/ai-model/prompt/yaml-generator.js.map +1 -1
- package/dist/lib/ai-model/prompts/locate-result-coordinates.js +150 -0
- package/dist/lib/ai-model/prompts/locate-result-coordinates.js.map +1 -0
- package/dist/lib/ai-model/service-caller/index.js +68 -199
- package/dist/lib/ai-model/service-caller/index.js.map +1 -1
- package/dist/lib/ai-model/service-caller/json.js +100 -0
- package/dist/lib/ai-model/service-caller/json.js.map +1 -0
- package/dist/lib/ai-model/shared/model-locate-result/bbox.js +117 -0
- package/dist/lib/ai-model/shared/model-locate-result/bbox.js.map +1 -0
- package/dist/lib/ai-model/shared/model-locate-result/factory.js +130 -0
- package/dist/lib/ai-model/shared/model-locate-result/factory.js.map +1 -0
- package/dist/lib/ai-model/{prompt/common.js → shared/model-locate-result/index.js} +9 -9
- package/dist/lib/ai-model/shared/model-locate-result/index.js.map +1 -0
- package/dist/lib/ai-model/shared/model-locate-result/parse.js +78 -0
- package/dist/lib/ai-model/shared/model-locate-result/parse.js.map +1 -0
- package/dist/lib/ai-model/shared/model-locate-result/pixel-bbox-mapper.js +98 -0
- package/dist/lib/ai-model/shared/model-locate-result/pixel-bbox-mapper.js.map +1 -0
- package/dist/lib/ai-model/shared/model-locate-result/types.js +20 -0
- package/dist/lib/ai-model/shared/model-locate-result/types.js.map +1 -0
- package/dist/lib/ai-model/types.js +20 -0
- package/dist/lib/ai-model/types.js.map +1 -0
- package/dist/lib/ai-model/workflows/image-preprocess.js +61 -0
- package/dist/lib/ai-model/workflows/image-preprocess.js.map +1 -0
- package/dist/lib/ai-model/workflows/inspect/index.js +50 -0
- package/dist/lib/ai-model/workflows/inspect/index.js.map +1 -0
- package/dist/lib/ai-model/workflows/inspect/locate-result-rect.js +60 -0
- package/dist/lib/ai-model/workflows/inspect/locate-result-rect.js.map +1 -0
- package/dist/lib/ai-model/workflows/inspect/search-area-mapping.js +52 -0
- package/dist/lib/ai-model/workflows/inspect/search-area-mapping.js.map +1 -0
- package/dist/lib/ai-model/workflows/inspect/types.js +20 -0
- package/dist/lib/ai-model/workflows/inspect/types.js.map +1 -0
- package/dist/lib/ai-model/{model-family.js → workflows/planning/index.js} +6 -7
- package/dist/lib/ai-model/workflows/planning/index.js.map +1 -0
- package/dist/lib/ai-model/workflows/planning/types.js +20 -0
- package/dist/lib/ai-model/workflows/planning/types.js.map +1 -0
- package/dist/lib/common.js +4 -206
- package/dist/lib/common.js.map +1 -1
- package/dist/lib/device/index.js.map +1 -1
- package/dist/lib/service/index.js +96 -69
- package/dist/lib/service/index.js.map +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/utils.js +2 -2
- package/dist/lib/yaml/player.js +4 -3
- package/dist/lib/yaml/player.js.map +1 -1
- package/dist/types/agent/agent.d.ts +14 -6
- package/dist/types/agent/task-builder.d.ts +2 -2
- package/dist/types/agent/tasks.d.ts +6 -6
- package/dist/types/agent/utils.d.ts +8 -5
- package/dist/types/ai-model/errors.d.ts +2 -0
- package/dist/types/ai-model/index.d.ts +2 -4
- package/dist/types/ai-model/inspect.d.ts +13 -33
- package/dist/types/ai-model/llm-planning.d.ts +6 -17
- package/dist/types/ai-model/{auto-glm → models/auto-glm}/actions.d.ts +2 -2
- package/dist/types/ai-model/models/auto-glm/adapter.d.ts +5 -0
- package/dist/types/ai-model/models/auto-glm/locate.d.ts +3 -0
- package/dist/types/ai-model/models/auto-glm/planning.d.ts +3 -0
- package/dist/types/ai-model/models/auto-glm/prompt.d.ts +4 -0
- package/dist/types/ai-model/models/default.d.ts +2 -0
- package/dist/types/ai-model/models/doubao.d.ts +10 -0
- package/dist/types/ai-model/models/gemini.d.ts +18 -0
- package/dist/types/ai-model/models/glm.d.ts +18 -0
- package/dist/types/ai-model/models/gpt.d.ts +18 -0
- package/dist/types/ai-model/models/index.d.ts +2 -0
- package/dist/types/ai-model/models/qwen.d.ts +30 -0
- package/dist/types/ai-model/models/registry.d.ts +81 -0
- package/dist/types/ai-model/models/resolved.d.ts +9 -0
- package/dist/types/ai-model/models/types.d.ts +102 -0
- package/dist/types/ai-model/models/ui-tars/adapter.d.ts +6 -0
- package/dist/types/ai-model/{ui-tars-planning.d.ts → models/ui-tars/planning.d.ts} +7 -11
- package/dist/types/ai-model/prompt/llm-locator.d.ts +2 -2
- package/dist/types/ai-model/prompt/llm-planning.d.ts +5 -5
- package/dist/types/ai-model/prompt/llm-section-locator.d.ts +2 -2
- package/dist/types/ai-model/prompt/locate-grounding-rules.d.ts +1 -0
- package/dist/types/ai-model/prompt/locate-param-example.d.ts +3 -0
- package/dist/types/ai-model/prompt/playwright-generator.d.ts +3 -3
- package/dist/types/ai-model/prompt/yaml-generator.d.ts +3 -3
- package/dist/types/ai-model/prompts/locate-result-coordinates.d.ts +6 -0
- package/dist/types/ai-model/service-caller/index.d.ts +19 -27
- package/dist/types/ai-model/service-caller/json.d.ts +9 -0
- package/dist/types/ai-model/shared/model-locate-result/bbox.d.ts +7 -0
- package/dist/types/ai-model/shared/model-locate-result/factory.d.ts +2 -0
- package/dist/types/ai-model/shared/model-locate-result/index.d.ts +3 -0
- package/dist/types/ai-model/shared/model-locate-result/parse.d.ts +5 -0
- package/dist/types/ai-model/shared/model-locate-result/pixel-bbox-mapper.d.ts +7 -0
- package/dist/types/ai-model/shared/model-locate-result/types.d.ts +157 -0
- package/dist/types/ai-model/types.d.ts +2 -0
- package/dist/types/ai-model/workflows/image-preprocess.d.ts +30 -0
- package/dist/types/ai-model/workflows/inspect/index.d.ts +1 -0
- package/dist/types/ai-model/workflows/inspect/locate-result-rect.d.ts +4 -0
- package/dist/types/ai-model/workflows/inspect/search-area-mapping.d.ts +3 -0
- package/dist/types/ai-model/workflows/inspect/types.d.ts +37 -0
- package/dist/types/ai-model/workflows/planning/index.d.ts +2 -0
- package/dist/types/ai-model/workflows/planning/types.d.ts +15 -0
- package/dist/types/common.d.ts +0 -30
- package/dist/types/device/index.d.ts +22 -22
- package/dist/types/service/index.d.ts +5 -4
- package/dist/types/types.d.ts +21 -9
- package/dist/types/yaml.d.ts +8 -2
- package/package.json +2 -2
- package/dist/es/ai-model/auto-glm/actions.mjs.map +0 -1
- package/dist/es/ai-model/auto-glm/index.mjs +0 -6
- package/dist/es/ai-model/auto-glm/parser.mjs.map +0 -1
- package/dist/es/ai-model/auto-glm/planning.mjs.map +0 -1
- package/dist/es/ai-model/auto-glm/prompt.mjs.map +0 -1
- package/dist/es/ai-model/auto-glm/util.mjs +0 -9
- package/dist/es/ai-model/auto-glm/util.mjs.map +0 -1
- package/dist/es/ai-model/model-family.mjs +0 -6
- package/dist/es/ai-model/model-family.mjs.map +0 -1
- package/dist/es/ai-model/prompt/common.mjs +0 -8
- package/dist/es/ai-model/prompt/common.mjs.map +0 -1
- package/dist/es/ai-model/service-caller/image-detail.mjs +0 -6
- package/dist/es/ai-model/service-caller/image-detail.mjs.map +0 -1
- package/dist/es/ai-model/ui-tars-planning.mjs.map +0 -1
- package/dist/lib/ai-model/auto-glm/actions.js.map +0 -1
- package/dist/lib/ai-model/auto-glm/index.js +0 -66
- package/dist/lib/ai-model/auto-glm/index.js.map +0 -1
- package/dist/lib/ai-model/auto-glm/parser.js.map +0 -1
- package/dist/lib/ai-model/auto-glm/planning.js.map +0 -1
- package/dist/lib/ai-model/auto-glm/prompt.js.map +0 -1
- package/dist/lib/ai-model/auto-glm/util.js.map +0 -1
- package/dist/lib/ai-model/model-family.js.map +0 -1
- package/dist/lib/ai-model/prompt/common.js.map +0 -1
- package/dist/lib/ai-model/service-caller/image-detail.js.map +0 -1
- package/dist/lib/ai-model/ui-tars-planning.js.map +0 -1
- package/dist/types/ai-model/auto-glm/index.d.ts +0 -6
- package/dist/types/ai-model/auto-glm/planning.d.ts +0 -12
- package/dist/types/ai-model/auto-glm/prompt.d.ts +0 -27
- package/dist/types/ai-model/auto-glm/util.d.ts +0 -13
- package/dist/types/ai-model/model-family.d.ts +0 -7
- package/dist/types/ai-model/prompt/common.d.ts +0 -2
- package/dist/types/ai-model/service-caller/image-detail.d.ts +0 -2
- /package/dist/es/ai-model/{auto-glm → models/auto-glm}/parser.mjs +0 -0
- /package/dist/lib/ai-model/{auto-glm → models/auto-glm}/parser.js +0 -0
- /package/dist/types/ai-model/{auto-glm → models/auto-glm}/parser.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent/utils.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/agent/utils.ts"],"sourcesContent":["// 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__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { TMultimodalPrompt, TUserPrompt } from '@/common';\nimport type { AbstractInterface } from '@/device';\nimport { ScreenshotItem } from '@/screenshot-item';\nimport type {\n ElementCacheFeature,\n LocateResultElement,\n PlanningLocateParam,\n Rect,\n UIContext,\n} from '@/types';\nimport { uploadTestInfoToServer } from '@/utils';\nimport type { TModelFamily } from '@midscene/shared/env';\nimport {\n MIDSCENE_REPORT_QUIET,\n MIDSCENE_REPORT_TAG_NAME,\n globalConfigManager,\n} from '@midscene/shared/env';\nimport { generateElementByRect } from '@midscene/shared/extractor';\nimport { imageInfoOfBase64, resizeImgBase64 } from '@midscene/shared/img';\nimport { getDebug } from '@midscene/shared/logger';\nimport { _keyDefinitions } from '@midscene/shared/us-keyboard-layout';\nimport { assert, logMsg, uuid } from '@midscene/shared/utils';\nimport dayjs from 'dayjs';\nimport type { TaskCache } from './task-cache';\nimport { debug as cacheDebug } from './task-cache';\n\nexport async function commonContextParser(\n interfaceInstance: AbstractInterface,\n _opt: {\n uploadServerUrl?: string;\n screenshotShrinkFactor?: number;\n modelFamily?: TModelFamily;\n },\n): Promise<UIContext> {\n const debug = getDebug('commonContextParser');\n\n assert(interfaceInstance, 'interfaceInstance is required');\n\n debug('Getting interface description');\n const description = interfaceInstance.describe?.() || '';\n debug('Interface description end');\n\n debug('Uploading test info to server');\n uploadTestInfoToServer({\n testUrl: description,\n serverUrl: _opt.uploadServerUrl,\n });\n debug('UploadTestInfoToServer end');\n\n debug('will get size');\n const interfaceSize = await interfaceInstance.size();\n const { width: logicalWidth, height: logicalHeight } = interfaceSize;\n\n if ((interfaceSize as unknown as { dpr: number }).dpr) {\n console.warn(\n 'Warning: return value of interface.size() include a dpr property, which is not expected and ignored. ',\n );\n }\n\n if (!Number.isFinite(logicalWidth) || !Number.isFinite(logicalHeight)) {\n throw new Error(\n `Invalid interface size: width and height must be finite numbers. Received width: ${logicalWidth}, height: ${logicalHeight}`,\n );\n }\n\n if (logicalWidth <= 0 || logicalHeight <= 0) {\n throw new Error(\n `Invalid interface size: width and height must be positive numbers. Received width: ${logicalWidth}, height: ${logicalHeight}`,\n );\n }\n\n debug(`size: ${logicalWidth}x${logicalHeight}`);\n\n const screenshotBase64 = await interfaceInstance.screenshotBase64();\n const screenshotCapturedAt = Date.now();\n assert(screenshotBase64!, 'screenshotBase64 is required');\n\n // Get physical screenshot dimensions\n debug('will get screenshot dimensions');\n const { width: imgWidth, height: imgHeight } =\n await imageInfoOfBase64(screenshotBase64);\n\n if (!Number.isFinite(imgWidth) || !Number.isFinite(imgHeight)) {\n throw new Error(\n `Invalid screenshot dimensions: width and height must be finite numbers. Received width: ${imgWidth}, height: ${imgHeight}`,\n );\n }\n if (imgWidth <= 0 || imgHeight <= 0) {\n throw new Error(\n `Invalid screenshot dimensions: width and height must be positive numbers. Received width: ${imgWidth}, height: ${imgHeight}`,\n );\n }\n debug('screenshot dimensions', imgWidth, 'x', imgHeight);\n\n // Detect orientation mismatch between logical size and screenshot.\n // Some devices (e.g. OPPO) report wrong orientation via ADB, causing\n // size() to return portrait dimensions even when the device is landscape.\n // We detect this by comparing aspect ratios and swap if they disagree.\n const logicalIsPortrait = logicalWidth < logicalHeight;\n const screenshotIsPortrait = imgWidth < imgHeight;\n let finalLogicalWidth = logicalWidth;\n let finalLogicalHeight = logicalHeight;\n if (logicalIsPortrait !== screenshotIsPortrait) {\n debug(\n `Orientation mismatch detected: logical size ${logicalWidth}x${logicalHeight} (${logicalIsPortrait ? 'portrait' : 'landscape'}) vs screenshot ${imgWidth}x${imgHeight} (${screenshotIsPortrait ? 'portrait' : 'landscape'}). Swapping logical dimensions.`,\n );\n finalLogicalWidth = logicalHeight;\n finalLogicalHeight = logicalWidth;\n }\n\n const userShrinkFactor = _opt.screenshotShrinkFactor ?? 1;\n\n if (!Number.isFinite(userShrinkFactor) || userShrinkFactor < 1) {\n throw new Error(\n `Invalid screenshotShrinkFactor: must be a finite number >= 1. Received: ${userShrinkFactor}`,\n );\n }\n\n const dpr = imgWidth / finalLogicalWidth;\n\n debug('calculated dpr:', dpr);\n\n const shrunkShotToLogicalRatio = dpr / userShrinkFactor;\n\n debug('shrunkShotToLogicalRatio', shrunkShotToLogicalRatio);\n\n if (userShrinkFactor !== 1) {\n const targetWidth = Math.round(imgWidth / userShrinkFactor);\n const targetHeight = Math.round(imgHeight / userShrinkFactor);\n\n debug(\n `Applying screenshot shrink factor: ${userShrinkFactor} (physical: ${imgWidth}x${imgHeight} -> target: ${targetWidth}x${targetHeight})`,\n );\n\n const resizedBase64 = await resizeImgBase64(screenshotBase64, {\n width: targetWidth,\n height: targetHeight,\n });\n return {\n shotSize: {\n width: targetWidth,\n height: targetHeight,\n },\n deprecatedDpr: dpr,\n screenshot: ScreenshotItem.create(resizedBase64, screenshotCapturedAt),\n shrunkShotToLogicalRatio,\n };\n }\n\n return {\n shotSize: {\n width: imgWidth,\n height: imgHeight,\n },\n deprecatedDpr: dpr,\n screenshot: ScreenshotItem.create(screenshotBase64, screenshotCapturedAt),\n shrunkShotToLogicalRatio,\n };\n}\n\nexport function getReportFileName(tag = 'web') {\n const reportTagName = globalConfigManager.getEnvConfigValue(\n MIDSCENE_REPORT_TAG_NAME,\n );\n const dateTimeInFileName = dayjs().format('YYYY-MM-DD_HH-mm-ss');\n // ensure uniqueness at the same time\n const uniqueId = uuid().substring(0, 8);\n return `${reportTagName || tag}-${dateTimeInFileName}-${uniqueId}`;\n}\n\nexport function printReportMsg(filepath: string) {\n if (globalConfigManager.getEnvConfigInBoolean(MIDSCENE_REPORT_QUIET)) {\n return;\n }\n logMsg(`Midscene - report file updated: ${filepath}`);\n}\n\nexport function ifPlanLocateParamIsBbox(\n planLocateParam: PlanningLocateParam,\n): boolean {\n return !!(\n planLocateParam.bbox &&\n Array.isArray(planLocateParam.bbox) &&\n planLocateParam.bbox.length === 4\n );\n}\n\nexport function matchElementFromPlan(\n planLocateParam: PlanningLocateParam,\n): LocateResultElement | undefined {\n if (!planLocateParam) {\n return undefined;\n }\n\n if (planLocateParam.bbox) {\n // Convert bbox [x1, y1, x2, y2] to rect {left, top, width, height}\n const rect = {\n left: planLocateParam.bbox[0],\n top: planLocateParam.bbox[1],\n width: planLocateParam.bbox[2] - planLocateParam.bbox[0] + 1,\n height: planLocateParam.bbox[3] - planLocateParam.bbox[1] + 1,\n };\n\n const element = generateElementByRect(\n rect,\n typeof planLocateParam.prompt === 'string'\n ? planLocateParam.prompt\n : planLocateParam.prompt?.prompt || '',\n );\n return element;\n }\n\n return undefined;\n}\n\nexport async function matchElementFromCache(\n context: {\n taskCache?: TaskCache;\n interfaceInstance: AbstractInterface;\n },\n cacheEntry: ElementCacheFeature | undefined,\n cachePrompt: TUserPrompt,\n cacheable: boolean | undefined,\n): Promise<LocateResultElement | undefined> {\n if (!cacheEntry) {\n return undefined;\n }\n\n if (cacheable === false) {\n cacheDebug('cache disabled for prompt: %s', cachePrompt);\n return undefined;\n }\n\n if (!context.taskCache?.isCacheResultUsed) {\n return undefined;\n }\n\n if (!context.interfaceInstance.rectMatchesCacheFeature) {\n cacheDebug(\n 'interface does not implement rectMatchesCacheFeature, skip cache',\n );\n return undefined;\n }\n\n try {\n const rect =\n await context.interfaceInstance.rectMatchesCacheFeature(cacheEntry);\n const element: LocateResultElement = {\n center: [\n Math.round(rect.left + rect.width / 2),\n Math.round(rect.top + rect.height / 2),\n ],\n rect,\n description:\n typeof cachePrompt === 'string'\n ? cachePrompt\n : cachePrompt.prompt || '',\n };\n\n cacheDebug('cache hit, prompt: %s', cachePrompt);\n return element;\n } catch (error) {\n cacheDebug('rectMatchesCacheFeature error: %s', error);\n return undefined;\n }\n}\n\ndeclare const __VERSION__: string | undefined;\n\nexport const getMidsceneVersion = (): string => {\n if (typeof __VERSION__ !== 'undefined') {\n return __VERSION__;\n } else if (\n process.env.__VERSION__ &&\n process.env.__VERSION__ !== 'undefined'\n ) {\n return process.env.__VERSION__;\n }\n throw new Error('__VERSION__ inject failed during build');\n};\n\nexport const parsePrompt = (\n prompt: TUserPrompt,\n): {\n textPrompt: string;\n multimodalPrompt?: TMultimodalPrompt;\n} => {\n if (typeof prompt === 'string') {\n return {\n textPrompt: prompt,\n multimodalPrompt: undefined,\n };\n }\n return {\n textPrompt: prompt.prompt,\n multimodalPrompt: prompt.images\n ? {\n images: prompt.images,\n convertHttpImage2Base64: !!prompt.convertHttpImage2Base64,\n }\n : undefined,\n };\n};\n\nexport const transformLogicalElementToScreenshot = (\n element: LocateResultElement,\n shrunkShotToLogicalRatio: number,\n): LocateResultElement => {\n if (shrunkShotToLogicalRatio === 1) {\n return element;\n }\n\n return {\n ...element,\n center: [\n Math.round(element.center[0] * shrunkShotToLogicalRatio),\n Math.round(element.center[1] * shrunkShotToLogicalRatio),\n ],\n rect: {\n ...element.rect,\n left: Math.round(element.rect.left * shrunkShotToLogicalRatio),\n top: Math.round(element.rect.top * shrunkShotToLogicalRatio),\n width: Math.round(element.rect.width * shrunkShotToLogicalRatio),\n height: Math.round(element.rect.height * shrunkShotToLogicalRatio),\n },\n };\n};\n\nexport const transformLogicalRectToScreenshotRect = (\n rect: Rect,\n shrunkShotToLogicalRatio: number,\n): Rect => {\n if (shrunkShotToLogicalRatio === 1) {\n return rect;\n }\n\n return {\n ...rect,\n left: Math.round(rect.left * shrunkShotToLogicalRatio),\n top: Math.round(rect.top * shrunkShotToLogicalRatio),\n width: Math.round(rect.width * shrunkShotToLogicalRatio),\n height: Math.round(rect.height * shrunkShotToLogicalRatio),\n };\n};\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","commonContextParser","interfaceInstance","_opt","debug","getDebug","assert","description","uploadTestInfoToServer","interfaceSize","logicalWidth","logicalHeight","console","Number","Error","screenshotBase64","screenshotCapturedAt","Date","imgWidth","imgHeight","imageInfoOfBase64","logicalIsPortrait","screenshotIsPortrait","finalLogicalWidth","userShrinkFactor","dpr","shrunkShotToLogicalRatio","targetWidth","Math","targetHeight","resizedBase64","resizeImgBase64","ScreenshotItem","getReportFileName","tag","reportTagName","globalConfigManager","MIDSCENE_REPORT_TAG_NAME","dateTimeInFileName","dayjs","uniqueId","uuid","printReportMsg","filepath","MIDSCENE_REPORT_QUIET","logMsg","ifPlanLocateParamIsBbox","planLocateParam","Array","matchElementFromPlan","rect","element","generateElementByRect","matchElementFromCache","context","cacheEntry","cachePrompt","cacheable","cacheDebug","error","getMidsceneVersion","__VERSION__","parsePrompt","prompt","undefined","transformLogicalElementToScreenshot","transformLogicalRectToScreenshotRect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent/utils.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/agent/utils.ts"],"sourcesContent":["// 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__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { pixelBboxToRect } from '@/ai-model/workflows/inspect/locate-result-rect';\nimport type { TMultimodalPrompt, TUserPrompt } from '@/common';\nimport type { AbstractInterface } from '@/device';\nimport { ScreenshotItem } from '@/screenshot-item';\nimport type {\n ElementCacheFeature,\n LocateResultElement,\n PixelBbox,\n PlanningLocateParam,\n PlanningLocateParamWithLocatedPixelBbox,\n Rect,\n UIContext,\n} from '@/types';\nimport { uploadTestInfoToServer } from '@/utils';\nimport {\n MIDSCENE_REPORT_QUIET,\n MIDSCENE_REPORT_TAG_NAME,\n globalConfigManager,\n} from '@midscene/shared/env';\nimport { generateElementByRect } from '@midscene/shared/extractor';\nimport { imageInfoOfBase64, resizeImgBase64 } from '@midscene/shared/img';\nimport { getDebug } from '@midscene/shared/logger';\nimport { _keyDefinitions } from '@midscene/shared/us-keyboard-layout';\nimport { assert, logMsg, uuid } from '@midscene/shared/utils';\nimport dayjs from 'dayjs';\nimport type { TaskCache } from './task-cache';\nimport { debug as cacheDebug } from './task-cache';\n\nexport async function commonContextParser(\n interfaceInstance: AbstractInterface,\n _opt: {\n uploadServerUrl?: string;\n screenshotShrinkFactor?: number;\n },\n): Promise<UIContext> {\n const debug = getDebug('commonContextParser');\n\n assert(interfaceInstance, 'interfaceInstance is required');\n\n debug('Getting interface description');\n const description = interfaceInstance.describe?.() || '';\n debug('Interface description end');\n\n debug('Uploading test info to server');\n uploadTestInfoToServer({\n testUrl: description,\n serverUrl: _opt.uploadServerUrl,\n });\n debug('UploadTestInfoToServer end');\n\n debug('will get size');\n const interfaceSize = await interfaceInstance.size();\n const { width: logicalWidth, height: logicalHeight } = interfaceSize;\n\n if ((interfaceSize as unknown as { dpr: number }).dpr) {\n console.warn(\n 'Warning: return value of interface.size() include a dpr property, which is not expected and ignored. ',\n );\n }\n\n if (!Number.isFinite(logicalWidth) || !Number.isFinite(logicalHeight)) {\n throw new Error(\n `Invalid interface size: width and height must be finite numbers. Received width: ${logicalWidth}, height: ${logicalHeight}`,\n );\n }\n\n if (logicalWidth <= 0 || logicalHeight <= 0) {\n throw new Error(\n `Invalid interface size: width and height must be positive numbers. Received width: ${logicalWidth}, height: ${logicalHeight}`,\n );\n }\n\n debug(`size: ${logicalWidth}x${logicalHeight}`);\n\n const screenshotBase64 = await interfaceInstance.screenshotBase64();\n const screenshotCapturedAt = Date.now();\n assert(screenshotBase64!, 'screenshotBase64 is required');\n\n // Get physical screenshot dimensions\n debug('will get screenshot dimensions');\n const { width: imgWidth, height: imgHeight } =\n await imageInfoOfBase64(screenshotBase64);\n\n if (!Number.isFinite(imgWidth) || !Number.isFinite(imgHeight)) {\n throw new Error(\n `Invalid screenshot dimensions: width and height must be finite numbers. Received width: ${imgWidth}, height: ${imgHeight}`,\n );\n }\n if (imgWidth <= 0 || imgHeight <= 0) {\n throw new Error(\n `Invalid screenshot dimensions: width and height must be positive numbers. Received width: ${imgWidth}, height: ${imgHeight}`,\n );\n }\n debug('screenshot dimensions', imgWidth, 'x', imgHeight);\n\n // Detect orientation mismatch between logical size and screenshot.\n // Some devices (e.g. OPPO) report wrong orientation via ADB, causing\n // size() to return portrait dimensions even when the device is landscape.\n // We detect this by comparing aspect ratios and swap if they disagree.\n const logicalIsPortrait = logicalWidth < logicalHeight;\n const screenshotIsPortrait = imgWidth < imgHeight;\n let finalLogicalWidth = logicalWidth;\n let finalLogicalHeight = logicalHeight;\n if (logicalIsPortrait !== screenshotIsPortrait) {\n debug(\n `Orientation mismatch detected: logical size ${logicalWidth}x${logicalHeight} (${logicalIsPortrait ? 'portrait' : 'landscape'}) vs screenshot ${imgWidth}x${imgHeight} (${screenshotIsPortrait ? 'portrait' : 'landscape'}). Swapping logical dimensions.`,\n );\n finalLogicalWidth = logicalHeight;\n finalLogicalHeight = logicalWidth;\n }\n\n const userShrinkFactor = _opt.screenshotShrinkFactor ?? 1;\n\n if (!Number.isFinite(userShrinkFactor) || userShrinkFactor < 1) {\n throw new Error(\n `Invalid screenshotShrinkFactor: must be a finite number >= 1. Received: ${userShrinkFactor}`,\n );\n }\n\n const dpr = imgWidth / finalLogicalWidth;\n\n debug('calculated dpr:', dpr);\n\n const shrunkShotToLogicalRatio = dpr / userShrinkFactor;\n\n debug('shrunkShotToLogicalRatio', shrunkShotToLogicalRatio);\n\n if (userShrinkFactor !== 1) {\n const targetWidth = Math.round(imgWidth / userShrinkFactor);\n const targetHeight = Math.round(imgHeight / userShrinkFactor);\n\n debug(\n `Applying screenshot shrink factor: ${userShrinkFactor} (physical: ${imgWidth}x${imgHeight} -> target: ${targetWidth}x${targetHeight})`,\n );\n\n const resizedBase64 = await resizeImgBase64(screenshotBase64, {\n width: targetWidth,\n height: targetHeight,\n });\n return {\n shotSize: {\n width: targetWidth,\n height: targetHeight,\n },\n deprecatedDpr: dpr,\n screenshot: ScreenshotItem.create(resizedBase64, screenshotCapturedAt),\n shrunkShotToLogicalRatio,\n };\n }\n\n return {\n shotSize: {\n width: imgWidth,\n height: imgHeight,\n },\n deprecatedDpr: dpr,\n screenshot: ScreenshotItem.create(screenshotBase64, screenshotCapturedAt),\n shrunkShotToLogicalRatio,\n };\n}\n\nexport function getReportFileName(tag = 'web') {\n const reportTagName = globalConfigManager.getEnvConfigValue(\n MIDSCENE_REPORT_TAG_NAME,\n );\n const dateTimeInFileName = dayjs().format('YYYY-MM-DD_HH-mm-ss');\n // ensure uniqueness at the same time\n const uniqueId = uuid().substring(0, 8);\n return `${reportTagName || tag}-${dateTimeInFileName}-${uniqueId}`;\n}\n\nexport function printReportMsg(filepath: string) {\n if (globalConfigManager.getEnvConfigInBoolean(MIDSCENE_REPORT_QUIET)) {\n return;\n }\n logMsg(`Midscene - report file updated: ${filepath}`);\n}\n\nexport function isPixelBbox(value: unknown): value is PixelBbox {\n return (\n Array.isArray(value) &&\n value.length === 4 &&\n value.every((item) => typeof item === 'number' && Number.isFinite(item))\n );\n}\n\ntype PlanningLocateParamWithMaybeLocatedPixelBbox = PlanningLocateParam & {\n locatedPixelBbox?: unknown;\n};\n\nexport function ifPlanLocateParamHasLocatedPixelBbox(\n planLocateParam: PlanningLocateParamWithMaybeLocatedPixelBbox,\n): planLocateParam is PlanningLocateParamWithLocatedPixelBbox {\n return isPixelBbox(planLocateParam.locatedPixelBbox);\n}\n\nexport function matchElementFromPlan(\n planLocateParam: PlanningLocateParamWithLocatedPixelBbox,\n): LocateResultElement | undefined {\n if (!planLocateParam) {\n return undefined;\n }\n\n const rect = pixelBboxToRect(planLocateParam.locatedPixelBbox);\n\n const element = generateElementByRect(\n rect,\n typeof planLocateParam.prompt === 'string'\n ? planLocateParam.prompt\n : planLocateParam.prompt?.prompt || '',\n );\n return element;\n}\n\nexport async function matchElementFromCache(\n context: {\n taskCache?: TaskCache;\n interfaceInstance: AbstractInterface;\n },\n cacheEntry: ElementCacheFeature | undefined,\n cachePrompt: TUserPrompt,\n cacheable: boolean | undefined,\n): Promise<LocateResultElement | undefined> {\n if (!cacheEntry) {\n return undefined;\n }\n\n if (cacheable === false) {\n cacheDebug('cache disabled for prompt: %s', cachePrompt);\n return undefined;\n }\n\n if (!context.taskCache?.isCacheResultUsed) {\n return undefined;\n }\n\n if (!context.interfaceInstance.rectMatchesCacheFeature) {\n cacheDebug(\n 'interface does not implement rectMatchesCacheFeature, skip cache',\n );\n return undefined;\n }\n\n try {\n const rect =\n await context.interfaceInstance.rectMatchesCacheFeature(cacheEntry);\n const element: LocateResultElement = {\n center: [\n Math.round(rect.left + rect.width / 2),\n Math.round(rect.top + rect.height / 2),\n ],\n rect,\n description:\n typeof cachePrompt === 'string'\n ? cachePrompt\n : cachePrompt.prompt || '',\n };\n\n cacheDebug('cache hit, prompt: %s', cachePrompt);\n return element;\n } catch (error) {\n cacheDebug('rectMatchesCacheFeature error: %s', error);\n return undefined;\n }\n}\n\ndeclare const __VERSION__: string | undefined;\n\nexport const getMidsceneVersion = (): string => {\n if (typeof __VERSION__ !== 'undefined') {\n return __VERSION__;\n } else if (\n process.env.__VERSION__ &&\n process.env.__VERSION__ !== 'undefined'\n ) {\n return process.env.__VERSION__;\n }\n throw new Error('__VERSION__ inject failed during build');\n};\n\nexport const parsePrompt = (\n prompt: TUserPrompt,\n): {\n textPrompt: string;\n multimodalPrompt?: TMultimodalPrompt;\n} => {\n if (typeof prompt === 'string') {\n return {\n textPrompt: prompt,\n multimodalPrompt: undefined,\n };\n }\n return {\n textPrompt: prompt.prompt,\n multimodalPrompt: prompt.images\n ? {\n images: prompt.images,\n convertHttpImage2Base64: !!prompt.convertHttpImage2Base64,\n }\n : undefined,\n };\n};\n\nexport const transformLogicalElementToScreenshot = (\n element: LocateResultElement,\n shrunkShotToLogicalRatio: number,\n): LocateResultElement => {\n if (shrunkShotToLogicalRatio === 1) {\n return element;\n }\n\n return {\n ...element,\n center: [\n Math.round(element.center[0] * shrunkShotToLogicalRatio),\n Math.round(element.center[1] * shrunkShotToLogicalRatio),\n ],\n rect: {\n ...element.rect,\n left: Math.round(element.rect.left * shrunkShotToLogicalRatio),\n top: Math.round(element.rect.top * shrunkShotToLogicalRatio),\n width: Math.round(element.rect.width * shrunkShotToLogicalRatio),\n height: Math.round(element.rect.height * shrunkShotToLogicalRatio),\n },\n };\n};\n\nexport const transformLogicalRectToScreenshotRect = (\n rect: Rect,\n shrunkShotToLogicalRatio: number,\n): Rect => {\n if (shrunkShotToLogicalRatio === 1) {\n return rect;\n }\n\n return {\n ...rect,\n left: Math.round(rect.left * shrunkShotToLogicalRatio),\n top: Math.round(rect.top * shrunkShotToLogicalRatio),\n width: Math.round(rect.width * shrunkShotToLogicalRatio),\n height: Math.round(rect.height * shrunkShotToLogicalRatio),\n };\n};\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","commonContextParser","interfaceInstance","_opt","debug","getDebug","assert","description","uploadTestInfoToServer","interfaceSize","logicalWidth","logicalHeight","console","Number","Error","screenshotBase64","screenshotCapturedAt","Date","imgWidth","imgHeight","imageInfoOfBase64","logicalIsPortrait","screenshotIsPortrait","finalLogicalWidth","userShrinkFactor","dpr","shrunkShotToLogicalRatio","targetWidth","Math","targetHeight","resizedBase64","resizeImgBase64","ScreenshotItem","getReportFileName","tag","reportTagName","globalConfigManager","MIDSCENE_REPORT_TAG_NAME","dateTimeInFileName","dayjs","uniqueId","uuid","printReportMsg","filepath","MIDSCENE_REPORT_QUIET","logMsg","isPixelBbox","value","Array","item","ifPlanLocateParamHasLocatedPixelBbox","planLocateParam","matchElementFromPlan","rect","pixelBboxToRect","element","generateElementByRect","matchElementFromCache","context","cacheEntry","cachePrompt","cacheable","cacheDebug","error","getMidsceneVersion","__VERSION__","parsePrompt","prompt","undefined","transformLogicalElementToScreenshot","transformLogicalRectToScreenshotRect"],"mappings":"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"}
|
|
@@ -39,6 +39,7 @@ const external_screenshot_item_js_namespaceObject = require("../screenshot-item.
|
|
|
39
39
|
const index_js_namespaceObject = require("../service/index.js");
|
|
40
40
|
var index_js_default = /*#__PURE__*/ __webpack_require__.n(index_js_namespaceObject);
|
|
41
41
|
const img_namespaceObject = require("@midscene/shared/img");
|
|
42
|
+
const external_models_index_js_namespaceObject = require("./models/index.js");
|
|
42
43
|
const external_service_caller_index_js_namespaceObject = require("./service-caller/index.js");
|
|
43
44
|
const CONNECTIVITY_FIXTURE_IMAGE = 'data:image/png;base64,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';
|
|
44
45
|
const TEXT_EXPECTED_TOKEN = 'CONNECTIVITY_OK';
|
|
@@ -76,6 +77,9 @@ function buildCheckResult(name, modelConfig, result) {
|
|
|
76
77
|
}
|
|
77
78
|
async function runConnectivityTest(config) {
|
|
78
79
|
const checks = [];
|
|
80
|
+
const planningModelRuntime = (0, external_models_index_js_namespaceObject.getModelRuntime)(config.planningModelConfig);
|
|
81
|
+
const insightModelRuntime = (0, external_models_index_js_namespaceObject.getModelRuntime)(config.insightModelConfig);
|
|
82
|
+
const defaultModelRuntime = (0, external_models_index_js_namespaceObject.getModelRuntime)(config.defaultModelConfig);
|
|
79
83
|
{
|
|
80
84
|
const startTime = Date.now();
|
|
81
85
|
try {
|
|
@@ -88,7 +92,7 @@ async function runConnectivityTest(config) {
|
|
|
88
92
|
role: 'user',
|
|
89
93
|
content: `Return exactly ${TEXT_EXPECTED_TOKEN}`
|
|
90
94
|
}
|
|
91
|
-
],
|
|
95
|
+
], planningModelRuntime);
|
|
92
96
|
const content = result.content.trim();
|
|
93
97
|
const passed = content.includes(TEXT_EXPECTED_TOKEN);
|
|
94
98
|
checks.push(buildCheckResult('text', config.planningModelConfig, {
|
|
@@ -124,7 +128,7 @@ async function runConnectivityTest(config) {
|
|
|
124
128
|
}
|
|
125
129
|
]
|
|
126
130
|
}
|
|
127
|
-
],
|
|
131
|
+
], insightModelRuntime);
|
|
128
132
|
normalizeText(result.content);
|
|
129
133
|
checks.push(buildCheckResult('vision', config.insightModelConfig, {
|
|
130
134
|
passed: true,
|
|
@@ -146,7 +150,7 @@ async function runConnectivityTest(config) {
|
|
|
146
150
|
const service = new (index_js_default())(context);
|
|
147
151
|
const locateResult = await service.locate({
|
|
148
152
|
prompt: LOCATE_PROMPT
|
|
149
|
-
}, {},
|
|
153
|
+
}, {}, defaultModelRuntime);
|
|
150
154
|
const targetRect = locateResult.rect || locateResult.element?.rect;
|
|
151
155
|
const center = locateResult.element?.center;
|
|
152
156
|
const passed = hasValidRect(targetRect) && hasValidCenter(center);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-model/connectivity.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/ai-model/connectivity.ts"],"sourcesContent":["// 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__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { ScreenshotItem } from '@/screenshot-item';\nimport Service from '@/service';\nimport type { UIContext } from '@/types';\nimport type { IModelConfig, TIntent } from '@midscene/shared/env';\nimport { imageInfoOfBase64 } from '@midscene/shared/img';\nimport { callAI } from './service-caller';\n\nconst CONNECTIVITY_FIXTURE_IMAGE =\n 'data:image/png;base64,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';\n\nconst TEXT_EXPECTED_TOKEN = 'CONNECTIVITY_OK';\nconst VISION_EXPECTED_TEXT = 'what needs to be done?';\nconst LOCATE_PROMPT = 'the main todo input box';\n\nexport interface ConnectivityCheckResultItem {\n name: 'text' | 'vision' | 'aiLocate';\n intent: TIntent;\n modelName: string;\n modelFamily?: string;\n passed: boolean;\n durationMs: number;\n message: string;\n}\n\nexport interface ConnectivityTestResult {\n passed: boolean;\n checks: ConnectivityCheckResultItem[];\n}\n\nexport interface ConnectivityTestConfig {\n defaultModelConfig: IModelConfig;\n planningModelConfig: IModelConfig;\n insightModelConfig: IModelConfig;\n}\n\nfunction normalizeText(text: string): string {\n return text\n .trim()\n .replace(/^['\"`]+|['\"`]+$/g, '')\n .toLowerCase();\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nfunction hasValidRect(value: unknown): boolean {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const rect = value as {\n left?: unknown;\n top?: unknown;\n width?: unknown;\n height?: unknown;\n };\n\n return (\n isFiniteNumber(rect.left) &&\n isFiniteNumber(rect.top) &&\n isFiniteNumber(rect.width) &&\n isFiniteNumber(rect.height)\n );\n}\n\nfunction hasValidCenter(value: unknown): boolean {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n isFiniteNumber(value[0]) &&\n isFiniteNumber(value[1])\n );\n}\n\nasync function buildFixtureContext(): Promise<UIContext> {\n const shotSize = await imageInfoOfBase64(CONNECTIVITY_FIXTURE_IMAGE);\n return {\n screenshot: ScreenshotItem.create(CONNECTIVITY_FIXTURE_IMAGE, Date.now()),\n shotSize,\n shrunkShotToLogicalRatio: 1,\n };\n}\n\nfunction buildCheckResult(\n name: ConnectivityCheckResultItem['name'],\n modelConfig: IModelConfig,\n result: Omit<\n ConnectivityCheckResultItem,\n 'name' | 'intent' | 'modelName' | 'modelFamily'\n >,\n): ConnectivityCheckResultItem {\n return {\n name,\n intent: modelConfig.intent,\n modelName: modelConfig.modelName,\n modelFamily: modelConfig.modelFamily,\n ...result,\n };\n}\n\nexport async function runConnectivityTest(\n config: ConnectivityTestConfig,\n): Promise<ConnectivityTestResult> {\n const checks: ConnectivityCheckResultItem[] = [];\n\n {\n const startTime = Date.now();\n try {\n const result = await callAI(\n [\n {\n role: 'system',\n content: 'Reply with the exact token the user asks for.',\n },\n {\n role: 'user',\n content: `Return exactly ${TEXT_EXPECTED_TOKEN}`,\n },\n ],\n config.planningModelConfig,\n );\n const content = result.content.trim();\n const passed = content.includes(TEXT_EXPECTED_TOKEN);\n checks.push(\n buildCheckResult('text', config.planningModelConfig, {\n passed,\n durationMs: Date.now() - startTime,\n message: passed ? '' : `Unexpected response: ${content}`,\n }),\n );\n } catch (error) {\n checks.push(\n buildCheckResult('text', config.planningModelConfig, {\n passed: false,\n durationMs: Date.now() - startTime,\n message: error instanceof Error ? error.message : String(error),\n }),\n );\n }\n }\n\n {\n const startTime = Date.now();\n try {\n const result = await callAI(\n [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'What is the main content of this image ? It is a photo or a form ?',\n },\n {\n type: 'image_url',\n image_url: {\n url: CONNECTIVITY_FIXTURE_IMAGE,\n detail: 'high',\n },\n },\n ],\n },\n ],\n config.insightModelConfig,\n );\n const normalized = normalizeText(result.content);\n checks.push(\n buildCheckResult('vision', config.insightModelConfig, {\n passed: true,\n durationMs: Date.now() - startTime,\n message: '',\n }),\n );\n } catch (error) {\n checks.push(\n buildCheckResult('vision', config.insightModelConfig, {\n passed: false,\n durationMs: Date.now() - startTime,\n message: error instanceof Error ? error.message : String(error),\n }),\n );\n }\n }\n\n {\n const startTime = Date.now();\n try {\n const context = await buildFixtureContext();\n const service = new Service(context);\n const locateResult = await service.locate(\n { prompt: LOCATE_PROMPT },\n {},\n config.defaultModelConfig,\n );\n const targetRect = locateResult.rect || locateResult.element?.rect;\n const center = locateResult.element?.center;\n const passed = hasValidRect(targetRect) && hasValidCenter(center);\n checks.push(\n buildCheckResult('aiLocate', config.defaultModelConfig, {\n passed,\n durationMs: Date.now() - startTime,\n message: passed\n ? ''\n : `Invalid locate result: ${JSON.stringify({\n rect: targetRect,\n center,\n })}`,\n }),\n );\n } catch (error) {\n checks.push(\n buildCheckResult('aiLocate', config.defaultModelConfig, {\n passed: false,\n durationMs: Date.now() - startTime,\n message: error instanceof Error ? error.message : String(error),\n }),\n );\n }\n }\n\n return {\n passed: checks.every((item) => item.passed),\n checks,\n };\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","CONNECTIVITY_FIXTURE_IMAGE","TEXT_EXPECTED_TOKEN","LOCATE_PROMPT","normalizeText","text","isFiniteNumber","value","Number","hasValidRect","rect","hasValidCenter","Array","buildFixtureContext","shotSize","imageInfoOfBase64","ScreenshotItem","Date","buildCheckResult","name","modelConfig","result","runConnectivityTest","config","checks","startTime","callAI","content","passed","error","Error","String","context","service","Service","locateResult","targetRect","center","JSON","item"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai-model/connectivity.js","sources":["webpack/runtime/compat_get_default_export","webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/ai-model/connectivity.ts"],"sourcesContent":["// 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__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { ScreenshotItem } from '@/screenshot-item';\nimport Service from '@/service';\nimport type { UIContext } from '@/types';\nimport type { IModelConfig, TIntent } from '@midscene/shared/env';\nimport { imageInfoOfBase64 } from '@midscene/shared/img';\nimport { getModelRuntime } from './models';\nimport { callAI } from './service-caller';\n\nconst CONNECTIVITY_FIXTURE_IMAGE =\n 'data:image/png;base64,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';\n\nconst TEXT_EXPECTED_TOKEN = 'CONNECTIVITY_OK';\nconst VISION_EXPECTED_TEXT = 'what needs to be done?';\nconst LOCATE_PROMPT = 'the main todo input box';\n\nexport interface ConnectivityCheckResultItem {\n name: 'text' | 'vision' | 'aiLocate';\n intent: TIntent;\n modelName: string;\n modelFamily?: string;\n passed: boolean;\n durationMs: number;\n message: string;\n}\n\nexport interface ConnectivityTestResult {\n passed: boolean;\n checks: ConnectivityCheckResultItem[];\n}\n\nexport interface ConnectivityTestConfig {\n defaultModelConfig: IModelConfig;\n planningModelConfig: IModelConfig;\n insightModelConfig: IModelConfig;\n}\n\nfunction normalizeText(text: string): string {\n return text\n .trim()\n .replace(/^['\"`]+|['\"`]+$/g, '')\n .toLowerCase();\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nfunction hasValidRect(value: unknown): boolean {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const rect = value as {\n left?: unknown;\n top?: unknown;\n width?: unknown;\n height?: unknown;\n };\n\n return (\n isFiniteNumber(rect.left) &&\n isFiniteNumber(rect.top) &&\n isFiniteNumber(rect.width) &&\n isFiniteNumber(rect.height)\n );\n}\n\nfunction hasValidCenter(value: unknown): boolean {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n isFiniteNumber(value[0]) &&\n isFiniteNumber(value[1])\n );\n}\n\nasync function buildFixtureContext(): Promise<UIContext> {\n const shotSize = await imageInfoOfBase64(CONNECTIVITY_FIXTURE_IMAGE);\n return {\n screenshot: ScreenshotItem.create(CONNECTIVITY_FIXTURE_IMAGE, Date.now()),\n shotSize,\n shrunkShotToLogicalRatio: 1,\n };\n}\n\nfunction buildCheckResult(\n name: ConnectivityCheckResultItem['name'],\n modelConfig: IModelConfig,\n result: Omit<\n ConnectivityCheckResultItem,\n 'name' | 'intent' | 'modelName' | 'modelFamily'\n >,\n): ConnectivityCheckResultItem {\n return {\n name,\n intent: modelConfig.intent,\n modelName: modelConfig.modelName,\n modelFamily: modelConfig.modelFamily,\n ...result,\n };\n}\n\nexport async function runConnectivityTest(\n config: ConnectivityTestConfig,\n): Promise<ConnectivityTestResult> {\n const checks: ConnectivityCheckResultItem[] = [];\n const planningModelRuntime = getModelRuntime(config.planningModelConfig);\n const insightModelRuntime = getModelRuntime(config.insightModelConfig);\n const defaultModelRuntime = getModelRuntime(config.defaultModelConfig);\n\n {\n const startTime = Date.now();\n try {\n const result = await callAI(\n [\n {\n role: 'system',\n content: 'Reply with the exact token the user asks for.',\n },\n {\n role: 'user',\n content: `Return exactly ${TEXT_EXPECTED_TOKEN}`,\n },\n ],\n planningModelRuntime,\n );\n const content = result.content.trim();\n const passed = content.includes(TEXT_EXPECTED_TOKEN);\n checks.push(\n buildCheckResult('text', config.planningModelConfig, {\n passed,\n durationMs: Date.now() - startTime,\n message: passed ? '' : `Unexpected response: ${content}`,\n }),\n );\n } catch (error) {\n checks.push(\n buildCheckResult('text', config.planningModelConfig, {\n passed: false,\n durationMs: Date.now() - startTime,\n message: error instanceof Error ? error.message : String(error),\n }),\n );\n }\n }\n\n {\n const startTime = Date.now();\n try {\n const result = await callAI(\n [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'What is the main content of this image ? It is a photo or a form ?',\n },\n {\n type: 'image_url',\n image_url: {\n url: CONNECTIVITY_FIXTURE_IMAGE,\n detail: 'high',\n },\n },\n ],\n },\n ],\n insightModelRuntime,\n );\n const normalized = normalizeText(result.content);\n checks.push(\n buildCheckResult('vision', config.insightModelConfig, {\n passed: true,\n durationMs: Date.now() - startTime,\n message: '',\n }),\n );\n } catch (error) {\n checks.push(\n buildCheckResult('vision', config.insightModelConfig, {\n passed: false,\n durationMs: Date.now() - startTime,\n message: error instanceof Error ? error.message : String(error),\n }),\n );\n }\n }\n\n {\n const startTime = Date.now();\n try {\n const context = await buildFixtureContext();\n const service = new Service(context);\n const locateResult = await service.locate(\n { prompt: LOCATE_PROMPT },\n {},\n defaultModelRuntime,\n );\n const targetRect = locateResult.rect || locateResult.element?.rect;\n const center = locateResult.element?.center;\n const passed = hasValidRect(targetRect) && hasValidCenter(center);\n checks.push(\n buildCheckResult('aiLocate', config.defaultModelConfig, {\n passed,\n durationMs: Date.now() - startTime,\n message: passed\n ? ''\n : `Invalid locate result: ${JSON.stringify({\n rect: targetRect,\n center,\n })}`,\n }),\n );\n } catch (error) {\n checks.push(\n buildCheckResult('aiLocate', config.defaultModelConfig, {\n passed: false,\n durationMs: Date.now() - startTime,\n message: error instanceof Error ? error.message : String(error),\n }),\n );\n }\n }\n\n return {\n passed: checks.every((item) => item.passed),\n checks,\n };\n}\n"],"names":["__webpack_require__","module","getter","definition","key","Object","obj","prop","Symbol","CONNECTIVITY_FIXTURE_IMAGE","TEXT_EXPECTED_TOKEN","LOCATE_PROMPT","normalizeText","text","isFiniteNumber","value","Number","hasValidRect","rect","hasValidCenter","Array","buildFixtureContext","shotSize","imageInfoOfBase64","ScreenshotItem","Date","buildCheckResult","name","modelConfig","result","runConnectivityTest","config","checks","planningModelRuntime","getModelRuntime","insightModelRuntime","defaultModelRuntime","startTime","callAI","content","passed","error","Error","String","context","service","Service","locateResult","targetRect","center","JSON","item"],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
defaultModelFamilyRequiredForLocateMessage: ()=>defaultModelFamilyRequiredForLocateMessage,
|
|
28
|
+
planningModelFamilyRequiredForLocateMessage: ()=>planningModelFamilyRequiredForLocateMessage
|
|
29
|
+
});
|
|
30
|
+
const modelConfigDocUrl = 'https://midscenejs.com/model-config';
|
|
31
|
+
const defaultModelFamilyRequiredForLocateMessage = `Default model family is required for locate. Configure MIDSCENE_MODEL_FAMILY so Midscene can parse locate coordinates correctly. ${modelConfigDocUrl}`;
|
|
32
|
+
function planningModelFamilyRequiredForLocateMessage(slot) {
|
|
33
|
+
if ('planning' === slot) return `Planning model family is required because aiAct is asking the planning model to return locate coordinates. Configure MIDSCENE_PLANNING_MODEL_FAMILY for the planning model, or remove the separate planning model config and configure MIDSCENE_MODEL_FAMILY on the default model. ${modelConfigDocUrl}`;
|
|
34
|
+
return `Default model family is required because aiAct is asking the default model to return locate coordinates during planning. Configure MIDSCENE_MODEL_FAMILY so Midscene can parse planning locate coordinates correctly. ${modelConfigDocUrl}`;
|
|
35
|
+
}
|
|
36
|
+
exports.defaultModelFamilyRequiredForLocateMessage = __webpack_exports__.defaultModelFamilyRequiredForLocateMessage;
|
|
37
|
+
exports.planningModelFamilyRequiredForLocateMessage = __webpack_exports__.planningModelFamilyRequiredForLocateMessage;
|
|
38
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
39
|
+
"defaultModelFamilyRequiredForLocateMessage",
|
|
40
|
+
"planningModelFamilyRequiredForLocateMessage"
|
|
41
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
42
|
+
Object.defineProperty(exports, '__esModule', {
|
|
43
|
+
value: true
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-model/errors.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/ai-model/errors.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const modelConfigDocUrl = 'https://midscenejs.com/model-config';\n\nexport const defaultModelFamilyRequiredForLocateMessage = `Default model family is required for locate. Configure MIDSCENE_MODEL_FAMILY so Midscene can parse locate coordinates correctly. ${modelConfigDocUrl}`;\n\nexport function planningModelFamilyRequiredForLocateMessage(slot?: string) {\n if (slot === 'planning') {\n return `Planning model family is required because aiAct is asking the planning model to return locate coordinates. Configure MIDSCENE_PLANNING_MODEL_FAMILY for the planning model, or remove the separate planning model config and configure MIDSCENE_MODEL_FAMILY on the default model. ${modelConfigDocUrl}`;\n }\n\n return `Default model family is required because aiAct is asking the default model to return locate coordinates during planning. Configure MIDSCENE_MODEL_FAMILY so Midscene can parse planning locate coordinates correctly. ${modelConfigDocUrl}`;\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","modelConfigDocUrl","defaultModelFamilyRequiredForLocateMessage","planningModelFamilyRequiredForLocateMessage","slot"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;ACNA,MAAMI,oBAAoB;AAEnB,MAAMC,6CAA6C,CAAC,iIAAiI,EAAED,mBAAmB;AAE1M,SAASE,4CAA4CC,IAAa;IACvE,IAAIA,AAAS,eAATA,MACF,OAAO,CAAC,mRAAmR,EAAEH,mBAAmB;IAGlT,OAAO,CAAC,sNAAsN,EAAEA,mBAAmB;AACrP"}
|
|
@@ -29,15 +29,13 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
29
29
|
generatePlaywrightTest: ()=>playwright_generator_js_namespaceObject.generatePlaywrightTest,
|
|
30
30
|
plan: ()=>external_llm_planning_js_namespaceObject.plan,
|
|
31
31
|
runConnectivityTest: ()=>external_connectivity_js_namespaceObject.runConnectivityTest,
|
|
32
|
-
|
|
32
|
+
systemPromptToLocateElement: ()=>llm_locator_js_namespaceObject.systemPromptToLocateElement,
|
|
33
33
|
callAI: ()=>index_js_namespaceObject.callAI,
|
|
34
34
|
parseActionParam: ()=>external_common_js_namespaceObject.parseActionParam,
|
|
35
|
-
adaptBboxToRect: ()=>external_common_js_namespaceObject.adaptBboxToRect,
|
|
36
35
|
AiLocateElement: ()=>external_inspect_js_namespaceObject.AiLocateElement,
|
|
37
36
|
AiExtractElementInfo: ()=>external_inspect_js_namespaceObject.AiExtractElementInfo,
|
|
38
37
|
callAIWithStringResponse: ()=>index_js_namespaceObject.callAIWithStringResponse,
|
|
39
|
-
|
|
40
|
-
uiTarsPlanning: ()=>external_ui_tars_planning_js_namespaceObject.uiTarsPlanning,
|
|
38
|
+
getModelRuntime: ()=>external_models_index_js_namespaceObject.getModelRuntime,
|
|
41
39
|
generateYamlTest: ()=>yaml_generator_js_namespaceObject.generateYamlTest,
|
|
42
40
|
SizeSchema: ()=>external_common_js_namespaceObject.SizeSchema,
|
|
43
41
|
findAllMidsceneLocatorField: ()=>external_common_js_namespaceObject.findAllMidsceneLocatorField,
|
|
@@ -54,16 +52,15 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
54
52
|
dumpActionParam: ()=>external_common_js_namespaceObject.dumpActionParam
|
|
55
53
|
});
|
|
56
54
|
const index_js_namespaceObject = require("./service-caller/index.js");
|
|
55
|
+
const external_models_index_js_namespaceObject = require("./models/index.js");
|
|
57
56
|
const external_connectivity_js_namespaceObject = require("./connectivity.js");
|
|
58
57
|
const llm_locator_js_namespaceObject = require("./prompt/llm-locator.js");
|
|
59
58
|
const playwright_generator_js_namespaceObject = require("./prompt/playwright-generator.js");
|
|
60
59
|
const yaml_generator_js_namespaceObject = require("./prompt/yaml-generator.js");
|
|
61
60
|
const external_inspect_js_namespaceObject = require("./inspect.js");
|
|
62
61
|
const external_llm_planning_js_namespaceObject = require("./llm-planning.js");
|
|
63
|
-
const planning_js_namespaceObject = require("./auto-glm/planning.js");
|
|
64
|
-
const external_common_js_namespaceObject = require("../common.js");
|
|
65
|
-
const external_ui_tars_planning_js_namespaceObject = require("./ui-tars-planning.js");
|
|
66
62
|
const external_conversation_history_js_namespaceObject = require("./conversation-history.js");
|
|
63
|
+
const external_common_js_namespaceObject = require("../common.js");
|
|
67
64
|
exports.AIResponseParseError = __webpack_exports__.AIResponseParseError;
|
|
68
65
|
exports.AiExtractElementInfo = __webpack_exports__.AiExtractElementInfo;
|
|
69
66
|
exports.AiJudgeOrderSensitive = __webpack_exports__.AiJudgeOrderSensitive;
|
|
@@ -75,8 +72,6 @@ exports.RectSchema = __webpack_exports__.RectSchema;
|
|
|
75
72
|
exports.SizeSchema = __webpack_exports__.SizeSchema;
|
|
76
73
|
exports.TMultimodalPromptSchema = __webpack_exports__.TMultimodalPromptSchema;
|
|
77
74
|
exports.TUserPromptSchema = __webpack_exports__.TUserPromptSchema;
|
|
78
|
-
exports.adaptBboxToRect = __webpack_exports__.adaptBboxToRect;
|
|
79
|
-
exports.autoGLMPlanning = __webpack_exports__.autoGLMPlanning;
|
|
80
75
|
exports.callAI = __webpack_exports__.callAI;
|
|
81
76
|
exports.callAIWithObjectResponse = __webpack_exports__.callAIWithObjectResponse;
|
|
82
77
|
exports.callAIWithStringResponse = __webpack_exports__.callAIWithStringResponse;
|
|
@@ -87,11 +82,11 @@ exports.generatePlaywrightTestStream = __webpack_exports__.generatePlaywrightTes
|
|
|
87
82
|
exports.generateYamlTest = __webpack_exports__.generateYamlTest;
|
|
88
83
|
exports.generateYamlTestStream = __webpack_exports__.generateYamlTestStream;
|
|
89
84
|
exports.getMidsceneLocationSchema = __webpack_exports__.getMidsceneLocationSchema;
|
|
85
|
+
exports.getModelRuntime = __webpack_exports__.getModelRuntime;
|
|
90
86
|
exports.parseActionParam = __webpack_exports__.parseActionParam;
|
|
91
87
|
exports.plan = __webpack_exports__.plan;
|
|
92
88
|
exports.runConnectivityTest = __webpack_exports__.runConnectivityTest;
|
|
93
89
|
exports.systemPromptToLocateElement = __webpack_exports__.systemPromptToLocateElement;
|
|
94
|
-
exports.uiTarsPlanning = __webpack_exports__.uiTarsPlanning;
|
|
95
90
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
96
91
|
"AIResponseParseError",
|
|
97
92
|
"AiExtractElementInfo",
|
|
@@ -104,8 +99,6 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
|
104
99
|
"SizeSchema",
|
|
105
100
|
"TMultimodalPromptSchema",
|
|
106
101
|
"TUserPromptSchema",
|
|
107
|
-
"adaptBboxToRect",
|
|
108
|
-
"autoGLMPlanning",
|
|
109
102
|
"callAI",
|
|
110
103
|
"callAIWithObjectResponse",
|
|
111
104
|
"callAIWithStringResponse",
|
|
@@ -116,11 +109,11 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
|
116
109
|
"generateYamlTest",
|
|
117
110
|
"generateYamlTestStream",
|
|
118
111
|
"getMidsceneLocationSchema",
|
|
112
|
+
"getModelRuntime",
|
|
119
113
|
"parseActionParam",
|
|
120
114
|
"plan",
|
|
121
115
|
"runConnectivityTest",
|
|
122
|
-
"systemPromptToLocateElement"
|
|
123
|
-
"uiTarsPlanning"
|
|
116
|
+
"systemPromptToLocateElement"
|
|
124
117
|
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
125
118
|
Object.defineProperty(exports, '__esModule', {
|
|
126
119
|
value: true
|