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,55 +1,8 @@
|
|
|
1
1
|
import type { DeviceConfig } from "./types";
|
|
2
|
-
/**
|
|
3
|
-
* 默认设备端口
|
|
4
|
-
*/
|
|
5
2
|
export declare const DEFAULT_DEVICE_PORT = 9800;
|
|
6
|
-
/**
|
|
7
|
-
* 设备连接配置持久化文件
|
|
8
|
-
* - 使用系统临时目录,避免污染项目源码目录
|
|
9
|
-
* - 文件名包含 pid/时间戳/随机串,确保并发窗口与多次启动互不冲突
|
|
10
|
-
*/
|
|
11
3
|
export declare const DEVICE_CONFIG_FILE: string;
|
|
12
|
-
/**
|
|
13
|
-
* 将端口标准化为字符串(内部沿用 DeviceCliOptions 字符串端口)
|
|
14
|
-
* @param port 端口号
|
|
15
|
-
* @returns 返回标准端口字符串
|
|
16
|
-
* @example
|
|
17
|
-
* const textPort = normalizePort(9800)
|
|
18
|
-
*/
|
|
19
4
|
export declare function normalizePort(port: number): string;
|
|
20
|
-
/**
|
|
21
|
-
* 读取已保存的设备配置
|
|
22
|
-
* @returns 若存在有效配置则返回配置对象,否则返回 null
|
|
23
|
-
* @example
|
|
24
|
-
* const cfg = await readDeviceConfig()
|
|
25
|
-
*/
|
|
26
5
|
export declare function readDeviceConfig(): Promise<DeviceConfig | null>;
|
|
27
|
-
/**
|
|
28
|
-
* 保存设备配置
|
|
29
|
-
* @param config 需要保存的设备配置
|
|
30
|
-
* @returns 保存完成后返回 Promise<void>
|
|
31
|
-
* @example
|
|
32
|
-
* await writeDeviceConfig({ ip: "192.168.1.100", port: 9800, updatedAt: Date.now() })
|
|
33
|
-
*/
|
|
34
6
|
export declare function writeDeviceConfig(config: DeviceConfig): Promise<void>;
|
|
35
|
-
/**
|
|
36
|
-
* 构建并保存设备配置
|
|
37
|
-
* @param ip 设备 IP
|
|
38
|
-
* @param port 设备端口(可选)
|
|
39
|
-
* @returns 返回保存后的设备配置
|
|
40
|
-
* @example
|
|
41
|
-
* const cfg = await setDeviceConfig("192.168.1.100", 9800)
|
|
42
|
-
*/
|
|
43
7
|
export declare function setDeviceConfig(ip: string, port?: number): Promise<DeviceConfig>;
|
|
44
|
-
/**
|
|
45
|
-
* 获取最终生效的设备配置
|
|
46
|
-
* - 若调用参数携带 ip,则优先使用调用参数并落盘
|
|
47
|
-
* - 若只传 port,则复用已保存 ip,并更新 port 后落盘
|
|
48
|
-
* - 若都不传,则读取已保存配置
|
|
49
|
-
* @param ip 调用参数中的设备 ip(可选)
|
|
50
|
-
* @param port 调用参数中的设备端口(可选)
|
|
51
|
-
* @returns 返回可直接用于请求设备的配置
|
|
52
|
-
* @example
|
|
53
|
-
* const target = await resolveDeviceConfig(undefined, undefined)
|
|
54
|
-
*/
|
|
55
8
|
export declare function resolveDeviceConfig(ip?: string, port?: number): Promise<DeviceConfig>;
|
|
@@ -1,183 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
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.DEVICE_CONFIG_FILE = exports.DEFAULT_DEVICE_PORT = void 0;
|
|
37
|
-
exports.normalizePort = normalizePort;
|
|
38
|
-
exports.readDeviceConfig = readDeviceConfig;
|
|
39
|
-
exports.writeDeviceConfig = writeDeviceConfig;
|
|
40
|
-
exports.setDeviceConfig = setDeviceConfig;
|
|
41
|
-
exports.resolveDeviceConfig = resolveDeviceConfig;
|
|
42
|
-
const fsExtra = __importStar(require("fs-extra"));
|
|
43
|
-
const os = __importStar(require("os"));
|
|
44
|
-
const path = __importStar(require("path"));
|
|
45
|
-
/**
|
|
46
|
-
* 默认设备端口
|
|
47
|
-
*/
|
|
48
|
-
exports.DEFAULT_DEVICE_PORT = 9800;
|
|
49
|
-
/**
|
|
50
|
-
* 设备连接配置持久化文件
|
|
51
|
-
* - 使用系统临时目录,避免污染项目源码目录
|
|
52
|
-
* - 文件名包含 pid/时间戳/随机串,确保并发窗口与多次启动互不冲突
|
|
53
|
-
*/
|
|
54
|
-
exports.DEVICE_CONFIG_FILE = path.join(os.tmpdir(), `ms-cli-mcp-device-${process.pid}-${Date.now()}-${Math.random()
|
|
55
|
-
.toString(36)
|
|
56
|
-
.slice(2, 10)}.json`);
|
|
57
|
-
/**
|
|
58
|
-
* 将端口标准化为字符串(内部沿用 DeviceCliOptions 字符串端口)
|
|
59
|
-
* @param port 端口号
|
|
60
|
-
* @returns 返回标准端口字符串
|
|
61
|
-
* @example
|
|
62
|
-
* const textPort = normalizePort(9800)
|
|
63
|
-
*/
|
|
64
|
-
function normalizePort(port) {
|
|
65
|
-
return String(port);
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* 校验并标准化 IP 字符串
|
|
69
|
-
* @param ip 原始 ip 输入
|
|
70
|
-
* @returns 返回去空格后的 ip
|
|
71
|
-
* @example
|
|
72
|
-
* const normalizedIp = normalizeIp(" 192.168.1.100 ")
|
|
73
|
-
*/
|
|
74
|
-
function normalizeIp(ip) {
|
|
75
|
-
const normalizedIp = ip.trim();
|
|
76
|
-
if (!normalizedIp) {
|
|
77
|
-
throw new Error("设备 IP 不能为空");
|
|
78
|
-
}
|
|
79
|
-
return normalizedIp;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* 校验并标准化端口
|
|
83
|
-
* @param port 原始端口(可选)
|
|
84
|
-
* @returns 返回有效端口,默认 9800
|
|
85
|
-
* @example
|
|
86
|
-
* const normalizedPort = normalizeDevicePort(undefined)
|
|
87
|
-
*/
|
|
88
|
-
function normalizeDevicePort(port) {
|
|
89
|
-
const targetPort = port ?? exports.DEFAULT_DEVICE_PORT;
|
|
90
|
-
if (!Number.isInteger(targetPort) || targetPort < 1 || targetPort > 65535) {
|
|
91
|
-
throw new Error(`无效设备端口: ${String(port)}`);
|
|
92
|
-
}
|
|
93
|
-
return targetPort;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* 读取已保存的设备配置
|
|
97
|
-
* @returns 若存在有效配置则返回配置对象,否则返回 null
|
|
98
|
-
* @example
|
|
99
|
-
* const cfg = await readDeviceConfig()
|
|
100
|
-
*/
|
|
101
|
-
async function readDeviceConfig() {
|
|
102
|
-
try {
|
|
103
|
-
if (!(await fsExtra.pathExists(exports.DEVICE_CONFIG_FILE))) {
|
|
104
|
-
return null;
|
|
105
|
-
}
|
|
106
|
-
const data = (await fsExtra.readJSON(exports.DEVICE_CONFIG_FILE));
|
|
107
|
-
const ip = typeof data.ip === "string" ? data.ip.trim() : "";
|
|
108
|
-
const port = typeof data.port === "number" ? data.port : Number.parseInt(String(data.port), 10);
|
|
109
|
-
if (!ip || !Number.isInteger(port) || port < 1 || port > 65535) {
|
|
110
|
-
return null;
|
|
111
|
-
}
|
|
112
|
-
return {
|
|
113
|
-
ip,
|
|
114
|
-
port,
|
|
115
|
-
updatedAt: typeof data.updatedAt === "number" && Number.isFinite(data.updatedAt)
|
|
116
|
-
? data.updatedAt
|
|
117
|
-
: Date.now(),
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
catch {
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* 保存设备配置
|
|
126
|
-
* @param config 需要保存的设备配置
|
|
127
|
-
* @returns 保存完成后返回 Promise<void>
|
|
128
|
-
* @example
|
|
129
|
-
* await writeDeviceConfig({ ip: "192.168.1.100", port: 9800, updatedAt: Date.now() })
|
|
130
|
-
*/
|
|
131
|
-
async function writeDeviceConfig(config) {
|
|
132
|
-
await fsExtra.writeJSON(exports.DEVICE_CONFIG_FILE, config, { spaces: 2 });
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* 构建并保存设备配置
|
|
136
|
-
* @param ip 设备 IP
|
|
137
|
-
* @param port 设备端口(可选)
|
|
138
|
-
* @returns 返回保存后的设备配置
|
|
139
|
-
* @example
|
|
140
|
-
* const cfg = await setDeviceConfig("192.168.1.100", 9800)
|
|
141
|
-
*/
|
|
142
|
-
async function setDeviceConfig(ip, port) {
|
|
143
|
-
const config = {
|
|
144
|
-
ip: normalizeIp(ip),
|
|
145
|
-
port: normalizeDevicePort(port),
|
|
146
|
-
updatedAt: Date.now(),
|
|
147
|
-
};
|
|
148
|
-
await writeDeviceConfig(config);
|
|
149
|
-
return config;
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* 获取最终生效的设备配置
|
|
153
|
-
* - 若调用参数携带 ip,则优先使用调用参数并落盘
|
|
154
|
-
* - 若只传 port,则复用已保存 ip,并更新 port 后落盘
|
|
155
|
-
* - 若都不传,则读取已保存配置
|
|
156
|
-
* @param ip 调用参数中的设备 ip(可选)
|
|
157
|
-
* @param port 调用参数中的设备端口(可选)
|
|
158
|
-
* @returns 返回可直接用于请求设备的配置
|
|
159
|
-
* @example
|
|
160
|
-
* const target = await resolveDeviceConfig(undefined, undefined)
|
|
161
|
-
*/
|
|
162
|
-
async function resolveDeviceConfig(ip, port) {
|
|
163
|
-
const savedConfig = await readDeviceConfig();
|
|
164
|
-
if (ip !== undefined) {
|
|
165
|
-
return setDeviceConfig(ip, port);
|
|
166
|
-
}
|
|
167
|
-
if (port !== undefined) {
|
|
168
|
-
if (!savedConfig) {
|
|
169
|
-
throw new Error("尚未配置设备 IP。请先调用 set_device 设置 ip,或在本次 run 调用里传入 ip。");
|
|
170
|
-
}
|
|
171
|
-
const nextConfig = {
|
|
172
|
-
ip: savedConfig.ip,
|
|
173
|
-
port: normalizeDevicePort(port),
|
|
174
|
-
updatedAt: Date.now(),
|
|
175
|
-
};
|
|
176
|
-
await writeDeviceConfig(nextConfig);
|
|
177
|
-
return nextConfig;
|
|
178
|
-
}
|
|
179
|
-
if (savedConfig) {
|
|
180
|
-
return savedConfig;
|
|
181
|
-
}
|
|
182
|
-
throw new Error("未找到可用设备配置。请先调用 set_device 设置 ip,或在 run/run_ui/stop 调用里传入 ip。");
|
|
183
|
-
}
|
|
1
|
+
"use strict";var d=exports&&exports.__createBinding||(Object.create?(function(t,e,r,n){n===void 0&&(n=r);var i=Object.getOwnPropertyDescriptor(e,r);(!i||("get"in i?!e.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,i)}):(function(t,e,r,n){n===void 0&&(n=r),t[n]=e[r]})),l=exports&&exports.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),o=exports&&exports.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(r){var n=[];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(n[n.length]=i);return n},t(e)};return function(e){if(e&&e.__esModule)return e;var r={};if(e!=null)for(var n=t(e),i=0;i<n.length;i++)n[i]!=="default"&&d(r,e,n[i]);return l(r,e),r}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.DEVICE_CONFIG_FILE=exports.DEFAULT_DEVICE_PORT=void 0,exports.normalizePort=E,exports.readDeviceConfig=f,exports.writeDeviceConfig=a,exports.setDeviceConfig=s,exports.resolveDeviceConfig=v;const u=o(require("fs-extra")),p=o(require("os")),_=o(require("path"));exports.DEFAULT_DEVICE_PORT=9800,exports.DEVICE_CONFIG_FILE=_.join(p.tmpdir(),`ms-cli-mcp-device-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2,10)}.json`);function E(t){return String(t)}function g(t){const e=t.trim();if(!e)throw new Error("\u8BBE\u5907 IP \u4E0D\u80FD\u4E3A\u7A7A");return e}function c(t){const e=t??exports.DEFAULT_DEVICE_PORT;if(!Number.isInteger(e)||e<1||e>65535)throw new Error(`\u65E0\u6548\u8BBE\u5907\u7AEF\u53E3: ${String(t)}`);return e}async function f(){try{if(!await u.pathExists(exports.DEVICE_CONFIG_FILE))return null;const t=await u.readJSON(exports.DEVICE_CONFIG_FILE),e=typeof t.ip=="string"?t.ip.trim():"",r=typeof t.port=="number"?t.port:Number.parseInt(String(t.port),10);return!e||!Number.isInteger(r)||r<1||r>65535?null:{ip:e,port:r,updatedAt:typeof t.updatedAt=="number"&&Number.isFinite(t.updatedAt)?t.updatedAt:Date.now()}}catch{return null}}async function a(t){await u.writeJSON(exports.DEVICE_CONFIG_FILE,t,{spaces:2})}async function s(t,e){const r={ip:g(t),port:c(e),updatedAt:Date.now()};return await a(r),r}async function v(t,e){const r=await f();if(t!==void 0)return s(t,e);if(e!==void 0){if(!r)throw new Error("\u5C1A\u672A\u914D\u7F6E\u8BBE\u5907 IP\u3002\u8BF7\u5148\u8C03\u7528 set_device \u8BBE\u7F6E ip\uFF0C\u6216\u5728\u672C\u6B21 run \u8C03\u7528\u91CC\u4F20\u5165 ip\u3002");const n={ip:r.ip,port:c(e),updatedAt:Date.now()};return await a(n),n}if(r)return r;throw new Error("\u672A\u627E\u5230\u53EF\u7528\u8BBE\u5907\u914D\u7F6E\u3002\u8BF7\u5148\u8C03\u7528 set_device \u8BBE\u7F6E ip\uFF0C\u6216\u5728 run/run_ui/stop \u8C03\u7528\u91CC\u4F20\u5165 ip\u3002")}
|
package/dist/mcp/device-log.d.ts
CHANGED
|
@@ -1,10 +1,2 @@
|
|
|
1
1
|
import type { RuntimeHttpTarget } from "./tool-utils";
|
|
2
|
-
/**
|
|
3
|
-
* 构建当前设备日志文本快照
|
|
4
|
-
* @param target 当前默认 HTTP 设备
|
|
5
|
-
* @param limit 需要返回的最新日志行数
|
|
6
|
-
* @returns 返回可直接作为 MCP 文本响应的日志内容
|
|
7
|
-
* @example
|
|
8
|
-
* const text = await buildDeviceLogSnapshotText({ ip: "192.168.1.10", port: "9800", label: "192.168.1.10:9800" }, 200)
|
|
9
|
-
*/
|
|
10
2
|
export declare function buildDeviceLogSnapshotText(target: RuntimeHttpTarget, limit: number): Promise<string>;
|
package/dist/mcp/device-log.js
CHANGED
|
@@ -1,27 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const project_1 = require("../project");
|
|
5
|
-
/**
|
|
6
|
-
* 构建当前设备日志文本快照
|
|
7
|
-
* @param target 当前默认 HTTP 设备
|
|
8
|
-
* @param limit 需要返回的最新日志行数
|
|
9
|
-
* @returns 返回可直接作为 MCP 文本响应的日志内容
|
|
10
|
-
* @example
|
|
11
|
-
* const text = await buildDeviceLogSnapshotText({ ip: "192.168.1.10", port: "9800", label: "192.168.1.10:9800" }, 200)
|
|
12
|
-
*/
|
|
13
|
-
async function buildDeviceLogSnapshotText(target, limit) {
|
|
14
|
-
const result = await (0, project_1.getCurrentLogLinesOnDevice)({
|
|
15
|
-
ip: target.ip,
|
|
16
|
-
port: target.port,
|
|
17
|
-
transport: "http",
|
|
18
|
-
}, limit);
|
|
19
|
-
const lines = result.lines.length > 0 ? result.lines.join("\n") : "无日志";
|
|
20
|
-
return [
|
|
21
|
-
`设备: ${target.label}`,
|
|
22
|
-
`还有更早日志: ${result.hasMore ? "是" : "否"}`,
|
|
23
|
-
"",
|
|
24
|
-
`最新日志(最多 ${limit} 行):`,
|
|
25
|
-
lines,
|
|
26
|
-
].join("\n");
|
|
27
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.buildDeviceLogSnapshotText=s;const i=require("../project");async function s(e,t){const n=await(0,i.getCurrentLogLinesOnDevice)({ip:e.ip,port:e.port,transport:"http"},t),o=n.lines.length>0?n.lines.join(`
|
|
2
|
+
`):"\u65E0\u65E5\u5FD7";return[`\u8BBE\u5907: ${e.label}`,`\u8FD8\u6709\u66F4\u65E9\u65E5\u5FD7: ${n.hasMore?"\u662F":"\u5426"}`,"",`\u6700\u65B0\u65E5\u5FD7\uFF08\u6700\u591A ${t} \u884C\uFF09:`,o].join(`
|
|
3
|
+
`)}
|
package/dist/mcp/doc-tools.d.ts
CHANGED
package/dist/mcp/doc-tools.js
CHANGED
|
@@ -1,39 +1,2 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
exports.registerDocTools = registerDocTools;
|
|
4
|
-
const docs_service_1 = require("./docs-service");
|
|
5
|
-
const httpapi_docs_service_1 = require("./httpapi-docs-service");
|
|
6
|
-
const tool_utils_1 = require("./tool-utils");
|
|
7
|
-
const types_1 = require("./types");
|
|
8
|
-
/**
|
|
9
|
-
* 格式化 KuaiJS 文档路径清单
|
|
10
|
-
* @returns 返回可直接交给 AI 读取的文档路径文本
|
|
11
|
-
* @example
|
|
12
|
-
* const text = formatDocsPathsText()
|
|
13
|
-
*/
|
|
14
|
-
function formatDocsPathsText() {
|
|
15
|
-
const languages = ["js", "js_zh", "python"];
|
|
16
|
-
return [
|
|
17
|
-
"KuaiJS 文档路径:",
|
|
18
|
-
`docsRoot: ${(0, docs_service_1.getDocsRootDir)()}`,
|
|
19
|
-
...languages.map((language) => `${language}: ${(0, docs_service_1.getDocsDirByLanguage)(language)} (${types_1.DOC_LANGUAGE_LABELS[language]})`),
|
|
20
|
-
`httpApi: ${(0, httpapi_docs_service_1.getHttpApiDocPath)()}`,
|
|
21
|
-
"说明: 直接读取上述 markdown 路径。",
|
|
22
|
-
].join("\n");
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* 注册文档工具
|
|
26
|
-
* @param server MCP 服务实例
|
|
27
|
-
* @returns 无返回值
|
|
28
|
-
* @example
|
|
29
|
-
* registerDocTools(server)
|
|
30
|
-
*/
|
|
31
|
-
function registerDocTools(server) {
|
|
32
|
-
server.registerTool("get_docs_paths", {
|
|
33
|
-
title: "Get Docs Paths",
|
|
34
|
-
description: "获取 KuaiJS 本地文档路径,便于 AI 直接读取 markdown 文件而不是猜测位置。",
|
|
35
|
-
inputSchema: {},
|
|
36
|
-
}, async () => {
|
|
37
|
-
return (0, tool_utils_1.createTextToolResult)(formatDocsPathsText());
|
|
38
|
-
});
|
|
39
|
-
}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.registerDocTools=n;const o=require("./docs-service"),s=require("./httpapi-docs-service"),r=require("./tool-utils"),c=require("./types");function i(){const t=["js","js_zh","python"];return["KuaiJS \u6587\u6863\u8DEF\u5F84:",`docsRoot: ${(0,o.getDocsRootDir)()}`,...t.map(e=>`${e}: ${(0,o.getDocsDirByLanguage)(e)} (${c.DOC_LANGUAGE_LABELS[e]})`),`httpApi: ${(0,s.getHttpApiDocPath)()}`,"\u8BF4\u660E: \u76F4\u63A5\u8BFB\u53D6\u4E0A\u8FF0 markdown \u8DEF\u5F84\u3002"].join(`
|
|
2
|
+
`)}function n(t){t.registerTool("get_docs_paths",{title:"Get Docs Paths",description:"\u83B7\u53D6 KuaiJS \u672C\u5730\u6587\u6863\u8DEF\u5F84\uFF0C\u4FBF\u4E8E AI \u76F4\u63A5\u8BFB\u53D6 markdown \u6587\u4EF6\u800C\u4E0D\u662F\u731C\u6D4B\u4F4D\u7F6E\u3002",inputSchema:{}},async()=>(0,r.createTextToolResult)(i()))}
|
|
@@ -1,16 +1,3 @@
|
|
|
1
1
|
import type { ApiDocsLanguage } from "./types";
|
|
2
|
-
/**
|
|
3
|
-
* 获取 docs 根目录
|
|
4
|
-
* @returns 返回 docs 目录绝对路径
|
|
5
|
-
* @example
|
|
6
|
-
* const docsRoot = getDocsRootDir()
|
|
7
|
-
*/
|
|
8
2
|
export declare function getDocsRootDir(): string;
|
|
9
|
-
/**
|
|
10
|
-
* 获取某语言对应的文档目录
|
|
11
|
-
* @param language 文档语言
|
|
12
|
-
* @returns 返回文档目录绝对路径
|
|
13
|
-
* @example
|
|
14
|
-
* const dir = getDocsDirByLanguage("js_zh")
|
|
15
|
-
*/
|
|
16
3
|
export declare function getDocsDirByLanguage(language: ApiDocsLanguage): string;
|
package/dist/mcp/docs-service.js
CHANGED
|
@@ -1,63 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
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.getDocsRootDir = getDocsRootDir;
|
|
37
|
-
exports.getDocsDirByLanguage = getDocsDirByLanguage;
|
|
38
|
-
const path = __importStar(require("path"));
|
|
39
|
-
/**
|
|
40
|
-
* 获取 docs 根目录
|
|
41
|
-
* @returns 返回 docs 目录绝对路径
|
|
42
|
-
* @example
|
|
43
|
-
* const docsRoot = getDocsRootDir()
|
|
44
|
-
*/
|
|
45
|
-
function getDocsRootDir() {
|
|
46
|
-
return path.resolve(__dirname, "..", "..", "docs");
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* 获取某语言对应的文档目录
|
|
50
|
-
* @param language 文档语言
|
|
51
|
-
* @returns 返回文档目录绝对路径
|
|
52
|
-
* @example
|
|
53
|
-
* const dir = getDocsDirByLanguage("js_zh")
|
|
54
|
-
*/
|
|
55
|
-
function getDocsDirByLanguage(language) {
|
|
56
|
-
if (language === "js") {
|
|
57
|
-
return path.join(getDocsRootDir(), "api");
|
|
58
|
-
}
|
|
59
|
-
if (language === "js_zh") {
|
|
60
|
-
return path.join(getDocsRootDir(), "apicn");
|
|
61
|
-
}
|
|
62
|
-
return path.join(getDocsRootDir(), "apipython");
|
|
63
|
-
}
|
|
1
|
+
"use strict";var c=exports&&exports.__createBinding||(Object.create?(function(r,e,i,t){t===void 0&&(t=i);var n=Object.getOwnPropertyDescriptor(e,i);(!n||("get"in n?!e.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return e[i]}}),Object.defineProperty(r,t,n)}):(function(r,e,i,t){t===void 0&&(t=i),r[t]=e[i]})),f=exports&&exports.__setModuleDefault||(Object.create?(function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}):function(r,e){r.default=e}),o=exports&&exports.__importStar||(function(){var r=function(e){return r=Object.getOwnPropertyNames||function(i){var t=[];for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(t[t.length]=n);return t},r(e)};return function(e){if(e&&e.__esModule)return e;var i={};if(e!=null)for(var t=r(e),n=0;n<t.length;n++)t[n]!=="default"&&c(i,e,t[n]);return f(i,e),i}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.getDocsRootDir=a,exports.getDocsDirByLanguage=l;const u=o(require("path"));function a(){return u.resolve(__dirname,"..","..","docs")}function l(r){return r==="js"?u.join(a(),"api"):r==="js_zh"?u.join(a(),"apicn"):u.join(a(),"apipython")}
|
|
@@ -1,42 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HTTP API 请求方法
|
|
3
|
-
*/
|
|
4
1
|
export type HttpApiMethod = "GET" | "POST";
|
|
5
|
-
/**
|
|
6
|
-
* HTTP API 文档条目
|
|
7
|
-
*/
|
|
8
2
|
export type HttpApiDocEntry = {
|
|
9
|
-
/** 接口请求方法 */
|
|
10
3
|
method: HttpApiMethod;
|
|
11
|
-
/** 接口路径 */
|
|
12
4
|
path: string;
|
|
13
|
-
/** 接口标题 */
|
|
14
5
|
title: string;
|
|
15
|
-
/** 文档片段起始行号(1-based) */
|
|
16
6
|
startLine: number;
|
|
17
|
-
/** 文档片段结束行号(1-based) */
|
|
18
7
|
endLine: number;
|
|
19
8
|
};
|
|
20
|
-
/**
|
|
21
|
-
* 获取 HTTP API 文档路径
|
|
22
|
-
* @returns 返回 HTTP API 文档绝对路径
|
|
23
|
-
* @example
|
|
24
|
-
* const filePath = getHttpApiDocPath()
|
|
25
|
-
*/
|
|
26
9
|
export declare function getHttpApiDocPath(): string;
|
|
27
|
-
/**
|
|
28
|
-
* 解析 HTTP API markdown 为接口条目
|
|
29
|
-
* @returns 返回按文档顺序排列的接口条目
|
|
30
|
-
* @example
|
|
31
|
-
* const entries = await getHttpApiDocEntries()
|
|
32
|
-
*/
|
|
33
10
|
export declare function getHttpApiDocEntries(): Promise<HttpApiDocEntry[]>;
|
|
34
|
-
/**
|
|
35
|
-
* 根据 method/path 查找 HTTP API 文档条目
|
|
36
|
-
* @param apiPath API 路径
|
|
37
|
-
* @param method HTTP 方法
|
|
38
|
-
* @returns 找到时返回条目,否则返回 undefined
|
|
39
|
-
* @example
|
|
40
|
-
* const entry = await findHttpApiDocEntry("/api/control/click", "GET")
|
|
41
|
-
*/
|
|
42
11
|
export declare function findHttpApiDocEntry(apiPath: string, method: HttpApiMethod): Promise<HttpApiDocEntry | undefined>;
|
|
@@ -1,122 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
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.getHttpApiDocPath = getHttpApiDocPath;
|
|
37
|
-
exports.getHttpApiDocEntries = getHttpApiDocEntries;
|
|
38
|
-
exports.findHttpApiDocEntry = findHttpApiDocEntry;
|
|
39
|
-
const fsExtra = __importStar(require("fs-extra"));
|
|
40
|
-
const path = __importStar(require("path"));
|
|
41
|
-
const HTTP_API_DOC_RELATIVE_PATH = ["docs", "httpapi", "api.md"];
|
|
42
|
-
const HTTP_API_ENDPOINT_PATTERN = /^(GET|POST)\s+(\/\S+)/;
|
|
43
|
-
const HTTP_API_TITLE_PATTERN = /^##\s+(.+)$/;
|
|
44
|
-
let cachedHttpApiDocEntries = null;
|
|
45
|
-
/**
|
|
46
|
-
* 获取 HTTP API 文档路径
|
|
47
|
-
* @returns 返回 HTTP API 文档绝对路径
|
|
48
|
-
* @example
|
|
49
|
-
* const filePath = getHttpApiDocPath()
|
|
50
|
-
*/
|
|
51
|
-
function getHttpApiDocPath() {
|
|
52
|
-
return path.resolve(__dirname, "..", "..", ...HTTP_API_DOC_RELATIVE_PATH);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* 解析 HTTP API markdown 为接口条目
|
|
56
|
-
* @returns 返回按文档顺序排列的接口条目
|
|
57
|
-
* @example
|
|
58
|
-
* const entries = await getHttpApiDocEntries()
|
|
59
|
-
*/
|
|
60
|
-
async function getHttpApiDocEntries() {
|
|
61
|
-
const filePath = getHttpApiDocPath();
|
|
62
|
-
const stat = await fsExtra.stat(filePath);
|
|
63
|
-
if (cachedHttpApiDocEntries?.mtimeMs === stat.mtimeMs) {
|
|
64
|
-
return cachedHttpApiDocEntries.entries;
|
|
65
|
-
}
|
|
66
|
-
const markdown = await fsExtra.readFile(filePath, "utf8");
|
|
67
|
-
const lines = markdown.split(/\r?\n/);
|
|
68
|
-
const entries = [];
|
|
69
|
-
for (let index = 0; index < lines.length; index += 1) {
|
|
70
|
-
const line = lines[index] ?? "";
|
|
71
|
-
const titleMatch = line.match(HTTP_API_TITLE_PATTERN);
|
|
72
|
-
if (!titleMatch) {
|
|
73
|
-
continue;
|
|
74
|
-
}
|
|
75
|
-
const title = titleMatch[1]?.trim() ?? "";
|
|
76
|
-
let method = null;
|
|
77
|
-
let apiPath = "";
|
|
78
|
-
for (let cursor = index + 1; cursor < Math.min(lines.length, index + 8); cursor += 1) {
|
|
79
|
-
const endpointMatch = (lines[cursor] ?? "").match(HTTP_API_ENDPOINT_PATTERN);
|
|
80
|
-
if (endpointMatch) {
|
|
81
|
-
method = endpointMatch[1];
|
|
82
|
-
apiPath = endpointMatch[2] ?? "";
|
|
83
|
-
break;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
if (!method || !apiPath) {
|
|
87
|
-
continue;
|
|
88
|
-
}
|
|
89
|
-
let endIndex = lines.length;
|
|
90
|
-
for (let cursor = index + 1; cursor < lines.length; cursor += 1) {
|
|
91
|
-
if (HTTP_API_TITLE_PATTERN.test(lines[cursor] ?? "")) {
|
|
92
|
-
endIndex = cursor;
|
|
93
|
-
break;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
entries.push({
|
|
97
|
-
method,
|
|
98
|
-
path: apiPath,
|
|
99
|
-
title,
|
|
100
|
-
startLine: index + 1,
|
|
101
|
-
endLine: endIndex,
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
cachedHttpApiDocEntries = {
|
|
105
|
-
mtimeMs: stat.mtimeMs,
|
|
106
|
-
entries,
|
|
107
|
-
};
|
|
108
|
-
return entries;
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* 根据 method/path 查找 HTTP API 文档条目
|
|
112
|
-
* @param apiPath API 路径
|
|
113
|
-
* @param method HTTP 方法
|
|
114
|
-
* @returns 找到时返回条目,否则返回 undefined
|
|
115
|
-
* @example
|
|
116
|
-
* const entry = await findHttpApiDocEntry("/api/control/click", "GET")
|
|
117
|
-
*/
|
|
118
|
-
async function findHttpApiDocEntry(apiPath, method) {
|
|
119
|
-
const normalizedPath = apiPath.trim();
|
|
120
|
-
const entries = await getHttpApiDocEntries();
|
|
121
|
-
return entries.find((entry) => entry.method === method && entry.path === normalizedPath);
|
|
122
|
-
}
|
|
1
|
+
"use strict";var T=exports&&exports.__createBinding||(Object.create?(function(i,t,r,e){e===void 0&&(e=r);var n=Object.getOwnPropertyDescriptor(t,r);(!n||("get"in n?!t.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(i,e,n)}):(function(i,t,r,e){e===void 0&&(e=r),i[e]=t[r]})),b=exports&&exports.__setModuleDefault||(Object.create?(function(i,t){Object.defineProperty(i,"default",{enumerable:!0,value:t})}):function(i,t){i.default=t}),d=exports&&exports.__importStar||(function(){var i=function(t){return i=Object.getOwnPropertyNames||function(r){var e=[];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[e.length]=n);return e},i(t)};return function(t){if(t&&t.__esModule)return t;var r={};if(t!=null)for(var e=i(t),n=0;n<e.length;n++)e[n]!=="default"&&T(r,t,e[n]);return b(r,t),r}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.getHttpApiDocPath=P,exports.getHttpApiDocEntries=g,exports.findHttpApiDocEntry=v;const _=d(require("fs-extra")),A=d(require("path")),O=["docs","httpapi","api.md"],E=/^(GET|POST)\s+(\/\S+)/,p=/^##\s+(.+)$/;let l=null;function P(){return A.resolve(__dirname,"..","..",...O)}async function g(){const i=P(),t=await _.stat(i);if(l?.mtimeMs===t.mtimeMs)return l.entries;const e=(await _.readFile(i,"utf8")).split(/\r?\n/),n=[];for(let c=0;c<e.length;c+=1){const f=(e[c]??"").match(p);if(!f)continue;const m=f[1]?.trim()??"";let o=null,s="";for(let a=c+1;a<Math.min(e.length,c+8);a+=1){const u=(e[a]??"").match(E);if(u){o=u[1],s=u[2]??"";break}}if(!o||!s)continue;let h=e.length;for(let a=c+1;a<e.length;a+=1)if(p.test(e[a]??"")){h=a;break}n.push({method:o,path:s,title:m,startLine:c+1,endLine:h})}return l={mtimeMs:t.mtimeMs,entries:n},n}async function v(i,t){const r=i.trim();return(await g()).find(n=>n.method===t&&n.path===r)}
|
|
@@ -1,9 +1,2 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
-
/**
|
|
3
|
-
* 注册通用 HTTP API 调用工具
|
|
4
|
-
* @param server MCP 服务实例
|
|
5
|
-
* @returns 无返回值
|
|
6
|
-
* @example
|
|
7
|
-
* registerHttpApiTools(server)
|
|
8
|
-
*/
|
|
9
2
|
export declare function registerHttpApiTools(server: McpServer): void;
|