xiaozhi-client 0.0.1-beta.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 shenjingnan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,101 @@
1
+ # Xiaozhi Client
2
+
3
+ 小智 AI 客户端,目前主要用于 MCP 的对接
4
+
5
+ ![效果图](./docs/preview.png)
6
+
7
+ ## 安装和使用
8
+
9
+ ### 开发环境
10
+
11
+ 1. 克隆项目:
12
+
13
+ ```bash
14
+ git clone <repository-url>
15
+ cd xiaozhi-client
16
+ ```
17
+
18
+ 2. 安装依赖:
19
+
20
+ ```bash
21
+ pnpm install
22
+ ```
23
+
24
+ 3. 构建项目:
25
+
26
+ ```bash
27
+ pnpm run build
28
+ ```
29
+
30
+ 4. 本地安装(用于开发测试):
31
+
32
+ ```bash
33
+ npm link
34
+ ```
35
+
36
+ 现在你可以在任何地方使用 `xiaozhi` 命令了。
37
+
38
+ ### 生产环境
39
+
40
+ 项目使用 tsup 打包成单个可执行的 JavaScript 文件,所有依赖都被正确处理。
41
+
42
+ 构建后的文件位于 `dist/cli.js`,这是一个完整的可执行文件,包含:
43
+
44
+ - 正确的 shebang (`#!/usr/bin/env node`)
45
+ - 所有必要的代码(除了外部依赖)
46
+ - 可执行权限
47
+
48
+ ### 可用命令
49
+
50
+ ```bash
51
+ # 查看帮助
52
+ xiaozhi --help
53
+
54
+ # 配置端点
55
+ xiaozhi set-config xiaozhi.endpoint=wss://your-endpoint
56
+
57
+ # 查看配置
58
+ xiaozhi get-config
59
+
60
+ # 启动服务
61
+ xiaozhi start
62
+
63
+ # 后台启动服务
64
+ xiaozhi start --daemon
65
+
66
+ # 查看服务状态
67
+ xiaozhi status
68
+
69
+ # 停止服务
70
+ xiaozhi stop
71
+
72
+ # 重启服务
73
+ xiaozhi restart
74
+ ```
75
+
76
+ ## 开发
77
+
78
+ ### 构建脚本
79
+
80
+ - `pnpm run build` - 使用 tsup 构建项目(推荐)
81
+ - `pnpm run build:tsc` - 使用 TypeScript 编译器构建(备用)
82
+ - `pnpm run clean` - 清理构建文件
83
+ - `pnpm run dev` - 开发模式(监听文件变化)
84
+ - `pnpm run type-check` - 仅进行类型检查
85
+ - `pnpm run start` - 编译并启动服务
86
+
87
+ ### 技术栈
88
+
89
+ - TypeScript
90
+ - tsup (打包工具)
91
+ - Commander.js (CLI 框架)
92
+ - Chalk (终端颜色)
93
+ - Ora (加载动画)
94
+
95
+ ### 打包特性
96
+
97
+ - 使用 tsup 进行快速打包
98
+ - 自动处理 shebang 重复问题
99
+ - 自动添加可执行权限
100
+ - 支持 ES 模块
101
+ - 生成 source maps 和类型定义文件
package/dist/cli.cjs ADDED
@@ -0,0 +1,452 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
19
+ // If the importer is in node compatibility mode or this is not an ESM
20
+ // file that has been converted to a CommonJS file using a Babel-
21
+ // compatible transform (i.e. "__esModule" has not been set), then set
22
+ // "default" to the CommonJS "module.exports" for node compatibility.
23
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
24
+ mod
25
+ ));
26
+ var import_commander = require("commander");
27
+ var import_chalk = __toESM(require("chalk"));
28
+ var import_ora = __toESM(require("ora"));
29
+ var import_child_process = require("child_process");
30
+ var import_fs = __toESM(require("fs"));
31
+ var import_path = __toESM(require("path"));
32
+ var import_os = __toESM(require("os"));
33
+ var import_configManager = require("./configManager.cjs");
34
+ const program = new import_commander.Command();
35
+ const VERSION = "0.0.1";
36
+ const SERVICE_NAME = "xiaozhi-mcp-service";
37
+ const PID_FILE = import_path.default.join(import_os.default.tmpdir(), `${SERVICE_NAME}.pid`);
38
+ const LOG_FILE = import_path.default.join(import_os.default.tmpdir(), `${SERVICE_NAME}.log`);
39
+ function getServiceStatus() {
40
+ try {
41
+ if (!import_fs.default.existsSync(PID_FILE)) {
42
+ return { running: false };
43
+ }
44
+ const pidContent = import_fs.default.readFileSync(PID_FILE, "utf8").trim();
45
+ const [pidStr, startTime, mode] = pidContent.split("|");
46
+ const pid = parseInt(pidStr);
47
+ if (isNaN(pid)) {
48
+ import_fs.default.unlinkSync(PID_FILE);
49
+ return { running: false };
50
+ }
51
+ try {
52
+ process.kill(pid, 0);
53
+ const start = parseInt(startTime);
54
+ const uptime = formatUptime(Date.now() - start);
55
+ return {
56
+ running: true,
57
+ pid,
58
+ uptime,
59
+ mode: mode || "foreground"
60
+ };
61
+ } catch (error) {
62
+ import_fs.default.unlinkSync(PID_FILE);
63
+ return { running: false };
64
+ }
65
+ } catch (error) {
66
+ return { running: false };
67
+ }
68
+ }
69
+ __name(getServiceStatus, "getServiceStatus");
70
+ function formatUptime(ms) {
71
+ const seconds = Math.floor(ms / 1e3);
72
+ const minutes = Math.floor(seconds / 60);
73
+ const hours = Math.floor(minutes / 60);
74
+ const days = Math.floor(hours / 24);
75
+ if (days > 0) {
76
+ return `${days}\u5929 ${hours % 24}\u5C0F\u65F6 ${minutes % 60}\u5206\u949F`;
77
+ } else if (hours > 0) {
78
+ return `${hours}\u5C0F\u65F6 ${minutes % 60}\u5206\u949F`;
79
+ } else if (minutes > 0) {
80
+ return `${minutes}\u5206\u949F ${seconds % 60}\u79D2`;
81
+ } else {
82
+ return `${seconds}\u79D2`;
83
+ }
84
+ }
85
+ __name(formatUptime, "formatUptime");
86
+ function savePidInfo(pid, mode) {
87
+ const pidInfo = `${pid}|${Date.now()}|${mode}`;
88
+ import_fs.default.writeFileSync(PID_FILE, pidInfo);
89
+ }
90
+ __name(savePidInfo, "savePidInfo");
91
+ function cleanupPidFile() {
92
+ try {
93
+ if (import_fs.default.existsSync(PID_FILE)) {
94
+ import_fs.default.unlinkSync(PID_FILE);
95
+ }
96
+ } catch (error) {
97
+ }
98
+ }
99
+ __name(cleanupPidFile, "cleanupPidFile");
100
+ function checkEnvironment() {
101
+ if (!import_configManager.configManager.configExists()) {
102
+ console.error(import_chalk.default.red("\u274C \u9519\u8BEF: \u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728"));
103
+ console.log(import_chalk.default.yellow('\u{1F4A1} \u63D0\u793A: \u8BF7\u8FD0\u884C "xiaozhi init" \u521D\u59CB\u5316\u914D\u7F6E'));
104
+ return false;
105
+ }
106
+ try {
107
+ const endpoint = import_configManager.configManager.getMcpEndpoint();
108
+ if (!endpoint || endpoint.includes("<\u8BF7\u586B\u5199")) {
109
+ console.error(import_chalk.default.red("\u274C \u9519\u8BEF: MCP \u7AEF\u70B9\u672A\u914D\u7F6E"));
110
+ console.log(import_chalk.default.yellow('\u{1F4A1} \u63D0\u793A: \u8BF7\u8FD0\u884C "xiaozhi config mcpEndpoint <your-endpoint-url>" \u8BBE\u7F6E\u7AEF\u70B9'));
111
+ return false;
112
+ }
113
+ return true;
114
+ } catch (error) {
115
+ console.error(import_chalk.default.red(`\u274C \u9519\u8BEF: \u914D\u7F6E\u6587\u4EF6\u65E0\u6548 - ${error instanceof Error ? error.message : String(error)}`));
116
+ console.log(import_chalk.default.yellow('\u{1F4A1} \u63D0\u793A: \u8BF7\u8FD0\u884C "xiaozhi init" \u91CD\u65B0\u521D\u59CB\u5316\u914D\u7F6E'));
117
+ return false;
118
+ }
119
+ }
120
+ __name(checkEnvironment, "checkEnvironment");
121
+ function getServiceCommand() {
122
+ const scriptDir = __dirname;
123
+ let distDir;
124
+ if (scriptDir.includes("js-demo/dist")) {
125
+ distDir = scriptDir;
126
+ } else {
127
+ const possiblePaths = [
128
+ import_path.default.join(scriptDir, "..", "js-demo", "dist"),
129
+ import_path.default.join(scriptDir, "..", "..", "js-demo", "dist"),
130
+ import_path.default.join(scriptDir, "..", "..", "..", "js-demo", "dist"),
131
+ import_path.default.join(process.cwd(), "js-demo", "dist"),
132
+ import_path.default.join(process.cwd(), "dist")
133
+ ];
134
+ distDir = possiblePaths.find(
135
+ (p) => import_fs.default.existsSync(import_path.default.join(p, "mcpPipe.cjs")) && import_fs.default.existsSync(import_path.default.join(p, "mcpServerProxy.cjs"))
136
+ ) || scriptDir;
137
+ }
138
+ return {
139
+ command: "node",
140
+ args: ["mcpPipe.cjs", "mcpServerProxy.cjs"],
141
+ cwd: distDir
142
+ };
143
+ }
144
+ __name(getServiceCommand, "getServiceCommand");
145
+ async function startService(daemon = false) {
146
+ const spinner = (0, import_ora.default)("\u68C0\u67E5\u670D\u52A1\u72B6\u6001...").start();
147
+ try {
148
+ const status = getServiceStatus();
149
+ if (status.running) {
150
+ spinner.fail(`\u670D\u52A1\u5DF2\u7ECF\u5728\u8FD0\u884C (PID: ${status.pid})`);
151
+ return;
152
+ }
153
+ spinner.text = "\u68C0\u67E5\u73AF\u5883\u914D\u7F6E...";
154
+ if (!checkEnvironment()) {
155
+ spinner.fail("\u73AF\u5883\u914D\u7F6E\u68C0\u67E5\u5931\u8D25");
156
+ return;
157
+ }
158
+ const { command, args, cwd } = getServiceCommand();
159
+ spinner.text = `\u542F\u52A8\u670D\u52A1 (${daemon ? "\u540E\u53F0\u6A21\u5F0F" : "\u524D\u53F0\u6A21\u5F0F"})...`;
160
+ if (daemon) {
161
+ const child = (0, import_child_process.spawn)(command, args, {
162
+ cwd,
163
+ detached: true,
164
+ stdio: ["ignore", "pipe", "pipe"],
165
+ env: { ...process.env }
166
+ });
167
+ savePidInfo(child.pid, "daemon");
168
+ const logStream = import_fs.default.createWriteStream(LOG_FILE, { flags: "a" });
169
+ child.stdout?.pipe(logStream);
170
+ child.stderr?.pipe(logStream);
171
+ child.unref();
172
+ spinner.succeed(`\u670D\u52A1\u5DF2\u5728\u540E\u53F0\u542F\u52A8 (PID: ${child.pid})`);
173
+ console.log(import_chalk.default.gray(`\u65E5\u5FD7\u6587\u4EF6: ${LOG_FILE}`));
174
+ console.log(import_chalk.default.gray(`\u4F7F\u7528 'xiaozhi attach' \u53EF\u4EE5\u67E5\u770B\u5B9E\u65F6\u65E5\u5FD7`));
175
+ } else {
176
+ spinner.succeed("\u670D\u52A1\u542F\u52A8\u4E2D...");
177
+ const child = (0, import_child_process.spawn)(command, args, {
178
+ cwd,
179
+ stdio: "inherit",
180
+ env: { ...process.env }
181
+ });
182
+ savePidInfo(child.pid, "foreground");
183
+ child.on("exit", (code, signal) => {
184
+ cleanupPidFile();
185
+ if (code !== 0) {
186
+ console.log(import_chalk.default.red(`
187
+ \u670D\u52A1\u5F02\u5E38\u9000\u51FA (\u4EE3\u7801: ${code}, \u4FE1\u53F7: ${signal})`));
188
+ } else {
189
+ console.log(import_chalk.default.green("\n\u670D\u52A1\u5DF2\u505C\u6B62"));
190
+ }
191
+ });
192
+ process.on("SIGINT", () => {
193
+ console.log(import_chalk.default.yellow("\n\u6B63\u5728\u505C\u6B62\u670D\u52A1..."));
194
+ child.kill("SIGTERM");
195
+ });
196
+ process.on("SIGTERM", () => {
197
+ child.kill("SIGTERM");
198
+ });
199
+ }
200
+ } catch (error) {
201
+ spinner.fail(`\u542F\u52A8\u670D\u52A1\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
202
+ }
203
+ }
204
+ __name(startService, "startService");
205
+ async function stopService() {
206
+ const spinner = (0, import_ora.default)("\u68C0\u67E5\u670D\u52A1\u72B6\u6001...").start();
207
+ try {
208
+ const status = getServiceStatus();
209
+ if (!status.running) {
210
+ spinner.warn("\u670D\u52A1\u672A\u5728\u8FD0\u884C");
211
+ return;
212
+ }
213
+ spinner.text = `\u505C\u6B62\u670D\u52A1 (PID: ${status.pid})...`;
214
+ try {
215
+ process.kill(status.pid, "SIGTERM");
216
+ let attempts = 0;
217
+ const maxAttempts = 30;
218
+ while (attempts < maxAttempts) {
219
+ await new Promise((resolve) => setTimeout(resolve, 100));
220
+ try {
221
+ process.kill(status.pid, 0);
222
+ attempts++;
223
+ } catch {
224
+ break;
225
+ }
226
+ }
227
+ try {
228
+ process.kill(status.pid, 0);
229
+ spinner.text = "\u5F3A\u5236\u505C\u6B62\u670D\u52A1...";
230
+ process.kill(status.pid, "SIGKILL");
231
+ await new Promise((resolve) => setTimeout(resolve, 500));
232
+ } catch {
233
+ }
234
+ cleanupPidFile();
235
+ spinner.succeed("\u670D\u52A1\u5DF2\u505C\u6B62");
236
+ } catch (error) {
237
+ cleanupPidFile();
238
+ spinner.fail(`\u505C\u6B62\u670D\u52A1\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
239
+ }
240
+ } catch (error) {
241
+ spinner.fail(`\u505C\u6B62\u670D\u52A1\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
242
+ }
243
+ }
244
+ __name(stopService, "stopService");
245
+ async function checkStatus() {
246
+ const spinner = (0, import_ora.default)("\u68C0\u67E5\u670D\u52A1\u72B6\u6001...").start();
247
+ try {
248
+ const status = getServiceStatus();
249
+ if (status.running) {
250
+ spinner.succeed("\u670D\u52A1\u72B6\u6001");
251
+ console.log(import_chalk.default.green("\u2705 \u670D\u52A1\u6B63\u5728\u8FD0\u884C"));
252
+ console.log(import_chalk.default.gray(` PID: ${status.pid}`));
253
+ console.log(import_chalk.default.gray(` \u8FD0\u884C\u65F6\u95F4: ${status.uptime}`));
254
+ console.log(import_chalk.default.gray(` \u8FD0\u884C\u6A21\u5F0F: ${status.mode === "daemon" ? "\u540E\u53F0\u6A21\u5F0F" : "\u524D\u53F0\u6A21\u5F0F"}`));
255
+ if (status.mode === "daemon") {
256
+ console.log(import_chalk.default.gray(` \u65E5\u5FD7\u6587\u4EF6: ${LOG_FILE}`));
257
+ }
258
+ } else {
259
+ spinner.succeed("\u670D\u52A1\u72B6\u6001");
260
+ console.log(import_chalk.default.red("\u274C \u670D\u52A1\u672A\u8FD0\u884C"));
261
+ }
262
+ } catch (error) {
263
+ spinner.fail(`\u68C0\u67E5\u72B6\u6001\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
264
+ }
265
+ }
266
+ __name(checkStatus, "checkStatus");
267
+ async function attachService() {
268
+ const spinner = (0, import_ora.default)("\u68C0\u67E5\u670D\u52A1\u72B6\u6001...").start();
269
+ try {
270
+ const status = getServiceStatus();
271
+ if (!status.running) {
272
+ spinner.fail("\u670D\u52A1\u672A\u5728\u8FD0\u884C");
273
+ return;
274
+ }
275
+ if (status.mode !== "daemon") {
276
+ spinner.fail("\u670D\u52A1\u4E0D\u662F\u5728\u540E\u53F0\u6A21\u5F0F\u8FD0\u884C");
277
+ return;
278
+ }
279
+ spinner.succeed("\u8FDE\u63A5\u5230\u540E\u53F0\u670D\u52A1...");
280
+ console.log(import_chalk.default.green(`\u5DF2\u8FDE\u63A5\u5230\u670D\u52A1 (PID: ${status.pid})`));
281
+ console.log(import_chalk.default.gray("\u6309 Ctrl+C \u53EF\u4EE5\u65AD\u5F00\u8FDE\u63A5\uFF08\u4E0D\u4F1A\u505C\u6B62\u670D\u52A1\uFF09"));
282
+ console.log(import_chalk.default.gray("=".repeat(50)));
283
+ if (import_fs.default.existsSync(LOG_FILE)) {
284
+ const { spawn: spawn2 } = await import("child_process");
285
+ const tail = spawn2("tail", ["-f", LOG_FILE], { stdio: "inherit" });
286
+ process.on("SIGINT", () => {
287
+ console.log(import_chalk.default.yellow("\n\u65AD\u5F00\u8FDE\u63A5\uFF0C\u670D\u52A1\u7EE7\u7EED\u5728\u540E\u53F0\u8FD0\u884C"));
288
+ tail.kill();
289
+ process.exit(0);
290
+ });
291
+ tail.on("exit", () => {
292
+ process.exit(0);
293
+ });
294
+ } else {
295
+ console.log(import_chalk.default.yellow("\u65E5\u5FD7\u6587\u4EF6\u4E0D\u5B58\u5728"));
296
+ }
297
+ } catch (error) {
298
+ spinner.fail(`\u8FDE\u63A5\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
299
+ }
300
+ }
301
+ __name(attachService, "attachService");
302
+ async function restartService(daemon = false) {
303
+ console.log(import_chalk.default.blue("\u{1F504} \u91CD\u542F\u670D\u52A1..."));
304
+ await stopService();
305
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
306
+ await startService(daemon);
307
+ }
308
+ __name(restartService, "restartService");
309
+ function showVersion() {
310
+ console.log(import_chalk.default.blue(`xiaozhi v${VERSION}`));
311
+ }
312
+ __name(showVersion, "showVersion");
313
+ function showDetailedInfo() {
314
+ console.log(import_chalk.default.blue(`xiaozhi v${VERSION}`));
315
+ console.log(import_chalk.default.gray("MCP Calculator Service CLI Tool"));
316
+ console.log(import_chalk.default.gray("Built with Node.js and TypeScript"));
317
+ console.log(import_chalk.default.gray(`Node.js: ${process.version}`));
318
+ console.log(import_chalk.default.gray(`Platform: ${process.platform} ${process.arch}`));
319
+ }
320
+ __name(showDetailedInfo, "showDetailedInfo");
321
+ async function initConfig() {
322
+ const spinner = (0, import_ora.default)("\u521D\u59CB\u5316\u914D\u7F6E...").start();
323
+ try {
324
+ if (import_configManager.configManager.configExists()) {
325
+ spinner.warn("\u914D\u7F6E\u6587\u4EF6\u5DF2\u5B58\u5728");
326
+ console.log(import_chalk.default.yellow("\u5982\u9700\u91CD\u65B0\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u5220\u9664\u73B0\u6709\u7684 config.json \u6587\u4EF6"));
327
+ return;
328
+ }
329
+ import_configManager.configManager.initConfig();
330
+ spinner.succeed("\u914D\u7F6E\u6587\u4EF6\u521D\u59CB\u5316\u6210\u529F");
331
+ console.log(import_chalk.default.green("\u2705 \u914D\u7F6E\u6587\u4EF6\u5DF2\u521B\u5EFA: config.json"));
332
+ console.log(import_chalk.default.yellow("\u{1F4DD} \u8BF7\u7F16\u8F91\u914D\u7F6E\u6587\u4EF6\u8BBE\u7F6E\u4F60\u7684 MCP \u7AEF\u70B9:"));
333
+ console.log(import_chalk.default.gray(` \u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84: ${import_configManager.configManager.getConfigPath()}`));
334
+ console.log(import_chalk.default.yellow("\u{1F4A1} \u6216\u8005\u4F7F\u7528\u547D\u4EE4\u8BBE\u7F6E:"));
335
+ console.log(import_chalk.default.gray(" xiaozhi config mcpEndpoint <your-endpoint-url>"));
336
+ } catch (error) {
337
+ spinner.fail(`\u521D\u59CB\u5316\u914D\u7F6E\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
338
+ }
339
+ }
340
+ __name(initConfig, "initConfig");
341
+ async function configCommand(key, value) {
342
+ const spinner = (0, import_ora.default)("\u66F4\u65B0\u914D\u7F6E...").start();
343
+ try {
344
+ if (!import_configManager.configManager.configExists()) {
345
+ spinner.fail("\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728");
346
+ console.log(import_chalk.default.yellow('\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u8FD0\u884C "xiaozhi init" \u521D\u59CB\u5316\u914D\u7F6E'));
347
+ return;
348
+ }
349
+ if (!value) {
350
+ spinner.text = "\u8BFB\u53D6\u914D\u7F6E...";
351
+ const config = import_configManager.configManager.getConfig();
352
+ switch (key) {
353
+ case "mcpEndpoint":
354
+ spinner.succeed("\u914D\u7F6E\u4FE1\u606F");
355
+ console.log(import_chalk.default.green(`MCP \u7AEF\u70B9: ${config.mcpEndpoint}`));
356
+ break;
357
+ case "mcpServers":
358
+ spinner.succeed("\u914D\u7F6E\u4FE1\u606F");
359
+ console.log(import_chalk.default.green("MCP \u670D\u52A1:"));
360
+ for (const [name, serverConfig] of Object.entries(config.mcpServers)) {
361
+ console.log(import_chalk.default.gray(` ${name}: ${serverConfig.command} ${serverConfig.args.join(" ")}`));
362
+ }
363
+ break;
364
+ default:
365
+ spinner.fail(`\u672A\u77E5\u7684\u914D\u7F6E\u9879: ${key}`);
366
+ console.log(import_chalk.default.yellow("\u652F\u6301\u7684\u914D\u7F6E\u9879: mcpEndpoint, mcpServers"));
367
+ return;
368
+ }
369
+ } else {
370
+ switch (key) {
371
+ case "mcpEndpoint":
372
+ import_configManager.configManager.updateMcpEndpoint(value);
373
+ spinner.succeed(`MCP \u7AEF\u70B9\u5DF2\u66F4\u65B0\u4E3A: ${value}`);
374
+ break;
375
+ default:
376
+ spinner.fail(`\u914D\u7F6E\u9879 ${key} \u4E0D\u652F\u6301\u901A\u8FC7\u547D\u4EE4\u884C\u8BBE\u7F6E`);
377
+ console.log(import_chalk.default.yellow("\u652F\u6301\u8BBE\u7F6E\u7684\u914D\u7F6E\u9879: mcpEndpoint"));
378
+ return;
379
+ }
380
+ }
381
+ } catch (error) {
382
+ spinner.fail(`\u914D\u7F6E\u64CD\u4F5C\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`);
383
+ }
384
+ }
385
+ __name(configCommand, "configCommand");
386
+ function showHelp() {
387
+ console.log(import_chalk.default.blue.bold("xiaozhi - MCP Calculator Service CLI"));
388
+ console.log();
389
+ console.log(import_chalk.default.yellow("\u4F7F\u7528\u65B9\u6CD5:"));
390
+ console.log(" xiaozhi <command> [options]");
391
+ console.log();
392
+ console.log(import_chalk.default.yellow("\u547D\u4EE4:"));
393
+ console.log(" init \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6");
394
+ console.log(" config <key> [value] \u67E5\u770B\u6216\u8BBE\u7F6E\u914D\u7F6E");
395
+ console.log(" start [--daemon] \u542F\u52A8\u670D\u52A1 (--daemon \u540E\u53F0\u8FD0\u884C)");
396
+ console.log(" stop \u505C\u6B62\u670D\u52A1");
397
+ console.log(" status \u68C0\u67E5\u670D\u52A1\u72B6\u6001");
398
+ console.log(" attach \u8FDE\u63A5\u5230\u540E\u53F0\u670D\u52A1\u67E5\u770B\u65E5\u5FD7");
399
+ console.log(" restart [--daemon] \u91CD\u542F\u670D\u52A1 (--daemon \u540E\u53F0\u8FD0\u884C)");
400
+ console.log();
401
+ console.log(import_chalk.default.yellow("\u9009\u9879:"));
402
+ console.log(" -v, --version \u663E\u793A\u7248\u672C\u4FE1\u606F");
403
+ console.log(" -V \u663E\u793A\u8BE6\u7EC6\u4FE1\u606F");
404
+ console.log(" -h, --help \u663E\u793A\u5E2E\u52A9\u4FE1\u606F");
405
+ console.log();
406
+ console.log(import_chalk.default.yellow("\u914D\u7F6E\u793A\u4F8B:"));
407
+ console.log(" xiaozhi init # \u521D\u59CB\u5316\u914D\u7F6E");
408
+ console.log(" xiaozhi config mcpEndpoint # \u67E5\u770B MCP \u7AEF\u70B9");
409
+ console.log(" xiaozhi config mcpEndpoint wss://... # \u8BBE\u7F6E MCP \u7AEF\u70B9");
410
+ console.log();
411
+ console.log(import_chalk.default.yellow("\u670D\u52A1\u793A\u4F8B:"));
412
+ console.log(" xiaozhi start # \u524D\u53F0\u542F\u52A8\u670D\u52A1");
413
+ console.log(" xiaozhi start --daemon # \u540E\u53F0\u542F\u52A8\u670D\u52A1");
414
+ console.log(" xiaozhi status # \u68C0\u67E5\u670D\u52A1\u72B6\u6001");
415
+ console.log(" xiaozhi attach # \u67E5\u770B\u540E\u53F0\u670D\u52A1\u65E5\u5FD7");
416
+ console.log(" xiaozhi stop # \u505C\u6B62\u670D\u52A1");
417
+ }
418
+ __name(showHelp, "showHelp");
419
+ program.name("xiaozhi").description("MCP Calculator Service CLI Tool").version(VERSION, "-v, --version", "\u663E\u793A\u7248\u672C\u4FE1\u606F").helpOption("-h, --help", "\u663E\u793A\u5E2E\u52A9\u4FE1\u606F");
420
+ program.command("init").description("\u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6").action(async () => {
421
+ await initConfig();
422
+ });
423
+ program.command("config <key> [value]").description("\u67E5\u770B\u6216\u8BBE\u7F6E\u914D\u7F6E").action(async (key, value) => {
424
+ await configCommand(key, value);
425
+ });
426
+ program.command("start").description("\u542F\u52A8\u670D\u52A1").option("-d, --daemon", "\u5728\u540E\u53F0\u8FD0\u884C\u670D\u52A1").action(async (options) => {
427
+ await startService(options.daemon);
428
+ });
429
+ program.command("stop").description("\u505C\u6B62\u670D\u52A1").action(async () => {
430
+ await stopService();
431
+ });
432
+ program.command("status").description("\u68C0\u67E5\u670D\u52A1\u72B6\u6001").action(async () => {
433
+ await checkStatus();
434
+ });
435
+ program.command("attach").description("\u8FDE\u63A5\u5230\u540E\u53F0\u670D\u52A1\u67E5\u770B\u65E5\u5FD7").action(async () => {
436
+ await attachService();
437
+ });
438
+ program.command("restart").description("\u91CD\u542F\u670D\u52A1").option("-d, --daemon", "\u5728\u540E\u53F0\u8FD0\u884C\u670D\u52A1").action(async (options) => {
439
+ await restartService(options.daemon);
440
+ });
441
+ program.option("-V", "\u663E\u793A\u8BE6\u7EC6\u4FE1\u606F").action((options) => {
442
+ if (options.V) {
443
+ showDetailedInfo();
444
+ process.exit(0);
445
+ }
446
+ });
447
+ if (process.argv.length <= 2) {
448
+ showHelp();
449
+ process.exit(0);
450
+ }
451
+ program.parse(process.argv);
452
+ //# sourceMappingURL=cli.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { spawn, ChildProcess } from 'child_process';\nimport fs from 'fs';\nimport path from 'path';\nimport os from 'os';\nimport { configManager } from './configManager.js';\n\nconst program = new Command();\nconst VERSION = '0.0.1';\nconst SERVICE_NAME = 'xiaozhi-mcp-service';\n\n// PID 文件路径\nconst PID_FILE = path.join(os.tmpdir(), `${SERVICE_NAME}.pid`);\nconst LOG_FILE = path.join(os.tmpdir(), `${SERVICE_NAME}.log`);\n\ninterface ServiceStatus {\n running: boolean;\n pid?: number;\n uptime?: string;\n mode?: 'foreground' | 'daemon';\n}\n\n/**\n * 获取服务状态\n */\nfunction getServiceStatus(): ServiceStatus {\n try {\n if (!fs.existsSync(PID_FILE)) {\n return { running: false };\n }\n\n const pidContent = fs.readFileSync(PID_FILE, 'utf8').trim();\n const [pidStr, startTime, mode] = pidContent.split('|');\n const pid = parseInt(pidStr);\n\n if (isNaN(pid)) {\n // PID 文件损坏,删除它\n fs.unlinkSync(PID_FILE);\n return { running: false };\n }\n\n // 检查进程是否还在运行\n try {\n process.kill(pid, 0); // 发送信号 0 来检查进程是否存在\n\n // 计算运行时间\n const start = parseInt(startTime);\n const uptime = formatUptime(Date.now() - start);\n\n return {\n running: true,\n pid,\n uptime,\n mode: (mode as 'foreground' | 'daemon') || 'foreground'\n };\n } catch (error) {\n // 进程不存在,删除 PID 文件\n fs.unlinkSync(PID_FILE);\n return { running: false };\n }\n } catch (error) {\n return { running: false };\n }\n}\n\n/**\n * 格式化运行时间\n */\nfunction formatUptime(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) {\n return `${days}天 ${hours % 24}小时 ${minutes % 60}分钟`;\n } else if (hours > 0) {\n return `${hours}小时 ${minutes % 60}分钟`;\n } else if (minutes > 0) {\n return `${minutes}分钟 ${seconds % 60}秒`;\n } else {\n return `${seconds}秒`;\n }\n}\n\n/**\n * 保存 PID 信息\n */\nfunction savePidInfo(pid: number, mode: 'foreground' | 'daemon') {\n const pidInfo = `${pid}|${Date.now()}|${mode}`;\n fs.writeFileSync(PID_FILE, pidInfo);\n}\n\n/**\n * 清理 PID 文件\n */\nfunction cleanupPidFile() {\n try {\n if (fs.existsSync(PID_FILE)) {\n fs.unlinkSync(PID_FILE);\n }\n } catch (error) {\n // 忽略清理错误\n }\n}\n\n/**\n * 检查配置文件和环境\n */\nfunction checkEnvironment(): boolean {\n // 首先检查配置文件是否存在\n if (!configManager.configExists()) {\n console.error(chalk.red('❌ 错误: 配置文件不存在'));\n console.log(chalk.yellow('💡 提示: 请运行 \"xiaozhi init\" 初始化配置'));\n return false;\n }\n\n try {\n // 检查配置是否有效\n const endpoint = configManager.getMcpEndpoint();\n if (!endpoint || endpoint.includes('<请填写')) {\n console.error(chalk.red('❌ 错误: MCP 端点未配置'));\n console.log(chalk.yellow('💡 提示: 请运行 \"xiaozhi config mcpEndpoint <your-endpoint-url>\" 设置端点'));\n return false;\n }\n return true;\n } catch (error) {\n console.error(chalk.red(`❌ 错误: 配置文件无效 - ${error instanceof Error ? error.message : String(error)}`));\n console.log(chalk.yellow('💡 提示: 请运行 \"xiaozhi init\" 重新初始化配置'));\n return false;\n }\n}\n\n/**\n * 获取服务启动命令和参数\n */\nfunction getServiceCommand(): { command: string; args: string[]; cwd: string } {\n // 获取当前脚本所在目录\n const scriptDir = __dirname;\n\n // 检查是否在开发环境(js-demo/dist)还是全局安装环境\n let distDir: string;\n if (scriptDir.includes('js-demo/dist')) {\n // 开发环境\n distDir = scriptDir;\n } else {\n // 全局安装环境,需要找到实际的项目目录\n // 通常全局安装后,脚本在 node_modules/.bin 或类似位置\n // 我们需要找到实际的 dist 目录\n const possiblePaths = [\n path.join(scriptDir, '..', 'js-demo', 'dist'),\n path.join(scriptDir, '..', '..', 'js-demo', 'dist'),\n path.join(scriptDir, '..', '..', '..', 'js-demo', 'dist'),\n path.join(process.cwd(), 'js-demo', 'dist'),\n path.join(process.cwd(), 'dist')\n ];\n\n distDir = possiblePaths.find(p =>\n fs.existsSync(path.join(p, 'mcpPipe.cjs')) &&\n fs.existsSync(path.join(p, 'mcpServerProxy.cjs'))\n ) || scriptDir;\n }\n\n return {\n command: 'node',\n args: ['mcpPipe.cjs', 'mcpServerProxy.cjs'],\n cwd: distDir\n };\n}\n\n/**\n * 启动服务\n */\nasync function startService(daemon: boolean = false): Promise<void> {\n const spinner = ora('检查服务状态...').start();\n\n try {\n // 检查服务是否已经在运行\n const status = getServiceStatus();\n if (status.running) {\n spinner.fail(`服务已经在运行 (PID: ${status.pid})`);\n return;\n }\n\n // 检查环境变量\n spinner.text = '检查环境配置...';\n if (!checkEnvironment()) {\n spinner.fail('环境配置检查失败');\n return;\n }\n\n // 获取启动命令\n const { command, args, cwd } = getServiceCommand();\n\n spinner.text = `启动服务 (${daemon ? '后台模式' : '前台模式'})...`;\n\n if (daemon) {\n // 后台模式\n const child = spawn(command, args, {\n cwd,\n detached: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env }\n });\n\n // 保存 PID 信息\n savePidInfo(child.pid!, 'daemon');\n\n // 设置日志输出\n const logStream = fs.createWriteStream(LOG_FILE, { flags: 'a' });\n child.stdout?.pipe(logStream);\n child.stderr?.pipe(logStream);\n\n // 分离进程\n child.unref();\n\n spinner.succeed(`服务已在后台启动 (PID: ${child.pid})`);\n console.log(chalk.gray(`日志文件: ${LOG_FILE}`));\n console.log(chalk.gray(`使用 'xiaozhi attach' 可以查看实时日志`));\n } else {\n // 前台模式\n spinner.succeed('服务启动中...');\n\n const child = spawn(command, args, {\n cwd,\n stdio: 'inherit',\n env: { ...process.env }\n });\n\n // 保存 PID 信息\n savePidInfo(child.pid!, 'foreground');\n\n // 处理进程退出\n child.on('exit', (code, signal) => {\n cleanupPidFile();\n if (code !== 0) {\n console.log(chalk.red(`\\n服务异常退出 (代码: ${code}, 信号: ${signal})`));\n } else {\n console.log(chalk.green('\\n服务已停止'));\n }\n });\n\n // 处理中断信号\n process.on('SIGINT', () => {\n console.log(chalk.yellow('\\n正在停止服务...'));\n child.kill('SIGTERM');\n });\n\n process.on('SIGTERM', () => {\n child.kill('SIGTERM');\n });\n }\n } catch (error) {\n spinner.fail(`启动服务失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * 停止服务\n */\nasync function stopService(): Promise<void> {\n const spinner = ora('检查服务状态...').start();\n\n try {\n const status = getServiceStatus();\n\n if (!status.running) {\n spinner.warn('服务未在运行');\n return;\n }\n\n spinner.text = `停止服务 (PID: ${status.pid})...`;\n\n try {\n // 尝试优雅停止\n process.kill(status.pid!, 'SIGTERM');\n\n // 等待进程停止\n let attempts = 0;\n const maxAttempts = 30; // 3秒超时\n\n while (attempts < maxAttempts) {\n await new Promise(resolve => setTimeout(resolve, 100));\n\n try {\n process.kill(status.pid!, 0);\n attempts++;\n } catch {\n // 进程已停止\n break;\n }\n }\n\n // 检查是否还在运行\n try {\n process.kill(status.pid!, 0);\n // 如果还在运行,强制停止\n spinner.text = '强制停止服务...';\n process.kill(status.pid!, 'SIGKILL');\n await new Promise(resolve => setTimeout(resolve, 500));\n } catch {\n // 进程已停止\n }\n\n cleanupPidFile();\n spinner.succeed('服务已停止');\n\n } catch (error) {\n cleanupPidFile();\n spinner.fail(`停止服务失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n } catch (error) {\n spinner.fail(`停止服务失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * 检查服务状态\n */\nasync function checkStatus(): Promise<void> {\n const spinner = ora('检查服务状态...').start();\n\n try {\n const status = getServiceStatus();\n\n if (status.running) {\n spinner.succeed('服务状态');\n console.log(chalk.green('✅ 服务正在运行'));\n console.log(chalk.gray(` PID: ${status.pid}`));\n console.log(chalk.gray(` 运行时间: ${status.uptime}`));\n console.log(chalk.gray(` 运行模式: ${status.mode === 'daemon' ? '后台模式' : '前台模式'}`));\n\n if (status.mode === 'daemon') {\n console.log(chalk.gray(` 日志文件: ${LOG_FILE}`));\n }\n } else {\n spinner.succeed('服务状态');\n console.log(chalk.red('❌ 服务未运行'));\n }\n } catch (error) {\n spinner.fail(`检查状态失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * 附加到后台服务\n */\nasync function attachService(): Promise<void> {\n const spinner = ora('检查服务状态...').start();\n\n try {\n const status = getServiceStatus();\n\n if (!status.running) {\n spinner.fail('服务未在运行');\n return;\n }\n\n if (status.mode !== 'daemon') {\n spinner.fail('服务不是在后台模式运行');\n return;\n }\n\n spinner.succeed('连接到后台服务...');\n console.log(chalk.green(`已连接到服务 (PID: ${status.pid})`));\n console.log(chalk.gray('按 Ctrl+C 可以断开连接(不会停止服务)'));\n console.log(chalk.gray('=' .repeat(50)));\n\n // 显示日志文件内容\n if (fs.existsSync(LOG_FILE)) {\n // 显示最后100行日志\n const { spawn } = await import('child_process');\n const tail = spawn('tail', ['-f', LOG_FILE], { stdio: 'inherit' });\n\n // 处理中断信号\n process.on('SIGINT', () => {\n console.log(chalk.yellow('\\n断开连接,服务继续在后台运行'));\n tail.kill();\n process.exit(0);\n });\n\n tail.on('exit', () => {\n process.exit(0);\n });\n } else {\n console.log(chalk.yellow('日志文件不存在'));\n }\n\n } catch (error) {\n spinner.fail(`连接失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * 重启服务\n */\nasync function restartService(daemon: boolean = false): Promise<void> {\n console.log(chalk.blue('🔄 重启服务...'));\n\n // 先停止服务\n await stopService();\n\n // 等待一下确保完全停止\n await new Promise(resolve => setTimeout(resolve, 1000));\n\n // 重新启动服务\n await startService(daemon);\n}\n\n/**\n * 显示版本信息\n */\nfunction showVersion(): void {\n console.log(chalk.blue(`xiaozhi v${VERSION}`));\n}\n\n/**\n * 显示详细信息\n */\nfunction showDetailedInfo(): void {\n console.log(chalk.blue(`xiaozhi v${VERSION}`));\n console.log(chalk.gray('MCP Calculator Service CLI Tool'));\n console.log(chalk.gray('Built with Node.js and TypeScript'));\n console.log(chalk.gray(`Node.js: ${process.version}`));\n console.log(chalk.gray(`Platform: ${process.platform} ${process.arch}`));\n}\n\n/**\n * 初始化配置\n */\nasync function initConfig(): Promise<void> {\n const spinner = ora('初始化配置...').start();\n\n try {\n if (configManager.configExists()) {\n spinner.warn('配置文件已存在');\n console.log(chalk.yellow('如需重新初始化,请先删除现有的 config.json 文件'));\n return;\n }\n\n configManager.initConfig();\n spinner.succeed('配置文件初始化成功');\n\n console.log(chalk.green('✅ 配置文件已创建: config.json'));\n console.log(chalk.yellow('📝 请编辑配置文件设置你的 MCP 端点:'));\n console.log(chalk.gray(` 配置文件路径: ${configManager.getConfigPath()}`));\n console.log(chalk.yellow('💡 或者使用命令设置:'));\n console.log(chalk.gray(' xiaozhi config mcpEndpoint <your-endpoint-url>'));\n } catch (error) {\n spinner.fail(`初始化配置失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * 配置管理命令\n */\nasync function configCommand(key: string, value?: string): Promise<void> {\n const spinner = ora('更新配置...').start();\n\n try {\n if (!configManager.configExists()) {\n spinner.fail('配置文件不存在');\n console.log(chalk.yellow('💡 提示: 请先运行 \"xiaozhi init\" 初始化配置'));\n return;\n }\n\n if (!value) {\n // 显示配置值\n spinner.text = '读取配置...';\n const config = configManager.getConfig();\n\n switch (key) {\n case 'mcpEndpoint':\n spinner.succeed('配置信息');\n console.log(chalk.green(`MCP 端点: ${config.mcpEndpoint}`));\n break;\n case 'mcpServers':\n spinner.succeed('配置信息');\n console.log(chalk.green('MCP 服务:'));\n for (const [name, serverConfig] of Object.entries(config.mcpServers)) {\n console.log(chalk.gray(` ${name}: ${serverConfig.command} ${serverConfig.args.join(' ')}`));\n }\n break;\n default:\n spinner.fail(`未知的配置项: ${key}`);\n console.log(chalk.yellow('支持的配置项: mcpEndpoint, mcpServers'));\n return;\n }\n } else {\n // 设置配置值\n switch (key) {\n case 'mcpEndpoint':\n configManager.updateMcpEndpoint(value);\n spinner.succeed(`MCP 端点已更新为: ${value}`);\n break;\n default:\n spinner.fail(`配置项 ${key} 不支持通过命令行设置`);\n console.log(chalk.yellow('支持设置的配置项: mcpEndpoint'));\n return;\n }\n }\n } catch (error) {\n spinner.fail(`配置操作失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * 显示帮助信息\n */\nfunction showHelp(): void {\n console.log(chalk.blue.bold('xiaozhi - MCP Calculator Service CLI'));\n console.log();\n console.log(chalk.yellow('使用方法:'));\n console.log(' xiaozhi <command> [options]');\n console.log();\n console.log(chalk.yellow('命令:'));\n console.log(' init 初始化配置文件');\n console.log(' config <key> [value] 查看或设置配置');\n console.log(' start [--daemon] 启动服务 (--daemon 后台运行)');\n console.log(' stop 停止服务');\n console.log(' status 检查服务状态');\n console.log(' attach 连接到后台服务查看日志');\n console.log(' restart [--daemon] 重启服务 (--daemon 后台运行)');\n console.log();\n console.log(chalk.yellow('选项:'));\n console.log(' -v, --version 显示版本信息');\n console.log(' -V 显示详细信息');\n console.log(' -h, --help 显示帮助信息');\n console.log();\n console.log(chalk.yellow('配置示例:'));\n console.log(' xiaozhi init # 初始化配置');\n console.log(' xiaozhi config mcpEndpoint # 查看 MCP 端点');\n console.log(' xiaozhi config mcpEndpoint wss://... # 设置 MCP 端点');\n console.log();\n console.log(chalk.yellow('服务示例:'));\n console.log(' xiaozhi start # 前台启动服务');\n console.log(' xiaozhi start --daemon # 后台启动服务');\n console.log(' xiaozhi status # 检查服务状态');\n console.log(' xiaozhi attach # 查看后台服务日志');\n console.log(' xiaozhi stop # 停止服务');\n}\n\n// 配置 Commander 程序\nprogram\n .name('xiaozhi')\n .description('MCP Calculator Service CLI Tool')\n .version(VERSION, '-v, --version', '显示版本信息')\n .helpOption('-h, --help', '显示帮助信息');\n\n// init 命令\nprogram\n .command('init')\n .description('初始化配置文件')\n .action(async () => {\n await initConfig();\n });\n\n// config 命令\nprogram\n .command('config <key> [value]')\n .description('查看或设置配置')\n .action(async (key, value) => {\n await configCommand(key, value);\n });\n\n// start 命令\nprogram\n .command('start')\n .description('启动服务')\n .option('-d, --daemon', '在后台运行服务')\n .action(async (options) => {\n await startService(options.daemon);\n });\n\n// stop 命令\nprogram\n .command('stop')\n .description('停止服务')\n .action(async () => {\n await stopService();\n });\n\n// status 命令\nprogram\n .command('status')\n .description('检查服务状态')\n .action(async () => {\n await checkStatus();\n });\n\n// attach 命令\nprogram\n .command('attach')\n .description('连接到后台服务查看日志')\n .action(async () => {\n await attachService();\n });\n\n// restart 命令\nprogram\n .command('restart')\n .description('重启服务')\n .option('-d, --daemon', '在后台运行服务')\n .action(async (options) => {\n await restartService(options.daemon);\n });\n\n// -V 选项 (详细信息)\nprogram\n .option('-V', '显示详细信息')\n .action((options) => {\n if (options.V) {\n showDetailedInfo();\n process.exit(0);\n }\n });\n\n// 处理无参数情况,显示帮助\nif (process.argv.length <= 2) {\n showHelp();\n process.exit(0);\n}\n\n// 解析命令行参数\nprogram.parse(process.argv);"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAEA,uBAAwB;AACxB,mBAAkB;AAClB,iBAAgB;AAChB,2BAAoC;AACpC,gBAAe;AACf,kBAAiB;AACjB,gBAAe;AACf,2BAA8B;AAE9B,MAAM,UAAU,IAAI,yBAAQ;AAC5B,MAAM,UAAU;AAChB,MAAM,eAAe;AAGrB,MAAM,WAAW,YAAAA,QAAK,KAAK,UAAAC,QAAG,OAAO,GAAG,GAAG,YAAY,MAAM;AAC7D,MAAM,WAAW,YAAAD,QAAK,KAAK,UAAAC,QAAG,OAAO,GAAG,GAAG,YAAY,MAAM;AAY7D,SAAS,mBAAkC;AACvC,MAAI;AACA,QAAI,CAAC,UAAAC,QAAG,WAAW,QAAQ,GAAG;AAC1B,aAAO,EAAE,SAAS,MAAM;AAAA,IAC5B;AAEA,UAAM,aAAa,UAAAA,QAAG,aAAa,UAAU,MAAM,EAAE,KAAK;AAC1D,UAAM,CAAC,QAAQ,WAAW,IAAI,IAAI,WAAW,MAAM,GAAG;AACtD,UAAM,MAAM,SAAS,MAAM;AAE3B,QAAI,MAAM,GAAG,GAAG;AAEZ,gBAAAA,QAAG,WAAW,QAAQ;AACtB,aAAO,EAAE,SAAS,MAAM;AAAA,IAC5B;AAGA,QAAI;AACA,cAAQ,KAAK,KAAK,CAAC;AAGnB,YAAM,QAAQ,SAAS,SAAS;AAChC,YAAM,SAAS,aAAa,KAAK,IAAI,IAAI,KAAK;AAE9C,aAAO;AAAA,QACH,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,MAAO,QAAoC;AAAA,MAC/C;AAAA,IACJ,SAAS,OAAO;AAEZ,gBAAAA,QAAG,WAAW,QAAQ;AACtB,aAAO,EAAE,SAAS,MAAM;AAAA,IAC5B;AAAA,EACJ,SAAS,OAAO;AACZ,WAAO,EAAE,SAAS,MAAM;AAAA,EAC5B;AACJ;AAtCS;AA2CT,SAAS,aAAa,IAAoB;AACtC,QAAM,UAAU,KAAK,MAAM,KAAK,GAAI;AACpC,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,QAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AACrC,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAElC,MAAI,OAAO,GAAG;AACV,WAAO,GAAG,IAAI,UAAK,QAAQ,EAAE,gBAAM,UAAU,EAAE;AAAA,EACnD,WAAW,QAAQ,GAAG;AAClB,WAAO,GAAG,KAAK,gBAAM,UAAU,EAAE;AAAA,EACrC,WAAW,UAAU,GAAG;AACpB,WAAO,GAAG,OAAO,gBAAM,UAAU,EAAE;AAAA,EACvC,OAAO;AACH,WAAO,GAAG,OAAO;AAAA,EACrB;AACJ;AAfS;AAoBT,SAAS,YAAY,KAAa,MAA+B;AAC7D,QAAM,UAAU,GAAG,GAAG,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI;AAC5C,YAAAA,QAAG,cAAc,UAAU,OAAO;AACtC;AAHS;AAQT,SAAS,iBAAiB;AACtB,MAAI;AACA,QAAI,UAAAA,QAAG,WAAW,QAAQ,GAAG;AACzB,gBAAAA,QAAG,WAAW,QAAQ;AAAA,IAC1B;AAAA,EACJ,SAAS,OAAO;AAAA,EAEhB;AACJ;AARS;AAaT,SAAS,mBAA4B;AAEjC,MAAI,CAAC,mCAAc,aAAa,GAAG;AAC/B,YAAQ,MAAM,aAAAC,QAAM,IAAI,iEAAe,CAAC;AACxC,YAAQ,IAAI,aAAAA,QAAM,OAAO,0FAAiC,CAAC;AAC3D,WAAO;AAAA,EACX;AAEA,MAAI;AAEA,UAAM,WAAW,mCAAc,eAAe;AAC9C,QAAI,CAAC,YAAY,SAAS,SAAS,qBAAM,GAAG;AACxC,cAAQ,MAAM,aAAAA,QAAM,IAAI,yDAAiB,CAAC;AAC1C,cAAQ,IAAI,aAAAA,QAAM,OAAO,sHAAkE,CAAC;AAC5F,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX,SAAS,OAAO;AACZ,YAAQ,MAAM,aAAAA,QAAM,IAAI,+DAAkB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE,CAAC;AACnG,YAAQ,IAAI,aAAAA,QAAM,OAAO,sGAAmC,CAAC;AAC7D,WAAO;AAAA,EACX;AACJ;AAtBS;AA2BT,SAAS,oBAAsE;AAE3E,QAAM,YAAY;AAGlB,MAAI;AACJ,MAAI,UAAU,SAAS,cAAc,GAAG;AAEpC,cAAU;AAAA,EACd,OAAO;AAIH,UAAM,gBAAgB;AAAA,MAClB,YAAAH,QAAK,KAAK,WAAW,MAAM,WAAW,MAAM;AAAA,MAC5C,YAAAA,QAAK,KAAK,WAAW,MAAM,MAAM,WAAW,MAAM;AAAA,MAClD,YAAAA,QAAK,KAAK,WAAW,MAAM,MAAM,MAAM,WAAW,MAAM;AAAA,MACxD,YAAAA,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,MAAM;AAAA,MAC1C,YAAAA,QAAK,KAAK,QAAQ,IAAI,GAAG,MAAM;AAAA,IACnC;AAEA,cAAU,cAAc;AAAA,MAAK,OACzB,UAAAE,QAAG,WAAW,YAAAF,QAAK,KAAK,GAAG,aAAa,CAAC,KACzC,UAAAE,QAAG,WAAW,YAAAF,QAAK,KAAK,GAAG,oBAAoB,CAAC;AAAA,IACpD,KAAK;AAAA,EACT;AAEA,SAAO;AAAA,IACH,SAAS;AAAA,IACT,MAAM,CAAC,eAAe,oBAAoB;AAAA,IAC1C,KAAK;AAAA,EACT;AACJ;AAhCS;AAqCT,eAAe,aAAa,SAAkB,OAAsB;AAChE,QAAM,cAAU,WAAAI,SAAI,yCAAW,EAAE,MAAM;AAEvC,MAAI;AAEA,UAAM,SAAS,iBAAiB;AAChC,QAAI,OAAO,SAAS;AAChB,cAAQ,KAAK,oDAAiB,OAAO,GAAG,GAAG;AAC3C;AAAA,IACJ;AAGA,YAAQ,OAAO;AACf,QAAI,CAAC,iBAAiB,GAAG;AACrB,cAAQ,KAAK,kDAAU;AACvB;AAAA,IACJ;AAGA,UAAM,EAAE,SAAS,MAAM,IAAI,IAAI,kBAAkB;AAEjD,YAAQ,OAAO,6BAAS,SAAS,6BAAS,0BAAM;AAEhD,QAAI,QAAQ;AAER,YAAM,YAAQ,4BAAM,SAAS,MAAM;AAAA,QAC/B;AAAA,QACA,UAAU;AAAA,QACV,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,QAChC,KAAK,EAAE,GAAG,QAAQ,IAAI;AAAA,MAC1B,CAAC;AAGD,kBAAY,MAAM,KAAM,QAAQ;AAGhC,YAAM,YAAY,UAAAF,QAAG,kBAAkB,UAAU,EAAE,OAAO,IAAI,CAAC;AAC/D,YAAM,QAAQ,KAAK,SAAS;AAC5B,YAAM,QAAQ,KAAK,SAAS;AAG5B,YAAM,MAAM;AAEZ,cAAQ,QAAQ,0DAAkB,MAAM,GAAG,GAAG;AAC9C,cAAQ,IAAI,aAAAC,QAAM,KAAK,6BAAS,QAAQ,EAAE,CAAC;AAC3C,cAAQ,IAAI,aAAAA,QAAM,KAAK,gFAA8B,CAAC;AAAA,IAC1D,OAAO;AAEH,cAAQ,QAAQ,mCAAU;AAE1B,YAAM,YAAQ,4BAAM,SAAS,MAAM;AAAA,QAC/B;AAAA,QACA,OAAO;AAAA,QACP,KAAK,EAAE,GAAG,QAAQ,IAAI;AAAA,MAC1B,CAAC;AAGD,kBAAY,MAAM,KAAM,YAAY;AAGpC,YAAM,GAAG,QAAQ,CAAC,MAAM,WAAW;AAC/B,uBAAe;AACf,YAAI,SAAS,GAAG;AACZ,kBAAQ,IAAI,aAAAA,QAAM,IAAI;AAAA,sDAAiB,IAAI,mBAAS,MAAM,GAAG,CAAC;AAAA,QAClE,OAAO;AACH,kBAAQ,IAAI,aAAAA,QAAM,MAAM,kCAAS,CAAC;AAAA,QACtC;AAAA,MACJ,CAAC;AAGD,cAAQ,GAAG,UAAU,MAAM;AACvB,gBAAQ,IAAI,aAAAA,QAAM,OAAO,2CAAa,CAAC;AACvC,cAAM,KAAK,SAAS;AAAA,MACxB,CAAC;AAED,cAAQ,GAAG,WAAW,MAAM;AACxB,cAAM,KAAK,SAAS;AAAA,MACxB,CAAC;AAAA,IACL;AAAA,EACJ,SAAS,OAAO;AACZ,YAAQ,KAAK,yCAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,EACpF;AACJ;AAlFe;AAuFf,eAAe,cAA6B;AACxC,QAAM,cAAU,WAAAC,SAAI,yCAAW,EAAE,MAAM;AAEvC,MAAI;AACA,UAAM,SAAS,iBAAiB;AAEhC,QAAI,CAAC,OAAO,SAAS;AACjB,cAAQ,KAAK,sCAAQ;AACrB;AAAA,IACJ;AAEA,YAAQ,OAAO,kCAAc,OAAO,GAAG;AAEvC,QAAI;AAEA,cAAQ,KAAK,OAAO,KAAM,SAAS;AAGnC,UAAI,WAAW;AACf,YAAM,cAAc;AAEpB,aAAO,WAAW,aAAa;AAC3B,cAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAG,CAAC;AAErD,YAAI;AACA,kBAAQ,KAAK,OAAO,KAAM,CAAC;AAC3B;AAAA,QACJ,QAAQ;AAEJ;AAAA,QACJ;AAAA,MACJ;AAGA,UAAI;AACA,gBAAQ,KAAK,OAAO,KAAM,CAAC;AAE3B,gBAAQ,OAAO;AACf,gBAAQ,KAAK,OAAO,KAAM,SAAS;AACnC,cAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAG,CAAC;AAAA,MACzD,QAAQ;AAAA,MAER;AAEA,qBAAe;AACf,cAAQ,QAAQ,gCAAO;AAAA,IAE3B,SAAS,OAAO;AACZ,qBAAe;AACf,cAAQ,KAAK,yCAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,IACpF;AAAA,EACJ,SAAS,OAAO;AACZ,YAAQ,KAAK,yCAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,EACpF;AACJ;AAtDe;AA2Df,eAAe,cAA6B;AACxC,QAAM,cAAU,WAAAA,SAAI,yCAAW,EAAE,MAAM;AAEvC,MAAI;AACA,UAAM,SAAS,iBAAiB;AAEhC,QAAI,OAAO,SAAS;AAChB,cAAQ,QAAQ,0BAAM;AACtB,cAAQ,IAAI,aAAAD,QAAM,MAAM,6CAAU,CAAC;AACnC,cAAQ,IAAI,aAAAA,QAAM,KAAK,WAAW,OAAO,GAAG,EAAE,CAAC;AAC/C,cAAQ,IAAI,aAAAA,QAAM,KAAK,gCAAY,OAAO,MAAM,EAAE,CAAC;AACnD,cAAQ,IAAI,aAAAA,QAAM,KAAK,gCAAY,OAAO,SAAS,WAAW,6BAAS,0BAAM,EAAE,CAAC;AAEhF,UAAI,OAAO,SAAS,UAAU;AAC1B,gBAAQ,IAAI,aAAAA,QAAM,KAAK,gCAAY,QAAQ,EAAE,CAAC;AAAA,MAClD;AAAA,IACJ,OAAO;AACH,cAAQ,QAAQ,0BAAM;AACtB,cAAQ,IAAI,aAAAA,QAAM,IAAI,uCAAS,CAAC;AAAA,IACpC;AAAA,EACJ,SAAS,OAAO;AACZ,YAAQ,KAAK,yCAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,EACpF;AACJ;AAvBe;AA4Bf,eAAe,gBAA+B;AAC1C,QAAM,cAAU,WAAAC,SAAI,yCAAW,EAAE,MAAM;AAEvC,MAAI;AACA,UAAM,SAAS,iBAAiB;AAEhC,QAAI,CAAC,OAAO,SAAS;AACjB,cAAQ,KAAK,sCAAQ;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,UAAU;AAC1B,cAAQ,KAAK,oEAAa;AAC1B;AAAA,IACJ;AAEA,YAAQ,QAAQ,+CAAY;AAC5B,YAAQ,IAAI,aAAAD,QAAM,MAAM,8CAAgB,OAAO,GAAG,GAAG,CAAC;AACtD,YAAQ,IAAI,aAAAA,QAAM,KAAK,oGAAyB,CAAC;AACjD,YAAQ,IAAI,aAAAA,QAAM,KAAK,IAAK,OAAO,EAAE,CAAC,CAAC;AAGvC,QAAI,UAAAD,QAAG,WAAW,QAAQ,GAAG;AAEzB,YAAM,EAAE,OAAAG,OAAM,IAAI,MAAM,OAAO,eAAe;AAC9C,YAAM,OAAOA,OAAM,QAAQ,CAAC,MAAM,QAAQ,GAAG,EAAE,OAAO,UAAU,CAAC;AAGjE,cAAQ,GAAG,UAAU,MAAM;AACvB,gBAAQ,IAAI,aAAAF,QAAM,OAAO,wFAAkB,CAAC;AAC5C,aAAK,KAAK;AACV,gBAAQ,KAAK,CAAC;AAAA,MAClB,CAAC;AAED,WAAK,GAAG,QAAQ,MAAM;AAClB,gBAAQ,KAAK,CAAC;AAAA,MAClB,CAAC;AAAA,IACL,OAAO;AACH,cAAQ,IAAI,aAAAA,QAAM,OAAO,4CAAS,CAAC;AAAA,IACvC;AAAA,EAEJ,SAAS,OAAO;AACZ,YAAQ,KAAK,6BAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,EAClF;AACJ;AA5Ce;AAiDf,eAAe,eAAe,SAAkB,OAAsB;AAClE,UAAQ,IAAI,aAAAA,QAAM,KAAK,uCAAY,CAAC;AAGpC,QAAM,YAAY;AAGlB,QAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAI,CAAC;AAGtD,QAAM,aAAa,MAAM;AAC7B;AAXe;AAgBf,SAAS,cAAoB;AACzB,UAAQ,IAAI,aAAAA,QAAM,KAAK,YAAY,OAAO,EAAE,CAAC;AACjD;AAFS;AAOT,SAAS,mBAAyB;AAC9B,UAAQ,IAAI,aAAAA,QAAM,KAAK,YAAY,OAAO,EAAE,CAAC;AAC7C,UAAQ,IAAI,aAAAA,QAAM,KAAK,iCAAiC,CAAC;AACzD,UAAQ,IAAI,aAAAA,QAAM,KAAK,mCAAmC,CAAC;AAC3D,UAAQ,IAAI,aAAAA,QAAM,KAAK,YAAY,QAAQ,OAAO,EAAE,CAAC;AACrD,UAAQ,IAAI,aAAAA,QAAM,KAAK,aAAa,QAAQ,QAAQ,IAAI,QAAQ,IAAI,EAAE,CAAC;AAC3E;AANS;AAWT,eAAe,aAA4B;AACvC,QAAM,cAAU,WAAAC,SAAI,mCAAU,EAAE,MAAM;AAEtC,MAAI;AACA,QAAI,mCAAc,aAAa,GAAG;AAC9B,cAAQ,KAAK,4CAAS;AACtB,cAAQ,IAAI,aAAAD,QAAM,OAAO,qHAAgC,CAAC;AAC1D;AAAA,IACJ;AAEA,uCAAc,WAAW;AACzB,YAAQ,QAAQ,wDAAW;AAE3B,YAAQ,IAAI,aAAAA,QAAM,MAAM,gEAAwB,CAAC;AACjD,YAAQ,IAAI,aAAAA,QAAM,OAAO,gGAAwB,CAAC;AAClD,YAAQ,IAAI,aAAAA,QAAM,KAAK,4CAAc,mCAAc,cAAc,CAAC,EAAE,CAAC;AACrE,YAAQ,IAAI,aAAAA,QAAM,OAAO,6DAAc,CAAC;AACxC,YAAQ,IAAI,aAAAA,QAAM,KAAK,mDAAmD,CAAC;AAAA,EAC/E,SAAS,OAAO;AACZ,YAAQ,KAAK,+CAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,EACrF;AACJ;AArBe;AA0Bf,eAAe,cAAc,KAAa,OAA+B;AACrE,QAAM,cAAU,WAAAC,SAAI,6BAAS,EAAE,MAAM;AAErC,MAAI;AACA,QAAI,CAAC,mCAAc,aAAa,GAAG;AAC/B,cAAQ,KAAK,4CAAS;AACtB,cAAQ,IAAI,aAAAD,QAAM,OAAO,gGAAkC,CAAC;AAC5D;AAAA,IACJ;AAEA,QAAI,CAAC,OAAO;AAER,cAAQ,OAAO;AACf,YAAM,SAAS,mCAAc,UAAU;AAEvC,cAAQ,KAAK;AAAA,QACT,KAAK;AACD,kBAAQ,QAAQ,0BAAM;AACtB,kBAAQ,IAAI,aAAAA,QAAM,MAAM,qBAAW,OAAO,WAAW,EAAE,CAAC;AACxD;AAAA,QACJ,KAAK;AACD,kBAAQ,QAAQ,0BAAM;AACtB,kBAAQ,IAAI,aAAAA,QAAM,MAAM,mBAAS,CAAC;AAClC,qBAAW,CAAC,MAAM,YAAY,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AAClE,oBAAQ,IAAI,aAAAA,QAAM,KAAK,KAAK,IAAI,KAAK,aAAa,OAAO,IAAI,aAAa,KAAK,KAAK,GAAG,CAAC,EAAE,CAAC;AAAA,UAC/F;AACA;AAAA,QACJ;AACI,kBAAQ,KAAK,yCAAW,GAAG,EAAE;AAC7B,kBAAQ,IAAI,aAAAA,QAAM,OAAO,+DAAiC,CAAC;AAC3D;AAAA,MACR;AAAA,IACJ,OAAO;AAEH,cAAQ,KAAK;AAAA,QACT,KAAK;AACD,6CAAc,kBAAkB,KAAK;AACrC,kBAAQ,QAAQ,6CAAe,KAAK,EAAE;AACtC;AAAA,QACJ;AACI,kBAAQ,KAAK,sBAAO,GAAG,+DAAa;AACpC,kBAAQ,IAAI,aAAAA,QAAM,OAAO,+DAAuB,CAAC;AACjD;AAAA,MACR;AAAA,IACJ;AAAA,EACJ,SAAS,OAAO;AACZ,YAAQ,KAAK,yCAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,EACpF;AACJ;AAhDe;AAqDf,SAAS,WAAiB;AACtB,UAAQ,IAAI,aAAAA,QAAM,KAAK,KAAK,sCAAsC,CAAC;AACnE,UAAQ,IAAI;AACZ,UAAQ,IAAI,aAAAA,QAAM,OAAO,2BAAO,CAAC;AACjC,UAAQ,IAAI,+BAA+B;AAC3C,UAAQ,IAAI;AACZ,UAAQ,IAAI,aAAAA,QAAM,OAAO,eAAK,CAAC;AAC/B,UAAQ,IAAI,kEAA+B;AAC3C,UAAQ,IAAI,mEAAgC;AAC5C,UAAQ,IAAI,oFAA4C;AACxD,UAAQ,IAAI,gDAA4B;AACxC,UAAQ,IAAI,4DAA8B;AAC1C,UAAQ,IAAI,0FAAmC;AAC/C,UAAQ,IAAI,oFAA4C;AACxD,UAAQ,IAAI;AACZ,UAAQ,IAAI,aAAAA,QAAM,OAAO,eAAK,CAAC;AAC/B,UAAQ,IAAI,4DAA8B;AAC1C,UAAQ,IAAI,4DAA8B;AAC1C,UAAQ,IAAI,4DAA8B;AAC1C,UAAQ,IAAI;AACZ,UAAQ,IAAI,aAAAA,QAAM,OAAO,2BAAO,CAAC;AACjC,UAAQ,IAAI,0EAAiD;AAC7D,UAAQ,IAAI,0EAAsD;AAClE,UAAQ,IAAI,0EAAsD;AAClE,UAAQ,IAAI;AACZ,UAAQ,IAAI,aAAAA,QAAM,OAAO,2BAAO,CAAC;AACjC,UAAQ,IAAI,uEAAyC;AACrD,UAAQ,IAAI,uEAAyC;AACrD,UAAQ,IAAI,uEAAyC;AACrD,UAAQ,IAAI,mFAA2C;AACvD,UAAQ,IAAI,2DAAuC;AACvD;AA/BS;AAkCT,QACK,KAAK,SAAS,EACd,YAAY,iCAAiC,EAC7C,QAAQ,SAAS,iBAAiB,sCAAQ,EAC1C,WAAW,cAAc,sCAAQ;AAGtC,QACK,QAAQ,MAAM,EACd,YAAY,4CAAS,EACrB,OAAO,YAAY;AAChB,QAAM,WAAW;AACrB,CAAC;AAGL,QACK,QAAQ,sBAAsB,EAC9B,YAAY,4CAAS,EACrB,OAAO,OAAO,KAAK,UAAU;AAC1B,QAAM,cAAc,KAAK,KAAK;AAClC,CAAC;AAGL,QACK,QAAQ,OAAO,EACf,YAAY,0BAAM,EAClB,OAAO,gBAAgB,4CAAS,EAChC,OAAO,OAAO,YAAY;AACvB,QAAM,aAAa,QAAQ,MAAM;AACrC,CAAC;AAGL,QACK,QAAQ,MAAM,EACd,YAAY,0BAAM,EAClB,OAAO,YAAY;AAChB,QAAM,YAAY;AACtB,CAAC;AAGL,QACK,QAAQ,QAAQ,EAChB,YAAY,sCAAQ,EACpB,OAAO,YAAY;AAChB,QAAM,YAAY;AACtB,CAAC;AAGL,QACK,QAAQ,QAAQ,EAChB,YAAY,oEAAa,EACzB,OAAO,YAAY;AAChB,QAAM,cAAc;AACxB,CAAC;AAGL,QACK,QAAQ,SAAS,EACjB,YAAY,0BAAM,EAClB,OAAO,gBAAgB,4CAAS,EAChC,OAAO,OAAO,YAAY;AACvB,QAAM,eAAe,QAAQ,MAAM;AACvC,CAAC;AAGL,QACK,OAAO,MAAM,sCAAQ,EACrB,OAAO,CAAC,YAAY;AACjB,MAAI,QAAQ,GAAG;AACX,qBAAiB;AACjB,YAAQ,KAAK,CAAC;AAAA,EAClB;AACJ,CAAC;AAGL,IAAI,QAAQ,KAAK,UAAU,GAAG;AAC1B,WAAS;AACT,UAAQ,KAAK,CAAC;AAClB;AAGA,QAAQ,MAAM,QAAQ,IAAI;","names":["path","os","fs","chalk","ora","spawn"]}
package/dist/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
@@ -0,0 +1,13 @@
1
+ {
2
+ "mcpEndpoint": "<请填写你的接入点地址(获取地址在 xiaozhi.me)>",
3
+ "mcpServers": {
4
+ "calculator": {
5
+ "command": "node",
6
+ "args": ["./mcpServers/calculator.js"]
7
+ },
8
+ "datetime": {
9
+ "command": "node",
10
+ "args": ["./mcpServers/datetime.js"]
11
+ }
12
+ }
13
+ }