@midscene/shared 1.9.1 → 1.9.2-beta-20260605084246.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.
@@ -3,6 +3,7 @@ import { tmpdir } from "node:os";
3
3
  import { join } from "node:path";
4
4
  import dotenv from "dotenv";
5
5
  import { getDebug } from "../logger.mjs";
6
+ import { stripBehaviorFlags } from "../mcp/tool-defaults.mjs";
6
7
  import { canonicalizeCliArgKeys, formatCliValidationError, getCliOptionDisplay, parseCliArgs, parseValue } from "./cli-args.mjs";
7
8
  import { CLIError, reportCLIError } from "./cli-error.mjs";
8
9
  const debug = getDebug('cli-runner');
@@ -62,8 +63,10 @@ function printHelp(scriptName, commands, version) {
62
63
  console.log(`\nRun "${scriptName} <command> --help" for more info.`);
63
64
  }
64
65
  async function runToolsCLI(tools, scriptName, options) {
65
- const rawArgs = options?.argv ?? process.argv.slice(2);
66
- debug('CLI invoked: %s %s', scriptName, rawArgs.join(' '));
66
+ const inputArgs = options?.argv ?? process.argv.slice(2);
67
+ debug('CLI invoked: %s %s', scriptName, inputArgs.join(' '));
68
+ const { rawArgs, toolDefaults } = stripBehaviorFlags(inputArgs);
69
+ if (Object.keys(toolDefaults).length > 0) tools.setToolDefaults?.(toolDefaults);
67
70
  const envFile = join(process.cwd(), '.env');
68
71
  if (existsSync(envFile)) dotenv.config({
69
72
  path: envFile
@@ -5,7 +5,7 @@ import { assert } from "../utils.mjs";
5
5
  import { maskConfig, parseJson } from "./helper.mjs";
6
6
  import { initDebugConfig } from "./init-debug.mjs";
7
7
  const MODEL_CONFIG_DOC_URL = 'https://midscenejs.com/model-common-config.html';
8
- const getCurrentVersion = ()=>"1.9.1";
8
+ const getCurrentVersion = ()=>"1.9.2-beta-20260605084246.0";
9
9
  const getInvalidModelFamilyMessage = (modelFamily)=>`Invalid MIDSCENE_MODEL_FAMILY value: ${modelFamily}. Current version v${getCurrentVersion()} accepts the following model families: ${MODEL_FAMILY_VALUES.join(', ')}. You can also visit ${MODEL_CONFIG_DOC_URL} for the latest configuration information.`;
10
10
  const KEYS_MAP = {
11
11
  insight: INSIGHT_MODEL_CONFIG_KEYS,
@@ -5,6 +5,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
5
5
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
6
6
  import express from "express";
7
7
  import { getErrorMessage } from "./error-formatter.mjs";
8
+ import { TOOL_BEHAVIOR_FLAGS, mergeToolDefaults, resolveToolDefaults } from "./tool-defaults.mjs";
8
9
  function _define_property(obj, key, value) {
9
10
  if (key in obj) Object.defineProperty(obj, key, {
10
11
  value: value,
@@ -27,9 +28,16 @@ const CLI_ARGS_CONFIG = {
27
28
  host: {
28
29
  type: 'string',
29
30
  default: 'localhost'
30
- }
31
+ },
32
+ ...Object.fromEntries(TOOL_BEHAVIOR_FLAGS.map((flag)=>[
33
+ flag.cli,
34
+ {
35
+ type: 'boolean'
36
+ }
37
+ ]))
31
38
  };
32
39
  function launchMCPServer(server, args) {
40
+ server.setToolDefaults(resolveToolDefaults((cli)=>true === args[cli]));
33
41
  if ('http' === args.mode) return server.launchHttp({
34
42
  port: Number.parseInt(args.port || '3000', 10),
35
43
  host: args.host || 'localhost'
@@ -40,9 +48,13 @@ const SESSION_TIMEOUT_MS = 1800000;
40
48
  const CLEANUP_INTERVAL_MS = 300000;
41
49
  const MAX_SESSIONS = 100;
42
50
  class BaseMCPServer {
51
+ setToolDefaults(toolDefaults) {
52
+ this.toolDefaults = mergeToolDefaults(this.toolDefaults, toolDefaults);
53
+ }
43
54
  async initializeToolsManager() {
44
55
  setIsMcp(true);
45
56
  this.toolsManager = this.providedToolsManager || this.createToolsManager();
57
+ this.toolsManager.setToolDefaults?.(this.toolDefaults);
46
58
  try {
47
59
  await this.toolsManager.initTools();
48
60
  } catch (error) {
@@ -270,6 +282,7 @@ class BaseMCPServer {
270
282
  _define_property(this, "toolsManager", void 0);
271
283
  _define_property(this, "config", void 0);
272
284
  _define_property(this, "providedToolsManager", void 0);
285
+ _define_property(this, "toolDefaults", {});
273
286
  this.config = config;
274
287
  this.mcpServer = new McpServer({
275
288
  name: config.name,
@@ -3,6 +3,7 @@ import { getDebug } from "@midscene/shared/logger";
3
3
  import { camelToKebab, getKeyAliases } from "../key-alias-utils.mjs";
4
4
  import { generateCliReportSession, readCliReportSession, writeCliReportSession } from "./cli-report-session.mjs";
5
5
  import { createNamespacedInitArgSchema, extractNamespacedArgs, sanitizeNamespacedArgs } from "./init-arg-utils.mjs";
6
+ import { mergeToolDefaults } from "./tool-defaults.mjs";
6
7
  import { generateCommonTools, generateToolsFromActionSpace } from "./tool-generator.mjs";
7
8
  function _define_property(obj, key, value) {
8
9
  if (key in obj) Object.defineProperty(obj, key, {
@@ -98,8 +99,8 @@ class BaseMidsceneTools {
98
99
  await tempDevice.destroy?.();
99
100
  debug('Action space from temporary device:', actionSpace.map((a)=>a.name).join(', '));
100
101
  }
101
- const actionTools = generateToolsFromActionSpace(actionSpace, (args = {})=>this.ensureAgent(this.extractAgentInitParam(args)), (args = {})=>this.sanitizeToolArgs(args), this.getAgentInitArgSchema(), this.getAgentInitArgCliMetadata());
102
- const commonTools = generateCommonTools((args = {})=>this.ensureAgent(this.extractAgentInitParam(args)), this.getAgentInitArgSchema(), this.getAgentInitArgCliMetadata());
102
+ const actionTools = generateToolsFromActionSpace(actionSpace, (args = {})=>this.ensureAgent(this.extractAgentInitParam(args)), (args = {})=>this.sanitizeToolArgs(args), this.getAgentInitArgSchema(), this.getAgentInitArgCliMetadata(), this.toolDefaults);
103
+ const commonTools = generateCommonTools((args = {})=>this.ensureAgent(this.extractAgentInitParam(args)), this.getAgentInitArgSchema(), this.getAgentInitArgCliMetadata(), this.toolDefaults);
103
104
  this.toolDefinitions.push(...actionTools, ...commonTools);
104
105
  debug('Total tools prepared:', this.toolDefinitions.length);
105
106
  }
@@ -118,6 +119,9 @@ class BaseMidsceneTools {
118
119
  setAgent(agent) {
119
120
  this.agent = agent;
120
121
  }
122
+ setToolDefaults(toolDefaults) {
123
+ this.toolDefaults = mergeToolDefaults(this.toolDefaults, toolDefaults);
124
+ }
121
125
  buildScreenshotContent(screenshot) {
122
126
  const { mimeType, body } = parseBase64(screenshot);
123
127
  return [
@@ -154,6 +158,7 @@ class BaseMidsceneTools {
154
158
  _define_property(this, "mcpServer", void 0);
155
159
  _define_property(this, "agent", void 0);
156
160
  _define_property(this, "toolDefinitions", []);
161
+ _define_property(this, "toolDefaults", {});
157
162
  }
158
163
  }
159
164
  export { BaseMidsceneTools };
@@ -1,5 +1,6 @@
1
1
  export * from "./base-server.mjs";
2
2
  export * from "./base-tools.mjs";
3
+ export * from "./tool-defaults.mjs";
3
4
  export * from "./init-arg-utils.mjs";
4
5
  export * from "./error-formatter.mjs";
5
6
  export * from "./tool-generator.mjs";
@@ -0,0 +1,54 @@
1
+ const TOOL_BEHAVIOR_FLAGS = [
2
+ {
3
+ cli: 'deep-locate',
4
+ description: 'Force deep locate for every locating operation (better precision for small/ambiguous targets, a bit slower).',
5
+ defaults: {
6
+ locate: {
7
+ deepLocate: true
8
+ },
9
+ act: {
10
+ deepLocate: true
11
+ }
12
+ }
13
+ },
14
+ {
15
+ cli: 'deep-think',
16
+ description: 'Plan the act tool with deep thinking (richer context and sub-goal decomposition, a bit slower).',
17
+ defaults: {
18
+ act: {
19
+ deepThink: true
20
+ }
21
+ }
22
+ }
23
+ ];
24
+ function mergeToolDefaults(a, b) {
25
+ const locate = {
26
+ ...a.locate,
27
+ ...b.locate
28
+ };
29
+ const act = {
30
+ ...a.act,
31
+ ...b.act
32
+ };
33
+ const result = {};
34
+ if (Object.keys(locate).length > 0) result.locate = locate;
35
+ if (Object.keys(act).length > 0) result.act = act;
36
+ return result;
37
+ }
38
+ function resolveToolDefaults(isEnabled) {
39
+ return TOOL_BEHAVIOR_FLAGS.reduce((acc, flag)=>isEnabled(flag.cli) ? mergeToolDefaults(acc, flag.defaults) : acc, {});
40
+ }
41
+ function stripBehaviorFlags(argv) {
42
+ const enabled = new Set();
43
+ const rawArgs = [];
44
+ for (const arg of argv){
45
+ const flag = TOOL_BEHAVIOR_FLAGS.find((f)=>arg === `--${f.cli}`);
46
+ if (flag) enabled.add(flag.cli);
47
+ else rawArgs.push(arg);
48
+ }
49
+ return {
50
+ rawArgs,
51
+ toolDefaults: resolveToolDefaults((cli)=>enabled.has(cli))
52
+ };
53
+ }
54
+ export { TOOL_BEHAVIOR_FLAGS, mergeToolDefaults, resolveToolDefaults, stripBehaviorFlags };
@@ -135,6 +135,34 @@ function normalizeActionArgs(args, paramSchema) {
135
135
  ];
136
136
  }));
137
137
  }
138
+ function mergeLocateDefaults(locate, defaults) {
139
+ let merged;
140
+ for (const [key, value] of Object.entries(defaults))if (void 0 === locate[key]) {
141
+ if ('deepLocate' !== key || void 0 === locate.deepThink) {
142
+ merged = merged ?? {
143
+ ...locate
144
+ };
145
+ merged[key] = value;
146
+ }
147
+ }
148
+ return merged ?? locate;
149
+ }
150
+ function applyLocateDefaults(args, paramSchema, locateDefaults) {
151
+ if (!paramSchema || 0 === Object.keys(locateDefaults).length) return args;
152
+ const shape = getZodObjectShape(paramSchema);
153
+ if (!shape) return args;
154
+ return Object.fromEntries(Object.entries(args).map(([key, value])=>{
155
+ const fieldSchema = shape[key];
156
+ if (fieldSchema && isMidsceneLocatorField(fieldSchema) && isRecord(value)) return [
157
+ key,
158
+ mergeLocateDefaults(value, locateDefaults)
159
+ ];
160
+ return [
161
+ key,
162
+ value
163
+ ];
164
+ }));
165
+ }
138
166
  function serializeArgsToDescription(args) {
139
167
  try {
140
168
  return Object.entries(args).map(([key, value])=>{
@@ -290,7 +318,7 @@ function mergeToolCliMetadata(base, extra) {
290
318
  options
291
319
  } : void 0;
292
320
  }
293
- function generateToolsFromActionSpace(actionSpace, getAgent, sanitizeArgs = (args)=>args, initArgSchema = {}, initArgCliMetadata) {
321
+ function generateToolsFromActionSpace(actionSpace, getAgent, sanitizeArgs = (args)=>args, initArgSchema = {}, initArgCliMetadata, toolDefaults = {}) {
294
322
  return actionSpace.map((action)=>{
295
323
  const schema = {
296
324
  ...extractActionSchema(action.paramSchema, action.name),
@@ -304,7 +332,8 @@ function generateToolsFromActionSpace(actionSpace, getAgent, sanitizeArgs = (arg
304
332
  handler: async (args)=>{
305
333
  try {
306
334
  const agent = await getAgent(args);
307
- const normalizedArgs = normalizeActionArgs(sanitizeArgs(args), action.paramSchema);
335
+ let normalizedArgs = normalizeActionArgs(sanitizeArgs(args), action.paramSchema);
336
+ if (toolDefaults.locate) normalizedArgs = applyLocateDefaults(normalizedArgs, action.paramSchema, toolDefaults.locate);
308
337
  let actionResult;
309
338
  try {
310
339
  actionResult = await executeAction(agent, action.name, normalizedArgs);
@@ -323,7 +352,7 @@ function generateToolsFromActionSpace(actionSpace, getAgent, sanitizeArgs = (arg
323
352
  };
324
353
  });
325
354
  }
326
- function generateCommonTools(getAgent, initArgSchema = {}, initArgCliMetadata) {
355
+ function generateCommonTools(getAgent, initArgSchema = {}, initArgCliMetadata, toolDefaults = {}) {
327
356
  return [
328
357
  {
329
358
  name: 'take_screenshot',
@@ -362,6 +391,8 @@ function generateCommonTools(getAgent, initArgSchema = {}, initArgCliMetadata) {
362
391
  description: 'Execute a natural language action. The AI will plan and perform multi-step operations in a single invocation, useful for transient UI interactions (e.g., Spotlight, dropdown menus) that disappear between separate commands.',
363
392
  schema: {
364
393
  prompt: z.string().describe('Natural language description of the action to perform, e.g. "press Command+Space, type Safari, press Enter"'),
394
+ deepLocate: z.boolean().optional().describe('Use deep locate for every element this action targets. Improves precision for small or ambiguous targets at the cost of speed. Defaults to the server --deep-locate setting.'),
395
+ deepThink: z.boolean().optional().describe('Plan this action with deep thinking (richer context and sub-goal decomposition). Helps with complex multi-step instructions at the cost of speed. Defaults to the server --deep-think setting.'),
365
396
  ...initArgSchema
366
397
  },
367
398
  cli: mergeToolCliMetadata(void 0, initArgCliMetadata),
@@ -370,9 +401,13 @@ function generateCommonTools(getAgent, initArgSchema = {}, initArgCliMetadata) {
370
401
  try {
371
402
  const agent = await getAgent(args);
372
403
  if (!agent.aiAction) return createErrorResult('act is not supported by this agent');
373
- const result = await agent.aiAction(prompt, {
374
- deepThink: false
375
- });
404
+ const actOptions = {
405
+ deepThink: false,
406
+ ...toolDefaults.act
407
+ };
408
+ if (void 0 !== args.deepLocate) actOptions.deepLocate = args.deepLocate;
409
+ if (void 0 !== args.deepThink) actOptions.deepThink = args.deepThink;
410
+ const result = await agent.aiAction(prompt, actOptions);
376
411
  return await captureScreenshotResult(agent, 'act', result);
377
412
  } catch (error) {
378
413
  const errorMessage = getErrorMessage(error);
@@ -386,12 +421,14 @@ function generateCommonTools(getAgent, initArgSchema = {}, initArgCliMetadata) {
386
421
  description: 'Assert a natural language statement against the current page/screen.',
387
422
  schema: {
388
423
  prompt: z.string().describe('Natural language assertion to verify, e.g. "there is a login button visible"'),
424
+ message: z.string().optional().describe('Custom error message to throw when the assertion fails, e.g. "the login button should be visible".'),
389
425
  ...promptInputExtraSchema,
390
426
  ...initArgSchema
391
427
  },
392
428
  cli: mergeToolCliMetadata(void 0, initArgCliMetadata),
393
429
  handler: async (args = {})=>{
394
430
  const prompt = args.prompt;
431
+ const message = args.message;
395
432
  try {
396
433
  const agent = await getAgent(args);
397
434
  if (!agent.aiAssert) return createErrorResult('assert is not supported by this agent');
@@ -401,7 +438,7 @@ function generateCommonTools(getAgent, initArgSchema = {}, initArgCliMetadata) {
401
438
  imageName: args.imageName,
402
439
  convertHttpImage2Base64: args.convertHttpImage2Base64
403
440
  });
404
- await agent.aiAssert(userPrompt);
441
+ await agent.aiAssert(userPrompt, message);
405
442
  return {
406
443
  content: [
407
444
  {
@@ -46,6 +46,7 @@ const external_node_path_namespaceObject = require("node:path");
46
46
  const external_dotenv_namespaceObject = require("dotenv");
47
47
  var external_dotenv_default = /*#__PURE__*/ __webpack_require__.n(external_dotenv_namespaceObject);
48
48
  const external_logger_js_namespaceObject = require("../logger.js");
49
+ const tool_defaults_js_namespaceObject = require("../mcp/tool-defaults.js");
49
50
  const external_cli_args_js_namespaceObject = require("./cli-args.js");
50
51
  const external_cli_error_js_namespaceObject = require("./cli-error.js");
51
52
  const debug = (0, external_logger_js_namespaceObject.getDebug)('cli-runner');
@@ -105,8 +106,10 @@ function printHelp(scriptName, commands, version) {
105
106
  console.log(`\nRun "${scriptName} <command> --help" for more info.`);
106
107
  }
107
108
  async function runToolsCLI(tools, scriptName, options) {
108
- const rawArgs = options?.argv ?? process.argv.slice(2);
109
- debug('CLI invoked: %s %s', scriptName, rawArgs.join(' '));
109
+ const inputArgs = options?.argv ?? process.argv.slice(2);
110
+ debug('CLI invoked: %s %s', scriptName, inputArgs.join(' '));
111
+ const { rawArgs, toolDefaults } = (0, tool_defaults_js_namespaceObject.stripBehaviorFlags)(inputArgs);
112
+ if (Object.keys(toolDefaults).length > 0) tools.setToolDefaults?.(toolDefaults);
110
113
  const envFile = (0, external_node_path_namespaceObject.join)(process.cwd(), '.env');
111
114
  if ((0, external_node_fs_namespaceObject.existsSync)(envFile)) external_dotenv_default().config({
112
115
  path: envFile
@@ -37,7 +37,7 @@ const external_utils_js_namespaceObject = require("../utils.js");
37
37
  const external_helper_js_namespaceObject = require("./helper.js");
38
38
  const external_init_debug_js_namespaceObject = require("./init-debug.js");
39
39
  const MODEL_CONFIG_DOC_URL = 'https://midscenejs.com/model-common-config.html';
40
- const getCurrentVersion = ()=>"1.9.1";
40
+ const getCurrentVersion = ()=>"1.9.2-beta-20260605084246.0";
41
41
  const getInvalidModelFamilyMessage = (modelFamily)=>`Invalid MIDSCENE_MODEL_FAMILY value: ${modelFamily}. Current version v${getCurrentVersion()} accepts the following model families: ${external_types_js_namespaceObject.MODEL_FAMILY_VALUES.join(', ')}. You can also visit ${MODEL_CONFIG_DOC_URL} for the latest configuration information.`;
42
42
  const KEYS_MAP = {
43
43
  insight: external_constants_js_namespaceObject.INSIGHT_MODEL_CONFIG_KEYS,
@@ -45,6 +45,7 @@ const streamableHttp_js_namespaceObject = require("@modelcontextprotocol/sdk/ser
45
45
  const external_express_namespaceObject = require("express");
46
46
  var external_express_default = /*#__PURE__*/ __webpack_require__.n(external_express_namespaceObject);
47
47
  const external_error_formatter_js_namespaceObject = require("./error-formatter.js");
48
+ const external_tool_defaults_js_namespaceObject = require("./tool-defaults.js");
48
49
  function _define_property(obj, key, value) {
49
50
  if (key in obj) Object.defineProperty(obj, key, {
50
51
  value: value,
@@ -67,9 +68,16 @@ const CLI_ARGS_CONFIG = {
67
68
  host: {
68
69
  type: 'string',
69
70
  default: 'localhost'
70
- }
71
+ },
72
+ ...Object.fromEntries(external_tool_defaults_js_namespaceObject.TOOL_BEHAVIOR_FLAGS.map((flag)=>[
73
+ flag.cli,
74
+ {
75
+ type: 'boolean'
76
+ }
77
+ ]))
71
78
  };
72
79
  function launchMCPServer(server, args) {
80
+ server.setToolDefaults((0, external_tool_defaults_js_namespaceObject.resolveToolDefaults)((cli)=>true === args[cli]));
73
81
  if ('http' === args.mode) return server.launchHttp({
74
82
  port: Number.parseInt(args.port || '3000', 10),
75
83
  host: args.host || 'localhost'
@@ -80,9 +88,13 @@ const SESSION_TIMEOUT_MS = 1800000;
80
88
  const CLEANUP_INTERVAL_MS = 300000;
81
89
  const MAX_SESSIONS = 100;
82
90
  class BaseMCPServer {
91
+ setToolDefaults(toolDefaults) {
92
+ this.toolDefaults = (0, external_tool_defaults_js_namespaceObject.mergeToolDefaults)(this.toolDefaults, toolDefaults);
93
+ }
83
94
  async initializeToolsManager() {
84
95
  (0, utils_namespaceObject.setIsMcp)(true);
85
96
  this.toolsManager = this.providedToolsManager || this.createToolsManager();
97
+ this.toolsManager.setToolDefaults?.(this.toolDefaults);
86
98
  try {
87
99
  await this.toolsManager.initTools();
88
100
  } catch (error) {
@@ -310,6 +322,7 @@ class BaseMCPServer {
310
322
  _define_property(this, "toolsManager", void 0);
311
323
  _define_property(this, "config", void 0);
312
324
  _define_property(this, "providedToolsManager", void 0);
325
+ _define_property(this, "toolDefaults", {});
313
326
  this.config = config;
314
327
  this.mcpServer = new mcp_js_namespaceObject.McpServer({
315
328
  name: config.name,
@@ -31,6 +31,7 @@ const logger_namespaceObject = require("@midscene/shared/logger");
31
31
  const external_key_alias_utils_js_namespaceObject = require("../key-alias-utils.js");
32
32
  const external_cli_report_session_js_namespaceObject = require("./cli-report-session.js");
33
33
  const external_init_arg_utils_js_namespaceObject = require("./init-arg-utils.js");
34
+ const external_tool_defaults_js_namespaceObject = require("./tool-defaults.js");
34
35
  const external_tool_generator_js_namespaceObject = require("./tool-generator.js");
35
36
  function _define_property(obj, key, value) {
36
37
  if (key in obj) Object.defineProperty(obj, key, {
@@ -126,8 +127,8 @@ class BaseMidsceneTools {
126
127
  await tempDevice.destroy?.();
127
128
  debug('Action space from temporary device:', actionSpace.map((a)=>a.name).join(', '));
128
129
  }
129
- const actionTools = (0, external_tool_generator_js_namespaceObject.generateToolsFromActionSpace)(actionSpace, (args = {})=>this.ensureAgent(this.extractAgentInitParam(args)), (args = {})=>this.sanitizeToolArgs(args), this.getAgentInitArgSchema(), this.getAgentInitArgCliMetadata());
130
- const commonTools = (0, external_tool_generator_js_namespaceObject.generateCommonTools)((args = {})=>this.ensureAgent(this.extractAgentInitParam(args)), this.getAgentInitArgSchema(), this.getAgentInitArgCliMetadata());
130
+ const actionTools = (0, external_tool_generator_js_namespaceObject.generateToolsFromActionSpace)(actionSpace, (args = {})=>this.ensureAgent(this.extractAgentInitParam(args)), (args = {})=>this.sanitizeToolArgs(args), this.getAgentInitArgSchema(), this.getAgentInitArgCliMetadata(), this.toolDefaults);
131
+ const commonTools = (0, external_tool_generator_js_namespaceObject.generateCommonTools)((args = {})=>this.ensureAgent(this.extractAgentInitParam(args)), this.getAgentInitArgSchema(), this.getAgentInitArgCliMetadata(), this.toolDefaults);
131
132
  this.toolDefinitions.push(...actionTools, ...commonTools);
132
133
  debug('Total tools prepared:', this.toolDefinitions.length);
133
134
  }
@@ -146,6 +147,9 @@ class BaseMidsceneTools {
146
147
  setAgent(agent) {
147
148
  this.agent = agent;
148
149
  }
150
+ setToolDefaults(toolDefaults) {
151
+ this.toolDefaults = (0, external_tool_defaults_js_namespaceObject.mergeToolDefaults)(this.toolDefaults, toolDefaults);
152
+ }
149
153
  buildScreenshotContent(screenshot) {
150
154
  const { mimeType, body } = (0, img_namespaceObject.parseBase64)(screenshot);
151
155
  return [
@@ -182,6 +186,7 @@ class BaseMidsceneTools {
182
186
  _define_property(this, "mcpServer", void 0);
183
187
  _define_property(this, "agent", void 0);
184
188
  _define_property(this, "toolDefinitions", []);
189
+ _define_property(this, "toolDefaults", {});
185
190
  }
186
191
  }
187
192
  exports.BaseMidsceneTools = __webpack_exports__.BaseMidsceneTools;
@@ -21,6 +21,9 @@ var __webpack_modules__ = {
21
21
  "./launcher-helper" (module) {
22
22
  module.exports = require("./launcher-helper.js");
23
23
  },
24
+ "./tool-defaults" (module) {
25
+ module.exports = require("./tool-defaults.js");
26
+ },
24
27
  "./tool-generator" (module) {
25
28
  module.exports = require("./tool-generator.js");
26
29
  },
@@ -79,33 +82,37 @@ var __webpack_exports__ = {};
79
82
  var __rspack_reexport = {};
80
83
  for(const __rspack_import_key in _base_tools__rspack_import_1)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_base_tools__rspack_import_1[__rspack_import_key];
81
84
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
82
- var _init_arg_utils__rspack_import_2 = __webpack_require__("./init-arg-utils");
85
+ var _tool_defaults__rspack_import_2 = __webpack_require__("./tool-defaults");
86
+ var __rspack_reexport = {};
87
+ for(const __rspack_import_key in _tool_defaults__rspack_import_2)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_tool_defaults__rspack_import_2[__rspack_import_key];
88
+ __webpack_require__.d(__webpack_exports__, __rspack_reexport);
89
+ var _init_arg_utils__rspack_import_3 = __webpack_require__("./init-arg-utils");
83
90
  var __rspack_reexport = {};
84
- for(const __rspack_import_key in _init_arg_utils__rspack_import_2)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_init_arg_utils__rspack_import_2[__rspack_import_key];
91
+ for(const __rspack_import_key in _init_arg_utils__rspack_import_3)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_init_arg_utils__rspack_import_3[__rspack_import_key];
85
92
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
86
- var _error_formatter__rspack_import_3 = __webpack_require__("./error-formatter");
93
+ var _error_formatter__rspack_import_4 = __webpack_require__("./error-formatter");
87
94
  var __rspack_reexport = {};
88
- for(const __rspack_import_key in _error_formatter__rspack_import_3)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_error_formatter__rspack_import_3[__rspack_import_key];
95
+ for(const __rspack_import_key in _error_formatter__rspack_import_4)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_error_formatter__rspack_import_4[__rspack_import_key];
89
96
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
90
- var _tool_generator__rspack_import_4 = __webpack_require__("./tool-generator");
97
+ var _tool_generator__rspack_import_5 = __webpack_require__("./tool-generator");
91
98
  var __rspack_reexport = {};
92
- for(const __rspack_import_key in _tool_generator__rspack_import_4)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_tool_generator__rspack_import_4[__rspack_import_key];
99
+ for(const __rspack_import_key in _tool_generator__rspack_import_5)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_tool_generator__rspack_import_5[__rspack_import_key];
93
100
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
94
- var _types__rspack_import_5 = __webpack_require__("./types");
101
+ var _types__rspack_import_6 = __webpack_require__("./types");
95
102
  var __rspack_reexport = {};
96
- for(const __rspack_import_key in _types__rspack_import_5)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_types__rspack_import_5[__rspack_import_key];
103
+ for(const __rspack_import_key in _types__rspack_import_6)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_types__rspack_import_6[__rspack_import_key];
97
104
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
98
- var _inject_report_html_plugin__rspack_import_6 = __webpack_require__("./inject-report-html-plugin");
105
+ var _inject_report_html_plugin__rspack_import_7 = __webpack_require__("./inject-report-html-plugin");
99
106
  var __rspack_reexport = {};
100
- for(const __rspack_import_key in _inject_report_html_plugin__rspack_import_6)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_inject_report_html_plugin__rspack_import_6[__rspack_import_key];
107
+ for(const __rspack_import_key in _inject_report_html_plugin__rspack_import_7)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_inject_report_html_plugin__rspack_import_7[__rspack_import_key];
101
108
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
102
- var _launcher_helper__rspack_import_7 = __webpack_require__("./launcher-helper");
109
+ var _launcher_helper__rspack_import_8 = __webpack_require__("./launcher-helper");
103
110
  var __rspack_reexport = {};
104
- for(const __rspack_import_key in _launcher_helper__rspack_import_7)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_launcher_helper__rspack_import_7[__rspack_import_key];
111
+ for(const __rspack_import_key in _launcher_helper__rspack_import_8)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_launcher_helper__rspack_import_8[__rspack_import_key];
105
112
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
106
- var _chrome_path__rspack_import_8 = __webpack_require__("./chrome-path");
113
+ var _chrome_path__rspack_import_9 = __webpack_require__("./chrome-path");
107
114
  var __rspack_reexport = {};
108
- for(const __rspack_import_key in _chrome_path__rspack_import_8)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_chrome_path__rspack_import_8[__rspack_import_key];
115
+ for(const __rspack_import_key in _chrome_path__rspack_import_9)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_chrome_path__rspack_import_9[__rspack_import_key];
109
116
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
110
117
  })();
111
118
  for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
@@ -0,0 +1,97 @@
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
+ TOOL_BEHAVIOR_FLAGS: ()=>TOOL_BEHAVIOR_FLAGS,
28
+ mergeToolDefaults: ()=>mergeToolDefaults,
29
+ resolveToolDefaults: ()=>resolveToolDefaults,
30
+ stripBehaviorFlags: ()=>stripBehaviorFlags
31
+ });
32
+ const TOOL_BEHAVIOR_FLAGS = [
33
+ {
34
+ cli: 'deep-locate',
35
+ description: 'Force deep locate for every locating operation (better precision for small/ambiguous targets, a bit slower).',
36
+ defaults: {
37
+ locate: {
38
+ deepLocate: true
39
+ },
40
+ act: {
41
+ deepLocate: true
42
+ }
43
+ }
44
+ },
45
+ {
46
+ cli: 'deep-think',
47
+ description: 'Plan the act tool with deep thinking (richer context and sub-goal decomposition, a bit slower).',
48
+ defaults: {
49
+ act: {
50
+ deepThink: true
51
+ }
52
+ }
53
+ }
54
+ ];
55
+ function mergeToolDefaults(a, b) {
56
+ const locate = {
57
+ ...a.locate,
58
+ ...b.locate
59
+ };
60
+ const act = {
61
+ ...a.act,
62
+ ...b.act
63
+ };
64
+ const result = {};
65
+ if (Object.keys(locate).length > 0) result.locate = locate;
66
+ if (Object.keys(act).length > 0) result.act = act;
67
+ return result;
68
+ }
69
+ function resolveToolDefaults(isEnabled) {
70
+ return TOOL_BEHAVIOR_FLAGS.reduce((acc, flag)=>isEnabled(flag.cli) ? mergeToolDefaults(acc, flag.defaults) : acc, {});
71
+ }
72
+ function stripBehaviorFlags(argv) {
73
+ const enabled = new Set();
74
+ const rawArgs = [];
75
+ for (const arg of argv){
76
+ const flag = TOOL_BEHAVIOR_FLAGS.find((f)=>arg === `--${f.cli}`);
77
+ if (flag) enabled.add(flag.cli);
78
+ else rawArgs.push(arg);
79
+ }
80
+ return {
81
+ rawArgs,
82
+ toolDefaults: resolveToolDefaults((cli)=>enabled.has(cli))
83
+ };
84
+ }
85
+ exports.TOOL_BEHAVIOR_FLAGS = __webpack_exports__.TOOL_BEHAVIOR_FLAGS;
86
+ exports.mergeToolDefaults = __webpack_exports__.mergeToolDefaults;
87
+ exports.resolveToolDefaults = __webpack_exports__.resolveToolDefaults;
88
+ exports.stripBehaviorFlags = __webpack_exports__.stripBehaviorFlags;
89
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
90
+ "TOOL_BEHAVIOR_FLAGS",
91
+ "mergeToolDefaults",
92
+ "resolveToolDefaults",
93
+ "stripBehaviorFlags"
94
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
95
+ Object.defineProperty(exports, '__esModule', {
96
+ value: true
97
+ });