ms-vite-plugin 1.4.47 → 1.4.49
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/build.js +1 -292
- package/dist/cli.js +6 -1234
- package/dist/mcp/device-config.d.ts +0 -47
- package/dist/mcp/device-config.js +1 -183
- package/dist/mcp/device-log.d.ts +0 -8
- package/dist/mcp/device-log.js +3 -27
- package/dist/mcp/doc-tools.d.ts +0 -7
- package/dist/mcp/doc-tools.js +2 -39
- package/dist/mcp/docs-service.d.ts +0 -13
- package/dist/mcp/docs-service.js +1 -63
- package/dist/mcp/httpapi-docs-service.d.ts +0 -31
- package/dist/mcp/httpapi-docs-service.js +1 -122
- package/dist/mcp/httpapi-tools.d.ts +0 -7
- package/dist/mcp/httpapi-tools.js +4 -222
- package/dist/mcp/image-tools.d.ts +0 -62
- package/dist/mcp/image-tools.js +8 -607
- package/dist/mcp/ocr-tools.d.ts +0 -25
- package/dist/mcp/ocr-tools.js +5 -413
- package/dist/mcp/project.d.ts +0 -14
- package/dist/mcp/project.js +1 -74
- package/dist/mcp/runtime-tools.d.ts +0 -7
- package/dist/mcp/runtime-tools.js +11 -308
- package/dist/mcp/tool-utils.d.ts +0 -40
- package/dist/mcp/tool-utils.js +1 -81
- package/dist/mcp/tools.d.ts +0 -12
- package/dist/mcp/tools.js +1 -31
- package/dist/mcp/types.d.ts +0 -12
- package/dist/mcp/types.js +1 -11
- package/dist/mcp-server.js +1 -85
- package/dist/packager.d.ts +0 -7
- package/dist/packager.js +1 -125
- package/dist/project.d.ts +0 -61
- package/dist/project.js +1 -619
- package/dist/stopGuardPlugin.d.ts +0 -6
- package/dist/stopGuardPlugin.js +1 -165
- package/dist/version.d.ts +0 -10
- package/dist/version.js +1 -63
- package/dist/ws-manager.d.ts +0 -95
- package/dist/ws-manager.js +1 -392
- package/docs/api/image.md +249 -25
- package/docs/apicn/image.md +245 -19
- package/docs/apipython/image.md +238 -18
- package/package.json +3 -2
|
@@ -1,308 +1,11 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.registerRuntimeTools = registerRuntimeTools;
|
|
37
|
-
const fsExtra = __importStar(require("fs-extra"));
|
|
38
|
-
const os = __importStar(require("os"));
|
|
39
|
-
const path = __importStar(require("path"));
|
|
40
|
-
const z = __importStar(require("zod/v4"));
|
|
41
|
-
const packager_1 = require("../packager");
|
|
42
|
-
const project_1 = require("../project");
|
|
43
|
-
const device_config_1 = require("./device-config");
|
|
44
|
-
const device_log_1 = require("./device-log");
|
|
45
|
-
const project_2 = require("./project");
|
|
46
|
-
const tool_utils_1 = require("./tool-utils");
|
|
47
|
-
/**
|
|
48
|
-
* 解析工具输出文件路径
|
|
49
|
-
* @param outputPath 用户指定的可选输出路径
|
|
50
|
-
* @param fileNamePrefix 临时文件名前缀
|
|
51
|
-
* @param extension 文件扩展名(不含点)
|
|
52
|
-
* @returns 返回最终输出文件绝对路径
|
|
53
|
-
* @example
|
|
54
|
-
* resolveOutputPath(undefined, "ms-mcp-screenshot", "jpg")
|
|
55
|
-
*/
|
|
56
|
-
function resolveOutputPath(outputPath, fileNamePrefix, extension) {
|
|
57
|
-
if (outputPath && outputPath.trim()) {
|
|
58
|
-
return path.resolve(outputPath.trim());
|
|
59
|
-
}
|
|
60
|
-
return path.join(os.tmpdir(), `${fileNamePrefix}-${Date.now()}-${Math.random()
|
|
61
|
-
.toString(36)
|
|
62
|
-
.slice(2, 8)}.${extension}`);
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* 注册设备与项目执行工具
|
|
66
|
-
* @param server MCP 服务实例
|
|
67
|
-
* @returns 无返回值
|
|
68
|
-
* @example
|
|
69
|
-
* registerRuntimeTools(server)
|
|
70
|
-
*/
|
|
71
|
-
function registerRuntimeTools(server) {
|
|
72
|
-
/**
|
|
73
|
-
* MCP 进程内当前工作目录(仅内存态,不落盘)
|
|
74
|
-
* 说明:用于同一轮 MCP 进程内复用目录,进程重启后需由 AI 再次调用 set_workspace 设置。
|
|
75
|
-
*/
|
|
76
|
-
let currentWorkspacePath;
|
|
77
|
-
/**
|
|
78
|
-
* 解析本次调用使用的工作目录
|
|
79
|
-
* 优先级:workspacePath 参数 > set_workspace 记忆值
|
|
80
|
-
* @param workspacePath 可选工作目录
|
|
81
|
-
* @returns 返回生效的绝对路径
|
|
82
|
-
* @example
|
|
83
|
-
* const workspace = resolveWorkspacePath("/Users/demo/project")
|
|
84
|
-
*/
|
|
85
|
-
function resolveWorkspacePath(workspacePath) {
|
|
86
|
-
if (workspacePath && workspacePath.trim()) {
|
|
87
|
-
currentWorkspacePath = path.resolve(workspacePath.trim());
|
|
88
|
-
return currentWorkspacePath;
|
|
89
|
-
}
|
|
90
|
-
if (currentWorkspacePath) {
|
|
91
|
-
return currentWorkspacePath;
|
|
92
|
-
}
|
|
93
|
-
throw new Error("未设置工作目录:请先调用 set_workspace,或在本次工具调用时传 workspacePath。");
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* 校验并返回有效工作目录
|
|
97
|
-
* @param workspacePath 可选工作目录
|
|
98
|
-
* @returns 返回校验通过的绝对路径
|
|
99
|
-
* @example
|
|
100
|
-
* const workspace = await ensureWorkspacePath("/Users/demo/project")
|
|
101
|
-
*/
|
|
102
|
-
async function ensureWorkspacePath(workspacePath) {
|
|
103
|
-
const workspace = resolveWorkspacePath(workspacePath);
|
|
104
|
-
await (0, project_2.ensureValidKuaiJSProject)(workspace);
|
|
105
|
-
return workspace;
|
|
106
|
-
}
|
|
107
|
-
server.registerTool("set_workspace", {
|
|
108
|
-
title: "Set Workspace",
|
|
109
|
-
description: "设置当前 MCP 进程内的默认工作目录。后续 build/run/package 优先使用该目录。",
|
|
110
|
-
inputSchema: {
|
|
111
|
-
workspacePath: z
|
|
112
|
-
.string()
|
|
113
|
-
.min(1)
|
|
114
|
-
.describe("快点JS 项目目录绝对路径(需包含 package.json 与 scripts)"),
|
|
115
|
-
},
|
|
116
|
-
}, async ({ workspacePath }) => {
|
|
117
|
-
const workspace = await ensureWorkspacePath(workspacePath);
|
|
118
|
-
return (0, tool_utils_1.createTextToolResult)(`默认工作目录已设置为: ${workspace}`);
|
|
119
|
-
});
|
|
120
|
-
server.registerTool("get_workspace", {
|
|
121
|
-
title: "Get Workspace",
|
|
122
|
-
description: "查看当前 MCP 进程内记忆的工作目录。",
|
|
123
|
-
inputSchema: {},
|
|
124
|
-
}, async () => {
|
|
125
|
-
if (!currentWorkspacePath) {
|
|
126
|
-
return (0, tool_utils_1.createTextToolResult)("当前未设置工作目录,请先调用 set_workspace。");
|
|
127
|
-
}
|
|
128
|
-
return (0, tool_utils_1.createTextToolResult)(`当前工作目录: ${currentWorkspacePath}`);
|
|
129
|
-
});
|
|
130
|
-
server.registerTool("set_device", {
|
|
131
|
-
title: "Set Device",
|
|
132
|
-
description: "设置当前唯一设备连接信息。设置后其余设备工具均复用该设备。",
|
|
133
|
-
inputSchema: {
|
|
134
|
-
ip: z.string().min(1).describe("设备 IP 地址,例如 192.168.1.100"),
|
|
135
|
-
port: z
|
|
136
|
-
.number()
|
|
137
|
-
.int()
|
|
138
|
-
.min(1)
|
|
139
|
-
.max(65535)
|
|
140
|
-
.optional()
|
|
141
|
-
.describe("设备端口,默认 9800"),
|
|
142
|
-
},
|
|
143
|
-
}, async ({ ip, port }) => {
|
|
144
|
-
const config = await (0, device_config_1.setDeviceConfig)(ip, port);
|
|
145
|
-
return (0, tool_utils_1.createTextToolResult)(`默认设备已设置为 ${config.ip}:${config.port}`);
|
|
146
|
-
});
|
|
147
|
-
server.registerTool("get_device", {
|
|
148
|
-
title: "Get Device",
|
|
149
|
-
description: "查看当前默认设备配置。",
|
|
150
|
-
inputSchema: {},
|
|
151
|
-
}, async () => {
|
|
152
|
-
const config = await (0, device_config_1.readDeviceConfig)();
|
|
153
|
-
if (!config) {
|
|
154
|
-
return (0, tool_utils_1.createTextToolResult)("当前未设置默认设备,请先调用 set_device。");
|
|
155
|
-
}
|
|
156
|
-
return (0, tool_utils_1.createTextToolResult)(`当前默认设备: ${config.ip}:${config.port}`);
|
|
157
|
-
});
|
|
158
|
-
server.registerTool("take_screenshot", {
|
|
159
|
-
title: "Take Screenshot",
|
|
160
|
-
description: "获取当前默认设备截图。可返回 base64,或落地到文件后返回文件路径(默认写入系统临时目录)。",
|
|
161
|
-
inputSchema: {
|
|
162
|
-
format: z
|
|
163
|
-
.enum(["file", "base64"])
|
|
164
|
-
.optional()
|
|
165
|
-
.default("file")
|
|
166
|
-
.describe("截图返回格式:file=文件路径,base64=图片 base64"),
|
|
167
|
-
outputPath: z
|
|
168
|
-
.string()
|
|
169
|
-
.min(1)
|
|
170
|
-
.optional()
|
|
171
|
-
.describe("当 format=file 时可指定输出路径,不传则写入系统临时目录"),
|
|
172
|
-
},
|
|
173
|
-
}, async ({ format, outputPath }) => {
|
|
174
|
-
const target = await (0, tool_utils_1.resolveRuntimeHttpTarget)();
|
|
175
|
-
const requestOptions = (0, tool_utils_1.createRuntimeHttpRequestOptions)(target);
|
|
176
|
-
if (format === "base64") {
|
|
177
|
-
const base64 = await (0, project_1.getScreenshotBase64OnDevice)(requestOptions);
|
|
178
|
-
return (0, tool_utils_1.createTextToolResult)(`截图成功: ${target.label}\nformat: base64\n${base64}`);
|
|
179
|
-
}
|
|
180
|
-
const image = await (0, project_1.getScreenshotOnDevice)(requestOptions);
|
|
181
|
-
const targetPath = resolveOutputPath(outputPath, "ms-mcp-screenshot", "jpg");
|
|
182
|
-
await fsExtra.ensureDir(path.dirname(targetPath));
|
|
183
|
-
await fsExtra.writeFile(targetPath, image);
|
|
184
|
-
return (0, tool_utils_1.createTextToolResult)(`截图成功: ${target.label}\nformat: file\npath: ${targetPath}\nsize: ${image.length} bytes`);
|
|
185
|
-
});
|
|
186
|
-
server.registerTool("get_node_source", {
|
|
187
|
-
title: "Get Node Source",
|
|
188
|
-
description: "获取当前默认设备页面节点 XML,写入文件后返回路径,避免长文本响应被截断。",
|
|
189
|
-
inputSchema: {
|
|
190
|
-
maxDepth: z
|
|
191
|
-
.number()
|
|
192
|
-
.int()
|
|
193
|
-
.min(1)
|
|
194
|
-
.max(200)
|
|
195
|
-
.optional()
|
|
196
|
-
.default(50)
|
|
197
|
-
.describe("节点树最大深度,默认 50"),
|
|
198
|
-
timeout: z
|
|
199
|
-
.number()
|
|
200
|
-
.int()
|
|
201
|
-
.min(1)
|
|
202
|
-
.max(600)
|
|
203
|
-
.optional()
|
|
204
|
-
.default(120)
|
|
205
|
-
.describe("设备端节点抓取超时秒数,默认 120"),
|
|
206
|
-
mode: z
|
|
207
|
-
.number()
|
|
208
|
-
.int()
|
|
209
|
-
.min(1)
|
|
210
|
-
.max(3)
|
|
211
|
-
.optional()
|
|
212
|
-
.default(1)
|
|
213
|
-
.describe("节点抓取模式:1、2、3,默认 1"),
|
|
214
|
-
outputPath: z
|
|
215
|
-
.string()
|
|
216
|
-
.min(1)
|
|
217
|
-
.optional()
|
|
218
|
-
.describe("可选输出文件路径,不传则写入系统临时目录"),
|
|
219
|
-
},
|
|
220
|
-
}, async ({ maxDepth, timeout, mode, outputPath }) => {
|
|
221
|
-
const target = await (0, tool_utils_1.resolveRuntimeHttpTarget)();
|
|
222
|
-
const requestOptions = (0, tool_utils_1.createRuntimeHttpRequestOptions)(target);
|
|
223
|
-
const source = await (0, project_1.getSourceOnDevice)(requestOptions, maxDepth, timeout, mode);
|
|
224
|
-
const targetPath = resolveOutputPath(outputPath, "ms-mcp-node-source", "xml");
|
|
225
|
-
await fsExtra.ensureDir(path.dirname(targetPath));
|
|
226
|
-
await fsExtra.writeFile(targetPath, source, "utf8");
|
|
227
|
-
return (0, tool_utils_1.createTextToolResult)(`节点获取成功: ${target.label}\nmaxDepth: ${maxDepth}\ntimeout: ${timeout}\nmode: ${mode}\npath: ${targetPath}\nsize: ${Buffer.byteLength(source, "utf8")} bytes`);
|
|
228
|
-
});
|
|
229
|
-
server.registerTool("get_logs", {
|
|
230
|
-
title: "Get Device Logs",
|
|
231
|
-
description: "获取当前默认设备的最新日志行。",
|
|
232
|
-
inputSchema: {
|
|
233
|
-
limit: z
|
|
234
|
-
.number()
|
|
235
|
-
.int()
|
|
236
|
-
.min(1)
|
|
237
|
-
.max(5000)
|
|
238
|
-
.optional()
|
|
239
|
-
.default(200)
|
|
240
|
-
.describe("返回最近日志条数,默认 200,最大 5000"),
|
|
241
|
-
},
|
|
242
|
-
}, async ({ limit }) => {
|
|
243
|
-
const target = await (0, tool_utils_1.resolveRuntimeHttpTarget)();
|
|
244
|
-
return (0, tool_utils_1.createTextToolResult)(await (0, device_log_1.buildDeviceLogSnapshotText)(target, limit));
|
|
245
|
-
});
|
|
246
|
-
server.registerTool("package_project", {
|
|
247
|
-
title: "Package Project",
|
|
248
|
-
description: "执行生产构建并加密,返回 enc.msbundle 路径。",
|
|
249
|
-
inputSchema: {
|
|
250
|
-
workspacePath: z
|
|
251
|
-
.string()
|
|
252
|
-
.min(1)
|
|
253
|
-
.optional()
|
|
254
|
-
.describe("可选工作目录;不传时使用 set_workspace 记忆值"),
|
|
255
|
-
},
|
|
256
|
-
}, async ({ workspacePath }) => {
|
|
257
|
-
const workspace = await ensureWorkspacePath(workspacePath);
|
|
258
|
-
const encryptedPath = await (0, packager_1.packageProject)(workspace);
|
|
259
|
-
return (0, tool_utils_1.createTextToolResult)(`打包完成: ${encryptedPath}`);
|
|
260
|
-
});
|
|
261
|
-
server.registerTool("run_project", {
|
|
262
|
-
title: "Run Project",
|
|
263
|
-
description: "构建并同步到当前默认设备后运行项目,仅使用 HTTP 设备连接。",
|
|
264
|
-
inputSchema: {
|
|
265
|
-
workspacePath: z
|
|
266
|
-
.string()
|
|
267
|
-
.min(1)
|
|
268
|
-
.optional()
|
|
269
|
-
.describe("可选工作目录;不传时使用 set_workspace 记忆值"),
|
|
270
|
-
},
|
|
271
|
-
}, async ({ workspacePath }) => {
|
|
272
|
-
const workspace = await ensureWorkspacePath(workspacePath);
|
|
273
|
-
const target = await (0, tool_utils_1.resolveRuntimeHttpTarget)();
|
|
274
|
-
await (0, project_1.runOnDevice)({
|
|
275
|
-
...(0, tool_utils_1.createRuntimeHttpRequestOptions)(target),
|
|
276
|
-
workspacePath: workspace,
|
|
277
|
-
});
|
|
278
|
-
return (0, tool_utils_1.createTextToolResult)(`运行请求已发送到 ${target.label}`);
|
|
279
|
-
});
|
|
280
|
-
server.registerTool("run_ui_project", {
|
|
281
|
-
title: "Run UI Project",
|
|
282
|
-
description: "构建并同步到当前默认设备后预览 UI,仅使用 HTTP 设备连接。",
|
|
283
|
-
inputSchema: {
|
|
284
|
-
workspacePath: z
|
|
285
|
-
.string()
|
|
286
|
-
.min(1)
|
|
287
|
-
.optional()
|
|
288
|
-
.describe("可选工作目录;不传时使用 set_workspace 记忆值"),
|
|
289
|
-
},
|
|
290
|
-
}, async ({ workspacePath }) => {
|
|
291
|
-
const workspace = await ensureWorkspacePath(workspacePath);
|
|
292
|
-
const target = await (0, tool_utils_1.resolveRuntimeHttpTarget)();
|
|
293
|
-
await (0, project_1.runUIOnDevice)({
|
|
294
|
-
...(0, tool_utils_1.createRuntimeHttpRequestOptions)(target),
|
|
295
|
-
workspacePath: workspace,
|
|
296
|
-
});
|
|
297
|
-
return (0, tool_utils_1.createTextToolResult)(`UI 预览请求已发送到 ${target.label}`);
|
|
298
|
-
});
|
|
299
|
-
server.registerTool("stop_project", {
|
|
300
|
-
title: "Stop Project",
|
|
301
|
-
description: "停止当前默认设备上的项目,仅使用 HTTP 设备连接。",
|
|
302
|
-
inputSchema: {},
|
|
303
|
-
}, async () => {
|
|
304
|
-
const target = await (0, tool_utils_1.resolveRuntimeHttpTarget)();
|
|
305
|
-
await (0, project_1.stopOnDevice)((0, tool_utils_1.createRuntimeHttpRequestOptions)(target));
|
|
306
|
-
return (0, tool_utils_1.createTextToolResult)(`停止请求已发送到 ${target.label}`);
|
|
307
|
-
});
|
|
308
|
-
}
|
|
1
|
+
"use strict";var _=exports&&exports.__createBinding||(Object.create?(function(r,t,o,n){n===void 0&&(n=o);var e=Object.getOwnPropertyDescriptor(t,o);(!e||("get"in e?!t.__esModule:e.writable||e.configurable))&&(e={enumerable:!0,get:function(){return t[o]}}),Object.defineProperty(r,n,e)}):(function(r,t,o,n){n===void 0&&(n=o),r[n]=t[o]})),R=exports&&exports.__setModuleDefault||(Object.create?(function(r,t){Object.defineProperty(r,"default",{enumerable:!0,value:t})}):function(r,t){r.default=t}),d=exports&&exports.__importStar||(function(){var r=function(t){return r=Object.getOwnPropertyNames||function(o){var n=[];for(var e in o)Object.prototype.hasOwnProperty.call(o,e)&&(n[n.length]=e);return n},r(t)};return function(t){if(t&&t.__esModule)return t;var o={};if(t!=null)for(var n=r(t),e=0;e<n.length;e++)n[e]!=="default"&&_(o,t,n[e]);return R(o,t),o}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.registerRuntimeTools=$;const T=d(require("fs-extra")),P=d(require("os")),g=d(require("path")),s=d(require("zod/v4")),v=require("../packager"),u=require("../project"),b=require("./device-config"),O=require("./device-log"),S=require("./project"),i=require("./tool-utils");function h(r,t,o){return r&&r.trim()?g.resolve(r.trim()):g.join(P.tmpdir(),`${t}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.${o}`)}function $(r){let t;function o(e){if(e&&e.trim())return t=g.resolve(e.trim()),t;if(t)return t;throw new Error("\u672A\u8BBE\u7F6E\u5DE5\u4F5C\u76EE\u5F55\uFF1A\u8BF7\u5148\u8C03\u7528 set_workspace\uFF0C\u6216\u5728\u672C\u6B21\u5DE5\u5177\u8C03\u7528\u65F6\u4F20 workspacePath\u3002")}async function n(e){const a=o(e);return await(0,S.ensureValidKuaiJSProject)(a),a}r.registerTool("set_workspace",{title:"Set Workspace",description:"\u8BBE\u7F6E\u5F53\u524D MCP \u8FDB\u7A0B\u5185\u7684\u9ED8\u8BA4\u5DE5\u4F5C\u76EE\u5F55\u3002\u540E\u7EED build/run/package \u4F18\u5148\u4F7F\u7528\u8BE5\u76EE\u5F55\u3002",inputSchema:{workspacePath:s.string().min(1).describe("\u5FEB\u70B9JS \u9879\u76EE\u76EE\u5F55\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u9700\u5305\u542B package.json \u4E0E scripts\uFF09")}},async({workspacePath:e})=>{const a=await n(e);return(0,i.createTextToolResult)(`\u9ED8\u8BA4\u5DE5\u4F5C\u76EE\u5F55\u5DF2\u8BBE\u7F6E\u4E3A: ${a}`)}),r.registerTool("get_workspace",{title:"Get Workspace",description:"\u67E5\u770B\u5F53\u524D MCP \u8FDB\u7A0B\u5185\u8BB0\u5FC6\u7684\u5DE5\u4F5C\u76EE\u5F55\u3002",inputSchema:{}},async()=>t?(0,i.createTextToolResult)(`\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55: ${t}`):(0,i.createTextToolResult)("\u5F53\u524D\u672A\u8BBE\u7F6E\u5DE5\u4F5C\u76EE\u5F55\uFF0C\u8BF7\u5148\u8C03\u7528 set_workspace\u3002")),r.registerTool("set_device",{title:"Set Device",description:"\u8BBE\u7F6E\u5F53\u524D\u552F\u4E00\u8BBE\u5907\u8FDE\u63A5\u4FE1\u606F\u3002\u8BBE\u7F6E\u540E\u5176\u4F59\u8BBE\u5907\u5DE5\u5177\u5747\u590D\u7528\u8BE5\u8BBE\u5907\u3002",inputSchema:{ip:s.string().min(1).describe("\u8BBE\u5907 IP \u5730\u5740\uFF0C\u4F8B\u5982 192.168.1.100"),port:s.number().int().min(1).max(65535).optional().describe("\u8BBE\u5907\u7AEF\u53E3\uFF0C\u9ED8\u8BA4 9800")}},async({ip:e,port:a})=>{const c=await(0,b.setDeviceConfig)(e,a);return(0,i.createTextToolResult)(`\u9ED8\u8BA4\u8BBE\u5907\u5DF2\u8BBE\u7F6E\u4E3A ${c.ip}:${c.port}`)}),r.registerTool("get_device",{title:"Get Device",description:"\u67E5\u770B\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u914D\u7F6E\u3002",inputSchema:{}},async()=>{const e=await(0,b.readDeviceConfig)();return e?(0,i.createTextToolResult)(`\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907: ${e.ip}:${e.port}`):(0,i.createTextToolResult)("\u5F53\u524D\u672A\u8BBE\u7F6E\u9ED8\u8BA4\u8BBE\u5907\uFF0C\u8BF7\u5148\u8C03\u7528 set_device\u3002")}),r.registerTool("take_screenshot",{title:"Take Screenshot",description:"\u83B7\u53D6\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u622A\u56FE\u3002\u53EF\u8FD4\u56DE base64\uFF0C\u6216\u843D\u5730\u5230\u6587\u4EF6\u540E\u8FD4\u56DE\u6587\u4EF6\u8DEF\u5F84\uFF08\u9ED8\u8BA4\u5199\u5165\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55\uFF09\u3002",inputSchema:{format:s.enum(["file","base64"]).optional().default("file").describe("\u622A\u56FE\u8FD4\u56DE\u683C\u5F0F\uFF1Afile=\u6587\u4EF6\u8DEF\u5F84\uFF0Cbase64=\u56FE\u7247 base64"),outputPath:s.string().min(1).optional().describe("\u5F53 format=file \u65F6\u53EF\u6307\u5B9A\u8F93\u51FA\u8DEF\u5F84\uFF0C\u4E0D\u4F20\u5219\u5199\u5165\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55")}},async({format:e,outputPath:a})=>{const c=await(0,i.resolveRuntimeHttpTarget)(),m=(0,i.createRuntimeHttpRequestOptions)(c);if(e==="base64"){const f=await(0,u.getScreenshotBase64OnDevice)(m);return(0,i.createTextToolResult)(`\u622A\u56FE\u6210\u529F: ${c.label}
|
|
2
|
+
format: base64
|
|
3
|
+
${f}`)}const l=await(0,u.getScreenshotOnDevice)(m),p=h(a,"ms-mcp-screenshot","jpg");return await T.ensureDir(g.dirname(p)),await T.writeFile(p,l),(0,i.createTextToolResult)(`\u622A\u56FE\u6210\u529F: ${c.label}
|
|
4
|
+
format: file
|
|
5
|
+
path: ${p}
|
|
6
|
+
size: ${l.length} bytes`)}),r.registerTool("get_node_source",{title:"Get Node Source",description:"\u83B7\u53D6\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u9875\u9762\u8282\u70B9 XML\uFF0C\u5199\u5165\u6587\u4EF6\u540E\u8FD4\u56DE\u8DEF\u5F84\uFF0C\u907F\u514D\u957F\u6587\u672C\u54CD\u5E94\u88AB\u622A\u65AD\u3002",inputSchema:{maxDepth:s.number().int().min(1).max(200).optional().default(50).describe("\u8282\u70B9\u6811\u6700\u5927\u6DF1\u5EA6\uFF0C\u9ED8\u8BA4 50"),timeout:s.number().int().min(1).max(600).optional().default(120).describe("\u8BBE\u5907\u7AEF\u8282\u70B9\u6293\u53D6\u8D85\u65F6\u79D2\u6570\uFF0C\u9ED8\u8BA4 120"),mode:s.number().int().min(1).max(3).optional().default(1).describe("\u8282\u70B9\u6293\u53D6\u6A21\u5F0F\uFF1A1\u30012\u30013\uFF0C\u9ED8\u8BA4 1"),outputPath:s.string().min(1).optional().describe("\u53EF\u9009\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF0C\u4E0D\u4F20\u5219\u5199\u5165\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55")}},async({maxDepth:e,timeout:a,mode:c,outputPath:m})=>{const l=await(0,i.resolveRuntimeHttpTarget)(),p=(0,i.createRuntimeHttpRequestOptions)(l),f=await(0,u.getSourceOnDevice)(p,e,a,c),w=h(m,"ms-mcp-node-source","xml");return await T.ensureDir(g.dirname(w)),await T.writeFile(w,f,"utf8"),(0,i.createTextToolResult)(`\u8282\u70B9\u83B7\u53D6\u6210\u529F: ${l.label}
|
|
7
|
+
maxDepth: ${e}
|
|
8
|
+
timeout: ${a}
|
|
9
|
+
mode: ${c}
|
|
10
|
+
path: ${w}
|
|
11
|
+
size: ${Buffer.byteLength(f,"utf8")} bytes`)}),r.registerTool("get_logs",{title:"Get Device Logs",description:"\u83B7\u53D6\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u7684\u6700\u65B0\u65E5\u5FD7\u884C\u3002",inputSchema:{limit:s.number().int().min(1).max(5e3).optional().default(200).describe("\u8FD4\u56DE\u6700\u8FD1\u65E5\u5FD7\u6761\u6570\uFF0C\u9ED8\u8BA4 200\uFF0C\u6700\u5927 5000")}},async({limit:e})=>{const a=await(0,i.resolveRuntimeHttpTarget)();return(0,i.createTextToolResult)(await(0,O.buildDeviceLogSnapshotText)(a,e))}),r.registerTool("package_project",{title:"Package Project",description:"\u6267\u884C\u751F\u4EA7\u6784\u5EFA\u5E76\u52A0\u5BC6\uFF0C\u8FD4\u56DE enc.msbundle \u8DEF\u5F84\u3002",inputSchema:{workspacePath:s.string().min(1).optional().describe("\u53EF\u9009\u5DE5\u4F5C\u76EE\u5F55\uFF1B\u4E0D\u4F20\u65F6\u4F7F\u7528 set_workspace \u8BB0\u5FC6\u503C")}},async({workspacePath:e})=>{const a=await n(e),c=await(0,v.packageProject)(a);return(0,i.createTextToolResult)(`\u6253\u5305\u5B8C\u6210: ${c}`)}),r.registerTool("run_project",{title:"Run Project",description:"\u6784\u5EFA\u5E76\u540C\u6B65\u5230\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u540E\u8FD0\u884C\u9879\u76EE\uFF0C\u4EC5\u4F7F\u7528 HTTP \u8BBE\u5907\u8FDE\u63A5\u3002",inputSchema:{workspacePath:s.string().min(1).optional().describe("\u53EF\u9009\u5DE5\u4F5C\u76EE\u5F55\uFF1B\u4E0D\u4F20\u65F6\u4F7F\u7528 set_workspace \u8BB0\u5FC6\u503C")}},async({workspacePath:e})=>{const a=await n(e),c=await(0,i.resolveRuntimeHttpTarget)();return await(0,u.runOnDevice)({...(0,i.createRuntimeHttpRequestOptions)(c),workspacePath:a}),(0,i.createTextToolResult)(`\u8FD0\u884C\u8BF7\u6C42\u5DF2\u53D1\u9001\u5230 ${c.label}`)}),r.registerTool("run_ui_project",{title:"Run UI Project",description:"\u6784\u5EFA\u5E76\u540C\u6B65\u5230\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u540E\u9884\u89C8 UI\uFF0C\u4EC5\u4F7F\u7528 HTTP \u8BBE\u5907\u8FDE\u63A5\u3002",inputSchema:{workspacePath:s.string().min(1).optional().describe("\u53EF\u9009\u5DE5\u4F5C\u76EE\u5F55\uFF1B\u4E0D\u4F20\u65F6\u4F7F\u7528 set_workspace \u8BB0\u5FC6\u503C")}},async({workspacePath:e})=>{const a=await n(e),c=await(0,i.resolveRuntimeHttpTarget)();return await(0,u.runUIOnDevice)({...(0,i.createRuntimeHttpRequestOptions)(c),workspacePath:a}),(0,i.createTextToolResult)(`UI \u9884\u89C8\u8BF7\u6C42\u5DF2\u53D1\u9001\u5230 ${c.label}`)}),r.registerTool("stop_project",{title:"Stop Project",description:"\u505C\u6B62\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u4E0A\u7684\u9879\u76EE\uFF0C\u4EC5\u4F7F\u7528 HTTP \u8BBE\u5907\u8FDE\u63A5\u3002",inputSchema:{}},async()=>{const e=await(0,i.resolveRuntimeHttpTarget)();return await(0,u.stopOnDevice)((0,i.createRuntimeHttpRequestOptions)(e)),(0,i.createTextToolResult)(`\u505C\u6B62\u8BF7\u6C42\u5DF2\u53D1\u9001\u5230 ${e.label}`)})}
|
package/dist/mcp/tool-utils.d.ts
CHANGED
|
@@ -1,62 +1,22 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP 文本响应内容结构
|
|
3
|
-
*/
|
|
4
1
|
export type TextContent = {
|
|
5
2
|
type: "text";
|
|
6
3
|
text: string;
|
|
7
4
|
};
|
|
8
|
-
/**
|
|
9
|
-
* 通用文本工具返回值结构
|
|
10
|
-
*/
|
|
11
5
|
export type TextToolResult = {
|
|
12
6
|
content: TextContent[];
|
|
13
7
|
isError?: boolean;
|
|
14
8
|
};
|
|
15
|
-
/**
|
|
16
|
-
* HTTP 设备目标信息
|
|
17
|
-
*/
|
|
18
9
|
export type RuntimeHttpTarget = {
|
|
19
10
|
ip: string;
|
|
20
11
|
port: string;
|
|
21
12
|
label: string;
|
|
22
13
|
};
|
|
23
|
-
/**
|
|
24
|
-
* 查询参数允许的基础值类型
|
|
25
|
-
*/
|
|
26
14
|
export type RuntimeQueryValue = string | number | boolean | null | undefined;
|
|
27
|
-
/**
|
|
28
|
-
* 创建标准 MCP 文本工具返回值
|
|
29
|
-
* @param text 返回文本
|
|
30
|
-
* @param isError 是否标记为错误响应
|
|
31
|
-
* @returns 返回包含单条文本内容的 MCP Tool 结果
|
|
32
|
-
* @example
|
|
33
|
-
* createTextToolResult("done")
|
|
34
|
-
*/
|
|
35
15
|
export declare function createTextToolResult(text: string, isError?: boolean): TextToolResult;
|
|
36
|
-
/**
|
|
37
|
-
* 构建运行时 HTTP 请求参数
|
|
38
|
-
* @param target 已解析的设备目标
|
|
39
|
-
* @returns 返回项目内部设备请求参数
|
|
40
|
-
* @example
|
|
41
|
-
* const options = createRuntimeHttpRequestOptions(target)
|
|
42
|
-
*/
|
|
43
16
|
export declare function createRuntimeHttpRequestOptions(target: RuntimeHttpTarget): {
|
|
44
17
|
ip: string;
|
|
45
18
|
port: string;
|
|
46
19
|
transport: "http";
|
|
47
20
|
};
|
|
48
|
-
/**
|
|
49
|
-
* 解析当前默认 HTTP 设备
|
|
50
|
-
* @returns 返回标准化后的 HTTP 请求目标
|
|
51
|
-
* @example
|
|
52
|
-
* const target = await resolveRuntimeHttpTarget()
|
|
53
|
-
*/
|
|
54
21
|
export declare function resolveRuntimeHttpTarget(): Promise<RuntimeHttpTarget>;
|
|
55
|
-
/**
|
|
56
|
-
* 将任意 JSON 兼容值格式化为文本
|
|
57
|
-
* @param value 任意待展示值
|
|
58
|
-
* @returns 返回便于 MCP 文本输出的内容
|
|
59
|
-
* @example
|
|
60
|
-
* formatRuntimeJsonText({ success: true })
|
|
61
|
-
*/
|
|
62
22
|
export declare function formatRuntimeJsonText(value: unknown): string;
|
package/dist/mcp/tool-utils.js
CHANGED
|
@@ -1,81 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createTextToolResult = createTextToolResult;
|
|
4
|
-
exports.createRuntimeHttpRequestOptions = createRuntimeHttpRequestOptions;
|
|
5
|
-
exports.resolveRuntimeHttpTarget = resolveRuntimeHttpTarget;
|
|
6
|
-
exports.formatRuntimeJsonText = formatRuntimeJsonText;
|
|
7
|
-
const device_config_1 = require("./device-config");
|
|
8
|
-
/**
|
|
9
|
-
* 创建标准 MCP 文本内容对象
|
|
10
|
-
* @param text 返回文本
|
|
11
|
-
* @returns 返回 `{ type: "text", text }` 结构
|
|
12
|
-
* @example
|
|
13
|
-
* createTextContent("ok")
|
|
14
|
-
*/
|
|
15
|
-
function createTextContent(text) {
|
|
16
|
-
return {
|
|
17
|
-
type: "text",
|
|
18
|
-
text,
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* 创建标准 MCP 文本工具返回值
|
|
23
|
-
* @param text 返回文本
|
|
24
|
-
* @param isError 是否标记为错误响应
|
|
25
|
-
* @returns 返回包含单条文本内容的 MCP Tool 结果
|
|
26
|
-
* @example
|
|
27
|
-
* createTextToolResult("done")
|
|
28
|
-
*/
|
|
29
|
-
function createTextToolResult(text, isError = false) {
|
|
30
|
-
return {
|
|
31
|
-
content: [createTextContent(text)],
|
|
32
|
-
...(isError ? { isError: true } : {}),
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* 构建运行时 HTTP 请求参数
|
|
37
|
-
* @param target 已解析的设备目标
|
|
38
|
-
* @returns 返回项目内部设备请求参数
|
|
39
|
-
* @example
|
|
40
|
-
* const options = createRuntimeHttpRequestOptions(target)
|
|
41
|
-
*/
|
|
42
|
-
function createRuntimeHttpRequestOptions(target) {
|
|
43
|
-
return {
|
|
44
|
-
ip: target.ip,
|
|
45
|
-
port: target.port,
|
|
46
|
-
transport: "http",
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* 解析当前默认 HTTP 设备
|
|
51
|
-
* @returns 返回标准化后的 HTTP 请求目标
|
|
52
|
-
* @example
|
|
53
|
-
* const target = await resolveRuntimeHttpTarget()
|
|
54
|
-
*/
|
|
55
|
-
async function resolveRuntimeHttpTarget() {
|
|
56
|
-
let device;
|
|
57
|
-
try {
|
|
58
|
-
device = await (0, device_config_1.resolveDeviceConfig)();
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
throw new Error("未设置设备:请先调用 set_device。");
|
|
62
|
-
}
|
|
63
|
-
return {
|
|
64
|
-
ip: device.ip,
|
|
65
|
-
port: (0, device_config_1.normalizePort)(device.port),
|
|
66
|
-
label: `${device.ip}:${device.port}`,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* 将任意 JSON 兼容值格式化为文本
|
|
71
|
-
* @param value 任意待展示值
|
|
72
|
-
* @returns 返回便于 MCP 文本输出的内容
|
|
73
|
-
* @example
|
|
74
|
-
* formatRuntimeJsonText({ success: true })
|
|
75
|
-
*/
|
|
76
|
-
function formatRuntimeJsonText(value) {
|
|
77
|
-
if (typeof value === "string") {
|
|
78
|
-
return value;
|
|
79
|
-
}
|
|
80
|
-
return JSON.stringify(value, null, 2);
|
|
81
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.createTextToolResult=o,exports.createRuntimeHttpRequestOptions=i,exports.resolveRuntimeHttpTarget=u,exports.formatRuntimeJsonText=c;const e=require("./device-config");function n(t){return{type:"text",text:t}}function o(t,r=!1){return{content:[n(t)],...r?{isError:!0}:{}}}function i(t){return{ip:t.ip,port:t.port,transport:"http"}}async function u(){let t;try{t=await(0,e.resolveDeviceConfig)()}catch{throw new Error("\u672A\u8BBE\u7F6E\u8BBE\u5907\uFF1A\u8BF7\u5148\u8C03\u7528 set_device\u3002")}return{ip:t.ip,port:(0,e.normalizePort)(t.port),label:`${t.ip}:${t.port}`}}function c(t){return typeof t=="string"?t:JSON.stringify(t,null,2)}
|
package/dist/mcp/tools.d.ts
CHANGED
|
@@ -1,18 +1,6 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { DEFAULT_DEVICE_PORT } from "./device-config";
|
|
3
3
|
import type { ApiDocsLanguage } from "./types";
|
|
4
|
-
/**
|
|
5
|
-
* 创建并注册 MCP 工具
|
|
6
|
-
* @returns 返回已注册工具的 MCP Server 实例
|
|
7
|
-
* @example
|
|
8
|
-
* const server = createMcpServer()
|
|
9
|
-
*/
|
|
10
4
|
export declare function createMcpServer(): McpServer;
|
|
11
|
-
/**
|
|
12
|
-
* 文档语言联合类型导出,便于其他模块复用
|
|
13
|
-
*/
|
|
14
5
|
export type { ApiDocsLanguage };
|
|
15
|
-
/**
|
|
16
|
-
* 默认设备端口导出,便于外部引用
|
|
17
|
-
*/
|
|
18
6
|
export { DEFAULT_DEVICE_PORT };
|
package/dist/mcp/tools.js
CHANGED
|
@@ -1,31 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DEFAULT_DEVICE_PORT = void 0;
|
|
4
|
-
exports.createMcpServer = createMcpServer;
|
|
5
|
-
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
6
|
-
const version_1 = require("../version");
|
|
7
|
-
const device_config_1 = require("./device-config");
|
|
8
|
-
Object.defineProperty(exports, "DEFAULT_DEVICE_PORT", { enumerable: true, get: function () { return device_config_1.DEFAULT_DEVICE_PORT; } });
|
|
9
|
-
const doc_tools_1 = require("./doc-tools");
|
|
10
|
-
const httpapi_tools_1 = require("./httpapi-tools");
|
|
11
|
-
const image_tools_1 = require("./image-tools");
|
|
12
|
-
const ocr_tools_1 = require("./ocr-tools");
|
|
13
|
-
const runtime_tools_1 = require("./runtime-tools");
|
|
14
|
-
/**
|
|
15
|
-
* 创建并注册 MCP 工具
|
|
16
|
-
* @returns 返回已注册工具的 MCP Server 实例
|
|
17
|
-
* @example
|
|
18
|
-
* const server = createMcpServer()
|
|
19
|
-
*/
|
|
20
|
-
function createMcpServer() {
|
|
21
|
-
const server = new mcp_js_1.McpServer({
|
|
22
|
-
name: "ms-vite-plugin-mcp",
|
|
23
|
-
version: version_1.PACKAGE_VERSION,
|
|
24
|
-
});
|
|
25
|
-
(0, doc_tools_1.registerDocTools)(server);
|
|
26
|
-
(0, httpapi_tools_1.registerHttpApiTools)(server);
|
|
27
|
-
(0, image_tools_1.registerImageTools)(server);
|
|
28
|
-
(0, ocr_tools_1.registerOcrTools)(server);
|
|
29
|
-
(0, runtime_tools_1.registerRuntimeTools)(server);
|
|
30
|
-
return server;
|
|
31
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.DEFAULT_DEVICE_PORT=void 0,exports.createMcpServer=u;const r=require("@modelcontextprotocol/sdk/server/mcp.js"),o=require("../version"),t=require("./device-config");Object.defineProperty(exports,"DEFAULT_DEVICE_PORT",{enumerable:!0,get:function(){return t.DEFAULT_DEVICE_PORT}});const s=require("./doc-tools"),i=require("./httpapi-tools"),c=require("./image-tools"),n=require("./ocr-tools"),_=require("./runtime-tools");function u(){const e=new r.McpServer({name:"ms-vite-plugin-mcp",version:o.PACKAGE_VERSION});return(0,s.registerDocTools)(e),(0,i.registerHttpApiTools)(e),(0,c.registerImageTools)(e),(0,n.registerOcrTools)(e),(0,_.registerRuntimeTools)(e),e}
|
package/dist/mcp/types.d.ts
CHANGED
|
@@ -1,19 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 设备连接配置结构
|
|
3
|
-
*/
|
|
4
1
|
export type DeviceConfig = {
|
|
5
|
-
/** 设备 IP 地址 */
|
|
6
2
|
ip: string;
|
|
7
|
-
/** 设备端口 */
|
|
8
3
|
port: number;
|
|
9
|
-
/** 最近更新时间戳(毫秒) */
|
|
10
4
|
updatedAt: number;
|
|
11
5
|
};
|
|
12
|
-
/**
|
|
13
|
-
* 文档语言类型
|
|
14
|
-
*/
|
|
15
6
|
export type ApiDocsLanguage = "js" | "js_zh" | "python";
|
|
16
|
-
/**
|
|
17
|
-
* 文档语言显示名映射
|
|
18
|
-
*/
|
|
19
7
|
export declare const DOC_LANGUAGE_LABELS: Record<ApiDocsLanguage, string>;
|
package/dist/mcp/types.js
CHANGED
|
@@ -1,11 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DOC_LANGUAGE_LABELS = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* 文档语言显示名映射
|
|
6
|
-
*/
|
|
7
|
-
exports.DOC_LANGUAGE_LABELS = {
|
|
8
|
-
js: "JavaScript",
|
|
9
|
-
js_zh: "JavaScript (中文)",
|
|
10
|
-
python: "Python",
|
|
11
|
-
};
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.DOC_LANGUAGE_LABELS=void 0,exports.DOC_LANGUAGE_LABELS={js:"JavaScript",js_zh:"JavaScript (\u4E2D\u6587)",python:"Python"};
|
package/dist/mcp-server.js
CHANGED
|
@@ -1,86 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
-
if (k2 === undefined) k2 = k;
|
|
5
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
-
}
|
|
9
|
-
Object.defineProperty(o, k2, desc);
|
|
10
|
-
}) : (function(o, m, k, k2) {
|
|
11
|
-
if (k2 === undefined) k2 = k;
|
|
12
|
-
o[k2] = m[k];
|
|
13
|
-
}));
|
|
14
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
-
}) : function(o, v) {
|
|
17
|
-
o["default"] = v;
|
|
18
|
-
});
|
|
19
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
-
var ownKeys = function(o) {
|
|
21
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
-
var ar = [];
|
|
23
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
-
return ar;
|
|
25
|
-
};
|
|
26
|
-
return ownKeys(o);
|
|
27
|
-
};
|
|
28
|
-
return function (mod) {
|
|
29
|
-
if (mod && mod.__esModule) return mod;
|
|
30
|
-
var result = {};
|
|
31
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
-
__setModuleDefault(result, mod);
|
|
33
|
-
return result;
|
|
34
|
-
};
|
|
35
|
-
})();
|
|
36
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
-
const fsExtra = __importStar(require("fs-extra"));
|
|
38
|
-
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
39
|
-
const tools_1 = require("./mcp/tools");
|
|
40
|
-
const device_config_1 = require("./mcp/device-config");
|
|
41
|
-
/**
|
|
42
|
-
* 启动 MCP 服务(stdio)
|
|
43
|
-
* @returns 启动成功后常驻运行
|
|
44
|
-
* @example
|
|
45
|
-
* await main()
|
|
46
|
-
*/
|
|
47
|
-
async function main() {
|
|
48
|
-
const server = (0, tools_1.createMcpServer)();
|
|
49
|
-
const transport = new stdio_js_1.StdioServerTransport();
|
|
50
|
-
/**
|
|
51
|
-
* 进程退出时清理当前实例的临时配置文件,避免系统临时目录残留
|
|
52
|
-
* 注意:只清理“当前进程文件”,不会影响其他并发窗口实例
|
|
53
|
-
*/
|
|
54
|
-
const cleanupConfigFile = async () => {
|
|
55
|
-
try {
|
|
56
|
-
await fsExtra.remove(device_config_1.DEVICE_CONFIG_FILE);
|
|
57
|
-
}
|
|
58
|
-
catch {
|
|
59
|
-
// 忽略清理错误,避免影响主流程退出
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
process.once("SIGINT", () => {
|
|
63
|
-
cleanupConfigFile()
|
|
64
|
-
.catch(() => undefined)
|
|
65
|
-
.finally(() => process.exit(0));
|
|
66
|
-
});
|
|
67
|
-
process.once("SIGTERM", () => {
|
|
68
|
-
cleanupConfigFile()
|
|
69
|
-
.catch(() => undefined)
|
|
70
|
-
.finally(() => process.exit(0));
|
|
71
|
-
});
|
|
72
|
-
process.once("exit", () => {
|
|
73
|
-
try {
|
|
74
|
-
fsExtra.removeSync(device_config_1.DEVICE_CONFIG_FILE);
|
|
75
|
-
}
|
|
76
|
-
catch {
|
|
77
|
-
// ignore
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
await server.connect(transport);
|
|
81
|
-
}
|
|
82
|
-
main().catch((error) => {
|
|
83
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
84
|
-
console.error(`MCP 服务启动失败: ${message}`);
|
|
85
|
-
process.exit(1);
|
|
86
|
-
});
|
|
2
|
+
"use strict";var o=exports&&exports.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var c=Object.getOwnPropertyDescriptor(e,n);(!c||("get"in c?!e.__esModule:c.writable||c.configurable))&&(c={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,c)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),s=exports&&exports.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),u=exports&&exports.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var c in n)Object.prototype.hasOwnProperty.call(n,c)&&(r[r.length]=c);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),c=0;c<r.length;c++)r[c]!=="default"&&o(n,e,r[c]);return s(n,e),n}})();Object.defineProperty(exports,"__esModule",{value:!0});const i=u(require("fs-extra")),f=require("@modelcontextprotocol/sdk/server/stdio.js"),l=require("./mcp/tools"),a=require("./mcp/device-config");async function _(){const t=(0,l.createMcpServer)(),e=new f.StdioServerTransport,n=async()=>{try{await i.remove(a.DEVICE_CONFIG_FILE)}catch{}};process.once("SIGINT",()=>{n().catch(()=>{}).finally(()=>process.exit(0))}),process.once("SIGTERM",()=>{n().catch(()=>{}).finally(()=>process.exit(0))}),process.once("exit",()=>{try{i.removeSync(a.DEVICE_CONFIG_FILE)}catch{}}),await t.connect(e)}_().catch(t=>{const e=t instanceof Error?t.message:String(t);console.error(`MCP \u670D\u52A1\u542F\u52A8\u5931\u8D25: ${e}`),process.exit(1)});
|
package/dist/packager.d.ts
CHANGED
|
@@ -1,8 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 执行 package 流程(生产构建 + bundle 加密)
|
|
3
|
-
* @param workspacePath 当前工作目录(项目根目录)
|
|
4
|
-
* @returns 返回加密产物 enc.msbundle 的绝对路径
|
|
5
|
-
* @example
|
|
6
|
-
* const output = await packageProject(process.cwd())
|
|
7
|
-
*/
|
|
8
1
|
export declare function packageProject(workspacePath: string): Promise<string>;
|