@midscene/shared 0.29.0 → 0.29.2-beta-20250924120255.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,29 @@
1
+ import node_fs from "node:fs";
2
+ import node_path from "node:path";
3
+ const createCopyStaticPlugin = (options)=>({
4
+ name: options.pluginName || 'copy-static',
5
+ setup (api) {
6
+ api.onAfterBuild(async ()=>{
7
+ const { srcDir, destDir, faviconPath } = options;
8
+ await node_fs.promises.mkdir(destDir, {
9
+ recursive: true
10
+ });
11
+ await node_fs.promises.cp(srcDir, destDir, {
12
+ recursive: true
13
+ });
14
+ console.log(`Copied build artifacts from ${srcDir} to ${destDir}`);
15
+ if (faviconPath) {
16
+ const faviconDest = node_path.join(destDir, 'favicon.ico');
17
+ await node_fs.promises.copyFile(faviconPath, faviconDest);
18
+ console.log(`Copied favicon from ${faviconPath} to ${faviconDest}`);
19
+ }
20
+ });
21
+ }
22
+ });
23
+ const createPlaygroundCopyPlugin = (srcDir, destDir, pluginName, faviconSrc)=>createCopyStaticPlugin({
24
+ srcDir,
25
+ destDir,
26
+ faviconPath: faviconSrc,
27
+ pluginName
28
+ });
29
+ export { createCopyStaticPlugin, createPlaygroundCopyPlugin };
@@ -15,8 +15,10 @@ var constants_NodeType = /*#__PURE__*/ function(NodeType) {
15
15
  }({});
16
16
  const PLAYGROUND_SERVER_PORT = 5800;
17
17
  const SCRCPY_SERVER_PORT = 5700;
18
+ const WEBDRIVER_ELEMENT_ID_KEY = 'element-6066-11e4-a52e-4f735466cecf';
19
+ const DEFAULT_WDA_PORT = 8100;
18
20
  const DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT = 5000;
19
21
  const DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT = 2000;
20
22
  const DEFAULT_WAIT_FOR_NETWORK_IDLE_TIME = 300;
21
23
  const DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY = 2;
