xiaozhi-client 1.1.0-next.7 → 1.1.0-next.9

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.
@@ -1,2 +1,2 @@
1
- "use strict";var E=Object.create;var p=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,M=Object.prototype.hasOwnProperty;var y=(n,e)=>p(n,"name",{value:e,configurable:!0});var P=(n,e)=>{for(var s in e)p(n,s,{get:e[s],enumerable:!0})},h=(n,e,s,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let l of x(e))!M.call(n,l)&&l!==s&&p(n,l,{get:()=>e[l],enumerable:!(i=S(e,l))||i.enumerable});return n};var C=(n,e,s)=>(s=n!=null?E(j(n)):{},h(e||!n||!n.__esModule?p(s,"default",{value:n,enumerable:!0}):s,n)),z=n=>h(p({},"__esModule",{value:!0}),n);var k={};P(k,{listMcpServers:()=>v,listServerTools:()=>w,setToolEnabled:()=>T});module.exports=z(k);var o=C(require("chalk")),$=C(require("ora")),a=require("./configManager.cjs");async function v(n={}){const e=(0,$.default)("\u83B7\u53D6 MCP \u670D\u52A1\u5217\u8868...").start();try{const s=a.configManager.getMcpServers(),i=Object.keys(s);if(i.length===0){e.warn("\u672A\u914D\u7F6E\u4EFB\u4F55 MCP \u670D\u52A1"),console.log(o.default.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi config' \u547D\u4EE4\u914D\u7F6E MCP \u670D\u52A1"));return}if(e.succeed(`\u627E\u5230 ${i.length} \u4E2A MCP \u670D\u52A1`),n.tools){console.log(),console.log(o.default.bold("MCP \u670D\u52A1\u5DE5\u5177\u5217\u8868:")),console.log();const l=["\u670D\u52A1\u540D\u79F0","\u5DE5\u5177\u540D\u79F0","\u5DE5\u5177\u63CF\u8FF0","\u72B6\u6001"],c=[20,30,40,8];console.log(l.map((t,r)=>o.default.bold(t.padEnd(c[r]))).join(" | ")),console.log(l.map((t,r)=>"-".repeat(c[r])).join("-|-"));for(const t of i){const r=a.configManager.getServerToolsConfig(t),g=Object.keys(r);if(g.length===0)console.log([t.padEnd(c[0]),o.default.gray("(\u65E0\u5DE5\u5177)").padEnd(c[1]),o.default.gray("\u8BF7\u5148\u542F\u52A8\u670D\u52A1\u626B\u63CF\u5DE5\u5177").padEnd(c[2]),o.default.gray("-").padEnd(c[3])].join(" | "));else{let d=t;for(const f of g){const b=r[f],m=b.enable?o.default.green("\u542F\u7528"):o.default.red("\u7981\u7528"),u=(b.description||"").substring(0,35);console.log([d.padEnd(c[0]),f.padEnd(c[1]),u.padEnd(c[2]),m.padEnd(c[3])].join(" | ")),d=""}}}}else{console.log(),console.log(o.default.bold("MCP \u670D\u52A1\u5217\u8868:")),console.log();for(const l of i){const c=s[l],t=a.configManager.getServerToolsConfig(l),r=Object.keys(t).length,g=Object.values(t).filter(d=>d.enable!==!1).length;console.log(`${o.default.cyan("\u2022")} ${o.default.bold(l)}`),console.log(` \u547D\u4EE4: ${o.default.gray(c.command)} ${o.default.gray(c.args.join(" "))}`),r>0?console.log(` \u5DE5\u5177: ${o.default.green(g)} \u542F\u7528 / ${o.default.yellow(r)} \u603B\u8BA1`):console.log(` \u5DE5\u5177: ${o.default.gray("\u672A\u626B\u63CF (\u8BF7\u5148\u542F\u52A8\u670D\u52A1)")}`),console.log()}}console.log(o.default.gray("\u{1F4A1} \u63D0\u793A:")),console.log(o.default.gray(" - \u4F7F\u7528 'xiaozhi mcp list --tools' \u67E5\u770B\u6240\u6709\u5DE5\u5177")),console.log(o.default.gray(" - \u4F7F\u7528 'xiaozhi mcp <\u670D\u52A1\u540D> list' \u67E5\u770B\u6307\u5B9A\u670D\u52A1\u7684\u5DE5\u5177")),console.log(o.default.gray(" - \u4F7F\u7528 'xiaozhi mcp <\u670D\u52A1\u540D> <\u5DE5\u5177\u540D> enable/disable' \u542F\u7528/\u7981\u7528\u5DE5\u5177"))}catch(s){e.fail("\u83B7\u53D6 MCP \u670D\u52A1\u5217\u8868\u5931\u8D25"),console.error(o.default.red(`\u9519\u8BEF: ${s instanceof Error?s.message:String(s)}`)),process.exit(1)}}y(v,"listMcpServers");async function w(n){const e=(0,$.default)(`\u83B7\u53D6 ${n} \u670D\u52A1\u7684\u5DE5\u5177\u5217\u8868...`).start();try{if(!a.configManager.getMcpServers()[n]){e.fail(`\u670D\u52A1 '${n}' \u4E0D\u5B58\u5728`),console.log(o.default.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u670D\u52A1"));return}const i=a.configManager.getServerToolsConfig(n),l=Object.keys(i);if(l.length===0){e.warn(`\u670D\u52A1 '${n}' \u6682\u65E0\u5DE5\u5177\u4FE1\u606F`),console.log(o.default.yellow("\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u542F\u52A8\u670D\u52A1\u4EE5\u626B\u63CF\u5DE5\u5177\u5217\u8868"));return}e.succeed(`\u670D\u52A1 '${n}' \u5171\u6709 ${l.length} \u4E2A\u5DE5\u5177`),console.log(),console.log(o.default.bold(`${n} \u670D\u52A1\u5DE5\u5177\u5217\u8868:`)),console.log();const c=["\u5DE5\u5177\u540D\u79F0","\u5DE5\u5177\u63CF\u8FF0","\u72B6\u6001"],t=[30,50,8];console.log(c.map((r,g)=>o.default.bold(r.padEnd(t[g]))).join(" | ")),console.log(c.map((r,g)=>"-".repeat(t[g])).join("-|-"));for(const r of l){const g=i[r],d=g.enable?o.default.green("\u542F\u7528"):o.default.red("\u7981\u7528"),f=(g.description||"").substring(0,45);console.log([r.padEnd(t[0]),f.padEnd(t[1]),d.padEnd(t[2])].join(" | "))}console.log(),console.log(o.default.gray("\u{1F4A1} \u63D0\u793A:")),console.log(o.default.gray(` - \u4F7F\u7528 'xiaozhi mcp ${n} <\u5DE5\u5177\u540D> enable' \u542F\u7528\u5DE5\u5177`)),console.log(o.default.gray(` - \u4F7F\u7528 'xiaozhi mcp ${n} <\u5DE5\u5177\u540D> disable' \u7981\u7528\u5DE5\u5177`))}catch(s){e.fail("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25"),console.error(o.default.red(`\u9519\u8BEF: ${s instanceof Error?s.message:String(s)}`)),process.exit(1)}}y(w,"listServerTools");async function T(n,e,s){const i=s?"\u542F\u7528":"\u7981\u7528",l=(0,$.default)(`${i}\u5DE5\u5177 ${n}/${e}...`).start();try{if(!a.configManager.getMcpServers()[n]){l.fail(`\u670D\u52A1 '${n}' \u4E0D\u5B58\u5728`),console.log(o.default.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u670D\u52A1"));return}const t=a.configManager.getServerToolsConfig(n);if(!t[e]){l.fail(`\u5DE5\u5177 '${e}' \u5728\u670D\u52A1 '${n}' \u4E2D\u4E0D\u5B58\u5728`),console.log(o.default.yellow(`\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp ${n} list' \u67E5\u770B\u8BE5\u670D\u52A1\u7684\u6240\u6709\u5DE5\u5177`));return}a.configManager.setToolEnabled(n,e,s,t[e].description),l.succeed(`\u6210\u529F${i}\u5DE5\u5177 ${o.default.cyan(n)}/${o.default.cyan(e)}`),console.log(),console.log(o.default.gray("\u{1F4A1} \u63D0\u793A: \u5DE5\u5177\u72B6\u6001\u66F4\u6539\u5C06\u5728\u4E0B\u6B21\u542F\u52A8\u670D\u52A1\u65F6\u751F\u6548"))}catch(c){l.fail(`${i}\u5DE5\u5177\u5931\u8D25`),console.error(o.default.red(`\u9519\u8BEF: ${c instanceof Error?c.message:String(c)}`)),process.exit(1)}}y(T,"setToolEnabled");0&&(module.exports={listMcpServers,listServerTools,setToolEnabled});
1
+ "use strict";var w=Object.create;var u=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var T=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var d=(o,n)=>u(o,"name",{value:n,configurable:!0});var v=(o,n)=>{for(var t in n)u(o,t,{get:n[t],enumerable:!0})},$=(o,n,t,s)=>{if(n&&typeof n=="object"||typeof n=="function")for(let l of P(n))!z.call(o,l)&&l!==t&&u(o,l,{get:()=>n[l],enumerable:!(s=M(n,l))||s.enumerable});return o};var h=(o,n,t)=>(t=o!=null?w(T(o)):{},$(n||!o||!o.__esModule?u(t,"default",{value:o,enumerable:!0}):t,o)),j=o=>$(u({},"__esModule",{value:!0}),o);var O={};v(O,{getDisplayWidth:()=>C,listMcpServers:()=>k,listServerTools:()=>W,setToolEnabled:()=>E,truncateToWidth:()=>y});module.exports=j(O);var e=h(require("chalk")),b=h(require("cli-table3")),p=h(require("ora")),i=require("./configManager.cjs");function C(o){let n=0;for(const t of o)/[\u4e00-\u9fff\u3400-\u4dbf\uff00-\uffef]/.test(t)?n+=2:n+=1;return n}d(C,"getDisplayWidth");function y(o,n){if(C(o)<=n)return o;if(n<=3)return"";let t="",s=0,l=!1;for(const r of o){const c=/[\u4e00-\u9fff\u3400-\u4dbf\uff00-\uffef]/.test(r)?2:1;if(s+c>n-3){if(!l)return"";t+="...";break}t+=r,s+=c,l=!0}return t}d(y,"truncateToWidth");async function k(o={}){const n=(0,p.default)("\u83B7\u53D6 MCP \u670D\u52A1\u5217\u8868...").start();try{const t=i.configManager.getMcpServers(),s=Object.keys(t);if(s.length===0){n.warn("\u672A\u914D\u7F6E\u4EFB\u4F55 MCP \u670D\u52A1"),console.log(e.default.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi config' \u547D\u4EE4\u914D\u7F6E MCP \u670D\u52A1"));return}if(n.succeed(`\u627E\u5230 ${s.length} \u4E2A MCP \u670D\u52A1`),o.tools){console.log(),console.log(e.default.bold("MCP \u670D\u52A1\u5DE5\u5177\u5217\u8868:")),console.log();const l=new b.default({head:[e.default.bold("\u5DE5\u5177\u540D\u79F0"),e.default.bold("\u72B6\u6001"),e.default.bold("\u63CF\u8FF0")],colWidths:[30,8,50],wordWrap:!0,style:{head:[],border:[]}});for(const r of s){const c=i.configManager.getServerToolsConfig(r),g=Object.keys(c);if(g.length===0)l.push([e.default.gray(`${r} (\u65E0\u5DE5\u5177)`),e.default.gray("-"),e.default.gray("\u8BF7\u5148\u542F\u52A8\u670D\u52A1\u626B\u63CF\u5DE5\u5177")]);else{l.length>0&&l.push([{colSpan:3,content:""}]);for(const f of g){const a=c[f],S=a.enable?e.default.green("\u542F\u7528"):e.default.red("\u7981\u7528"),m=y(a.description||"",40),x=`${r}_${f}`;l.push([x,S,m])}}}console.log(l.toString())}else{console.log(),console.log(e.default.bold("MCP \u670D\u52A1\u5217\u8868:")),console.log();for(const l of s){const r=t[l],c=i.configManager.getServerToolsConfig(l),g=Object.keys(c).length,f=Object.values(c).filter(a=>a.enable!==!1).length;console.log(`${e.default.cyan("\u2022")} ${e.default.bold(l)}`),console.log(` \u547D\u4EE4: ${e.default.gray(r.command)} ${e.default.gray(r.args.join(" "))}`),g>0?console.log(` \u5DE5\u5177: ${e.default.green(f)} \u542F\u7528 / ${e.default.yellow(g)} \u603B\u8BA1`):console.log(` \u5DE5\u5177: ${e.default.gray("\u672A\u626B\u63CF (\u8BF7\u5148\u542F\u52A8\u670D\u52A1)")}`),console.log()}}console.log(e.default.gray("\u{1F4A1} \u63D0\u793A:")),console.log(e.default.gray(" - \u4F7F\u7528 'xiaozhi mcp list --tools' \u67E5\u770B\u6240\u6709\u5DE5\u5177")),console.log(e.default.gray(" - \u4F7F\u7528 'xiaozhi mcp <\u670D\u52A1\u540D> list' \u67E5\u770B\u6307\u5B9A\u670D\u52A1\u7684\u5DE5\u5177")),console.log(e.default.gray(" - \u4F7F\u7528 'xiaozhi mcp <\u670D\u52A1\u540D> <\u5DE5\u5177\u540D> enable/disable' \u542F\u7528/\u7981\u7528\u5DE5\u5177"))}catch(t){n.fail("\u83B7\u53D6 MCP \u670D\u52A1\u5217\u8868\u5931\u8D25"),console.error(e.default.red(`\u9519\u8BEF: ${t instanceof Error?t.message:String(t)}`)),process.exit(1)}}d(k,"listMcpServers");async function W(o){const n=(0,p.default)(`\u83B7\u53D6 ${o} \u670D\u52A1\u7684\u5DE5\u5177\u5217\u8868...`).start();try{if(!i.configManager.getMcpServers()[o]){n.fail(`\u670D\u52A1 '${o}' \u4E0D\u5B58\u5728`),console.log(e.default.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u670D\u52A1"));return}const s=i.configManager.getServerToolsConfig(o),l=Object.keys(s);if(l.length===0){n.warn(`\u670D\u52A1 '${o}' \u6682\u65E0\u5DE5\u5177\u4FE1\u606F`),console.log(e.default.yellow("\u{1F4A1} \u63D0\u793A: \u8BF7\u5148\u542F\u52A8\u670D\u52A1\u4EE5\u626B\u63CF\u5DE5\u5177\u5217\u8868"));return}n.succeed(`\u670D\u52A1 '${o}' \u5171\u6709 ${l.length} \u4E2A\u5DE5\u5177`),console.log(),console.log(e.default.bold(`${o} \u670D\u52A1\u5DE5\u5177\u5217\u8868:`)),console.log();const r=new b.default({head:[e.default.bold("\u5DE5\u5177\u540D\u79F0"),e.default.bold("\u72B6\u6001"),e.default.bold("\u63CF\u8FF0")],colWidths:[30,8,50],wordWrap:!0,style:{head:[],border:[]}});for(const c of l){const g=s[c],f=g.enable?e.default.green("\u542F\u7528"):e.default.red("\u7981\u7528"),a=y(g.description||"",40);r.push([c,f,a])}console.log(r.toString()),console.log(),console.log(e.default.gray("\u{1F4A1} \u63D0\u793A:")),console.log(e.default.gray(` - \u4F7F\u7528 'xiaozhi mcp ${o} <\u5DE5\u5177\u540D> enable' \u542F\u7528\u5DE5\u5177`)),console.log(e.default.gray(` - \u4F7F\u7528 'xiaozhi mcp ${o} <\u5DE5\u5177\u540D> disable' \u7981\u7528\u5DE5\u5177`))}catch(t){n.fail("\u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25"),console.error(e.default.red(`\u9519\u8BEF: ${t instanceof Error?t.message:String(t)}`)),process.exit(1)}}d(W,"listServerTools");async function E(o,n,t){const s=t?"\u542F\u7528":"\u7981\u7528",l=(0,p.default)(`${s}\u5DE5\u5177 ${o}/${n}...`).start();try{if(!i.configManager.getMcpServers()[o]){l.fail(`\u670D\u52A1 '${o}' \u4E0D\u5B58\u5728`),console.log(e.default.yellow("\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp list' \u67E5\u770B\u6240\u6709\u53EF\u7528\u670D\u52A1"));return}const c=i.configManager.getServerToolsConfig(o);if(!c[n]){l.fail(`\u5DE5\u5177 '${n}' \u5728\u670D\u52A1 '${o}' \u4E2D\u4E0D\u5B58\u5728`),console.log(e.default.yellow(`\u{1F4A1} \u63D0\u793A: \u4F7F\u7528 'xiaozhi mcp ${o} list' \u67E5\u770B\u8BE5\u670D\u52A1\u7684\u6240\u6709\u5DE5\u5177`));return}i.configManager.setToolEnabled(o,n,t,c[n].description),l.succeed(`\u6210\u529F${s}\u5DE5\u5177 ${e.default.cyan(o)}/${e.default.cyan(n)}`),console.log(),console.log(e.default.gray("\u{1F4A1} \u63D0\u793A: \u5DE5\u5177\u72B6\u6001\u66F4\u6539\u5C06\u5728\u4E0B\u6B21\u542F\u52A8\u670D\u52A1\u65F6\u751F\u6548"))}catch(r){l.fail(`${s}\u5DE5\u5177\u5931\u8D25`),console.error(e.default.red(`\u9519\u8BEF: ${r instanceof Error?r.message:String(r)}`)),process.exit(1)}}d(E,"setToolEnabled");0&&(module.exports={getDisplayWidth,listMcpServers,listServerTools,setToolEnabled,truncateToWidth});
2
2
  //# sourceMappingURL=mcpCommands.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mcpCommands.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { configManager } from \"./configManager.js\";\n\n/**\n * MCP 相关的命令行功能\n */\n\n/**\n * 列出所有 MCP 服务\n */\nexport async function listMcpServers(\n options: { tools?: boolean } = {}\n): Promise<void> {\n const spinner = ora(\"获取 MCP 服务列表...\").start();\n\n try {\n const mcpServers = configManager.getMcpServers();\n const serverNames = Object.keys(mcpServers);\n\n if (serverNames.length === 0) {\n spinner.warn(\"未配置任何 MCP 服务\");\n console.log(\n chalk.yellow(\"💡 提示: 使用 'xiaozhi config' 命令配置 MCP 服务\")\n );\n return;\n }\n\n spinner.succeed(`找到 ${serverNames.length} 个 MCP 服务`);\n\n if (options.tools) {\n // 显示所有服务的工具列表\n console.log();\n console.log(chalk.bold(\"MCP 服务工具列表:\"));\n console.log();\n\n // 表头\n const headers = [\"服务名称\", \"工具名称\", \"工具描述\", \"状态\"];\n const colWidths = [20, 30, 40, 8];\n\n console.log(\n headers\n .map((header, i) => chalk.bold(header.padEnd(colWidths[i])))\n .join(\" | \")\n );\n console.log(headers.map((_, i) => \"-\".repeat(colWidths[i])).join(\"-|-\"));\n\n for (const serverName of serverNames) {\n const toolsConfig = configManager.getServerToolsConfig(serverName);\n const toolNames = Object.keys(toolsConfig);\n\n if (toolNames.length === 0) {\n console.log(\n [\n serverName.padEnd(colWidths[0]),\n chalk.gray(\"(无工具)\").padEnd(colWidths[1]),\n chalk.gray(\"请先启动服务扫描工具\").padEnd(colWidths[2]),\n chalk.gray(\"-\").padEnd(colWidths[3]),\n ].join(\" | \")\n );\n } else {\n let displayServerName = serverName;\n for (const toolName of toolNames) {\n const toolConfig = toolsConfig[toolName];\n const status = toolConfig.enable\n ? chalk.green(\"启用\")\n : chalk.red(\"禁用\");\n const description = (toolConfig.description || \"\").substring(0, 35);\n\n console.log(\n [\n displayServerName.padEnd(colWidths[0]),\n toolName.padEnd(colWidths[1]),\n description.padEnd(colWidths[2]),\n status.padEnd(colWidths[3]),\n ].join(\" | \")\n );\n\n // 只显示第一行服务名称\n displayServerName = \"\";\n }\n }\n }\n } else {\n // 只显示服务列表\n console.log();\n console.log(chalk.bold(\"MCP 服务列表:\"));\n console.log();\n\n for (const serverName of serverNames) {\n const serverConfig = mcpServers[serverName];\n const toolsConfig = configManager.getServerToolsConfig(serverName);\n const toolCount = Object.keys(toolsConfig).length;\n const enabledCount = Object.values(toolsConfig).filter(\n (t) => t.enable !== false\n ).length;\n\n console.log(`${chalk.cyan(\"•\")} ${chalk.bold(serverName)}`);\n console.log(\n ` 命令: ${chalk.gray(serverConfig.command)} ${chalk.gray(serverConfig.args.join(\" \"))}`\n );\n if (toolCount > 0) {\n console.log(\n ` 工具: ${chalk.green(enabledCount)} 启用 / ${chalk.yellow(toolCount)} 总计`\n );\n } else {\n console.log(` 工具: ${chalk.gray(\"未扫描 (请先启动服务)\")}`);\n }\n console.log();\n }\n }\n\n console.log(chalk.gray(\"💡 提示:\"));\n console.log(chalk.gray(\" - 使用 'xiaozhi mcp list --tools' 查看所有工具\"));\n console.log(\n chalk.gray(\" - 使用 'xiaozhi mcp <服务名> list' 查看指定服务的工具\")\n );\n console.log(\n chalk.gray(\n \" - 使用 'xiaozhi mcp <服务名> <工具名> enable/disable' 启用/禁用工具\"\n )\n );\n } catch (error) {\n spinner.fail(\"获取 MCP 服务列表失败\");\n console.error(\n chalk.red(\n `错误: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * 列出指定服务的工具\n */\nexport async function listServerTools(serverName: string): Promise<void> {\n const spinner = ora(`获取 ${serverName} 服务的工具列表...`).start();\n\n try {\n const mcpServers = configManager.getMcpServers();\n\n if (!mcpServers[serverName]) {\n spinner.fail(`服务 '${serverName}' 不存在`);\n console.log(\n chalk.yellow(\"💡 提示: 使用 'xiaozhi mcp list' 查看所有可用服务\")\n );\n return;\n }\n\n const toolsConfig = configManager.getServerToolsConfig(serverName);\n const toolNames = Object.keys(toolsConfig);\n\n if (toolNames.length === 0) {\n spinner.warn(`服务 '${serverName}' 暂无工具信息`);\n console.log(chalk.yellow(\"💡 提示: 请先启动服务以扫描工具列表\"));\n return;\n }\n\n spinner.succeed(`服务 '${serverName}' 共有 ${toolNames.length} 个工具`);\n\n console.log();\n console.log(chalk.bold(`${serverName} 服务工具列表:`));\n console.log();\n\n // 表头\n const headers = [\"工具名称\", \"工具描述\", \"状态\"];\n const colWidths = [30, 50, 8];\n\n console.log(\n headers\n .map((header, i) => chalk.bold(header.padEnd(colWidths[i])))\n .join(\" | \")\n );\n console.log(headers.map((_, i) => \"-\".repeat(colWidths[i])).join(\"-|-\"));\n\n for (const toolName of toolNames) {\n const toolConfig = toolsConfig[toolName];\n const status = toolConfig.enable\n ? chalk.green(\"启用\")\n : chalk.red(\"禁用\");\n const description = (toolConfig.description || \"\").substring(0, 45);\n\n console.log(\n [\n toolName.padEnd(colWidths[0]),\n description.padEnd(colWidths[1]),\n status.padEnd(colWidths[2]),\n ].join(\" | \")\n );\n }\n\n console.log();\n console.log(chalk.gray(\"💡 提示:\"));\n console.log(\n chalk.gray(\n ` - 使用 'xiaozhi mcp ${serverName} <工具名> enable' 启用工具`\n )\n );\n console.log(\n chalk.gray(\n ` - 使用 'xiaozhi mcp ${serverName} <工具名> disable' 禁用工具`\n )\n );\n } catch (error) {\n spinner.fail(\"获取工具列表失败\");\n console.error(\n chalk.red(\n `错误: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * 启用或禁用工具\n */\nexport async function setToolEnabled(\n serverName: string,\n toolName: string,\n enabled: boolean\n): Promise<void> {\n const action = enabled ? \"启用\" : \"禁用\";\n const spinner = ora(`${action}工具 ${serverName}/${toolName}...`).start();\n\n try {\n const mcpServers = configManager.getMcpServers();\n\n if (!mcpServers[serverName]) {\n spinner.fail(`服务 '${serverName}' 不存在`);\n console.log(\n chalk.yellow(\"💡 提示: 使用 'xiaozhi mcp list' 查看所有可用服务\")\n );\n return;\n }\n\n const toolsConfig = configManager.getServerToolsConfig(serverName);\n\n if (!toolsConfig[toolName]) {\n spinner.fail(`工具 '${toolName}' 在服务 '${serverName}' 中不存在`);\n console.log(\n chalk.yellow(\n `💡 提示: 使用 'xiaozhi mcp ${serverName} list' 查看该服务的所有工具`\n )\n );\n return;\n }\n\n // 更新工具状态\n configManager.setToolEnabled(\n serverName,\n toolName,\n enabled,\n toolsConfig[toolName].description\n );\n\n spinner.succeed(\n `成功${action}工具 ${chalk.cyan(serverName)}/${chalk.cyan(toolName)}`\n );\n\n console.log();\n console.log(chalk.gray(\"💡 提示: 工具状态更改将在下次启动服务时生效\"));\n } catch (error) {\n spinner.fail(`${action}工具失败`);\n console.error(\n chalk.red(\n `错误: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["mcpCommands_exports","__export","listMcpServers","listServerTools","setToolEnabled","__toCommonJS","import_chalk","import_ora","import_configManager","listMcpServers","options","spinner","ora","mcpServers","serverNames","chalk","headers","colWidths","header","i","_","serverName","toolsConfig","toolNames","displayServerName","toolName","toolConfig","status","description","serverConfig","toolCount","enabledCount","t","error","__name","listServerTools","setToolEnabled","enabled","action"]}
1
+ {"version":3,"sources":["../src/mcpCommands.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport Table from \"cli-table3\";\nimport ora from \"ora\";\nimport { configManager } from \"./configManager.js\";\n\n/**\n * MCP 相关的命令行功能\n */\n\n/**\n * 计算字符串的显示宽度(中文字符占2个宽度,英文字符占1个宽度)\n */\nexport function getDisplayWidth(str: string): number {\n let width = 0;\n for (const char of str) {\n // 判断是否为中文字符(包括中文标点符号)\n if (/[\\u4e00-\\u9fff\\u3400-\\u4dbf\\uff00-\\uffef]/.test(char)) {\n width += 2;\n } else {\n width += 1;\n }\n }\n return width;\n}\n\n/**\n * 截断字符串到指定的显示宽度\n */\nexport function truncateToWidth(str: string, maxWidth: number): string {\n if (getDisplayWidth(str) <= maxWidth) {\n return str;\n }\n\n // 如果最大宽度小于等于省略号的宽度,返回空字符串\n if (maxWidth <= 3) {\n return \"\";\n }\n\n let result = \"\";\n let currentWidth = 0;\n let hasAddedChar = false;\n\n for (const char of str) {\n const charWidth = /[\\u4e00-\\u9fff\\u3400-\\u4dbf\\uff00-\\uffef]/.test(char)\n ? 2\n : 1;\n\n // 如果加上当前字符会超出限制\n if (currentWidth + charWidth > maxWidth - 3) {\n // 如果还没有添加任何字符,说明连一个字符都放不下,返回空字符串\n if (!hasAddedChar) {\n return \"\";\n }\n // 否则添加省略号并退出\n result += \"...\";\n break;\n }\n\n result += char;\n currentWidth += charWidth;\n hasAddedChar = true;\n }\n\n return result;\n}\n\n/**\n * 列出所有 MCP 服务\n */\nexport async function listMcpServers(\n options: { tools?: boolean } = {}\n): Promise<void> {\n const spinner = ora(\"获取 MCP 服务列表...\").start();\n\n try {\n const mcpServers = configManager.getMcpServers();\n const serverNames = Object.keys(mcpServers);\n\n if (serverNames.length === 0) {\n spinner.warn(\"未配置任何 MCP 服务\");\n console.log(\n chalk.yellow(\"💡 提示: 使用 'xiaozhi config' 命令配置 MCP 服务\")\n );\n return;\n }\n\n spinner.succeed(`找到 ${serverNames.length} 个 MCP 服务`);\n\n if (options.tools) {\n // 显示所有服务的工具列表\n console.log();\n console.log(chalk.bold(\"MCP 服务工具列表:\"));\n console.log();\n\n // 使用 cli-table3 创建表格\n const table = new Table({\n head: [chalk.bold(\"工具名称\"), chalk.bold(\"状态\"), chalk.bold(\"描述\")],\n colWidths: [30, 8, 50], // 工具名称 | 状态 | 描述\n wordWrap: true,\n style: {\n head: [],\n border: [],\n },\n });\n\n for (const serverName of serverNames) {\n const toolsConfig = configManager.getServerToolsConfig(serverName);\n const toolNames = Object.keys(toolsConfig);\n\n if (toolNames.length === 0) {\n // 服务没有工具时显示提示信息\n table.push([\n chalk.gray(`${serverName} (无工具)`),\n chalk.gray(\"-\"),\n chalk.gray(\"请先启动服务扫描工具\"),\n ]);\n } else {\n // 添加服务分隔行\n if (table.length > 0) {\n table.push([{ colSpan: 3, content: \"\" }]);\n }\n\n for (const toolName of toolNames) {\n const toolConfig = toolsConfig[toolName];\n const status = toolConfig.enable\n ? chalk.green(\"启用\")\n : chalk.red(\"禁用\");\n\n // 截断描述到最大40个字符宽度(约20个中文字符)\n const description = truncateToWidth(\n toolConfig.description || \"\",\n 40\n );\n\n // 工具名称格式:服务名_工具名\n const fullToolName = `${serverName}_${toolName}`;\n\n table.push([fullToolName, status, description]);\n }\n }\n }\n\n console.log(table.toString());\n } else {\n // 只显示服务列表\n console.log();\n console.log(chalk.bold(\"MCP 服务列表:\"));\n console.log();\n\n for (const serverName of serverNames) {\n const serverConfig = mcpServers[serverName];\n const toolsConfig = configManager.getServerToolsConfig(serverName);\n const toolCount = Object.keys(toolsConfig).length;\n const enabledCount = Object.values(toolsConfig).filter(\n (t) => t.enable !== false\n ).length;\n\n console.log(`${chalk.cyan(\"•\")} ${chalk.bold(serverName)}`);\n console.log(\n ` 命令: ${chalk.gray(serverConfig.command)} ${chalk.gray(serverConfig.args.join(\" \"))}`\n );\n if (toolCount > 0) {\n console.log(\n ` 工具: ${chalk.green(enabledCount)} 启用 / ${chalk.yellow(toolCount)} 总计`\n );\n } else {\n console.log(` 工具: ${chalk.gray(\"未扫描 (请先启动服务)\")}`);\n }\n console.log();\n }\n }\n\n console.log(chalk.gray(\"💡 提示:\"));\n console.log(chalk.gray(\" - 使用 'xiaozhi mcp list --tools' 查看所有工具\"));\n console.log(\n chalk.gray(\" - 使用 'xiaozhi mcp <服务名> list' 查看指定服务的工具\")\n );\n console.log(\n chalk.gray(\n \" - 使用 'xiaozhi mcp <服务名> <工具名> enable/disable' 启用/禁用工具\"\n )\n );\n } catch (error) {\n spinner.fail(\"获取 MCP 服务列表失败\");\n console.error(\n chalk.red(\n `错误: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * 列出指定服务的工具\n */\nexport async function listServerTools(serverName: string): Promise<void> {\n const spinner = ora(`获取 ${serverName} 服务的工具列表...`).start();\n\n try {\n const mcpServers = configManager.getMcpServers();\n\n if (!mcpServers[serverName]) {\n spinner.fail(`服务 '${serverName}' 不存在`);\n console.log(\n chalk.yellow(\"💡 提示: 使用 'xiaozhi mcp list' 查看所有可用服务\")\n );\n return;\n }\n\n const toolsConfig = configManager.getServerToolsConfig(serverName);\n const toolNames = Object.keys(toolsConfig);\n\n if (toolNames.length === 0) {\n spinner.warn(`服务 '${serverName}' 暂无工具信息`);\n console.log(chalk.yellow(\"💡 提示: 请先启动服务以扫描工具列表\"));\n return;\n }\n\n spinner.succeed(`服务 '${serverName}' 共有 ${toolNames.length} 个工具`);\n\n console.log();\n console.log(chalk.bold(`${serverName} 服务工具列表:`));\n console.log();\n\n // 使用 cli-table3 创建表格\n const table = new Table({\n head: [chalk.bold(\"工具名称\"), chalk.bold(\"状态\"), chalk.bold(\"描述\")],\n colWidths: [30, 8, 50], // 工具名称 | 状态 | 描述\n wordWrap: true,\n style: {\n head: [],\n border: [],\n },\n });\n\n for (const toolName of toolNames) {\n const toolConfig = toolsConfig[toolName];\n const status = toolConfig.enable\n ? chalk.green(\"启用\")\n : chalk.red(\"禁用\");\n\n // 截断描述到最大40个字符宽度(约20个中文字符)\n const description = truncateToWidth(toolConfig.description || \"\", 40);\n\n table.push([toolName, status, description]);\n }\n\n console.log(table.toString());\n\n console.log();\n console.log(chalk.gray(\"💡 提示:\"));\n console.log(\n chalk.gray(\n ` - 使用 'xiaozhi mcp ${serverName} <工具名> enable' 启用工具`\n )\n );\n console.log(\n chalk.gray(\n ` - 使用 'xiaozhi mcp ${serverName} <工具名> disable' 禁用工具`\n )\n );\n } catch (error) {\n spinner.fail(\"获取工具列表失败\");\n console.error(\n chalk.red(\n `错误: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n\n/**\n * 启用或禁用工具\n */\nexport async function setToolEnabled(\n serverName: string,\n toolName: string,\n enabled: boolean\n): Promise<void> {\n const action = enabled ? \"启用\" : \"禁用\";\n const spinner = ora(`${action}工具 ${serverName}/${toolName}...`).start();\n\n try {\n const mcpServers = configManager.getMcpServers();\n\n if (!mcpServers[serverName]) {\n spinner.fail(`服务 '${serverName}' 不存在`);\n console.log(\n chalk.yellow(\"💡 提示: 使用 'xiaozhi mcp list' 查看所有可用服务\")\n );\n return;\n }\n\n const toolsConfig = configManager.getServerToolsConfig(serverName);\n\n if (!toolsConfig[toolName]) {\n spinner.fail(`工具 '${toolName}' 在服务 '${serverName}' 中不存在`);\n console.log(\n chalk.yellow(\n `💡 提示: 使用 'xiaozhi mcp ${serverName} list' 查看该服务的所有工具`\n )\n );\n return;\n }\n\n // 更新工具状态\n configManager.setToolEnabled(\n serverName,\n toolName,\n enabled,\n toolsConfig[toolName].description\n );\n\n spinner.succeed(\n `成功${action}工具 ${chalk.cyan(serverName)}/${chalk.cyan(toolName)}`\n );\n\n console.log();\n console.log(chalk.gray(\"💡 提示: 工具状态更改将在下次启动服务时生效\"));\n } catch (error) {\n spinner.fail(`${action}工具失败`);\n console.error(\n chalk.red(\n `错误: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["mcpCommands_exports","__export","getDisplayWidth","listMcpServers","listServerTools","setToolEnabled","truncateToWidth","__toCommonJS","import_chalk","import_cli_table3","import_ora","import_configManager","getDisplayWidth","str","width","char","__name","truncateToWidth","maxWidth","result","currentWidth","hasAddedChar","charWidth","listMcpServers","options","spinner","ora","mcpServers","serverNames","chalk","table","Table","serverName","toolsConfig","toolNames","toolName","toolConfig","status","description","fullToolName","serverConfig","toolCount","enabledCount","t","error","listServerTools","setToolEnabled","enabled","action"]}
@@ -1,6 +1,14 @@
1
1
  /**
2
2
  * MCP 相关的命令行功能
3
3
  */
4
+ /**
5
+ * 计算字符串的显示宽度(中文字符占2个宽度,英文字符占1个宽度)
6
+ */
7
+ declare function getDisplayWidth(str: string): number;
8
+ /**
9
+ * 截断字符串到指定的显示宽度
10
+ */
11
+ declare function truncateToWidth(str: string, maxWidth: number): string;
4
12
  /**
5
13
  * 列出所有 MCP 服务
6
14
  */
@@ -16,4 +24,4 @@ declare function listServerTools(serverName: string): Promise<void>;
16
24
  */
17
25
  declare function setToolEnabled(serverName: string, toolName: string, enabled: boolean): Promise<void>;
18
26
 
19
- export { listMcpServers, listServerTools, setToolEnabled };
27
+ export { getDisplayWidth, listMcpServers, listServerTools, setToolEnabled, truncateToWidth };
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xiaozhi-client",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "小智 AI 客户端 命令行工具",
5
5
  "main": "dist/cli.cjs",
6
6
  "files": [
@@ -43,6 +43,7 @@
43
43
  "dependencies": {
44
44
  "@modelcontextprotocol/sdk": "^1.12.1",
45
45
  "chalk": "^5.4.1",
46
+ "cli-table3": "^0.6.5",
46
47
  "commander": "^14.0.0",
47
48
  "dotenv": "^16.3.1",
48
49
  "ora": "^8.2.0",
@@ -61,8 +62,6 @@
61
62
  "@types/node": "^24.0.1",
62
63
  "@types/ws": "^8.18.1",
63
64
  "@vitest/coverage-v8": "^3.2.3",
64
- "codecov": "^3.8.3",
65
- "conventional-changelog-conventionalcommits": "^9.0.0",
66
65
  "esbuild": "^0.25.5",
67
66
  "glob": "^11.0.3",
68
67
  "semantic-release": "^24.2.5",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xiaozhi-client",
3
- "version": "1.1.0-next.7",
3
+ "version": "1.1.0-next.9",
4
4
  "description": "小智 AI 客户端 命令行工具",
5
5
  "main": "dist/cli.cjs",
6
6
  "files": [
@@ -43,6 +43,7 @@
43
43
  "dependencies": {
44
44
  "@modelcontextprotocol/sdk": "^1.12.1",
45
45
  "chalk": "^5.4.1",
46
+ "cli-table3": "^0.6.5",
46
47
  "commander": "^14.0.0",
47
48
  "dotenv": "^16.3.1",
48
49
  "ora": "^8.2.0",
@@ -61,8 +62,6 @@
61
62
  "@types/node": "^24.0.1",
62
63
  "@types/ws": "^8.18.1",
63
64
  "@vitest/coverage-v8": "^3.2.3",
64
- "codecov": "^3.8.3",
65
- "conventional-changelog-conventionalcommits": "^9.0.0",
66
65
  "esbuild": "^0.25.5",
67
66
  "glob": "^11.0.3",
68
67
  "semantic-release": "^24.2.5",