@midscene/shared 1.9.7 → 1.9.8-beta-20260618014851.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/agent-tools/agent-behavior-init-args.mjs +44 -0
- package/dist/es/{mcp → agent-tools}/base-tools.mjs +1 -8
- package/dist/es/{mcp → agent-tools}/chrome-path.mjs +14 -3
- package/dist/es/{mcp → agent-tools}/index.mjs +1 -3
- package/dist/es/{mcp → agent-tools}/tool-generator.mjs +6 -5
- package/dist/es/cli/cli-runner.mjs +1 -1
- package/dist/es/env/parse-model-config.mjs +1 -1
- package/dist/es/env/types.mjs +3 -5
- package/dist/es/img/index.mjs +2 -2
- package/dist/es/img/transform.mjs +18 -1
- package/dist/es/utils.mjs +2 -6
- package/dist/lib/agent-tools/agent-behavior-init-args.js +87 -0
- package/dist/lib/{mcp → agent-tools}/base-tools.js +1 -8
- package/dist/lib/{mcp → agent-tools}/chrome-path.js +13 -2
- package/dist/lib/{mcp → agent-tools}/index.js +10 -24
- package/dist/lib/{mcp → agent-tools}/tool-generator.js +6 -5
- package/dist/lib/cli/cli-runner.js +1 -1
- package/dist/lib/env/parse-model-config.js +1 -1
- package/dist/lib/env/types.js +5 -10
- package/dist/lib/img/index.js +3 -0
- package/dist/lib/img/transform.js +20 -0
- package/dist/lib/utils.js +8 -15
- package/dist/types/agent-tools/agent-behavior-init-args.d.ts +17 -0
- package/dist/types/{mcp → agent-tools}/base-tools.d.ts +7 -13
- package/dist/types/{mcp → agent-tools}/index.d.ts +1 -3
- package/dist/types/{mcp → agent-tools}/init-arg-utils.d.ts +3 -3
- package/dist/types/{mcp → agent-tools}/tool-defaults.d.ts +5 -6
- package/dist/types/{mcp → agent-tools}/tool-generator.d.ts +1 -1
- package/dist/types/{mcp → agent-tools}/types.d.ts +20 -13
- package/dist/types/cli/cli-args.d.ts +1 -1
- package/dist/types/cli/cli-runner.d.ts +2 -2
- package/dist/types/env/types.d.ts +8 -6
- package/dist/types/img/index.d.ts +1 -1
- package/dist/types/img/transform.d.ts +4 -0
- package/dist/types/key-alias-utils.d.ts +2 -2
- package/dist/types/utils.d.ts +0 -1
- package/package.json +15 -8
- package/src/agent-tools/agent-behavior-init-args.ts +109 -0
- package/src/{mcp → agent-tools}/base-tools.ts +8 -33
- package/src/{mcp → agent-tools}/chrome-path.ts +20 -3
- package/src/{mcp → agent-tools}/index.ts +1 -3
- package/src/{mcp → agent-tools}/init-arg-utils.ts +3 -3
- package/src/{mcp → agent-tools}/tool-defaults.ts +5 -6
- package/src/{mcp → agent-tools}/tool-generator.ts +14 -7
- package/src/{mcp → agent-tools}/types.ts +22 -10
- package/src/cli/cli-args.ts +1 -1
- package/src/cli/cli-runner.ts +4 -4
- package/src/env/types.ts +5 -5
- package/src/img/index.ts +2 -0
- package/src/img/transform.ts +45 -0
- package/src/key-alias-utils.ts +2 -2
- package/src/utils.ts +1 -10
- package/dist/es/mcp/base-server.mjs +0 -295
- package/dist/es/mcp/inject-report-html-plugin.mjs +0 -53
- package/dist/es/mcp/launcher-helper.mjs +0 -52
- package/dist/lib/mcp/base-server.js +0 -345
- package/dist/lib/mcp/inject-report-html-plugin.js +0 -98
- package/dist/lib/mcp/launcher-helper.js +0 -86
- package/dist/types/mcp/base-server.d.ts +0 -106
- package/dist/types/mcp/inject-report-html-plugin.d.ts +0 -18
- package/dist/types/mcp/launcher-helper.d.ts +0 -94
- package/src/mcp/base-server.ts +0 -529
- package/src/mcp/inject-report-html-plugin.ts +0 -119
- package/src/mcp/launcher-helper.ts +0 -200
- /package/dist/es/{mcp → agent-tools}/cli-report-session.mjs +0 -0
- /package/dist/es/{mcp → agent-tools}/error-formatter.mjs +0 -0
- /package/dist/es/{mcp → agent-tools}/init-arg-utils.mjs +0 -0
- /package/dist/es/{mcp → agent-tools}/tool-defaults.mjs +0 -0
- /package/dist/es/{mcp → agent-tools}/types.mjs +0 -0
- /package/dist/es/{mcp → agent-tools}/user-prompt.mjs +0 -0
- /package/dist/lib/{mcp → agent-tools}/cli-report-session.js +0 -0
- /package/dist/lib/{mcp → agent-tools}/error-formatter.js +0 -0
- /package/dist/lib/{mcp → agent-tools}/init-arg-utils.js +0 -0
- /package/dist/lib/{mcp → agent-tools}/tool-defaults.js +0 -0
- /package/dist/lib/{mcp → agent-tools}/types.js +0 -0
- /package/dist/lib/{mcp → agent-tools}/user-prompt.js +0 -0
- /package/dist/types/{mcp → agent-tools}/chrome-path.d.ts +0 -0
- /package/dist/types/{mcp → agent-tools}/cli-report-session.d.ts +0 -0
- /package/dist/types/{mcp → agent-tools}/error-formatter.d.ts +0 -0
- /package/dist/types/{mcp → agent-tools}/user-prompt.d.ts +0 -0
- /package/src/{mcp → agent-tools}/cli-report-session.ts +0 -0
- /package/src/{mcp → agent-tools}/error-formatter.ts +0 -0
- /package/src/{mcp → agent-tools}/user-prompt.ts +0 -0
|
@@ -1,345 +0,0 @@
|
|
|
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
|
-
CLI_ARGS_CONFIG: ()=>CLI_ARGS_CONFIG,
|
|
37
|
-
launchMCPServer: ()=>launchMCPServer,
|
|
38
|
-
BaseMCPServer: ()=>BaseMCPServer
|
|
39
|
-
});
|
|
40
|
-
const external_node_crypto_namespaceObject = require("node:crypto");
|
|
41
|
-
const utils_namespaceObject = require("@midscene/shared/utils");
|
|
42
|
-
const mcp_js_namespaceObject = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
43
|
-
const stdio_js_namespaceObject = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
44
|
-
const streamableHttp_js_namespaceObject = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
|
|
45
|
-
const external_express_namespaceObject = require("express");
|
|
46
|
-
var external_express_default = /*#__PURE__*/ __webpack_require__.n(external_express_namespaceObject);
|
|
47
|
-
const external_error_formatter_js_namespaceObject = require("./error-formatter.js");
|
|
48
|
-
const external_tool_defaults_js_namespaceObject = require("./tool-defaults.js");
|
|
49
|
-
function _define_property(obj, key, value) {
|
|
50
|
-
if (key in obj) Object.defineProperty(obj, key, {
|
|
51
|
-
value: value,
|
|
52
|
-
enumerable: true,
|
|
53
|
-
configurable: true,
|
|
54
|
-
writable: true
|
|
55
|
-
});
|
|
56
|
-
else obj[key] = value;
|
|
57
|
-
return obj;
|
|
58
|
-
}
|
|
59
|
-
const CLI_ARGS_CONFIG = {
|
|
60
|
-
mode: {
|
|
61
|
-
type: 'string',
|
|
62
|
-
default: 'stdio'
|
|
63
|
-
},
|
|
64
|
-
port: {
|
|
65
|
-
type: 'string',
|
|
66
|
-
default: '3000'
|
|
67
|
-
},
|
|
68
|
-
host: {
|
|
69
|
-
type: 'string',
|
|
70
|
-
default: 'localhost'
|
|
71
|
-
},
|
|
72
|
-
...Object.fromEntries(external_tool_defaults_js_namespaceObject.TOOL_BEHAVIOR_FLAGS.map((flag)=>[
|
|
73
|
-
flag.cli,
|
|
74
|
-
{
|
|
75
|
-
type: 'boolean'
|
|
76
|
-
}
|
|
77
|
-
]))
|
|
78
|
-
};
|
|
79
|
-
function launchMCPServer(server, args) {
|
|
80
|
-
server.setToolDefaults((0, external_tool_defaults_js_namespaceObject.resolveToolDefaults)((cli)=>true === args[cli]));
|
|
81
|
-
if ('http' === args.mode) return server.launchHttp({
|
|
82
|
-
port: Number.parseInt(args.port || '3000', 10),
|
|
83
|
-
host: args.host || 'localhost'
|
|
84
|
-
});
|
|
85
|
-
return server.launch();
|
|
86
|
-
}
|
|
87
|
-
const SESSION_TIMEOUT_MS = 1800000;
|
|
88
|
-
const CLEANUP_INTERVAL_MS = 300000;
|
|
89
|
-
const MAX_SESSIONS = 100;
|
|
90
|
-
class BaseMCPServer {
|
|
91
|
-
setToolDefaults(toolDefaults) {
|
|
92
|
-
this.toolDefaults = (0, external_tool_defaults_js_namespaceObject.mergeToolDefaults)(this.toolDefaults, toolDefaults);
|
|
93
|
-
}
|
|
94
|
-
async initializeToolsManager() {
|
|
95
|
-
(0, utils_namespaceObject.setIsMcp)(true);
|
|
96
|
-
this.toolsManager = this.providedToolsManager || this.createToolsManager();
|
|
97
|
-
this.toolsManager.setToolDefaults?.(this.toolDefaults);
|
|
98
|
-
try {
|
|
99
|
-
await this.toolsManager.initTools();
|
|
100
|
-
} catch (error) {
|
|
101
|
-
const message = (0, external_error_formatter_js_namespaceObject.getErrorMessage)(error);
|
|
102
|
-
console.error(`Failed to initialize tools: ${message}`);
|
|
103
|
-
console.error('Tools will be initialized on first use');
|
|
104
|
-
}
|
|
105
|
-
this.toolsManager.attachToServer(this.mcpServer);
|
|
106
|
-
}
|
|
107
|
-
async performCleanup() {
|
|
108
|
-
console.error(`${this.config.name} closing...`);
|
|
109
|
-
this.mcpServer.close();
|
|
110
|
-
await this.toolsManager?.destroy?.().catch(console.error);
|
|
111
|
-
}
|
|
112
|
-
async launch() {
|
|
113
|
-
console.log = (...args)=>{
|
|
114
|
-
console.error('[LOG]', ...args);
|
|
115
|
-
};
|
|
116
|
-
console.info = (...args)=>{
|
|
117
|
-
console.error('[INFO]', ...args);
|
|
118
|
-
};
|
|
119
|
-
console.debug = (...args)=>{
|
|
120
|
-
console.error('[DEBUG]', ...args);
|
|
121
|
-
};
|
|
122
|
-
await this.initializeToolsManager();
|
|
123
|
-
const transport = new stdio_js_namespaceObject.StdioServerTransport();
|
|
124
|
-
try {
|
|
125
|
-
await this.mcpServer.connect(transport);
|
|
126
|
-
} catch (error) {
|
|
127
|
-
const message = (0, external_error_formatter_js_namespaceObject.getErrorMessage)(error);
|
|
128
|
-
console.error(`Failed to connect MCP stdio transport: ${message}`);
|
|
129
|
-
throw new Error(`Failed to initialize MCP stdio transport: ${message}`);
|
|
130
|
-
}
|
|
131
|
-
let isShuttingDown = false;
|
|
132
|
-
const cleanup = ()=>{
|
|
133
|
-
if (isShuttingDown) return;
|
|
134
|
-
isShuttingDown = true;
|
|
135
|
-
console.error(`${this.config.name} shutting down...`);
|
|
136
|
-
this.performCleanup().finally(()=>process.exit(0));
|
|
137
|
-
};
|
|
138
|
-
process.on('uncaughtException', (error)=>{
|
|
139
|
-
if ('EPIPE' === error.code || 'ERR_STREAM_DESTROYED' === error.code) return void cleanup();
|
|
140
|
-
console.error(`[${this.config.name}] Uncaught Exception:`, error);
|
|
141
|
-
console.error('Stack:', error.stack);
|
|
142
|
-
});
|
|
143
|
-
process.on('unhandledRejection', (reason)=>{
|
|
144
|
-
console.error(`[${this.config.name}] Unhandled Rejection:`, reason);
|
|
145
|
-
if (reason instanceof Error) console.error('Stack:', reason.stack);
|
|
146
|
-
});
|
|
147
|
-
process.stdin.on('close', cleanup);
|
|
148
|
-
process.stdin.on('end', cleanup);
|
|
149
|
-
process.stdout.on('error', cleanup);
|
|
150
|
-
process.once('SIGINT', cleanup);
|
|
151
|
-
process.once('SIGTERM', cleanup);
|
|
152
|
-
process.once('SIGHUP', cleanup);
|
|
153
|
-
return {
|
|
154
|
-
close: async ()=>{
|
|
155
|
-
this.performCleanup();
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
async launchHttp(options) {
|
|
160
|
-
if (!Number.isInteger(options.port) || options.port < 1 || options.port > 65535) throw new Error(`Invalid port number: ${options.port}. Port must be between 1 and 65535.`);
|
|
161
|
-
await this.initializeToolsManager();
|
|
162
|
-
const app = external_express_default()();
|
|
163
|
-
app.use(external_express_default().json({
|
|
164
|
-
limit: '10mb'
|
|
165
|
-
}));
|
|
166
|
-
const sessions = new Map();
|
|
167
|
-
app.all('/mcp', async (req, res)=>{
|
|
168
|
-
const startTime = Date.now();
|
|
169
|
-
const requestId = (0, external_node_crypto_namespaceObject.randomUUID)().substring(0, 8);
|
|
170
|
-
try {
|
|
171
|
-
const rawSessionId = req.headers['mcp-session-id'];
|
|
172
|
-
const sessionId = Array.isArray(rawSessionId) ? rawSessionId[0] : rawSessionId;
|
|
173
|
-
let session = sessionId ? sessions.get(sessionId) : void 0;
|
|
174
|
-
if (!session && 'POST' === req.method) {
|
|
175
|
-
if (sessions.size >= MAX_SESSIONS) {
|
|
176
|
-
console.error(`[${new Date().toISOString()}] [${requestId}] Session limit reached: ${sessions.size}/${MAX_SESSIONS}`);
|
|
177
|
-
res.status(503).json({
|
|
178
|
-
error: 'Too many active sessions',
|
|
179
|
-
message: 'Server is at maximum capacity. Please try again later.'
|
|
180
|
-
});
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
session = await this.createHttpSession(sessions);
|
|
184
|
-
console.log(`[${new Date().toISOString()}] [${requestId}] New session created: ${session.transport.sessionId}`);
|
|
185
|
-
}
|
|
186
|
-
if (session) {
|
|
187
|
-
session.lastAccessedAt = new Date();
|
|
188
|
-
await session.transport.handleRequest(req, res, req.body);
|
|
189
|
-
const duration = Date.now() - startTime;
|
|
190
|
-
console.log(`[${new Date().toISOString()}] [${requestId}] Request completed in ${duration}ms`);
|
|
191
|
-
} else {
|
|
192
|
-
console.error(`[${new Date().toISOString()}] [${requestId}] Invalid session or GET without session`);
|
|
193
|
-
res.status(400).json({
|
|
194
|
-
error: 'Invalid session or GET without session'
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
} catch (error) {
|
|
198
|
-
const message = (0, external_error_formatter_js_namespaceObject.getErrorMessage)(error);
|
|
199
|
-
const duration = Date.now() - startTime;
|
|
200
|
-
console.error(`[${new Date().toISOString()}] [${requestId}] MCP request error after ${duration}ms: ${message}`);
|
|
201
|
-
if (!res.headersSent) res.status(500).json({
|
|
202
|
-
error: 'Internal server error',
|
|
203
|
-
message: 'Failed to process MCP request'
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
});
|
|
207
|
-
const host = options.host || 'localhost';
|
|
208
|
-
const server = app.listen(options.port, host, ()=>{
|
|
209
|
-
console.log(`${this.config.name} HTTP server listening on http://${host}:${options.port}/mcp`);
|
|
210
|
-
}).on('error', (error)=>{
|
|
211
|
-
if ('EADDRINUSE' === error.code) console.error(`ERROR: Port ${options.port} is already in use.\nPlease try a different port: --port=<number>\nExample: --mode=http --port=${options.port + 1}`);
|
|
212
|
-
else if ('EACCES' === error.code) console.error(`ERROR: Permission denied to bind to port ${options.port}.\nPorts below 1024 require root/admin privileges.\nPlease use a port above 1024 or run with elevated privileges.`);
|
|
213
|
-
else console.error(`ERROR: Failed to start HTTP server on ${host}:${options.port}\nReason: ${error.message}\nCode: ${error.code || 'unknown'}`);
|
|
214
|
-
process.exit(1);
|
|
215
|
-
});
|
|
216
|
-
const cleanupInterval = this.startSessionCleanup(sessions);
|
|
217
|
-
this.setupHttpShutdownHandlers(server, sessions, cleanupInterval);
|
|
218
|
-
return {
|
|
219
|
-
port: options.port,
|
|
220
|
-
host,
|
|
221
|
-
close: async ()=>{
|
|
222
|
-
clearInterval(cleanupInterval);
|
|
223
|
-
for (const session of sessions.values())try {
|
|
224
|
-
await session.transport.close();
|
|
225
|
-
} catch (error) {
|
|
226
|
-
const message = (0, external_error_formatter_js_namespaceObject.getErrorMessage)(error);
|
|
227
|
-
console.error(`Failed to close session ${session.transport.sessionId}: ${message}`);
|
|
228
|
-
}
|
|
229
|
-
sessions.clear();
|
|
230
|
-
return new Promise((resolve)=>{
|
|
231
|
-
server.close(async (err)=>{
|
|
232
|
-
if (err) console.error('Error closing HTTP server:', err);
|
|
233
|
-
await this.performCleanup();
|
|
234
|
-
resolve();
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
async createHttpSession(sessions) {
|
|
241
|
-
const transport = new streamableHttp_js_namespaceObject.StreamableHTTPServerTransport({
|
|
242
|
-
sessionIdGenerator: ()=>(0, external_node_crypto_namespaceObject.randomUUID)(),
|
|
243
|
-
onsessioninitialized: (sid)=>{
|
|
244
|
-
sessions.set(sid, {
|
|
245
|
-
transport,
|
|
246
|
-
createdAt: new Date(),
|
|
247
|
-
lastAccessedAt: new Date()
|
|
248
|
-
});
|
|
249
|
-
console.log(`[${new Date().toISOString()}] Session ${sid} initialized (total: ${sessions.size})`);
|
|
250
|
-
}
|
|
251
|
-
});
|
|
252
|
-
transport.onclose = ()=>{
|
|
253
|
-
if (transport.sessionId) {
|
|
254
|
-
sessions.delete(transport.sessionId);
|
|
255
|
-
console.log(`[${new Date().toISOString()}] Session ${transport.sessionId} closed (remaining: ${sessions.size})`);
|
|
256
|
-
}
|
|
257
|
-
};
|
|
258
|
-
try {
|
|
259
|
-
await this.mcpServer.connect(transport);
|
|
260
|
-
} catch (error) {
|
|
261
|
-
const message = (0, external_error_formatter_js_namespaceObject.getErrorMessage)(error);
|
|
262
|
-
console.error(`[${new Date().toISOString()}] Failed to connect MCP transport: ${message}`);
|
|
263
|
-
if (transport.sessionId) sessions.delete(transport.sessionId);
|
|
264
|
-
throw new Error(`Failed to initialize MCP session: ${message}`);
|
|
265
|
-
}
|
|
266
|
-
return {
|
|
267
|
-
transport,
|
|
268
|
-
createdAt: new Date(),
|
|
269
|
-
lastAccessedAt: new Date()
|
|
270
|
-
};
|
|
271
|
-
}
|
|
272
|
-
startSessionCleanup(sessions) {
|
|
273
|
-
return setInterval(()=>{
|
|
274
|
-
const now = Date.now();
|
|
275
|
-
for (const [sid, session] of sessions)if (now - session.lastAccessedAt.getTime() > SESSION_TIMEOUT_MS) try {
|
|
276
|
-
session.transport.close();
|
|
277
|
-
sessions.delete(sid);
|
|
278
|
-
console.log(`[${new Date().toISOString()}] Session ${sid} cleaned up due to inactivity (remaining: ${sessions.size})`);
|
|
279
|
-
} catch (error) {
|
|
280
|
-
const message = (0, external_error_formatter_js_namespaceObject.getErrorMessage)(error);
|
|
281
|
-
console.error(`[${new Date().toISOString()}] Failed to close session ${sid} during cleanup: ${message}`);
|
|
282
|
-
sessions.delete(sid);
|
|
283
|
-
}
|
|
284
|
-
}, CLEANUP_INTERVAL_MS);
|
|
285
|
-
}
|
|
286
|
-
setupHttpShutdownHandlers(server, sessions, cleanupInterval) {
|
|
287
|
-
const cleanup = ()=>{
|
|
288
|
-
console.error(`${this.config.name} shutting down...`);
|
|
289
|
-
clearInterval(cleanupInterval);
|
|
290
|
-
for (const session of sessions.values())try {
|
|
291
|
-
session.transport.close();
|
|
292
|
-
} catch (error) {
|
|
293
|
-
const message = (0, external_error_formatter_js_namespaceObject.getErrorMessage)(error);
|
|
294
|
-
console.error(`Error closing session during shutdown: ${message}`);
|
|
295
|
-
}
|
|
296
|
-
sessions.clear();
|
|
297
|
-
try {
|
|
298
|
-
server.close(()=>{
|
|
299
|
-
this.performCleanup().finally(()=>process.exit(0));
|
|
300
|
-
});
|
|
301
|
-
setTimeout(()=>{
|
|
302
|
-
console.error('Forcefully shutting down after timeout');
|
|
303
|
-
this.performCleanup().finally(()=>process.exit(1));
|
|
304
|
-
}, 5000);
|
|
305
|
-
} catch (error) {
|
|
306
|
-
const message = (0, external_error_formatter_js_namespaceObject.getErrorMessage)(error);
|
|
307
|
-
console.error(`Error closing HTTP server: ${message}`);
|
|
308
|
-
this.performCleanup().finally(()=>process.exit(1));
|
|
309
|
-
}
|
|
310
|
-
};
|
|
311
|
-
process.once('SIGINT', cleanup);
|
|
312
|
-
process.once('SIGTERM', cleanup);
|
|
313
|
-
}
|
|
314
|
-
getServer() {
|
|
315
|
-
return this.mcpServer;
|
|
316
|
-
}
|
|
317
|
-
getToolsManager() {
|
|
318
|
-
return this.toolsManager;
|
|
319
|
-
}
|
|
320
|
-
constructor(config, toolsManager){
|
|
321
|
-
_define_property(this, "mcpServer", void 0);
|
|
322
|
-
_define_property(this, "toolsManager", void 0);
|
|
323
|
-
_define_property(this, "config", void 0);
|
|
324
|
-
_define_property(this, "providedToolsManager", void 0);
|
|
325
|
-
_define_property(this, "toolDefaults", {});
|
|
326
|
-
this.config = config;
|
|
327
|
-
this.mcpServer = new mcp_js_namespaceObject.McpServer({
|
|
328
|
-
name: config.name,
|
|
329
|
-
version: config.version,
|
|
330
|
-
description: config.description
|
|
331
|
-
});
|
|
332
|
-
this.providedToolsManager = toolsManager;
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
exports.BaseMCPServer = __webpack_exports__.BaseMCPServer;
|
|
336
|
-
exports.CLI_ARGS_CONFIG = __webpack_exports__.CLI_ARGS_CONFIG;
|
|
337
|
-
exports.launchMCPServer = __webpack_exports__.launchMCPServer;
|
|
338
|
-
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
339
|
-
"BaseMCPServer",
|
|
340
|
-
"CLI_ARGS_CONFIG",
|
|
341
|
-
"launchMCPServer"
|
|
342
|
-
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
343
|
-
Object.defineProperty(exports, '__esModule', {
|
|
344
|
-
value: true
|
|
345
|
-
});
|
|
@@ -1,98 +0,0 @@
|
|
|
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
|
-
injectReportHtmlFromCore: ()=>injectReportHtmlFromCore
|
|
37
|
-
});
|
|
38
|
-
const external_node_fs_namespaceObject = require("node:fs");
|
|
39
|
-
var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
|
|
40
|
-
const external_node_path_namespaceObject = require("node:path");
|
|
41
|
-
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
42
|
-
const MAGIC_STRING = 'REPLACE_ME_WITH_REPORT_HTML';
|
|
43
|
-
const REPLACED_MARK = '/*REPORT_HTML_REPLACED*/';
|
|
44
|
-
const REG_EXP_FOR_REPLACE = /\/\*REPORT_HTML_REPLACED\*\/.*/;
|
|
45
|
-
function injectReportHtmlFromCore(packageDir) {
|
|
46
|
-
return {
|
|
47
|
-
name: 'inject-report-html-from-core',
|
|
48
|
-
setup (api) {
|
|
49
|
-
api.onAfterBuild(()=>{
|
|
50
|
-
const coreUtilsPath = external_node_path_default().resolve(packageDir, '..', 'core', 'dist', 'lib', 'utils.js');
|
|
51
|
-
if (!external_node_fs_default().existsSync(coreUtilsPath)) return void console.warn('[inject-report-html] @midscene/core dist not found, skipping');
|
|
52
|
-
const coreContent = external_node_fs_default().readFileSync(coreUtilsPath, 'utf-8');
|
|
53
|
-
if (!coreContent.includes(REPLACED_MARK)) return void console.warn('[inject-report-html] HTML not found in core dist. Ensure report builds first.');
|
|
54
|
-
const markerIndex = coreContent.indexOf(REPLACED_MARK);
|
|
55
|
-
const jsonStart = markerIndex + REPLACED_MARK.length;
|
|
56
|
-
let jsonEnd = jsonStart;
|
|
57
|
-
if ('"' === coreContent[jsonStart]) {
|
|
58
|
-
jsonEnd = jsonStart + 1;
|
|
59
|
-
while(jsonEnd < coreContent.length)if ('\\' === coreContent[jsonEnd]) jsonEnd += 2;
|
|
60
|
-
else if ('"' === coreContent[jsonEnd]) {
|
|
61
|
-
jsonEnd += 1;
|
|
62
|
-
break;
|
|
63
|
-
} else jsonEnd += 1;
|
|
64
|
-
}
|
|
65
|
-
const jsonString = coreContent.slice(jsonStart, jsonEnd);
|
|
66
|
-
if (!jsonString || jsonString.length < 10) return void console.warn('[inject-report-html] Failed to extract HTML from core');
|
|
67
|
-
const finalContent = `${REPLACED_MARK}${jsonString}`;
|
|
68
|
-
const distDir = external_node_path_default().join(packageDir, 'dist');
|
|
69
|
-
if (!external_node_fs_default().existsSync(distDir)) return;
|
|
70
|
-
const jsFiles = external_node_fs_default().readdirSync(distDir).filter((f)=>f.endsWith('.js'));
|
|
71
|
-
let injectedCount = 0;
|
|
72
|
-
for (const file of jsFiles){
|
|
73
|
-
const filePath = external_node_path_default().join(distDir, file);
|
|
74
|
-
const content = external_node_fs_default().readFileSync(filePath, 'utf-8');
|
|
75
|
-
if (content.includes(REPLACED_MARK)) {
|
|
76
|
-
if (REG_EXP_FOR_REPLACE.test(content)) {
|
|
77
|
-
external_node_fs_default().writeFileSync(filePath, content.replace(REG_EXP_FOR_REPLACE, ()=>finalContent));
|
|
78
|
-
console.log(`[inject-report-html] Updated: ${file}`);
|
|
79
|
-
injectedCount++;
|
|
80
|
-
}
|
|
81
|
-
} else if (content.includes(`'${MAGIC_STRING}'`)) {
|
|
82
|
-
external_node_fs_default().writeFileSync(filePath, content.replace(`'${MAGIC_STRING}'`, ()=>finalContent));
|
|
83
|
-
console.log(`[inject-report-html] Injected: ${file}`);
|
|
84
|
-
injectedCount++;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
if (injectedCount > 0) console.log(`[inject-report-html] Completed: ${injectedCount} file(s)`);
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
exports.injectReportHtmlFromCore = __webpack_exports__.injectReportHtmlFromCore;
|
|
93
|
-
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
94
|
-
"injectReportHtmlFromCore"
|
|
95
|
-
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
96
|
-
Object.defineProperty(exports, '__esModule', {
|
|
97
|
-
value: true
|
|
98
|
-
});
|
|
@@ -1,86 +0,0 @@
|
|
|
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
|
-
createMCPServerLauncher: ()=>createMCPServerLauncher
|
|
28
|
-
});
|
|
29
|
-
function createMCPServerLauncher(config) {
|
|
30
|
-
const { agent, platformName, ToolsManagerClass, MCPServerClass } = config;
|
|
31
|
-
function validateAgent() {
|
|
32
|
-
const device = agent.interface;
|
|
33
|
-
if (!device) throw new Error(`Agent must have an 'interface' property that references the underlying device.
|
|
34
|
-
Please ensure your agent instance is properly initialized with a device interface.
|
|
35
|
-
Expected: agent.interface to be defined, but got: ${typeof device}
|
|
36
|
-
Solution: Check that your agent constructor properly sets the interface property.`);
|
|
37
|
-
}
|
|
38
|
-
function createToolsManager() {
|
|
39
|
-
const toolsManager = new ToolsManagerClass();
|
|
40
|
-
toolsManager.agent = agent;
|
|
41
|
-
return toolsManager;
|
|
42
|
-
}
|
|
43
|
-
function logStartupInfo(mode, additionalInfo) {
|
|
44
|
-
const device = agent.interface;
|
|
45
|
-
console.log(`Starting Midscene ${platformName} MCP Server (${mode})...`);
|
|
46
|
-
console.log(`Agent: ${agent.constructor.name}`);
|
|
47
|
-
console.log(`Device: ${device.constructor.name}`);
|
|
48
|
-
if (additionalInfo?.port !== void 0) console.log(`Port: ${additionalInfo.port}`);
|
|
49
|
-
if (additionalInfo?.host) console.log(`Host: ${additionalInfo.host}`);
|
|
50
|
-
}
|
|
51
|
-
return {
|
|
52
|
-
async launch (options = {}) {
|
|
53
|
-
const { verbose = true } = options;
|
|
54
|
-
validateAgent();
|
|
55
|
-
if (verbose) logStartupInfo('stdio');
|
|
56
|
-
const toolsManager = createToolsManager();
|
|
57
|
-
const server = new MCPServerClass(toolsManager);
|
|
58
|
-
const result = await server.launch();
|
|
59
|
-
if (verbose) console.log(`${platformName} MCP Server started (stdio mode)`);
|
|
60
|
-
return result;
|
|
61
|
-
},
|
|
62
|
-
async launchHttp (options) {
|
|
63
|
-
const { port, host = 'localhost', verbose = true } = options;
|
|
64
|
-
validateAgent();
|
|
65
|
-
if (verbose) logStartupInfo('HTTP', {
|
|
66
|
-
port,
|
|
67
|
-
host
|
|
68
|
-
});
|
|
69
|
-
const toolsManager = createToolsManager();
|
|
70
|
-
const server = new MCPServerClass(toolsManager);
|
|
71
|
-
const result = await server.launchHttp({
|
|
72
|
-
port,
|
|
73
|
-
host
|
|
74
|
-
});
|
|
75
|
-
if (verbose) console.log(`${platformName} MCP Server started on http://${result.host}:${result.port}/mcp`);
|
|
76
|
-
return result;
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
exports.createMCPServerLauncher = __webpack_exports__.createMCPServerLauncher;
|
|
81
|
-
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
82
|
-
"createMCPServerLauncher"
|
|
83
|
-
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
84
|
-
Object.defineProperty(exports, '__esModule', {
|
|
85
|
-
value: true
|
|
86
|
-
});
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import type { ParseArgsConfig } from 'node:util';
|
|
2
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
-
import { type ToolDefaults } from './tool-defaults';
|
|
4
|
-
import type { IMidsceneTools } from './types';
|
|
5
|
-
export interface BaseMCPServerConfig {
|
|
6
|
-
name: string;
|
|
7
|
-
version: string;
|
|
8
|
-
description: string;
|
|
9
|
-
}
|
|
10
|
-
export interface HttpLaunchOptions {
|
|
11
|
-
port: number;
|
|
12
|
-
host?: string;
|
|
13
|
-
}
|
|
14
|
-
export interface LaunchMCPServerResult {
|
|
15
|
-
/**
|
|
16
|
-
* The MCP server port (for HTTP mode)
|
|
17
|
-
*/
|
|
18
|
-
port?: number;
|
|
19
|
-
/**
|
|
20
|
-
* The server host (for HTTP mode)
|
|
21
|
-
*/
|
|
22
|
-
host?: string;
|
|
23
|
-
/**
|
|
24
|
-
* Function to gracefully shutdown the MCP server
|
|
25
|
-
*/
|
|
26
|
-
close: () => Promise<void>;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* CLI argument configuration for MCP servers. Behavior flags (e.g.
|
|
30
|
-
* `--deep-locate`) are generated from {@link TOOL_BEHAVIOR_FLAGS}, so adding a
|
|
31
|
-
* new flag there exposes it here automatically.
|
|
32
|
-
*/
|
|
33
|
-
export declare const CLI_ARGS_CONFIG: ParseArgsConfig['options'];
|
|
34
|
-
export interface CLIArgs {
|
|
35
|
-
mode?: string;
|
|
36
|
-
port?: string;
|
|
37
|
-
host?: string;
|
|
38
|
-
/** Behavior flags such as `deep-locate` / `deep-think` (see TOOL_BEHAVIOR_FLAGS). */
|
|
39
|
-
[flag: string]: string | boolean | undefined;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Launch an MCP server based on CLI arguments
|
|
43
|
-
* Shared helper to reduce duplication across platform CLI entry points
|
|
44
|
-
*/
|
|
45
|
-
export declare function launchMCPServer(server: BaseMCPServer, args: CLIArgs): Promise<LaunchMCPServerResult>;
|
|
46
|
-
/**
|
|
47
|
-
* Base MCP Server class with programmatic launch() API
|
|
48
|
-
* Each platform extends this to provide their own tools manager
|
|
49
|
-
*/
|
|
50
|
-
export declare abstract class BaseMCPServer {
|
|
51
|
-
protected mcpServer: McpServer;
|
|
52
|
-
protected toolsManager?: IMidsceneTools;
|
|
53
|
-
protected config: BaseMCPServerConfig;
|
|
54
|
-
protected providedToolsManager?: IMidsceneTools;
|
|
55
|
-
protected toolDefaults: ToolDefaults;
|
|
56
|
-
constructor(config: BaseMCPServerConfig, toolsManager?: IMidsceneTools);
|
|
57
|
-
/**
|
|
58
|
-
* Set the default options injected into generated tool calls (e.g. forced
|
|
59
|
-
* deep locate / deep think). Must be called before `launch()` /
|
|
60
|
-
* `launchHttp()` so they are applied to the tools manager before its tools
|
|
61
|
-
* are generated. Merges with any previously set defaults.
|
|
62
|
-
*/
|
|
63
|
-
setToolDefaults(toolDefaults: ToolDefaults): void;
|
|
64
|
-
/**
|
|
65
|
-
* Platform-specific: create tools manager instance
|
|
66
|
-
* This is only called if no tools manager was provided in constructor
|
|
67
|
-
*/
|
|
68
|
-
protected abstract createToolsManager(): IMidsceneTools;
|
|
69
|
-
/**
|
|
70
|
-
* Initialize tools manager and attach to MCP server
|
|
71
|
-
*/
|
|
72
|
-
private initializeToolsManager;
|
|
73
|
-
/**
|
|
74
|
-
* Perform cleanup on shutdown
|
|
75
|
-
*/
|
|
76
|
-
private performCleanup;
|
|
77
|
-
/**
|
|
78
|
-
* Initialize and launch the MCP server with stdio transport
|
|
79
|
-
*/
|
|
80
|
-
launch(): Promise<LaunchMCPServerResult>;
|
|
81
|
-
/**
|
|
82
|
-
* Launch MCP server with HTTP transport
|
|
83
|
-
* Supports stateful sessions for web applications and service integration
|
|
84
|
-
*/
|
|
85
|
-
launchHttp(options: HttpLaunchOptions): Promise<LaunchMCPServerResult>;
|
|
86
|
-
/**
|
|
87
|
-
* Create a new HTTP session with transport
|
|
88
|
-
*/
|
|
89
|
-
private createHttpSession;
|
|
90
|
-
/**
|
|
91
|
-
* Start periodic session cleanup for inactive sessions
|
|
92
|
-
*/
|
|
93
|
-
private startSessionCleanup;
|
|
94
|
-
/**
|
|
95
|
-
* Setup shutdown handlers for HTTP server
|
|
96
|
-
*/
|
|
97
|
-
private setupHttpShutdownHandlers;
|
|
98
|
-
/**
|
|
99
|
-
* Get the underlying MCP server instance
|
|
100
|
-
*/
|
|
101
|
-
getServer(): McpServer;
|
|
102
|
-
/**
|
|
103
|
-
* Get the tools manager instance
|
|
104
|
-
*/
|
|
105
|
-
getToolsManager(): IMidsceneTools | undefined;
|
|
106
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
interface RslibPluginApi {
|
|
2
|
-
onAfterBuild: (callback: () => void) => void;
|
|
3
|
-
}
|
|
4
|
-
/**
|
|
5
|
-
* Rslib plugin to inject report HTML from @midscene/core dist into MCP bundle.
|
|
6
|
-
* This runs after build and reads the already-injected HTML from core.
|
|
7
|
-
*
|
|
8
|
-
* Prerequisites:
|
|
9
|
-
* - @midscene/report must be in devDependencies to ensure correct build order
|
|
10
|
-
* - @midscene/core dist must exist with injected HTML
|
|
11
|
-
*
|
|
12
|
-
* @param packageDir - The directory of the MCP package (use __dirname)
|
|
13
|
-
*/
|
|
14
|
-
export declare function injectReportHtmlFromCore(packageDir: string): {
|
|
15
|
-
name: string;
|
|
16
|
-
setup(api: RslibPluginApi): void;
|
|
17
|
-
};
|
|
18
|
-
export {};
|