22
- export { CONTAINER_MINI_HEIGHT, CONTAINER_MINI_WIDTH, DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT, DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY, DEFAULT_WAIT_FOR_NETWORK_IDLE_TIME, DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT, constants_NodeType as NodeType, PLAYGROUND_SERVER_PORT, PLAYWRIGHT_EXAMPLE_CODE, SCRCPY_SERVER_PORT, TEXT_MAX_SIZE, TEXT_SIZE_THRESHOLD, YAML_EXAMPLE_CODE };
24
+ export { CONTAINER_MINI_HEIGHT, CONTAINER_MINI_WIDTH, DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT, DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY, DEFAULT_WAIT_FOR_NETWORK_IDLE_TIME, DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT, DEFAULT_WDA_PORT, constants_NodeType as NodeType, PLAYGROUND_SERVER_PORT, PLAYWRIGHT_EXAMPLE_CODE, SCRCPY_SERVER_PORT, TEXT_MAX_SIZE, TEXT_SIZE_THRESHOLD, WEBDRIVER_ELEMENT_ID_KEY, YAML_EXAMPLE_CODE };
@@ -1,4 +1,4 @@
1
- import { MIDSCENE_USE_DOUBAO_VISION, MIDSCENE_USE_GEMINI, MIDSCENE_USE_QWEN_VL, MIDSCENE_USE_VLM_UI_TARS, UITarsModelVersion, VL_MODE_RAW_VALID_VALUES } from "./types.mjs";
1
+ 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";
2
2
  const parseVlModeAndUiTarsModelVersionFromRawValue = (vlModeRaw)=>{
3
3
  if (!vlModeRaw) return {
4
4
  vlMode: void 0,
@@ -22,15 +22,21 @@ const parseVlModeAndUiTarsModelVersionFromRawValue = (vlModeRaw)=>{
22
22
  const parseVlModeAndUiTarsFromGlobalConfig = (provider)=>{
23
23
  const isDoubao = provider[MIDSCENE_USE_DOUBAO_VISION];
24
24
  const isQwen = provider[MIDSCENE_USE_QWEN_VL];
25
+ const isQwen3 = provider[MIDSCENE_USE_QWEN3_VL];
25
26
  const isUiTars = provider[MIDSCENE_USE_VLM_UI_TARS];
26
27
  const isGemini = provider[MIDSCENE_USE_GEMINI];
27
28
  const enabledModes = [
28
29
  isDoubao && MIDSCENE_USE_DOUBAO_VISION,
29
30
  isQwen && MIDSCENE_USE_QWEN_VL,
31
+ isQwen3 && MIDSCENE_USE_QWEN3_VL,
30
32
  isUiTars && MIDSCENE_USE_VLM_UI_TARS,
31
33
  isGemini && MIDSCENE_USE_GEMINI
32
34
  ].filter(Boolean);
33
35
  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.`);
36
+ if (isQwen3) return {
37
+ vlMode: 'qwen3-vl',
38
+ uiTarsVersion: void 0
39
+ };
34
40
  if (isQwen) return {
35
41
  vlMode: 'qwen-vl',
36
42
  uiTarsVersion: void 0
@@ -19,9 +19,12 @@ const MIDSCENE_ADB_PATH = 'MIDSCENE_ADB_PATH';
19
19
  const MIDSCENE_ADB_REMOTE_HOST = 'MIDSCENE_ADB_REMOTE_HOST';
20
20
  const MIDSCENE_ADB_REMOTE_PORT = 'MIDSCENE_ADB_REMOTE_PORT';
21
21
  const MIDSCENE_ANDROID_IME_STRATEGY = 'MIDSCENE_ANDROID_IME_STRATEGY';
22
+ const MIDSCENE_IOS_DEVICE_UDID = 'MIDSCENE_IOS_DEVICE_UDID';
23
+ const MIDSCENE_IOS_SIMULATOR_UDID = 'MIDSCENE_IOS_SIMULATOR_UDID';
22
24
  const MIDSCENE_CACHE = 'MIDSCENE_CACHE';
23
25
  const MIDSCENE_USE_VLM_UI_TARS = 'MIDSCENE_USE_VLM_UI_TARS';
24
26
  const MIDSCENE_USE_QWEN_VL = 'MIDSCENE_USE_QWEN_VL';
27
+ const MIDSCENE_USE_QWEN3_VL = 'MIDSCENE_USE_QWEN3_VL';
25
28
  const MIDSCENE_USE_DOUBAO_VISION = 'MIDSCENE_USE_DOUBAO_VISION';
26
29
  const MIDSCENE_USE_GEMINI = 'MIDSCENE_USE_GEMINI';
27
30
  const MIDSCENE_USE_VL_MODEL = 'MIDSCENE_USE_VL_MODEL';
@@ -128,6 +131,8 @@ const STRING_ENV_KEYS = [
128
131
  MIDSCENE_ADB_REMOTE_HOST,
129
132
  MIDSCENE_ADB_REMOTE_PORT,
130
133
  MIDSCENE_ANDROID_IME_STRATEGY,
134
+ MIDSCENE_IOS_DEVICE_UDID,
135
+ MIDSCENE_IOS_SIMULATOR_UDID,
131
136
  MIDSCENE_REPORT_TAG_NAME,
132
137
  MIDSCENE_PREFERRED_LANGUAGE,
133
138
  MATCH_BY_POSITION,
@@ -153,6 +158,7 @@ const MODEL_ENV_KEYS = [
153
158
  MIDSCENE_USE_ANTHROPIC_SDK,
154
159
  MIDSCENE_USE_VLM_UI_TARS,
155
160
  MIDSCENE_USE_QWEN_VL,
161
+ MIDSCENE_USE_QWEN3_VL,
156
162
  MIDSCENE_USE_DOUBAO_VISION,
157
163
  MIDSCENE_USE_GEMINI,
158
164
  MIDSCENE_USE_VL_MODEL,
@@ -239,8 +245,9 @@ const VL_MODE_RAW_VALID_VALUES = [
239
245
  'doubao-vision',
240
246
  'gemini',
241
247
  'qwen-vl',
248
+ 'qwen3-vl',
242
249
  'vlm-ui-tars',
243
250
  'vlm-ui-tars-doubao',
244
251
  'vlm-ui-tars-doubao-1.5'
245
252
  ];
246
- export { ALL_ENV_KEYS, ANTHROPIC_API_KEY, AZURE_OPENAI_API_VERSION, AZURE_OPENAI_DEPLOYMENT, AZURE_OPENAI_ENDPOINT, AZURE_OPENAI_KEY, 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_ANTHROPIC_API_KEY, MIDSCENE_API_TYPE, MIDSCENE_AZURE_OPENAI_API_VERSION, MIDSCENE_AZURE_OPENAI_DEPLOYMENT, MIDSCENE_AZURE_OPENAI_ENDPOINT, MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON, MIDSCENE_AZURE_OPENAI_KEY, MIDSCENE_AZURE_OPENAI_SCOPE, 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_ANTHROPIC_API_KEY, MIDSCENE_GROUNDING_AZURE_OPENAI_API_VERSION, MIDSCENE_GROUNDING_AZURE_OPENAI_DEPLOYMENT, MIDSCENE_GROUNDING_AZURE_OPENAI_ENDPOINT, MIDSCENE_GROUNDING_AZURE_OPENAI_INIT_CONFIG_JSON, MIDSCENE_GROUNDING_AZURE_OPENAI_KEY, MIDSCENE_GROUNDING_AZURE_OPENAI_SCOPE, 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_OPENAI_USE_AZURE, MIDSCENE_GROUNDING_USE_ANTHROPIC_SDK, MIDSCENE_GROUNDING_USE_AZURE_OPENAI, MIDSCENE_GROUNDING_VL_MODE, 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_OPENAI_USE_AZURE, MIDSCENE_PLANNING_ANTHROPIC_API_KEY, MIDSCENE_PLANNING_AZURE_OPENAI_API_VERSION, MIDSCENE_PLANNING_AZURE_OPENAI_DEPLOYMENT, MIDSCENE_PLANNING_AZURE_OPENAI_ENDPOINT, MIDSCENE_PLANNING_AZURE_OPENAI_INIT_CONFIG_JSON, MIDSCENE_PLANNING_AZURE_OPENAI_KEY, MIDSCENE_PLANNING_AZURE_OPENAI_SCOPE, 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_OPENAI_USE_AZURE, MIDSCENE_PLANNING_USE_ANTHROPIC_SDK, MIDSCENE_PLANNING_USE_AZURE_OPENAI, MIDSCENE_PLANNING_VL_MODE, MIDSCENE_PREFERRED_LANGUAGE, MIDSCENE_REPLANNING_CYCLE_LIMIT, MIDSCENE_REPORT_TAG_NAME, MIDSCENE_RUN_DIR, MIDSCENE_USE_ANTHROPIC_SDK, MIDSCENE_USE_AZURE_OPENAI, MIDSCENE_USE_DOUBAO_VISION, MIDSCENE_USE_GEMINI, MIDSCENE_USE_QWEN_VL, MIDSCENE_USE_VLM_UI_TARS, MIDSCENE_USE_VL_MODEL, MIDSCENE_VL_MODE, MIDSCENE_VQA_ANTHROPIC_API_KEY, MIDSCENE_VQA_AZURE_OPENAI_API_VERSION, MIDSCENE_VQA_AZURE_OPENAI_DEPLOYMENT, MIDSCENE_VQA_AZURE_OPENAI_ENDPOINT, MIDSCENE_VQA_AZURE_OPENAI_INIT_CONFIG_JSON, MIDSCENE_VQA_AZURE_OPENAI_KEY, MIDSCENE_VQA_AZURE_OPENAI_SCOPE, 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_OPENAI_USE_AZURE, MIDSCENE_VQA_USE_ANTHROPIC_SDK, MIDSCENE_VQA_USE_AZURE_OPENAI, MIDSCENE_VQA_VL_MODE, MODEL_ENV_KEYS, NUMBER_ENV_KEYS, OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_MAX_TOKENS, OPENAI_USE_AZURE, STRING_ENV_KEYS, types_UITarsModelVersion as UITarsModelVersion, UNUSED_ENV_KEYS, VL_MODE_RAW_VALID_VALUES };
253
+ export { ALL_ENV_KEYS, ANTHROPIC_API_KEY, AZURE_OPENAI_API_VERSION, AZURE_OPENAI_DEPLOYMENT, AZURE_OPENAI_ENDPOINT, AZURE_OPENAI_KEY, 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_ANTHROPIC_API_KEY, MIDSCENE_API_TYPE, MIDSCENE_AZURE_OPENAI_API_VERSION, MIDSCENE_AZURE_OPENAI_DEPLOYMENT, MIDSCENE_AZURE_OPENAI_ENDPOINT, MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON, MIDSCENE_AZURE_OPENAI_KEY, MIDSCENE_AZURE_OPENAI_SCOPE, 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_ANTHROPIC_API_KEY, MIDSCENE_GROUNDING_AZURE_OPENAI_API_VERSION, MIDSCENE_GROUNDING_AZURE_OPENAI_DEPLOYMENT, MIDSCENE_GROUNDING_AZURE_OPENAI_ENDPOINT, MIDSCENE_GROUNDING_AZURE_OPENAI_INIT_CONFIG_JSON, MIDSCENE_GROUNDING_AZURE_OPENAI_KEY, MIDSCENE_GROUNDING_AZURE_OPENAI_SCOPE, 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_OPENAI_USE_AZURE, MIDSCENE_GROUNDING_USE_ANTHROPIC_SDK, MIDSCENE_GROUNDING_USE_AZURE_OPENAI, 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_OPENAI_USE_AZURE, MIDSCENE_PLANNING_ANTHROPIC_API_KEY, MIDSCENE_PLANNING_AZURE_OPENAI_API_VERSION, MIDSCENE_PLANNING_AZURE_OPENAI_DEPLOYMENT, MIDSCENE_PLANNING_AZURE_OPENAI_ENDPOINT, MIDSCENE_PLANNING_AZURE_OPENAI_INIT_CONFIG_JSON, MIDSCENE_PLANNING_AZURE_OPENAI_KEY, MIDSCENE_PLANNING_AZURE_OPENAI_SCOPE, 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_OPENAI_USE_AZURE, MIDSCENE_PLANNING_USE_ANTHROPIC_SDK, MIDSCENE_PLANNING_USE_AZURE_OPENAI, MIDSCENE_PLANNING_VL_MODE, MIDSCENE_PREFERRED_LANGUAGE, MIDSCENE_REPLANNING_CYCLE_LIMIT, MIDSCENE_REPORT_TAG_NAME, MIDSCENE_RUN_DIR, MIDSCENE_USE_ANTHROPIC_SDK, MIDSCENE_USE_AZURE_OPENAI, 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_ANTHROPIC_API_KEY, MIDSCENE_VQA_AZURE_OPENAI_API_VERSION, MIDSCENE_VQA_AZURE_OPENAI_DEPLOYMENT, MIDSCENE_VQA_AZURE_OPENAI_ENDPOINT, MIDSCENE_VQA_AZURE_OPENAI_INIT_CONFIG_JSON, MIDSCENE_VQA_AZURE_OPENAI_KEY, MIDSCENE_VQA_AZURE_OPENAI_SCOPE, 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_OPENAI_USE_AZURE, MIDSCENE_VQA_USE_ANTHROPIC_SDK, MIDSCENE_VQA_USE_AZURE_OPENAI, MIDSCENE_VQA_VL_MODE, MODEL_ENV_KEYS, NUMBER_ENV_KEYS, OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_MAX_TOKENS, OPENAI_USE_AZURE, STRING_ENV_KEYS, types_UITarsModelVersion as UITarsModelVersion, UNUSED_ENV_KEYS, VL_MODE_RAW_VALID_VALUES };
@@ -106,26 +106,46 @@ async function paddingToMatchBlock(image, blockSize = 28) {
106
106
  const { width, height } = image.bitmap;
107
107
  const targetWidth = Math.ceil(width / blockSize) * blockSize;
108
108
  const targetHeight = Math.ceil(height / blockSize) * blockSize;
109
- if (targetWidth === width && targetHeight === height) return image;
109
+ if (targetWidth === width && targetHeight === height) return {
110
+ width,
111
+ height,
112
+ image
113
+ };
110
114
  const Jimp = await get_jimp();
111
115
  const paddedImage = new Jimp(targetWidth, targetHeight, 0xffffffff);
112
116
  paddedImage.composite(image, 0, 0);
113
- return paddedImage;
117
+ return {
118
+ width: targetWidth,
119
+ height: targetHeight,
120
+ image: paddedImage
121
+ };
114
122
  }
115
123
  async function paddingToMatchBlockByBase64(imageBase64, blockSize = 28) {
116
124
  const jimpImage = await jimpFromBase64(imageBase64);
117
- const paddedImage = await paddingToMatchBlock(jimpImage, blockSize);
118
- return jimpToBase64(paddedImage);
125
+ const paddedResult = await paddingToMatchBlock(jimpImage, blockSize);
126
+ return {
127
+ width: paddedResult.width,
128
+ height: paddedResult.height,
129
+ imageBase64: await jimpToBase64(paddedResult.image)
130
+ };
119
131
  }
120
132
  async function cropByRect(imageBase64, rect, paddingImage) {
121
133
  const jimpImage = await jimpFromBase64(imageBase64);
122
134
  const { left, top, width, height } = rect;
123
135
  jimpImage.crop(left, top, width, height);
124
136
  if (paddingImage) {
125
- const paddedImage = await paddingToMatchBlock(jimpImage);
126
- return jimpToBase64(paddedImage);
137
+ const paddedResult = await paddingToMatchBlock(jimpImage);
138
+ return {
139
+ width: paddedResult.width,
140
+ height: paddedResult.height,
141
+ imageBase64: await jimpToBase64(paddedResult.image)
142
+ };
127
143
  }
128
- return jimpToBase64(jimpImage);
144
+ return {
145
+ width: jimpImage.bitmap.width,
146
+ height: jimpImage.bitmap.height,
147
+ imageBase64: await jimpToBase64(jimpImage)
148
+ };
129
149
  }
130
150
  async function jimpToBase64(image) {
131
151
  const Jimp = await get_jimp();
package/dist/es/index.mjs CHANGED
@@ -1,2 +1,3 @@
1
+ import { createCopyStaticPlugin, createPlaygroundCopyPlugin } from "./build/copy-static.mjs";
1
2
  const src = {};
2
- export { src as default };
3
+ export { createCopyStaticPlugin, createPlaygroundCopyPlugin, src as default };
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
12
+ (()=>{
13
+ __webpack_require__.d = (exports1, definition)=>{
14
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
15
+ enumerable: true,
16
+ get: definition[key]
17
+ });
18
+ };
19
+ })();
20
+ (()=>{
21
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
22
+ })();
23
+ (()=>{
24
+ __webpack_require__.r = (exports1)=>{
25
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
26
+ value: 'Module'
27
+ });
28
+ Object.defineProperty(exports1, '__esModule', {
29
+ value: true
30
+ });
31
+ };
32
+ })();
33
+ var __webpack_exports__ = {};
34
+ __webpack_require__.r(__webpack_exports__);
35
+ __webpack_require__.d(__webpack_exports__, {
36
+ createPlaygroundCopyPlugin: ()=>createPlaygroundCopyPlugin,
37
+ createCopyStaticPlugin: ()=>createCopyStaticPlugin
38
+ });
39
+ const external_node_fs_namespaceObject = require("node:fs");
40
+ var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
41
+ const external_node_path_namespaceObject = require("node:path");
42
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
43
+ const createCopyStaticPlugin = (options)=>({
44
+ name: options.pluginName || 'copy-static',
45
+ setup (api) {
46
+ api.onAfterBuild(async ()=>{
47
+ const { srcDir, destDir, faviconPath } = options;
48
+ await external_node_fs_default().promises.mkdir(destDir, {
49
+ recursive: true
50
+ });
51
+ await external_node_fs_default().promises.cp(srcDir, destDir, {
52
+ recursive: true
53
+ });
54
+ console.log(`Copied build artifacts from ${srcDir} to ${destDir}`);
55
+ if (faviconPath) {
56
+ const faviconDest = external_node_path_default().join(destDir, 'favicon.ico');
57
+ await external_node_fs_default().promises.copyFile(faviconPath, faviconDest);
58
+ console.log(`Copied favicon from ${faviconPath} to ${faviconDest}`);
59
+ }
60
+ });
61
+ }
62
+ });
63
+ const createPlaygroundCopyPlugin = (srcDir, destDir, pluginName, faviconSrc)=>createCopyStaticPlugin({
64
+ srcDir,
65
+ destDir,
66
+ faviconPath: faviconSrc,
67
+ pluginName
68
+ });
69
+ exports.createCopyStaticPlugin = __webpack_exports__.createCopyStaticPlugin;
70
+ exports.createPlaygroundCopyPlugin = __webpack_exports__.createPlaygroundCopyPlugin;
71
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
72
+ "createCopyStaticPlugin",
73
+ "createPlaygroundCopyPlugin"
74
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
75
+ Object.defineProperty(exports, '__esModule', {
76
+ value: true
77
+ });
@@ -24,17 +24,19 @@ var __webpack_require__ = {};
24
24
  var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
- CONTAINER_MINI_HEIGHT: ()=>CONTAINER_MINI_HEIGHT,
28
27
  PLAYGROUND_SERVER_PORT: ()=>PLAYGROUND_SERVER_PORT,
29
- TEXT_MAX_SIZE: ()=>TEXT_MAX_SIZE,
30
28
  DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT: ()=>DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT,
31
- NodeType: ()=>constants_NodeType,
32
29
  SCRCPY_SERVER_PORT: ()=>SCRCPY_SERVER_PORT,
33
30
  TEXT_SIZE_THRESHOLD: ()=>TEXT_SIZE_THRESHOLD,
34
31
  YAML_EXAMPLE_CODE: ()=>external_example_code_js_namespaceObject.YAML_EXAMPLE_CODE,
35
32
  DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY: ()=>DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY,
36
33
  DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT: ()=>DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT,
37
34
  CONTAINER_MINI_WIDTH: ()=>CONTAINER_MINI_WIDTH,
35
+ CONTAINER_MINI_HEIGHT: ()=>CONTAINER_MINI_HEIGHT,
36
+ TEXT_MAX_SIZE: ()=>TEXT_MAX_SIZE,
37
+ NodeType: ()=>constants_NodeType,
38
+ WEBDRIVER_ELEMENT_ID_KEY: ()=>WEBDRIVER_ELEMENT_ID_KEY,
39
+ DEFAULT_WDA_PORT: ()=>DEFAULT_WDA_PORT,
38
40
  DEFAULT_WAIT_FOR_NETWORK_IDLE_TIME: ()=>DEFAULT_WAIT_FOR_NETWORK_IDLE_TIME,
39
41
  PLAYWRIGHT_EXAMPLE_CODE: ()=>external_example_code_js_namespaceObject.PLAYWRIGHT_EXAMPLE_CODE
40
42
  });
@@ -55,6 +57,8 @@ var constants_NodeType = /*#__PURE__*/ function(NodeType) {
55
57
  }({});
56
58
  const PLAYGROUND_SERVER_PORT = 5800;
57
59
  const SCRCPY_SERVER_PORT = 5700;
60
+ const WEBDRIVER_ELEMENT_ID_KEY = 'element-6066-11e4-a52e-4f735466cecf';
61
+ const DEFAULT_WDA_PORT = 8100;
58
62
  const DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT = 5000;
59
63
  const DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT = 2000;
60
64
  const DEFAULT_WAIT_FOR_NETWORK_IDLE_TIME = 300;
@@ -65,12 +69,14 @@ exports.DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT = __webpack_exports__.DEFAULT_WAIT_F
65
69
  exports.DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY = __webpack_exports__.DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY;
66
70
  exports.DEFAULT_WAIT_FOR_NETWORK_IDLE_TIME = __webpack_exports__.DEFAULT_WAIT_FOR_NETWORK_IDLE_TIME;
67
71
  exports.DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT = __webpack_exports__.DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT;
72
+ exports.DEFAULT_WDA_PORT = __webpack_exports__.DEFAULT_WDA_PORT;
68
73
  exports.NodeType = __webpack_exports__.NodeType;
69
74
  exports.PLAYGROUND_SERVER_PORT = __webpack_exports__.PLAYGROUND_SERVER_PORT;
70
75
  exports.PLAYWRIGHT_EXAMPLE_CODE = __webpack_exports__.PLAYWRIGHT_EXAMPLE_CODE;
71
76
  exports.SCRCPY_SERVER_PORT = __webpack_exports__.SCRCPY_SERVER_PORT;
72
77
  exports.TEXT_MAX_SIZE = __webpack_exports__.TEXT_MAX_SIZE;
73
78
  exports.TEXT_SIZE_THRESHOLD = __webpack_exports__.TEXT_SIZE_THRESHOLD;
79
+ exports.WEBDRIVER_ELEMENT_ID_KEY = __webpack_exports__.WEBDRIVER_ELEMENT_ID_KEY;
74
80
  exports.YAML_EXAMPLE_CODE = __webpack_exports__.YAML_EXAMPLE_CODE;
75
81
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
76
82
  "CONTAINER_MINI_HEIGHT",
@@ -79,12 +85,14 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
79
85
  "DEFAULT_WAIT_FOR_NETWORK_IDLE_CONCURRENCY",
80
86
  "DEFAULT_WAIT_FOR_NETWORK_IDLE_TIME",
81
87
  "DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT",
88
+ "DEFAULT_WDA_PORT",
82
89
  "NodeType",
83
90
  "PLAYGROUND_SERVER_PORT",
84
91
  "PLAYWRIGHT_EXAMPLE_CODE",
85
92
  "SCRCPY_SERVER_PORT",
86
93
  "TEXT_MAX_SIZE",
87
94
  "TEXT_SIZE_THRESHOLD",
95
+ "WEBDRIVER_ELEMENT_ID_KEY",
88
96
  "YAML_EXAMPLE_CODE"
89
97
  ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
90
98
  Object.defineProperty(exports, '__esModule', {
@@ -51,15 +51,21 @@ const parseVlModeAndUiTarsModelVersionFromRawValue = (vlModeRaw)=>{
51
51
  const parseVlModeAndUiTarsFromGlobalConfig = (provider)=>{
52
52
  const isDoubao = provider[external_types_js_namespaceObject.MIDSCENE_USE_DOUBAO_VISION];
53
53
  const isQwen = provider[external_types_js_namespaceObject.MIDSCENE_USE_QWEN_VL];
54
+ const isQwen3 = provider[external_types_js_namespaceObject.MIDSCENE_USE_QWEN3_VL];
54
55
  const isUiTars = provider[external_types_js_namespaceObject.MIDSCENE_USE_VLM_UI_TARS];
55
56
  const isGemini = provider[external_types_js_namespaceObject.MIDSCENE_USE_GEMINI];
56
57
  const enabledModes = [
57
58
  isDoubao && external_types_js_namespaceObject.MIDSCENE_USE_DOUBAO_VISION,
58
59
  isQwen && external_types_js_namespaceObject.MIDSCENE_USE_QWEN_VL,
60
+ isQwen3 && external_types_js_namespaceObject.MIDSCENE_USE_QWEN3_VL,
59
61
  isUiTars && external_types_js_namespaceObject.MIDSCENE_USE_VLM_UI_TARS,
60
62
  isGemini && external_types_js_namespaceObject.MIDSCENE_USE_GEMINI
61
63
  ].filter(Boolean);
62
64
  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.`);
65
+ if (isQwen3) return {
66
+ vlMode: 'qwen3-vl',
67
+ uiTarsVersion: void 0
68
+ };
63
69
  if (isQwen) return {
64
70
  vlMode: 'qwen-vl',
65
71
  uiTarsVersion: void 0
@@ -71,6 +71,8 @@ __webpack_require__.d(__webpack_exports__, {
71
71
  MIDSCENE_GROUNDING_USE_ANTHROPIC_SDK: ()=>MIDSCENE_GROUNDING_USE_ANTHROPIC_SDK,
72
72
  MIDSCENE_GROUNDING_USE_AZURE_OPENAI: ()=>MIDSCENE_GROUNDING_USE_AZURE_OPENAI,
73
73
  MIDSCENE_GROUNDING_VL_MODE: ()=>MIDSCENE_GROUNDING_VL_MODE,
74
+ MIDSCENE_IOS_DEVICE_UDID: ()=>MIDSCENE_IOS_DEVICE_UDID,
75
+ MIDSCENE_IOS_SIMULATOR_UDID: ()=>MIDSCENE_IOS_SIMULATOR_UDID,
74
76
  MIDSCENE_LANGSMITH_DEBUG: ()=>MIDSCENE_LANGSMITH_DEBUG,
75
77
  MIDSCENE_MCP_ANDROID_MODE: ()=>MIDSCENE_MCP_ANDROID_MODE,
76
78
  MIDSCENE_MCP_CHROME_PATH: ()=>MIDSCENE_MCP_CHROME_PATH,
@@ -107,6 +109,7 @@ __webpack_require__.d(__webpack_exports__, {
107
109
  MIDSCENE_USE_AZURE_OPENAI: ()=>MIDSCENE_USE_AZURE_OPENAI,
108
110
  MIDSCENE_USE_DOUBAO_VISION: ()=>MIDSCENE_USE_DOUBAO_VISION,
109
111
  MIDSCENE_USE_GEMINI: ()=>MIDSCENE_USE_GEMINI,
112
+ MIDSCENE_USE_QWEN3_VL: ()=>MIDSCENE_USE_QWEN3_VL,
110
113
  MIDSCENE_USE_QWEN_VL: ()=>MIDSCENE_USE_QWEN_VL,
111
114
  MIDSCENE_USE_VLM_UI_TARS: ()=>MIDSCENE_USE_VLM_UI_TARS,
112
115
  MIDSCENE_USE_VL_MODEL: ()=>MIDSCENE_USE_VL_MODEL,
@@ -160,9 +163,12 @@ const MIDSCENE_ADB_PATH = 'MIDSCENE_ADB_PATH';
160
163
  const MIDSCENE_ADB_REMOTE_HOST = 'MIDSCENE_ADB_REMOTE_HOST';
161
164
  const MIDSCENE_ADB_REMOTE_PORT = 'MIDSCENE_ADB_REMOTE_PORT';
162
165
  const MIDSCENE_ANDROID_IME_STRATEGY = 'MIDSCENE_ANDROID_IME_STRATEGY';
166
+ const MIDSCENE_IOS_DEVICE_UDID = 'MIDSCENE_IOS_DEVICE_UDID';
167
+ const MIDSCENE_IOS_SIMULATOR_UDID = 'MIDSCENE_IOS_SIMULATOR_UDID';
163
168
  const MIDSCENE_CACHE = 'MIDSCENE_CACHE';
164
169
  const MIDSCENE_USE_VLM_UI_TARS = 'MIDSCENE_USE_VLM_UI_TARS';
165
170
  const MIDSCENE_USE_QWEN_VL = 'MIDSCENE_USE_QWEN_VL';
171
+ const MIDSCENE_USE_QWEN3_VL = 'MIDSCENE_USE_QWEN3_VL';
166
172
  const MIDSCENE_USE_DOUBAO_VISION = 'MIDSCENE_USE_DOUBAO_VISION';
167
173
  const MIDSCENE_USE_GEMINI = 'MIDSCENE_USE_GEMINI';
168
174
  const MIDSCENE_USE_VL_MODEL = 'MIDSCENE_USE_VL_MODEL';
@@ -269,6 +275,8 @@ const STRING_ENV_KEYS = [
269
275
  MIDSCENE_ADB_REMOTE_HOST,
270
276
  MIDSCENE_ADB_REMOTE_PORT,
271
277
  MIDSCENE_ANDROID_IME_STRATEGY,
278
+ MIDSCENE_IOS_DEVICE_UDID,
279
+ MIDSCENE_IOS_SIMULATOR_UDID,
272
280
  MIDSCENE_REPORT_TAG_NAME,
273
281
  MIDSCENE_PREFERRED_LANGUAGE,
274
282
  MATCH_BY_POSITION,
@@ -294,6 +302,7 @@ const MODEL_ENV_KEYS = [
294
302
  MIDSCENE_USE_ANTHROPIC_SDK,
295
303
  MIDSCENE_USE_VLM_UI_TARS,
296
304
  MIDSCENE_USE_QWEN_VL,
305
+ MIDSCENE_USE_QWEN3_VL,
297
306
  MIDSCENE_USE_DOUBAO_VISION,
298
307
  MIDSCENE_USE_GEMINI,
299
308
  MIDSCENE_USE_VL_MODEL,
@@ -380,6 +389,7 @@ const VL_MODE_RAW_VALID_VALUES = [
380
389
  'doubao-vision',
381
390
  'gemini',
382
391
  'qwen-vl',
392
+ 'qwen3-vl',
383
393
  'vlm-ui-tars',
384
394
  'vlm-ui-tars-doubao',
385
395
  'vlm-ui-tars-doubao-1.5'
@@ -431,6 +441,8 @@ exports.MIDSCENE_GROUNDING_OPENAI_USE_AZURE = __webpack_exports__.MIDSCENE_GROUN
431
441
  exports.MIDSCENE_GROUNDING_USE_ANTHROPIC_SDK = __webpack_exports__.MIDSCENE_GROUNDING_USE_ANTHROPIC_SDK;
432
442
  exports.MIDSCENE_GROUNDING_USE_AZURE_OPENAI = __webpack_exports__.MIDSCENE_GROUNDING_USE_AZURE_OPENAI;
433
443
  exports.MIDSCENE_GROUNDING_VL_MODE = __webpack_exports__.MIDSCENE_GROUNDING_VL_MODE;
444
+ exports.MIDSCENE_IOS_DEVICE_UDID = __webpack_exports__.MIDSCENE_IOS_DEVICE_UDID;
445
+ exports.MIDSCENE_IOS_SIMULATOR_UDID = __webpack_exports__.MIDSCENE_IOS_SIMULATOR_UDID;
434
446
  exports.MIDSCENE_LANGSMITH_DEBUG = __webpack_exports__.MIDSCENE_LANGSMITH_DEBUG;
435
447
  exports.MIDSCENE_MCP_ANDROID_MODE = __webpack_exports__.MIDSCENE_MCP_ANDROID_MODE;
436
448
  exports.MIDSCENE_MCP_CHROME_PATH = __webpack_exports__.MIDSCENE_MCP_CHROME_PATH;
@@ -467,6 +479,7 @@ exports.MIDSCENE_USE_ANTHROPIC_SDK = __webpack_exports__.MIDSCENE_USE_ANTHROPIC_
467
479
  exports.MIDSCENE_USE_AZURE_OPENAI = __webpack_exports__.MIDSCENE_USE_AZURE_OPENAI;
468
480
  exports.MIDSCENE_USE_DOUBAO_VISION = __webpack_exports__.MIDSCENE_USE_DOUBAO_VISION;
469
481
  exports.MIDSCENE_USE_GEMINI = __webpack_exports__.MIDSCENE_USE_GEMINI;
482
+ exports.MIDSCENE_USE_QWEN3_VL = __webpack_exports__.MIDSCENE_USE_QWEN3_VL;
470
483
  exports.MIDSCENE_USE_QWEN_VL = __webpack_exports__.MIDSCENE_USE_QWEN_VL;
471
484
  exports.MIDSCENE_USE_VLM_UI_TARS = __webpack_exports__.MIDSCENE_USE_VLM_UI_TARS;
472
485
  exports.MIDSCENE_USE_VL_MODEL = __webpack_exports__.MIDSCENE_USE_VL_MODEL;
@@ -546,6 +559,8 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
546
559
  "MIDSCENE_GROUNDING_USE_ANTHROPIC_SDK",
547
560
  "MIDSCENE_GROUNDING_USE_AZURE_OPENAI",
548
561
  "MIDSCENE_GROUNDING_VL_MODE",
562
+ "MIDSCENE_IOS_DEVICE_UDID",
563
+ "MIDSCENE_IOS_SIMULATOR_UDID",
549
564
  "MIDSCENE_LANGSMITH_DEBUG",
550
565
  "MIDSCENE_MCP_ANDROID_MODE",
551
566
  "MIDSCENE_MCP_CHROME_PATH",
@@ -582,6 +597,7 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
582
597
  "MIDSCENE_USE_AZURE_OPENAI",
583
598
  "MIDSCENE_USE_DOUBAO_VISION",
584
599
  "MIDSCENE_USE_GEMINI",
600
+ "MIDSCENE_USE_QWEN3_VL",
585
601
  "MIDSCENE_USE_QWEN_VL",
586
602
  "MIDSCENE_USE_VLM_UI_TARS",
587
603
  "MIDSCENE_USE_VL_MODEL",
@@ -161,26 +161,46 @@ async function paddingToMatchBlock(image, blockSize = 28) {
161
161
  const { width, height } = image.bitmap;
162
162
  const targetWidth = Math.ceil(width / blockSize) * blockSize;
163
163
  const targetHeight = Math.ceil(height / blockSize) * blockSize;
164
- if (targetWidth === width && targetHeight === height) return image;
164
+ if (targetWidth === width && targetHeight === height) return {
165
+ width,
166
+ height,
167
+ image
168
+ };
165
169
  const Jimp = await external_get_jimp_js_default()();
166
170
  const paddedImage = new Jimp(targetWidth, targetHeight, 0xffffffff);
167
171
  paddedImage.composite(image, 0, 0);
168
- return paddedImage;
172
+ return {
173
+ width: targetWidth,
174
+ height: targetHeight,
175
+ image: paddedImage
176
+ };
169
177
  }
170
178
  async function paddingToMatchBlockByBase64(imageBase64, blockSize = 28) {
171
179
  const jimpImage = await jimpFromBase64(imageBase64);
172
- const paddedImage = await paddingToMatchBlock(jimpImage, blockSize);
173
- return jimpToBase64(paddedImage);
180
+ const paddedResult = await paddingToMatchBlock(jimpImage, blockSize);
181
+ return {
182
+ width: paddedResult.width,
183
+ height: paddedResult.height,
184
+ imageBase64: await jimpToBase64(paddedResult.image)
185
+ };
174
186
  }
175
187
  async function cropByRect(imageBase64, rect, paddingImage) {
176
188
  const jimpImage = await jimpFromBase64(imageBase64);
177
189
  const { left, top, width, height } = rect;
178
190
  jimpImage.crop(left, top, width, height);
179
191
  if (paddingImage) {
180
- const paddedImage = await paddingToMatchBlock(jimpImage);
181
- return jimpToBase64(paddedImage);
192
+ const paddedResult = await paddingToMatchBlock(jimpImage);
193
+ return {
194
+ width: paddedResult.width,
195
+ height: paddedResult.height,
196
+ imageBase64: await jimpToBase64(paddedResult.image)
197
+ };
182
198
  }
183
- return jimpToBase64(jimpImage);
199
+ return {
200
+ width: jimpImage.bitmap.width,
201
+ height: jimpImage.bitmap.height,
202
+ imageBase64: await jimpToBase64(jimpImage)
203
+ };
184
204
  }
185
205
  async function jimpToBase64(image) {
186
206
  const Jimp = await external_get_jimp_js_default()();
package/dist/lib/index.js CHANGED
@@ -24,11 +24,18 @@ var __webpack_require__ = {};
24
24
  var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
- default: ()=>__WEBPACK_DEFAULT_EXPORT__
27
+ createPlaygroundCopyPlugin: ()=>copy_static_js_namespaceObject.createPlaygroundCopyPlugin,
28
+ createCopyStaticPlugin: ()=>copy_static_js_namespaceObject.createCopyStaticPlugin,
29
+ default: ()=>src
28
30
  });
29
- const __WEBPACK_DEFAULT_EXPORT__ = {};
31
+ const copy_static_js_namespaceObject = require("./build/copy-static.js");
32
+ const src = {};
33
+ exports.createCopyStaticPlugin = __webpack_exports__.createCopyStaticPlugin;
34
+ exports.createPlaygroundCopyPlugin = __webpack_exports__.createPlaygroundCopyPlugin;
30
35
  exports["default"] = __webpack_exports__["default"];
31
36
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
37
+ "createCopyStaticPlugin",
38
+ "createPlaygroundCopyPlugin",
32
39
  "default"
33
40
  ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
34
41
  Object.defineProperty(exports, '__esModule', {
@@ -0,0 +1,31 @@
1
+ export interface CopyStaticOptions {
2
+ /** Source directory to copy from */
3
+ srcDir: string;
4
+ /** Destination directory to copy to */
5
+ destDir: string;
6
+ /** Optional favicon source path (relative to directory containing srcDir) */
7
+ faviconPath?: string;
8
+ /** Name for the rsbuild plugin */
9
+ pluginName?: string;
10
+ }
11
+ /**
12
+ * Creates an rsbuild plugin that copies static files after build
13
+ * @param options Configuration options for copying static files
14
+ * @returns Rsbuild plugin object
15
+ */
16
+ export declare const createCopyStaticPlugin: (options: CopyStaticOptions) => {
17
+ name: string;
18
+ setup(api: any): void;
19
+ };
20
+ /**
21
+ * Helper function to create a copy static plugin for playground builds
22
+ * @param srcDir Source directory (usually dist directory)
23
+ * @param destDir Destination directory
24
+ * @param pluginName Optional plugin name
25
+ * @param faviconSrc Optional favicon source path
26
+ * @returns Rsbuild plugin
27
+ */
28
+ export declare const createPlaygroundCopyPlugin: (srcDir: string, destDir: string, pluginName?: string, faviconSrc?: string) => {
29
+ name: string;
30
+ setup(api: any): void;
31
+ };
@@ -13,6 +13,8 @@ export declare enum NodeType {
13
13
  }
14
14
  export declare const PLAYGROUND_SERVER_PORT = 5800;
15
15
  export declare const SCRCPY_SERVER_PORT = 5700;
16
+ export declare const WEBDRIVER_ELEMENT_ID_KEY = "element-6066-11e4-a52e-4f735466cecf";
17
+ export declare const DEFAULT_WDA_PORT = 8100;
16
18
  export declare const DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT = 5000;
17
19
  export declare const DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT = 2000;
18
20
  export declare const DEFAULT_WAIT_FOR_NETWORK_IDLE_TIME = 300;
@@ -19,9 +19,12 @@ export declare const MIDSCENE_ADB_PATH = "MIDSCENE_ADB_PATH";
19
19
  export declare const MIDSCENE_ADB_REMOTE_HOST = "MIDSCENE_ADB_REMOTE_HOST";
20
20
  export declare const MIDSCENE_ADB_REMOTE_PORT = "MIDSCENE_ADB_REMOTE_PORT";
21
21
  export declare const MIDSCENE_ANDROID_IME_STRATEGY = "MIDSCENE_ANDROID_IME_STRATEGY";
22
+ export declare const MIDSCENE_IOS_DEVICE_UDID = "MIDSCENE_IOS_DEVICE_UDID";
23
+ export declare const MIDSCENE_IOS_SIMULATOR_UDID = "MIDSCENE_IOS_SIMULATOR_UDID";
22
24
  export declare const MIDSCENE_CACHE = "MIDSCENE_CACHE";
23
25
  export declare const MIDSCENE_USE_VLM_UI_TARS = "MIDSCENE_USE_VLM_UI_TARS";
24
26
  export declare const MIDSCENE_USE_QWEN_VL = "MIDSCENE_USE_QWEN_VL";
27
+ export declare const MIDSCENE_USE_QWEN3_VL = "MIDSCENE_USE_QWEN3_VL";
25
28
  export declare const MIDSCENE_USE_DOUBAO_VISION = "MIDSCENE_USE_DOUBAO_VISION";
26
29
  export declare const MIDSCENE_USE_GEMINI = "MIDSCENE_USE_GEMINI";
27
30
  export declare const MIDSCENE_USE_VL_MODEL = "MIDSCENE_USE_VL_MODEL";
@@ -113,24 +116,24 @@ export declare const UNUSED_ENV_KEYS: string[];
113
116
  export declare const BASIC_ENV_KEYS: readonly ["MIDSCENE_DEBUG_MODE", "MIDSCENE_DEBUG_AI_PROFILE", "MIDSCENE_DEBUG_AI_RESPONSE", "MIDSCENE_RUN_DIR"];
114
117
  export declare const BOOLEAN_ENV_KEYS: readonly ["MIDSCENE_CACHE", "MIDSCENE_LANGSMITH_DEBUG", "MIDSCENE_FORCE_DEEP_THINK", "MIDSCENE_MCP_USE_PUPPETEER_MODE", "MIDSCENE_MCP_ANDROID_MODE"];
115
118
  export declare const NUMBER_ENV_KEYS: readonly ["MIDSCENE_CACHE_MAX_FILENAME_LENGTH", "MIDSCENE_REPLANNING_CYCLE_LIMIT"];
116
- export declare const STRING_ENV_KEYS: readonly ["OPENAI_MAX_TOKENS", "MIDSCENE_ADB_PATH", "MIDSCENE_ADB_REMOTE_HOST", "MIDSCENE_ADB_REMOTE_PORT", "MIDSCENE_ANDROID_IME_STRATEGY", "MIDSCENE_REPORT_TAG_NAME", "MIDSCENE_PREFERRED_LANGUAGE", "MATCH_BY_POSITION", "MIDSCENE_MCP_CHROME_PATH", "DOCKER_CONTAINER"];
119
+ export declare const STRING_ENV_KEYS: readonly ["OPENAI_MAX_TOKENS", "MIDSCENE_ADB_PATH", "MIDSCENE_ADB_REMOTE_HOST", "MIDSCENE_ADB_REMOTE_PORT", "MIDSCENE_ANDROID_IME_STRATEGY", "MIDSCENE_IOS_DEVICE_UDID", "MIDSCENE_IOS_SIMULATOR_UDID", "MIDSCENE_REPORT_TAG_NAME", "MIDSCENE_PREFERRED_LANGUAGE", "MATCH_BY_POSITION", "MIDSCENE_MCP_CHROME_PATH", "DOCKER_CONTAINER"];
117
120
  /**
118
121
  * Non model related env keys, used for globally controlling the behavior of midscene
119
122
  * Can not be override by agent.modelConfig but can be override by overrideAIConfig
120
123
  * Can be access at any time
121
124
  */
122
- export declare const GLOBAL_ENV_KEYS: readonly ["MIDSCENE_CACHE", "MIDSCENE_LANGSMITH_DEBUG", "MIDSCENE_FORCE_DEEP_THINK", "MIDSCENE_MCP_USE_PUPPETEER_MODE", "MIDSCENE_MCP_ANDROID_MODE", "MIDSCENE_CACHE_MAX_FILENAME_LENGTH", "MIDSCENE_REPLANNING_CYCLE_LIMIT", "OPENAI_MAX_TOKENS", "MIDSCENE_ADB_PATH", "MIDSCENE_ADB_REMOTE_HOST", "MIDSCENE_ADB_REMOTE_PORT", "MIDSCENE_ANDROID_IME_STRATEGY", "MIDSCENE_REPORT_TAG_NAME", "MIDSCENE_PREFERRED_LANGUAGE", "MATCH_BY_POSITION", "MIDSCENE_MCP_CHROME_PATH", "DOCKER_CONTAINER"];
125
+ export declare const GLOBAL_ENV_KEYS: readonly ["MIDSCENE_CACHE", "MIDSCENE_LANGSMITH_DEBUG", "MIDSCENE_FORCE_DEEP_THINK", "MIDSCENE_MCP_USE_PUPPETEER_MODE", "MIDSCENE_MCP_ANDROID_MODE", "MIDSCENE_CACHE_MAX_FILENAME_LENGTH", "MIDSCENE_REPLANNING_CYCLE_LIMIT", "OPENAI_MAX_TOKENS", "MIDSCENE_ADB_PATH", "MIDSCENE_ADB_REMOTE_HOST", "MIDSCENE_ADB_REMOTE_PORT", "MIDSCENE_ANDROID_IME_STRATEGY", "MIDSCENE_IOS_DEVICE_UDID", "MIDSCENE_IOS_SIMULATOR_UDID", "MIDSCENE_REPORT_TAG_NAME", "MIDSCENE_PREFERRED_LANGUAGE", "MATCH_BY_POSITION", "MIDSCENE_MCP_CHROME_PATH", "DOCKER_CONTAINER"];
123
126
  /**
124
127
  * Model related eve keys, used for declare which model to use.
125
128
  * Can be override by both agent.modelConfig and overrideAIConfig
126
129
  * Can only be access after agent.constructor
127
130
  */
128
- export declare const MODEL_ENV_KEYS: readonly ["MIDSCENE_MODEL_NAME", "MIDSCENE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_OPENAI_API_KEY", "MIDSCENE_OPENAI_BASE_URL", "MIDSCENE_OPENAI_USE_AZURE", "MIDSCENE_OPENAI_SOCKS_PROXY", "MIDSCENE_OPENAI_HTTP_PROXY", "MIDSCENE_USE_AZURE_OPENAI", "MIDSCENE_AZURE_OPENAI_SCOPE", "MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_USE_ANTHROPIC_SDK", "MIDSCENE_USE_VLM_UI_TARS", "MIDSCENE_USE_QWEN_VL", "MIDSCENE_USE_DOUBAO_VISION", "MIDSCENE_USE_GEMINI", "MIDSCENE_USE_VL_MODEL", "ANTHROPIC_API_KEY", "MIDSCENE_AZURE_OPENAI_ENDPOINT", "MIDSCENE_AZURE_OPENAI_KEY", "MIDSCENE_AZURE_OPENAI_API_VERSION", "MIDSCENE_AZURE_OPENAI_DEPLOYMENT", "MIDSCENE_VL_MODE", "OPENAI_API_KEY", "OPENAI_BASE_URL", "OPENAI_USE_AZURE", "ANTHROPIC_API_KEY", "AZURE_OPENAI_ENDPOINT", "AZURE_OPENAI_KEY", "AZURE_OPENAI_API_VERSION", "AZURE_OPENAI_DEPLOYMENT", "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_OPENAI_USE_AZURE", "MIDSCENE_VQA_USE_AZURE_OPENAI", "MIDSCENE_VQA_AZURE_OPENAI_SCOPE", "MIDSCENE_VQA_AZURE_OPENAI_KEY", "MIDSCENE_VQA_AZURE_OPENAI_ENDPOINT", "MIDSCENE_VQA_AZURE_OPENAI_API_VERSION", "MIDSCENE_VQA_AZURE_OPENAI_DEPLOYMENT", "MIDSCENE_VQA_AZURE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_VQA_USE_ANTHROPIC_SDK", "MIDSCENE_VQA_ANTHROPIC_API_KEY", "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_OPENAI_USE_AZURE", "MIDSCENE_PLANNING_USE_AZURE_OPENAI", "MIDSCENE_PLANNING_AZURE_OPENAI_SCOPE", "MIDSCENE_PLANNING_AZURE_OPENAI_KEY", "MIDSCENE_PLANNING_AZURE_OPENAI_ENDPOINT", "MIDSCENE_PLANNING_AZURE_OPENAI_API_VERSION", "MIDSCENE_PLANNING_AZURE_OPENAI_DEPLOYMENT", "MIDSCENE_PLANNING_AZURE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_PLANNING_USE_ANTHROPIC_SDK", "MIDSCENE_PLANNING_ANTHROPIC_API_KEY", "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_OPENAI_USE_AZURE", "MIDSCENE_GROUNDING_USE_AZURE_OPENAI", "MIDSCENE_GROUNDING_AZURE_OPENAI_SCOPE", "MIDSCENE_GROUNDING_AZURE_OPENAI_KEY", "MIDSCENE_GROUNDING_AZURE_OPENAI_ENDPOINT", "MIDSCENE_GROUNDING_AZURE_OPENAI_API_VERSION", "MIDSCENE_GROUNDING_AZURE_OPENAI_DEPLOYMENT", "MIDSCENE_GROUNDING_AZURE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_GROUNDING_USE_ANTHROPIC_SDK", "MIDSCENE_GROUNDING_ANTHROPIC_API_KEY", "MIDSCENE_GROUNDING_VL_MODE"];
129
- export declare const ALL_ENV_KEYS: readonly [...string[], "MIDSCENE_DEBUG_MODE", "MIDSCENE_DEBUG_AI_PROFILE", "MIDSCENE_DEBUG_AI_RESPONSE", "MIDSCENE_RUN_DIR", "MIDSCENE_CACHE", "MIDSCENE_LANGSMITH_DEBUG", "MIDSCENE_FORCE_DEEP_THINK", "MIDSCENE_MCP_USE_PUPPETEER_MODE", "MIDSCENE_MCP_ANDROID_MODE", "MIDSCENE_CACHE_MAX_FILENAME_LENGTH", "MIDSCENE_REPLANNING_CYCLE_LIMIT", "OPENAI_MAX_TOKENS", "MIDSCENE_ADB_PATH", "MIDSCENE_ADB_REMOTE_HOST", "MIDSCENE_ADB_REMOTE_PORT", "MIDSCENE_ANDROID_IME_STRATEGY", "MIDSCENE_REPORT_TAG_NAME", "MIDSCENE_PREFERRED_LANGUAGE", "MATCH_BY_POSITION", "MIDSCENE_MCP_CHROME_PATH", "DOCKER_CONTAINER", "MIDSCENE_MODEL_NAME", "MIDSCENE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_OPENAI_API_KEY", "MIDSCENE_OPENAI_BASE_URL", "MIDSCENE_OPENAI_USE_AZURE", "MIDSCENE_OPENAI_SOCKS_PROXY", "MIDSCENE_OPENAI_HTTP_PROXY", "MIDSCENE_USE_AZURE_OPENAI", "MIDSCENE_AZURE_OPENAI_SCOPE", "MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_USE_ANTHROPIC_SDK", "MIDSCENE_USE_VLM_UI_TARS", "MIDSCENE_USE_QWEN_VL", "MIDSCENE_USE_DOUBAO_VISION", "MIDSCENE_USE_GEMINI", "MIDSCENE_USE_VL_MODEL", "ANTHROPIC_API_KEY", "MIDSCENE_AZURE_OPENAI_ENDPOINT", "MIDSCENE_AZURE_OPENAI_KEY", "MIDSCENE_AZURE_OPENAI_API_VERSION", "MIDSCENE_AZURE_OPENAI_DEPLOYMENT", "MIDSCENE_VL_MODE", "OPENAI_API_KEY", "OPENAI_BASE_URL", "OPENAI_USE_AZURE", "ANTHROPIC_API_KEY", "AZURE_OPENAI_ENDPOINT", "AZURE_OPENAI_KEY", "AZURE_OPENAI_API_VERSION", "AZURE_OPENAI_DEPLOYMENT", "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_OPENAI_USE_AZURE", "MIDSCENE_VQA_USE_AZURE_OPENAI", "MIDSCENE_VQA_AZURE_OPENAI_SCOPE", "MIDSCENE_VQA_AZURE_OPENAI_KEY", "MIDSCENE_VQA_AZURE_OPENAI_ENDPOINT", "MIDSCENE_VQA_AZURE_OPENAI_API_VERSION", "MIDSCENE_VQA_AZURE_OPENAI_DEPLOYMENT", "MIDSCENE_VQA_AZURE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_VQA_USE_ANTHROPIC_SDK", "MIDSCENE_VQA_ANTHROPIC_API_KEY", "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_OPENAI_USE_AZURE", "MIDSCENE_PLANNING_USE_AZURE_OPENAI", "MIDSCENE_PLANNING_AZURE_OPENAI_SCOPE", "MIDSCENE_PLANNING_AZURE_OPENAI_KEY", "MIDSCENE_PLANNING_AZURE_OPENAI_ENDPOINT", "MIDSCENE_PLANNING_AZURE_OPENAI_API_VERSION", "MIDSCENE_PLANNING_AZURE_OPENAI_DEPLOYMENT", "MIDSCENE_PLANNING_AZURE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_PLANNING_USE_ANTHROPIC_SDK", "MIDSCENE_PLANNING_ANTHROPIC_API_KEY", "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_OPENAI_USE_AZURE", "MIDSCENE_GROUNDING_USE_AZURE_OPENAI", "MIDSCENE_GROUNDING_AZURE_OPENAI_SCOPE", "MIDSCENE_GROUNDING_AZURE_OPENAI_KEY", "MIDSCENE_GROUNDING_AZURE_OPENAI_ENDPOINT", "MIDSCENE_GROUNDING_AZURE_OPENAI_API_VERSION", "MIDSCENE_GROUNDING_AZURE_OPENAI_DEPLOYMENT", "MIDSCENE_GROUNDING_AZURE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_GROUNDING_USE_ANTHROPIC_SDK", "MIDSCENE_GROUNDING_ANTHROPIC_API_KEY", "MIDSCENE_GROUNDING_VL_MODE"];
131
+ export declare const MODEL_ENV_KEYS: readonly ["MIDSCENE_MODEL_NAME", "MIDSCENE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_OPENAI_API_KEY", "MIDSCENE_OPENAI_BASE_URL", "MIDSCENE_OPENAI_USE_AZURE", "MIDSCENE_OPENAI_SOCKS_PROXY", "MIDSCENE_OPENAI_HTTP_PROXY", "MIDSCENE_USE_AZURE_OPENAI", "MIDSCENE_AZURE_OPENAI_SCOPE", "MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_USE_ANTHROPIC_SDK", "MIDSCENE_USE_VLM_UI_TARS", "MIDSCENE_USE_QWEN_VL", "MIDSCENE_USE_QWEN3_VL", "MIDSCENE_USE_DOUBAO_VISION", "MIDSCENE_USE_GEMINI", "MIDSCENE_USE_VL_MODEL", "ANTHROPIC_API_KEY", "MIDSCENE_AZURE_OPENAI_ENDPOINT", "MIDSCENE_AZURE_OPENAI_KEY", "MIDSCENE_AZURE_OPENAI_API_VERSION", "MIDSCENE_AZURE_OPENAI_DEPLOYMENT", "MIDSCENE_VL_MODE", "OPENAI_API_KEY", "OPENAI_BASE_URL", "OPENAI_USE_AZURE", "ANTHROPIC_API_KEY", "AZURE_OPENAI_ENDPOINT", "AZURE_OPENAI_KEY", "AZURE_OPENAI_API_VERSION", "AZURE_OPENAI_DEPLOYMENT", "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_OPENAI_USE_AZURE", "MIDSCENE_VQA_USE_AZURE_OPENAI", "MIDSCENE_VQA_AZURE_OPENAI_SCOPE", "MIDSCENE_VQA_AZURE_OPENAI_KEY", "MIDSCENE_VQA_AZURE_OPENAI_ENDPOINT", "MIDSCENE_VQA_AZURE_OPENAI_API_VERSION", "MIDSCENE_VQA_AZURE_OPENAI_DEPLOYMENT", "MIDSCENE_VQA_AZURE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_VQA_USE_ANTHROPIC_SDK", "MIDSCENE_VQA_ANTHROPIC_API_KEY", "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_OPENAI_USE_AZURE", "MIDSCENE_PLANNING_USE_AZURE_OPENAI", "MIDSCENE_PLANNING_AZURE_OPENAI_SCOPE", "MIDSCENE_PLANNING_AZURE_OPENAI_KEY", "MIDSCENE_PLANNING_AZURE_OPENAI_ENDPOINT", "MIDSCENE_PLANNING_AZURE_OPENAI_API_VERSION", "MIDSCENE_PLANNING_AZURE_OPENAI_DEPLOYMENT", "MIDSCENE_PLANNING_AZURE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_PLANNING_USE_ANTHROPIC_SDK", "MIDSCENE_PLANNING_ANTHROPIC_API_KEY", "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_OPENAI_USE_AZURE", "MIDSCENE_GROUNDING_USE_AZURE_OPENAI", "MIDSCENE_GROUNDING_AZURE_OPENAI_SCOPE", "MIDSCENE_GROUNDING_AZURE_OPENAI_KEY", "MIDSCENE_GROUNDING_AZURE_OPENAI_ENDPOINT", "MIDSCENE_GROUNDING_AZURE_OPENAI_API_VERSION", "MIDSCENE_GROUNDING_AZURE_OPENAI_DEPLOYMENT", "MIDSCENE_GROUNDING_AZURE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_GROUNDING_USE_ANTHROPIC_SDK", "MIDSCENE_GROUNDING_ANTHROPIC_API_KEY", "MIDSCENE_GROUNDING_VL_MODE"];
132
+ export declare const ALL_ENV_KEYS: readonly [...string[], "MIDSCENE_DEBUG_MODE", "MIDSCENE_DEBUG_AI_PROFILE", "MIDSCENE_DEBUG_AI_RESPONSE", "MIDSCENE_RUN_DIR", "MIDSCENE_CACHE", "MIDSCENE_LANGSMITH_DEBUG", "MIDSCENE_FORCE_DEEP_THINK", "MIDSCENE_MCP_USE_PUPPETEER_MODE", "MIDSCENE_MCP_ANDROID_MODE", "MIDSCENE_CACHE_MAX_FILENAME_LENGTH", "MIDSCENE_REPLANNING_CYCLE_LIMIT", "OPENAI_MAX_TOKENS", "MIDSCENE_ADB_PATH", "MIDSCENE_ADB_REMOTE_HOST", "MIDSCENE_ADB_REMOTE_PORT", "MIDSCENE_ANDROID_IME_STRATEGY", "MIDSCENE_IOS_DEVICE_UDID", "MIDSCENE_IOS_SIMULATOR_UDID", "MIDSCENE_REPORT_TAG_NAME", "MIDSCENE_PREFERRED_LANGUAGE", "MATCH_BY_POSITION", "MIDSCENE_MCP_CHROME_PATH", "DOCKER_CONTAINER", "MIDSCENE_MODEL_NAME", "MIDSCENE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_OPENAI_API_KEY", "MIDSCENE_OPENAI_BASE_URL", "MIDSCENE_OPENAI_USE_AZURE", "MIDSCENE_OPENAI_SOCKS_PROXY", "MIDSCENE_OPENAI_HTTP_PROXY", "MIDSCENE_USE_AZURE_OPENAI", "MIDSCENE_AZURE_OPENAI_SCOPE", "MIDSCENE_AZURE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_USE_ANTHROPIC_SDK", "MIDSCENE_USE_VLM_UI_TARS", "MIDSCENE_USE_QWEN_VL", "MIDSCENE_USE_QWEN3_VL", "MIDSCENE_USE_DOUBAO_VISION", "MIDSCENE_USE_GEMINI", "MIDSCENE_USE_VL_MODEL", "ANTHROPIC_API_KEY", "MIDSCENE_AZURE_OPENAI_ENDPOINT", "MIDSCENE_AZURE_OPENAI_KEY", "MIDSCENE_AZURE_OPENAI_API_VERSION", "MIDSCENE_AZURE_OPENAI_DEPLOYMENT", "MIDSCENE_VL_MODE", "OPENAI_API_KEY", "OPENAI_BASE_URL", "OPENAI_USE_AZURE", "ANTHROPIC_API_KEY", "AZURE_OPENAI_ENDPOINT", "AZURE_OPENAI_KEY", "AZURE_OPENAI_API_VERSION", "AZURE_OPENAI_DEPLOYMENT", "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_OPENAI_USE_AZURE", "MIDSCENE_VQA_USE_AZURE_OPENAI", "MIDSCENE_VQA_AZURE_OPENAI_SCOPE", "MIDSCENE_VQA_AZURE_OPENAI_KEY", "MIDSCENE_VQA_AZURE_OPENAI_ENDPOINT", "MIDSCENE_VQA_AZURE_OPENAI_API_VERSION", "MIDSCENE_VQA_AZURE_OPENAI_DEPLOYMENT", "MIDSCENE_VQA_AZURE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_VQA_USE_ANTHROPIC_SDK", "MIDSCENE_VQA_ANTHROPIC_API_KEY", "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_OPENAI_USE_AZURE", "MIDSCENE_PLANNING_USE_AZURE_OPENAI", "MIDSCENE_PLANNING_AZURE_OPENAI_SCOPE", "MIDSCENE_PLANNING_AZURE_OPENAI_KEY", "MIDSCENE_PLANNING_AZURE_OPENAI_ENDPOINT", "MIDSCENE_PLANNING_AZURE_OPENAI_API_VERSION", "MIDSCENE_PLANNING_AZURE_OPENAI_DEPLOYMENT", "MIDSCENE_PLANNING_AZURE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_PLANNING_USE_ANTHROPIC_SDK", "MIDSCENE_PLANNING_ANTHROPIC_API_KEY", "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_OPENAI_USE_AZURE", "MIDSCENE_GROUNDING_USE_AZURE_OPENAI", "MIDSCENE_GROUNDING_AZURE_OPENAI_SCOPE", "MIDSCENE_GROUNDING_AZURE_OPENAI_KEY", "MIDSCENE_GROUNDING_AZURE_OPENAI_ENDPOINT", "MIDSCENE_GROUNDING_AZURE_OPENAI_API_VERSION", "MIDSCENE_GROUNDING_AZURE_OPENAI_DEPLOYMENT", "MIDSCENE_GROUNDING_AZURE_OPENAI_INIT_CONFIG_JSON", "MIDSCENE_GROUNDING_USE_ANTHROPIC_SDK", "MIDSCENE_GROUNDING_ANTHROPIC_API_KEY", "MIDSCENE_GROUNDING_VL_MODE"];
130
133
  export type TEnvKeys = (typeof ALL_ENV_KEYS)[number];
131
134
  export type TGlobalConfig = Record<TEnvKeys, string | undefined>;
132
- export type TVlModeValues = 'qwen-vl' | 'doubao-vision' | 'gemini' | 'vlm-ui-tars' | 'vlm-ui-tars-doubao' | 'vlm-ui-tars-doubao-1.5';
133
- export type TVlModeTypes = 'qwen-vl' | 'doubao-vision' | 'gemini' | 'vlm-ui-tars';
135
+ export type TVlModeValues = 'qwen-vl' | 'qwen3-vl' | 'doubao-vision' | 'gemini' | 'vlm-ui-tars' | 'vlm-ui-tars-doubao' | 'vlm-ui-tars-doubao-1.5';
136
+ export type TVlModeTypes = 'qwen-vl' | 'qwen3-vl' | 'doubao-vision' | 'gemini' | 'vlm-ui-tars';
134
137
  export interface IModelConfigForVQA {
135
138
  [MIDSCENE_VQA_MODEL_NAME]: string;
136
139
  [MIDSCENE_VQA_OPENAI_SOCKS_PROXY]?: string;
@@ -49,9 +49,21 @@ export declare function zoomForGPT4o(originalWidth: number, originalHeight: numb
49
49
  height: number;
50
50
  };
51
51
  export declare function jimpFromBase64(base64: string): Promise<Jimp>;
52
- export declare function paddingToMatchBlock(image: Jimp, blockSize?: number): Promise<Jimp>;
53
- export declare function paddingToMatchBlockByBase64(imageBase64: string, blockSize?: number): Promise<string>;
54
- export declare function cropByRect(imageBase64: string, rect: Rect, paddingImage: boolean): Promise<string>;
52
+ export declare function paddingToMatchBlock(image: Jimp, blockSize?: number): Promise<{
53
+ width: number;
54
+ height: number;
55
+ image: Jimp;
56
+ }>;
57
+ export declare function paddingToMatchBlockByBase64(imageBase64: string, blockSize?: number): Promise<{
58
+ width: number;
59
+ height: number;
60
+ imageBase64: string;
61
+ }>;
62
+ export declare function cropByRect(imageBase64: string, rect: Rect, paddingImage: boolean): Promise<{
63
+ width: number;
64
+ height: number;
65
+ imageBase64: string;
66
+ }>;
55
67
  export declare function jimpToBase64(image: Jimp): Promise<string>;
56
68
  export declare const httpImg2Base64: (url: string) => Promise<string>;
57
69
  /**
@@ -1,2 +1,3 @@
1
+ export { createCopyStaticPlugin, createPlaygroundCopyPlugin, } from './build/copy-static';
1
2
  declare const _default: {};
2
3
  export default _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@midscene/shared",
3
- "version": "0.29.0",
3
+ "version": "0.29.2-beta-20250924120255.0",
4
4
  "repository": "https://github.com/web-infra-dev/midscene",
5
5
  "homepage": "https://midscenejs.com/",
6
6
  "types": "./dist/types/index.d.ts",
@@ -0,0 +1,62 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ export interface CopyStaticOptions {
5
+ /** Source directory to copy from */
6
+ srcDir: string;
7
+ /** Destination directory to copy to */
8
+ destDir: string;
9
+ /** Optional favicon source path (relative to directory containing srcDir) */
10
+ faviconPath?: string;
11
+ /** Name for the rsbuild plugin */
12
+ pluginName?: string;
13
+ }
14
+
15
+ /**
16
+ * Creates an rsbuild plugin that copies static files after build
17
+ * @param options Configuration options for copying static files
18
+ * @returns Rsbuild plugin object
19
+ */
20
+ export const createCopyStaticPlugin = (options: CopyStaticOptions) => ({
21
+ name: options.pluginName || 'copy-static',
22
+ setup(api: any) {
23
+ api.onAfterBuild(async () => {
24
+ const { srcDir, destDir, faviconPath } = options;
25
+
26
+ await fs.promises.mkdir(destDir, { recursive: true });
27
+
28
+ // Copy directory contents recursively
29
+ await fs.promises.cp(srcDir, destDir, { recursive: true });
30
+ console.log(`Copied build artifacts from ${srcDir} to ${destDir}`);
31
+
32
+ // Copy favicon if specified
33
+ if (faviconPath) {
34
+ const faviconDest = path.join(destDir, 'favicon.ico');
35
+ await fs.promises.copyFile(faviconPath, faviconDest);
36
+ console.log(`Copied favicon from ${faviconPath} to ${faviconDest}`);
37
+ }
38
+ });
39
+ },
40
+ });
41
+
42
+ /**
43
+ * Helper function to create a copy static plugin for playground builds
44
+ * @param srcDir Source directory (usually dist directory)
45
+ * @param destDir Destination directory
46
+ * @param pluginName Optional plugin name
47
+ * @param faviconSrc Optional favicon source path
48
+ * @returns Rsbuild plugin
49
+ */
50
+ export const createPlaygroundCopyPlugin = (
51
+ srcDir: string,
52
+ destDir: string,
53
+ pluginName?: string,
54
+ faviconSrc?: string,
55
+ ) => {
56
+ return createCopyStaticPlugin({
57
+ srcDir,
58
+ destDir,
59
+ faviconPath: faviconSrc,
60
+ pluginName,
61
+ });
62
+ };
@@ -18,6 +18,10 @@ export enum NodeType {
18
18
  export const PLAYGROUND_SERVER_PORT = 5800;
19
19
  export const SCRCPY_SERVER_PORT = 5700;
20
20
 
21
+ // WebDriver constants
22
+ export const WEBDRIVER_ELEMENT_ID_KEY = 'element-6066-11e4-a52e-4f735466cecf';
23
+ export const DEFAULT_WDA_PORT = 8100;
24
+
21
25
  export const DEFAULT_WAIT_FOR_NAVIGATION_TIMEOUT = 5000;
22
26
  export const DEFAULT_WAIT_FOR_NETWORK_IDLE_TIMEOUT = 2000;
23
27
  export const DEFAULT_WAIT_FOR_NETWORK_IDLE_TIME = 300;
package/src/env/parse.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  MIDSCENE_USE_DOUBAO_VISION,
3
3
  MIDSCENE_USE_GEMINI,
4
+ MIDSCENE_USE_QWEN3_VL,
4
5
  MIDSCENE_USE_QWEN_VL,
5
6
  MIDSCENE_USE_VLM_UI_TARS,
6
7
  type TVlModeTypes,
@@ -58,12 +59,14 @@ export const parseVlModeAndUiTarsFromGlobalConfig = (
58
59
  } => {
59
60
  const isDoubao = provider[MIDSCENE_USE_DOUBAO_VISION];
60
61
  const isQwen = provider[MIDSCENE_USE_QWEN_VL];
62
+ const isQwen3 = provider[MIDSCENE_USE_QWEN3_VL];
61
63
  const isUiTars = provider[MIDSCENE_USE_VLM_UI_TARS];
62
64
  const isGemini = provider[MIDSCENE_USE_GEMINI];
63
65
 
64
66
  const enabledModes = [
65
67
  isDoubao && MIDSCENE_USE_DOUBAO_VISION,
66
68
  isQwen && MIDSCENE_USE_QWEN_VL,
69
+ isQwen3 && MIDSCENE_USE_QWEN3_VL,
67
70
  isUiTars && MIDSCENE_USE_VLM_UI_TARS,
68
71
  isGemini && MIDSCENE_USE_GEMINI,
69
72
  ].filter(Boolean);
@@ -74,6 +77,13 @@ export const parseVlModeAndUiTarsFromGlobalConfig = (
74
77
  );
75
78
  }
76
79
 
80
+ if (isQwen3) {
81
+ return {
82
+ vlMode: 'qwen3-vl',
83
+ uiTarsVersion: undefined,
84
+ };
85
+ }
86
+
77
87
  if (isQwen) {
78
88
  return {
79
89
  vlMode: 'qwen-vl',
package/src/env/types.ts CHANGED
@@ -26,9 +26,13 @@ export const MIDSCENE_ADB_REMOTE_HOST = 'MIDSCENE_ADB_REMOTE_HOST';
26
26
  export const MIDSCENE_ADB_REMOTE_PORT = 'MIDSCENE_ADB_REMOTE_PORT';
27
27
  export const MIDSCENE_ANDROID_IME_STRATEGY = 'MIDSCENE_ANDROID_IME_STRATEGY';
28
28
 
29
+ export const MIDSCENE_IOS_DEVICE_UDID = 'MIDSCENE_IOS_DEVICE_UDID';
30
+ export const MIDSCENE_IOS_SIMULATOR_UDID = 'MIDSCENE_IOS_SIMULATOR_UDID';
31
+
29
32
  export const MIDSCENE_CACHE = 'MIDSCENE_CACHE';
30
33
  export const MIDSCENE_USE_VLM_UI_TARS = 'MIDSCENE_USE_VLM_UI_TARS';
31
34
  export const MIDSCENE_USE_QWEN_VL = 'MIDSCENE_USE_QWEN_VL';
35
+ export const MIDSCENE_USE_QWEN3_VL = 'MIDSCENE_USE_QWEN3_VL';
32
36
  export const MIDSCENE_USE_DOUBAO_VISION = 'MIDSCENE_USE_DOUBAO_VISION';
33
37
  export const MIDSCENE_USE_GEMINI = 'MIDSCENE_USE_GEMINI';
34
38
  export const MIDSCENE_USE_VL_MODEL = 'MIDSCENE_USE_VL_MODEL';
@@ -204,6 +208,8 @@ export const STRING_ENV_KEYS = [
204
208
  MIDSCENE_ADB_REMOTE_HOST,
205
209
  MIDSCENE_ADB_REMOTE_PORT,
206
210
  MIDSCENE_ANDROID_IME_STRATEGY,
211
+ MIDSCENE_IOS_DEVICE_UDID,
212
+ MIDSCENE_IOS_SIMULATOR_UDID,
207
213
  MIDSCENE_REPORT_TAG_NAME,
208
214
  MIDSCENE_PREFERRED_LANGUAGE,
209
215
  MATCH_BY_POSITION,
@@ -242,6 +248,7 @@ export const MODEL_ENV_KEYS = [
242
248
  MIDSCENE_USE_ANTHROPIC_SDK,
243
249
  MIDSCENE_USE_VLM_UI_TARS,
244
250
  MIDSCENE_USE_QWEN_VL,
251
+ MIDSCENE_USE_QWEN3_VL,
245
252
  MIDSCENE_USE_DOUBAO_VISION,
246
253
  MIDSCENE_USE_GEMINI,
247
254
  MIDSCENE_USE_VL_MODEL,
@@ -328,6 +335,7 @@ export type TGlobalConfig = Record<TEnvKeys, string | undefined>;
328
335
 
329
336
  export type TVlModeValues =
330
337
  | 'qwen-vl'
338
+ | 'qwen3-vl'
331
339
  | 'doubao-vision'
332
340
  | 'gemini'
333
341
  | 'vlm-ui-tars'
@@ -336,6 +344,7 @@ export type TVlModeValues =
336
344
 
337
345
  export type TVlModeTypes =
338
346
  | 'qwen-vl'
347
+ | 'qwen3-vl'
339
348
  | 'doubao-vision'
340
349
  | 'gemini'
341
350
  | 'vlm-ui-tars';
@@ -497,6 +506,7 @@ export const VL_MODE_RAW_VALID_VALUES: TVlModeValues[] = [
497
506
  'doubao-vision',
498
507
  'gemini',
499
508
  'qwen-vl',
509
+ 'qwen3-vl',
500
510
  'vlm-ui-tars',
501
511
  'vlm-ui-tars-doubao',
502
512
  'vlm-ui-tars-doubao-1.5',
@@ -228,14 +228,18 @@ export async function jimpFromBase64(base64: string): Promise<Jimp> {
228
228
  export async function paddingToMatchBlock(
229
229
  image: Jimp,
230
230
  blockSize = 28,
231
- ): Promise<Jimp> {
231
+ ): Promise<{
232
+ width: number;
233
+ height: number;
234
+ image: Jimp;
235
+ }> {
232
236
  const { width, height } = image.bitmap;
233
237
 
234
238
  const targetWidth = Math.ceil(width / blockSize) * blockSize;
235
239
  const targetHeight = Math.ceil(height / blockSize) * blockSize;
236
240
 
237
241
  if (targetWidth === width && targetHeight === height) {
238
- return image;
242
+ return { width, height, image };
239
243
  }
240
244
 
241
245
  const Jimp = await getJimp();
@@ -243,31 +247,52 @@ export async function paddingToMatchBlock(
243
247
 
244
248
  // Composite the original image onto the new canvas
245
249
  paddedImage.composite(image, 0, 0);
246
- return paddedImage;
250
+ return { width: targetWidth, height: targetHeight, image: paddedImage };
247
251
  }
248
252
 
249
253
  export async function paddingToMatchBlockByBase64(
250
254
  imageBase64: string,
251
255
  blockSize = 28,
252
- ): Promise<string> {
256
+ ): Promise<{
257
+ width: number;
258
+ height: number;
259
+ imageBase64: string;
260
+ }> {
253
261
  const jimpImage = await jimpFromBase64(imageBase64);
254
- const paddedImage = await paddingToMatchBlock(jimpImage, blockSize);
255
- return jimpToBase64(paddedImage);
262
+ const paddedResult = await paddingToMatchBlock(jimpImage, blockSize);
263
+ return {
264
+ width: paddedResult.width,
265
+ height: paddedResult.height,
266
+ imageBase64: await jimpToBase64(paddedResult.image),
267
+ };
256
268
  }
269
+
257
270
  export async function cropByRect(
258
271
  imageBase64: string,
259
272
  rect: Rect,
260
273
  paddingImage: boolean,
261
- ): Promise<string> {
274
+ ): Promise<{
275
+ width: number;
276
+ height: number;
277
+ imageBase64: string;
278
+ }> {
262
279
  const jimpImage = await jimpFromBase64(imageBase64);
263
280
  const { left, top, width, height } = rect;
264
281
  jimpImage.crop(left, top, width, height);
265
282
 
266
283
  if (paddingImage) {
267
- const paddedImage = await paddingToMatchBlock(jimpImage);
268
- return jimpToBase64(paddedImage);
284
+ const paddedResult = await paddingToMatchBlock(jimpImage);
285
+ return {
286
+ width: paddedResult.width,
287
+ height: paddedResult.height,
288
+ imageBase64: await jimpToBase64(paddedResult.image),
289
+ };
269
290
  }
270
- return jimpToBase64(jimpImage);
291
+ return {
292
+ width: jimpImage.bitmap.width,
293
+ height: jimpImage.bitmap.height,
294
+ imageBase64: await jimpToBase64(jimpImage),
295
+ };
271
296
  }
272
297
 
273
298
  export async function jimpToBase64(image: Jimp): Promise<string> {
package/src/index.ts CHANGED
@@ -1 +1,6 @@
1
+ export {
2
+ createCopyStaticPlugin,
3
+ createPlaygroundCopyPlugin,
4
+ } from './build/copy-static';
5
+
1
6
  export default {};