@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.
- package/dist/es/cli/cli-runner.mjs +5 -2
- package/dist/es/env/parse-model-config.mjs +1 -1
- package/dist/es/mcp/base-server.mjs +14 -1
- package/dist/es/mcp/base-tools.mjs +7 -2
- package/dist/es/mcp/index.mjs +1 -0
- package/dist/es/mcp/tool-defaults.mjs +54 -0
- package/dist/es/mcp/tool-generator.mjs +44 -7
- package/dist/lib/cli/cli-runner.js +5 -2
- package/dist/lib/env/parse-model-config.js +1 -1
- package/dist/lib/mcp/base-server.js +14 -1
- package/dist/lib/mcp/base-tools.js +7 -2
- package/dist/lib/mcp/index.js +21 -14
- package/dist/lib/mcp/tool-defaults.js +97 -0
- package/dist/lib/mcp/tool-generator.js +44 -7
- package/dist/types/mcp/base-server.d.ts +14 -1
- package/dist/types/mcp/base-tools.d.ts +14 -0
- package/dist/types/mcp/index.d.ts +1 -0
- package/dist/types/mcp/tool-defaults.d.ts +64 -0
- package/dist/types/mcp/tool-generator.d.ts +3 -2
- package/dist/types/mcp/types.d.ts +2 -0
- package/package.json +1 -1
- package/src/cli/cli-runner.ts +13 -2
- package/src/mcp/base-server.ts +30 -1
- package/src/mcp/base-tools.ts +20 -0
- package/src/mcp/index.ts +1 -0
- package/src/mcp/tool-defaults.ts +120 -0
- package/src/mcp/tool-generator.ts +100 -3
- package/src/mcp/types.ts +2 -0
|
@@ -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
|
|
66
|
-
debug('CLI invoked: %s %s', scriptName,
|
|
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.
|
|
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 };
|
package/dist/es/mcp/index.mjs
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
109
|
-
debug('CLI invoked: %s %s', scriptName,
|
|
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.
|
|
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;
|
package/dist/lib/mcp/index.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
93
|
+
var _error_formatter__rspack_import_4 = __webpack_require__("./error-formatter");
|
|
87
94
|
var __rspack_reexport = {};
|
|
88
|
-
for(const __rspack_import_key in
|
|
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
|
|
97
|
+
var _tool_generator__rspack_import_5 = __webpack_require__("./tool-generator");
|
|
91
98
|
var __rspack_reexport = {};
|
|
92
|
-
for(const __rspack_import_key in
|
|
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
|
|
101
|
+
var _types__rspack_import_6 = __webpack_require__("./types");
|
|
95
102
|
var __rspack_reexport = {};
|
|
96
|
-
for(const __rspack_import_key in
|
|
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
|
|
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
|
|
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
|
|
109
|
+
var _launcher_helper__rspack_import_8 = __webpack_require__("./launcher-helper");
|
|
103
110
|
var __rspack_reexport = {};
|
|
104
|
-
for(const __rspack_import_key in
|
|
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
|
|
113
|
+
var _chrome_path__rspack_import_9 = __webpack_require__("./chrome-path");
|
|
107
114
|
var __rspack_reexport = {};
|
|
108
|
-
for(const __rspack_import_key in
|
|
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
|
+
});
|